<?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-28016235</id><updated>2012-01-06T12:54:39.651-05:00</updated><category term='Pair'/><category term='Short Stories'/><category term='The Impossible Dream'/><category term='GDC 2008'/><category term='City Generation'/><category term='Invention'/><category term='Friends'/><category term='Playing Games'/><category term='Indigo Ocho'/><category term='Fable'/><category term='Pranks'/><category term='Java'/><category term='Future'/><category term='Lisp'/><category term='Poker Hand Evaluation'/><category term='C++'/><category term='Code'/><category term='Essays'/><category term='AI'/><category term='Language'/><category term='Code and Software Development'/><category term='The Relic'/><category term='Axolotl Studios'/><category term='Tools'/><category term='Misc and Irrelevant'/><category term='Literature'/><category term='Games and Game Industry'/><category term='EA'/><category term='Senzee'/><category term='Optimization'/><category term='Red 5 Studios'/><category term='Machine Vision'/><title type='text'>Senzee 5</title><subtitle type='html'>Paul Senzee on Software, Game Development, Technology and Life</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28016235.post-8244129558927214601</id><published>2011-09-20T10:09:00.003-04:00</published><updated>2011-09-20T10:13:19.949-04:00</updated><title type='text'>Senzee 5 Stolen!</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;My domain,&lt;/span&gt; &lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;senzee5.com&lt;/span&gt;&lt;/b&gt;, was &lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-large;"&gt;&lt;b&gt;stolen&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now it points to some Japanese SEO company, a bunch of jerks.  It had expired, I guess, end of July and it wasn't set to auto-renew and it looks like I missed the emails and they snatched it up.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;ARGHHHH!!!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm at &lt;b&gt;&lt;span class="Apple-style-span" style="color: yellow; font-size: x-large;"&gt;paulsenzee.com&lt;/span&gt;&lt;/b&gt; for now..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8244129558927214601?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8244129558927214601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8244129558927214601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8244129558927214601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8244129558927214601'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/09/senzee-5-stolen.html' title='Senzee 5 Stolen!'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-320201903277995897</id><published>2011-05-24T20:15:00.024-04:00</published><updated>2011-06-10T09:27:28.503-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Cholera</title><content type='html'>&lt;a name="start"&gt;&lt;/a&gt;They talked of the days of the cholera in Santiago Miahuatlán, a village fifteen minutes from the city of Tehuacán de las Granadas in the southern edge of the state of Puebla close to the border of Oaxaca.  In those days there were wives and husbands, brothers and sisters, small children, mothers and fathers just gone.  The water was unclean and there is no deliverance from water.  In all they said one-in-four perished in this town, but I did not believe it.  It could not be that in the 1990s a medieval epidemic could wipe out a town like this with not a peep heard elsewhere.  &lt;br /&gt;&lt;br /&gt;It may be true.  The &lt;i&gt;gobierno&lt;/i&gt; underreports cholera outbreaks.  The tragedy was unbearable to this place, whether one in four or one in forty, because compounding its numbers is only a multiplying of infinity.&lt;br /&gt;&lt;br /&gt;Miahuatlán's torment could be seen in the still dirt streets, the ramshackle homes at the periphery, the dust-blown open market and in the Catholic church of broken walls that stood as the once-elegant headpiece of the town square called the zócalo.  Among the agave plants that bowed to the dusty earth, cacti stood tall - like the people here themselves - even encumbered with the weight of overripe red pitaya fruit, round and wet with a taste and texture almost like watermelon.&lt;br /&gt;&lt;br /&gt;Three years after the epidemic, sweat soaked our shirts as we raced again in the sun past men with straw hats plowing and harrowing new milpas and breaking up dark soil beneath the pale dust.  We slowed to saunter at a reverent pace as we walked those streets near the graveyards, where from time to time other men with straw hats, muscled from years of labor, would stand quietly with calloused hands and infected nails clutching their deep-lined faces or kneel at wooden crosses and weep.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-320201903277995897?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/320201903277995897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=320201903277995897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/320201903277995897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/320201903277995897'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/05/cholera.html' title='Cholera'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-4312653985927679789</id><published>2011-05-04T11:01:00.001-04:00</published><updated>2011-05-04T11:13:20.679-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='The Relic'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Axolotl Studios'/><title type='text'>Ambition</title><content type='html'>&lt;a href="http://www.senzee5.com/2011/03/relic.html"&gt;&lt;b&gt;The Relic&lt;/b&gt;&lt;/a&gt; &lt;a href="http://itunes.apple.com/us/app/the-relic/id426676543?mt=8"&gt;(iTunes)&lt;/a&gt; was released April 14, 2011 to disastrous reception.  It sold well at first but sales fell off after the crushing reviews.  The most common complaint was the control scheme but there were many others as well.  For now, I have an update ready for the controller and some collision issues.  I will update Crystal as soon as I get hold of the new build and submit the update then.  I'm also working to update other aspects in the meantime.&lt;br /&gt;&lt;br /&gt;It is a disappointment.  Many people wanted to play &lt;b&gt;The Relic&lt;/b&gt;.  The game was ambitious from the start - especially given the resources I had to develop it.  However, to make it in the App Store, you have to have an ambitious game and I knew that.  You also have to have a polished game, and The Relic - as it is right now - is not that.&lt;br /&gt;&lt;br /&gt;In any event I'm committed to &lt;b&gt;The Relic&lt;/b&gt; and little by little, with each update, it will fully become the incredible game that's hidden a bit below the surface.  I recently read &lt;a href="http://www.gamesindustry.biz/articles/2011-04-27-indie-project-budgets-article"&gt;this article in gamesindustry.biz (which may require registration/login)&lt;/a&gt; about indie project budgets.  The author maintains that to make a successful indie mobile game you ideally need $100k in resources.  The Relic was developed in my bedroom after work hours.  There were long periods that I didn't make progress on it at all because at the time I was working insane hours at my day job.  To date, I've spent less than $3,000 on it.  I haven't yet recouped that investment but we'll see what the future holds.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Relic&lt;/b&gt; holds a great deal of promise and although it was made and will continue to be made for obscenely little money and resources, we will see it grow into something tremendous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-4312653985927679789?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/4312653985927679789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=4312653985927679789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4312653985927679789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4312653985927679789'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/05/ambition.html' title='Ambition'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2581126743096118603</id><published>2011-03-16T17:02:00.024-04:00</published><updated>2011-04-02T19:33:29.806-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='The Relic'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Axolotl Studios'/><title type='text'>The Relic</title><content type='html'>&lt;h4&gt;In the App Store April 14, 2011!&lt;/h4&gt;&lt;div style="float:left;"&gt;&lt;img src="http://axolotlstudios.com/relic-images/Relic893201_small.jpg" /&gt;&lt;/div&gt;&lt;div style="clear:left;"&gt;&lt;/div&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.facebook.com%2Fpages%2FThe-Relic%2F149992531219&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:35px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;br /&gt;The Relic is a 3D Gauntlet- or Diablo-style arcade RPG developed by Axolotl Studios (aka me) and published by Chillingo.  It runs on iPhone and iPad.  It's taken some time to develop but it is currently in submission with Apple and will be released within the next few weeks.  I'm proud of it.  There are those projects that you create that turn out far better that you had hoped and this is one of them - for the most part.  Like all your creations that you know intimately, you know its flaws.  One big disappointment was having to cut multiplayer.&lt;br /&gt;&lt;br /&gt;Multiplayer is not in this release.  I spent months working on it and got it working reasonably well but the architecture was a mess and it was hard to fit the rest of the game around it at that time and it was getting later and later.  I was starting to believe myself that the game would never be released, so we cut it.  I intend to get it in in a future update. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://axolotlstudios.com/wp-content/uploads/2010/12/ss34960199_small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://axolotlstudios.com/wp-content/uploads/2010/12/ss34960199_small.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;And Death Shall Have No Dominion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The two things with the most impact in this world are love and death.  Attachment and detachment.  We all die.  Yet in this era, there exists a mere possibility that even death itself may yield to the relentless advance of technology.  The Relic explores the concept of immortality and of mastery of the biological in an unexpected, although pretty minimalistic way.  I want to add more depth and nuance to the story in future updates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Art of The Relic&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mark Jones created the character art and most of the animations.  Some of the environment art (the tents and market area) was stock 3D art and well worth the little I paid for it.  In the future I will use stock art more.  I created the dungeons themselves and props such as the crates and barrels and the items that can be dropped, some of the animations, the UI art and the logos.  Much of the scene art, the intro, etc. uses art adapted from public domain art sources - that is, famous, old works of art.  I used Blender for the 3D art.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Music of The Relic&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Most of the music in The Relic is stock music, however, The Relic includes two songs by indie songwriter and musician &lt;a href="http://itunes.apple.com/us/album/indigo/id340756674"&gt;Andy Livingston, "Indigo Winter" and "Heavy."&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Code of The Relic&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;One of the most successful parts of The Relic's engine is the sheer number of animated 3D enemies that it can handle.  The Relic engine uses Lua heavily for game-side scripting, but it is organized in a way that does not interfere with The Relic's ability to manage so many enemies.&lt;br /&gt;&lt;br /&gt;I'll write more about coding concerns later, but with 438 source files (not including the Lua files), this is certainly the largest software project I've written entirely by myself.  It's written primarily in C++ and I did most of the development on Windows PC with Visual Studio and occasionally testing with the iPhone with platform-specific pieces written in C++ on the Windows side and Objective-C on the iPhone/iPad side.  As with Indigo Ocho, near the final stages of development, development shifted completely over to the Mac/iPhone.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;The Relic&lt;/b&gt;&amp;nbsp;(iPhone 4 screens) &lt;a href="http://www.facebook.com/pages/The-Relic/149992531219"&gt;[on facebook]&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://axolotlstudios.com/wp-content/uploads/2010/12/ss32843405_small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://axolotlstudios.com/wp-content/uploads/2010/12/ss32843405_small.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.thumb { float:left; margin: 4px 0px 4px 0px; }&lt;/style&gt;&lt;br /&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss29869124.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss29869124_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss29924285.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss29924285_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss30747338.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss30747338_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss30852721.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss30852721_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss30867784.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss30867784_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss31164788.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss31164788_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss31255115.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss31255115_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32392603.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32392603_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32435327.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32435327_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32502558.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32502558_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32662806.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32662806_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32669513.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32669513_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss32843405.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss32843405_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss33493090.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss33493090_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss33897469.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss33897469_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss34460838.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss34460838_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss34571144.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss34571144_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss34676526.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss34676526_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss34965224.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss34965224_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/ss35115621.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/ss35115621_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: left;"&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo106.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo106_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo109.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo109_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo125.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo125_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo141.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo141_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo16.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo16_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo19.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo19_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo24.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo24_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo36.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo36_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo5.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo5_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo69.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo69_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo77.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo77_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo82.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo82_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo83.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo83_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo84.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo84_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo85.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo85_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo91.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo91_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="thumb"&gt;&lt;a href="http://axolotlstudios.com/relic-images/photo94.jpg"&gt;&lt;img src="http://axolotlstudios.com/relic-images/photo94_eighth.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: left;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2581126743096118603?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://axolotlstudios.com' title='The Relic'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2581126743096118603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2581126743096118603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2581126743096118603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2581126743096118603'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/03/relic.html' title='The Relic'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7422497700259792484</id><published>2011-03-16T16:44:00.012-04:00</published><updated>2011-09-26T20:17:39.383-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='The Relic'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Axolotl Studios'/><category scheme='http://www.blogger.com/atom/ns#' term='Indigo Ocho'/><title type='text'>Axolotl Studios</title><content type='html'>Here's a quick update.  It has been a long, long time.&lt;br /&gt;&lt;br /&gt;I left EA and&amp;nbsp;I'm now working at&amp;nbsp;&lt;i&gt;XOS Digital&lt;/i&gt;&amp;nbsp;making mobile apps for all sorts of platforms which is a blast and reasonable hours too. &amp;nbsp;My latest side project has been my indie iPhone/iPad/iPod dev shop, &lt;a href="http://axolotlstudios.com/"&gt;Axolotl Studios&lt;/a&gt;. &amp;nbsp; For my day job I'm now working at &lt;i&gt;XOS Digital&lt;/i&gt; making mobile apps for all sorts of platforms which is a blast and reasonable hours too.  I'm currently fighting a lot with BlackBerry.&lt;br /&gt;&lt;br /&gt;A couple of years ago now (wow) we/I released &lt;a href="http://www.facebook.com/pages/Indigo-Ocho/80584294787"&gt;Indigo Ocho&lt;/a&gt;, a 3D accelerometer-based labyrinthine puzzle game, which is not currently in the App Store, but I do intend to get it back there again.  Now &lt;b&gt;&lt;i&gt;&lt;u&gt;finally&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;, I have completed &lt;a href="http://www.facebook.com/pages/The-Relic/149992531219"&gt;The Relic&lt;/a&gt; to be released shortly by Chillingo.  I'll cover these games separately in subsequent posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7422497700259792484?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://axolotlstudios.com' title='Axolotl Studios'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7422497700259792484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7422497700259792484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7422497700259792484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7422497700259792484'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/03/axolotl-studios.html' title='Axolotl Studios'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6731557934100786736</id><published>2011-03-11T23:54:00.014-05:00</published><updated>2011-03-23T00:54:15.266-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Axolotl Studios'/><category scheme='http://www.blogger.com/atom/ns#' term='Indigo Ocho'/><title type='text'>Indigo Ocho</title><content type='html'>Indigo Ocho has been out of the App Store for some time now, and now that The Relic is done, I'll try to get Indigo Ocho back up there.&lt;br /&gt;&lt;br /&gt;(Indigo Ocho: more coming soon)&lt;br /&gt;&lt;br /&gt;Indigo Ocho &lt;a href="http://www.facebook.com/pages/Indigo-Ocho/80584294787"&gt;[facebook]&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://axolotlstudios.com/i8-images/4619_80589294787_80584294787_1661934_5334687_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://axolotlstudios.com/i8-images/4619_80589294787_80584294787_1661934_5334687_n.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://axolotlstudios.com/i8-images/4619_80589299787_80584294787_1661935_353808_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://axolotlstudios.com/i8-images/4619_80589299787_80584294787_1661935_353808_n.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://axolotlstudios.com/i8-images/4619_80589309787_80584294787_1661937_3206255_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://axolotlstudios.com/i8-images/4619_80589309787_80584294787_1661937_3206255_n.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6731557934100786736?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6731557934100786736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6731557934100786736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6731557934100786736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6731557934100786736'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/03/indigo-ocho.html' title='Indigo Ocho'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1054468840859279130</id><published>2011-03-10T20:57:00.000-05:00</published><updated>2011-03-17T08:50:40.926-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Echo</title><content type='html'>&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: pink;"&gt;elvira_jones&lt;/span&gt; has initiated a conversation with &lt;span style="color: lime;"&gt;joebob10_&lt;/span&gt;. &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: pink;"&gt;23:50:00 elvira_jones&lt;/span&gt;: how did ur surgry go last wk? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;23:50:23 joebob10_&lt;/span&gt;: ok they got the tumor out of my head. it was small benine. no pain tho hpy to be hm&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: pink;"&gt;23:52:01 elvira_jones&lt;/span&gt;: :) good i was worried bout u&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: pink;"&gt;23:58:13 elvira_jones&lt;/span&gt;: good nite im checkin out &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;23:58:42 joebob10_&lt;/span&gt;: u2 thx :) &lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;The conversation between &lt;span style="color: lime;"&gt;joebob10_&lt;/span&gt; and &lt;span style="color: pink;"&gt;elvira_jones&lt;/span&gt; has ended.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;joebob10&lt;/span&gt; has initiated a conversation with &lt;span style="color: lime;"&gt;joebob10_&lt;/span&gt;. &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;23:59:59 joebob10&lt;/span&gt;: who r u? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:00:02 joebob10_&lt;/span&gt;: who r u? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:05:48 joebob10&lt;/span&gt;: hello?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:05:51 joebob10_&lt;/span&gt;: hello? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:07:59 joebob10&lt;/span&gt;: ([gibberish], 'seriously who r u', 'WTF?')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:08:02 joebob10_&lt;/span&gt;: a;lsdfklj;kasdfkl;j &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:08:02 joebob10&lt;/span&gt;: WTF? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:08:05 joebob10_&lt;/span&gt;: WTF? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:08:05 joebob10&lt;/span&gt;: ([gibberish], 'elvira?', 'dude u creep me out', [profanity], 'stop it!') &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:08:08 joebob10_&lt;/span&gt;: stop it! &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:08:08 joebob10&lt;/span&gt;: im serious &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:08:11 joebob10_&lt;/span&gt;: im serious &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: red;"&gt;00:08:12 joebob10&lt;/span&gt;: ([gibberish], 'is this a joke?')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:08:15 joebob10_&lt;/span&gt;: alskdfj;asdquoioieruw3482 &lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;The conversation between &lt;span style="color: lime;"&gt;joebob10_&lt;/span&gt; and &lt;span style="color: red;"&gt;joebob10&lt;/span&gt; has ended.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;joebob10_&lt;/span&gt; has initiated a conversation with &lt;span style="color: #3d85c6;"&gt;docPhillips_&lt;/span&gt;. &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:15:12 joebob10_&lt;/span&gt;: hey dr p? sorry to bother you so late i didn't know if ur awake&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:15:15 docPhillips_&lt;/span&gt;: How are you feeling? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:18:27 joebob10_&lt;/span&gt;: i think im having delusions weird ims from a guy named with my old username &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:18:30 docPhillips_&lt;/span&gt;: Oh, yeah.. Hey don't worry about that - it's part of the tests we told you about. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:19:12 joebob10_&lt;/span&gt;: no no this is different he types what i'm going to type in the future before i type it! &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:19:15 docPhillips_&lt;/span&gt;: Ok, so the thing is.. Do you remember the form you signed saying that we could use any data we were able to gather from your surgery for? &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:19:49 joebob10_&lt;/span&gt;: yeah sure &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:19:52 docPhillips_&lt;/span&gt;: Well, we modeled your brain in a computer. I guess Dr. Minsky left it on all night. I'm sorry. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:23:00 joebob10_&lt;/span&gt;: no way &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:23:03 docPhillips_&lt;/span&gt;: Yeah, we'll turn it off first thing tomorrow morning. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:27:52 joebob10_&lt;/span&gt;: no u dont understand no this isnt right this creeps me out&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:27:55 docPhillips_&lt;/span&gt;: Really, I promise, we'll turn it off in the morning. It won't bother you again. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:30:04 joebob10_&lt;/span&gt;: no ur using my brain???!!! thats not rite at all dude im gonna sue ur ass &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:30:07 docPhillips_&lt;/span&gt;: Don't be upset. Look, we'll talk about this in the morning, get it all straightened out. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:31:13 joebob10_&lt;/span&gt;: no im goin to call my lawyer in the morning to get all over this shit &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:31:16 docPhillips_&lt;/span&gt;: Julia,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:31:18 joebob10_&lt;/span&gt;: dude wrong chat window&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: #3d85c6;"&gt;00:31:19 docPhillips_&lt;/span&gt;: could you or one of the other nurses turn off joebob10_ please?  Thanks.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;span style="color: lime;"&gt;00:31:20 joebob10_&lt;/span&gt;: ?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1054468840859279130?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1054468840859279130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1054468840859279130' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1054468840859279130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1054468840859279130'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/03/echo.html' title='Echo'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-66282380805975518</id><published>2008-11-29T13:16:00.004-05:00</published><updated>2011-03-17T08:50:17.829-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Industry Broadcast: Podcasts of Senzee 5 Articles</title><content type='html'>A &lt;a href="http://www.industrybroadcast.com/tag/senzee5com/"&gt;Senzee 5&lt;/a&gt; podcast (&lt;a href="http://www.industrybroadcast.com/2008/11/27/audio-article-34-concurency-in-game-design-why-use-c/" target="_self"&gt;Audio Article #34: Concurrency in Game Design + Why Use C++?&lt;/a&gt;) is now available at &lt;strong&gt;Industry Broadcast&lt;/strong&gt; (&lt;a href="http://www.industrybroadcast.com/"&gt;http://www.industrybroadcast.com/&lt;/a&gt;) read aloud by &lt;strong&gt;Ryan Wiancko.&lt;/strong&gt; There's a lot of really great stuff there, so get over there and check it out!&lt;br /&gt;&lt;br /&gt;The audio article posted combines my entries &lt;a href="http://www.senzee5.com/2007/12/concurrency-in-game-development.html"&gt;Concurrency in Game Development&lt;/a&gt; and &lt;a href="http://www.senzee5.com/2007/12/why-do-we-use-c.html"&gt;Why Do We Use C++?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Industry Broadcast is the result of Ryan's great idea to offer insight from game developers in audio format. He says -&lt;br /&gt;&lt;br /&gt;&lt;em&gt;I was toiling over one disappointing aspect of almost every one of my days: That being that I have so little time outside of my 16-20 hour work day to be a human being that I never am able to sit down and read enough of the articles being published online about the games industry. Occasionally my RSS feeder throws something at me that I just have to make time for but for the most part I see the headlines of features and articles and have to regretfully click away and focus on the 65 new emails sitting in my mail box. I thought ‘&lt;strong&gt;God, if I could just have an LCD in the shower with me I might actually have the ability to digest the plethora of useful information regularly being shared by the top minds in our industry&lt;/strong&gt;.” And then an even better idea struck me: If all of this material was available in Audio Format then I, as well as fellow developers, could be listening to these amazing articles whilst working out or doing the dishes, or or or.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Ryan also maintains a personal blog &lt;a href="http://blog.netflowdevelopments.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-66282380805975518?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.industrybroadcast.com' title='Industry Broadcast: Podcasts of Senzee 5 Articles'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/66282380805975518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=66282380805975518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/66282380805975518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/66282380805975518'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/11/industry-broadcast-podcasts-of-senzee-5.html' title='Industry Broadcast: Podcasts of Senzee 5 Articles'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-360801519561607323</id><published>2008-11-16T00:16:00.097-05:00</published><updated>2011-03-17T08:50:17.829-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Underengineering Undead</title><content type='html'>We learn more from our failures than from our successes.  In &lt;a href="http://www.senzee5.com/2007/06/developers-life-stages.html"&gt;A Developer's Life Stages&lt;/a&gt;, the first stage is &lt;em&gt;The Underengineer&lt;/em&gt;, in part inspired by this poignant failure.&lt;br /&gt;&lt;br /&gt;&lt;div style="FLOAT: left"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 256px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/t256_ss00Undead8.jpg" border="0" /&gt;&lt;br /&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 256px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/t256_ss00Undead7.jpg" border="0" /&gt;&lt;/div&gt;As a college freshman in late 1992, I started making an &lt;a href="http://en.wikipedia.org/wiki/Ultima_6"&gt;Ultima VI&lt;/a&gt;-like role-playing game.&lt;br /&gt;&lt;br /&gt;In researching this post, I went through my journals from that time period to try to figure out &lt;i&gt;exactly&lt;/i&gt; how Undead failed.  One glaring issue is that ~75% of the journal was about girls, with the remainder divided among writing music, painting classes and working on the game.  While totally expected for a distractible teen, given the difficulty of the task and a rapidly approaching deadline (discussed later) it's not a good indicator of eventual success of the project.  Nevertheless, software development is a human activity and must coexist with other human activities.  Initially, I was more interested in producing an &lt;a href="http://en.wikipedia.org/wiki/Ultima_(video_game_series)"&gt;Ultima&lt;/a&gt;-esque demo that would get me a job at &lt;a href="http://en.wikipedia.org/wiki/Origin_Systems"&gt;Origin Systems&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I met a classmate in my speech class at school named &lt;a href="http://www.linkedin.com/pub/5/127/520"&gt;Alex Kapadia&lt;/a&gt;.  Alex had some experience with sound programming and was a game fanatic.  I showed him what I'd built, he was thrilled and we began collaborating.  At the time, we were playing a game called &lt;a href="http://en.wikipedia.org/wiki/Solar_Winds"&gt;Solar Winds&lt;/a&gt; distributed by a small shareware company called &lt;a href="http://en.wikipedia.org/wiki/Epic_Games"&gt;Epic MegaGames&lt;/a&gt; before it shortened its name and became known as the world-class developer of &lt;a href="http://en.wikipedia.org/wiki/Unreal"&gt;Unreal&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Gears_of_war"&gt;Gears of War&lt;/a&gt;. Each time the game ended, up popped an ad by Epic requesting developers to send in their games for publishing.  We sent Undead to Epic and awaited a response.  We didn't have to wait long.  In early summer 1993 we knew that we would be working with Epic.  We sent several versions to Epic over the following year.  As it started to gel a bit, we began working more closely with them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;font-size:small"&gt;JOURNAL 12/06/93: Talked to &lt;a href="http://en.wikipedia.org/wiki/Tim_Sweeney_(game_developer)"&gt;Tim Sweeney&lt;/a&gt; (president of Epic MegaGames) today. Wow, he knows games.  He gave me a lot of good suggestions.  He's looking into an artist and musician for the game.  He was talking some intense MONEY!!!!!!!!!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tim estimated that the game would make Alex and I $40,000, which was an unfathomable amount of money for me as a 19-year old.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;font-size:small"&gt;JOURNAL 12/08/93: Today &lt;b&gt;Dan Froelich&lt;/b&gt;, musician and composer for Epic called me.  He lives in Kansas City (that's crazy!) and works for &lt;a href="http://en.wikipedia.org/wiki/Informix"&gt;Informix&lt;/a&gt;.  He told me a lot about how the game publishing thing works.  After finals week, we'll get together.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We did end up getting together, Dan, Alex and I at &lt;a href="http://www.mannyskc.com/"&gt;Manny's&lt;/a&gt;, the finest Mexican restaurant in Kansas City.  He told us a lot about Epic and the business of developing shareware games. He also brought beta copies of Epic's &lt;a href="http://en.wikipedia.org/wiki/Xargon"&gt;Xargon&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Ken%27s_Labyrinth"&gt;Ken's Labyrinth&lt;/a&gt;, developed by wunderkind &lt;a href="http://en.wikipedia.org/wiki/Ken_Silverman"&gt;Ken Silverman&lt;/a&gt;.&lt;table&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead8.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead7.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead6.jpg" width="128"/&gt;&lt;/td&gt;&lt;br /&gt; &lt;td valign="top"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead14.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead2.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead3.jpg" width="128"/&gt;&lt;/td&gt;&lt;br /&gt; &lt;td valign="top"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead4.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead5.jpg" width="128"/&gt;&lt;br&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 128px; CURSOR: hand" src="http://www.psenzee.com/images/t128_ss00Undead9.jpg" width="128"/&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;span style="font-family:monospace;font-size:small"&gt;&lt;br /&gt;JOURNAL 12/15/93:&lt;br /&gt;&lt;br /&gt;From Tim Sweeney (via E-mail):&lt;br /&gt;Date: Wed, 15 Dec 1993 04:28:24 -0500 (EST)&lt;br /&gt;From: Tim Sweeney &lt;70451.633@compuserve.com&gt;&lt;br /&gt;Subject: RE: Undead &amp;amp; Pinball&lt;br /&gt;To: PSENZEE@VAX1.UMKC.EDU&lt;br /&gt;Message-id: &lt;931215092823_70451.633_fhg40-1@compuserve.com&gt;&lt;br /&gt;Content-transfer-encoding: 7BIT&lt;br /&gt;--&lt;br /&gt;Thanks! It's great that you and Dan live in the same town. I hope you'll be interested in working with Dan - he's been with us on &lt;a href="http://en.wikipedia.org/wiki/Jill_of_the_Jungle"&gt;Jill&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kiloblaster"&gt;Kiloblaster&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Brix_(computer_game)"&gt;Brix&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Solar_Winds"&gt;Solar Winds&lt;/a&gt;, Adventure Math, and &lt;a href="http://en.wikipedia.org/wiki/Xargon"&gt;Xargon&lt;/a&gt; and his experience working with these projects would be helpful in addition to his music! &lt;b&gt;I'm looking forward to seeing more of Undead! It's the best "first" game any author has shown us.&lt;/b&gt; Judging by your coding and artwork, your game has great potential and you have tremendous potential as an author. Undead still has a long way to go in developing a story, creating all the artwork, and turning it into a fun, unique, and successful shareware game, but it looks like you have the perserverence to see it through to the end. Keep up the great work!&lt;br /&gt;&lt;br /&gt;-Tim, Epic MegaGames&lt;br /&gt; (3:22 AM - normal business hours for we game developers) :-)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;A House of Cards&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In late 1993, we believed Undead was going to be an enormous hit.  The possibilities appeared endless.  Even so, I was starting to deeply fear that I wouldn't be able to finish it.  Undead had grown in complexity so much that modifying it was becoming difficult.  It was approaching 20,000 lines of C and assembly and because it had no higher level architecture to speak of, I was losing my ability to understand it.  Disparate pieces were tightly coupled.  There was no layering of subsystems.  Significant numerical values were hard-coded everywhere.  Every line of code I added made it harder to work with.  It was like going from troweling wet concrete to chiseling hardened concrete.  This was a classic case of &lt;i&gt;underengineering&lt;/i&gt; and I was unequipped to fix it.  I was scared.  Instead of confronting that issue, I began obsessing over the art - most of the development time was now spent in &lt;a href="http://en.wikipedia.org/wiki/Deluxe_Paint"&gt;DeluxePaint&lt;/a&gt; getting the art &lt;i&gt;just right&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;font-size:small"&gt;JOURNAL 03/02/94: Undead is gaining bugs as I try to fix it!  Argh.  And it's having memory problems -- specifically, not enough static memory.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Worse yet, I had a deadline that I hadn't yet shared with Epic.  In a year, more or less, I'd be leaving the country for two years without access to a computer.  Now, I suspect I could have fixed Undead's woes given enough time, but I didn't have that time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Man on a Mission&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I grew up in the Mormon (LDS) church.  Although I left the church many years ago now, at the time I was devout and determined (and expected) to become a missionary (I'll write sometime later about why this was the right choice, despite my eventual leaving).  Around March 1994, I called Tim and told him that I had committed to leave for a two-year mission to central Mexico sometime around September.  Understandably, he wasn't happy.  I'd naively assumed (wishful thinking) that I would be able to get everything done before leaving in the fall.  He knew better.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;font-size:small"&gt;JOURNAL 03/26/94: BAD NEWS.  Tim Sweeney got the copy of Undead.  He told me he thought it was fantastic, but that there was no way on earth I was going to get it done before August.  In addition, he said it would be absolutely obsolete when I got back.  03/27/94: I didn't realize how upset I was about what Tim said about Undead not being done until I woke this morning and I had been having nightmares about it all night.  Of course he's right and I knew it anyway.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Obsolescence was always on our tail and we felt its pressure even during development. The style of game that Undead represented was an Ultima VI class game when the RPG state of the art was &lt;a href="http://en.wikipedia.org/wiki/Ultima_VII"&gt;Ultima VII&lt;/a&gt; and in 1993, &lt;a href="http://en.wikipedia.org/wiki/Doom_(video_game)"&gt;Doom&lt;/a&gt; (as shareware no less!) splayed the writing on the wall for all 2D games.&lt;br /&gt;&lt;br /&gt;Perhaps, as a project, this was doomed from the outset for many reasons.  The most obvious was my leaving before it was done.  Compared to what I build today, though, the game was not at all complex.  It should have been straightforward to build it in a year-and-a-half.  It's been said that programming ability manifests at a young age, while skill in software architecture comes much later.  In the end, I knew the dark secret.  It wasn't merely unfinished, it was &lt;i&gt;&lt;u&gt;unfinishable&lt;/u&gt;&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-360801519561607323?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/360801519561607323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=360801519561607323' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/360801519561607323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/360801519561607323'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/11/underengineering-undead.html' title='Underengineering Undead'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1049115361158456322</id><published>2008-11-15T16:35:00.054-05:00</published><updated>2011-03-17T16:14:35.335-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Geek History #1</title><content type='html'>&lt;b&gt;Circa 1987-1991&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 256px; CURSOR: hand; HEIGHT: 236px" alt="" src="http://www.psenzee.com/images/t256_ssLegacy3.png" border="0" /&gt;Connecting with old friends on Facebook lately led me to remember those early days as a teenager writing video games. It's incredible how much has changed since then. It was nearly impossible to get any information on how to program a computer, much less on how to write games. The library books were typically user and application-oriented. C and assembly books could only be had at the bookstore at ~$60 a piece. In the days before bookstores came with sitting/reading furniture, being a kid without a lot of cash, I'd go to Waldenbooks in the mall and stand there reading, absorbing as much as possible before I had to leave. Today, on the other hand, there's rarely a need to buy technical books because whatever I need can be found on the web faster and for free. Today is &lt;i&gt;definitely&lt;/i&gt; better.&lt;br /&gt;&lt;br /&gt;With a tiny bit of programming in school (&lt;a href="http://en.wikipedia.org/wiki/Applesoft_BASIC"&gt;Applesoft&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore BASIC&lt;/a&gt;) when we got our first computer (a &lt;a href="http://en.wikipedia.org/wiki/Tandy_1000#Tandy_1000_SX.2FTX"&gt;Tandy 1000SX&lt;/a&gt;), I naturally started with &lt;a href="http://en.wikipedia.org/wiki/GW-BASIC"&gt;GW-BASIC&lt;/a&gt;. It was too slow for the kinds of games I wanted to make - games like &lt;a href="http://en.wikipedia.org/wiki/Ultima_5"&gt;Ultima V&lt;/a&gt; and &lt;a href="http://www.senzee5.com/2007/12/times-of-lore-maps.html"&gt;&lt;b&gt;Times of Lore&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For Christmas, I asked my parents for a &lt;a href="http://en.wikipedia.org/wiki/BASIC"&gt;BASIC&lt;/a&gt; Compiler (&lt;i&gt;a what?&lt;/i&gt;, they asked). It was what I'd circled for them in a magazine - &lt;a href="http://en.wikipedia.org/wiki/Turbo_Basic"&gt;Turbo Basic&lt;/a&gt;. I expected to drop my games in and have them run like crazy. There was a hitch, however. The Tandy 1000SX shipped with an &lt;a href="http://en.wikipedia.org/wiki/Original_equipment_manufacturer#Computers"&gt;OEM&lt;/a&gt; version of Microsoft's GW-BASIC that natively supported the Tandy's enhanced CGA video adapter (essentially the same as the the &lt;a href="http://en.wikipedia.org/wiki/Ibm_pcjr"&gt;IBM PCjr&lt;/a&gt;'s with the 16-color 320x200 mode). Turbo Basic didn't. So, as long as the games could be confined to the horrible four-color plain &lt;a href="http://en.wikipedia.org/wiki/Color_Graphics_Adapter"&gt;CGA&lt;/a&gt;, they'd compile just fine and run pretty fast. I wrote a paint program (&lt;i&gt;Paint!&lt;/i&gt;, image below) and a couple of plain (and simple) CGA games (&lt;i&gt;Alien Invasion&lt;/i&gt; and &lt;i&gt;BreakOut!&lt;/i&gt;, below) in Turbo Basic. In the end, Turbo Basic was still not fast enough and four colors weren't sufficient.&lt;br /&gt;&lt;br /&gt;More importantly, there was one specific technical issue that simply could not be solved with any sort of BASIC. I wanted a four-way scrolling world, like those in nearly every commercial game of the time. I was so desperate to make this sort of game that I spent what little money I had on a commercial library (for BASIC) that supported &lt;i&gt;scrolling&lt;/i&gt; through assembly-language routines. It turned out that the &lt;i&gt;scrolling&lt;/i&gt; supported by the library was simple text scrolling through the &lt;a href="http://en.wikipedia.org/wiki/BIOS"&gt;BIOS&lt;/a&gt; routines, wholly inadequate for what I wanted. I was extremely disappointed and called the (apparently) single-person company for a refund. He refused. There was only possible solution - to learn C.&lt;br /&gt;&lt;br /&gt;C had (and still has) a reputation of being extremely difficult, yet it was the language most commercial games were written in. I bought Mix C - a command line compiler/linker and nothing else - for $20. Coming from BASIC, it was a difficult environment. After floundering with that for months and maybe a year, I finally broke down and bought the &lt;a href="http://en.wikipedia.org/wiki/Turbo_C"&gt;Turbo C&lt;/a&gt; compiler for $150 and spent the next two weeks trying to build a working piece of software in C. Although I didn't fully understand pointers at the end of the two weeks, I wasn't far off from a basic working knowledge of C. Good tools can make all the difference. I still couldn't figure out scrolling until I received a letter from &lt;a href="http://www.senzee5.com/2006/11/some-people-ive-met-and-some-people-i.html"&gt;&lt;b&gt;Herman Miller&lt;/b&gt;&lt;/a&gt; that brought everything together. From that &lt;i&gt;Legacy I&lt;/i&gt; (shown above and below) in C finally came to be.  It was a collaboration between &lt;b&gt;Eric Lambert&lt;/b&gt; (who did the maps and much of the game design) and I.  In truth, it wasn't a game in the end - the player is merely able to roam the world in full 16-color Tandy splendor. That was good enough for me because we now had a new computer with 256 (!) colors. It was &lt;a href="http://www.senzee5.com/2008/11/underengineering-undead.html"&gt;time to start all over&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img src="http://www.psenzee.com/images/t128_bricks.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssAlienInvasion0.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssLegacy2.png" width="128" /&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;img src="http://www.psenzee.com/images/t128_ssHauntedCastle0.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssBreakout0.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssIcon0.png" width="128" /&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;img src="http://www.psenzee.com/images/t128_ssPaint0.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssPictureMaker0.png" width="128" /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/t128_ssLegacy1.png" width="128" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1049115361158456322?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1049115361158456322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1049115361158456322' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1049115361158456322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1049115361158456322'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/11/geek-history-1.html' title='Geek History #1'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-4590976501361883059</id><published>2008-11-09T22:40:00.010-05:00</published><updated>2011-06-05T17:25:35.265-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Ufo Hill</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_2ro8CljYdEQ/TDx26ie6kDI/AAAAAAAAADo/p_T8Ewe8Uwk/s1600/met2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5493396393546125362" src="http://3.bp.blogspot.com/_2ro8CljYdEQ/TDx26ie6kDI/AAAAAAAAADo/p_T8Ewe8Uwk/s400/met2.jpg" style="cursor: hand; cursor: pointer; display: block; height: 167px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;Atlixco's colony of Metepec is surrounded by conical hills, strange low emerald mountains, that rise steeply from the plains in a way that seems man-made.  Arrieta and I took our free day to climb the close hill that towered just meters from our house.  For their uniform shape, I often imagined that these hills were ancient buried Aztec structures like the pyramid at Cholula covered up by Cortes after his domination of Mexico.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2ro8CljYdEQ/TDaGaNOgBLI/AAAAAAAAADA/WPYXOV4W6t0/s1600/atlixcolarge.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5491724580410098866" src="http://1.bp.blogspot.com/_2ro8CljYdEQ/TDaGaNOgBLI/AAAAAAAAADA/WPYXOV4W6t0/s200/atlixcolarge.jpg" style="cursor: hand; cursor: pointer; display: block; height: 138px; margin: 0px auto 10px; text-align: center; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;The locals here and apparently the &lt;a href="http://www.ufocasebook.com/bestufopictures5.html"&gt;UFO community worldwide&lt;/a&gt; came to regard these hills and this area as sacred earth for extraterrestrial sightings.  UFOs, called OVNIs in Spanish, had been spotted in these hills and around the cusp of the temperamental volcano Popocatepetl just beyond many times.  The real explanation was certainly something far more mundane - such as helicopters or fighter jets.&lt;br /&gt;&lt;br /&gt;To reach the hill we skirted a waterway, climbed a sloppily mortared rust and gray brick aqueduct and stepped through, plant by plant, the overgrown garden of the village backwoods.  The hills weren't nearly the rich green up close that they were from a distance.  After a couple of hours of wading through the dry yellow brush we reached the top.  We searched for the UFO landing spot in reverence but found nothing at the top of the sacred hill but brush.  &lt;br /&gt;&lt;br /&gt;Metepec is astounding from that vantage point, and we could see much more of it than we had ever visited.  Arrieta and I sat at the top for some time, saying nothing.  I don't know what we were hoping for.&lt;br /&gt;&lt;br /&gt;Eventually, Arrieta said, &lt;em&gt;"A soda?"&lt;/em&gt;&lt;br /&gt;&lt;em&gt;"Yeah."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;We climbed down, bought two Peñafiel Manzanas from a local vendor and chatted with him a few minutes.  We returned him the bottles and went home.  It was a great day.&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;b&gt;El Cerro de los Ovnis&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La colonia Metepec de Atlixco está rodeado por colinas cónicas, extraño montañas esmeraldas pequeños que se elevan abruptamente desde la llanura de una forma que parece hecha por el hombre.  Arrieta y yo tomamos nuestro tiempo libre para subir a la colina cercana que se alzaba a pocos metros de nuestra casa. Por sus formas uniformes, a menudo me imaginaba que estas colinas fueron antiguas estructuras aztecas sepultadas como la pirámide de Cholula cubierto por Cortés después de su dominación de México.&lt;br /&gt;&lt;br /&gt;La gente que vivía aquí y al parecer la comunidad OVNI en todo el mundo llegaron a considerar estas colinas como tierra sagrada para los avistamientos extraterrestres. Ovnis habían sido vistos en estes cerros y cerca de la cúspide del volcán temperamental Popocatépetl y más allá muchas veces.  La explicación verdadera es sin duda algo mucho más mundano - tales como helicópteros o aviones de combate.&lt;br /&gt;&lt;br /&gt;Para llegar al cerro que bordeaba un curso de agua, nos subimos un acueducto de ladrillo de color rojizo y gris y pisamos, planta por planta, el jardín invadido de la selva virgen del pueblo.  Los cerros no tenían el verde intenso de cerca que estaban a la distancia.  Después de un par de horas de caminar por el pincel seco y amarillo llegamos a la cima.  Con reverencia buscamos el lugar de aterrizaje de ovnis pero no encontramos nada en la parte superior de la colina sagrada sino pincel.&lt;br /&gt;&lt;br /&gt;Metepec es asombrosa desde ese punto de vista, y pudimos ver mucho más de lo que habíamos visitado nunca.  Arrieta y yo nos sentamos en la parte superior durante algún tiempo, sin decir nada.  No sé lo que estábamos esperando.&lt;br /&gt;&lt;br /&gt;Finalmente, Arrieta dijo: &lt;em&gt;"¿Un refresco?"&lt;/em&gt;&lt;br /&gt;&lt;em&gt;"Sí."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Bajamos, compramos dos Peñafiel Manzanas de un proveedor y conversamos con él unos minutos.  Le devolvimos las botellas y nos fuimos a casa.  Fue un gran día.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-4590976501361883059?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/4590976501361883059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=4590976501361883059' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4590976501361883059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4590976501361883059'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2011/03/ufo-hill.html' title='Ufo Hill'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2ro8CljYdEQ/TDx26ie6kDI/AAAAAAAAADo/p_T8Ewe8Uwk/s72-c/met2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-966458000613328148</id><published>2008-11-08T20:38:00.002-05:00</published><updated>2011-04-20T16:14:03.275-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>La Casa de los Ancianos</title><content type='html'>Arturo and his sixteen year-old daughter drove Arrieta and me to help at a house of the elderly in Atlixco. We rode in his ancient blue Chevy truck inscribed with El Pollo on the door, a name which had come to refer to Arturo himself. We flew past palms that line the old road to Axocopan and past the lush hills and rich lime colored milpas - fields of corn - with rickety seats rattling.  Arrieta sat on a seat of wood fashioned to replace the broken seat springs.  Juliana, El Pollo's daughter, sat in the truck bed holding down the supplies.&lt;br /&gt;&lt;br /&gt;I sat in the middle of the cab knocking the stick with my knee.  El Pollo pointed the way to the far side of Atlixco below the high hill where an aged limestone Christ the Redeemer watches over like Rio de Janeiro's famous statue.  We came to a home for older, abandoned seniors, wedged within a contiguous block of lemon and mango hued buildings.&lt;br /&gt;&lt;br /&gt;An iron gate sealed an opening a little wider than the breadth of a car, and we approached it.  A priest opened the gate when we knocked. He knew our companion and was visibly pleased to see him.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"You're here again, are you Arturo?"&lt;/i&gt; the priest asked.  A short, stocky nun in her habit came out of their living quarters and joined the conversation.&lt;br /&gt;&lt;i&gt;"It's been some time since you've both come hasn't it?"&lt;/i&gt; the nun began, referring to El Pollo and Juliana.&lt;br /&gt;&lt;i&gt;"Sí, sí...we have been busy."&lt;/i&gt;&lt;br /&gt;&lt;i&gt;"This place doesn't stay clean by itself .."&lt;/i&gt; she trailed off, realizing that the cleaning of the home was in the end her responsibility and no one else's.&lt;br /&gt;&lt;i&gt;"Sí, sí...we know,"&lt;/i&gt; said El Pollo as he disappeared to fix the home's plumbing.  &lt;br /&gt;&lt;br /&gt;El Pollo was a good man, he'd founded the Alcoholics Anonymous group in Metepec, our village outside of Atlixco, and was tireless in his service to his community although he was not a man without error.  I admired him.  His work in this home for the elderly had been one of his projects, and it was difficult.  We'd forged an unexpected alliance with him: we were religious, he was not.  El Pollo was a Mexican Jean Valjean, and he had taken it upon himself and his daughter to care for the dying señores.&lt;br /&gt;&lt;br /&gt;We entered the home's courtyard of the colonial style, gray cobblestone groundwork with a large stone well of water in the center and a faded rainbow of drying clothes stretched across between opposite roofs.  In each room around the courtyard, with no doors or curtains, the boarders moved slowly in the shadows.  In the first of the rooms I reeled from the stench - feces, decay and the pungent ammonia odor of urea.&lt;br /&gt;&lt;br /&gt;Since arriving in Mexico and passing countless days of food poisoning and intestinal infection, I had a weak stomach.  I convulsed and heaved spontaneously.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Careful, amigo! Get some air,"&lt;/i&gt; Arrieta said and pushed me back out the door.&lt;br /&gt;&lt;i&gt;"Yeah, I'll be alright, thanks,&lt;/i&gt;" I responded.&lt;br /&gt;&lt;br /&gt;I regained my composure and breathed shallowly so as not to catch the room's odors.  I looked around.  Two mattresses were on the floor; one was on a bed frame.  Each mattress was alive with the sheer number of flies.  Urine, feces and blood were smeared all over the elderly women's beds.  One was sitting up, and two were lying.&lt;br /&gt;&lt;br /&gt;These three women lived in varying states of incomprehension and did not immediately acknowledge our presence.  The sitting woman accosted me after a moment.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Hijo - son,...why did you leave me here?”&lt;/i&gt; she pleaded.&lt;br /&gt;&lt;i&gt;"¿Cómo?"&lt;/i&gt; I asked, bewildered.&lt;br /&gt;&lt;i&gt;"Why did you leave me here to die, hijo, do you have no love for your mother?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;She wore an old, dirty green and blue plaid dress with an apron and nodded to herself, muttering continually about her son or her husband things we couldn't understand.  I had never seen someone so sad.  Even so, she was the most capable of the three and was fully dressed.&lt;br /&gt;&lt;br /&gt;The señora in the bed parallel to that of the sitting woman - Pilar - was dressed with a t-shirt, a shawl and nothing more.  There was a bunched up blanket soiled with weeks of fecal matter that she pulled slowly over herself when we she finally saw us.&lt;br /&gt;&lt;br /&gt;We stepped around the puddles of urine on the floor and we watched with admiration as Juliana took charge and began cleaning rooms, changing and feeding them. She gently directed us to take the señoras, one by one, undress them, shower them, and then redress them.  We started with Pilar.  She spoke with fits of nearly unintelligible Spanish.&lt;br /&gt;&lt;br /&gt;"&lt;i&gt;What are you doing to me?&lt;/i&gt;" she demanded.&lt;br /&gt;&lt;i&gt;"We're going to bathe you, señora" &lt;/i&gt;Arrieta said.&lt;br /&gt;&lt;i&gt;"No, no, no, no, no, no..."&lt;/i&gt;&lt;br /&gt;&lt;i&gt;"It'll be alright, don't you worry, you'll be fine,"&lt;/i&gt; I said.  We began undressing her.&lt;br /&gt;&lt;i&gt;"No no no nonono..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;She was humiliated and I was ashamed.  Pilar had lost her family, the integrity and clarity of her mind, certainly any shred of dignity she had ever possessed.  We walked her emaciated body naked, smeared with excrement and encircled by flies, across the courtyard to the shower in view of everyone in the home.  I helped her while Arrieta prepared the next señora.&lt;br /&gt;&lt;br /&gt;There was no other option.  On our way to the shower as we inched our way over the uneven stones, lifting Pilar's feet up lightly at some points, higher at others, something beautiful and surprising happened.  Leaning upon the stone and concrete framework of the gray, massive well, there was a small old bent-over man with a cane, wearing no shirt and only tattered, frayed briefs.&lt;br /&gt;&lt;br /&gt;He spoke to Pilar in a way I recognized instantly and as they exchanged awkward, tender words something wholly unexpected appeared in the home's cloud of dementia.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"How are you, my lovely Pilar?"&lt;/i&gt; he asked her, tipping an invisible hat.&lt;br /&gt;&lt;i&gt;"I'm fine! And how are you?"&lt;/i&gt; she responded, momentarily radiant.&lt;br /&gt;&lt;i&gt;"I feel good too!"&lt;/i&gt; he said, quivering subtly.&lt;br /&gt;&lt;br /&gt;This old bent man fancied Pilar and she him.  They spoke like shy children but as if both were fully clothed and in charge of their mental faculties.  I doubt each noticed that the other was nude or nearly so or any detail of the circumstance they were both in.  Between a naked old woman held up only by my right arm, perhaps in her mid-eighties, who moments before had been lying in her own waste, and this doubled and nearly unattired old man came something inexplicable.&lt;br /&gt;&lt;br /&gt;In their shared and mutually understood lives, in the most unexpected of places, had sprung what appeared to be love.&lt;br /&gt;&lt;br /&gt;We finished bathing her and her room companions in the shower.  The abandoned mother - whose son I was - cried and muttered &lt;i&gt;"no..no..no.."&lt;/i&gt; for the duration of the shower.  The last was silent and docile.  Either she did not understand what was happening, or had resigned herself to this routine performed by new strangers each time and had come to accept it.&lt;br /&gt;&lt;br /&gt;Juliana cleaned their room and mattresses and changed their blankets, then came to assist us in the shower.  With effort we finished and quietly we rode back home to Metepec.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-966458000613328148?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/966458000613328148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=966458000613328148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/966458000613328148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/966458000613328148'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/05/la-casa-de-los-ancianos.html' title='La Casa de los Ancianos'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6809410378435822192</id><published>2008-11-05T15:53:00.031-05:00</published><updated>2011-06-05T18:57:03.325-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Gangrene</title><content type='html'>We ate with an older man in Amalucan and his wife many afternoons.  His wife had taught me to properly wash clothes with a washboard which saved me many hours and I felt grateful.   One day the man showed us his toe.  &lt;i&gt;"What do you think?"&lt;/i&gt; he asked.  It was gangrenous.  I was twenty and dumb but I knew that.  We came by more often and each time she asked us to give him a blessing with the laying on of hands for healing.  We had the priesthood, the authority to act in the name of God.  The times I came with Fuentes*, he insisted on praying and always promised a complete restoration of his foot.  I elbowed him as he spoke since this was impossible and he should not promise it.  &lt;i&gt;"In God all is possible,"&lt;/i&gt; he told me afterwards, annoyed.&lt;br /&gt;&lt;br /&gt;The elderly man was diabetic. I could see that he would lose not only his toe, but his foot as well - with dry black and pus-filled tissue that reached well up into his arch.  Our new district leader, noble and faithful and from North Carolina came and gave him a blessing and we were hopeful.  If any blessing could heal him and stop the progression of the disease it would be the one from him, because he was very good.&lt;br /&gt;&lt;br /&gt;On a subsequent visit, we learned that he had been to the hospital and his foot had been amputated.  Later, we returned to find that he was missing his lower leg.  When I finally left the area his upper leg had been removed.  &lt;br /&gt;&lt;br /&gt;It disheartened me that the blessings did not halt the disease but his wife continued to ask us even after her daughter rolled her eyes and said, &lt;i&gt;"no better than the witch doctors,"&lt;/i&gt; and she said the same of the medical doctors.  The grave is inevitable I guess.&lt;br /&gt;&lt;br /&gt;I spoke to him this last time with sadness and hiding tears and he spoke with a resignation that infuriated me.  I thought of my father's funeral not long before and my sister recited his favorite poem, &lt;i&gt;"Do not go gentle into that good night."&lt;/i&gt;  She cried through it and we only understood: &lt;i&gt;"Rage, rage against the dying of the light."&lt;/i&gt;  He had wanted to urge his own father at the end, but my grandfather died suddenly too with no chance to fight or say goodbye.&lt;br /&gt;&lt;br /&gt;I tried to translate the poem for the old man but I could not capture its beauty or the dual sense of its title so I said nevermind and gave up the way we all do.  Young men with all the world in their eyes don't understand why anyone would give up or waste this life for the next but old men with their lives behind them, their bodies failing and sometimes eroded by shame, regret and disappointment do understand.&lt;br /&gt;&lt;br /&gt;Months later, I came back to the area to visit and he had died some time before.  The wife was living with her daughter and took comfort in her faith.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(*name changed)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;b&gt;Gangrena&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Comíamos con un hombre mayor y su esposa muchas tardes en Amalucan.  Su esposa me había enseñado a lavarse bien la ropa con una tabla de lavar, la que me ahorró de muchas horas y me sentí agradecido.  Un día nos mostró su dedo del pie.  &lt;i&gt;"¿Qué te parece?"&lt;/i&gt; nos preguntó.  Era gangrenosa.  Yo tenía veinte años y era tonto, pero yo lo sabía.  Cada vez que llegamos nos pidió que le diera una bendición con la imposición de manos para la curación.  Tuvimos el sacerdocio, la autoridad para actuar en nombre de Dios.  Las veces que llegé con Fuentes*, él insistió en la oración y siempre prometió una restauración completa de su pie.  Le dí un codazo mientras hablaba ya que era imposible y que no debe prometirle eso.  &lt;i&gt;"En Dios todo es posible"&lt;/i&gt;, me dijo con molestia después. &lt;br /&gt;&lt;br /&gt;El anciano era diabético.  Pude ver que él perdería no sólo su dedo del pie, pero su pie entero también - con el tejido seco, negro y lleno de pus, que llegó así hasta en su arco.  Nuestro líder de distrito nuevo, noble y fiel y de Carolina del Norte nos acompañó y le dió una bendición y teníamos la esperanza.  Si alguna bendición pudiera curar y detener la progresión de la enfermedad sería la de él, porque él era muy bueno.&lt;br /&gt;&lt;br /&gt;En una visita posterior, nos enteramos de que había estado en el hospital y su pie había sido amputado.  Más tarde, volvimos a encontrar que le faltaba su pierna. Cuando finalmente salí del barrio había sido su muslo eliminado.&lt;br /&gt;&lt;br /&gt;Me decepcioné de que las bendiciones no detuvieron la enfermedad, pero su esposa continuó pedirnos aún después de que su hija puso los ojos y dijo, &lt;i&gt;"ni es mejor que los brujos"&lt;/i&gt;, y ella dijo lo mismo de los médicos.  La tumba es inevitable, supongo.&lt;br /&gt;&lt;br /&gt;Hablé con él esta última vez con tristeza y con lágrimas ocultas y él hablaba con una resignación que me enfureció.  Pensé en el funeral de mi padre antes de no mucho tiempo y mi hermana recitó su poema favorito de él, &lt;i&gt;"No entres dócilmente en esa buena noche."&lt;/i&gt;  Ella lloraba mientras que hablaba y sólo se entendía: &lt;i&gt;"Rabia, rabia contra la agonía de la luz."&lt;/i&gt;  Él hubiera querido exhortar a su propio padre, al final, pero mi abuelo también murió muy pronto sin oportunidad de pelear o decir adiós.&lt;br /&gt;&lt;br /&gt;Traté de traducir el poema al español para el hombre viejo, pero yo no podía captar su belleza o el doble sentido de su título en inglés así que le dije no importa y me dí por vencido en la forma en que todos lo hacemos.  Los jóvenes con el mundo en sus ojos no entienden por qué alguien querría renunciar o perder esta vida para la próxima pero los viejos con su vida detrás de ellos, y a veces erosionados por la vergüenza, el remordimiento y la decepción, lo entienden.&lt;br /&gt;&lt;br /&gt;Meses después, volví al barrio para visitar y descubrí que el anciano había muerto algún tiempo antes.  La esposa vivía con su hija y tuvo consuelo en su fe.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(*nombre cambiado)&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6809410378435822192?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6809410378435822192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6809410378435822192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6809410378435822192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6809410378435822192'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/11/gangrene.html' title='Gangrene'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-5873157338712053754</id><published>2008-11-03T08:57:00.009-05:00</published><updated>2011-03-17T08:51:10.966-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Stages of An Entertainment Medium</title><content type='html'>&lt;div&gt;Some thoughts about the lifecycle stages that entertainment media seem to have in common.  Let me know your feedback and (please!) counterexamples.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Novelty&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The medium is brand new and typically reliant on new, immature and disruptive technologies.  The cost of content creation is almost nil and, accordingly, poor quality.  Content creation is the domain of individuals rather than companies.  The new medium itself is revolutionary enough to sell what little content exists.  Content is expensive to the consumers and margins for content creators can be large.  Whatever stylistic conventions exist for content here are borrowed from other media (as film borrowed from stage, the novel borrowed from the romance).  (However, because of early technical limitations, video games now look more like movies than they did in their infancy.)  The conventions of the new medium begin to establish themselves and innovation is high, although craft is low.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Specialty&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Content quality increases somewhat and innovation is on the rise.  No mechanisms are in place for quality evaluation besides word-of-mouth.  Technology is still immature and further developments in technology change content.  The cost of content creation is still low and corporations are displacing auteurs as the primary producers/creators of content.  Much more content is sold and price remains high.  Margins are large.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Vanguard&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Highly influential quality content appears.  The underlying technology matures and content form innovation wanes replaced by quality craftsmanship.  Evaluation of content becomes important to consumers because of an explosion of choice.  Critics, a concept of literacy and a vocabulary of criticism appear. The medium becomes mainstream and its influential content becomes a part of pop culture.  References to the new medium become common in older media.  Margins are enormous.  An 'arms race' of craftsmanship appears and as a result, dominant content creators (corporations) competitively establish enormous barriers to entry for new participants.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Maturation &amp;amp; Refinement&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Vast quantities of content flood the market.  Content drops tremendously in price.  Evaluation is absolutely crucial to weed out all but the best.  Poor quality content is effectively ignored by consumers.  The time it takes to consume the content is more valuable to the consumer than the price paid for the content.  Margins decline as the cost of content creation spirals upward.  Because of enormous cost and risk, innovation is confined to craft and polish.  The medium is no longer 'new' and is vulnerable to disruptive technologies.&lt;br /&gt;&lt;br /&gt;Eventually, there is a vast landscape of low-to-zero cost content.  Only the best is ever consumed.  Cost of creation is enormous and margins are slim.  Related services, merchandising, advertising, product placement, endorsement employed to increase profits.  Core innovation is low, craft is very high.  The technology is mature and is vulnerable to disruptive technologies.  More and more is spent against diminishing (though differentiating) improvements in quality.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Convergence&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The medium becomes a component of a more expressive and newer medium, while continuing to exist on its own.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Recorded audio becomes a part of movies&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Radio (audio) - a component of television&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Movies and recorded audio - a component of video games&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-5873157338712053754?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/5873157338712053754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=5873157338712053754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5873157338712053754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5873157338712053754'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/11/stages-of-entertainment-medium.html' title='Stages of An Entertainment Medium'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-171811558589242875</id><published>2008-09-13T11:16:00.003-04:00</published><updated>2011-03-17T08:51:10.967-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>The Consultant's Law</title><content type='html'>I spent about half of my career working for Kansas City's Metro Information Services, then Keane (when they acquired MIS) as a consultant.  As a consultant, I eventually learned a crucial truth which applies to consultants and employees alike.  It's just that employees have the luxury of forgetting this from time to time.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Consultant's Law&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;As directly as possible, &lt;em&gt;ensure that your efforts make money for your clients.&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;That's the secret to really long contracts and an high level of control over your career.  There's a well known evil doppelganger of this law that I'll call &lt;em&gt;The Law of Job Security&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Law of Job Security&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As directly as possible, &lt;em&gt;ensure that your absence will cost your clients money&lt;/em&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A lot of people seem to live by this law.  It's subtly different from &lt;em&gt;The Consultant's Law&lt;/em&gt;, but &lt;em&gt;The Law of Job Security&lt;/em&gt; breeds resentment and comes across as unprofessional and opportunistic.  It's also dangerous, because as irrational as it is in some cases, people tend to punish those who take advantage of them - even when it costs them and their company.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-171811558589242875?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/171811558589242875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=171811558589242875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/171811558589242875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/171811558589242875'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/09/consultants-law.html' title='The Consultant&apos;s Law'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1398620649440835802</id><published>2008-09-08T16:33:00.017-04:00</published><updated>2008-09-09T09:36:13.174-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poker Hand Evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='EA'/><title type='text'>Poker Revisited + ESPN</title><content type='html'>I hadn't given much thought to poker hand evaluators lately when I received a comment today on the post &lt;a href="http://www.senzee5.com/2007/01/7.html"&gt;7&lt;/a&gt; pointing me to &lt;a href="http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup"&gt;this absolutely fantastic roundup of open hand evaluators&lt;/a&gt; at &lt;a href="http://www.codingthewheel.com/"&gt;Coding the Wheel&lt;/a&gt;.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;James Devlin&lt;/strong&gt; clearly put an enormous amount of work into this analysis of currently available evaluators. As part of that work, he finished up my &lt;a href="http://www.senzee5.com/2007/01/7.html"&gt;7 card evaluator&lt;/a&gt; I posted here a year-and-a-half ago! He &lt;a href="http://www.codingthewheel.com/file.axd?file=XPokerEval.zip"&gt;offers it as a library&lt;/a&gt; with a number of other evaluators including &lt;a href="http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup#2p2"&gt;the &lt;em&gt;phenomenal&lt;/em&gt; 2+2 evaluator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And of course, I also really &lt;a href="http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup#senzee_eval7"&gt;appreciate James' comments&lt;/a&gt; :) -&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Paul Senzee is well known, in poker-programming circles, for his &lt;/em&gt;&lt;em&gt;perfect hash optimization&lt;/em&gt;&lt;em&gt; to the &lt;/em&gt;&lt;em&gt;original Cactus Kev evaluator&lt;/em&gt;&lt;em&gt; and for being an all-around programming &lt;/em&gt;&lt;a href="http://www.urbandictionary.com/define.php?term=BAMF"&gt;&lt;em&gt;BAMF&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Honestly, after that great post and the 2+2 evaluator, I'm not sure if there's any more I could possibly add to the problem of poker hand evaluation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Although In Other Projects..&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Something I've done a little work on recently - &lt;a href="http://www.nytimes.com/2008/09/05/business/media/05espn.html?_r=3&amp;amp;adxnnl=1&amp;amp;oref=slogin&amp;amp;ref=business&amp;amp;adxnnlx=1220641255-w7Tn0RclJ8Q8lZvW8jETXg"&gt;At ESPN, Play-by-Play Goes Virtual&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1398620649440835802?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1398620649440835802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1398620649440835802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1398620649440835802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1398620649440835802'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/09/poker-revisited-espn.html' title='Poker Revisited + ESPN'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7076501521574893346</id><published>2008-08-05T10:51:00.007-04:00</published><updated>2008-09-13T11:47:29.000-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Machine Vision'/><title type='text'>OpenCV + Self-Organizing Maps</title><content type='html'>A little on self-organizing maps and the machine vision library OpenCV..&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Self-Organizing Maps&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Excellent tutorials on Self-Organizing Map theory -&lt;br /&gt;&lt;a href="http://blog.peltarion.com/2007/04/10/the-self-organized-gene-part-1/"&gt;The Self-Organized Gene (Part 1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.peltarion.com/2007/06/13/the-self-organized-gene-part-2/"&gt;The Self-Organized Gene (Part 2)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OpenCV&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/OpenCV"&gt;Intel's Open Computer Vision Library&lt;/a&gt;&lt;br /&gt;Recently took a vacation and spent some time in &lt;a href="http://en.wikipedia.org/wiki/Image:Key_west_2001.JPG"&gt;Key West&lt;/a&gt;, which was awesome. When we got home I did a little yard work and played around with OpenCV, trivially writing a program to automatically rotate photos by detecting faces and their orientation. Now I'm &lt;em&gt;hooked&lt;/em&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7076501521574893346?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7076501521574893346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7076501521574893346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7076501521574893346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7076501521574893346'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/08/opencv-self-organizing-maps.html' title='OpenCV + Self-Organizing Maps'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3104588054302962965</id><published>2008-08-05T09:13:00.006-04:00</published><updated>2008-09-13T11:48:19.575-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>If NetFlix Rents Games?</title><content type='html'>I &lt;em&gt;really&lt;/em&gt; love NetFlix. So much that I've considered ditching many of the DVDs I own. And since starting NetFlix, I have bought &lt;em&gt;very few&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netflix.com"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245531533212217986" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_2ro8CljYdEQ/SMvfIy85coI/AAAAAAAAACA/RvYZtQB71LE/s320/nf.gif" border="0" /&gt;&lt;/a&gt;NetFlix renting games has been rumored since its inception. Other services, such as &lt;a href="http://www.gamefly.com/"&gt;GameFly&lt;/a&gt; have stepped in to try to become the NetFlix of games. &lt;span class="fullpost"&gt;But while NetFlix is mainstream, I suspect that GameFly's subscriber base is far from it - and it is an &lt;em&gt;additional &lt;/em&gt;charge and an &lt;em&gt;additional&lt;/em&gt; service if you already have NetFlix. Unlike movie makers, game makers don't have an equivalent to a 'box office' take. So if NetFlix were to ever decide to rent games, while initially great for the consumer, I believe it would &lt;em&gt;profoundly&lt;/em&gt; impact game developer's revenue. Which would, in the end, be bad for the consumer given the skyrocketing cost of game development.&lt;br /&gt;&lt;br /&gt;So how do we, as game developers, develop a NetFlix-proof business model? Is it all MMOG's from here on out?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3104588054302962965?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3104588054302962965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3104588054302962965' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3104588054302962965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3104588054302962965'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/08/if-netflix-rents-games.html' title='If NetFlix Rents Games?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2ro8CljYdEQ/SMvfIy85coI/AAAAAAAAACA/RvYZtQB71LE/s72-c/nf.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1309287710213047204</id><published>2008-07-30T13:20:00.013-04:00</published><updated>2010-02-26T13:35:47.830-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Pair #1</title><content type='html'>&lt;div&gt;Finally, I'm putting up what I have for &lt;em&gt;Pair&lt;/em&gt;, my script language intended for homebrew game projects. &lt;em&gt;Pair &lt;/em&gt;is designed to be a small, embedded, acceptably fast (probably not yet the case) script language that will ultimately allow multiple concurrent VM (and not OS-based) threadlets, generators and continuations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://news.nationalgeographic.com/news/2006/03/images/060317_two_headed_big.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/060317_two_headed_bw.jpg" border="0" /&gt;&lt;/a&gt;I don't have a lot of time on my hands, so stuff like this takes quite a &lt;em&gt;long &lt;/em&gt;while. &lt;span class="fullpost"&gt;Now, there's some messed up stuff going on here. You'll have to forgive me that or wait until it's refined more. For example, scoping isn't right at all. The (let ..) expression isn't how it's supposed to be in a lisp-type language. It defines a variable for the rest of the outer scope which isn't right. I'll fix that. Continuations aren't currently supported, but the underlying machinery is mostly there as well as the mechanism for running multiple lightweight VM threads although this is not accessible from the command line program. Which is probably good, since I'm not sure how well that works with the garbage collector at this point. Also, there's a lot of just general messiness going on. There are a bunch of warnings at compile time and comments are sparse. These things will be fixed eventually. I've compiled these with Visual C++ .NET 2003. There are two parts here.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version 0.01.00&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/paircompiler_v00100.zip"&gt;The Pair Compiler&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/pairvm_v00100.zip"&gt;The Pair VM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See the &lt;a href="http://senzee.blogspot.com/2008/07/code-use-policy.html"&gt;Code Use Policy&lt;/a&gt; if you are interested in using any of this for your own purposes.&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1309287710213047204?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1309287710213047204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1309287710213047204' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1309287710213047204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1309287710213047204'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/pair-1.html' title='Pair #1'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3275652837043711818</id><published>2008-07-30T13:16:00.008-04:00</published><updated>2010-02-26T13:32:14.009-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Code Use Policy</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Codex_Florentino"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/300px-Codex_florentino_51_9_bw.jpg" border="0" /&gt;&lt;/a&gt;If you use code from this blog for non-commercial use please credit &lt;em&gt;Paul D. Senzee&lt;/em&gt; and include a link to &lt;a href="http://senzee5.com/"&gt;senzee5.com&lt;/a&gt;. If you make changes, please send them back. If you'd like to use code from this blog for commercial purposes, contact me so that we can work something out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3275652837043711818?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3275652837043711818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3275652837043711818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3275652837043711818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3275652837043711818'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/code-use-policy.html' title='Code Use Policy'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3243861432631212773</id><published>2008-07-18T00:37:00.009-04:00</published><updated>2010-02-26T13:31:38.007-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Edge of Ability</title><content type='html'>Some of the most successful projects are at the bleeding edge of their implementor's ability.  Absolutely as simple as possible out of &lt;em&gt;sheer terror&lt;/em&gt; of complexity.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;The sequel to this phenomenon is the universal &lt;a href="http://en.wikipedia.org/wiki/Second_system_effect"&gt;second system effect&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Intellectual discovery can be a powerful motivator in design decisions.  Take care when tasking a developer with a mundane or boring task.  People have a way of making uninteresting problems interesting!&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/saturnv.jpg" border="0" /&gt;&lt;br /&gt;I have more to say about this, including a crazy idea about the &lt;a href="http://en.wikipedia.org/wiki/SR-71_Blackbird"&gt;SR71 Blackbird&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;Lisp&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Apollo_program"&gt;Apollo Missions&lt;/a&gt; all somehow appearing before their time &lt;em&gt;(like from the future ;) )&lt;/em&gt;..&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3243861432631212773?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3243861432631212773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3243861432631212773' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3243861432631212773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3243861432631212773'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/edge-of-ability.html' title='Edge of Ability'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8196421677837070725</id><published>2008-07-16T02:25:00.023-04:00</published><updated>2010-02-26T13:30:32.656-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Infinite Flexibility</title><content type='html'>&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; BORDER: 0px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/inf_complexity.png" border="0" /&gt;&lt;span class="fullpost"&gt; &lt;a href="http://www.slipperybrick.com/wp-content/uploads/2007/10/imaginative-lego-clever-advertisement.jpg"&gt;&lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; WIDTH: 190px; CURSOR: hand; TEXT-ALIGN: left" alt="" src="http://www.slipperybrick.com/wp-content/uploads/2007/10/imaginative-lego-clever-advertisement.jpg" border="0" /&gt; &lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; WIDTH: 190px; CURSOR: hand; TEXT-ALIGN: left" alt="" src="http://www.slipperybrick.com/wp-content/uploads/2007/10/imaginative-lego-clever-advertisement.jpg" border="0" /&gt;&lt;/a&gt; Think about that and weep.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8196421677837070725?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8196421677837070725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8196421677837070725' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8196421677837070725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8196421677837070725'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/infinite-flexibility.html' title='Infinite Flexibility'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1303300988350173105</id><published>2008-07-09T00:39:00.087-04:00</published><updated>2010-02-26T13:29:31.670-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='EA'/><category scheme='http://www.blogger.com/atom/ns#' term='Pranks'/><category scheme='http://www.blogger.com/atom/ns#' term='Invention'/><title type='text'>The Ghost Box</title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;The Art of Pranking Part II&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The bigger, badder wireless pranking device that evolved from &lt;a href="http://senzee.blogspot.com/2008/07/what-is-that-noise.html"&gt;Part I&lt;/a&gt; of our pranking bonanza.  This is a somewhat technical post.  A following post will detail our exploits with it.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_9sm.jpg" border="0" /&gt; &lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_23sm.jpg" border="0" /&gt;&lt;br /&gt;&lt;em&gt;The completed device&lt;/em&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Learning from the Past&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There were a few issues with the first model.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.psenzee.com/images/prank1_2.jpg"&gt;&lt;strong&gt;The photocell was clearly visible on the front of the adapter&lt;/strong&gt;&lt;/a&gt; and that made it look suspicious.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;High maintenance.&lt;/strong&gt; The contraption didn't work well when it was dark outside.  In the interest of simplicity, it was designed to sound when it got &lt;em&gt;too&lt;/em&gt; dark.  That is, in the normal case, when a shadow fell across it.  How dark was &lt;em&gt;too&lt;/em&gt; dark was adjustible with a screwdriver.  Of course, that meant that Ryan had to turn it off each night or if it rained out.  This also made it high maintenance, because it didn't turn off automatically - it would keep sounding as long as &lt;em&gt;the target&lt;/em&gt; was casting a shadow over the photocell.  This drove Ryan crazy, since he had to listen to it and turn it on and off all the time.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;It was not wireless.&lt;/strong&gt;  Fazeel was eventually able to follow the cord back to the noise box when he figured it out.  Then the jig was up.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;It only emitted one single type of noise.&lt;/strong&gt;  Although deliciously annoying, it didn't offer as much flexibility as we'd like.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Solutions&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;The photocell should be better concealed.&lt;/strong&gt;  Bought a Nortel adapter at &lt;a href="http://www.skycraftsurplus.com/"&gt;Skycraft Surplus&lt;/a&gt; for $5 apiece.  Using a cordless saw, opened it up, removed the internals.  Cut the transformer from the prongs that go into the wall socket, leaving enough plastic around them to keep them solid, and taped the terminals up to insulate them thoroughly from each other and the rest of the electronics I was stuffing in the box. Took one of the detectors from the toy (see below), pulled out the electronics and put them in.&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_20sm.jpg" border="0" /&gt;&lt;br /&gt;Cut off the antenna and hooked up the adapter's cord as the new antenna.  Added a battery holder and two AAA batteries.  Drilled out a hole for the sensor, slipped it through.  Still pretty conspicuous.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_17sm.jpg" border="0" /&gt; &lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_11sm.jpg" border="0" /&gt;&lt;/div&gt;&lt;br /&gt;To obscure the photocell, cut clear contact paper into a rounded-rectangle shape consistent with the types of stickers you might find on these things. Then, colored over the contact paper with black dry erase marker.&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_9sm.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Because this adapter now has batteries (the adapter from the previous prank didn't since it was powered from the box it was attached to), I had to install some sort of switch to keep the batteries alive.  Otherwise, I'd have to tear that thing back open all the time to replace them. I really didn't have a way to solidly mount a tiny switch, so I slipped a tiny &lt;a href="http://en.wikipedia.org/wiki/Reed_switch"&gt;reed (magnetic) switch&lt;/a&gt; in the seam. It's powered on by sticking a really tiny rare-earth magnet on the switch.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;The device should roughly detect motion, specifically a rapid change in light intensity as opposed to merely detecting dark.&lt;/strong&gt;  This was nailed with the solution to the wireless problem described next.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Wireless would be ideal.&lt;/strong&gt; This appeared to be beyond my skills and/or experience in electronics, but I found a toy at Toys 'R' Us that, appropriately modified, was wireless and sensed motion. It's called a SpyGear Wireless Tracker.  This also had some issues when used in this way.  For example, when triggered, it had a blinking red light (LED) that continued to blink until manually reset.  That made my job with the glue circuitry a lot more complex.&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/spygear1sm.jpg" border="0" /&gt; &lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; HEIGHT: 140px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/voicerec1.jpg" border="0" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Plays back a recorded message.&lt;/strong&gt; This appeared to be the easiest to accomplish.  Radio Shack, in fact, sells a voice recording/playback module for about $10 (above).  This device was almost perfect.  The difficult thing about it was that it had a &lt;a href="http://en.wikipedia.org/wiki/Membrane_switch"&gt;rubber plunger switch&lt;/a&gt; to playback with no leads or any apparent way to hook into and trigger it from other circuitry.  So I had to take the switch apart, drill tiny holes in the PCB for the wires and solder them directly onto the traces underneath.  Not ideal.  Sound quality is not great, but then I didn't really expect that much.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Finishing Up&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank2_1sm2.jpg" border="0" /&gt;&lt;br /&gt;&lt;em&gt;The receiver mess (with voice record/playback unit) in nearly completed form.&lt;/em&gt;&lt;/div&gt;&lt;br /&gt;Getting the glue circuitry working correctly was a pain, in the end I went for an inefficient but dead simple approach that made all the pieces work together.  Maybe in the future I'll refine it.  Anyhow, for now, I'm pretty happy with it.&lt;br /&gt;&lt;br /&gt;More to come on the fun we've had.. !&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1303300988350173105?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1303300988350173105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1303300988350173105' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1303300988350173105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1303300988350173105'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/ghost-box.html' title='The Ghost Box'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6593106042139014680</id><published>2008-07-08T13:59:00.017-04:00</published><updated>2010-02-26T13:26:16.646-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='EA'/><category scheme='http://www.blogger.com/atom/ns#' term='Pranks'/><category scheme='http://www.blogger.com/atom/ns#' term='Invention'/><title type='text'>What the @#$*! is that Noise?</title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;The Art of Pranking at EA&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=m43GW9alZKs"&gt;Video. Fine moments in pranking at EA Tiburon. You'll see narration by my former manager, Rob Hyder, who pulled off perhaps the finest prank ever here - The Disappearing Door.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Our prank may not be as cool as some of those, but we're still refining it. The target? Fazeel Gareeboo, my manager.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;1. Misdirection&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Fazeel was out for two weeks, so he was likely expecting some sort of prank. So we had to do something obvious. There's a certain report that Fazeel hates, so of course we papered his cube with it.&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank1_1sm.jpg" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;2. The Idea&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The &lt;em&gt;real&lt;/em&gt; idea was to set up an annoying noise that went off whenever &lt;em&gt;the target&lt;/em&gt; scooted his chair in to work. Fortunately, Fazeel sits next to the window. So I made a detector that set off a sound whenever a shadow is cast on it. Camouflaged the detector by hollowing out an electrical adapter and used the wire from the adapter to connect with the control circuitry and the buzzer.&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank1_2sm.jpg" border="0" /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank1_5sm.jpg" border="0" /&gt;&lt;br /&gt;Then we taped the buzzer box (yes, made from a Wal-Mart soapdish) to the back of Ryan Burkett's monitor. The box sported a switch so that Ryan could flip it on and off at will.&lt;br /&gt;&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/prank1_4sm.jpg" border="0" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:200%;"&gt;We got three solid days of torture out of that baby! Yeah! &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So, of course, I built a bigger, badder, wireless version with voice playback that I'll post about later.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6593106042139014680?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://senzee.blogspot.com/2008/07/what-is-that-noise.html' title='What the @#$*! is that Noise?'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6593106042139014680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6593106042139014680' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6593106042139014680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6593106042139014680'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/what-is-that-noise.html' title='What the @#$*! is that Noise?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2291084511352909504</id><published>2008-07-07T23:59:00.002-04:00</published><updated>2011-06-17T01:14:02.825-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Quetzalcoatl's Return</title><content type='html'>As the sun set in the orange haze west of the Aztec pyramid, a bright evening star appeared overhead. The farmers - the &lt;em&gt;campesinos&lt;/em&gt; - ran for their families and gathered them together in the fields. In an hour, the star tripled in brilliance and an enormous crowd gathered from the farms to the Zócalo. News helicopters began to circle the radiant point above them. This is the event that a score of cultures now struggle to understand.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.academyofsorcery.com/images/magician.gif"&gt;&lt;img alt="" border="0" src="http://www.academyofsorcery.com/images/magician.gif" style="cursor: hand; float: left; margin: 0px 10px 10px 0px; width: 200px;" /&gt;&lt;/a&gt;Last night was the arrival. The &lt;em&gt;campesinos&lt;/em&gt; whispered &lt;em&gt;"It's &lt;a href="http://en.wikipedia.org/wiki/Quetzalcoatl"&gt;Quetzalcoatl&lt;/a&gt;, returning home!"&lt;/em&gt;. Even now, no one really knows what - or who - arrived. The &lt;em&gt;descención&lt;/em&gt; plays all over the news this morning, and last night on live television. In the city of Cholula somewhere in central Mexico &lt;em&gt;a radiant golden-robed figure descended to earth from the heavens &lt;/em&gt;over a period of about three hours into Cortes' Cathedral of New Spain atop the city's great half-buried pyramid and then disappeared.&lt;br /&gt;&lt;br /&gt;Each detail was captured by camera crews from Puebla and Mexico City. The figure was of human form, fair-skinned and wore a hooded robe and a blonde beard. Every gesture was recorded by local film crews' standard-definition cameras and has been looping continuously on television for the last twelve hours. In the US, news stations digitized and cleaned the original analog broadcasts and consequently produced gigabytes of data describing this event adapted for HD. It's the essence of our age - we know &lt;em&gt;exactly&lt;/em&gt; what happened, but not what it means.&lt;br /&gt;&lt;br /&gt;CNN is running through scores of experts and religious leaders to answer these questions. Representatives from at least a dozen world religions (including all of the Abrahamic faiths) weigh in on the meaning of the event. Most dismiss it as an elaborate hoax.  Yet for each worldview, there are those that assign it profound meaning. Here in the Southern US, that meaning is most often imminent &lt;a href="http://en.wikipedia.org/wiki/Alien_invasion"&gt;alien invasion&lt;/a&gt; followed closely by some sort of precursor to the &lt;a href="http://en.wikipedia.org/wiki/Rapture"&gt;rapture&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;"Is this a hoax? Is this an extra-terrestrial?"&lt;/em&gt;&lt;br /&gt;The consensus: &lt;strong&gt;A hoax? &lt;em&gt;Absolutely&lt;/em&gt;.&lt;/strong&gt; An alien? &lt;em&gt;Definitely not! Appearing human?!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Why now?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nga.gov/feature/watson/ascension.gif"&gt;&lt;img alt="" border="0" src="http://www.nga.gov/feature/watson/ascension.gif" style="cursor: hand; float: left; margin: 0px 10px 10px 0px; width: 200px;" /&gt;&lt;/a&gt;A startled televangelist blurts, &lt;em&gt;"God no, what if it's Him..?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Is this sort of thing possible with state-of-the-art technology?"&lt;/em&gt;, the anchor asks a panel of well-known technologists and receives mixed replies. Asking whether or not this is an act of &lt;em&gt;(or is)&lt;/em&gt; a threatening god, one technologist answers, &lt;em&gt;"I don't think we'd ever call him God or even&lt;/em&gt; &lt;strong&gt;a&lt;/strong&gt;&lt;em&gt; god. If he could kill us all, or some of us, we'd do what he says, but we'd call him a terrorist, not a god. After all, we ourselves are capable of killing off the human race..."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;On the television, images of churches filled to standing-room-only cycle. In one such shot an Alabama preacher and community leader responds to the technologist's earlier comments, &lt;em&gt;"Down there somewhere in old Mexico, He has come. We build flying machines, we go to space, we make thinking machines the size of my little toenail and I've even had highly educated medical doctors tell me that we can raise the dead.  Are we saying that, &lt;/em&gt;&lt;strong&gt;'No, He can't come again, He didn't in fact, because He is incapable of miracles astounding enough to make us believe He has returned?'&lt;/strong&gt;&lt;em&gt;"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Over one thousand individuals and groups across the world claim ownership for the stunt. Of them, Niels Rasmussen, a Danish engineer and little-known illusionist maintains a website detailing &lt;a href="http://www.senzee5.com/2008/07/illusion-tilbagelevering-af.html"&gt;the technical description of how it was performed&lt;/a&gt;.  He writes, &lt;em&gt;"Success! An insane amount of traffic here. My advertisers will be happy! ;)"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;* * *&lt;/div&gt;&lt;br /&gt;Now, long after the rest of the world has forgotten, as the sun sets each evening in the haze west of the pyramid, the &lt;em&gt;campesinos&lt;/em&gt; till their fields and wait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2291084511352909504?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2291084511352909504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2291084511352909504' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2291084511352909504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2291084511352909504'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/quetzalcoatls-return.html' title='Quetzalcoatl&apos;s Return'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2390574679266152817</id><published>2008-07-07T23:33:00.030-04:00</published><updated>2011-06-17T00:26:29.452-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Illusion: Tilbagelevering af Quetzalcoatl</title><content type='html'>&lt;strong&gt;Illusion: Tilbagelevering af Quetzalcoatl&lt;/strong&gt;&lt;br /&gt;Niels Rasmussen, Tryllekunstner&lt;br /&gt;Hillerød, Danmark&lt;br /&gt;1 maj 2005&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This page is in Danish. Would you like to translate it?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Illusion: The Return of &lt;a href="http://en.wikipedia.org/wiki/Quetzalcoatl"&gt;Quetzalcoatl&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Niels Rasmussen, Magician&lt;br /&gt;Hillerød, Denmark&lt;br /&gt;May 1, 2005&lt;br /&gt;&lt;br /&gt;An illusion to convince the world of the return of Quetzalcoatl, the Aztec god.  To be performed in Cholula, Puebla, Mexico or possibly Teotihuacán, near Mexico City.&lt;br /&gt;&lt;br /&gt;Designed to be captured prior to the transition to HD with standard-definition NTSC cameras and televised to further obscure any visible wires or machinery, enhancing the illusion.  It may be a couple of years before we are prepared to execute.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Levitation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Executed like &lt;a href="http://en.wikipedia.org/wiki/David_Copperfield%27s_flying_illusion"&gt;David Copperfield's flying illusion&lt;/a&gt;, but suspended from two 'news' (Puebla) helicopters. Helicopters' motion will appear a little erratic, as if flown by inexperienced pilots, but their motion is carefully choreographed and they are flown by computer, allowing the pilots to jump in if anything goes wrong. Actor is suspended from many fine wires from each of the two helicopters. The computer controlled winches always 1.) compensate for the erratic motion of the helicopter and 2.) keep the wires in tension, in correct orientation, properly aligned and ensure that the actor is always steady and descending at the proper rate. A third news helicopter flies directly over the actor to show that no wires suspend him from above.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Radiance and Lighting&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;High-intensity ground-based lighting, computer-tracked from the top of the cathedral, and areas around the zocalo. Consists of reasonably high power red, green, blue lasers scanning over the actor's translucent diffuser robe.  Should produce brilliant whitish light.&lt;br /&gt;&lt;br /&gt;This plumed serpent won't have feathers or scales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2390574679266152817?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2390574679266152817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2390574679266152817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2390574679266152817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2390574679266152817'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/07/illusion-tilbagelevering-af.html' title='Illusion: Tilbagelevering af Quetzalcoatl'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8911303238549318799</id><published>2008-06-16T09:48:00.007-04:00</published><updated>2011-03-17T08:51:42.311-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>June 2008 - What's Up?</title><content type='html'>Haven't blogged for a while.  We've finished a bunch of games and we're now in our &lt;em&gt;off-cycle&lt;/em&gt; here at EA Tiburon.  In May or so finished up writing a &lt;a href="http://www.reviewnet.net/meetexperts.cfm"&gt;C++ test for ReviewNet&lt;/a&gt;, which is more time-consuming than it seems.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Created a new blog for stories and entries that don't really belong here.  It's called &lt;a href="http://senzee-stories.blogspot.com/"&gt;Illustrated Man&lt;/a&gt; and can be found at &lt;a href="http://senzee-stories.blogspot.com/"&gt;http://senzee-stories.blogspot.com/&lt;/a&gt;.  Moved &lt;a href="http://senzee-stories.blogspot.com/2008/05/la-casa-del-los-ancianos.html"&gt;La Casa de los Ancianos&lt;/a&gt;, &lt;a href="http://senzee-stories.blogspot.com/2008/05/future-headlines.html"&gt;Future Headlines&lt;/a&gt; and &lt;a href="http://senzee-stories.blogspot.com/2008/05/language-vector.html"&gt;Language Vector&lt;/a&gt; over there.  If you can't find them here anymore, now you know why.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://senzee.blogspot.com/2008/07/what-is-that-noise.html"&gt;Did a little pranking at work&lt;/a&gt;, as is the custom when a coworker leaves his desk unattended while away on a vacation.  &lt;a href="http://senzee.blogspot.com/2008/07/what-is-that-noise.html"&gt;Report on that coming shortly&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other stuff going on too.  Can't really go into much detail about it at the moment.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8911303238549318799?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8911303238549318799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8911303238549318799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8911303238549318799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8911303238549318799'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/06/june-2008-whats-up.html' title='June 2008 - What&apos;s Up?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-4040001072115454160</id><published>2008-04-11T15:32:00.003-04:00</published><updated>2008-09-09T09:44:18.750-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Which Languages Handle Packages and Libraries Best?</title><content type='html'>In the post &lt;a href="http://senzee.blogspot.com/2007/12/why-do-we-use-c.html"&gt;Why Do We Use C++, &lt;/a&gt;I made the following statement.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Another, often forgotten strength of C++ and of many traditional modular and modular-turned-OO languages is linking, or more generally, we might say 'package management'. C++ innately offers build-time linking and runtime 'linking' is also usually available (i.e., DLLs). This allows graceful scaling. Tool support for this in C++ is strong and reasonably robust because C++ is so frequently used to build enormous projects. It's possible to build massive projects in pieces in ways that are awkward or impossible in many functional or logic languages.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Simon wrote,&lt;br /&gt;&lt;br /&gt;&lt;em&gt;C++ good at linking and package management??? That's the most ridiculous thing I've heard all week. This is one of the weakest aspects of C++.  &lt;/em&gt;&lt;em&gt;Where to start:&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* no standard ABI for compiled code. ("Don't mix compilers")&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* no standard for managing namespaces and packages like in Java.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* Very hard to evolve a class and keep binary compatibility. Lots of obscure compiler depend rules need to be followed to do this. ("Change a .h file, rebuild everything that uses it")&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* dynamically loading code modules has to be done manually. Java, Python and other languages load classes on demand.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* C++ code can call C code, but any other kind of mixed language development is a nightmare.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;* easy to break features like dynamic_cast when loading share libraries. (My fun debugging adventure this last week...)&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;I think Simon makes some excellent points here.  So I'd like to ask the community.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What is the best language (and what are the best language features) for linking/loading and package and library management?&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-4040001072115454160?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/4040001072115454160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=4040001072115454160' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4040001072115454160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4040001072115454160'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/04/which-languages-handle-packages-and.html' title='Which Languages Handle Packages and Libraries Best?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8095642000445223719</id><published>2008-04-10T20:46:00.023-04:00</published><updated>2008-09-09T09:36:54.573-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Social Networks Could Still Change The World</title><content type='html'>Social networks are underwhelming. Join one and add your friends. Perhaps they are friends you haven't seen in years. You'll get excited, exchange a message or two and then forget about it. &lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;One social networking site is better than many.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I have &lt;em&gt;circles of friends&lt;/em&gt; in MySpace (a circle of 0), Facebook, LinkedIn, Classmates.com and Reunion.com. The categorization is artificial. I'm friends with people I know who also happen to be members of the respective site. Take Classmates.com for example. My main group is anyone who attended my school the years I did. Thinking honestly back to high school, there are people I liked, people I don't remember and a dozen levels of nuance in between.&lt;br /&gt;&lt;br /&gt;Classmates.com and Reunion.com are dead. They are made utterly redundant by Facebook. LinkedIn is a better alternative to exchanging business cards but could easily be swallowed up by a site with a more flexible, natural and/or automatic way of specifying &lt;em&gt;circles of friends &lt;/em&gt;and/or privacy policies. MySpace, on the other hand, just sucks.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Until social networks get wise to the psychology of social interaction, they won't be really useful.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I feel uncomfortable mixing my different circles of friends at parties without making sure that they can make some sort of connection. Categorizing relationships is something that we do effortlessly and unconsciously. Determining what to share with who, when and where is a complex bit of emotional processing that either comes naturally or not at all. For a social network to be really useful, it's going to have figure this out without us having to explicitly &lt;em&gt;group&lt;/em&gt; all our friends. After all, these groups - especially the heavily political circles (I cringe for the oceans of middle and high school students on these sites) - are transient with shifting boundaries. You may say that asking a machine to understand this is asking too much, but I disagree. Given enough information - for example the phone logs in your mobile phone - and the behaviors of everyone else who has ever used a social networking site, existing and proven statistical algorithms such as Amazon's book recommendation could automate the largest part of this (Note that &lt;em&gt;statistical algorithm&lt;/em&gt; these days is a politically correct euphemism for AI).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I don't want a site. I want a social widget that I can drop into and enrich any technology I want.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The idea of going to an &lt;strong&gt;actual website&lt;/strong&gt; to share anything with friends &lt;strong&gt;is absurd&lt;/strong&gt;. What's more absurd is having to go to five of them. I need a social network &lt;em&gt;component&lt;/em&gt; that I can drop into Madden, my phone, my emailer, my IM application, my videogames, my browser, my newsreader, my MMOGs, my iPod, my television, my casual games.&lt;br /&gt;&lt;br /&gt;Would this be web component like the Google search bar at the top of every site? Under the hood, maybe I'd expect a sort of service or protocol like LDAP (social://facebook.com?paul_senzee) or a central social network database with intelligence. Of course, this implies that..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Whether one or multiple social networking companies prevail, there must be a standard data interchange format for social network information.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Companies that maintain databases of files of this format will learn a lot about who we are and..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;We are known by the company we keep.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The individual as a social being implies that certain types of personal information are best and unavoidably contained in a social network. Then why not keep all of it there? Experience has shown that people are willing to forgo certain privacies for much greater benefit and it's easier to hold one company accountable for privacy violations than many. In this way, social networks could allow advertisers and vendors to present me with exactly what I want without having to give my information to 1,000,001 different parties or revealing my identity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I want a web I'm interested in, and that my friends are interested in. Social networks can be great active filters.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In 1995, the idea of posting a website and speaking to an eagerly listening world was exhilarating. Now it's noise. I want things I'm interested in to come find me, because there's no way I can sort through the enormous mess of the internet efficiently. The social network knows the interests I share with each friend.&lt;br /&gt;&lt;br /&gt;I'll find a story or site that interests me and tag it with a button &lt;em&gt;in the browser&lt;/em&gt;. That percolates to my friends with similiar interests, not to the world at large, and not to my friends that are uninterested in the topic. If I'm playing a 360 game and I get stuck at a spot it would be cool if the game would show me how my friend passed that spot.&lt;br /&gt;&lt;br /&gt;We have one global web. How about a billion &lt;em&gt;personal webs&lt;/em&gt; filled with information actually relevant and interesting to oneself and one's social circles. A much, much more useful internet. Of course, I'll always want to be able to opt back into anonymity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;We need to publish information with the sensitive parts [deleted]. We want to publish a highly targeted message.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Imagine that we could share information with subtle variation based on the group of people that we're sharing it. If advertisers can do this to us all day long, why can't we all?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;A new blog post..&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;After [show for="EA Employees" alt="our new game"]&lt;show alt="our new game" for="EA Employees"&gt;The Beautiful Princess Tea Party[/show]&lt;/show&gt; comes out[show for="EA Employees"]&lt;show for="EA Employees"&gt; on 09/27/2011[/show]&lt;/show&gt;, I'm going to take a long vacation in the Keys[show for="Senzee Family"]&lt;show for="Senzee Family"&gt; at the Gardens Hotel[/show]&lt;/show&gt;.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;For EA Employees it says,&lt;br /&gt;&lt;br /&gt;&lt;em&gt;After The Beautiful Princess Tea Party comes out on 09/27/2011, I'm going to take a long vacation in the Keys. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;For my family it says,&lt;br /&gt;&lt;br /&gt;&lt;em&gt;After our new game comes out, I'm going to take a long vacation in the Keys at the Gardens Hotel.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;See, &lt;em&gt;The Beautiful Princess Tea Party&lt;/em&gt; is going to be a big surprise for my girls. Finally, for everyone else it says,&lt;br /&gt;&lt;br /&gt;&lt;em&gt;After our new game comes out, I'm going to take a long vacation in the Keys.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In this case, blogger.com would query the social network to process this page before it's served up. As you can see, to be really, really effective the social network must be an organized, standardized service at the internet's foundation, instead of a handful of ad-hoc websites thrown up to cash in on the Web 2.0 rush.&lt;br /&gt;&lt;br /&gt;That's the web I see coming.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8095642000445223719?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8095642000445223719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8095642000445223719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8095642000445223719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8095642000445223719'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/04/social-networks-could-still-change.html' title='Social Networks Could Still Change The World'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7251397576021393044</id><published>2008-04-03T22:38:00.004-04:00</published><updated>2010-02-26T13:24:30.143-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Philadelphia 1961</title><content type='html'>&lt;a href="http://www.allposters.com/-sp/Philadelphia-1961-Posters_i1813783_.htm"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/philly1961.jpg" border="0" /&gt;&lt;/a&gt; (&lt;em&gt;Philadelphia 1961&lt;/em&gt;, &lt;a href="http://en.wikipedia.org/wiki/Lee_Friedlander"&gt;Lee Friedlander&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I saw this at the &lt;a href="http://en.wikipedia.org/wiki/SFMOMA"&gt;San Francisco Museum of Modern Art&lt;/a&gt;, and it struck a chord. This, ladies and gentleman, &lt;em&gt;was the future&lt;/em&gt;.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7251397576021393044?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7251397576021393044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7251397576021393044' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7251397576021393044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7251397576021393044'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/04/philadelphia-1961.html' title='Philadelphia 1961'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7683206272728511893</id><published>2008-03-19T12:58:00.018-04:00</published><updated>2008-09-09T09:57:16.101-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Future Headlines</title><content type='html'>&lt;i&gt;Student Discovers O(log log N) Prime Factorization Algorithm | MIT Student Found Dead | Intel Delivers 128 Core Processor | Protein Folding Fully Modeled | Human Brain Functionally Described | Half of World's Population Found on the Net | Wireless Cortical Device | Computational Model of White Blood Cell Complete | Games Jack In | Immortal! Gene Therapy Makes Wealthy, Healthy Immortal | Computational Model of Human Body Complete | New US Childbirth Policy Follows EU&lt;/i&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;em&gt;Just so you know, the below stories are fictional..&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Student Discovers O(log log N) Prime Factorization Algorithm&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;COMPUTER SCIENCE NEWS (March 19, 2009) - Brad Halloway, an MIT graduate student, claims to have discovered a prime factorization algorithm that has a guaranteed complexity of O(log log N) where N is the number to be factored (or O(log N) where N is the number of digits in the number to be factored). Researchers are eager to see the algorithm, which Halloway will present in person in November. A number of researchers have provided him with several million-digit numbers, all of which are products of two very large prime numbers. Halloway claims that he was able to factor each of the numbers in about one week. The researchers verified that the factorizations were correct. "If this is true, there will be earth-shattering consequences for computer security .. &lt;a href="http://en.wikipedia.org/wiki/Integer_factorization"&gt;(more)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;MIT Student Found Dead&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;NBC (March 22, 2009) - An MIT student, Brad Halloway, was found dead in his apartment today, victim of an apparent robbery. The perpetrators carried off a computer and a video game console. This is the latest in a recent string of so-called "Video-Game Burglaries" around the campus. "This is the first where someone has died - he must have surprised the perpetrator," said Capt. .. &lt;a href="http://en.wikipedia.org/wiki/Integer_factorization#Practical_applications"&gt;(more)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Intel Delivers 128 Core Processor&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PRESS RELEASE (November 6, 2013) - Today Intel Corporation ships the first of its 3.2GHz 128-core processors manufactured with a new 16 nanometer process pioneered .. &lt;a href="http://www.news.com/Intel-shows-off-80-core-processor/2100-1006_3-6158181.html"&gt;(more)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Protein Folding Fully Modeled&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;SLASHDOT (December 6, 2014) - Thanks in part to the &lt;a href="http://en.wikipedia.org/wiki/Folding_at_home"&gt;Folding&lt;/a&gt; @ &lt;a href="http://en.wikipedia.org/wiki/Folding_at_home"&gt;Home&lt;/a&gt; project, researchers announced today that the long-outstanding problem of modeling the way proteins fold has been solved. .. &lt;a href="http://en.wikipedia.org/wiki/Protein_folding"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Human Brain Functionally Described&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SLASHDOT (April 19, 2015) -Scientists today unveiled a functional model of a human brain running on one of the world's most powerful supercomputers .. &lt;a href="http://en.wikipedia.org/wiki/Computational_neuroscience"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Half of World's Population Found on the Net&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;CNN (January 1, 2016) - It is now possible to find more than fifty-percent of the world's population on the internet. .. &lt;a href="http://en.wikipedia.org/wiki/Internet#Social_impact"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Wireless Cortical Device Demonstrated&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;MSN (August 12, 2017) - The Cortico device announced this week provides a &lt;em&gt;complete-sensory brain interface&lt;/em&gt; to its recipient. Cortical Labs also introduced the surgical equipment necessary to implant the interface. Cortical states that the equipment is self-sufficient and requires no human surgeon to oversee the procedure. .. &lt;a href="http://en.wikipedia.org/wiki/Brain_machine_interface"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Computational Model of White Blood Cell Complete&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;JOURNAL OF COMPUTATIONAL BIOLOGY (July 12, 2019) - ".. this is a monumental day for computational pharmacology .." &lt;a href="http://en.wikipedia.org/wiki/Computational_biology"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Games Jack In&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;TIME (June 23, 2020) - A new generation of games are set to hook directly into several leading cortical interfaces for an experience that's "far more reality than virtual," .. &lt;a href="http://www.blogger.com/post-create.g?blogID=28016235#"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Immortal! Gene Therapy Makes Wealthy, Healthy Immortal &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;USA TODAY (May 23, 2026) Front Page - It is a move that critics compare to the rich trampling the poor in a rush to leave the Titanic. Yesterday, the FDA approved gene therapy for rendering those (very few) who can afford it - and are in good health - biologically immortal. The subject of intense controversy since deemed technically possible only seven years ago, it has only now .. &lt;a href="http://en.wikipedia.org/wiki/Life_extension"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Computational Model of Human Body Complete&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;JOURNAL OF COMPUTATIONAL BIOLOGY (October 3, 2029) - ".. we've obtained the Holy Grail of computational pharmacology .." &lt;a href="http://en.wikipedia.org/wiki/Computational_biology"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;New US Childbirth Policy Follows EU&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;USA TODAY (February 8, 2040) - Following in the footsteps of the EU, the United States today introduced a childbirth policy that requires government permission to bear a child .. &lt;a href="http://www.blogger.com/post-create.g?blogID=28016235#"&gt;(more)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;.. and this list is subject to change without notice. ;)&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7683206272728511893?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7683206272728511893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7683206272728511893' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7683206272728511893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7683206272728511893'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/future-headlines.html' title='Future Headlines'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7856599464676051268</id><published>2008-03-10T21:46:00.006-04:00</published><updated>2008-09-09T09:45:25.399-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Technology Is Disappearing</title><content type='html'>When I was a kid I knew what the future would be. It had the clinical austerity of &lt;a href="http://en.wikipedia.org/wiki/2001:_A_Space_Odyssey_%28film%29"&gt;2001: A Space Odyssey&lt;/a&gt;, the cold silver cities of &lt;a href="http://en.wikipedia.org/wiki/Logan%27s_Run"&gt;Logan's Run&lt;/a&gt; and the dark, bleak dirtiness of &lt;a href="http://en.wikipedia.org/wiki/Blade_runner"&gt;Blade Runner&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Alien_%28film%29"&gt;Alien&lt;/a&gt;. That future was inevitable. More optimistically the colorful, gaudy, in-your-face future of &lt;a href="http://en.wikipedia.org/wiki/Back_to_the_Future_II"&gt;Back to the Future II&lt;/a&gt; came along with a number of films of the late 80's. Everything in the future was going to be complex. Every surface would have a thousand buttons.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;The 90's began a different trend in science-fiction. In one episode of &lt;a href="http://en.wikipedia.org/wiki/Star_trek:_TNG"&gt;Star Trek: The Next Generation&lt;/a&gt;, Picard returned to a modest country home in France that could have come from the 1950's - or the 1850's. &lt;a href="http://en.wikipedia.org/wiki/Gattaca"&gt;Gattaca&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Minority_Report_%28film%29"&gt;Minority Report&lt;/a&gt; contrasted simply and starkly adorned futures with warm, familiar early 20th century fashion and interior decor.&lt;br /&gt;&lt;br /&gt;The later examples are a truer glimpse of the future. Nobody wants to live in a world that's metallic, austere, cold, dirty or gaudy. Developers of technology in &lt;em&gt;our&lt;/em&gt; world strive for naturalness, unobtrusiveness and basic elegance in design. The less visible, the better.&lt;br /&gt;&lt;br /&gt;Consider the ubiquitous &lt;em&gt;computer&lt;/em&gt;. It's so pervasive that even talking about 'computers' seems anachronistic. In the 80's people would say about an IT professional, &lt;em&gt;"he works with computers."&lt;/em&gt; Now they say, &lt;em&gt;"he's a game developer,"&lt;/em&gt; &lt;em&gt;"he's a graphics programmer,"&lt;/em&gt; &lt;em&gt;"he's a web designer,"&lt;/em&gt; or &lt;em&gt;"he works in information technology."&lt;/em&gt; And everyone knows what those things mean. Back in the 60's and 70's, computers were novelties, understood by few. A computer was a sure sign of the future. Today, we spend lives sitting in front of them. We know them for what they are - tools of immense and perpetually untapped power that also happen to be phenomenal pains in the ass. What is the future we hope for now? It's a future where we can reap the benefits of machines and be free of the frustrations they cause us. So a computer doesn't look like the future anymore, it looks like the frustrating present. And, if you draw too much attention to it, it starts to look like the past.&lt;br /&gt;&lt;br /&gt;What does this mean? Technology &lt;em&gt;must&lt;/em&gt; disappear. No, it will not go away, but it will become invisible. Take the beautiful &lt;a href="http://en.wikipedia.org/wiki/Iphone"&gt;iPhone&lt;/a&gt;. All those complicated little buttons you find on a smart phone? They just went away. It could only be better if it wasn't there at all, while still doing all the &lt;a href="http://en.wikipedia.org/wiki/Iphone"&gt;iPhone&lt;/a&gt; allows. Research proceeds rapidly in &lt;a href="http://en.wikipedia.org/wiki/Flexible_electronics"&gt;flexible electronics&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Stretchable_electronics"&gt;stretchable electronics&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Wearable_computers"&gt;wearable computers&lt;/a&gt;, transparent electronics, &lt;a href="http://en.wikipedia.org/wiki/Nanotechnology"&gt;nanotechnology&lt;/a&gt; and most significantly, &lt;a href="http://en.wikipedia.org/wiki/Brain-machine_interface"&gt;brain-machine interface&lt;/a&gt;, so this may come sooner than we think.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7856599464676051268?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7856599464676051268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7856599464676051268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7856599464676051268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7856599464676051268'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/technology-is-disappearing.html' title='Technology Is Disappearing'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-508114993577535279</id><published>2008-03-05T19:22:00.018-05:00</published><updated>2010-02-26T13:12:06.265-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>PlayStation 3 Cell Came Before Its Time</title><content type='html'>&lt;a href="http://www.psenzee.com/images/cell.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/cell.jpg" border="0" /&gt;&lt;/a&gt; &lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://biz.yahoo.com/ibd/080304/tech.html?.v=1"&gt;The Microsoft Xbox 360 platform is now profitable&lt;/a&gt; and Sony's PlayStation 3 is gaining parity with the Xbox 360 in the marketplace. We're about halfway through this console cycle (these cycles typically last about five years) and we can reflect on technology choices with the benefit of some hindsight. The ramifications of some of the more obvious choices, for example PS3's &lt;a href="http://en.wikipedia.org/wiki/Blu-ray"&gt;Blu-Ray&lt;/a&gt; vs. 360's plain-old-DVD, are well known. Microsoft's background as a operating system and compiler developer provides the 360 with perhaps the best development tools ever to grace a non-desktop system. We'll look at that in another entry. We'll also want to compare the &lt;a href="http://en.wikipedia.org/wiki/Xenos"&gt;Xbox 360 GPU&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/RSX_%27Reality_Synthesizer%27"&gt;PlayStation 3 GPU&lt;/a&gt;.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;For now, however, I'd like to look at the Cell. In doing so, I'd like to ask and try to answer the question, &lt;em&gt;"Why has the quality of PlayStation 3 titles lagged behind that of the Xbox 360 titles?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Cell_processor"&gt;The Cell Processor is Amazing&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;From the info I gathered, the PS3's Cell should have a peak numerical performance of about 205 &lt;a href="http://en.wikipedia.org/wiki/Flops"&gt;gigaflops&lt;/a&gt;. From Wikipedia, I gather that the 360, on the other hand, has peak performance of 116 &lt;a href="http://en.wikipedia.org/wiki/Flops"&gt;gigaflops&lt;/a&gt;. The PS3's Cell has one regular &lt;a href="http://en.wikipedia.org/wiki/PowerPC"&gt;PowerPC&lt;/a&gt; core (with two hardware threads) called the PPU. It also has &lt;em&gt;seven&lt;/em&gt; SPUs (one is reserved for the OS), which are streamlined vector processors that are fast as hell, although functionally limited compared to the main PowerPC core. They have their own memory at 256K apiece. Half of that is available to the developer. The &lt;a href="http://en.wikipedia.org/wiki/Xenon_%28processor%29"&gt;360's Xenon processor&lt;/a&gt;, on the other hand, consists of &lt;a href="http://arstechnica.com/articles/paedia/cpu/xbox360-2.ars"&gt;three conventional PowerPC cores&lt;/a&gt; almost identical to the Cell's PowerPC core, for a total of six hardware threads. So, if you're like most people, you're probably thinking, &lt;em&gt;"Wow, the PS3 blows the 360 away!"&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Except that it doesn't.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Developing Games is Hard&lt;/strong&gt;&lt;/p&gt;I just read this at .mischief.mayhem.soap about the size of the &lt;a href="http://msinilo.pl/blog/?p=55"&gt;Assassin's Creed&lt;/a&gt; team. Actually, I think that's about the same for Madden NFL. Modern games require an enormous amount of content, some of which must be reflected in code. Games on multicore consoles are much more difficult to debug. Making games is simply &lt;em&gt;much&lt;/em&gt; more expensive that it used to be. I heard a colleague remark that he saw that one PlayStation 1 version of Madden had 30 files. Now, it's thousands of files, millions of lines and scores of developers.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://arstechnica.com/news.ars/post/20060225-6265.html"&gt;Developing for the Cell is Hard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When we first saw the specs for the Cell, I thought, &lt;em&gt;"it looks like it was designed to play movies."&lt;/em&gt; And in playing movies, the PS3 &lt;em&gt;will&lt;/em&gt; blow the 360 away. The Cell was designed for performing the same kind of vector calculation on large numbers of small chunks of data. Essentially like a GPU, but more flexible although less parallel. There's a lot of this sort of thing in games. Some physics, audio decoding/encoding, movie decoding/encoding, some graphics/geometry processing. Still, there are a &lt;strong&gt;lot&lt;/strong&gt; of things that aren't well suited for this model. Among those would be language interpretation (we do a lot), gameplay code, sparse data manipulation, and a lot of really mundane and common software engineering things that are inherently sequential. Sorting a list of pointers that must be dereferenced to be compared, for example.&lt;/p&gt;&lt;p&gt;Explanations of why the 360 performs so well compared to the PS3 usually start out like, &lt;em&gt;"Well, the Cell looks better on paper, but.." &lt;/em&gt;Developing for a 360 is like developing for a multicore PC. Take your existing code, multithread it and know that it'll work on the 360 and upcoming PC-like multicore machines with little changes.&lt;/p&gt;&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; build PS3 software exactly the same way using only the PPU and its two threads, but that will yield almost exactly one-third of the power of the 360's processor. In fact some early titles that were developed first for the 360 did just this. This was not as bad as it sounds though. A lot of early code for these machines was not thoroughly multithreaded because much of that code was directly ported from older Xbox and PS2 code. In these cases, it used just a portion of the 360's power anyway.&lt;/p&gt;&lt;p&gt;Now we're pushing the capabilities of the 360 and trying hard to get the PS3's six fast but special-purpose SPUs to do what we can do with the four remaining general-purpose hardware threads on the 360. It's hard, though certainly possible to achieve parity. Still, it requires a lot more code and expertise &lt;em&gt;just&lt;/em&gt; for the PS3 (usually from our best developers), which typically means much less overall developer productivity.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Cell Looks Like the Future&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, as delightful as it is to develop for, the approach taken with the 360's Xenon processor simply can't scale. At some point, with some number of traditional cores, memory access and synchronization are going to break down or become so contentious that any benefit of a larger number of cores will be nil. So the Cell looks like the future. A small number of traditional cores with a large number of stream processors can yield phenomenal performance in the right proportions. &lt;strong&gt;I predict that some member(s) of the next console generation will have a processor with 8 traditional cores and perhaps 256+ stream processors.&lt;/strong&gt; 256 sound ridiculous? Consider that an &lt;a href="http://ati.amd.com/products/Radeonhd2900/index.html"&gt;ATI HD 2900 XT GPU&lt;/a&gt; has &lt;em&gt;320&lt;/em&gt; stream processors.&lt;/p&gt;&lt;p&gt;Why do I think the Cell was premature? It did not fulfill the possibilities of traditional multicore processor before moving on to a hard-to-develop-for, though &lt;em&gt;potentially&lt;/em&gt; more powerful, architecture.&lt;/p&gt;&lt;p&gt;In any event, it's clearly a foreshadow of processor architecture to come. Still, the difficulty of achieving parity between the Cell and 360 Xenon when game development is already at its most taxing really isn't doing the PlayStation 3 any favors. &lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-508114993577535279?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/508114993577535279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=508114993577535279' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/508114993577535279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/508114993577535279'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/playstation-3-cell-comes-before-its.html' title='PlayStation 3 Cell Came Before Its Time'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3361000251772720408</id><published>2008-03-04T22:47:00.007-05:00</published><updated>2010-02-26T13:11:04.377-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Simple Templater in C++</title><content type='html'>Like I mentioned before, I'm posting some of my personal code library that I've accumulated over the years. If you modify or improve this, send the changes back please.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Recursive template engine with escaping and lazy evaluation. Note that it is case SENSITIVE.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Use&lt;/strong&gt;&lt;br /&gt;1. Add items to Templater's map.&lt;br /&gt;&lt;em&gt;templater.map()["bob"] = "joe";&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;2. Evaluate a text item that references a map item.&lt;br /&gt;&lt;em&gt;s = templater.eval("well, hello [!bob]");&lt;/em&gt;&lt;br /&gt;Returns "well, hello joe" in s;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/templater.h"&gt;templater.h&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/evaluator.h"&gt;evaluator.h&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/evaluator.cpp"&gt;evaluator.cpp&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3361000251772720408?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3361000251772720408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3361000251772720408' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3361000251772720408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3361000251772720408'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/simple-templater-in-c.html' title='Simple Templater in C++'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1860682929306891759</id><published>2008-03-04T21:32:00.008-05:00</published><updated>2010-02-26T12:17:42.358-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='GDC 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='City Generation'/><title type='text'>Introversion's City Generation</title><content type='html'>&lt;div&gt;At GDC I came across &lt;a href="http://introversion.co.uk/blog/index.php"&gt;Chris Delay from Introversion Software&lt;/a&gt;.  I recognized him from the picture next to his blog. I've been admiring the work that he's has been doing with city generation and I was happily surprised to meet him in the line for one of the sessions. Not thinking, I extended my hand. I hope &lt;a href="http://senzee.blogspot.com/2008/03/down-and-out-on-market-street.html"&gt;I didn't get him sick&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I asked him a ton of questions about it, 'cause I'm &lt;a href="http://senzee.blogspot.com/2007/11/impossible-dream-4.html"&gt;working on similar ideas&lt;/a&gt;. Anyhow, please check out the &lt;a href="http://introversion.co.uk/blog/index.php"&gt;city generation stuff&lt;/a&gt; he's doing. He's working from Muller and Wonka's shape-grammar/L-system generation ideas and producing some awesome work.&lt;br /&gt;&lt;br /&gt;Check out this beauty - &lt;/div&gt;&lt;div&gt;&lt;br /&gt; &lt;/div&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/chris_delay_introversion_city_gen.jpg" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1860682929306891759?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://introversion.co.uk/blog/index.php' title='Introversion&apos;s City Generation'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1860682929306891759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1860682929306891759' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1860682929306891759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1860682929306891759'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/introversions-city-generation.html' title='Introversion&apos;s City Generation'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8212244435742872085</id><published>2008-03-04T20:22:00.015-05:00</published><updated>2010-02-26T12:15:22.392-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='GDC 2008'/><title type='text'>Emotiv Systems</title><content type='html'>&lt;a href="http://www.psenzee.com/images/emotiv.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/emotiv.jpg" border="0" /&gt;&lt;/a&gt; &lt;span class="fullpost"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;While at the Game Developers' Conference, I checked out &lt;a href="http://www.emotiv.com/"&gt;Emotiv Systems&lt;/a&gt; and their &lt;a href="http://en.wikipedia.org/wiki/EEG"&gt;EEG&lt;/a&gt;-based input ('mind-reading') technology in the form of the $300 EPOC to be released later this year. I spoke to the Emotiv guys at their booth, they seemed a bit secretive about their technology. They described it as telepathy. The EEG input device concept is interesting to me, but seems a little gimmicky. In fairness, though, I didn't try it. Like a resurrected computer-enhanced &lt;a href="http://en.wikipedia.org/wiki/Biofeedback"&gt;biofeedback machine&lt;/a&gt;? Not sure how well it would work in real life. The devices don't use conductive gel like real EEGs use. The input device also tracks eye and facial muscular movement, so it's more than just an EEG, but an &lt;a href="http://en.wikipedia.org/wiki/Electromyography"&gt;EMG&lt;/a&gt; as well. Also, EEGs require the user to be still. That's a tall order for a videogame player. Anyhow, assuming that sophisticated signal processing could overcome the lack of conductive gel and motion, it seems that the response time in changing gross brain state (for example, to punch a bad guy) would be glacial and using it would be exhausting. What is really interesting to me, though, is how they're doing their signal processing. My initial guess is &lt;a href="http://en.wikipedia.org/wiki/Principle_components_analysis"&gt;principle components analysis with a prototype database&lt;/a&gt;. I wonder if I'm way off base there. &lt;/div&gt;&lt;div&gt;&lt;a href="http://news.bbc.co.uk/1/hi/technology/7254078.stm"&gt;An article about Emotiv's brain gear.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8212244435742872085?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.emotiv.com/' title='Emotiv Systems'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8212244435742872085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8212244435742872085' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8212244435742872085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8212244435742872085'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/emotiv-systems.html' title='Emotiv Systems'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3266372019492813591</id><published>2008-03-04T19:46:00.014-05:00</published><updated>2010-02-26T12:11:57.344-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='GDC 2008'/><title type='text'>Down and Out on Market Street</title><content type='html'>&lt;a href="http://www.psenzee.com/images/market_street.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/market_street.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;As I alluded to in the &lt;a href="http://senzee.blogspot.com/2008/02/fable-2-news-gdc08-preview.html"&gt;Fable 2 post&lt;/a&gt;, EA sent me to the Game Developers' Conference (GDC) this year in San Francisco. &lt;span class="fullpost"&gt;Unfortunately, I saw far less of it than I would have liked because I was down with the flu. I think I spent more time in bed and at the Walgreens at Market Street &amp;amp; 4th than I did at the conference. That may be an exaggeration, but it was still disappointing. I also ended up getting Colin Campbell (a colleague of mine) all sick, which just sucked doubly.&lt;br /&gt;&lt;br /&gt;Networking. No. It's hard to schmooze when you're coughing every 12.2 seconds and trying to keep your nose from dripping on your new friend. So I didn't meet a lot of the people I'd hoped to. Who I did meet, I tried to keep my distance and avoid shaking hands so as not to pass on the scourge. Still, it wasn't a total loss. It was the first time I'd been and it was fascinating. The keynotes were great, including a compelling &lt;a href="http://en.wikipedia.org/wiki/Raymond_Kurzweil"&gt;Ray Kurzweil&lt;/a&gt;. I didn't feel well enough to focus enough on the technical sessions to get much out of them. Still, there were a lot of ideas in the air. I also attended several game design and art sessions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Need Input&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://en.wikipedia.org/wiki/Wiimote"&gt;WiiMote&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Guitar_Hero_%28series%29"&gt;Guitar Hero&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Rock_Band_%28video_game%29"&gt;Rock Band&lt;/a&gt; must have spawned a lot of thought about input devices in the industry. Depth cameras and a bunch of other technologies were on display. We had &lt;a href="http://www.neurosky.biz/"&gt;NeuroSky&lt;/a&gt; and &lt;a href="http://senzee.blogspot.com/2008/03/emotiv-systems.html"&gt;Emotiv Systems &lt;/a&gt;with their bio-sensor technologies &lt;a href="http://senzee.blogspot.com/2008/03/emotiv-systems.html"&gt;(see the following post on Emotiv Systems)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Physics Engines, UI and Procedural Texture Technologies&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A lot of middleware vendors especially surrounding Physics and UI. For physics, we had the Octave Engine and others. For UI - &lt;a href="http://www.scaleform.com/"&gt;Scaleform&lt;/a&gt;, &lt;a href="http://www.anark.com/"&gt;Anark&lt;/a&gt;, &lt;a href="http://www.omegame.com/"&gt;MenusMaster&lt;/a&gt;. Scaleform seems to be quite popular and is a Flash-based UI system. I was taken by &lt;a href="http://www.allegorithmic.com/"&gt;Allegorithmic's procedural texture technologies&lt;/a&gt;. Oh, and &lt;a href="http://www.anandtech.com/weblog/showpost.aspx?i=388"&gt;motion capture&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Bioshock"&gt;&lt;strong&gt;BioShock&lt;/strong&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Everyone was talking about BioShock. I've not yet started playing it, although I do own it. I'm still playing &lt;a href="http://en.wikipedia.org/wiki/Assassin%27s_creed"&gt;Assassin's Creed&lt;/a&gt; right now which is phenomenal in its own right. I'm excited to get at it. I attended a session with &lt;a href="http://en.wikipedia.org/wiki/Ken_Levine"&gt;Ken Levine&lt;/a&gt;, BioShock's designer.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;More&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pcworld.com/video/id,722-page,1-bid,0/video.html"&gt;PC World Video, Recap&lt;/a&gt;&lt;br /&gt;&lt;a href="http://seekingalpha.com/article/66738-game-developers-conference-2008-review?source=yahoo"&gt;GDC08 Review&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I already wrote about &lt;a href="http://senzee.blogspot.com/2008/02/fable-2-news-gdc08-preview.html"&gt;Fable 2&lt;/a&gt;, though I'll probably amend that (and this) entry as I get more time and reflect a bit more about it.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3266372019492813591?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3266372019492813591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3266372019492813591' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3266372019492813591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3266372019492813591'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/03/down-and-out-on-market-street.html' title='Down and Out on Market Street'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3429974888710320912</id><published>2008-02-28T20:00:00.007-05:00</published><updated>2010-02-26T12:10:47.625-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Java-Style Properties Files in C++</title><content type='html'>Need to handle Java-style properties files in C++? I've decided to post some of my own personal library of code on this blog. This is one of those occasionally useful things.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/propertyutil.h"&gt;propertyutil.h&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/propertyutil.cpp"&gt;propertyutil.cpp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you fix any bugs, extend the code or anything else, send back your changes if you don't mind. ;)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3429974888710320912?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3429974888710320912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3429974888710320912' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3429974888710320912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3429974888710320912'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/02/java-style-properties-files-in-c.html' title='Java-Style Properties Files in C++'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6313709787100116224</id><published>2008-02-25T08:51:00.015-05:00</published><updated>2010-02-26T12:08:58.052-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fable'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><category scheme='http://www.blogger.com/atom/ns#' term='GDC 2008'/><title type='text'>Fable 2 News (GDC08 Preview)</title><content type='html'>&lt;div&gt;In &lt;a href="http://senzee.blogspot.com/2008/03/down-and-out-on-market-street.html"&gt;San Francisco last week (more on that later), &lt;/a&gt;I heard &lt;a href="http://en.wikipedia.org/wiki/Peter_Molyneux"&gt;Peter Molyneux&lt;/a&gt; talk about &lt;a href="http://en.wikipedia.org/wiki/Fable_2"&gt;Fable 2&lt;/a&gt;. See, I love the first &lt;a href="http://en.wikipedia.org/wiki/Fable_%28video_game%29"&gt;Fable&lt;/a&gt;, and I'm really excited about this new arrival.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;He announced four new features which are on &lt;a href="http://en.wikipedia.org/wiki/Fable_2"&gt;Wikipedia&lt;/a&gt; already, so for many of the details you'll want to head there. As a part of the demo, Peter demonstrated his onscreen counterpart, &lt;em&gt;The Molynator&lt;/em&gt; who, like a solid 10% of the audience, was female. Fable 1 had just one possible (male) protagonist. He announced that &lt;em&gt;The Molynator&lt;/em&gt; married (after meeting at a &lt;em&gt;courting spot&lt;/em&gt;, or something like that) five years ago. They'd found a home in the &lt;em&gt;slums of Bowerstone&lt;/em&gt; early on, then moved to a country residence a few years later. The young couple had a young child in that time. Yes, Molyneux said, she experienced all the joys of virtual pregnancy, including the growing belly.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;a href="http://www.psenzee.com/images/pregnancy.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/pregnancy.jpg" border="0" /&gt;&lt;/a&gt;Pregnancy&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;He said he didn't know if the big belly would actually make it in the game. Something about a nine-month pregnant woman slicing open a dragon or troll with a broadsword strikes me a little inauthentic. Especially if you've ever seen (or been) a nine-month pregnant woman trying to get out of a chair. Also, might it be bad form to have a pregnant woman defeated in battle?&lt;br /&gt;&lt;br /&gt;Imagine you choose to have a family in Fable 2. Molyneux strongly hinted that your family will become a part of the narrative. He glossed over this one really fast, though. Your children, your spouse kidnapped, murdered? Avenged? Who knows?&lt;br /&gt;&lt;br /&gt;Co-op play inspired by LEGO Star Wars, but much more dynamic. Rebekka and I can play Fable 2 together! So now we won't have to worry about &lt;em&gt;her&lt;/em&gt; getting that big belly again. ;) Well, until we finish it. He didn't say anything about the length. Hope it's longer than Fable 1.&lt;br /&gt;&lt;br /&gt;There's no overhead map. Instead, there's an innovative breadcrumb trail showing you where you've been most.&lt;br /&gt;&lt;br /&gt;Check this out. No money for completing quests? Arghh. You either have to gamble or be hired as a henchman to make money. That just doesn't make any sense to me. I have to get a job to make money? That's way too much like the Sims. Which means way too much like real life. I'm not much of a gambler either. The weird thing is I already have a job. It's the one that I'll use to pay for Fable 2. And I like it more than gambling &lt;strong&gt;or&lt;/strong&gt; being a henchman.&lt;br /&gt;&lt;br /&gt;One of the gambling games, Keystone - a roulette like casino game - will be coming onto Xbox Live prior to the release of Fable 2 so that you can make your money before you need to spend it.&lt;br /&gt;&lt;br /&gt;I'm excited to play it. I can wait though. I've still got &lt;em&gt;Assassin's Creed&lt;/em&gt; and &lt;em&gt;BioShock&lt;/em&gt; to work through (not necessarily in that order), so &lt;em&gt;The Molynator's&lt;/em&gt; got plenty of time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.anandtech.com/showdoc.aspx?i=3238&amp;amp;p=3"&gt;More info on the presentation.&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6313709787100116224?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6313709787100116224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6313709787100116224' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6313709787100116224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6313709787100116224'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/02/fable-2-news-gdc08-preview.html' title='Fable 2 News (GDC08 Preview)'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-133383672566964890</id><published>2008-02-11T17:34:00.001-05:00</published><updated>2008-09-09T09:51:38.393-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>They Say Games Are No Good For Kids...</title><content type='html'>&lt;a href="http://www.timesonline.co.uk/tol/comment/columnists/janice_turner/article3211999.ece"&gt;This article (Xbox is Crack for Kids)&lt;/a&gt; is kind of funny in a way.  This offhand opinion met with hundreds of angry replies.  Honestly, I don't think that the game-playing community needs to be so defensive.  Games, or more broadly, &lt;strong&gt;interactive-&lt;em&gt;everything,&lt;/em&gt;&lt;/strong&gt; is the future. &lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;That article represents the solitary voice screaming at the tsunami to keep its distance.  We humans want to be entertained.  We go to great lengths to build entertainment technology and we've always adapted non-entertainment technology to serve the purposes of entertainment.&lt;br /&gt;&lt;br /&gt;In any event, I've long held that good-quality games are excellent teaching tools.  My eight year-old son is a strong reader.  He's always loved games and has (coincidentally) been drawn to games that require heavy reading.  Nintendo fans know what I'm talking about.  Because of the games, he was motivated early on to read, and the interactivity of games pushed him further in that direction.  Now, paradoxically, he loves reading novels (but still plays games!). &lt;br /&gt;&lt;br /&gt;Here's another example.  My children love &lt;a href="http://en.wikipedia.org/wiki/Tim_Schafer"&gt;Tim Schafer's &lt;/a&gt;phenomenal &lt;a href="http://en.wikipedia.org/wiki/Psychonauts"&gt;Psychonauts&lt;/a&gt;.  About a week ago, while getting the kids to sleep, I found my six year-old daughter sitting on her bed deep in thought.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"What are you thinking about?"&lt;/em&gt; I asked.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Daddy, why did Napoleon lose at Waterloo?"&lt;/em&gt; She asked.&lt;br /&gt;&lt;br /&gt;I laughed, &lt;em&gt;"I don't really know, but we can look it up.."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I don't think her first-grade textbooks could have provoked that question.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-133383672566964890?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/133383672566964890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=133383672566964890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/133383672566964890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/133383672566964890'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2008/02/they-say-games-are-no-good-for-kids.html' title='They Say Games Are No Good For Kids...'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2611937235872125978</id><published>2007-12-30T12:32:00.001-05:00</published><updated>2008-09-09T09:59:00.071-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>Xbox 360, PS3 Games Unplayable on Future Hardware?</title><content type='html'>Earlier I posted about &lt;a href="http://senzee.blogspot.com/2007/12/concurrency-in-game-development.html"&gt;concurrency&lt;/a&gt; being a crucial issue in today's and tomorrow's games.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Recently, my son has been playing the original Xbox game &lt;a href="http://en.wikipedia.org/wiki/Thrillville"&gt;Thrillville&lt;/a&gt;. The game is solid on our original Xbox, but crashes with disturbing frequency on the Xbox 360, particularly during loading. This leads me to suspect that the timing differences between the original Xbox and its emulation on the 360 exposed threading issues that were present but simply did not occur because of the timing characteristics of the original console. Console game developers generally test exclusively for the single configuration per target platform. &lt;em&gt;The only way we find threading issues, it seems, is through testing. So if testing fails to reveal real issues, games are shipped with them. &lt;/em&gt;This is mitigated, of course, by developing games for multiple multithreaded platforms (ie, Xbox 360 and PlayStation 3) with the same code base.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Emulating Concurrent Code&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This is one kink in a larger problem. The problem is developing a body of 'literature,' whether games or other software, that will be usable on future machines. Take, for example, the classic game &lt;a href="http://en.wikipedia.org/wiki/Ultima_vii"&gt;Ultima VII&lt;/a&gt;. It is a beautiful and vastly influential role-playing game rendered unplayable by modern machines because of its &lt;a href="http://en.wikipedia.org/wiki/Ultima_vii#Technical_issues"&gt;hardware voodoo&lt;/a&gt;. (We also may occasionally need to use software such as old versions of &lt;a href="http://en.wikipedia.org/wiki/WordPerfect"&gt;WordPerfect&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/VisiCalc"&gt;VisiCalc&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Lotus_1-2-3"&gt;Lotus 1-2-3&lt;/a&gt; - and perhaps from non-PC machines - to read crucial, but old, data stored in those formats.) For such situations we typically resort to &lt;a href="http://en.wikipedia.org/wiki/List_of_computer_system_emulators"&gt;emulators&lt;/a&gt; such as the excellent &lt;a href="http://en.wikipedia.org/wiki/DOSBox"&gt;DOSBox&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/AppleWin"&gt;AppleWin&lt;/a&gt; for maximum compatibility.&lt;br /&gt;&lt;br /&gt;It is very difficult, if not impossible, to maintain timing-level compatibility in emulators. Older games that relied heavily upon machine-specific timing are now pretty much broken in emulators. For that matter, they're generally broken when the next generation of hardware arrives. Multithreaded code that contains hidden bugs (which is pretty much all code, multithreaded or otherwise) is implicitly and heavily timing-dependent. It's one thing to emulate an Xbox game, with typically very low levels of multithreading on an Xbox 360, and may be quite another to emulate Xbox 360 games on an Xbox 720.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;As a result, I suspect that &lt;strong&gt;far more&lt;/strong&gt; Xbox 360 and PlayStation 3 games will be unplayable on future hardware than Xbox and PS2 games on the 360 and PS3.&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2611937235872125978?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2611937235872125978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2611937235872125978' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2611937235872125978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2611937235872125978'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/12/xbox-360-ps3-games-unplayable-on-future.html' title='Xbox 360, PS3 Games Unplayable on Future Hardware?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-4254844429549214657</id><published>2007-12-20T10:04:00.004-05:00</published><updated>2008-09-09T09:59:46.394-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Why Do We Use C++?</title><content type='html'>One of the recurring questions (especially when confronted with concurrency) is 'why do we use C++ for game development?' This entry was extracted from &lt;a href="http://senzee.blogspot.com/2007/12/concurrency-in-game-development.html"&gt;Concurrency in Game Development&lt;/a&gt; since it's really a separate topic all its own and that one was overlong anyway.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Why Do We Use C++?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Now before I hear the platitudes about how &lt;em&gt;[insert favorite non-C++ language here]&lt;/em&gt; is better anyhow and would fix everything in one shot, let me ask you how feasible it would be to develop multi-million line software on multiple, often brand-new, platforms simultaneously with extreme performance expectations, leveraging mega/gigabytes of shared legacy code and without having to port, develop and/or maintain one's own compilers and toolsets with this superior language. If the game development industry turns to non-C++ languages to solve this, it will be slowly and painfully. And, most likely, it will be an industry-wide move and not just one studio or another, although some must lead the way. Honestly, I would never expect C++ to go away completely (just as assembly has never really gone away), and some future approaches may just be layered on top of C++ (&lt;a href="http://en.wikipedia.org/wiki/Bigloo"&gt;Bigloo&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Intel_Ct"&gt;Intel Ct&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/OpenMP"&gt;OpenMP&lt;/a&gt;), or use it when performance is critical (&lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;Java's JNI&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;C++ is flexible and fast. With sufficient (possibly enormous) effort, it can do almost everything any language can do. It can function both as a high-level multiparadigm language and as a low-level portable assembly language. What makes C++ (and C) so widespread is its unrestrictive nature. This is widely seen as a negative, but in the real world, being able to abuse your language to get what you want from your machine is of crucial importance - especially when performance is a primary concern. That said, you may only &lt;em&gt;want&lt;/em&gt; to abuse your language say 2-5% of the time. The rest (95-98%) of the time, you'd like some nice, type-safe, bounds checking, memory-managed, interactive, memoizing language, giving you a &gt;100% increase in productivity. That we have settled on C++ indicates that the 2-5% is so crucial that we're willing to sacrifice the rest for it. In the game industry, I think that's a fair statement.&lt;br /&gt;&lt;br /&gt;&lt;del&gt;Another, often forgotten strength of C++ and of many traditional modular and modular-turned-OO languages is linking, or more generally, we might say 'package management'. C++ innately offers build-time linking and runtime 'linking' is also usually available (i.e., DLLs). This allows graceful scaling. Tool support for this in C++ is strong and reasonably robust because C++ is so frequently used to build enormous projects. It's possible to build massive projects in pieces in ways that are awkward or impossible in many functional or logic languages.&lt;/del&gt; &lt;i&gt;(See comments, some strong points about other languages package handling vs C++'s and &lt;a href="http://senzee.blogspot.com/2008/04/which-languages-handle-packages-and.html"&gt;Which Languages Handle Packages and Libraries Best?&lt;/a&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Still, writing solid C++ code even in the absence of multithreading requires a mastery of nearly the whole language, making it dangerous for inexperienced developers. Even merely adequate C++ coding is &lt;em&gt;heavily &lt;/em&gt;reliant on learned idioms that &lt;em&gt;are not a part of the language&lt;/em&gt;, and therefore unenforceable. For example, that you are allowed to return a pointer or reference to a stack-allocated object from a function, or that you are allowed to overflow a string buffer have cost the world untold man-hours and dollars. And yet for all its ills, C++ ranks near the top of the most useful (or at least used) languages ever &lt;em&gt;explicitly&lt;/em&gt; designed (including &lt;a href="http://en.wikipedia.org/wiki/Esperanto"&gt;Esperanto&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;(4/11/08 - adapted from one of my comments in reddit.)&lt;br /&gt;&lt;br /&gt;I should stress again that one of the more crucial issues surrounding language choice is the set of tools provided to us by the console vendors.  C++ wasn't adopted until late in the console world because C++ standards weren't well supported by console vendors. Tools have always been poor on consoles compared to the PC (this has changed somewhat with the 360), and good quality C++ compilers were rare in previous console generations, but C compilers were available (athough they, too, came late - with the original PlayStation or Saturn, I believe?).&lt;br /&gt;&lt;br /&gt;The PC gaming world hasn't seen this sort of lag.  Game developers are eager to adopt new technologies.  Other technologies have been unavailable on these platforms.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;This is an exploratory post (as they all are..) and is subject to change.&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-4254844429549214657?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/4254844429549214657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=4254844429549214657' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4254844429549214657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/4254844429549214657'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/12/why-do-we-use-c.html' title='Why Do We Use C++?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1255449260914880582</id><published>2007-12-18T11:13:00.001-05:00</published><updated>2008-09-09T10:00:35.796-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Concurrency in Game Development</title><content type='html'>&lt;p&gt;Effectively developing concurrent software for &lt;a href="http://en.wikipedia.org/wiki/Multi-core_%28computing%29"&gt;modern machines with multiple cores &lt;/a&gt;is perhaps the greatest technical challenge we'll encounter in some time.  Our current approaches just aren't up to the task of creating robust multithreaded code.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://senzee.blogspot.com/2007/12/why-do-we-use-c.html"&gt;Why Do We Use C++?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Please see the &lt;a href="http://senzee.blogspot.com/2007/12/why-do-we-use-c.html"&gt;linked post for some thoughts&lt;/a&gt; on this topic.  Before we look directly at concurrency, let's look at what brought us to where we are.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Category_%28philosophy%29"&gt;Categories&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It’s reasonably well established that categorization is a fundamental human strength. You might say that &lt;a href="http://en.wikipedia.org/wiki/Pattern_recognition"&gt;feature extraction and classification&lt;/a&gt; are &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Hardware_acceleration"&gt;hardware-accelerated&lt;/a&gt;&lt;/em&gt; in the brain. Even at levels far below the conscious (i.e., the visual cortex) information is categorized before it even becomes 'thought' to us. In fact, categorization is so fundamental to human thought that assuming &lt;em&gt;categories&lt;/em&gt; themselves are &lt;a href="http://en.wikipedia.org/wiki/Problem_of_universals"&gt;&lt;strong&gt;real objects&lt;/strong&gt; has been a universal illusion&lt;/a&gt;. In &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/How_The_Mind_Works"&gt;“How the Mind Works”&lt;/a&gt;&lt;/em&gt;, Pinker states that nearly all cultures initially adopt a ‘folk idealism’ as a result of this. Applying this to the boundary of man and machine communication, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_orientation"&gt;Object Orientation&lt;/a&gt;&lt;/em&gt; has evolved as a straightforward way to map categories (type, class, etc.) and instances of those categories onto machine architectures that deal primarily in a few primitive and largely undifferentiated numerical types.&lt;/p&gt;&lt;p&gt;Abstractions are complexes of categories and their interactions. Understanding complexity in terms of hierarchies of abstraction is something that people do really well. &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Modular_programming"&gt;Modular Programming&lt;/a&gt;&lt;/em&gt; and, to a greater extent, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_orientation"&gt;Object Orientation&lt;/a&gt;&lt;/em&gt; attempt to give us tools to work at these levels of human competence - with, of course, some consequences in terms of final performance.&lt;/p&gt;&lt;p&gt;The predominant programming paradigms attempt to map the way people think onto the way machines operate. Let's turn our attention to concurrency and see if we can stretch this a bit further.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Concurrency as Time vs. Space&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In software development, one of the things I’ve noticed is that &lt;em&gt;people are &lt;strong&gt;much&lt;/strong&gt; better at understanding space than time&lt;/em&gt;. This is why we map out time in timelines, MS Project files and a million other ways in spatial form. What this means to programming is that anywhere you can map out state in terms of space, the result is far easier to comprehend. For a clear example of this, see &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;Google's MapReduce&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is the core issue with concurrency. It’s very difficult to understand the possible states of concurrent systems because they happen &lt;em&gt;in time&lt;/em&gt;. Many of the abstractions that can help with concurrency (such as &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Functional Programming&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Message_passing"&gt;Message Passing&lt;/a&gt;&lt;/em&gt;, etc.) are useful because they essentially transform a state-heavy process into some equivalent but more understandable spatial map whose design &lt;em&gt;appears&lt;/em&gt; much more static.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Open Questions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In some ways the game industry is at the vanguard of multicore development on consumer machines with the Xbox 360 and the PlayStation 3. The amount of time and effort that we spend finding and fixing multithreading bugs is terrifying. While the hardware companies move toward doubling the number of cores with each processor generation, software companies will be reeling.&lt;/p&gt;&lt;p&gt;Clearly, C++, as it is currently, is not well suited toward developing software on highly multicore machines. Ideally, we’d have a language, extension or paradigm that would allow us to map thread concurrency onto easily understood (that is, spatial) language constructs that discourage or prohibit the kind of multithreading errors that currently waste hours and hours of our time. Right now, we don’t have to worry how many registers there are on the processor when we write C++ code. Similarly, whatever language/paradigm we’d want to use would, at the compile stage, optimally generate code for the number of cores available to it on the target platform. &lt;/p&gt;&lt;p&gt;So would some sort of functional language be best? C++ with functional extensions? &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;? &lt;a href="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29"&gt;Haskell&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;What about programming models based more on hardware description languages such as &lt;a href="http://en.wikipedia.org/wiki/Vhdl"&gt;VHDL&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Verilog"&gt;Verilog&lt;/a&gt;, which are inherently spatial? Would they map more effectively to multicore machinery since hardware languages describe processes which are inherently asynchronous?&lt;/p&gt;&lt;p&gt;In any event, we software developers have an interesting road ahead.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1255449260914880582?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1255449260914880582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1255449260914880582' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1255449260914880582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1255449260914880582'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/12/concurrency-in-game-development.html' title='Concurrency in Game Development'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8433392263429046049</id><published>2007-12-12T22:58:00.002-05:00</published><updated>2010-02-26T12:05:48.448-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Playing Games'/><title type='text'>Times of Lore (maps)</title><content type='html'>A few years ago I wrote a program to spit out the maps from the PC version of the 1988 game &lt;a href="http://en.wikipedia.org/wiki/Times_of_lore"&gt;Times of Lore&lt;/a&gt;, which I loved as a youngster. &lt;span class="fullpost"&gt;Where there were cities mostly show up here as bright green grassy areas. Thanks to &lt;a href="http://members.fortunecity.com/cartographics/"&gt;Andrew Schultz and his site&lt;/a&gt; for inspiring me to dig up and post these images. Oh, and check out &lt;a href="http://members.tripod.com/~kennrice/"&gt;Kenn Rice's site&lt;/a&gt; too.&lt;br&gt;&lt;br /&gt;The world -&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/world.gif"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 410px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/world_thumb.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The dungeons -&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/dungeon.gif"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 410px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.psenzee.com/images/dungeon_thumb.png" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8433392263429046049?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Times_of_lore' title='Times of Lore (maps)'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8433392263429046049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8433392263429046049' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8433392263429046049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8433392263429046049'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/12/times-of-lore-maps.html' title='Times of Lore (maps)'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8556954467521481218</id><published>2007-11-09T23:37:00.002-05:00</published><updated>2010-02-26T12:03:49.042-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='City Generation'/><title type='text'>The Impossible Dream #4</title><content type='html'>(Updated 11/23/2007)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Where Have I Been?&lt;/strong&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;It's been months since I've blogged. They've been productive months, though.  See, in early October, another &lt;strong&gt;beautiful&lt;/strong&gt; baby girl joined our family! It's been a rush having another child. It's incredible how you can still be completely awestruck as if it were the first time, each and every time. :)&lt;br /&gt;&lt;br /&gt;Prior to that, vacation.&lt;br /&gt;&lt;br /&gt;Because I had some time off, I slipped in some hours on my &lt;a href="http://senzee.blogspot.com/search/label/The%20Impossible%20Dream"&gt;Impossible Dream&lt;/a&gt;. I hadn't really considered blogging about it yet until I stumbled across &lt;a href="http://cluttering.blogspot.com/2007/09/project-steel-glass.html"&gt;Project Steel &amp;amp; Glass&lt;/a&gt; at &lt;a href="http://cluttering.blogspot.com/"&gt;The Cluttered Desk&lt;/a&gt; that motivated me to write an update.&lt;br /&gt;&lt;br /&gt;Before leaving on vacation this summer, I'd made some headway with &lt;strong&gt;Pair&lt;/strong&gt;, my embedded script language. Especially, I'd made some strides compiling it to more efficent bytecode, etc. It's in a sort-of usable state. Still, some things like lexical closures are not 100%.  I'll leave blogging about that until later.&lt;br /&gt;&lt;br /&gt;Basically, much of the material pass (no illumination yet) of the game is rendering. It looks pretty raw and repetitive with respect to content right now. There's not yet much differentiation in city sections. No niceties such as shadows or even basic lighting yet.  And, jeez, how am I gonna do trees?  It's time, though, to switch gears for a bit and prototype the gameplay. As you might infer from the &lt;a href="http://www.geocities.com/psenzee/impossible"&gt;screenshots&lt;/a&gt;, the protagonist will be capable of flight. I've got my Xbox 360 controllers hooked up to my PC and I can fly all around town.&lt;br /&gt;&lt;br /&gt;(Zaragosa, Mexico [fictional])&lt;br /&gt;&lt;a href="http://www.psenzee.com/impossible"&gt;&lt;img src="http://www.psenzee.com/impossible/impossible7.jpg" width="400" height="72" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Puebla, Mexico [real])&lt;br /&gt;&lt;a href="http://www.psenzee.com/impossible"&gt;&lt;img src="http://www.psenzee.com/impossible/puebla.jpg" width="400" height="100" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Please, I'm Just One Man!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So I must enlist the machine to generate a great deal of content automatically, albeit offline. This approach, of course, runs the risk of a high degree of repetition, but I think with some caution and tool refinement this will turn out great. I'm really happy with how auto-generation has gone so far.  It's actually starting to vaguely resemble the residential city streets of central Mexico, which is, of course, the idea.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/impossible"&gt;&lt;img src="http://www.psenzee.com/impossible/impossible6.jpg" width="400" height="140" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyhow, I'm pretty pumped about it.  Given some time (lots) and little-by-little refinement, we may have something pretty cool here.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8556954467521481218?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8556954467521481218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8556954467521481218' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8556954467521481218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8556954467521481218'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/11/impossible-dream-4.html' title='The Impossible Dream #4'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7024476906194346153</id><published>2007-07-31T21:19:00.007-04:00</published><updated>2010-02-26T12:04:17.152-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='EA'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>NCAA 08's Video Highlights</title><content type='html'>&lt;a href="http://www.psenzee.com/images/ncaa-video.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/ncaa-video.jpg" border="0" /&gt;&lt;/a&gt; I'm pretty proud of this one. ;)&lt;br /&gt;&lt;br /&gt;Thousands of user-created videos from &lt;a href="http://en.wikipedia.org/wiki/NCAA_Football_08"&gt;NCAA Football 08&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.easportsworld.com/#canvas_TopVideos"&gt;http://www.easportsworld.com/#canvas_TopVideos&lt;/a&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;I posted this on 4/12/07:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;I've been working on a little something special in NCAA Football 08. An &lt;/em&gt;&lt;a href="http://www.gamespot.com/xbox360/sports/ncaafootball08/news.html?sid=6168928&amp;amp;tag=topslot;title;2&amp;amp;om_act=convert&amp;amp;om_clk=topslot"&gt;&lt;em&gt;NCAA Football 08 First Look&lt;/em&gt;&lt;/a&gt;&lt;em&gt; article by &lt;/em&gt;&lt;a href="http://www.gamespot.com/"&gt;&lt;em&gt;GameSpot&lt;/em&gt;&lt;/a&gt;&lt;em&gt; details the surprise. So now that it's public..&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;".. Once you've found a highlight you're particularly fond of, you can then choose to create a highlight of that play. This lets you choose from multiple camera angles to take a snapshot or &lt;strong&gt;segment of game-generated video&lt;/strong&gt;. From there, you can either save these photos or &lt;strong&gt;videos on your hard drive or upload them&lt;/strong&gt; to share with friends. .."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;About the middle of last year, I was asked to do some R&amp;amp;D for this technology. Not long after that we were building it. Still, it came &lt;em&gt;really&lt;/em&gt; close to being cut on a number of occasions. There were times when it seemed impossible to satisfy all of the below constraints and still produce a video of acceptable (or any) quality. I had taken some time off for a bit of surgery as NCAA was finalling and came back to find some bugs in my .flv encoder. So, I was a little paranoid that some random, unforseen issue might render the whole feature unusable in the shipped game.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Constraints&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There were some wicked constraints putting this one together including -&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Encoding &lt;em&gt;while rendering the game&lt;/em&gt; at 60fps/X360 and 30fps/PS3 without dropping frames.&lt;/li&gt;&lt;li&gt;Keeping final file size small enough to not overwhelm the servers and to keep our bandwidth costs down.&lt;/li&gt;&lt;li&gt;Final visual quality given the other constraints.&lt;/li&gt;&lt;li&gt;Memory during encoding. Early in the cycle, I gave a rough estimate of 25MB free memory in-game to encode to .flv. It turns out we had to do it in under 500K in-game, and we did that by offloading some tasks until later and some other tricks I won't &lt;em&gt;- and shouldn't -&lt;/em&gt; go into ;).&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Compromises&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No sound. This one's hard to take but we just didn't have time. Remarkably, on the web, I haven't seen anyone complain about this. For next year.&lt;/li&gt;&lt;li&gt;15 frames per second. Yes, we wanted thirty, but we could only do that with a smaller frame size. Believe me, the trade off was well worth it. Also for next year.&lt;/li&gt;&lt;li&gt;Video dimensions. We would have liked a larger frame size but we just didn't have the machine resources or network bandwidth to spare.&lt;/li&gt;&lt;/ul&gt;All in all, I think we struck a reasonable balance and it works. &lt;a href="http://www.pastapadre.com/1121/ncaa-football-08-highlight-clip-contest"&gt;It's exciting to see people this jazzed about it!&lt;/a&gt; This technology is now quite the buzz around EA and next year we'll be seeing it in a lot more titles.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Will this technology and its descendants usher in the Web 2.0 era in console sports gaming?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I hope so!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update Jan 3, 2008&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Check out #2 on this list at &lt;a href="http://www.pastapadre.com/2084/the-12-biggest-sports-gaming-stories-of-2007"&gt;pastapadre.com&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;.. Launching with the release of NCAA Football 08 [EA Sports World] was an immediate success as fans of the game utilized the screenshot and video uploading features and it became one of the most positively responded to new additions to any sports game in recent memory.&lt;/em&gt; ...&lt;br /&gt;&lt;br /&gt;For video highlights and optimizations geared at getting our football games to 60fps on PS3 starting with NFL Tour, I was nominated for the &lt;em&gt;2007 Outstanding Achievement in Engineering&lt;/em&gt; award for EA Sports - Tiburon. :) &lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7024476906194346153?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7024476906194346153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7024476906194346153' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7024476906194346153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7024476906194346153'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/07/video-highlights.html' title='NCAA 08&apos;s Video Highlights'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1721278532110669274</id><published>2007-07-29T23:24:00.002-04:00</published><updated>2010-02-26T12:01:06.363-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Trampolines</title><content type='html'>Developing embedded languages for applications in the past, the most time consuming part always seemed to be wrapping the multitude of foreign language (ie, to/from C++) function calls of interest with script-compatible functions.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;One of the goals of &lt;em&gt;Pair&lt;/em&gt; is to make working with other languages - especially C/C++ - very easy. So here we'll take a different approach. This time we'll generate &lt;a href="http://en.wikipedia.org/wiki/Trampoline_(computers)"&gt;trampolines&lt;/a&gt; to call foreign functions (for example, from a DLL) and do the boxing/unboxing of values for &lt;em&gt;Pair&lt;/em&gt; to use. &lt;em&gt;Trampolining&lt;/em&gt; has a number of different meanings but many of them center around the idea of generating code at runtime to call a function with special requirements that aren't known until runtime. In this case, we're directly generating the machine code necessary to set up the stack frame and call a function using either the &lt;strong&gt;__cdecl&lt;/strong&gt; (for the C runtime library) or &lt;strong&gt;__stdcall&lt;/strong&gt; (for the Win32 SDK functions) calling conventions.&lt;br /&gt;&lt;br /&gt;This allows us to do things like the following -&lt;pre&gt;(let&lt;br /&gt;  ((beep  &lt;br /&gt;     (import "kernel32.dll" stdcall uint Beep   (uint uint)))&lt;br /&gt;   (system&lt;br /&gt;     (import "msvcrt.dll"   cdecl   uint system (string))))&lt;/pre&gt;&lt;pre&gt;(system "dir c:\\root")&lt;br /&gt;(beep 500 1000))&lt;/pre&gt;C++ code -&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/nativecaller.h"&gt;nativecaller.h&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/nativecaller.cpp"&gt;nativecaller.cpp&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1721278532110669274?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Trampoline_(computers)' title='Trampolines'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1721278532110669274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1721278532110669274' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1721278532110669274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1721278532110669274'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/07/trampolines.html' title='Trampolines'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3589013232052437763</id><published>2007-07-10T21:19:00.001-04:00</published><updated>2008-09-09T10:06:17.518-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Nearest Neighbor</title><content type='html'>What's the fastest way to find the closest pair of three-dimensional points in a large set? That was the question posed for the most recent &lt;em&gt;Hacker's Delight&lt;/em&gt; challenge.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;We just released the results for &lt;a href="http://www.hejl.com/hd/7/results.html"&gt;Hacker's Delight #7: Nearest Neighbor&lt;/a&gt;. A little premature, it turns out, we misplaced a bunch of the entries. Once the remaining entries were found, I ran the tests before I came home tonight and &lt;a href="http://www.hejl.com/"&gt;Jim&lt;/a&gt; should be putting them up soon. It turns out that the missing entries don't really affect the outcome.&lt;br /&gt;&lt;br /&gt;This is the third &lt;a href="http://www.hejl.com/hd/"&gt;Hacker's Delight challenge&lt;/a&gt; I've blogged about. &lt;a href="http://www.hejl.com/hd/6/results.html"&gt;Challenge #6: 64 Choose 4&lt;/a&gt; came from the post &lt;a href="http://senzee.blogspot.com/2006/06/let-me-count-ways.html"&gt;Let Me Count The Ways&lt;/a&gt; and, in full circle, &lt;a href="http://senzee.blogspot.com/2006/08/let-me-count-ways-part-ii.html"&gt;Let Me Count The Ways (Part II)&lt;/a&gt; comes from the challenge. From &lt;em&gt;Hacker's Delight #4: Primes&lt;/em&gt; came &lt;a href="http://senzee.blogspot.com/2006/06/sieve-of-eratosthenes.html"&gt;Sieve of Eratosthenes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Alistair Milne from EA Montreal blew &lt;em&gt;Nearest Neighbor &lt;/em&gt;out of the water with a &lt;a href="http://www.hejl.com/hd/7/results/alistairmilne.html"&gt;blazingly fast and beautiful algorithm&lt;/a&gt; for finding the nearest two points in a cloud of points in three dimensional space. For comparison the very slow &lt;a href="http://www.hejl.com/hd/7/main.html"&gt;reference implementation is here&lt;/a&gt;. I wondered if I could get any more performance out of Alistair's algorithm and came up with an &lt;a href="http://www.hejl.com/hd/7/results/senzee_alistairmilne.html"&gt;uglier but ~25% faster SIMD optimized version of his algorithm&lt;/a&gt;. Sadly, my own reasonably fast implementation for &lt;em&gt;Nearest Neighbor &lt;/em&gt;is incorrect about 7% of the time.&lt;br /&gt;&lt;br /&gt;My implementation, and many others we received were based on the canonical &lt;em&gt;Nearest Neighbor&lt;/em&gt; algorithm as described in Cormen's &lt;a href="http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262032937/ref=pd_bbs_2/002-0671607-9544802?ie=UTF8&amp;s=books&amp;amp;amp;qid=1184118727&amp;amp;sr=8-2"&gt;Introduction to Algorithms&lt;/a&gt;. It seems that in every respect, Alistair's algorithm is superior. It's more elegant, it's much faster and it does less work.&lt;br /&gt;&lt;br /&gt;Be sure to check it out.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3589013232052437763?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3589013232052437763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3589013232052437763' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3589013232052437763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3589013232052437763'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/07/nearest-neighbor.html' title='Nearest Neighbor'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7973231639291296011</id><published>2007-06-30T10:32:00.002-04:00</published><updated>2008-11-18T00:26:21.535-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>A Developer's Life Stages</title><content type='html'>I ended up writing a novel as a comment on Jamie Fristrom's blog post on &lt;a href="http://www.gamedevblog.com/2007/06/speculative_gen.html"&gt;Speculative Generality&lt;/a&gt;. Read his entry. I'm reposting my comment here.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Developing The Simplest Thing That Could Possibly Work&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In Forrester Research's &lt;a href="http://weblog.infoworld.com/techwatch/archives/012722.html" rel="nofollow"&gt;10 Mistakes in Software Development&lt;/a&gt;, #3 is &lt;em&gt;overscoping a solution&lt;/em&gt; and #9 is &lt;em&gt;jumping into development without enough research&lt;/em&gt;, and we've all done it. :(&lt;br /&gt;&lt;br /&gt;A friend consulted at a large transportation company in the Kansas City area. They'd been gearing up for a massive conversion from their existing AS/400 systems to a completely Java-based system. Remarkably, in the early stages of the project, they decided to &lt;em&gt;wrap&lt;/em&gt; the entire JDK in their own custom framework and decreed that all developers use these wrappers exclusively. As a result of this, they obtained -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;little or no added functionality,&lt;/li&gt;&lt;li&gt;more limited abstractions than the raw JDK,&lt;/li&gt;&lt;li&gt;minimally tested code underlying everything,&lt;/li&gt;&lt;li&gt;the requirement to &lt;em&gt;train&lt;/em&gt; all incoming Java developers on their framework and,&lt;/li&gt;&lt;li&gt;worst of all, the obligation to maintain many more thousands of lines of code.&lt;/li&gt;&lt;/ul&gt;I've observed that developers tend to progress through a number of stages in their career. These are like the stages of grief: inescapable. This is because each stage produces a set of skills and philosophies that are eventually synthesized in the seasoned software developer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.senzee5.com/2008/11/underengineering-undead.html"&gt;&lt;strong&gt;The Underengineer&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The underengineer is elated at his ability to get things done quickly and be productive, disdaining others (usually the overengineer) for what they see as excessive rumination and for producing an excessive amount of code for a given task. You can count on these guys to get stuff done. Will it be done 'the right way?' Only if by accident. Underengineers are often unable to discern 'the right way,' often because they've spent little time reading and maintaining other people's code.&lt;br /&gt;&lt;br /&gt;A developer may begin to come out of this stage when he tires of fixing or writing the same code (in different places) over and over again. Or perhaps he'll be propelled into the second stage by an enthusiastic reading of &lt;em&gt;Design Patterns&lt;/em&gt; or a sudden grasp of UML.&lt;br /&gt;&lt;br /&gt;The developer at this stage is fascinated by accomplishing the task at hand and it is this stage in which he learns how to code and debug.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Overengineer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The overengineer knows that he can solve any single development task and has become fascinated by possibility. Abstraction is magical. How can any piece of code be used to solve multiple tasks? Paradoxically, this usually ends up producing more code for any one task. While the underengineer shakes his head at this, the overengineer knows that his approach will produce much less code for an &lt;em&gt;entire set&lt;/em&gt; of similar problems. Meanwhile, the overengineer looks at the underengineer's hackery with contempt. The question the overengineer rarely asks himself, though, is &lt;em&gt;will there be a large enough set of similar problems to justify this effort&lt;/em&gt;? And so he abstracts everything in the name of flexibility.&lt;br /&gt;&lt;br /&gt;The overengineer is sometimes shocked to realize he's become much less productive in terms of functionality than before. He can't seem to get anything done! Still, he produces as much (if not more) code and suddenly becomes capable of building much larger systems than he could as an underengineer.&lt;br /&gt;&lt;br /&gt;This is the stage in which the developer learns architecture and the value (and painfully, the costs) of abstraction. This is the stage of the architects of the transportation system conversion discussed above.&lt;br /&gt;&lt;br /&gt;What kills the overengineer? Maintenance. Dependencies. Broken abstraction. Realizing that the flexiblity he built in is unused and real systems change in ways he could never have anticipated. At some point, and probably many, the overengineer will get a phone call at 2am asking him to come in and fix an issue that breaks his whole architecture. After a few of these heartbreaking moments, his world view begins to change again.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Seasoned Developer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The seasoned developer is skilled in coding and debugging from his time as an underengineer and is a skilled architect from his time as an overengineer. What's more, he's come to understand the following:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The primary reason for abstraction is to &lt;em&gt;simplify&lt;/em&gt; implementation for a given set of requirements.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;If abstraction doesn't simplify, ditch it.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The seasoned developer also realizes that the solution domain for a given problem may extend beyond technology. People often try to use technology to solve social or organizational problems. Conversely, people frequently attempt social or organizational solutions for essentially technological problems. Recognizing these incongruities before they become a software design and implementation can help to avoid doomed projects.&lt;br /&gt;&lt;br /&gt;The organizational problem in the transportation example above is that software architects were assigned to do a job before anyone knew what job they were to do. The proper response would be to do nothing - or better, to work on a different project until the problem domain was fully understood.&lt;br /&gt;&lt;br /&gt;Instead they chose speculatively general busy work, incurring a much higher cost.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7973231639291296011?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7973231639291296011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7973231639291296011' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7973231639291296011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7973231639291296011'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/developers-life-stages.html' title='A Developer&apos;s Life Stages'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-471786884752271788</id><published>2007-06-29T16:56:00.001-04:00</published><updated>2008-09-09T10:25:52.387-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>The Future of Processor Hardware</title><content type='html'>&lt;strong&gt;Many-Core Processors, Languages for Multiple Processors and Reconfigurable Computing&lt;/strong&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Manycore_processing_unit"&gt;Many-Core Processors&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Multicore processors are giving way to many-core processors with Intel estimating the number of cores doubling with each processor generation. The paradigms of the most commonly used programming languages are ineffective with respect to these types of processors. So what will happen?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Languages for Multiple Processors&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Modified C++/Java# with &lt;a href="http://en.wikipedia.org/wiki/Future_(programming)"&gt;futures, promises&lt;/a&gt;, (&lt;a href="http://en.wikipedia.org/wiki/Flow_Java"&gt;Flow Java&lt;/a&gt;)?&lt;br /&gt;&lt;br /&gt;Functional languages are inherently more parallelizable than imperative languages. Will we see a resurgence of these types of languages?&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Haskell"&gt;Concurrent Haskell&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Concurrent_Clean"&gt;Concurrent Clean&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/F_Sharp"&gt;F#&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Reconfigurable_Computing"&gt;&lt;strong&gt;High-Performance Reconfigurable Computing&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hybrid systems combining conventional (Von Neumann) architectures with &lt;a href="http://en.wikipedia.org/wiki/FPGAs" target="_self"&gt;FPGAs&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/RDPA" target="_self"&gt;other forms of reconfigurable hardware&lt;/a&gt; are starting to mature, but with radically different models of &lt;a href="http://en.wikipedia.org/wiki/Configware" target="_self"&gt;"software" development&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sc06.supercomputing.org/schedule/pdf/pan102.pdf"&gt;Is High-Performance Reconfigurable Computing the Next Supercomputing Paradigm?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From Wikipedia&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Paradigm Shift&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;It is called the Reconfigurable Computing Paradox, that by software to configware migration (software to FPGA migration) speed-up factors by up to almost 4 orders of magnitude have been reported, as well as the reduction of electricity consumption by more than 1 order of magnitude - although the technological parameters of FPGAs are are behind the Gordon Moore curve by about 4 orders of magnitude, and the clock frequency is substantially lower than that of microprocessors. The reasons of this paradox are due to a paradigm shift, and are also partly explained by the Von Neumann syndrome.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-471786884752271788?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/471786884752271788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=471786884752271788' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/471786884752271788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/471786884752271788'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/future-of-processor-hardware.html' title='The Future of Processor Hardware'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7592599754452820671</id><published>2007-06-26T18:12:00.001-04:00</published><updated>2008-09-09T10:10:35.808-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='EA'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>EASTL</title><content type='html'>EA genius and colleague Paul Pedriana published a paper to the C++ Standards Committee detailing his &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html"&gt;EASTL&lt;/a&gt;, an EA version of the &lt;a href="http://en.wikipedia.org/wiki/Standard_Template_Library"&gt;Standard Template Library&lt;/a&gt; that provides a number of efficiencies with game development in mind, but that are nonetheless applicable across other software domains.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;I've always been a fan of the STL in general, and since I've been at Electronic Arts, of EASTL. It's nice to see some of these innovations get out into the world.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7592599754452820671?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html' title='EASTL'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7592599754452820671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7592599754452820671' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7592599754452820671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7592599754452820671'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/eastl.html' title='EASTL'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-675537470951086515</id><published>2007-06-21T00:10:00.001-04:00</published><updated>2008-09-09T10:14:15.419-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Spread This Number?</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/09-f9-11-02-9d-74-e3-5b-d8-41-56-c5-63-56-88-c0"&gt;AACS encryption key controversy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This bad boy?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;13,256,278,887,989,457,651,018,865,901,401,704,640&lt;br /&gt;&lt;/strong&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;So where was I when all the noise about &lt;a href="http://en.wikinews.org/wiki/Digg.com_suffers_user_revolt"&gt;this&lt;/a&gt; was going on in April? Ah, &lt;a href="http://en.wikipedia.org/wiki/Illegal_number"&gt;illegal numbers&lt;/a&gt;. What will they think of next? &lt;a href="http://en.wikipedia.org/wiki/Illegal_prime"&gt;Anything&lt;/a&gt; that can be represented digitally can be represented as a single (usually very large) number. Software, movies, music, etc..&lt;br /&gt;&lt;br /&gt;That reminds me of a story I read once about a civilization that encoded all its existing knowledge as a single mark on a stick. The position of the mark on the stick divided by the length of the stick yielded a decimal number less than one. The digits of the fractional part of that number represented the totality of the civilization's knowledge in an encoded form.&lt;br /&gt;&lt;br /&gt;Could this work?&lt;br /&gt;&lt;br /&gt;Let's think about this.  A proton has a diameter of about 1.5E−15 m.  That means we'd get &lt;strong&gt;only about 16&lt;/strong&gt; decimal digits before we're measuring sub-subatomic dimensions. And &lt;a href="http://en.wikipedia.org/wiki/Claude_Shannon"&gt;Shannon&lt;/a&gt; tells us it would take &lt;em&gt;lots&lt;/em&gt; of digits to represent that knowledge in any reasonable form. Actually, it would take about &lt;em&gt;2.3 million decimal digits per megabyte of data&lt;/em&gt;.  And we're talking at least &lt;em&gt;trillions&lt;/em&gt; of megabytes of data.&lt;br /&gt;&lt;br /&gt;So no, there is no way - now or ever - that this could work.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-675537470951086515?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/675537470951086515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=675537470951086515' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/675537470951086515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/675537470951086515'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/spread-this-number.html' title='Spread This Number?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-7829798115058174305</id><published>2007-06-14T10:46:00.001-04:00</published><updated>2008-09-09T10:24:29.895-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Horrific Default Behavior/Failure Modes</title><content type='html'>&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;strong&gt;Horrific Default Behavior&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Today I wrote a batch file called &lt;em&gt;clean.bat&lt;/em&gt; and put it in a directory on a different machine. It contained -&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;del /f /s /q *.obj&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;del /f /s /q *.ilk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;del /f /s /q *.pdb&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I had the directory up with Windows Explorer and '\\machine_name\c$\dev\..' was in the address bar. I saved the file into the directory of the other machine. Pretty straightforward, right?&lt;br /&gt;&lt;br /&gt;So, thoughtlessly, I double click on &lt;em&gt;clean.bat&lt;/em&gt;. Without ado, the batch file starts executing with this message -&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;'\\machine_name\c$\dev\..'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CMD.EXE was started with the above path as the current directory.&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;UNC paths are not supported. &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;Defaulting to Windows directory.&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;C:\WINDOWS&gt;&lt;/strong&gt;del /f /s /q *.obj&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Holy crap! Fortunately, I saw it immediately and broke out of it. Even more fortunate, I don't think &lt;em&gt;C:\WINDOWS&lt;/em&gt; has any &lt;em&gt;.obj&lt;/em&gt; files.&lt;br /&gt;&lt;br /&gt;But, if I had wanted to clean &lt;em&gt;.exe&lt;/em&gt; files instead (which I frequently do), my machine would have been &lt;strong&gt;utterly hosed&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;That, my friends, is &lt;strong&gt;horrific default behavior&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Failure Modes&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Last year, our water heater died. It was pretty old, I think. The problem was the way that it died - by catching fire. That was pretty disturbing.&lt;br /&gt;&lt;br /&gt;So the next day, while I was at work, the repairman came out to replace it. Rebekka asked him why it caught fire. The repairman explained, "that's how you know it's broken."Really? The next time my water heater fails, I'll know by following the fire trucks home to see my subdivision in cinders. "Time for a new water heater," I'll say to myself.&lt;br /&gt;&lt;br /&gt;And how will I know when my nail clippers need replacing? Oh that's right, from the &lt;a href="http://en.wikipedia.org/wiki/Mushroom_cloud"&gt;mushroom cloud&lt;/a&gt; over Orlando.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-7829798115058174305?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/7829798115058174305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=7829798115058174305' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7829798115058174305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/7829798115058174305'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/horrific-default-behavior.html' title='Horrific Default Behavior/Failure Modes'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8255352156481852271</id><published>2007-06-06T22:29:00.000-04:00</published><updated>2008-02-29T11:21:39.965-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><title type='text'>Compiling Haskell</title><content type='html'>I've played with the &lt;a href="http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler"&gt;Glasgow Haskell Compiler&lt;/a&gt; only a bit. Compiling &lt;a href="http://en.wikipedia.org/wiki/Haskell_(programming_language)"&gt;Haskell&lt;/a&gt; to, say, native code is quite a chore. The GHC compiles to a number of special &lt;a href="http://en.wikipedia.org/wiki/Intermediate_language"&gt;intermediate languages&lt;/a&gt; between source and machine code.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Haskell_(programming_language)"&gt;Haskell&lt;/a&gt; &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;em&gt;Core&lt;/em&gt; (&lt;a href="http://en.wikipedia.org/wiki/Type_inference"&gt;Hindley-Milner&lt;/a&gt; typed &lt;a href="http://en.wikipedia.org/wiki/Functional_programming_language"&gt;lambda calculus&lt;/a&gt;) &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;em&gt;STG &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;/em&gt;C/&lt;a href="http://en.wikipedia.org/wiki/C--"&gt;C--&lt;/a&gt; &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&gt;&lt;/span&gt;&lt;/strong&gt; native machine code&lt;br /&gt;&lt;br /&gt;That's a &lt;em&gt;lot&lt;/em&gt; of work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8255352156481852271?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler' title='Compiling Haskell'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8255352156481852271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8255352156481852271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8255352156481852271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8255352156481852271'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/compiling-haskell.html' title='Compiling Haskell'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-740030553572749908</id><published>2007-06-06T10:59:00.002-04:00</published><updated>2010-02-26T11:56:22.062-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Small Tools</title><content type='html'>&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Part of the purpose of this blog is to remind myself of best practices I've discovered through the years I've been developing software. One of these best practices was brought to mind again in a recent conversation with a colleague.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Small, Combinable Tools&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Unix, of course, is built around this philosophy. In essence, it is an extension of the practice of &lt;em&gt;modular programming&lt;/em&gt; to applications. It allows us combine the functions of applications in an automatic or semiautomatic way. These are generally command-line tools, which may make them inconvenient in certain circumstances. Nevertheless, with a judicious layering approach, it is frequently possible to capture the best of both worlds - command-line combinable tools underneath, user-friendly GUI on top.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UnxUtils&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you use Windows and you develop software, it is absolutely imperative that you &lt;a href="http://unxutils.sourceforge.net/"&gt;download and use UnxUtils&lt;/a&gt;. They are native Win32 ports of many standard unix utilities, and they can be extraordinarily useful. Add them to your PATH. Oh, and if you're not comfortable in unix and, by extension, with these utilities, let me encourage you strongly to learn to use them well. You'll thank me later!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows SysInternals&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/sysinternals/default.mspx"&gt;Windows SysInternals&lt;/a&gt;. You may not need these beauties often, but when you need them, you need them badly. I believe that few (or none) of these are command-line operable &lt;em&gt;(I may be mistaken)&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows Utilities&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Junction&lt;/em&gt; for symbolic directory links in Windows. &lt;a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx"&gt;Get it.&lt;/a&gt;&lt;br /&gt;&lt;em&gt;PathMan&lt;/em&gt; for path management, and a ton of other &lt;a href="http://support.microsoft.com/kb/927229"&gt;good stuff here&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://ccollomb.free.fr/unlocker/"&gt;&lt;em&gt;Unlocker&lt;/em&gt;&lt;/a&gt;, a fabulous (GUI) utility for unlocking files, by Cedric Collumb.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Build Utilities&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ant.apache.org/"&gt;&lt;em&gt;Ant&lt;/em&gt;&lt;/a&gt; and &lt;a href="http://nant.sourceforge.net/"&gt;&lt;em&gt;NAnt&lt;/em&gt;&lt;/a&gt; for builds.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Freeing pov2mesh&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://www.psenzee.com/pov2mesh/"&gt;pov2mesh&lt;/a&gt; utility is currently distributed under the shareware model. I've pretty much decided to release it as freeware. If I do this, I will refund the registered users and remove the registration code from the application. Refunding will be easy, because there are so few registered users! I will not release the full source now, although I may in the future. I've also developed a number of other small tools that I will slowly be polishing (a little, not much) and releasing here sometime.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://www.aspack.com/"&gt;ASPack&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;($29) No, it's not a fanny pack.  This &lt;a href="http://www.aspack.com/"&gt;executable packer&lt;/a&gt; is phenomenal.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Not So Small Tools&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://www.ultraedit.com/"&gt;UltraEdit&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;($50) My primary text editor.  It loads fast and I love its &lt;em&gt;Find/Replace In Files&lt;/em&gt;.  &lt;a href="http://www.textpad.com/"&gt;TextPad's&lt;/a&gt; a close second.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://www.lw-tech.com/"&gt;LTProf&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;($50) An easy-to-use, very lightweight &lt;a href="http://www.lw-tech.com/"&gt;profiler&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://www.araxis.com/merge/"&gt;Araxis Merge&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;($129) I don't know how I'd live without it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chumbalum.swissquake.ch/"&gt;&lt;strong&gt;MilkShape&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;($35) Basic, inexpensive low-polygon 3d modeler than can import/export almost anything.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://www.unwrap3d.com/"&gt;Ultimate Unwrap 3D&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;($50) Unwrap is great for texture mapping.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.corel.com/servlet/Satellite/us/en/Product/1184951547051"&gt;&lt;strong&gt;Paint Shop Pro&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;($90) Of course, as every game and web-developer who prefers Paint Shop Pro to Adobe's heavyweight (and expensive!) Photoshop knows.  Now that Corel owns it, hopefully it will fare as well and not become as bloated (or expensive!) as Photoshop.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Gnu Prolog&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Need a good &lt;a href="http://en.wikipedia.org/wiki/Prolog"&gt;Prolog&lt;/a&gt; implementation for expert system development or curiosity or anything else?&lt;br /&gt;&lt;br /&gt;In the rare moments when I use Prolog, I use &lt;a href="http://www.gprolog.org/"&gt;GNU Prolog&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-740030553572749908?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/740030553572749908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=740030553572749908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/740030553572749908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/740030553572749908'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/06/small-tools.html' title='Small Tools'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2374302783468902272</id><published>2007-05-24T23:11:00.001-04:00</published><updated>2008-09-09T10:09:44.834-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>The Impossible Dream #3</title><content type='html'>This is, of course, going incredibly slowly and that's just alright.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Script&lt;/strong&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;I'm exploring an interesting architecture. I'm starting to use my script language &lt;em&gt;Pair&lt;/em&gt; to script core parts of the game. &lt;em&gt;Pair&lt;/em&gt; is Lisp/Scheme-like and very compact (the VM executable [compressed] is 28k without many external functions!). I designed &lt;em&gt;Pair&lt;/em&gt; a few years ago with gaming in mind. The original intent was to use it to script many (hundreds or thousands) simultaneous events without having to make everything a state machine. &lt;em&gt;Pair&lt;/em&gt; is multithreaded at the virtual machine level and not at the OS level, yielding very lightweight threads. To accomplish this, an explicit frame stack is maintained for function calls, and they are not implemented as C++ function calls underneath. Like &lt;a href="http://en.wikipedia.org/wiki/Stackless_Python"&gt;Stackless Python&lt;/a&gt; which takes a similar approach (and is also used in gaming for its facility in concurrency), it means that &lt;em&gt;Pair&lt;/em&gt; can (and does) support &lt;a href="http://en.wikipedia.org/wiki/Continuation"&gt;continuations&lt;/a&gt; because the call stack can be directly manipulated. One of these days I'll put up &lt;em&gt;Pair&lt;/em&gt; and source.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2374302783468902272?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2374302783468902272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2374302783468902272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2374302783468902272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2374302783468902272'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/05/impossible-dream-3.html' title='The Impossible Dream #3'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6427225453500086548</id><published>2007-05-24T21:26:00.002-04:00</published><updated>2008-09-09T10:11:18.311-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>On the Side</title><content type='html'>In the 80's in front of a house in the Kansas City, Missouri area a man built a boat. It was an incredibly tall half-built steel boat in this guy's yard. Every once in a while we'd drive by and see people working on it and a bit of progress here and there.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;One day, my dad decided to stop and talk with the guy, with us little kids in tow. My brother and I took the opportunity to see the beast up close. And it was &lt;em&gt;freaking amazing&lt;/em&gt;. To us, it might as well have been a Saturn V.&lt;br /&gt;&lt;br /&gt;Many (and many of the best) software developers I've known have had little (or large!) projects on the side. Interviewing developers, I've sometimes asked about their side projects. It's a question that can yield great insight. Where does their passion lie? What problems attract them? What someone does with free time is what they &lt;em&gt;really want&lt;/em&gt; to do, regardless of what they might let on in an interview.&lt;br /&gt;&lt;br /&gt;It's an indicator of passion and of a drive to create. I've &lt;a href="http://senzee.blogspot.com/search/label/The%20Impossible%20Dream"&gt;recently come to understand&lt;/a&gt; that these side projects also &lt;em&gt;fuel&lt;/em&gt; the passion for our day-to-day work and inoculate against burnout. As developers, we have the power to create something from nothing. For some small portion of our time, to follow our own muse can be an exhilarating act.&lt;br /&gt;&lt;br /&gt;Some companies, notably Google, have institutionalized this idea, giving developers a certain percent of time &lt;em&gt;during office hours&lt;/em&gt; to work on their own projects. I'd expect Google to reap a significant innovative advantage with its policy.&lt;br /&gt;&lt;br /&gt;What compels about software development is only partially &lt;em&gt;solving puzzles&lt;/em&gt; and, for me, is about the joy and &lt;strong&gt;power of creation&lt;/strong&gt;. Unfortunately, this power is, in part, illusion and the illusion is intensified by software's abstract nature. It nearly &lt;em&gt;always&lt;/em&gt; seems &lt;em&gt;far&lt;/em&gt; easier to write software than it actually turns out to be.&lt;br /&gt;&lt;br /&gt;I'll demonstrate this illusion. Which requires more effort in man-hours: building a bridge across a medium-sized river or developing a game such as Spider-Man 3 or Madden 07? How about the Empire State building or Windows XP? I don't know the answers to these questions, but I don't believe that I can fully trust my intuition to provide them. In any event, good software requires enormous, and univerally underestimated, effort.&lt;br /&gt;&lt;br /&gt;Maybe one of these days, I'll have another kooky neighbor, this time toiling away in his garage or barn building a Space Shuttle or something like in that goofy movie &lt;em&gt;"The Astronaut Farmer"&lt;/em&gt; (which I have not yet seen). I'll know and he'll know and the fire department and the old ladies from the HOA will all know that it will never lift off. And I'll sit in the garage with that guy, and put the LOX and kerosene tanks together. And it will be &lt;em&gt;freaking amazing&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#999999;"&gt;&lt;em&gt;(Updated 7/11/07)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;(Rebekka and I watched &lt;em&gt;The Astronaut Farmer&lt;/em&gt; last night and now I wish I hadn't referred to it. I'd hoped for something good, like &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Apollo_13"&gt;Apollo 13&lt;/a&gt;&lt;/em&gt; or &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/October_Sky"&gt;October Sky&lt;/a&gt;&lt;/em&gt; but &lt;em&gt;Astronaut Farmer&lt;/em&gt; was godawful. The premise was utterly absurd and the profoundly self-centered protagonist Charlie Farmer reminded me of an Allie Fox (from a &lt;em&gt;great&lt;/em&gt; movie &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Mosquito_Coast"&gt;&lt;span style="color:#999999;"&gt;The Mosquito Coast&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#999999;"&gt;) barely disguised under a veneer of sentimentalism. The best part? The rocket launches from their &lt;em&gt;barn&lt;/em&gt;. As in a barn made of &lt;em&gt;wood&lt;/em&gt; and filled with &lt;em&gt;hay&lt;/em&gt;. And speaking of wood, during one of the bloopers, Billy Bob Thornton asks, in jest, if this was a film directed by &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Ed_wood"&gt;&lt;span style="color:#999999;"&gt;Ed Wood&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#999999;"&gt;. I was wondering the same thing.)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6427225453500086548?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6427225453500086548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6427225453500086548' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6427225453500086548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6427225453500086548'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/05/on-side.html' title='On the Side'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-323998902429674085</id><published>2007-05-05T23:01:00.001-04:00</published><updated>2008-09-09T10:12:09.343-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Playing Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>Fun, Fun, Fun</title><content type='html'>&lt;em&gt;..until her daddy takes her GTA away?&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;One of the things that have become even more abundantly clear in the transition to next-generation consoles is how the concept of fun is quite divorced from what we consider a quality game. &lt;span class="fullpost"&gt;Quality games must be fun, of course, to a point. They don't have to be &lt;em&gt;too&lt;/em&gt; fun, though, and originality in this arena carries an enormous and intolerable financial risk. High-end games must be beautiful to look at, slick, contain vast quantities of content. Frequently, they require online experiences. These types of games must sell millions to recoup development costs. Because risk is so enormous, there is a lot of copycating of successful models.&lt;br /&gt;&lt;br /&gt;Let me provide an example. I &lt;em&gt;loved&lt;/em&gt; &lt;strong&gt;GTA III&lt;/strong&gt;, liked &lt;strong&gt;GTA Vice City&lt;/strong&gt;, found &lt;strong&gt;GTA San Andreas&lt;/strong&gt; boring and &lt;strong&gt;True Crime&lt;/strong&gt;, &lt;strong&gt;Saint's Row&lt;/strong&gt; and even &lt;strong&gt;Crackdown&lt;/strong&gt; dull, dull, dull. Fun usually requires novelty (or &lt;em&gt;nostalgia&lt;/em&gt;), and there's no more novelty left in stealing cars and ramming them into other cars and pedestrians until they explode (the cars &lt;em&gt;and&lt;/em&gt; the pedestrians).&lt;br /&gt;&lt;br /&gt;(I am a sucker for licensed content, though. I hate to admit it, but it's true.)&lt;br /&gt;&lt;br /&gt;Of course, this is something that everyone involved with games knows. But sometimes it's useful to state what's already widely understood.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="external link" href="http://ps3.ign.com/articles/791/791533p1.html"&gt;&lt;strong&gt;Grand Theft Auto IV&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, I know what I said about &lt;a href="http://senzee.blogspot.com/2007/05/fun-fun-fun.html"&gt;GTA-type games getting boring&lt;/a&gt;.  Still, &lt;a href="http://ps3.ign.com/articles/791/791533p1.html"&gt;GTA IV looks awesome&lt;/a&gt;. And of course I'll have to play it.&lt;br /&gt;&lt;br /&gt;If I get bored by it I guess I'll only have myself to blame..&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-323998902429674085?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/323998902429674085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=323998902429674085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/323998902429674085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/323998902429674085'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/05/fun-fun-fun.html' title='Fun, Fun, Fun'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2729755568669567479</id><published>2007-04-18T08:47:00.000-04:00</published><updated>2008-02-29T11:21:39.971-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc and Irrelevant'/><title type='text'>HDTV's Golden Ratio?</title><content type='html'>Is the 16:9 aspect ratio of movies/HDTV (a ratio of 1.777..) more attractive than the 4:3 of Standard Def (1.333..) because it is closer to the &lt;a href="http://en.wikipedia.org/wiki/Golden_ratio"&gt;golden ratio (1.6180339887..)&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Rebekka says she believes that it's intentional. At first I didn't think so, but now I agree. The golden ratio is a crucial concept in architecture, the visual and musical arts, so it would make sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2729755568669567479?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2729755568669567479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2729755568669567479' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2729755568669567479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2729755568669567479'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/04/hdtvs-golden-ratio.html' title='HDTV&apos;s Golden Ratio?'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1175984718950401687</id><published>2007-04-12T02:50:00.000-04:00</published><updated>2008-02-29T11:21:39.973-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Senzee's Developer Interview Test, Q. 1</title><content type='html'>You have two hours to complete this exam.&lt;br /&gt;&lt;br /&gt;1.) Without looking at the following questions, quickly estimate how long it will take &lt;em&gt;you&lt;/em&gt; to finish this test correctly.  Please do not let your estimate exceed the time limit given for this test.&lt;br /&gt;&lt;br /&gt;..&lt;br /&gt;&lt;br /&gt;&lt;em&gt;..argh..&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1175984718950401687?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1175984718950401687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1175984718950401687' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1175984718950401687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1175984718950401687'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/04/senzees-developer-interview-test-q-1.html' title='Senzee&apos;s Developer Interview Test, Q. 1'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-2726908667885022987</id><published>2007-04-06T00:44:00.001-04:00</published><updated>2008-09-09T10:13:07.840-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>Moving Parts</title><content type='html'>This is where I intend to catalog (all?) the components of a commercial game. I will periodically update this post.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Why?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I've bought and read many books on game development. The bad ones are generally 1000 pages of C++ source code. The good, useful ones tend to fall into two categories.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Narrow and deep (books that equate 'game engines' and 'rendering engines', for example)&lt;/li&gt;&lt;li&gt;Broad and shallow (books that contain light sections on rendering, sound, networking, data structures, etc.)&lt;/li&gt;&lt;/ul&gt;Still, even books in the broad category aren't &lt;em&gt;that&lt;/em&gt; broad. The reason? Books can only be so thick. My point really is that the practice of game development includes a vast array of subspecialties and I'd kinda like to enumerate them here. Hopefully with input from my readers (that's you, Mom) that I'll add. So this list will be ultra-broad with no depth whatsoever. Depth will have to wait for subsequent posts.&lt;br /&gt;&lt;br /&gt;Now, not every game will have or need all these systems, but it's crazy just how many most games &lt;em&gt;will&lt;/em&gt; need. So, for right now, this is a brain dump and I've only just begun..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Offline&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Content Creation - tools - geometry, mesh creation&lt;br /&gt;Content Creation - tools - geometry, mesh creation - offline CSG tools&lt;br /&gt;Content Creation - tools - image creation&lt;br /&gt;Content Creation - tools - motion capture cleaning&lt;br /&gt;Content Creation - tools - higher level 'world' assembly, including assigning gameplay attributes to objects&lt;br /&gt;Content Creation - tools - sound creation/mixing/production&lt;br /&gt;Content Creation - tools - mission/level creation&lt;br /&gt;Content Creation - tools - statistical data, skill/inventory data and attributes&lt;br /&gt;Content Creation - tools - state machine creation&lt;br /&gt;Content Creation - tools - script debuggers, interactive interpreters for testing&lt;br /&gt;Data Management - managing generated code&lt;br /&gt;Data Management - asset dependency management&lt;br /&gt;Data Management - geometry processing - ie. adding attributes, triangle stripification&lt;br /&gt;Data Management - texture processing - texture packing, format conversions, bit depth conversion, etc.&lt;br /&gt;Data Management - asset databases (SQL, XML)&lt;br /&gt;Data Management - metadata collection about assets, data mining for global performance enhancement, data mining for content creation automation, etc.&lt;br /&gt;Data Management - version control systems&lt;br /&gt;Code Management - Code Generation - from asset databases, other offline sources&lt;br /&gt;Code Management - Build System - standard way of building the game for all developers&lt;br /&gt;Code Management - Library/Component Management - system(s) for cataloging, versioning and incorporating libraries and reusable components&lt;br /&gt;Code Management - version control systems&lt;br /&gt;Testing Systems and Methodologies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(much more offline/pipeline side to come; the game pipeline gets far less attention than it deserves, often with disastrous results)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Runtime&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;System - threading libraries/primitives&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;System - error handling, logging, assert handling&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;System - string handling, regular expressions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;System - elementary data structures, STL, etc.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;System - fast math primitives&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I/O - File - standard file i/o&lt;br /&gt;I/O - File - file compression/decompression&lt;br /&gt;I/O - File - loading game assets (meshes, textures, scripts, game data files, etc..)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I/O - File - low-level game asset caching&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I/O - File - asset 'packaging' into larger files&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I/O - File - object serialization support&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I/O - Network - lobby&lt;br /&gt;I/O - Network - server side&lt;br /&gt;I/O - Network - event handling (see Events below)&lt;br /&gt;I/O - Network - publishing player data to online services&lt;br /&gt;I/O - Network - web access services&lt;br /&gt;Localization Support - text databases&lt;br /&gt;Memory - efficient game asset caching&lt;br /&gt;Memory - memory pooling systems&lt;br /&gt;Memory - garbage collection systems&lt;br /&gt;Events - event handling/dispatching systems&lt;br /&gt;Events - 'replayable' game state management&lt;br /&gt;Events - game state represented as loadable/saveable data stream&lt;br /&gt;Events - game state policies - random/deterministic, etc..&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Events - game 'flow' management&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Sound - Mp3, WAV, Ogg, etc. playback&lt;br /&gt;Sound - runtime mixing, filters&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Sound - in game capture&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Sound - stereo, 5.1 surround sound&lt;br /&gt;Sound - 3d audio&lt;br /&gt;Input - console controller&lt;br /&gt;Input - force feedback (output)&lt;br /&gt;Input - spatial (Wii, SIXAXIS)&lt;br /&gt;Input - mouse&lt;br /&gt;Input - keyboard&lt;br /&gt;Input - other (Guitar Hero, EyeToy, DDR, Donkey Konga)&lt;br /&gt;Graphics - rendering - geometry processing&lt;br /&gt;Graphics - rendering - geometry processing - progressive meshes and LODs&lt;br /&gt;Graphics - rendering - geometry processing - efficient spatial subdivision&lt;br /&gt;Graphics - rendering - shader(s), per pixel lighting&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Graphics - rendering - scene graph management&lt;br /&gt;Graphics - rendering - GPU based utilities for non-graphics&lt;br /&gt;Graphics - rendering - geometry processing - in game CSG operations&lt;br /&gt;Graphics - geometry processing - human animation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Graphics - geometry processing - motion capture&lt;br /&gt;Graphics - rendering - decaling&lt;br /&gt;Graphics - rendering - particle systems&lt;br /&gt;Graphics - rendering - dynamic skyboxes/skydomes&lt;br /&gt;Graphics - images - loading/encoding image formats - DDS, TGA, JPG, etc.&lt;br /&gt;Physics - collision detection&lt;br /&gt;Physics - collision detection - geometry processing&lt;br /&gt;Physics - collision handling, mesh processing for non-rigid object effects&lt;br /&gt;Physics - ragdoll animation&lt;br /&gt;Physics - wind, environmental effects&lt;br /&gt;Gameplay/AI - script&lt;br /&gt;Gameplay/AI - state machine systems&lt;br /&gt;Gameplay/AI - classical AI algorithms&lt;br /&gt;Gameplay/AI - events - collisions, sphere of influence effects, NPC line of sight, NPC earshot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Gameplay - Cars - Damage Models&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Gameplay - Cars - Driving Models&lt;br /&gt;Geometry - Modeling&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Geometry - Inverse Kinematics&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Geometry - Rigging/Tagging/Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Geometry - Animation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Geometry - Procedural Animation (ie. Cloth, Hair, Jelly/Spring Models, etc..)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Geometry - Facial Performance and Lip Sync'ing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Rendering - Textures&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Rendering - Shaders&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Rendering - Animated textures/maps&lt;br /&gt;Video - codec(s)/playback - MPEG, MJPEG, WMV, VP6, Bink, Madcow, etc..&lt;br /&gt;Video - color space conversion&lt;br /&gt;UI - rendering&lt;br /&gt;UI - event handling systems, architecture and data&lt;br /&gt;UI - script&lt;br /&gt;UI - some games have a large amount of UI (ie. Madden, with its enormous UI) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;UI - HUDs&lt;br /&gt;Data Management - embedded SQL database (not just for plain-old IT anymore)&lt;br /&gt;Embedded Control - script languages&lt;br /&gt;Control - in-game gameplay tweaking utilities, runtime assets updating support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(more..)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Online Game Services&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Online - lobby&lt;br /&gt;Online - server side&lt;br /&gt;Online - (deterministic) player position prediction and tracking (online multiplayer)&lt;br /&gt;Online - publishing player data to online services&lt;br /&gt;Online - web access services&lt;br /&gt;Online - billing tracking for online services (online multiplayer)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Online - player data storage&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Online - accessibility from PC website&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(more to come, but I'm sleepy now and I want to go to bed..)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-2726908667885022987?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/2726908667885022987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=2726908667885022987' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2726908667885022987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/2726908667885022987'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/04/moving-parts.html' title='Moving Parts'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-6909344157177209729</id><published>2007-04-04T23:50:00.001-04:00</published><updated>2008-09-09T10:14:58.030-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Optimal Bytecode Interpretation</title><content type='html'>I always feel like I should blog more about engineering related stuff, since that's what I do all day.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;For now, my earlier plans for bytecode to C++ compilation are on hold as we're looking into more immediate gains from aggressively optimizing the interpretation. One of the downsides of the hybrid C++ compilation/bytecode interpretation approach that I have in mind is that it will require a workflow change. The C++ will eventually need to be compiled and then linked to the executable. There's a pipeline/workflow bubble there that's not appealing. Still, I think it would be fantastic to get that built for critical core libraries of script (utilities) that don't change much.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Optimizing Interpretation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Our bytecode is that of a dynamic, and (as a result of the structure of the instruction set) terribly slow language. Unfortunately, we use an off-the-shelf compiler, so we can't infer much that was in the original source but fails to show up in the bytecode output.&lt;br /&gt;&lt;br /&gt;Did some &lt;a href="http://en.wikipedia.org/wiki/Memoization"&gt;memoization&lt;/a&gt;, in this case caching of variable and function lookups, with excellent (awesome!) results.&lt;br /&gt;&lt;br /&gt;A clever universal hashing scheme for both special strings and user strings opened up a lot of possibilities.&lt;br /&gt;&lt;br /&gt;Close attention paid to string handling yielded good results.&lt;br /&gt;&lt;br /&gt;Thread synchronizaton primitives were killing us. We usually try to keep our assembly language to a bare minimum for portability sake. This translates to a handful of primitives to improve PS2 performance. But to rid ourselves of our most time consuming locks, we applied asm to a couple of critical spots where we need to read in, modify, then write out whole cache lines as atomic operations on the PowerPC machines (PS3, 360). This avoids the expense of a more heavyweight lock such as a mutex in those places and gives us back a lot of performance for multithreaded operation.&lt;br /&gt;&lt;br /&gt;Anyhow, we've significantly improved the bytecode execution performance, which is something the game teams have been asking (begging!) for for ages.&lt;br /&gt;&lt;br /&gt;Of course, it's never fast enough.. ;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-6909344157177209729?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/6909344157177209729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=6909344157177209729' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6909344157177209729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/6909344157177209729'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/04/optimal-bytecode-interpretation.html' title='Optimal Bytecode Interpretation'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-5568761908131447526</id><published>2007-03-30T22:20:00.016-04:00</published><updated>2011-06-20T15:27:56.968-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Short Stories'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='Literature'/><title type='text'>Language Vector</title><content type='html'>&lt;em&gt;"What cannot be spoken of cannot be &lt;/em&gt;&lt;em&gt;defeated&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;My &lt;a href="http://en.wikipedia.org/wiki/Cerebrum"&gt;head&lt;/a&gt; isn't clear and I pass in and out of &lt;a href="http://en.wikipedia.org/wiki/Sleep"&gt;sleep&lt;/a&gt;. I'm &lt;a href="http://en.wikipedia.org/wiki/Infection"&gt;infected&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Stay with &lt;a href="http://en.wikipedia.org/wiki/Author"&gt;me&lt;/a&gt; as I type this. I'll give you a little background. In the 1950's the last of the &lt;a href="http://en.wikipedia.org/wiki/Fore_(people)"&gt;South Fore&lt;/a&gt; engaged in &lt;a href="http://en.wikipedia.org/wiki/Joseph_Campbell"&gt;ritual&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Cannibalism"&gt;necrophagia&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Prion"&gt;prion&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Disease"&gt;disease&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Kuru_(disease)"&gt;Kuru&lt;/a&gt; recently claimed the last &lt;a href="http://en.wikipedia.org/wiki/Victim_blaming"&gt;victims&lt;/a&gt; among them. &amp;nbsp;The last that ate the &lt;a href="http://en.wikipedia.org/wiki/Prefrontal_cortex"&gt;thoughts&lt;/a&gt; of another. &amp;nbsp;Nearby, another &lt;a href="http://en.wikipedia.org/wiki/Papua_New_Guinea"&gt;Papua New Guinea&lt;/a&gt; tribe discovered a more pernicious and far more &lt;a href="http://en.wikipedia.org/wiki/Horror_(emotion)"&gt;horrifying&lt;/a&gt; threat about forty years ago. &amp;nbsp;For years, their population shook and trembled for a reason unknown to them. &amp;nbsp;They pointed to a &lt;a href="http://en.wikipedia.org/wiki/Womb"&gt;cave&lt;/a&gt; in which words approximated by the &lt;a href="http://en.wikipedia.org/wiki/English_language"&gt;English&lt;/a&gt; phrase &lt;em&gt;The &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Black_Death"&gt;&lt;em&gt;Black&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Ineffability"&gt;&lt;em&gt;Whisper&lt;/em&gt;&lt;/a&gt;&lt;em&gt; of &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Death"&gt;&lt;em&gt;Death&lt;/em&gt;&lt;/a&gt; were inscribed. &lt;em&gt;"The &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Plague"&gt;&lt;em&gt;plague&lt;/em&gt;&lt;/a&gt;&lt;em&gt; came from in there,"&lt;/em&gt; they said. &lt;br /&gt;&lt;br /&gt;8-43 0x12a_rr . ;09]]&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Globalization"&gt;Globalization&lt;/a&gt; efforts brought the &lt;a href="http://en.wikipedia.org/wiki/Deplorable_word"&gt;&lt;strong&gt;whisper&lt;/strong&gt;&lt;/a&gt; heard &lt;a href="http://en.wikipedia.org/wiki/Shot_heard_round_the_world"&gt;round the world&lt;/a&gt;. &amp;nbsp;Oh, &lt;a href="http://en.wikipedia.org/wiki/Found_poetry"&gt;look&lt;/a&gt;! On the overhead &lt;a href="http://en.wikipedia.org/wiki/Broadcasting"&gt;TV&lt;/a&gt;, that &lt;a href="http://en.wikipedia.org/wiki/Icon"&gt;image&lt;/a&gt;.. &lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;A beloved American &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Religion"&gt;&lt;em&gt;religious&lt;/em&gt;&lt;/a&gt;&lt;em&gt; leader at a political celebration passes an attractive, conservatively &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Clothing"&gt;&lt;em&gt;dressed&lt;/em&gt;&lt;/a&gt;&lt;em&gt; young woman. As the light of &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Recognition"&gt;&lt;em&gt;recognition&lt;/em&gt;&lt;/a&gt;&lt;em&gt; flares in his eyes, he warmly &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Greeting"&gt;&lt;em&gt;greets&lt;/em&gt;&lt;/a&gt;&lt;em&gt; her by &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Name"&gt;&lt;em&gt;name&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. She smiles &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Indifference"&gt;&lt;em&gt;mechanically&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Suddenly horrified he whirls around to locate the &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Video_camera"&gt;&lt;em&gt;camera&lt;/em&gt;&lt;/a&gt;&lt;em&gt; capturing an &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Certainty"&gt;&lt;em&gt;unmistakable&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Body_language"&gt;&lt;em&gt;expression&lt;/em&gt;&lt;/a&gt;&lt;em&gt; of &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Humiliation"&gt;&lt;em&gt;humiliation&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; &lt;br /&gt;&lt;br /&gt;It's on &lt;a href="http://en.wikipedia.org/wiki/MPEG2"&gt;TV&lt;/a&gt; every other day. &amp;nbsp;She was a minor &lt;a href="http://en.wikipedia.org/wiki/Porn"&gt;porn&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Film_star"&gt;star&lt;/a&gt;. &amp;nbsp;It was not that he greeted her that condemned him. &amp;nbsp;He could have &lt;a href="http://en.wikipedia.org/wiki/Legitimacy"&gt;legitimately&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Intimacy"&gt;known&lt;/a&gt; her in a &lt;a href="http://en.wikipedia.org/wiki/Mathematics"&gt;number&lt;/a&gt; of ways. &amp;nbsp;Even had he known her &lt;a href="http://en.wikipedia.org/wiki/Bible"&gt;biblically&lt;/a&gt; it would have been taken in stride. &amp;nbsp;Who cares? &amp;nbsp;It turns out his televised &lt;a href="http://en.wikipedia.org/wiki/Shame"&gt;shame&lt;/a&gt; indicted him more decisively than a &lt;a href="http://en.wikipedia.org/wiki/Living_room"&gt;living-room&lt;/a&gt; stash of indecent &lt;a href="http://en.wikipedia.org/wiki/Vhs"&gt;DVD&lt;/a&gt;&amp;nbsp;s. &amp;nbsp;After all, it is shame and little else that condemns us. &amp;nbsp;The &lt;a href="http://en.wikipedia.org/wiki/The_National_Enquirer"&gt;tabloids&lt;/a&gt; carried that &lt;a href="http://www.oceanru.com/magdalene/Christ_Appearing_to_Mary_Magdalene_anon.jpg"&gt;image&lt;/a&gt; for months next to the articles decrying &lt;a href="http://en.wikipedia.org/wiki/Ineffability"&gt;&lt;em&gt;Death's Whisper&lt;/em&gt;&lt;/a&gt;. &amp;nbsp;It doesn't matter. &amp;nbsp;The &lt;a href="http://en.wikipedia.org/wiki/Youth"&gt;young&lt;/a&gt; woman and the &lt;a href="http://en.wikipedia.org/wiki/Image:Jakob_Jordaens_002.jpg"&gt;religioso&lt;/a&gt; are dead now, &lt;a href="http://en.wikipedia.org/wiki/Victim_blaming"&gt;victims&lt;/a&gt; of their own &lt;a href="http://en.wikipedia.org/wiki/Fixation"&gt;fascination&lt;/a&gt; with their &lt;a href="http://en.wikipedia.org/wiki/Celebrity"&gt;tabloid fame&lt;/a&gt; and more directly, victims of its &lt;a href="http://en.wikipedia.org/wiki/Journalism"&gt;adjacent&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Publishing"&gt;coverage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this case it is &lt;a href="http://en.wikipedia.org/wiki/Knowledge"&gt;knowledge&lt;/a&gt; that destroys. dsf6 -saf ;; This is not a disease borne by a &lt;a href="http://en.wikipedia.org/wiki/Bacterium"&gt;bacterium&lt;/a&gt;, a &lt;a href="http://en.wikipedia.org/wiki/Virus"&gt;virus&lt;/a&gt;, or a prion. See, this &lt;a href="http://en.wikipedia.org/wiki/Speech"&gt;whisper&lt;/a&gt; is a disease carried by the most insidious of &lt;a href="http://en.wikipedia.org/wiki/Vector_(biology)"&gt;vectors&lt;/a&gt; - &lt;a href="http://en.wikipedia.org/wiki/Language"&gt;language&lt;/a&gt; itself. To simply &lt;a href="http://en.wikipedia.org/wiki/Understanding"&gt;&lt;em&gt;understand what it is&lt;/em&gt;&lt;/a&gt; is to be &lt;a href="http://en.wikipedia.org/wiki/Terminal_illness"&gt;irreversibly&lt;/a&gt; afflicted. What cannot be spoken of cannot be &lt;a href="http://en.wikipedia.org/wiki/Inoculation"&gt;defeated&lt;/a&gt;. I am condemned already and by writing I damn my readers. But there will be no &lt;a href="http://en.wikipedia.org/wiki/Reading"&gt;readers&lt;/a&gt;.. &lt;br /&gt;&lt;br /&gt;Some said it was the &lt;a href="http://en.wikipedia.org/wiki/YHVH"&gt;Creator&lt;/a&gt;, dropping in a &lt;a href="http://en.wikipedia.org/wiki/Kill_switch"&gt;kill switch&lt;/a&gt; to flip at the turn of a phrase. &amp;nbsp;It's adaptive. They named the disease in the &lt;a href="http://en.wikipedia.org/wiki/Native_language"&gt;native tongue&lt;/a&gt; and it killed them. Scientists described it in &lt;a href="http://en.wikipedia.org/wiki/John_Dos_Passos"&gt;English&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Albert_Camus"&gt;French&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Borges"&gt;Spanish&lt;/a&gt;. It killed them. The blind read of it in &lt;a href="http://en.wikipedia.org/wiki/Braille"&gt;Braille&lt;/a&gt;, the deaf signed in &lt;a href="http://en.wikipedia.org/wiki/American_Sign_Language"&gt;ASL&lt;/a&gt;. Experts from around the world spewed a rainbow of &lt;a href="http://en.wikipedia.org/wiki/Euphemisms#Doublespeak"&gt;euphemisms&lt;/a&gt;. It killed &lt;a href="http://en.wikipedia.org/wiki/Million"&gt;millions&lt;/a&gt;. It is not bound to any particular &lt;a href="http://en.wikipedia.org/wiki/Lexical_analysis"&gt;lexical&lt;/a&gt; form - perhaps its representation in the brain creates the disease &lt;a href="http://en.wikipedia.org/wiki/Ex_nihilo"&gt;ex nihilo&lt;/a&gt;. I don't really know. We did not discover the &lt;a href="http://en.wikipedia.org/wiki/Machine"&gt;mechanism&lt;/a&gt; that drives this &lt;a href="http://en.wikipedia.org/wiki/Pandemic"&gt;epidemic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It may be strange to think of language spreading disease, but it is not unique. &amp;nbsp;What is it that &lt;a href="http://en.wikipedia.org/wiki/Virus"&gt;viral machines&lt;/a&gt; inject into living cells if not RNA/DNA coded &lt;a href="http://en.wikipedia.org/wiki/Assembly_language"&gt;assembly language&lt;/a&gt; pathogens? &amp;nbsp;I know that machines aren't affected because &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;words&lt;/a&gt; are transparent to them. Still, &lt;a href="http://en.wikipedia.org/wiki/Computer_language"&gt;machines&lt;/a&gt; played the &lt;a href="http://en.wikipedia.org/wiki/Lever"&gt;pivotal&lt;/a&gt; role in the spread -&amp;amp;89sd(( of the disease as its &lt;a href="http://en.wikipedia.org/wiki/Asymptomatic_carrier"&gt;immune and efficient carriers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Can you &lt;a href="http://en.wikipedia.org/wiki/Imagination"&gt;imagine&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Loneliness"&gt;(no, you can't - because there is no you)&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Fear"&gt;seeing&lt;/a&gt; all those around you die for an &lt;a href="http://en.wikipedia.org/wiki/Death_certificate"&gt;&lt;em&gt;unknown cause of death&lt;/em&gt;&lt;/a&gt;? &amp;nbsp;As death certificate handlers really &lt;a href="http://en.wikipedia.org/wiki/Comprehension"&gt;understood&lt;/a&gt; the meaning of &lt;em&gt;unknown cause of death&lt;/em&gt; they came down &lt;a href="http://en.wikipedia.org/wiki/Keyword_(computer_programming)"&gt;with&lt;/a&gt; the disease in droves. &amp;nbsp;Suddenly, the certificates began listing things like &lt;a href="http://en.wikipedia.org/wiki/Onychocryptosis"&gt;&lt;em&gt;Onychocryptosis&lt;/em&gt;&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Theft"&gt;&lt;em&gt;Internecivus raptus&lt;/em&gt;&lt;/a&gt;. &amp;nbsp;Those who &lt;a href="http://en.wikipedia.org/wiki/Terror"&gt;witness&lt;/a&gt; the deaths but don't &lt;a href="http://en.wikipedia.org/wiki/Fear"&gt;know&lt;/a&gt; the cause are inexorably driven to discover it. &amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Fear"&gt;Most&lt;/a&gt; of) those who &lt;a href="http://en.wikipedia.org/wiki/Fear"&gt;know&lt;/a&gt;, and are infected, try desperately to not &lt;a href="http://en.wikipedia.org/wiki/MPEG2"&gt;reveal&lt;/a&gt; it to anyone and have &lt;a href="http://en.wikipedia.org/wiki/Fear"&gt;always&lt;/a&gt; failed. &amp;nbsp;Now though, strangely, I'm compelled to type this even if I have to type with the &lt;a href="http://en.wikipedia.org/wiki/Keychain"&gt;keyboard&lt;/a&gt; upside down to keep the &lt;a href="http://en.wikipedia.org/wiki/Sangria"&gt;blood&lt;/a&gt; from my hands from running into it. &amp;nbsp;I can no longer hope &lt;a href="http://en.wikipedia.org/wiki/Keyword_(computer_programming)"&gt;for&lt;/a&gt; any resolution but the &lt;a href="http://en.wikipedia.org/wiki/Extinction"&gt;obvious&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And I wait for that &lt;a href="http://en.wikipedia.org/wiki/Extinction"&gt;resolution&lt;/a&gt; even as the &lt;a href="http://en.wikipedia.org/wiki/Symptomatic"&gt;asymptomatic&lt;/a&gt; machines &lt;em&gt;auto-&lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Hypertext"&gt;&lt;em&gt;hyperlink&lt;/em&gt;&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/This_(computer_science)"&gt;this&lt;/a&gt; document. No future, fatal question will go &lt;a href="http://en.wikipedia.org/wiki/Expert_system"&gt;unanswered&lt;/a&gt; actio&lt;a href="http://en.wikipedia.org/wiki/Hyatt_Regency_walkway_collapse"&gt;n diminishes c0ntracts freedom entered in&lt;/a&gt;valid throu&lt;a href="http://en.wikipedia.org/wiki/Signal_to_noise"&gt;gh fear judged excuses penalty atta&lt;/a&gt;ched contrary vectpr for reflex arc &lt;a href="http://en.wikipedia.org/wiki/Stimulus"&gt;st1mulus&lt;/a&gt; unexpe&lt;a href="http://en.wikipedia.org/wiki/Fault_(technology)"&gt;xedly 0kers afwe ~pwn&lt;/a&gt;d xasl &lt;a href="http://en.wikipedia.org/wiki/Guanine"&gt;g&lt;/a&gt;atattaccaa&lt;a href="http://en.wikipedia.org/wiki/Guanine"&gt;ggg&lt;/a&gt;tc lin&lt;a href="http://en.wikipedia.org/wiki/Catastrophic_failure"&gt;k &amp;lt;&amp;gt; link 03&lt;/a&gt;2 . . .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Copyright"&gt;(story copyright (c) 2007 Paul D. Senzee)&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-5568761908131447526?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/5568761908131447526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=5568761908131447526' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5568761908131447526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5568761908131447526'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/03/language-vector.html' title='Language Vector'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-5068250735409482712</id><published>2007-03-21T18:59:00.001-04:00</published><updated>2008-09-09T10:15:44.776-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Bytecode to Native Compilation</title><content type='html'>At work, some of the software I develop uses a bytecode interpreter.  And, as always, we need better performance from the whole system.  &lt;span class="fullpost"&gt;So I'm looking into bytecode-to-native (in this case C++) compilation.  I've done this before, with embedded Lisp-based languages and there are a number of compilers available that do this for Java (GCC has a back-end for this), C#, Lisp and its derivatives (Bigloo for Scheme, for instance).  Compiling to C or C++ is great as it serves as a sort of portable assembly language and it's possible to leverage further the fine optimization skillz of modern C/C++ compilers.  I'll report on this when I make some progress - if I don't get pulled off onto something else.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-5068250735409482712?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/5068250735409482712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=5068250735409482712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5068250735409482712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/5068250735409482712'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/03/bytecode-to-native-compilation.html' title='Bytecode to Native Compilation'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3164053696994418573</id><published>2007-02-28T17:17:00.001-05:00</published><updated>2008-09-09T10:18:12.063-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Jet Engines</title><content type='html'>&lt;p&gt;Creating high-performance technology in a competitive field? Managing your developers' weaknesses and ignoring their strengths may cost you. &lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Let me illustrate. &lt;/p&gt;&lt;p&gt;Iron accounts for 35% of the Earth's mass. And from iron comes carbon steel (iron and carbon) which accounts for 90% of steel production. As metals go, steel is cheap, abundant and easy to work with. Steel is versatile and &lt;em&gt;good&lt;/em&gt; at most everything metals do. If steel was your employee, it would be a damn fine one. You might want all your employees to be &lt;em&gt;just like steel&lt;/em&gt;. After all, compared to other materials, it has few weaknesses - but also few extraordinary strengths. &lt;/p&gt;&lt;p&gt;Steel can't do everything. It distorts at extreme temperatures. Steel is not brittle like ceramics but it's also not nearly as hard. It is much cheaper than titanium but weighs almost twice as much. It is a poorer electrical conductor than gold. And of course, steel's strength and hardness in extreme conditions doesn't hold a candle to the single crystal nickel-titanium superalloys* from which they carve jet turbine blades - albeit at enormous cost. &lt;/p&gt;&lt;p&gt;Every one of these other materials demonstrates incredibly high performance in a narrow space and is either prohibitively expensive or ineffective in other arenas. &lt;/p&gt;&lt;p&gt;Even so, it is &lt;em&gt;impossible&lt;/em&gt; to build a modern, efficient jet engine with just typical carbon steel. &lt;/p&gt;&lt;p&gt;The bottom line?&lt;/p&gt;&lt;p&gt;Profound strength and profound weakness often come together. Yet without a spectrum of those profound strengths at your disposal, it won't be possible to develop cutting-edge technology at a competitive level. &lt;/p&gt;&lt;p&gt;I don't mean to say that a well-rounded developer can't also have profound strengths - I know several of these people. It's a no-brainer that you need to do what it takes to keep these gems. Reward reliable and well-rounded developers for their lack of weaknesses and, &lt;em&gt;if you need their contributions&lt;/em&gt;, reward brittle, unorganized, high-maintenance, socially-inept (insert favorite weakness here) developers for their strengths. Or someone else will.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;* Some of single crystal superalloys are nickel-iron alloys. If iron is the dominant metal in the alloy, these superalloys might be considered steel.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;For More Information&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/Discover-Your-Strengths-Marcus-Buckingham/dp/0743201140/sr=8-1/qid=1172763449/ref=pd_bbs_sr_1/102-1799995-3382565?ie=UTF8&amp;amp;s=books"&gt;&lt;span style="font-size:85%;"&gt;Now, Discover Your Strengths&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Rolls Royce Trent Aeroengine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.msm.cam.ac.uk/phase-trans/mphil/Trent1/"&gt;&lt;span style="font-size:85%;"&gt;Excellent PowerPoint of the Rolls Royce Trent Aeroengine series commercial jet engines&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.msm.cam.ac.uk/phase-trans/mphil/Trent1/sld024.htm"&gt;&lt;span style="font-size:85%;"&gt;Rolls Royce Trent Aeroengine engine materials&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Wikipedia: &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Iron"&gt;&lt;span style="font-size:85%;"&gt;Iron&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Steel"&gt;&lt;span style="font-size:85%;"&gt;Steel&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Ceramic"&gt;&lt;span style="font-size:85%;"&gt;Ceramic&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Cermet"&gt;&lt;span style="font-size:85%;"&gt;Cermet&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Silicon_carbide"&gt;&lt;span style="font-size:85%;"&gt;Silicon Carbide&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Superalloy"&gt;&lt;span style="font-size:85%;"&gt;Superalloys&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Amorphous_metal"&gt;&lt;span style="font-size:85%;"&gt;Complex Metal Alloy&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Composites"&gt;&lt;span style="font-size:85%;"&gt;Composites&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://doc.tms.org/ezMerchant/prodtms.nsf/ProductLookupItemID/04-576X-35/$FILE/04-576X-35F.pdf?OpenElement"&gt;&lt;span style="font-size:85%;"&gt;Development of Single Crystal Superalloys&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3164053696994418573?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3164053696994418573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3164053696994418573' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3164053696994418573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3164053696994418573'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/jet-engines.html' title='Jet Engines'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-3245254187551190003</id><published>2007-02-06T23:52:00.000-05:00</published><updated>2008-02-29T11:24:18.137-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><title type='text'>Senzee's Rule of Interface Complexity</title><content type='html'>If what an interface is supposed to do, how it's supposed to do it and the role it plays in a system is not apparent in five minutes of staring at it, it's too complex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-3245254187551190003?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/3245254187551190003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=3245254187551190003' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3245254187551190003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/3245254187551190003'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/senzees-rule-of-interface-complexity.html' title='Senzee&apos;s Rule of Interface Complexity'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8298365491067991930</id><published>2007-02-06T14:54:00.001-05:00</published><updated>2008-09-09T10:18:54.966-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>The Impossible Dream #2</title><content type='html'>&lt;a href="http://senzee.blogspot.com/2007/02/impossible-dream-1.html"&gt;Previous: The Impossible Dream #1&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Ground Rules&lt;/strong&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Mantra 1:&lt;/strong&gt; &lt;em&gt;The mechanic first, then the game.&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;It's no fun putting blood, sweat and tears into an unfun game.  We structure the game around a solid mechanic - prototype first to find addictive key element(s) and elaborate.  &lt;a href="http://senzee.blogspot.com/2006/12/explorers-and-game-of-tag.html"&gt;Tag&lt;/a&gt; is one key element we've identified.&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Mantra 2:&lt;/strong&gt; &lt;em&gt;Build a game, not an engine.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I've seen a number of home and indie game projects go south stuck at the "let's build our engine" phase.  Nothing overly general - we build into the code what we need to do the trick.  I'm not saying there's no place for useful abstraction here, I'm saying that a general purpose rendering or game &lt;em&gt;engine&lt;/em&gt; is not our goal.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mantra 3:&lt;/strong&gt; &lt;em&gt;Fit the design to resources at hand.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Building an open world game at all is our first violation of this.  Still, we need to embrace this reality instead of fighting it.  Operating with restricted resources can force us to come up with creative solutions to problems we otherwise wouldn't have looked at.  Of course, it may also prevent us from finishing anything ever.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mantra 4&lt;/strong&gt;: &lt;em&gt;Don't underengineer or overengineer, but if you must choose one, underengineer&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Why?  Because underengineering is easier to fix.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A Unflinching View&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let's start the impossible dream by looking, somewhat realistically, at our available resources and the strengths and weaknesses of our position.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A few development hours a month divided among game design, software development and content creation. &lt;/li&gt;&lt;li&gt;A powerful target platform (PC). &lt;/li&gt;&lt;li&gt;Development tools - Visual C++ 2003. &lt;/li&gt;&lt;li&gt;Direct3D and its auxiliary libraries (see &lt;em&gt;No need for portability&lt;/em&gt; in Strengths, below) .&lt;/li&gt;&lt;li&gt;Third party content creation tools - Milkshape 3D (registered), Unwrap3D (registered), POV-Ray.&lt;/li&gt;&lt;li&gt;Open source and free resources on the web for game development.&lt;/li&gt;&lt;li&gt;Free content from other sources that can be legally used in our game. &lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Strong software development skills. &lt;/li&gt;&lt;li&gt;A powerful target platform (PC). &lt;/li&gt;&lt;li&gt;No need for portability.&lt;/li&gt;&lt;li&gt;A great deal of freely available software for offline and runtime use.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Poor content creation ability.&lt;/li&gt;&lt;li&gt;Few hours to dedicate to the project - it'll be done in like one hundred years.&lt;/li&gt;&lt;li&gt;Little monetary investment.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Strategies&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Make the most of our particular set of resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simplicity - a simple, compelling core game.  No minigames, nothing like that.  &lt;/li&gt;&lt;li&gt;Prototype the game mechanic first.    &lt;/li&gt;&lt;li&gt;Automation - machine generated content, mostly offline, possibly at runtime.  &lt;/li&gt;&lt;li&gt;Reuse/scavenge (to a point) freely available content generation tools and software.  &lt;/li&gt;&lt;li&gt;Reuse/scavenge (to a point) freely available software for the runtime.  &lt;/li&gt;&lt;li&gt;Seek out free content that we can legally use in game.  &lt;/li&gt;&lt;li&gt;Creatively adapt the game design, including character and plot, to cater to our strengths.&lt;/li&gt;&lt;li&gt;Use a hooded figure for the main character, allowing us to skirt the animation issue for the main character.  We can use a simple segmented model for NPC's.    We can animate the hood &amp; clothing of the main character with cloth animation, which is CPU-intensive, but nearly content-free.  &lt;/li&gt;&lt;li&gt;Use public domain (classical, folk music?) music for the soundtrack.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Oh, and yes, there's so much more to come.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8298365491067991930?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8298365491067991930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8298365491067991930' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8298365491067991930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8298365491067991930'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/impossible-dream-2.html' title='The Impossible Dream #2'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-636227816193536666</id><published>2007-02-05T20:41:00.004-05:00</published><updated>2010-02-26T11:26:15.131-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Red 5 Studios'/><title type='text'>Red 5's Pitch</title><content type='html'>&lt;div&gt;(First off, special thanks go to Ryan Burkett who allowed me to use his digital camera to photograph these items.)&lt;br /&gt;&lt;br /&gt;Last week I received a Fed-Ex package at my desk. &lt;span class="fullpost"&gt;All excited to get a package, (kind of like those people who win on the radio and say "I never win anything!!") I grabbed Ryan Burkett to open it with me. Inside there was a ~3"x~6"x~1" paper box that looked like some sort of puzzle. The box was orange and black with an artist's rendering of the birth of a planet. It carried a large white digit 1 in the lower left-hand corner. Small print above the 1 read:&lt;br /&gt;&lt;br /&gt;R5L_001 &lt;span style="font-size:78%;"&gt;TRACE&lt;/span&gt;&lt;br /&gt;not the end&lt;br /&gt;a beginning&lt;br /&gt;a new beginning&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/r5s_puzzle_box.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/r5s_puzzle_box.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One corner was cut out and a slightly smaller box was visible inside. I opened the first and pulled out the second. It was similar, with olive green instead of orange and a large 2 in the corner. It sported an illustration of a shard of molten rock (or perhaps the broken wing of a spacecraft?) and read:&lt;br /&gt;&lt;br /&gt;R5L_002 &lt;span style="font-size:78%;"&gt;TRACE&lt;/span&gt;&lt;br /&gt;not a new world&lt;br /&gt;but an old world&lt;br /&gt;made new&lt;br /&gt;&lt;br /&gt;So, I figured this is some kind of &lt;a href="http://en.wikipedia.org/wiki/Matryoshka"&gt;Matryoshka doll&lt;/a&gt; package. I pulled out the third box, sea-green, marked with a large white 3 and a primordial underwater scene.&lt;br /&gt;&lt;br /&gt;R5L_003 &lt;span style="font-size:78%;"&gt;TRACE&lt;/span&gt;&lt;br /&gt;no change is peaceful&lt;br /&gt;and through life struggles&lt;br /&gt;it also thrives&lt;br /&gt;&lt;br /&gt;Out came number four, peach-orange with a river of lava flowing through the gaping maw of a mountain pass.&lt;br /&gt;&lt;br /&gt;R5L_004 &lt;span style="font-size:78%;"&gt;TRACE&lt;/span&gt;&lt;br /&gt;to forge a new path&lt;br /&gt;through the darkness&lt;br /&gt;to rise to the call of glory&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/r5s_box1234.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://www.geocities.com/psenzee/images/r5s_box1234.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then finally number five, red with the &lt;a href="http://www.red5studios.com/"&gt;image of a blue elf from Red 5's website&lt;/a&gt; and the text:&lt;br /&gt;&lt;br /&gt;R5L_005 &lt;span style="font-size:78%;"&gt;TRACE&lt;/span&gt;&lt;br /&gt;not the end&lt;br /&gt;a new beginning&lt;br /&gt;with new eyes to greet it&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/r5s_box5.jpg"&gt;&lt;img style="FLOAT: none; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/r5s_box5.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The fifth opens like a book or a box of software and inside was an &lt;strong&gt;iPod Shuffle&lt;/strong&gt; with my name engraved on it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/r5s_invite.gif"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://www.geocities.com/psenzee/images/r5s_invite.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/images/r5s_box5_open.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand" alt="" src="http://www.psenzee.com/images/r5s_box5_open.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now pausing for a moment, it occurred to me that everything about this is loaded with references that I don't think I fully understand. The images and text seem sort of Genesis with the days of creation and all, but that's six days, not five. So I'm not sure if that's the reference, but it seems an apt associaton with the creation of a new studio, a new game and the new changes of the people's lives who are coming to join Red 5.&lt;br /&gt;&lt;br /&gt;So I power up the iPod and listen to track 1.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Paul, this is Mark Kern, President of Red 5 Studios and former team lead for World of Warcraft. I came across your blog on the net and was impressed with the depth of your inquisitiveness regarding game design, programming and mathematics. Your work at Tiburon is impressive and we'd love the chance to meet you. At Red 5 we're assembling a team of incredibly talented individuals dedicated to pushing the envelope in online entertainment. We're building a new type of game company and a new type of game. And we believe you're someone who just might fit into the Red 5 family. Log into red5studios.com and enter the code found engraved on this iPod. We'll tell you all about it. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;So I pull up the site:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Who are we?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Red 5 is a creator-owned, newly formed studio driven to create new and orginal massively multiplayer online entertainment. We are world-builders, storytellers and game makers. We own what we make, and we have the financial backing to stand on our own.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;So Here’s Why We’re Calling.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Red 5's CEO came across your blog and was impressed with the depth of your inquisitiveness regarding game design, programming, and mathematics. Your work at Tiburon is impressive, and we'd love the chance to meet you.&lt;br /&gt;&lt;br /&gt;Because of this, you are one of one-hundred people in the industry we've invited to check out Red 5 Studios. We've played your games, and respect your skills.&lt;br /&gt;&lt;br /&gt;Paul, we are hiring, so feel free to take a look at our open positions. We had a few in mind that might be a good fit, but we really believe in people and, specifically, your potential. If you don't see something that fits, we can talk about tailoring something to your specific talents.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Pretty impressive pitch, huh? Certainly &lt;em&gt;very&lt;/em&gt; flattering!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://senzee.blogspot.com/2007/02/red-5-studios.html"&gt;Here's the original post&lt;/a&gt;.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-636227816193536666?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://senzee.blogspot.com/2007/02/red-5-studios.html' title='Red 5&apos;s Pitch'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/636227816193536666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=636227816193536666' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/636227816193536666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/636227816193536666'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/red-5s-pitch.html' title='Red 5&apos;s Pitch'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-1607964662032604218</id><published>2007-02-02T17:26:00.002-05:00</published><updated>2010-02-26T11:24:20.156-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='The Impossible Dream'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>The Impossible Dream #1</title><content type='html'>&lt;strong&gt;True Story&lt;/strong&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;In Mexico I met a poor farmer named Miguelito who lived in the little town of Metepec (&lt;a href="http://en.wikipedia.org/wiki/Atlixco"&gt;Atlixco&lt;/a&gt;), &lt;a href="http://en.wikipedia.org/wiki/Puebla"&gt;Puebla&lt;/a&gt;.  Many years before, in a vision, the &lt;a href="http://en.wikipedia.org/wiki/Virgin_of_Guadalupe"&gt;Holy Virgin of Guadalupe&lt;/a&gt; entrusted him to build a cathedral, high up on the hill above the town.  She promised him that he would not die until he'd set the final stone.  He quickly enlisted the help of the townspeople and over 15 years constructed a small, beautiful hilltop church.  At the time Miguelito showed me the rust-colored church it was nearly complete and he explained that this meant that his time was near.  His mistress had been generous enough - Miguel was &lt;strong&gt;104&lt;/strong&gt; years old!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;My Impossible Dream - My Own Open World Game&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So, is it possible, working a few scant hours each week on evenings and weekends to build a (simple) open-world game by myself?  We shall see.  I've &lt;em&gt;occasionally&lt;/em&gt; been working on &lt;a href="http://www.psenzee.com/zocalo/index.html"&gt;the game&lt;/a&gt; since about a year before I came to EA but I think I'll make a more public spectacle out of it on this blog - to keep me motivated.&lt;br /&gt;&lt;br /&gt;So why do I even want to do this?  &lt;em&gt;Because &lt;strong&gt;it's impossible&lt;/strong&gt;.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/zocalo/index.html"&gt;Some prototype screenshots&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/zocalo/concept.html"&gt;Some generated content and concepts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Next Time&lt;/strong&gt;: in the next installment of &lt;em&gt;The Impossible Dream&lt;/em&gt;, we'll look at &lt;em&gt;what&lt;/em&gt; this game will be about and &lt;em&gt;how&lt;/em&gt; we will use automatic content generation to build our world.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-1607964662032604218?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/1607964662032604218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=1607964662032604218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1607964662032604218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/1607964662032604218'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/impossible-dream-1.html' title='The Impossible Dream #1'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-8470311536888979880</id><published>2007-02-01T16:50:00.001-05:00</published><updated>2008-09-09T10:22:02.601-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Red 5 Studios'/><title type='text'>Red 5 Studios</title><content type='html'>This week I received a package from &lt;a href="http://www.edery.org/?page_id=102"&gt;Mark Kern&lt;/a&gt;, former team lead of &lt;a href="http://en.wikipedia.org/wiki/World_of_warcraft"&gt;World of Warcraft&lt;/a&gt; and current CEO of &lt;a href="http://en.wikipedia.org/wiki/Red_5_Studios"&gt;Red 5 Studios&lt;/a&gt; who is, it turns out, &lt;strong&gt;a fan of my blog&lt;/strong&gt;!  Before I delve into more, let me say that Mark and company have the coolest recruitment strategy I've ever seen.  And although I'm not looking to leave EA Tiburon at this point in my career, perhaps there's a future out there..&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Mark and I spoke for some time about his company.  Red 5 aims for the center of the emerging MMO phenomenon in ways that transcend east-west cultural boundaries to create an experience as compelling for Chinese and Korean gaming communities as it is for American, European and Japanese communities.  What's more, Red 5 is staffed with a large number of ex-&lt;a href="http://en.wikipedia.org/wiki/Blizzard_Entertainment"&gt;Blizzard&lt;/a&gt; game makers who know how to build the kinds of &lt;a href="http://en.wikipedia.org/wiki/MMOG"&gt;MMOG&lt;/a&gt;s that can do this.  As an American company at ease with Asian cultures, Red 5 has given an enormous amount of thought to handling the cultural nuances to make this work.  I'm not an expert when it comes to MMOs, but I'm convinced.  If there's a developer to back in the MMO space, it's these guys.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gamespot.com/news/6163010.html"&gt;Red 5 Taps Some Green&lt;/a&gt;&lt;br /&gt;&lt;a class=" snap_nopreview" title="Permanent Link to Red 5 Studios Aims To Be Pixar of Online Gaming" href="http://www.techcrunch.com/2006/12/11/red-5-studios-aims-to-be-pixar-of-onling-gaming/" rel="bookmark" snap_preview_added="no"&gt;Red 5 Studios Aims To Be Pixar of Online Gaming&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-8470311536888979880?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Red_5_Studios' title='Red 5 Studios'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/8470311536888979880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=8470311536888979880' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8470311536888979880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/8470311536888979880'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/02/red-5-studios.html' title='Red 5 Studios'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116969116419493921</id><published>2007-01-24T20:08:00.002-05:00</published><updated>2010-02-26T11:22:20.275-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poker Hand Evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>7</title><content type='html'>&lt;em&gt;(Updated 7/10/07)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Inspired by the interest in &lt;a href="http://senzee.blogspot.com/2006/06/some-perfect-hash.html"&gt;my 5-card poker hand code&lt;/a&gt; that plugs into Cactus Kev's evaluator, I've decided to revisit my unholy 7-card evaluator and make a faster?, cleaner one that I can then post up here.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;For the 5-card hash I used &lt;a href="http://burtleburtle.net/bob/index.html"&gt;Bob Jenkin's Perfect Hashing&lt;/a&gt; code. Check out his excellent site for great perfect hashing code &amp; ideas.&lt;br /&gt;&lt;br /&gt;My current 7 card evaluator first determines if there is a flush. If not, it looks up the final value in a 13 * 13 * 13 * 13 * 13 * 13 * 13 (13^7, 63M entries) precalc'd table. Arghh! If it is a flush, though, it evaluates all 21 combinations (7 choose 5) in the normal (albeit optimized) way.&lt;br /&gt;&lt;br /&gt;But this is not how I want my grandchildren to remember my code. Let's think about other options. Now { 52 choose 7 } yields about 133 million possiblities, right? The first crucial step in thinking about optimizing the seven hand evaluation is figuring out a way to efficiently map every unique set of 7 out of 52 cards to one unique number of the 133 million possiblilities.&lt;br /&gt;&lt;br /&gt;As it turns out, I've got some code to do that. Nevertheless, I need to do a little cleanup before I post that. So look for "7 Part II" sometime soon.. ;)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Part II: 52 Choose 7&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;As promised, code to map any 7 of 52 items (7 of 52 bits) to a unique index in the range of 0-133M (52 choose 7).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/index52c7.h"&gt;index52c7.h&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This, of course, could be used for a super-fast 7 card hand evaluator with a precomputed table of size 266mb.&lt;br /&gt;&lt;br /&gt;Jing, commenting below mentions that a &lt;a href="http://forumserver.twoplustwo.com/showflat.php?Cat=0&amp;Number=8513906&amp;amp;amp;amp;amp;page=2&amp;fpart=1&amp;amp;vc=1"&gt;2+2 forum&lt;/a&gt; has some super-fast seven hand evaluators. Glancing briefly at the site I notice claims of 12.5 cycles per evaluation, which seems too good to be true. After all, a single out-of-cache table lookup can &lt;a href="http://senzee.blogspot.com/2006/05/data-access-latency.html"&gt;cost much more than that&lt;/a&gt;. But if it is true - sweet!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Some Clarifications&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Andy Reagan emailed me and made some excellent points concerning the readability of &lt;em&gt;index52c7.h&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"[It's hard] to understand what the code was doing without comments and with the generalized table and variable names.."&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;I apologize for that.  Actually, I wrote another program to generate this file, which is one of the reasons why it's so obtuse.  It would probably be a good idea to publish the generator program as well.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"What does the function index52c7 do?"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Here's the reasoning for &lt;em&gt;index52c7&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;We can completely represent a hand of 7 cards of 52 with a single 52-bit number with 7 bits set.  We assign each possible card in a deck a number between 1 and 52, inclusive.  For example, the Queen/Hearts might be 43 and 2/Spades might be 17.  Then, we take a 64-bit number (large enough to contain the 52-bits) and set a bit for each of the 7 cards we have.  If two of the seven cards we have are Queen/Hearts and 2/Spades we'd set bits 43 and 17 along with the bits that correspond to the other five cards.&lt;br /&gt;&lt;br /&gt;Now, if we had unlimited memory, we could just use this number as an index into an enormous and very sparse array.  Unfortunately, this array would have 2^52 (&lt;em&gt;4.5 quadrillion&lt;/em&gt;) entries. Assuming two bytes per entry, that would require &lt;em&gt;9 petabytes&lt;/em&gt; of memory!  So we need to somehow hash this number into a much smaller space. It turns out that the number of possible combinations of 7 items among 52 is about 133 million (52 choose 7), so ideally, we could somehow hash the 52 bit number into a number between 0 and 133 million that uniquely identifies a given hand.&lt;br /&gt;&lt;br /&gt;That's what &lt;em&gt;index52c7&lt;/em&gt; does.  It translates the 52 bit hand representation into a much smaller, but still unique number.  At two bytes per entry, that gives us a table of 266 megabytes, which is large and in certain cases inconvenient, but certainly doable.&lt;br /&gt;&lt;br /&gt;Using, say, Cactus Kev's code to evaluate each possible 7-card hand, we'd first generate the 266MB table and populate it by looking up the corresponding index with &lt;em&gt;index52c7&lt;/em&gt;.  Now that the table's fully populated, we can just pass &lt;em&gt;index52c7&lt;/em&gt; the 52-bit number and use the resulting index to pull the answer straight out of the array.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116969116419493921?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116969116419493921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116969116419493921' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116969116419493921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116969116419493921'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2007/01/7.html' title='7'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116555499424888121</id><published>2006-12-08T00:15:00.000-05:00</published><updated>2008-02-29T11:24:18.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Floating Point</title><content type='html'>&lt;a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html"&gt;An excellent article on working with floating point numbers.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116555499424888121?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116555499424888121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116555499424888121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116555499424888121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116555499424888121'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/floating-point.html' title='Floating Point'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116537554579653695</id><published>2006-12-05T21:29:00.001-05:00</published><updated>2008-09-09T10:23:33.308-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>Explorers and the Game of Tag</title><content type='html'>I'm partial to games of exploration. The &lt;em&gt;Ultimas&lt;/em&gt; and their relatives were my early favorites. These days, I play games like &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Grand_Theft_Auto_III"&gt;Grand Theft Auto&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;Godfather&lt;/em&gt;, &lt;em&gt;Spider-Man 2&lt;/em&gt; and &lt;em&gt;Oblivion&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Why? It's the joy of discovery&lt;span class="fullpost"&gt; - the &lt;em&gt;&lt;a href="http://www.amazon.com/s/ref=nb_ss_gw/105-2431633-7858842?url=search-alias%3Daps&amp;field-keywords=The+Pleasure+of+Finding+Things+Out"&gt;pleasure of finding things out&lt;/a&gt;&lt;/em&gt;. So what makes a great &lt;em&gt;open world&lt;/em&gt; game? In the context of video games, an open world is a &lt;a href="http://en.wikipedia.org/wiki/Game#Definitions"&gt;toy&lt;/a&gt; upon which a game can be built. So first, &lt;em&gt;what makes a great open world?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Big, not &lt;em&gt;too&lt;/em&gt; big&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It's no secret that we measure the size of our universe in the time it takes to cross it. The world shrinks with the inventions of the railroad, the automobile and the airplane. Unlike other open world games, the world of &lt;em&gt;Superman Returns&lt;/em&gt; seems in turns enormous and tiny, depending on whether you are walking or flying at supersonic speeds. When a world is too big, we can spend all of our time simply getting around. Too small and it seems cramped and unimaginitive.&lt;br /&gt;&lt;br /&gt;There must be some novelty to every distinct area or region. The 1987 game &lt;a href="http://en.wikipedia.org/wiki/The_Faery_Tale_Adventure"&gt;The Faery Tale&lt;/a&gt; sported a world of over 17,000 screens. There were so many repeating patterns of landscape and it took so long to cross that it was hard to stay interested in &lt;em&gt;exploring&lt;/em&gt; the world. In an interview with Game Informer, Radical, in creating &lt;em&gt;Hulk: Ultimate Destruction,&lt;/em&gt; specifically addressed this issue of variety.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mechanics&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The &lt;em&gt;mechanics&lt;/em&gt; of a world are crucial to its experience. They are the laws of the game's universe. It is important that the game itself cannot subvert these rules. In GTA, this includes the way cars move collide and interact, that any car can be rigged with bombs and the general behavior of the people and objects that inhabit Liberty City. Another important mechanic in GTA is police response to player actions. The world of GTA is rich with mechanics largely orthogonal in purpose. It is this richness that makes GTA great. In Spider-Man 2, &lt;em&gt;the&lt;/em&gt; central mechanic is web-swinging. The world of Spider-Man 2 is designed to be experienced through web-swinging and so it is an inseparable element of Treyarch's Manhattan. In GTA, Spider-Man 2 and Superman Returns the speed at which one is able to move through the city is variable and its 8control is in some mechanic anchored in the game world itself. This provides a sense of enormous freedom. In some of these games, this speed increases as the player progresses through the game.&lt;br /&gt;&lt;br /&gt;Even so, at this level, the open world is still a toy. Now let's ask the question, &lt;em&gt;what makes a great open world &lt;strong&gt;game&lt;/strong&gt;?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Childhood Game of &lt;a href="http://en.wikipedia.org/wiki/Tag_(game)"&gt;Tag&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Of course, &lt;em&gt;GTA 3&lt;/em&gt; is the prototypical open world game. Recently, I started playing it yet again and it still may be the best. What makes it fun? The underlying element is &lt;strong&gt;tag&lt;/strong&gt;. The ancient children's game is incredibly simple, infinitely flexible and has strategic depth. Tag benefits from richness and complexity in a large world. The ideal tag world has nooks and crannies in which to hide from predators and from which to ambush prey. Layered on top of that, in GTA, there a number of other game mechanics, many - &lt;em&gt;most?&lt;/em&gt; - of which are themselves variations on tag.&lt;br /&gt;&lt;br /&gt;These layers of tag and alternating roles of hunter and hunted in &lt;em&gt;GTA 3&lt;/em&gt; stand in contrast to &lt;em&gt;Spider-Man 2&lt;/em&gt;'s races which also aim to capitalize on a large in-game world. Unfortunately, racing is much less fun than tag. Even though it's one of my favorite games, Spider-Man's races don't appeal to me. What appeals to me about &lt;em&gt;Spider-Man 2&lt;/em&gt; is the absolute euphoria of swinging and the crazy missions (levels?) like Mysterio's burning theater and the Statue of Liberty.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tag&lt;/strong&gt; (from Wikipedia)&lt;br /&gt;&lt;br /&gt;Players: &lt;strong&gt;2+&lt;/strong&gt;&lt;br /&gt;Rules complexity: &lt;strong&gt;Low&lt;/strong&gt;&lt;br /&gt;Strategy depth: &lt;strong&gt;High&lt;/strong&gt;&lt;br /&gt;Random chance: &lt;strong&gt;Low&lt;/strong&gt;&lt;br /&gt;Skills required: &lt;strong&gt;Running&lt;/strong&gt;, &lt;strong&gt;Hiding&lt;/strong&gt;, &lt;strong&gt;Observation&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116537554579653695?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116537554579653695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116537554579653695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116537554579653695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116537554579653695'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/explorers-and-game-of-tag.html' title='Explorers and the Game of Tag'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116532862209422587</id><published>2006-12-05T08:48:00.002-05:00</published><updated>2010-02-26T11:19:03.324-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><title type='text'>UML's Accidental Complexity</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Accidental_complexity"&gt;Accidental complexity&lt;/a&gt; is the complexity imposed by a given approach (in this case, a language) to solving a problem as opposed to an essential complexity of the problem itself. &lt;span class="fullpost"&gt;Recently, I documented a system I'd developed for a presentation for my coworkers. I diagrammed the class relationships in UML in Visio. Then I started swearing as I always do whenever I use UML. Now don't get me wrong, I enjoy UML and it's a valuable and useful tool when its limitations are understood.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;So why does UML make me swear when I use it?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;UML is graphical and two-dimensional.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A UML design should be readable, preferrably at a glance without too much study.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;UML is general, intended to apply with equal descriptiveness to multiple object-oriented languages.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;These goals of a UML design are irrelevant to the original language implementation. And, of course, the implementation language will have its own accidental complexity whose concerns must take higher precedence. Nevertheless, readability is important. An unreadable UML diagram is a waste of everyone's time.&lt;br /&gt;&lt;br /&gt;What effect does UML representation have in describing software designs?  Since subclassing allows classes to inherit lines of association from their parents while containment does not, readable UML favors subclassing over containment/composition which, in C++ based object oriented languages (such as C++, Java and C#), is inappropriate and even wrong (later, an entry on subclassing vs. containment).&lt;br /&gt;&lt;br /&gt;Below, an artificial abstract class is introduced to tame UML complexity.  Keep in mind that this diagram represents a &lt;strong&gt;very&lt;/strong&gt; simple design.&lt;br /&gt;&lt;br /&gt;Before -&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/inherit0.gif"&gt;&lt;br /&gt;&lt;br /&gt;After -&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.psenzee.com/images/inherit1.gif"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first diagram resembles an electrical circuit and its suffers from the same difficult problem - complex, multidimensional relationships flattened to a two-dimensional plane. In the second, we introduce a false abstract class simply to preserve readability.&lt;br /&gt;&lt;br /&gt;Clearly, readable UML representation as a requirement for software design is not a useful constraint - especially when it degrades the quality of a software system.  This is an issue that must be understood when using UML to design or present software systems.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116532862209422587?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116532862209422587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116532862209422587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116532862209422587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116532862209422587'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/umls-accidental-complexity.html' title='UML&apos;s Accidental Complexity'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116528785023669819</id><published>2006-12-04T21:49:00.001-05:00</published><updated>2008-09-09T10:27:44.109-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>On Reference Counting</title><content type='html'>Reference counting is one of those nasty little things that always seems easy and straightforward before you do it and for which you always curse yourself afterward. &lt;span class="fullpost"&gt;There is often little choice (so don't curse yourself too much) because in many circumstances it's the lesser of two evils.  The other evil is full blown garbage collection - arghh..!  Remember, if there's a good way to restructure your code to eliminate the need for ref-counting or garbage collection, DO IT!&lt;br /&gt;&lt;br /&gt;I have code that I use whenever I decide to ref-count that allows me to monitor object lifetimes, object ages and so forth to easily debug ref-counting issues.  It requires extra memory and so is not suitable in every case.  Alternatively, I've simply logged object creation and deletion to a file and then written a separate program to read the log to locate the offending objects and the general regions of code responsible for creating and (not) deleting them.&lt;br /&gt;&lt;br /&gt;But don't ever assume that ref-counting bugs will be easily fixed.  Usually once you fix one &lt;em&gt;symptom&lt;/em&gt; another one pops up somewhere completely removed from the first.  Both are probably unrelated to the source of the problem.  This is what makes ref-counting insidious.  So take my advice, when implementing ref-counting, do your due diligence upfront and make sure &lt;strong&gt;every&lt;/strong&gt; increment and decrement is accounted for.  You'll be sorry if you don't.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116528785023669819?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116528785023669819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116528785023669819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116528785023669819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116528785023669819'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/on-reference-counting.html' title='On Reference Counting'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116528641696325216</id><published>2006-12-04T20:57:00.001-05:00</published><updated>2008-09-09T10:28:32.315-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Inline Assembly</title><content type='html'>On my current project I will soon delve into optimization tasks at the level of inline assembly for PowerPC. &lt;span class="fullpost"&gt;These days the use of inline assembly is &lt;em&gt;almost never&lt;/em&gt; justified. It's about as unportable as code can be and it's nearly impossible to understand once it's written. Most of the time, unless you devote a great deal of energy or unless you are using processor features (SIMD, for example) inaccessible through C or C++, hand-written assembly will actually be &lt;em&gt;slower&lt;/em&gt; than compiler generated code. Furthermore, most of what you learned a few years ago about optimizing assembly code simply does not hold any more. For example, what's the faster way to multiply an integer by 5 on the x86?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A&lt;/strong&gt;. &lt;em&gt;x = (x &amp;lt;&amp;lt; 2) + x;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;or&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;B&lt;/strong&gt;. &lt;em&gt;x *= 5;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Old school assembly says that A is faster. Not true anymore. The &lt;strong&gt;imul&lt;/strong&gt; (integer multiply) instruction is as fast as a single shift on the x86 these days. Counting cycles? Hard to do these days with deep pipelines, instruction reordering, branch prediction and unpredictable memory latency. The most effective way to optimize assembly seems to be aggressive profiling and trial and error. Gone are the days when you can optimize code by counting cycles with the processor manual tables in hand. Even so, these guidelines are important:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Most importantly&lt;/strong&gt;, make sure you have the most efficient algorithm possible for the job before moving to assembly! There are a million good reasons for this and nothing could be more embarrassing than having your finely tuned assembly bubble sort owned by a C (or Java!) mergesort written in 12 minutes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2&lt;/strong&gt;. Profile changes aggressively and with the finest resolution (usually the CPU cycle counters) possible.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3&lt;/strong&gt;. Space out memory accesses. Because of memory latency (and asynchronous memory access), you can hide cycles between your memory reads and writes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4&lt;/strong&gt;. Know your memory access patterns and take advantage of them. Do you only write and never read back from certain areas of memory? It may be beneficial to write-through directly to memory and avoid caching. It can also be useful to prefetch memory in certain cases.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5&lt;/strong&gt;. Keep your data structures small enough to fit completely in cache.  This will yield enormous benefits if you can do it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6&lt;/strong&gt;. Use SIMD where appropriate. This can give great benefit and itself may justify moving to inline assembly. However, don't spend an excessive number of cycles trying to fit data into SIMD-ready structures. It'll probably cost more than you'll get from it. Use SIMD when it's a good fit.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7&lt;/strong&gt;. Unroll loops - to a point. Unroll tiny loops until they no longer provide a performance benefit. Keep unrolling and profiling. When you've gone too far you'll see a significant performance drop as that piece of code outgrows the instruction cache. If you have enough information on the hardware, you can figure out where this threshold will be.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;8&lt;/strong&gt;. On PC use SIMD for 64-bit integer arithmetic instead of the atrocious code that's generated for this by Visual C++.&lt;br /&gt;&lt;br /&gt;Just so you know, this entry is subject to revision. Have any other guidelines? Let me know about 'em!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116528641696325216?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116528641696325216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116528641696325216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116528641696325216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116528641696325216'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/inline-assembly.html' title='Inline Assembly'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116508016778438402</id><published>2006-12-02T11:59:00.000-05:00</published><updated>2008-02-29T11:24:18.169-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Playing Games'/><title type='text'>Experimental Gameplay</title><content type='html'>I met &lt;a href="http://www.experimentalgameplay.com/member.php?m=6"&gt;Kyle Gray&lt;/a&gt; yesterday who sits a couple of rows away from me at work and runs a fascinating site called the &lt;a href="http://www.experimentalgameplay.com/"&gt;Experimental Gameplay Project&lt;/a&gt;.  If you are at all interested in game play, check it out.&lt;br /&gt;&lt;br /&gt;Some of my favorites so far are &lt;a href="http://www.experimentalgameplay.com/game.php?g=256"&gt;Hovercrafty&lt;/a&gt;, &lt;a href="http://www.experimentalgameplay.com/game.php?g=256"&gt;Pluto Strikes Back&lt;/a&gt; and &lt;a href="http://www.experimentalgameplay.com/game.php?g=69"&gt;Big Vine&lt;/a&gt;.  Maybe around Christmas when I've got a little time off, I'll make a game or two.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116508016778438402?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.experimentalgameplay.com/' title='Experimental Gameplay'/><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116508016778438402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116508016778438402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116508016778438402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116508016778438402'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/12/experimental-gameplay.html' title='Experimental Gameplay'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-116475555044862504</id><published>2006-11-28T17:17:00.004-05:00</published><updated>2010-02-26T11:16:38.654-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Friends'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Games and Game Industry'/><title type='text'>Some People I've Met (and Some People I Haven't) Whose Work I Like</title><content type='html'>Earlier I mentioned &lt;a href="http://en.wikipedia.org/wiki/Richard_Garriott"&gt;Richard Garriott&lt;/a&gt; as someone I'd like to meet. &lt;a href="http://www.gamedevblog.com/"&gt;Jamie Fristrom&lt;/a&gt; emailed in response to that and sent &lt;a href="http://www.gamedevblog.com/2005/10/war_stories_the.html"&gt;this&lt;/a&gt; interesting story.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;In junior high, I discovered &lt;a href="http://www.amazon.com/Hackers-Computer-Revolution-Steven-Levy/dp/0141000511/sr=8-4/qid=1164752596/ref=pd_bbs_sr_4/002-2486207-7152865?ie=UTF8&amp;amp;s=books"&gt;Hackers&lt;/a&gt;, by &lt;a href="http://en.wikipedia.org/wiki/Steven_Levy"&gt;Steven Levy&lt;/a&gt; which I must have read a dozen times. &lt;a href="http://en.wikipedia.org/wiki/Steve_Wozniak"&gt;Steve Wozniak&lt;/a&gt; became my hero. I wanted to build computers.&lt;br /&gt;&lt;br /&gt;Then it was games. I wrote to all of the programmers who converted &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Times_of_lore"&gt;Times of Lore&lt;/a&gt;&lt;/em&gt; to PC asking how they accomplished the overhead scrolling over the massive world. &lt;a href="http://www.mobygames.com/developer/sheet/view/developerId,108/"&gt;Herman Miller&lt;/a&gt; responded with a detailed description in C and assembly and recommended that I get the &lt;a href="http://www.amazon.com/Programmers-Guide-Video-Systems-Performance/dp/1556151039/sr=8-1/qid=1164754182/ref=sr_1_1/002-2486207-7152865?ie=UTF8&amp;amp;s=books"&gt;Programmer's Guide to PC and PS/2 Video Systems&lt;/a&gt; which I guess is going for $0.24 on Amazon these days. Armed with that information, the book and Turbo C, I started writing games like crazy.&lt;br /&gt;&lt;br /&gt;So in college, a friend, Alex Kapadia, and I conceived a game called &lt;a href="http://www.senzee5.com/2008/11/underengineering-undead.html"&gt;Undead: The Tibovian Era&lt;/a&gt;. I sent an early copy to the fast-growing shareware company &lt;a href="http://en.wikipedia.org/wiki/Epic_Megagames"&gt;Epic MegaGames&lt;/a&gt; and a few days later, received an excited phone call from the now legendary (in game circles) &lt;a href="http://en.wikipedia.org/wiki/Tim_Sweeney_(game_developer)"&gt;Tim Sweeney&lt;/a&gt;. Tim sent me an email (which in those days I dutifully checked on the &lt;a href="http://en.wikipedia.org/wiki/Vaxen"&gt;Vaxen&lt;/a&gt; at &lt;a href="http://en.wikipedia.org/wiki/UMKC"&gt;UMKC&lt;/a&gt;) saying, &lt;em&gt;"I'm looking forward to seeing more of Undead! It's the best 'first' game any author has shown us."&lt;/em&gt; Not bad, eh? This was a year or two before &lt;a href="http://en.wikipedia.org/wiki/Unreal"&gt;Unreal&lt;/a&gt; and I like to believe that my &lt;em&gt;Undead&lt;/em&gt; inspired the similar name of Tim's magnum opus. Who knows..&lt;br /&gt;&lt;br /&gt;Instead of finishing &lt;em&gt;Undead&lt;/em&gt;, I spent a few years in Mexico. Kids these days. When I returned to Kansas City I found employment for a while doing bilingual customer service at a well known electronics company. At that time, I found myself sitting across the aisle from &lt;a href="http://en.wikipedia.org/wiki/Niki_Sullivan"&gt;Niki Sullivan&lt;/a&gt;, one of the original members of &lt;a href="http://en.wikipedia.org/wiki/Buddy_Holly_and_the_Crickets"&gt;Buddy Holly's Crickets&lt;/a&gt;! In his honor, the call center played nothing but Buddy Holly. Like an idiot, in my months there I was too awestruck to ever ask him anything about the days he wandered around the country participating in some of the seminal moments of American pop music.&lt;br /&gt;&lt;br /&gt;And, of course, I've met a number of equally talented people in places I've worked such as Keane, VML, H&amp;amp;R Block, Sprint and EA Tiburon.&lt;br /&gt;&lt;br /&gt;Without further reflection, that's the story of some people I've met (and some people I haven't) whose work I like.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-116475555044862504?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/116475555044862504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=116475555044862504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116475555044862504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/116475555044862504'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/11/some-people-ive-met-and-some-people-i.html' title='Some People I&apos;ve Met (and Some People I Haven&apos;t) Whose Work I Like'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-115819749137207574</id><published>2006-09-13T21:15:00.001-04:00</published><updated>2008-09-09T10:29:57.989-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>Speech Impediment</title><content type='html'>&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_programming_language"&gt;Lisp&lt;/a&gt; (and to a lesser degree, &lt;a href="http://en.wikipedia.org/wiki/Scheme_programming_language"&gt;Scheme&lt;/a&gt;) fascinates me.  Simple in the extreme and yet incredibly powerful, it is a thing of beauty. I learned Lisp by writing Lisp interpreters and compilers - usually to embed in other applications. As an embedded language Lisp excels - it is among the easiest languages to implement. Implementing it well, however, is an altogether different proposition.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;By programming language standards, Lisp (1958) is an ancient tongue. It is older than COBOL by a year and older than C by more than a decade. And it is timeless.&lt;br /&gt;&lt;br /&gt;Don't laugh but it's the coolest thing to build a tiny and reasonably fast Lisp bytecode VM (Pair, a current project of mine that I never get to, weighs in at a mere 28K!) and then shove it inside some application and make it do all sorts of things machines were never supposed to. Like thinking, for example :).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lisp &amp; Scheme&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://muvee-symbolic-expressions.blogspot.com/"&gt;muSE - Embeddable Scheme dialect and more importantly, its associated blog.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://lambda-the-ultimate.org/"&gt;Lambda The Ultimate Programming Languages Weblog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sam.zoy.org/elk/"&gt;Elk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Some Favorite Lisp and Scheme Books&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Paradigms-Artificial-Intelligence-Programming-Studies/dp/1558601910/sr=8-3/qid=1158196641/ref=pd_bbs_3/102-6458986-5409717?ie=UTF8&amp;amp;s=books"&gt;Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521545668/sr=8-1/qid=1158196641/ref=pd_bbs_1/102-6458986-5409717?ie=UTF8&amp;s=books"&gt;Lisp in Small Pieces&lt;/a&gt; - Great for building Lisp interpreters and compilers.&lt;br /&gt;&lt;a href="http://www.amazon.com/ANSI-Common-LISP-Paul-Graham/dp/0133708756/sr=8-1/qid=1158196949/ref=pd_bbs_1/102-6458986-5409717?ie=UTF8&amp;amp;s=books"&gt;On Lisp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Lisp-3rd-Patrick-Winston/dp/0201083191/sr=1-2/qid=1158197027/ref=sr_1_2/102-6458986-5409717?ie=UTF8&amp;amp;s=books"&gt;Lisp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0262011530/ref=pd_cp_b_title/102-6458986-5409717?ie=UTF8"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; - Don't buy this classic though - it's free online.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-115819749137207574?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/115819749137207574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=115819749137207574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/115819749137207574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/115819749137207574'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/09/speech-impediment.html' title='Speech Impediment'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-115629386291749823</id><published>2006-08-22T20:03:00.002-04:00</published><updated>2010-02-26T11:05:49.733-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Let Me Count The Ways (Part II)</title><content type='html'>In the &lt;a href="http://senzee.blogspot.com/2006/06/sieve-of-eratosthenes.html"&gt;Sieve of Eratosthenes&lt;/a&gt; post, I mentioned that at work (EA) we have an optional programming challenge every once in a while. It was started last year by &lt;a href="http://www.hejl.com/"&gt;Jim Hejl&lt;/a&gt; and it's called &lt;strong&gt;Hacker's Delight&lt;/strong&gt; - named after the &lt;a href="http://www.amazon.com/gp/product/0201914654/ref=s9_asin_image/102-6404684-4784143?n=283155"&gt;excellent book of programming tricks&lt;/a&gt; by Henry S. Warren.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;I love this stuff. Why? Who knows? Anyhow, this time I wrote the challenge - Hacker's Delight #6. I chose the { 64 choose 4 } problem from &lt;a href="http://senzee.blogspot.com/2006/06/let-me-count-ways.html"&gt;Let Me Count The Ways&lt;/a&gt;. My fast solution was initially ~3.9ms. Since I had not yet aggressively optimized it, I did that and got it down to ~2.5ms. That solution was written completely in C++. I figured that was about as fast as it got because it turned out that ~2.5ms is (slightly) faster than &lt;strong&gt;memset(data, 0, 635376 * sizeof(unsigned __int64)) &lt;/strong&gt;!!&lt;br /&gt;&lt;br /&gt;In short order, solutions came in that were almost exactly as fast as mine with quite different algorithms. Hmm. I thought, &lt;em&gt;the bottleneck is memory-processor bandwidth - ~2.5ms is simply how long it takes to write 4.8mb of data. All the other processing is swamped by that.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Even so, Jim was experimenting with SIMD approaches and had an SSE version of 'memset' that executed in about half memset's time. I started playing with that but couldn't figure out how to use that to get better performance out of my algorithm.&lt;br /&gt;&lt;br /&gt;Then Jim tells me that he received an entry from EA United Kingdom that executes in ~1.25ms - all SIMD (MMX)! &lt;em&gt;The gauntlet is down.&lt;/em&gt; I asked him &lt;strong&gt;not&lt;/strong&gt; to forward it to me or let me see it.&lt;br /&gt;&lt;br /&gt;So today I finally got my own MMX version to about ~1.25ms. It seems to execute slightly faster than Jim's SSE memset. While minor speed improvements may be possible (on the order of tenths of milliseconds), I'm convinced that there's no way to get significantly faster performance.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I could be wrong.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When it's all over, I will post a more detailed description of the optimization steps for those of you who are interested. For those who are not, z z z z z z z z z z...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/Optimizing64c4.pdf"&gt;[The related, and more detailed document Optimizing 64 Choose 4 (.pdf)]&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-115629386291749823?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/115629386291749823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=115629386291749823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/115629386291749823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/115629386291749823'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/08/let-me-count-ways-part-ii.html' title='Let Me Count The Ways (Part II)'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114979757119223259</id><published>2006-06-08T15:50:00.002-04:00</published><updated>2010-02-26T11:04:24.092-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Poker Hand Evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Some Perfect Hash</title><content type='html'>The computer science department of the &lt;a href="http://games.cs.ualberta.ca/poker/"&gt;University of Alberta&lt;/a&gt; in Edmonton researches Artificial Intelligence (AI) for Poker. From their site I came upon &lt;a href="http://www.suffecool.net/poker/evaluator.html"&gt;Cactus Kev's Poker Hand Evaluator&lt;/a&gt; which is a killer fast five card hand evaluator. Reading through his algorithm you'll notice that the last step for any yet unclassified hand is a &lt;a href="http://en.wikipedia.org/wiki/Binary_search"&gt;binary search&lt;/a&gt; through a list of values. Most hands end up in that search which is the most time-consuming part of the algorithm.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;An Optimization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Replacing the binary search with a precomputed &lt;a href="http://en.wikipedia.org/wiki/Perfect_hash"&gt;perfect hash&lt;/a&gt; for the 4888 values in the list yields a significant improvement over the original. The original test code included with Kevin's source (using &lt;i&gt;eval_5hand&lt;/i&gt;) runs in 172 milliseconds on my machine and with my &lt;i&gt;eval_5hand_fast&lt;/i&gt; it runs in 63 milliseconds. Yay, an improvement of &lt;b&gt;2.7 times&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.psenzee.com/code/fast_eval.c"&gt;fast_eval.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This post has garnered a bit of attention. Cactus Kev added a comment and a link on his site back to the post and I've had an email conversation with a programmer (anonymous unless he's cool if I mention him) who ported the code to C# and reports:&lt;br /&gt;&lt;br /&gt;Kev: 159ms&lt;br /&gt;Your mod: 66ms&lt;br /&gt;My C# version of your mod: 88ms&lt;br /&gt;&lt;br /&gt;Pointers for seven hand evaluation?  Check out the &lt;a href="http://senzee.blogspot.com/2007/01/7.html"&gt;post 7&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114979757119223259?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114979757119223259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114979757119223259' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114979757119223259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114979757119223259'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/06/some-perfect-hash.html' title='Some Perfect Hash'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114977999277769181</id><published>2006-06-08T11:12:00.002-04:00</published><updated>2010-02-26T11:00:33.829-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Sieve of Eratosthenes</title><content type='html'>At work we had a little challenge in December to see who could come up with a program to count the number of primes between any two numbers (0 to 2^32-1 inclusive) as fast as possible. &lt;span class="fullpost"&gt;To this end I wrote this optimized &lt;a href="http://www.psenzee.com/code/primes_senzee_1.cpp"&gt;Sieve of Eratosthenes&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes"&gt;algorithm&lt;/a&gt;) that counts all the primes from 0 to 4,294,967,295 in about 13.75 seconds on my (admittedly fast) development machine at work.&lt;br /&gt;&lt;br /&gt;If you come up with any improvements to it, let me know!&lt;br /&gt;&lt;br /&gt;(2/2/2007 - I'm going to go ahead and add the link for the &lt;a href="http://www.psenzee.com/code/primes_senzee_multicore.cpp"&gt;multicore Sieve of Eratosthenes &lt;/a&gt;here.  On a 3GHz dual core Xeon, 7.15s!)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114977999277769181?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114977999277769181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114977999277769181' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114977999277769181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114977999277769181'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/06/sieve-of-eratosthenes.html' title='Sieve of Eratosthenes'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114928538698488473</id><published>2006-06-02T16:44:00.001-04:00</published><updated>2008-09-09T10:33:16.913-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Let Me Count The Ways</title><content type='html'>Lately, I've been tinkering with card games (poker) a bit and one of the little questions that came up was &lt;em&gt;what is the fastest way to enumerate all possible combinations of 4 items out of a possible 64?&lt;/em&gt; Actually, it doesn't have to be 4 of 64, it could be 7 of 48, or 2 specific aces from 52 cards or 3 bits of 10. The field of &lt;a href="http://en.wikipedia.org/wiki/Combinatorics"&gt;combinatorics&lt;/a&gt; can tell us &lt;em&gt;how many&lt;/em&gt; there are.  This is expressed as &lt;strong&gt;{ n choose r }&lt;/strong&gt; and has the formula &lt;em&gt;factorial(n) / (factorial(r) * factorial(n - r))&lt;/em&gt;. In the case of &lt;em&gt;n = 64&lt;/em&gt; and &lt;em&gt;r = 4&lt;/em&gt; it yields 635,376 different combinations.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;So, the task is to enumerate each of these unique combinations exactly one time until all 635,376 have been generated. This is one of those problems where the right approach makes all the difference.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Naive Approach&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let's look, for a moment, at the most basic brute force approach: iterate through every value that can be contained in 64 bits and check if it has four bits. How long would this take? On my machine it takes 1 second to check 250 million numbers. Pretty fast, right? At this rate, however, it will take &lt;strong&gt;2,340 years&lt;/strong&gt; to check all 2^64 numbers! Clearly not a usable solution.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A Better Approach&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Poking around the internet I found a function that takes a number and returns the next highest number with the same number of bits. I adapt it a bit and bam!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int enumerate_combinations(int n, int r, unsigned __int64 *v)&lt;br /&gt;{&lt;br /&gt;    unsigned __int64 y, r, x;&lt;br /&gt;    unsigned         count = (unsigned)math::choose(n, r);&lt;br /&gt;    v[0] = ((unsigned __int64)1 &lt;&lt; r) - 1;&lt;br /&gt;    for (unsigned i = 1; i &lt; count; i++)&lt;br /&gt;    {&lt;br /&gt;        x    = v[i - 1];&lt;br /&gt;        y    = x &amp; -(__int64)x;&lt;br /&gt;        r    = x + y;&lt;br /&gt;        v[i] = r | (((x ^ r) &gt;&gt; 2) / y);&lt;br /&gt;    }&lt;br /&gt;    return count;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This variation turns in &lt;strong&gt;32 milliseconds&lt;/strong&gt; for complete enumeration. Not a bad improvement over 2,340 years, eh?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Best Approach&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I actually developed the following function before the above. However, I figured (from looking at the code) that the above would blow this one away. How wrong I was. One problem with the above approach is that it has a nasty little division. Another thing is that this approach takes advantage of certain special cases like when r == 1 and n == r.  The following approach is based on my initial recursive approach, but I removed the recursion so that I could rewrite it as an iterator. Removing the recursion did not seem to have a significant impact on performance. Anyhow the following runs to completion in just &lt;strong&gt;3 milliseconds&lt;/strong&gt;, over 10 times faster than the above version.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt;typename T = unsigned __int64&amp;gt;&lt;br /&gt;int enumerate_combinations(int n, int r, T *v)&lt;br /&gt;{&lt;br /&gt;    struct { int n, r; T h; } s[sizeof(T) * 8] = { { n, r, 0 } }, q;&lt;br /&gt;    int si  = 1, i = 0;&lt;br /&gt;    T   one = 1;&lt;br /&gt;&lt;br /&gt;    while (si)&lt;br /&gt;    {&lt;br /&gt;        q = s[--si];&lt;br /&gt;&lt;br /&gt;    tail:&lt;br /&gt;&lt;br /&gt;        if (q.r != 0)&lt;br /&gt;        {&lt;br /&gt;            one = 1;&lt;br /&gt;            if (q.r == 1)&lt;br /&gt;            {&lt;br /&gt;                for (int j = 0; j &lt; q.n; j++)&lt;br /&gt;                {&lt;br /&gt;                    v[i++] = q.h | one;&lt;br /&gt;                    one &lt;&lt;= 1;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else if (q.r == q.n)&lt;br /&gt;            {&lt;br /&gt;                v[i++] = q.h | (one &lt;&lt; q.n) - 1;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                --q.n; s[si++] = q; q.r--;&lt;br /&gt;                q.h |= one &lt;&lt; q.n;&lt;br /&gt;                goto tail;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return i;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114928538698488473?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114928538698488473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114928538698488473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114928538698488473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114928538698488473'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/06/let-me-count-ways.html' title='Let Me Count The Ways'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114900005150029264</id><published>2006-05-30T10:33:00.001-04:00</published><updated>2008-09-09T10:33:53.193-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Playing Games'/><title type='text'>The Elder Scrolls IV: Oblivion</title><content type='html'>This weekend I sprung for an Xbox 360. Finally. Then I rented &lt;a href="http://www.metacritic.com/games/platforms/xbox360/elderscrolls4oblivion?q=oblivion"&gt;The Elder Scrolls IV: Oblivion&lt;/a&gt;. I'll have to take it back to Blockbuster Thursday, so I'm gonna have to buy it.  $60, damn.  Graphically it is, without a doubt, the most beautiful game I have ever seen. Its gameplay is utterly consuming. I may not be sleeping much these next few weeks.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;On coming to the surface (the game starts underground), an incredible panorama opens.  The trees, the normal/gloss mapping of the rocks, the water.  Everything looks amazing.  The world is massive beyond belief.  A profound sense of freedom - you can do anything.  Playing Oblivion for the first time was very much like opening up the exquisite world of &lt;a href="http://en.wikipedia.org/wiki/Ultima_V"&gt;Ultima V&lt;/a&gt; as a kid.  Few games appeal to me that much.&lt;br /&gt;&lt;br /&gt;For me, it is essential that a game inspire a sense of freedom with Ultima V, &lt;a href="http://en.wikipedia.org/wiki/Times_of_Lore"&gt;Times of Lore&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Grand_Theft_Auto_III"&gt;GTA III&lt;/a&gt;, Spider-Man 2 being representative examples.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114900005150029264?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114900005150029264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114900005150029264' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114900005150029264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114900005150029264'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/elder-scrolls-iv-oblivion.html' title='The Elder Scrolls IV: Oblivion'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114839067412690601</id><published>2006-05-23T09:11:00.001-04:00</published><updated>2008-09-09T10:34:39.278-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimization'/><title type='text'>Data Access Latency</title><content type='html'>Ryan and I have talked about making a chart to easily visualize the relative costs of common computer operations. A significant part of this is data access latencies in modern computer hardware. &lt;span class="fullpost"&gt;Yesterday I stumbled across some numbers in &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=116704"&gt;Raymond Chen's PDC 05 Talk: Five Things Every Windows Programmer Should Know&lt;/a&gt;, and behold! a chart is born:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7829/2960/1600/latencies.png"&gt;&lt;/a&gt;&lt;a href="http://photos1.blogger.com/blogger/7829/2960/1600/latencies.0.png"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7829/2960/400/latencies.0.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Main memory latency has become a crucial consideration in modern software development. As the processor (CPU in the chart) becomes faster, the gulf between the processor memory (registers and caches) and main memory latency widens, making cache misses increasingly more expensive with respect to processor cycles. An increasingly frequent software design decision is to use simple array based data structures as opposed to pointer based tree and list structures for many operations. Typically, pointer structures (linked lists, binary trees, etc.) are theoretically more efficient than their linear counterparts (for example, binary trees [O(lg n) vs. O(n)] vs. linear search). Given the high cost of cache misses in modern hardware and the good memory locality of array based approaches, pointer based structures &lt;strong&gt;may perform 25-100 times more poorly&lt;/strong&gt; than their simpler counterparts. In developing for the Xbox 360 and PlayStation 3 with crazy powerful processors, linearizing data structures is a crucial optimization.&lt;br /&gt;&lt;br /&gt;So instead of using that binary tree next time, consider using a sorted linear array with a binary search.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114839067412690601?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114839067412690601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114839067412690601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114839067412690601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114839067412690601'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/data-access-latency.html' title='Data Access Latency'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114798246945326721</id><published>2006-05-18T15:33:00.001-04:00</published><updated>2008-09-09T10:35:55.139-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>class vs. struct</title><content type='html'>As C++ interviewees know well, the only difference between &lt;strong&gt;class&lt;/strong&gt; and &lt;strong&gt;struct&lt;/strong&gt; in C++ is that &lt;strong&gt;class&lt;/strong&gt; defaults to an access mode of &lt;strong&gt;private&lt;/strong&gt; and &lt;strong&gt;struct&lt;/strong&gt; defaults to &lt;strong&gt;public&lt;/strong&gt;. This means that the difference between them is purely syntactic and has no semantic connotation whatsoever. Because of this, some C++ experts believe that the &lt;strong&gt;struct&lt;/strong&gt; keyword should not be used at all and we should always use &lt;em&gt;class { public:&lt;/em&gt; instead.&lt;span class="fullpost"&gt;&lt;br&gt;So why do developers continue to use both when there is no semantic difference? To people, &lt;strong&gt;struct&lt;/strong&gt; and &lt;strong&gt;class&lt;/strong&gt; communicate subtly different ideas. Developers often use the &lt;strong&gt;struct&lt;/strong&gt; keyword (because of its C heritage) to indicate a lightweight, open record that is not &lt;em&gt;encapsulated. &lt;/em&gt;For example, a small record intended to be written directly to a file is more likely to be a &lt;strong&gt;struct&lt;/strong&gt; in these situations. The &lt;strong&gt;class&lt;/strong&gt; keyword is then used for traditional C++ object orientation. The fascinating thing about this dichotomy is that even computer language keywords develop nuances of meaning apart from their original intent.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114798246945326721?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114798246945326721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114798246945326721' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114798246945326721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114798246945326721'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/c-class-vs-struct.html' title='class vs. struct'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114795735036390575</id><published>2006-05-18T08:38:00.001-04:00</published><updated>2008-09-09T10:36:38.306-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Formatting std::string</title><content type='html'>The following snippet has been a part of my personal code library for years. It is useful for formatting a std::string in a traditional &lt;em&gt;printf()&lt;/em&gt; way. For all its ills, &lt;em&gt;printf/sprintf()&lt;/em&gt; is incredibly convenient. This code is for Win32. Minor modification is required for Unix.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;&lt;br /&gt;std::string format_arg_list(const char *fmt, va_list args)&lt;br /&gt;{&lt;br /&gt;    if (!fmt) return "";&lt;br /&gt;    int   result = -1, length = 256;&lt;br /&gt;    char *buffer = 0;&lt;br /&gt;    while (result == -1)&lt;br /&gt;    {&lt;br /&gt;        if (buffer) delete [] buffer;&lt;br /&gt;        buffer = new char [length + 1];&lt;br /&gt;        memset(buffer, 0, length + 1);&lt;br /&gt;        result = _vsnprintf(buffer, length, fmt, args);&lt;br /&gt;        length *= 2;&lt;br /&gt;    }&lt;br /&gt;    std::string s(buffer);&lt;br /&gt;    delete [] buffer;&lt;br /&gt;    return s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;std::string format(const char *fmt, ...)&lt;br /&gt;{&lt;br /&gt;    va_list args;&lt;br /&gt;    va_start(args, fmt);&lt;br /&gt;    std::string s = format_arg_list(fmt, args);&lt;br /&gt;    va_end(args);&lt;br /&gt;    return s;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114795735036390575?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114795735036390575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114795735036390575' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114795735036390575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114795735036390575'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/c-formatting-stdstring.html' title='Formatting std::string'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114773127223469069</id><published>2006-05-15T17:32:00.001-04:00</published><updated>2008-09-09T10:37:14.318-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Essays'/><category scheme='http://www.blogger.com/atom/ns#' term='Code and Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><title type='text'>Muddy Waters</title><content type='html'>A fascinating view of anti-pattern/pattern &lt;a href="http://www.laputan.org/mud/"&gt;Big Ball of Mud&lt;/a&gt; and its relatives.  &lt;strong&gt;Big Ball of Mud&lt;/strong&gt; is the kind of horrifically structured software we have all seen and shunned throughout our careers.  &lt;span class="fullpost"&gt;Software of this sort is not just poorly architected, but lacks any architecture whatsoever.  Nevertheless, the authors argue, when an approach is &lt;em&gt;&lt;strong&gt;so&lt;/strong&gt;&lt;/em&gt; pervasive and universal as this one is, there must be &lt;em&gt;something&lt;/em&gt; it does well.&lt;br /&gt;&lt;br /&gt;Citing &lt;a href="http://en.wikipedia.org/wiki/Shantytown"&gt;shanty towns&lt;/a&gt; as an instance of the &lt;strong&gt;Big Ball of Mud&lt;/strong&gt; pattern, the authors say:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Shantytowns emerge where there is a need for housing, a surplus of unskilled labor, and a dearth of capital investment. Shantytowns fulfill an immediate, local need for housing by bringing available resources to bear on the problem. Loftier architectural goals are a luxury that has to wait.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Traditionally good architecture in software dramatically reduces maintenance requirements and failure rates.  Values that traditional software architecture respect are &lt;a href="http://en.wikipedia.org/wiki/Robustness"&gt;robustness&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Software_maintenance"&gt;maintainability&lt;/a&gt;/low cost of maintenance, performance and efficiency.  To achieve these goals, the development of such software requires software architects (not cheap), more sophisticated (and therefore more expensive) developers, and, in general, more development time.&lt;br /&gt;&lt;br /&gt;In contrast the &lt;strong&gt;Big Ball of Mud&lt;/strong&gt; development style values low cost of initial development and is willing to achieve that by accepting a relatively high cost of continuing maintenance as its solutions are not robust.  It requires no architects, far less skilled developers and less initial development time.  However, it may also require a larger dedicated maintenance staff.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114773127223469069?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114773127223469069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114773127223469069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114773127223469069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114773127223469069'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/muddy-waters.html' title='Muddy Waters'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28016235.post-114771207056672753</id><published>2006-05-15T12:47:00.002-04:00</published><updated>2010-02-26T10:54:24.714-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Senzee'/><category scheme='http://www.blogger.com/atom/ns#' term='City Generation'/><title type='text'>Urbanization</title><content type='html'>&lt;div align="left"&gt;Because I enjoy creating games on my own time and am attracted to the sort of open world games described in the previous post, I'm interested in automatic generation of urban landscapes for games. There is no way I can create an entire city such as the cities of &lt;strong&gt;GTA&lt;/strong&gt; or &lt;strong&gt;Ultimate Spider-Man&lt;/strong&gt; without a high level of automation. I've seen some work in this area, most of which is concerned with generating low-detail cities in real-time. I'm interested in offline high-detail content creation.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;From 2004 to early 2005 I developed a pair of programs to accomplish this. The first of these is &lt;a href="http://www.psenzee.com/pov2mesh/"&gt;pov2mesh&lt;/a&gt;, a program that converts a &lt;a href="http://en.wikipedia.org/wiki/Constructive_solid_geometry"&gt;constructive solid geometry (CSG)&lt;/a&gt; file (&lt;a href="http://www.povray.org/"&gt;Pov-Ray&lt;/a&gt; format) into a &lt;a href="http://en.wikipedia.org/wiki/Maya_(software)"&gt;Maya&lt;/a&gt; vector .obj file. The second of these is &lt;strong&gt;Urbia&lt;/strong&gt; which generates the CSG file from an abstract .xml definition of the world, fills in the blanks and invokes &lt;a href="http://www.psenzee.com/pov2mesh/"&gt;pov2mesh&lt;/a&gt; to complete the conversion to .obj. The &lt;a href="http://www.psenzee.com/pov2mesh/"&gt;pov2mesh&lt;/a&gt; application is currently offered as shareware on my site. I also plan to offer &lt;strong&gt;Urbia&lt;/strong&gt; as shareware when it's more polished.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://news.povray.org/povray.news-submissions/thread/43c15b64@news.povray.org"&gt;this&lt;/a&gt; for a discussion of &lt;strong&gt;pov2mesh&lt;/strong&gt;'s future and feasiblity.&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://www.psenzee.com/pov2mesh/images/city_block.png"&gt;&lt;img src="http://www.psenzee.com/pov2mesh/images/city_block.gif" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;A city block generated by &lt;strong&gt;Urbia&lt;/strong&gt; for my game in progress &lt;strong&gt;Cuervo&lt;/strong&gt;. &lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(Updated 7/10/07)&lt;/em&gt;&lt;/p&gt;&lt;div align="left"&gt;Here are some great links passed on from an EA guy who went to SIGGRAPH 06-&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;a name="_Toc143951776"&gt;&lt;strong&gt;Procedural Modeling of Urban Environments&lt;/strong&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;a href="http://www.public.asu.edu/~pwonka/Publications/publications.htm"&gt;Peter Wonka's Publications&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;a href="http://www.vision.ee.ethz.ch/~pmueller/research.html"&gt;Pascal Muller's Research&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28016235-114771207056672753?l=www.paulsenzee.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.paulsenzee.com/feeds/114771207056672753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28016235&amp;postID=114771207056672753' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114771207056672753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28016235/posts/default/114771207056672753'/><link rel='alternate' type='text/html' href='http://www.paulsenzee.com/2006/05/urbanization.html' title='Urbanization'/><author><name>Senzee</name><uri>http://www.blogger.com/profile/02573580670699332421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
