<?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-5584729569182792012</id><updated>2012-02-16T06:32:37.053-05:00</updated><category term='dokuwiki counter statcounter embed'/><category term='Drupal'/><category term='full sail'/><category term='Bullsigh'/><category term='pimpl'/><category term='slicehost BS detector reviews'/><category term='Computers'/><category term='mombuntu ubuntu'/><category term='games pengkwik'/><category term='Linux'/><category term='programming'/><category term='Slicehost Bullsigh Web Linux Dokuwiki'/><category term='serialization'/><category term='compilation firewall'/><category term='Ubuntu'/><category term='projects'/><category term='c++'/><category term='Gift'/><category term='Open Source'/><title type='text'>DevBlog</title><subtitle type='html'>Finding a more general solution!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-2402783654329687214</id><published>2010-01-24T19:25:00.001-05:00</published><updated>2010-01-24T19:25:23.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Jakarta Wrapper Release</title><content type='html'>&lt;p&gt;Hello Everyone!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I've finally posted the simple FTP wrapper code to the interwebs. Download &lt;a href="http://www.bullsigh.net/code/ftpclient.tar.gz" title="FTPClient wrapper stuffs"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-2402783654329687214?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/2402783654329687214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=2402783654329687214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2402783654329687214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2402783654329687214'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/jakarta-wrapper-release.html' title='Jakarta Wrapper Release'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7330369171901214896</id><published>2010-01-22T20:37:00.002-05:00</published><updated>2010-01-22T20:40:37.268-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Bullsigh'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Drupal is garbage.</title><content type='html'>I know that title has got somebody out there screaming, "Oh yeah? Well let's see you do better!" Unfortunately, I couldn't care less how beautiful the code inside is, or how tight the implementation is, or how masterfully architected it is. I just want to be able to &lt;i&gt;use&lt;/i&gt; the thing. It's a product for building websites, not a museum exhibit in the Hall 'O Code. I decided to try and run Drupal as the primary web framework on bullsigh.net. Boy was this a mistake. Let me count the ways:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Synaptic package installed in a broken state&lt;/b&gt;: During the installation of the drupal5 package (which is &lt;i&gt;almost&lt;/i&gt; two major revisions behind) you are asked if you want the installer to figure out your database settings. The installer says that if you already have a database installed, don't choose that option. So I didn't. After the package installation, I navigate to www.bullsigh.net/ and find a nasty error about not being able to find the database or something. Then I tried /install.php and got some internal error garbage. Ok, sudo apt-get remove drupal5&lt;/li&gt;&lt;li&gt;&lt;b&gt;Default install of the latest version creates a useless website:&lt;/b&gt; That's right, you cannot do ANYthing. After installing over a dozen modules, I was able to get some basic posting going, but I could not embed images in my posts or figure out how to make a front page. That's right, you can't &lt;b&gt;embed images&lt;/b&gt;. This deserves its own point.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Default install does not let you embed images in content, and &lt;i&gt;this&lt;/i&gt; &lt;i&gt;is a design decision!&lt;/i&gt; &lt;span style="font-weight: normal;"&gt;After installing a host of additional plugins not included in the install (Image, FileEntry, ImageMagick, ImageEntry, ContentCreationKit, etc), I was STILL not able to embed images. I hopped on their irc channel (irc://irc.freenode.org/drupal) and asked why this was so hard. I was told that because there are so many different ways to do images, none of them are enabled by default. Wonderful. I then asked how I could get images working, and I was answered with at least five different methods, all involving a different combination of modules. *sigh* I decided to go with the suggestion that only involved one module I didn't already have. This magic module called "Insert" was supposed to allow me to insert things into content. Things like FileEntry, ImageEntry, and WhateverOtherEntry I had already installed on this doomed quest. After installing the Insert module, I excitedly navigated to the content creation page. Well, it didn't look any different. Maybe one of the collapsed menus had something new? No?! F*** this, I'm done.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This is what I consider to be an example of the capitalization of "Free Open Source" software. Sure it's free to download and install. Sure the source is all there for you. Unfortunately, the system is so complex and unfriendly that only the community can help you, and they aren't looking to help for free. There are a plethora of books available on Drupal, you can pay someone to set up and administer your Drupal site, or you can watch screen casts (*THE* most inefficient and resource-wasteful way possible to get technical help) -- Oh yeah and they hold conferences. Behold the capitalist education system: &lt;a href="http://learnbythedrop.com/"&gt;Learn By The Drop&lt;/a&gt;. The argument that the Drupal community uses for this ridiculous barrier to entry is that a highly customizable framework must, out of necessity, be hard to use! Their website offers a &lt;a href="http://drupal.org/getting-started/before/overview"&gt;metaphor&lt;/a&gt; relating a pre-built toy to a kit used to assemble toys (that kit being Drupal). Well that's all fine and dandy, but this is software we're talking about. Why not find out what configuration the majority of your users end up with, and make that the default set up? You could even present an option for "custom" or "minimal" during the web-based installer. Linux distros could just install the kernel and sh and say, "There ya go, have fun kiddo!" -- Fortunately they realize that most users will want a windowing system, most users will want a web browser, etc. If you don't want the default? Then specify that at install time!&lt;br /&gt;&lt;br /&gt;If we are going to keep doing wonderful and beautiful things with technology, we need to let go of this elitist attitude that sometimes infects the tech industry. There is no good reason to snub your nose at the 'pathetic user' that cannot understand your mastermind piece of technology. Why not make that tech easy to use, and thereby open it up to a broader audience? Let more diverse people play with your new toy and in the process, design wonderful things that you could not have designed on your own. Let people use things without needing to devote a portion of their life to serving it. If it's insecurity nagging you to keep things difficult (perhaps as job security), I would give you this to think about: If you build quality things, and you do that consistently, you will never have a problem finding a place for yourself. If you're resting on old laurels hidden behind the barbed-wire of a crap interface (API or GUI), be warned, someday someone will do it better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7330369171901214896?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7330369171901214896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7330369171901214896' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7330369171901214896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7330369171901214896'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/drupal-is-garbage.html' title='Drupal is garbage.'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-3602116552515164121</id><published>2010-01-21T21:21:00.001-05:00</published><updated>2010-01-21T21:21:03.842-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computers'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mombuntu ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Mombuntu: Retribution</title><content type='html'>&lt;p&gt;The Mombuntu saga has now come to a conclusion. After another lengthy call, I was able to get googletalk running. Using this as a medium for an extremely slow, &lt;a href="http://en.wikipedia.org/wiki/Duplex_(telecommunications)#Half-duplex" title="half-duplex"&gt;half-duplex&lt;/a&gt; communication vessel, I was able to get a reverse SSH session going from the Mombuntu computer (named Baxley) to bullsigh.net. Unfortunately, the firewalls between us prevented me from connecting anyway. This was a major blow to morale and I thought I was surely defeated. As I resigned myself to a walk to clear my mind, I left my mom with some parting advice:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;&lt;i&gt;Well, you are on the internet right now because you have the cable plugged in, so try looking on Google. Search for something like "Ubuntu wireless help"... actually throw newbie or new user in there too. Another thing you can try is maybe flipping settings in that place with all the connections, like ether. You remember where I'm talking about? Ok, try changing some of those things around. Oh and maybe try pressing the wireless button... the one on the keyboard with the blue light on it... yeah try pressing that a couple times to turn the wireless off and on, it might magically work.&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;I left the house feeling rather small. I was upset about letting the problems frustrate me so badly; I was upset that my Mom ended up with a cryptic puzzle rather than a fun toy; and lastly, I was upset because I had just wasted another 83 minutes on the phone (not an exaggeration).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I walked down the path I generally use for running or idle walks, but I just couldn't get this stuff out of my head. Why had the reverse SSH &lt;b&gt;still&lt;/b&gt; failed, even though I remapped it to port 8022, then 10333, then 18022? Why was the wireless interface connecting, but not actually working? The signal strength indicator had shown a connection, the status had said Baxley was connected to ether (my parent's wireless network). What could the problem be? Eventually I stopped worrying about it and had started scheming up the internet's Next Big Meme (tm). I headed back home about 30 minutes later, and when I came in I checked my phone and noticed a voicemail was about 10 minutes after I started my walk. I listened to it and my mom said "Hey, I just wanted to let you know that I'm wireless now and it's workin'. I sent you a email (sic) but I didn't know if you had gone off already."&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;b&gt;WHAAAAAAAT?!?&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: left;"&gt;I hurriedly called her back to ask what she had done to solve this seemingly intractable problem. Her response? "I just hit that button a couple times and it came right up." -- The wireless button. *Forehead slap* That should have been the &lt;b&gt;first&lt;/b&gt; thing I tried!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-3602116552515164121?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/3602116552515164121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=3602116552515164121' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/3602116552515164121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/3602116552515164121'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/mombuntu-retribution.html' title='Mombuntu: Retribution'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7191482277943529964</id><published>2010-01-19T17:22:00.000-05:00</published><updated>2010-01-19T17:22:38.505-05:00</updated><title type='text'>Mombuntu, the Aftermath</title><content type='html'>Well, Mombuntu has been a failure :( Although my mom was very happy with the laptop and tickled by my choice of a background for her (&lt;a href="http://www.qaiku.com/channels/show/ubuntu/view/1dec87eb46fb338c87e11deac958d1f52fec259c259/"&gt;only the background is relevant&lt;/a&gt;). I had *hoped* that the wireless would work out of the box, as it did for me, but unfortunately something somehow managed to go wrong. I'm not going to bother trying to blame anyone or anything for the failure; the real problem is that I didn't plan for failure. I had not set up and installed an instant messenger account, which meant that once she plugged in a hard-line, I had to communicate commands to her over the phone. This is extremely difficult with a computer illiterate person. If I had installed some kind of IM client, I could just send commands for her to copy, then have her paste the output to me (essentially making her a &lt;a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)"&gt;unix pipe&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;After two hours on the phone, I was able to determine that the DSL modem was blocking incoming SSH connections; another obvious fail-point that I had not planned on. We decided to try again Wednesday, at which point I will try to have her reverse SSH to bullsigh.net or something. I'm pretty sure the WiFi issue is just a matter of changing the wireless protocol, but I don't have a Ubuntu desktop around here to follow along with (another bad move). More to follow :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7191482277943529964?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7191482277943529964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7191482277943529964' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7191482277943529964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7191482277943529964'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/mombuntu-aftermath.html' title='Mombuntu, the Aftermath'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-6545856620667131662</id><published>2010-01-16T01:22:00.000-05:00</published><updated>2010-01-16T01:22:38.342-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dokuwiki counter statcounter embed'/><title type='text'>Include Content On All DokuWiki Pages</title><content type='html'>I just wanted to drop off a quick note on how to include custom static content on every generated page of a dokuwiki. It took me a good bit of searching to find this, and I was on the verge of editing a custom template to do it. Luckily, I found this &lt;a href="http://www.dokuwiki.org/devel:templates#include_hooks"&gt;section on "include hooks"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now I'm able to have &lt;a href="http://www.statcounter.com/"&gt;statcounter&lt;/a&gt;&amp;nbsp;gather statistics for me :)&lt;br /&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-6545856620667131662?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/6545856620667131662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=6545856620667131662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6545856620667131662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6545856620667131662'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/include-content-on-all-dokuwiki-pages.html' title='Include Content On All DokuWiki Pages'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-1677993476336696230</id><published>2010-01-16T00:11:00.001-05:00</published><updated>2010-01-16T00:12:54.576-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Slicehost Bullsigh Web Linux Dokuwiki'/><title type='text'>Bullsigh.net is born!</title><content type='html'>&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_1263617183513"&gt;&lt;/span&gt;&lt;span id="goog_1263617183514"&gt;&lt;/span&gt;Hello everyone!&lt;br /&gt;&lt;br /&gt;My Slicehost experiment is turning out quite well so far. Within minutes of registering for service, I had a shell into a brand new Ubuntu server out there somewhere in the cloud. Slicehost provides a lot of web tools for managing your slice, but so far I've been working through SSH exclusively, aside from setting up dns services. It's pretty awesome to have a little island of stability to call my own out on the net tempest.&lt;br /&gt;&lt;br /&gt;With the newly configured box ready to go, I went ahead and bought the &lt;a href="http://bullsigh.net/"&gt;bullsigh.net&lt;/a&gt; domain. I purchased it through GoDaddy.com which has the distinction of being the tackiest, most insulting, shady, poorly crafted website that I am forced to interact with. I really wish there was some competition in this space so that those clowns would clean up that garbage pit. The entire website is an ad for itself, which each pixel leveraged for tricking you into buying things you don't need. Through carefully dereferencing every *, **, ***, and little cross thing I came across, I was able to reduce my out-the-door charges from $40.00 to $16.00. That's pretty substantial. That type of shady salemanship has been considered&amp;nbsp;&lt;i&gt;faux pas&lt;/i&gt;&amp;nbsp;in the internet culture since 2000. If your business model relies on "trick the customer into losing money", then I hate you.&lt;br /&gt;&lt;br /&gt;With a domain name secured and a beautiful little Ubuntu slice humming along, I went ahead and set up a &lt;a href="http://www.dokuwiki.org/"&gt;dokuwiki&lt;/a&gt;&amp;nbsp;for bullsigh. Dokuwiki has been making my life better ever since a colleague set it up for use on a project I'm working on. If you haven't used a wiki before, I highly recommend making it a part of your life. I've been working with a largely undocumented and mysterious system lately, and having the organized digital notepad of a wiki to track my findings has really multiplied my productivity. If your only previous experience was with Wikipedia, please stop by Dokuwiki while you run screaming from their syntax. Dokuwiki is very simple to edit, including the table syntax. Highly recommended :)&lt;br /&gt;&lt;br /&gt;Head on over to &lt;a href="http://www.bullsigh.net/"&gt;bullsigh&lt;/a&gt;&amp;nbsp;if you like to check out the wiki.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-1677993476336696230?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/1677993476336696230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=1677993476336696230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1677993476336696230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1677993476336696230'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/bullsighnet-is-born.html' title='Bullsigh.net is born!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-1471288646211505685</id><published>2010-01-14T20:17:00.001-05:00</published><updated>2010-01-16T01:29:38.259-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slicehost BS detector reviews'/><title type='text'>Slicehost</title><content type='html'>I've decided that I want to get a webserver up and running out there on the wild internets. It's always a good idea to do some research before giving a strange company your credit card information for a subscription service, so I did some asking around with friends and colleagues. Another important research tool that I've used is the different rating aggregating websites. Sites like&amp;nbsp;&lt;a href="http://hostjury.com/"&gt;hostjury.com&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.webhostingreviews.com/"&gt;webhostingreviews.com&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://reviews.cnet.com/web-hosting/"&gt;reviews.cnet.com&lt;/a&gt;. It is very important when viewing these websites to have a finely tuned BS detector. If you need that abbreviation expanded, ask your parents. I'll outline a couple facets of my superhuman lie detector skills:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check the dates of posts. Having even more than one post in a day should arouse some suspicion,&amp;nbsp;more-so&amp;nbsp;if on the same site, and definitely if there are five with perfect scores posted within a one hour time-span. Some nefarious startups spend all their time reviewing themselves favorably, rather than reviewing and improving their products.&lt;/li&gt;&lt;li&gt;Avoid any reviews that rate the service at 85% or higher. Personally, I like to read the 0% reviews. These are very easy to divide into fact and fiction and will generally hint at problems with a product once you strip away the anger and exaggerations.&lt;/li&gt;&lt;li&gt;Avoid review aggregation sites that contain only glowingly favorable posts. These are more likely to be an alternative advertising channel than a bona-fide review aggregator.&lt;/li&gt;&lt;/ul&gt;It's important to note that these shouldn't be considered deal-breakers by themselves. Think of them as fuzzy values. Too many instances of each class of problem should be a strong no, while a more ambivalent result is a little less clear cut.&lt;br /&gt;&lt;br /&gt;So using these tactics and conversations with others, I settled on&amp;nbsp;&lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt;. I have nothing to say about their service because the registration form is open in another tab right now :)&lt;br /&gt;&lt;br /&gt;More to follow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-1471288646211505685?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/1471288646211505685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=1471288646211505685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1471288646211505685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1471288646211505685'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/slicehost.html' title='Slicehost'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-6296934595477148161</id><published>2010-01-14T19:45:00.001-05:00</published><updated>2010-01-16T01:30:11.175-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mombuntu ubuntu'/><title type='text'>Mombuntu, The Long Journey</title><content type='html'>Well, I mailed off the Mombuntu box today. The very last tweak was to change Mom's account password from a fairly secure password to "ChangeMePlease!". Hopefully she gets the hint (I'll call about it anyway). I sent it UPS ground, so I'm not sure it will arrive by Saturday. I had intended it to be sent out yesterday, but it just wasn't in the cards. I'll be sure to post a follow-up after she has had it for a day and again after she's been using it for two weeks. I'm really excited to be able to SSH in and fix things, should they go wrong.&lt;br /&gt;&lt;br /&gt;As for the Jakarta madness, I haven't given it much attention so far this week due to a lot of other things polling me for time. Expect another Jakarta post Saturday night.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-6296934595477148161?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/6296934595477148161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=6296934595477148161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6296934595477148161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6296934595477148161'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/mombuntu-long-journey.html' title='Mombuntu, The Long Journey'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-2435213606674733251</id><published>2010-01-08T20:07:00.001-05:00</published><updated>2010-01-08T20:07:36.455-05:00</updated><title type='text'>Wrangling with Apache Commons, Part Three</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_X94C3f8w84U/S0fWiaoT1wI/AAAAAAAAAB0/dYdo2j51iUE/s1600-h/FTP+Facade+Class+Diagram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_X94C3f8w84U/S0fWiaoT1wI/AAAAAAAAAB0/dYdo2j51iUE/s320/FTP+Facade+Class+Diagram.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;That's a class diagram of the interfaces involved in my FTP Façade. The lines indicate dependencies between interfaces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-2435213606674733251?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/2435213606674733251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=2435213606674733251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2435213606674733251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2435213606674733251'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/wrangling-with-apache-commons-part.html' title='Wrangling with Apache Commons, Part Three'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_X94C3f8w84U/S0fWiaoT1wI/AAAAAAAAAB0/dYdo2j51iUE/s72-c/FTP+Facade+Class+Diagram.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7636767578394085625</id><published>2010-01-08T19:44:00.000-05:00</published><updated>2010-01-08T19:44:26.163-05:00</updated><title type='text'>Mombuntu, Part Three</title><content type='html'>Hello all!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After the recommendation of a couple of colleagues, I tried the Thunderbird email client. I must say, it was easy to setup and seems &lt;b&gt;far&lt;/b&gt;&amp;nbsp;easier to use than Evolution. &amp;nbsp;I'll be changing the Mom account over to Thunderbird shortly. The &lt;a href="http://docs.google.com/Doc?docid=0AeRmm7U7V1MMZGYzYmhmNWZfMTVjN2Z4emNkZA&amp;amp;hl=en"&gt;Mombuntu Specification&lt;/a&gt; is complete and now frozen, and I only have a handful of tasks remaining! It's looking like I'll be complete to mail out a week early on Wednesday. I really had no idea this would be so simple!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Look for another post on the FTP library up next.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7636767578394085625?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7636767578394085625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7636767578394085625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7636767578394085625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7636767578394085625'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/mombuntu-part-three.html' title='Mombuntu, Part Three'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-4028785162344384954</id><published>2010-01-07T23:56:00.001-05:00</published><updated>2010-01-08T00:16:44.834-05:00</updated><title type='text'>Wrangling with Apache Commons, Part Two</title><content type='html'>Hello there imaginary blog stalkers! I made some pretty good progress with the FTP Façade today. I was able to successfully implement concurrent file downloads (we'll see how non-trivial that is in a moment) as well as providing transfer status and callbacks on completion or error of the transfer.&lt;br /&gt;&lt;br /&gt;The first task to this was extending my FTP Façade interface. I decided on an FTPFileTransfer object to provide an interface for getting information about the transfer (upload or download). This includes things like how many bytes have been transferred, how large the file being transferred is, whether or not the transfer has completed (more on this in a moment), &amp;nbsp;and if the transfer is in an error state (due to an IOException for instance). The first real problem I had to solve was whether I wanted the client code to poll each transfer object for completion status, or notify them via callback. Of course, &lt;a href="http://en.wikipedia.org/wiki/Polling_(computer_science)"&gt;polling&lt;/a&gt; is generally out of style these days, but I shuddered at the thought of client code initializing arrays of anonymous inner classes... So I asked a colleague who suggested that I just make a listener for the whole service. This was perfect! I had thought about that when I first started the API, but had not determined a real need for it yet. So I declared an FTPSessionListener interface that would get calls when a transfer completes or fails unexpectedly (and be provided the FTPFileTransfer object in question). The isComplete method was retained to simplify tracking transfer statuses on the client side. If I didnt provide it, then there would be some booleans floating around on the other side of my API wall.&lt;br /&gt;&lt;br /&gt;I decided that the way I wanted to expose file retrieval was to have the user pass in an array of FTPFileEntry objects and a File pointing to the local folder to place them in. This way, the user can list the files in a directory on the remote machine and then using the returned objects, request files to download. This, of course, meant that concurrent downloads would be expected.&lt;br /&gt;&lt;br /&gt;Looking into the &lt;a href="http://wiki.apache.org/jakarta-commons/Net/FrequentlyAskedQuestions"&gt;Apache commons FAQ&lt;/a&gt;, I discovered that their suggested means of implementing concurrent downloads is to create a new FTPClient connection for each transfer. I did this using a class that implements &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runnable.html"&gt;Runnable&lt;/a&gt; and an &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html"&gt;ExecutorService&lt;/a&gt; on the FTPServiceProvider level (the top point of my API). I'm leaving out a lot of the protective measures this involved. Each one of those new clients could throw an IOE during many different parts of the process, listeners need to be notified, etc. &amp;nbsp;I realize that this is getting a little hard to follow, so I will post a class diagram soon to help everyone &lt;a href="http://en.wikipedia.org/wiki/Grok"&gt;grok&lt;/a&gt; my plans. The next piece was to provide updates on the bytes read by updating the value stored in each FTPFileTransfer. The interface provided by the commons library had a blocking call, retrieveFile(String, OutputStream) : boolean, and a call that would return an InputStream, retrieveFileStream(String) : InputStream. The first one was useless, as I would not be able to listen in on the transfer. Instead, I went with the InputStream and used a utility method to do buffered copying, notifying a listener at each iteration of the copy. This did the trick!&lt;br /&gt;&lt;br /&gt;I now have concurrent transfers with status info! Up next, uploading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-4028785162344384954?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/4028785162344384954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=4028785162344384954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4028785162344384954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4028785162344384954'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/wrangling-with-apache-commons-part-two.html' title='Wrangling with Apache Commons, Part Two'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-8827244682956446088</id><published>2010-01-06T21:34:00.002-05:00</published><updated>2010-01-06T21:35:55.329-05:00</updated><title type='text'>Mombuntu, Part Two</title><content type='html'>&amp;nbsp;&amp;nbsp; Well, the working spec for Mombuntu is available for viewing &lt;a href="http://docs.google.com/Doc?docid=0AeRmm7U7V1MMZGYzYmhmNWZfMTVjN2Z4emNkZA&amp;amp;hl=en"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I got quite a bit of setup accomplished on this front today. I'll outline a couple of the less-trivial things in hopes of helping others who find themselves here after scouring the internets for help.&lt;br /&gt;&lt;br /&gt;So the first thing that was slightly tricky was getting certificate-based SSL up and running. Ubuntu does not come with an SSL daemon installed by default, but thanks to the miracle that is aptitude, its as simple as:&lt;br /&gt;&lt;br /&gt;sudo apt-cache search sshd&lt;br /&gt;&lt;br /&gt;Find a good candidate (I chose openssh-server, your package server may have different results) and then:&lt;br /&gt;&lt;br /&gt;sudo apt-get install openssh-server&lt;br /&gt;&lt;br /&gt;This will download and install the ssh daemon, as well as kick starting it. Once the package finished installing, I hopped on the mac and went to my ~/.ssh folder:&lt;br /&gt;&lt;br /&gt;machine:~ dahlgren$ cd .ssh&lt;br /&gt;&lt;br /&gt;Then&amp;nbsp; I made a 4096 bit rsa key:&lt;br /&gt;&lt;br /&gt;machine:.ssh dahlgren$ ssh-keygen -t rsa -b 4096&lt;br /&gt;&lt;br /&gt;This will ask you some questions, I wrote my key to ~/.ssh/id_rsa (the default) and associated a passphrase with my key. If you don't use a passphrase and your private key gets out, then you're hosed. After the key is built, I ssh into the linux account and in the (remote) ~/.ssh folder, I added the key data to the authorized_keys file. Next, I wanted to disable password based logins to ssh, so this was as simple as setting a couple options in the /etc/ssh/sshd_config file:&lt;br /&gt;&lt;br /&gt;RSAAuthentication yes&lt;br /&gt;PasswordAuthentication no&lt;br /&gt;&lt;br /&gt;That's it! After that point, logging in to the new linux box from the mac prompted me for my key passphrase (through an OS X dialog) and then I was on the remote system!&lt;br /&gt;&lt;br /&gt;The second part that was a little hairy was getting Evolution, Ubuntu's default email client, to work with gmail. I had created a gmail account for my mom and wanted to tie it into Evolution. I followed the directions exactly for setting up IMAP (receiving) and SMTP (sending) and once completed, I found that NOTHING worked. Awesome. Doing a bit more digging, I &lt;a href="http://mail.google.com/support/bin/answer.py?answer=78799"&gt;found&lt;/a&gt; that the SMTP would fail because GMail requires STARTTLS, which implies that SMTP runs over a nonstandard port (apparently). Evolution has no boxes to type in the port number. Wtf. After another round of googling, I found that you can specify the port in the server address and Evolution secretly knows how to parse it (Bad software! Why would you hide that!?). So I changed the address to smtp.gmail.com:587 and tried sending a test email again. Still nothing. In fact, the three emails that google spams your new account with weren't making it to evolution either. Hmmm... Then I realized that I had used placeholdername as the username, rather than placeholdername@gmail.com (see the gmail instructions again). Problem solved! Once the email was up and running, I quit focusing on setup and started looking at the application. That was a mistake. The UI is horrific and obviously meant for somebody that has been locked in a room and beaten with the free software stick while GNUde. I won't go nuts bitching about it, but the worst part is this "On This Computer" folder that Evolution decides to force upon you. When you are using IMAP, you get a nice big useless On This Computer folder, complete with it's own Inbox (containing an application generated email), Drafts, Junk, Outbox, Sent, Templates, and Trash subfolders. Phew. That's a lot of noise that my mom will never need and will likely confuse her. Underneath this useless abomination, my IMAP account for Gmail appears. The folder's generated for this are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gmail&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Inbox&lt;/li&gt;&lt;li&gt;[Gmail]&lt;/li&gt;&lt;ul&gt;&lt;li&gt;All Mail&lt;/li&gt;&lt;li&gt;Drafts&lt;/li&gt;&lt;li&gt;Sent Mail&lt;/li&gt;&lt;li&gt;Spam&lt;/li&gt;&lt;li&gt;Starred&lt;/li&gt;&lt;li&gt;Trash&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Junk&lt;/li&gt;&lt;li&gt;Personal&lt;/li&gt;&lt;li&gt;Receipts&lt;/li&gt;&lt;li&gt;Travel&lt;/li&gt;&lt;li&gt;Trash&lt;/li&gt;&lt;li&gt;(and something else I deleted before writing this)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Isn't that a bit ridiculous? Does EVERY account for every type of email REALLY need a Receipts folder? A Travel folder? Come on! So now, rather than just exposing the IMAP structure, I have to explain to my mom to dig two layers deep in this nested heirarchy of noise in order to find her email. Not good. I did some searching on the On This Computer monster and &lt;a href="http://ubuntuforums.org/archive/index.php/t-900818.html"&gt;found&lt;/a&gt; that the best working solution was to delete the parent directory it is mapped to ($HOME/.evolution/mail/local) and replace it with a symbolic link pointing to /dev/null. WHAT?!? I wonder if any evolution users are happy with the way this works. *Sigh*&lt;br /&gt;&lt;br /&gt;Anyway, I made some good progress on Mombuntu tonight. Expect another post about working with the Apache / Jakarta Commons Net library tomorrow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-8827244682956446088?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/8827244682956446088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=8827244682956446088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8827244682956446088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8827244682956446088'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/mombuntu-part-two.html' title='Mombuntu, Part Two'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-6644543976691148835</id><published>2010-01-05T20:11:00.004-05:00</published><updated>2010-01-05T21:33:59.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computers'/><category scheme='http://www.blogger.com/atom/ns#' term='Gift'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Project MomBuntu, Part One</title><content type='html'>&lt;span style="white-space: pre;"&gt; &lt;/span&gt;My mother has been dropping subtle (and not so subtle) hints that she would really like to have a laptop to use around the house. I set them up with a wireless router a couple of years ago, but this was only used by a desktop (as running cable was out of the question) and my laptop when I visited. If she had a laptop, then the information flow of the internet could reach her from every corner of the house! The vast store of human experience available for browsing could change her life in fundamental ways, new methods of living could be derived! She probably won't be researching so much as emailing me chain letters of jokes I don't get, but hey, she'll be happy about it :)&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;So I've decided that Ubuntu would be the best choice for her. It's easy to learn, and the hardware compatibility is outstanding. Now, I certainly wouldn't expect Mom to be able to pick up a vanilla Ubuntu distro and dive screaming into the inter-tubes with a thirst for trolling. Instead, I want to make this experience as easy as possible. This means things like placing large and conspicuous icons for common applications on the desktop, customizing the window manager to be easily readable (she's older and has poor vision), setting up EVERYTHING that she will want out of the box, and making the machine "Just Work" as much as possible. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;I really want this gift to be pure good, not the often frustration-riddled experience that non-technical users have when encountering a new computer. I've given myself a tentative completion date of January 19th with the intent to mail out the completed package the next day, January 20th (a Wednesday). This should allow the package to make it over to Alabama by Saturday, giving Mom a full weekend day to adjust to the computer, rather than excitedly trying to fit it in between work, cooking, cleaning, and dealing with my Father. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;So what tasks are involved with this? Well, I'd say that defining those tasks is the absolute first step. I need to roll up a document outlining exactly what I want to accomplish given a baseline Ubuntu 9.10 install. I successfully got Ubuntu on the box late last night and the wireless worked of the box (WHAT?! On a laptop!? My how the Linux world has matured!). I also created an account for my mom to use. Anyway, back to the list. I'd like to have this list completed by Friday night so that I can start work in earnest this weekend. The Spring Semester starts on the 11th, so I need to get in as much work as I can this weekend. I'll be posting a link to view the document on this blog when it gets matured a bit more.&lt;br /&gt;Until next time!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-6644543976691148835?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/6644543976691148835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=6644543976691148835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6644543976691148835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6644543976691148835'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/project-mombuntu-part-one.html' title='Project MomBuntu, Part One'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-756109763773868518</id><published>2010-01-05T17:38:00.001-05:00</published><updated>2010-01-05T17:38:27.882-05:00</updated><title type='text'>Wrangling with Apache Commons, Part One</title><content type='html'>&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;I've been testing out the Jakarta Commons Net FTP (JNF) http://commons.apache.org/net/ library for use in a project and I've been having difficulty just getting a client to connect and list files on another machine. It's been even worse because I have no ftp server to test with! My first instinct was, "Mac! Surely you have an ftp daemon!". &lt;/div&gt;&lt;div&gt;Alas:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;machine:~ dahlgren$ ftpd&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;-bash: ftpd: command not found&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Luck was not with me this time, sigh. So I did some &lt;a href="http://www.google.com/search?q=anonymous+ftp"&gt;googling&lt;/a&gt; and found a random server to test on: rtfm.mit.edu ! This was not the best idea, because it added a mysterious variable to the whole process. I tested with the command line client, but that couldn't prove that I was using the library correctly. Was this server sane? Sure it's an MIT hostname, but it's also named rtfm! Also I was seriously concerned that testing on an open ftp server which serves lists of open ftp servers might cause me to become trapped in some recursive hell. I had been trying to get a successful connection for the past few days. Earlier tonight I determined that I was actually connecting to the server, but something was blowing up in the file listing code. This was an obscure sounding exception:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exception in thread "main" org.apache.commons.net.ftp.parser.ParserInitializationException: Parser key cannot be null&lt;/div&gt;&lt;div&gt; at org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory.createFileEntryParser(DefaultFTPFileEntryParserFactory.java:82)&lt;/div&gt;&lt;div&gt;        at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2263)&lt;/div&gt;&lt;div&gt;        at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2046)&lt;/div&gt;&lt;div&gt;        at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2093)&lt;/div&gt;&lt;div&gt;        at ftpclient.serviceimpl.JakartaServiceProvider.listAllFiles(JakartaServiceProvider.java:51)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;meta charset="utf-8"&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Ah the 'ole null parser key... yeah I hate when that happens. Well, since I hadn't actually done anything involving parsers or their keys, it was something down in their implementation blowing up, I mean all I did was essentially:&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;    org.apache.commons.net.ftp.FTPClient client;&lt;/div&gt;&lt;div&gt;    String hostname;&lt;/div&gt;&lt;div&gt;    int portNumber;&lt;/div&gt;&lt;div&gt;    // ... &lt;/div&gt;&lt;div&gt;    client.connect(hostname, portNumber);&lt;/div&gt;&lt;meta charset="utf-8"&gt;&lt;div&gt;    FTPFile[] files = client.listFiles(); // Can throw IOE&lt;/div&gt;&lt;meta charset="utf-8"&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;After some furious googling, I had not found anything about this problem specifically. I was getting hung up, so I decided to say screw it and start looking for tutorials to see if there were any extra steps involved. All the results I found were just little four step descriptions of how to connect to a server, download / upload a file, and disconnect. None of them covered listing the files any more thoroughly than the &lt;a href="http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html"&gt;Apache docs&lt;/a&gt;. At this point I decided that I needed to dig down in the source and see what the problem was. &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;I had not yet hooked netbeans up to the source code for JNF, but the source was there waiting for me, all gzipped up in tar. I had not set up a netbeans project for the library because it was in a maven repository. I've heard that maven is a pretty awesome build system, but it really turns me off every time I cross paths with it. With that in mind, I wanted to find a way to associate source code directories with a JAR library. I knew this was possible, because the java library code does that. &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;I came across this &lt;a href="http://rubenlaguna.com/wp/2008/02/22/attach-source-code-to-a-netbeans-library-wrapper-module/"&gt;blog entry&lt;/a&gt;. Problem solved!&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;I checked into the call stack at hand and found that, yep that parser key (whatever it is) was apparently null:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    // DefaultFTPFileEntryParserFactory : 81&lt;/div&gt;&lt;div&gt;     public FTPFileEntryParser createFileEntryParser(String key)&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;if (key == null)&lt;/div&gt;&lt;div&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;throw new ParserInitializationException("Parser key cannot be null");&lt;/div&gt;&lt;div&gt;        // ...&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Looking the next level up, I found that the provided String came from a call to the FTPClient's getSystemName() method:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    if (__systemName == null &amp;amp;&amp;amp; FTPReply.isPositiveCompletion(syst()))&lt;/div&gt;&lt;div&gt;            __systemName = _replyLines.get(_replyLines.size() - 1).substring(4);&lt;/div&gt;&lt;div&gt;    return __systemName&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;This method will return null iff this statement fails:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;FTPReply.isPositiveCompletion(syst()))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;meta charset="utf-8"&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	 &lt;/span&gt;So again, I went go a level deeper to the syst() method. This is a convenience method for sending the FTP "SYST" command and returning the response. Apparently, this response is not considered 'positive completion'. Being somewhat impatient, I have been avoiding looking at the FTP protocol in depth. I mean, I'm just trying to do some very simple things with it and I dont WANT to expose that much stuff for client code to deal with. With that in mind, I looked into the SYST command. The RFC, RFC959 found at &lt;a href="http://www.faqs.org/rfcs/rfc959.html"&gt;www.faqs.org&lt;/a&gt; (that's a 'Q') describes it as:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SYSTEM (SYST) This command is used to find out the type of operating system at the server. The reply shall have as its first word one of the system names listed in the current version of the Assigned Numbers document [4].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Ok, so this doesn't sound like something that should arbitrarily fail. Looking at the code for the sendCommand(String, String) method on the (org.apache.commons.net.ftp) FTP class, I discovered from the java docs that the actual response string could be had with a call to getReplyString(). So I coded up a quick method to dump both the response integer and the string to the SYST command, here's what I got:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;    Connecting to rtfm.mit.edu:21&lt;/div&gt;&lt;div&gt;    Sending SYST:&lt;/div&gt;&lt;div&gt;    Response: 530&lt;/div&gt;&lt;div&gt;    Reply String: 530 Please login with USER and PASS.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, that explains the mystery. I need to explicitly anonymously log in, and those are two words that you should try to avoid placing together in any other context. The null string was because according the RFC959, the first word of a valid response to SYST has to be a word from the "OFFICIAL SYSTEM NAMES" section of &lt;a href="http://www.faqs.org/rfcs/rfc943.html"&gt;RFC 943&lt;/a&gt;  and "530" doesn't appear there.&lt;/div&gt;&lt;div&gt;     I added a call to the FTPClient login method using "anonymouse" and "password" for the username and password specifically.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt; Connecting to rtfm.mit.edu:21&lt;/div&gt;&lt;div&gt;    Sending SYST:&lt;/div&gt;&lt;div&gt;    Response: 530&lt;/div&gt;&lt;div&gt;    Reply String: 530 Please login with USER and PASS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The same output?! Then I realized I had mistakenly tried to summon a partner of &lt;a href="http://en.wikipedia.org/wiki/Mighty_Mouse"&gt;Mighty Mouse&lt;/a&gt;'s and changed the user to be "anonymous".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;    Connecting to rtfm.mit.edu:21&lt;/div&gt;&lt;div&gt;    Sending SYST:&lt;/div&gt;&lt;div&gt;    Response: 215&lt;/div&gt;&lt;div&gt;    Reply String: 215 UNIX Type: L8&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Success! Now to put back in the listing code and...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Connecting to rtfm.mit.edu:21&lt;/div&gt;&lt;div&gt;1. Index-byname / java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=0,WEEK_OF_YEAR=2,WEEK_OF_MONTH=2,DAY_OF_MONTH=4,DAY_OF_YEAR=4,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=7,HOUR_OF_DAY=7,MINUTE=22,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0] / 0&lt;/div&gt;&lt;div&gt;2. Index-byname.gz / java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=0,WEEK_OF_YEAR=2,WEEK_OF_MONTH=2,DAY_OF_MONTH=4,DAY_OF_YEAR=4,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=7,HOUR_OF_DAY=7,MINUTE=22,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0] / 0&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It goes up to 7. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well that was a success! I learned that if a server wants you to login before listing the files, then the library will crash and I also learned that the FTPFile toString method is pretty noisy :/&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/5584729569182792012-756109763773868518?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/756109763773868518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=756109763773868518' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/756109763773868518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/756109763773868518'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2010/01/wrangling-with-apache-commons-part-one.html' title='Wrangling with Apache Commons, Part One'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-3629356238451556354</id><published>2008-09-14T15:53:00.002-04:00</published><updated>2008-09-14T16:10:31.385-04:00</updated><title type='text'>JOGL woes!</title><content type='html'>So after the successful test of HyperUtils and the decision to slow development on it, I went on to begin my statistical analysis toolkit. I knew that I wanted to separate the view from the data model, more than just by modules, but actually using what I felt was the best tool for the job. I ended up deciding to use java backed by JOGL as a visualization platform. The first step was to set up the JOGL testing harness. This seemed easy enough, although my OpenGL was a little rusty I was able to quickly get back into the feel of the API. JOGL uses such a minimalist approach in wrapping OpenGL that it feels just like talking to the C++ API. I quickly implemented an extremely basic scene graph and began working on a camera for traversing the visualizations. Unfortunately, I was having an issue where every graph node that I rendered was translated correctly relative to its parent, but the scene root was always stuck to the camera! My code was so simple that I spent two days trying to figure out what the problem was. I checked and rechecked my matrix math, my hierarchy flattening code, and verified I was using the right matrix format (column vs row major). All of this turned up no errors! Disheartened, I scoured the internet and found that JOGL has practically no documentation. I downloaded and looked at example code, but nobody else was setting transforms directly (glLoadMatrixf) or if they were, they were not using any sort of a hierarchy. I was at my wits end when I found a link that pointed to a book my bosses wrote, &lt;a href="http://books.google.com/books?id=JOlZEWJmQdgC&amp;amp;dq=Practical+Java+Game+Programming&amp;amp;pg=PP1&amp;amp;ots=wecaJk46rq&amp;amp;sig=HUBP5rIwK5qMk2pPo_x8CvWWUUE&amp;amp;hl=en&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result"&gt;Practical Java Game Programming.&lt;/a&gt; This link reminded me that I had a copy of the book on my shelf, so I began flipping through the chapters. Lo and behold, there it was, a chapter on JOGL! With a few pages I found the magic fact that I had been missing (p.388):&lt;br /&gt;&lt;blockquote&gt;The glPushMatrix function duplicates the current matrix and then pushes that matrix onto the stack.&lt;/blockquote&gt;That was it! I had been assuming that the matrix stack was "flattened" intrinsically. Because of this faulty assumption, I was overwriting my camera transform with each rendered object's world matrix. After learning that I was quickly able to fix the issue!&lt;br /&gt;    The next goal is to build the first piece of the statistical analysis toolkit using (as portable as possible) C++ code and using the &lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;Java Native Interface (JNI)&lt;/a&gt; to link it with my visualization framework.&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-3629356238451556354?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/3629356238451556354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=3629356238451556354' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/3629356238451556354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/3629356238451556354'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/09/jogl-woes.html' title='JOGL woes!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-2304683695878553663</id><published>2008-09-12T23:49:00.002-04:00</published><updated>2008-09-12T23:53:36.511-04:00</updated><title type='text'>Success!</title><content type='html'>Today marked the first successful test of HyperUtils on the Nintendo DS. It was integrated smoothly and the tests were quickly converted (simply changed cout for a system library print function). My goal of having zero external dependencies has been proven effective for embedded systems! I'm going to slow down new feature development on HyperUtils for a bit while I work on another small project. I want to test the utils on the iPhone next!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-2304683695878553663?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/2304683695878553663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=2304683695878553663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2304683695878553663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2304683695878553663'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/09/success.html' title='Success!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7731142125861283069</id><published>2008-08-31T16:42:00.003-04:00</published><updated>2008-08-31T16:46:52.593-04:00</updated><title type='text'>Solution Hint</title><content type='html'>I successfully solved my template problem for a ListBehavior template mechanism. The syntax is a bit hairy (good reason not to expose this layer) but it works.&lt;br /&gt;&lt;br /&gt;So here's a hint for the "left as an exercise for the reader" part:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;template &amp;lt;template &amp;lt;typename&amp;gt;&lt;template&gt;&lt;typename&gt; class ConcreteArray, typename DataType&amp;gt;&lt;/typename&gt;&lt;/template&gt;&lt;/code&gt;&lt;/pre&gt; Pretty ugly eh? Stay tuned for more exciting breakthroughs... hahah&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7731142125861283069?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7731142125861283069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7731142125861283069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7731142125861283069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7731142125861283069'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/08/solution-hint.html' title='Solution Hint'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7269304939686749434</id><published>2008-08-30T17:43:00.010-04:00</published><updated>2008-08-31T10:12:41.639-04:00</updated><title type='text'>The C++ Wall</title><content type='html'>I have just had my first encounter with the C++ Wall. This is a term that I once heard a classmate use when talking about advanced object oriented designs. Basically there is a lot of OO sort of things that C++ does not provide support for.  To put things in more concrete terms, let me share a little bit of the development process that I'm going through with the HyperUtil library.&lt;br /&gt;The initially stated goals of the HyperUtil library include being MT Hot with zero dependencies to the stdlib. This meant having an architecture to support a pluggable memory model and a pluggable threading model.&lt;br /&gt;The first components that I made were the rudimentary interfaces for the AbstractThreadingModel and AbstractMemoryModel base classes. Next I made an AbstractList interface to encapsulate the implementation details (backed by linked list or primative array for example). In Java, this sort of thing is quite easy to do and I frequently use Abstract Container-type interfaces. After fighting with the compiler and various syntax iterations I resigned myself to scouring the internet for help, only to find that there is no way to subclass a templated Abstract Base Class. This is due to a number of characteristics of the language. First, the template mechanism is really more like a fancy macro system. The code for the templated type is only created during specialization (the process of telling a templated class / function what type you will be using) and two specializations of the same type are not the same in the language!&lt;br /&gt;I sort of put the problem aside for a while and went on with developing an array type for the library (resizable, maintains a length) that is templated. I want to use the flexibility provided by templates, but I strongly dislike how using a templated type anywhere causes the template keyword to infest more and more of your code until it begins to resemble the STL. As a temporary workaround for my list interface issue, I have been considering another use of templated types. Consider the following C++ code (Note: exposing 'T' from the templated concrete list to this template is left as an exercise to the reader):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;template &amp;lt;typename AbstractList&amp;gt;&lt;br /&gt;class ListBehavior&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt; AbstractList*    m_pListImplementation; // Delegate&lt;br /&gt;public:&lt;br /&gt; // Constructor, destructor etc omitted for clarity&lt;br /&gt; T&amp;amp;       operator[](int index);&lt;br /&gt; const T&amp;amp; operator[](int index) const;&lt;br /&gt;&lt;br /&gt; int      size(void) const;&lt;br /&gt;};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Given this class, we then begin to see that the ListBehavior templated class can be used as a way of providing an interface (or even a contract of sorts). With that idea in mind, those methods can be defined in such a way that we get free compile-time checking to ensure that the list behavior we define is adhered to (just like an interface class).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;template &amp;lt;typename AbstractList&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;typename&gt;T&amp;amp; ListBehavior&lt;abstractlist&gt;::operator[](int index)&lt;br /&gt;{&lt;br /&gt;return (*m_pListImplementation)[index];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/abstractlist&gt;&lt;/typename&gt;&lt;/code&gt;&lt;code&gt;template &lt;/code&gt;&lt;code&gt;&amp;lt;typename AbstractList&amp;gt;&lt;/code&gt;&lt;code&gt;&lt;typename&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;typename&gt;const T&amp;amp; ListBehavior&lt;abstractlist&gt;::operator[](int index) const&lt;br /&gt;{&lt;br /&gt;return (*m_pListImplementation)[index];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &lt;/abstractlist&gt;&lt;/typename&gt;&lt;/code&gt;&lt;code&gt;&lt;typename&gt;&lt;code&gt;AbstractList&lt;/code&gt;&lt;code&gt;&gt;&lt;/code&gt;&lt;code&gt;&lt;typename&gt;&lt;abstractlist&gt;&lt;typename&gt;&lt;br /&gt;int size(void) const&lt;br /&gt;{&lt;br /&gt;return&lt;/typename&gt;&lt;/abstractlist&gt;&lt;/typename&gt;&lt;/code&gt;&lt;code&gt; m_pListImplementation-&gt;size();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/typename&gt;&lt;/code&gt;&lt;/typename&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now, when a ListBehavior object is specialized, the compiler will create the simple delegation code and cause an error if the type used to specialize it doesn't implement all of the AbstractList functionality!&lt;br /&gt;I understand that this is a slightly complex usage model (using a templated type as a wrapper for a certain subset of behaviors), but the intention if only to expose this to the Library internally, for flexible swapping of implementations and such.&lt;br /&gt;The next hurdle I see is the same sort of problem. I'd like the AbstractMemoryModel type to be templated. I want this so that calls to the underlying implementation can actually allocate the correct types rather than just char pointers. I have a suspicion that the casting from char* to indiscriminate types may cause serious performance issues if not outright crashes due to byte-alignment considerations. This is not a terrible problem on PC platforms, but could be debilitating on embedded systems not equipped to handle sloppy coding.&lt;br /&gt;&lt;br /&gt;More to follow,&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7269304939686749434?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7269304939686749434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7269304939686749434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7269304939686749434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7269304939686749434'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/08/c-wall.html' title='The C++ Wall'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7928078294737604604</id><published>2008-08-24T10:05:00.003-04:00</published><updated>2008-08-24T10:14:17.198-04:00</updated><title type='text'>Side project decision</title><content type='html'>I decided on a side project that should be pretty rewarding. I am going to make a C++ library of data structures (both common and exotic) and math utilities. The thing that will differentiate this from say, the STL, is an architecture meant to exploit massive parallelism from the bottom up. This will be provided through execution contexts that define both a threading and memory allocation model. The other major difference is that my library will not rely on any of standard libraries, making the library itself very lightweight (good for embedded systems maybe?). Furthermore, the configurable memory and threading models allow for the library to be optimized for specific platforms without unnecessarily wading through plumbing code.&lt;br /&gt;&lt;br /&gt;Completion of this will allow me to use this library to get other utilities that I may craft up and running. What exactly those other utilities might be is still up in the air... hahah.&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7928078294737604604?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7928078294737604604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7928078294737604604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7928078294737604604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7928078294737604604'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/08/side-project-decision.html' title='Side project decision'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7072745321105116326</id><published>2008-08-23T16:00:00.007-04:00</published><updated>2008-08-23T16:42:28.945-04:00</updated><title type='text'>Side projects, oh side projects</title><content type='html'>So I have been stuck in a kind of rut lately with determining what, exactly, I would like to work on as a side-project in my free time. The first thing that always pops into my head is "Make something useful!". Right... that seems pretty obvious. But what does useful mean on a qualitative level? Well for me, I would say that I split this into a couple of broad categories:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It helps (or forces) me to learn some tool / library / language that I am unfamiliar with currently.&lt;/li&gt;&lt;li&gt;It is a new (more efficient or more robust) method of solving some old problem.&lt;/li&gt;&lt;li&gt;It could be used in production code (at IMI) if my solution is a good one.&lt;/li&gt;&lt;/ul&gt;    Initially, I started work on a curses based client for &lt;a href="http://xmms2.xmms.org/"&gt;xmms2&lt;/a&gt;. This is a GNU application that features a client-server based model for a local music player. The interesting thing is that the client side API is very simple and easy to work with, yet it provides all the functionality of the underlying server (including playlist management, a transparent repository of media files [local and remote], and even equalization). An important distinction to be made is that the server-side is not streaming data, it just sends the sound to its machine's sound hardware. So, why make a curses client instead of a GUI? Well, I am a big fan of keyboard shortcuts and the command line in general. I find that when using &lt;a href="http://www.blogger.com/www.xfce.org"&gt;xfce4&lt;/a&gt;, I can be FAR more productive using the keyboard almost exclusively. That being said, my desktop is typically littered with terminals and having a media player that fits nicely in that terminal would be pretty sweet. The other reason is to get in touch with the developers that still have interest in command line utilities. I had hoped that by putting this offering out, I may be able to contact others with similar interests.&lt;br /&gt;&lt;br /&gt;   Unfortunately, I kind of lost interest in this project shortly after completing most of the command portion (my initial test driver was a &lt;a href="http://en.wikipedia.org/wiki/Read-eval-print_loop"&gt;REPL&lt;/a&gt; for the implemented client commands such as play, stop, forward [time], etc). The main reason to this was the extremely limiting ncurses API. I tried wrapping up the functionality in C++ objects and implementing a tree of windows but quickly found that the provided ncurses functionality just was not intended to be used this way. Thus was my grand vision crushed! There is still a part of me that wants to complete this, it has just been such slow moving progress that I feel like I am wasting my time working on it. The future of my as-yet unnamed xmms2 client is uncertain.&lt;br /&gt;   Aside from this project, one of the ideas I have been tossing around include fleshing out a game idea using the currently available technology from the project I am working on at IMI and then pitching this idea if I think it will fly. I won't share too much about this idea, but it is going to be a java webstart app. And finally, the last possibility is working on a proof of concept of some advanced piece of gaming technology. This could be some new animation technique (since character animation is sort of becoming a specialty of mine), or some sort of an interesting visualization of force vectors in a volume, etc.&lt;br /&gt;&lt;br /&gt;Something will be completed eventually... hahah.&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7072745321105116326?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7072745321105116326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7072745321105116326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7072745321105116326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7072745321105116326'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/08/side-projects-oh-side-projects.html' title='Side projects, oh side projects'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-5497877653638973776</id><published>2008-08-17T11:51:00.002-04:00</published><updated>2008-08-17T12:11:37.218-04:00</updated><title type='text'>Long Overdue Update</title><content type='html'>Well.... it certainly has been a while since the last post. A lot has happened since then, including graduation, starting a new job, and moving to a new place. I guess it'll be easiest to just go through these one at a time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Graduation:&lt;/span&gt; So I finished Full Sail University. Our final project turned out pretty good (and the presentation went well), although I think perhaps I would have been able to contribute much more had I not wanted to take project lead. I suppose I let my ego coerce me into thinking that it would be the best fit for me. Looking back, military leadership experience has nothing in common with leading a game development endeavor... haha. As for the experience as a whole, I managed to do pretty well at Full Sail, I graduated valedictorian with a couple of course directors awards. We had an excellent speech from the class salutatorian (and all around good guy), Naveen Nattam. Unfortunately I had absolutely no time to  calm down and relax for a bit after graduation because of the next two things.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The New Job:&lt;/span&gt; Towards the end of final project, I had grown rather disillusioned with the simulations industry and decided that it would be WELL worth the pay-cut to work in games instead. With this in mind I started asking around and found that a company owned by two of my instructors was ramping up development on a project. I looked into it more and determined that I was interested in working on it and started work the first Monday after final presentation.  I have now been working at Immediate Mode Interactive (www.imilabs.com) for a while now and absolutely loving it. I never would have thought that I would be working in Java and developing on a mac. Ludicrous, but so very awesome. In order to keep my more cryptic skills up to speed, I have been working on some GNU software for FreeBSD (and using FreeBSD exclusively at home). I can't get into project specifics yet (sometime soon we will get the go-ahead), but I'm &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; excited to see where this project goes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Moving:&lt;/span&gt; I moved to DeLand, my girlfriend's hometown, and into a much larger place. It's pretty awesome having all this space, although I am honestly having a hard time learning to appreciate lawn maintenance. The commute to work is about 45 miles one-way, so that is a big time consumer, but I've been dealing with it just fine. I love the small town feel of DeLand, especially because it is far enough away from I-4 and Orlando to not be ghetto =)&lt;br /&gt;&lt;br /&gt;So with all that happening, I have been a bit neglectful of the blog. Hopefully this is the first indication of that changing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-5497877653638973776?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/5497877653638973776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=5497877653638973776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/5497877653638973776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/5497877653638973776'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/08/long-overdue-update.html' title='Long Overdue Update'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-1402095849356441031</id><published>2008-06-10T20:19:00.003-04:00</published><updated>2008-06-10T21:32:58.408-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='full sail'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Uploaded Projects</title><content type='html'>Hello faithful blog stalkers... er watchers!&lt;br /&gt;&lt;br /&gt;    I recently spent some time digging through my old archives to unearth some of the really early things I made during my time at Full Sail University. I'll itemize these and give a little description as well as links to download the appropriate files.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Free Time Invaders - &lt;/span&gt;This was an assignment for the Structure of Game Design (SGD) course. I was teamed with a partner, namely Scott Rodda (who proved to be extremely easy to work with). We procrastinated on the project quite a bit and ended up doing the entire thing in a single sitting one afternoon. It isn't much to impress, but bear in mind that we did it in a few hours! The name was meant as a bit of a jibe about having to work on the project outside of class (work outside of class at Full Sail?! Ludicrous! haha).&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Link: &lt;a href="http://files.filefront.com/FreeTimeInvaderszip/;10585535;/fileinfo.html"&gt;Free Time Invaders @ FileFront.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;YADIG -&lt;/span&gt; This was another assignment for SGD that was to be done individually. We had two weeks to work on this. The things I'd like to point out about this project are the flexible sound effect manager, the easily extensible level system, and the relative complexity of such a short length project! See the project's documentation folder for the game manual... hopefully you'll get a laugh out of it. I certainly chuckled a little when I found the hard-copy and reread it.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Link: &lt;a href="http://files.filefront.com/YADIGzip/;10585474;/fileinfo.html"&gt;YADIG @ FileFront.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GBA EtchaSketch&lt;span style="font-weight: bold;"&gt; -&lt;/span&gt;&lt;/span&gt; This was a minor project that I worked on briefly on my own during the first few months I spent at Full Sail. It is basically just an extremely simple etch-a-sketch. This was well before the school introduced me to Gameboy Advance programming (In Machine Architecture II) and simply something I researched on my own. I bought a flash cartridge and impressed my girlfriend (of only a month at that point) with my GBA programming skillz. The fact that she is still with me a 18 months later should be a testament to the power of idle doodling! Hahaha!&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Link: &lt;a href="http://files.filefront.com/EtchaSketch+GBA+VHAMzip/;10585749;/fileinfo.html"&gt;EtchaSketch @ FileFront.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The Library -&lt;/span&gt; As a project for the OpenGL course, we were tasked to created a "Game Level". This was an open ended assignment allowing us to show our creativity as long as we demonstrated a successful working knowledge of the OpenGL graphics specification. We did not have long to create this, if memory serves correctly it was over a five day period. Items of note with this project are multitexturing on surfaces throughout, normal mapping (through vertex and fragment [ pixel for the DXers ] shaders), general creepiness, and my personal favorite... algorithmically generated and shelved books! I got a bit caught up in the idea of randomly creating books from a pool of building blocks and shelving them effectively rather than the whole "graphics" thing... haha. I was quite proud of my shelving algorithm and found that the overall effect is pretty effective visually. There are some strange lighting artifacts, but this is because it is the default pipeline lighting; no fancy shadow maps here.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Link: &lt;a href="http://files.filefront.com/TheLibraryzip/;10585836;/fileinfo.html"&gt;The Library @ FileFront.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;That's all for now, thanks &lt;a href="http://www.filefront.com"&gt;File Front&lt;/a&gt; for the free hosting space!&lt;br /&gt;&lt;br /&gt;--Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-1402095849356441031?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/1402095849356441031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=1402095849356441031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1402095849356441031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/1402095849356441031'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/06/uploaded-projects.html' title='Uploaded Projects'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-393072507153313533</id><published>2008-05-22T16:37:00.002-04:00</published><updated>2008-05-22T16:47:34.790-04:00</updated><title type='text'>Publisher Solicitation</title><content type='html'>I have spent the last few days building relationships with various publishers to try and get Pengcasso's Puzzle Painting packaged up and available at retail outlets. I think that with the right attitude and a bit of hard work you will be able to buy PPP at Best Buy! (Or at least on the internet... haha)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-393072507153313533?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/393072507153313533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=393072507153313533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/393072507153313533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/393072507153313533'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/05/publisher-solicitation.html' title='Publisher Solicitation'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-8194658943930192756</id><published>2008-05-09T18:57:00.004-04:00</published><updated>2008-05-22T16:37:22.879-04:00</updated><title type='text'>Alpha build available!</title><content type='html'>Our &lt;a href="http://pengkwik.serveftp.org/pengkwik/"&gt;website &lt;/a&gt;now has the alpha version of our game available for download. Additionally, the website now has more info and some things worth reading believe it or not! haha. I would encourage everyone to download the installer and give us feedback about the gameplay and bugs. There are, of course, a fair amount of bugs and we have hardly any assets in, but it can still be fun! I've had a good time playing the game while "bug testing"...&lt;br /&gt;&lt;br /&gt;Anyway, check out the website and let me know what you think about the Alpha release!&lt;br /&gt;&lt;br /&gt;URL: http://pengkwik.serveftp.org/pengkwik/&lt;br /&gt;&lt;br /&gt;Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-8194658943930192756?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/8194658943930192756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=8194658943930192756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8194658943930192756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8194658943930192756'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/05/alpha-build-available.html' title='Alpha build available!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-6894889699493944185</id><published>2008-05-08T18:01:00.002-04:00</published><updated>2008-05-08T18:11:06.753-04:00</updated><title type='text'>Fitness isn't software development!</title><content type='html'>I get asked pretty regularly for nutrition and exercise advice from friends and colleagues (&lt;span style="font-weight: bold;"&gt;especially&lt;/span&gt; nutrition advice) and take time to give pointers when I can. A close friend of mine recently said that she was frustrated with her condition and asked me to develop a diet for her. I am not a believer in canned diets, so rather than give her a magic weight loss recipe and say "Here ya go!", I decided to put the power in her hands by giving her the ideas and theories rather than the end product. Sort of like the "give a man fish" / "teach a man to fish" idea. I ended up with a gigantic email to her and have decided to post it here so I can refer others to the post. This way I won't forget to mention things in a rush and I can help share the knowledge I've picked up since I became interested in bodybuilding. Please note that I have not been professionally trained in any of this and what I say is just what I've found through various sources. The information may or may not be true, but it works for me.&lt;br /&gt;&lt;br /&gt;Here's the email:&lt;br /&gt;&lt;hr /&gt;First off, let me say that I'm glad you've expressed interest in your physical fitness! It has proven time and time again to be a deeply rewarding hobby for me.&lt;br /&gt;&lt;br /&gt;So here's the deal; while a meal plan alone could help you, it will work FAR better as part of a diet and exercise plan. Now before you freak out, we can make the exercise part as painless as possible (although using a gym would benefit you a ton!).&lt;br /&gt;&lt;br /&gt;Ok, so first let's start the meal plan. Rather than just giving you a diet to follow (which nobody ever actually obeys), I'll give you a few pieces of information and some simple rules to follow when making nutrition choices.&lt;br /&gt;&lt;br /&gt;Info:&lt;br /&gt;1. Carbohydrates - Carbs come in two basic forms; fast digesting and slow digesting. The difference in digestion speed determines how quickly your body converts these carbs into usable energy and because of that, how quickly they get stored. The trick is to cut down storage while maintaining your energy levels. Fast digesting carbs include things like sugars (ESPECIALLY REFINED), white flour, and other highly processed carbs. The processing they go through saves your digestive system the effort, which unfortunately means quicker storage. Ideally you should eat only slow digesting carbs. These are things like brown rice, wild rice, whole wheat products, wheat pastas, wheat bread, assorted grains, etc. Keep the refined sugar completely out of your diet if you want to lose weight efficiently. Refined sugars need very little processing from the body and consequently get stored as fat if not used immediately. This means no soda, no candy, no cakes, no fake fruit juices. Another important consideration with carbs is the time of day you eat them. I understand how difficult it can be to eat only slow digesting carbs, so when you need to eat fast digesters, eat them in the morning or before periods of physical activity. This gives your body time to burn up the energy they provide. In the evening (after 5pm or so), the only carbs you should be eating are small servings of slow digesting carbs.&lt;br /&gt;&lt;br /&gt;2. Nutrient ratio- Keeping an effective ratio of nutrients is good for ensuring that the body can build muscle and is not taking in too much of one thing or another. I try to eat about 1.5 to 2 grams of carbs for every gram of protein (depending on the time of day as stated above). You should probably try 1 to 1.5 since you are not trying to build muscle. Fats are important to have in your diet also. The area of good fats vs. bad fats is something that I don't place much stock in, basically just stay away from saturated fats and you should only be consuming about 1 gram of fat for every 3 grams of protein. So in a more readable format, try to keep your meals at the following ratio (varying slightly for time of day and activity level):&lt;br /&gt;   Carbs:55%&lt;br /&gt;   Protein:35%&lt;br /&gt;   Fat:10%&lt;br /&gt;** Note: You should increase your fat intake once you reach the level of weight you desire to avoid becoming unhealthy.&lt;br /&gt;&lt;br /&gt;3. Fiber- Fiber is something that the body cannot digest very well, and due to its bristly nature on a microscopic level, it acts as a cleaner for the digestive system. Finding the right amount of fiber intake is difficult at first as it varies from person to person. Basically, eat a lot of fiber, if you experience digestive discomfort then reign it in a bit. Broccoli and high-fiber multi-grain bread are two of my favorites for this. Another great use for fiber is to kind of "undo" a dietary mistake. Say you lose all your willpower and eat a bowl of iced cream; eating some shredded wheat immediately afterwards can partially reduce the damage that iced cream will do to you. Here is a pretty comprehensive list of high fiber foods that you should incorporate into your diet: http://www.mayoclinic.com/health/high-fiber-foods/NU00582&lt;br /&gt;&lt;br /&gt;4. Meal frequency- Eat small meals every 2.5 - 3 hours. This keeps your metabolism up because your body is constantly digesting food and getting energy. You may find it difficult to eat this much at first, but keep the meals small and you can force yourself to do it. After two or three days, you'll find yourself actually becoming hungry every three hours! A typical example of a small meal would be a grilled chicken breast (the body builder's nemesis), some unsalted green beans, and unsalted brown rice. Small frequent meals are key.&lt;br /&gt;&lt;br /&gt;5. Sodium- Your sodium intake if you eat like most Americans, should be drastically reduced. The first step is to stop adding salt to any food, regardless of how "bland" it is. This is another change that can be difficult to adapt, but will benefit and reward you greatly. The best way to do this is to cook and season everything you eat yourself. This can quickly become so time consuming that you spend all your free time cooking, which can lead to burn out. The best advice I can give you is to look at the nutrition facts for the sodium levels. You will be shocked when you start noticing that your snacks and meal components (not even whole meals!) contain upwards of 30% of your recommended daily intake of sodium. This is especially true in the south. Originally, southerners worked on farms and in fields and spent most of the day (and night for that matter) sweating. Sweating causes the body to lose electrolytes (essential for hydration), so a sodium rich diet is ideal for people who sweat a lot (outdoor professions, soldiering, etc). Unfortunately, not many people in the south spend all day sweating anymore, yet they still eat the same things! Excessive sodium levels lead to excess retained water (causing a bloated look) and unnecessary wear on the heart. Try to always go for the low sodium option when eating prepackaged foods.&lt;br /&gt;&lt;br /&gt;6. Hydration- Drink a LOT of water. While it's true that there is such a thing as water poisoning (I saw it first hand in the Army), I can assure you that you won't get it from drinking water on your own. Start carrying a refillable water bottle around with you and you will find that you sip on it quite frequently. Things like caffeine, some nutritional supplements, and salt can dehydrate you and should be compensated for with more water.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rules:&lt;br /&gt;1. No Refined Sugar!&lt;br /&gt;2. Eat Five (5) or More Meals a Day!&lt;br /&gt;3. Drink ONLY Water!&lt;br /&gt;4. Drink Plenty of Water!&lt;br /&gt;5. Watch Your Nutrient Ratios!&lt;br /&gt;&lt;br /&gt;Ok, now let's cover some exercise stuff that you can do to help you out. I understand that gym memberships can be pricey and impractical, so I'll give you some tips that you don't need a gym for.&lt;br /&gt;&lt;br /&gt;First off, I know this sounds ridiculous, but it is always a good idea to check with a physician before beginning an exercise program if you haven't been working out for years already. This is because you could have undiagnosed problems that an exercise routine could exacerbate. Probably the best bet for you, since your goal is weight loss, would be to do extended periods of medium intensity cardiovascular exercises. Ideally, you should have your heart rate elevated to a point where you are exerting yourself and sweating, but not to the point that you feel exhausted or worn out. If you have not been doing cardio regularly, start out with power walking. Running is often demonized as being bad for the joints (and it probably is), but if you cannot get on a cardio machine at a gym, I recommend running. The idea is the same, jog at a speed that keeps your heart rate up and the sweat coming, but don't overdo it. The reason for this is once you get past the fat-burning range of your heart-rate, you start getting into the cardiovascular improvement range. This doesn't burn fat as well, although you will become better at running.&lt;br /&gt;&lt;br /&gt;Putting it together:&lt;br /&gt;&lt;br /&gt;So know that you have all of this information, let's synthesize a plan that will help you get results. To begin with, you should only exercise 3 or 4 days a week. These sessions should last around 30 minutes or so. After three weeks, if you feel comfortable doing so, move this up to 5 days a week and full hour sessions. Make sure you do your workout after a meal so that you will have energy to burn. Allow yourself 30-45 minutes for digestion after you eat though, otherwise your stomach may give you some grief.&lt;br /&gt;&lt;br /&gt;If you stick to the diet rules, watch your nutrition choices, and implement this routine into your life, I guarantee you will see positive results quickly. The diet changes take discipline ad will power, but if you keep your goal in sight I'm sure you will reach it!&lt;br /&gt;&lt;br /&gt;Ronald&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-6894889699493944185?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/6894889699493944185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=6894889699493944185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6894889699493944185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/6894889699493944185'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/05/fitness-isnt-software-development.html' title='Fitness isn&apos;t software development!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-707325006262734862</id><published>2008-05-06T17:01:00.002-04:00</published><updated>2008-05-06T17:08:53.470-04:00</updated><title type='text'>Alpha Turn-In</title><content type='html'>Well, our Alpha turn-in was pretty painful today. We had previously tested our build on the target platform (some ridiculous Alienware that looks like a lamborghini) last Thursday and had some problems that were difficult to fix. There was some issue with timing that we solved by tying the processor up for a bit in the start of the app. Well last night we were testing our build on one of the member's roommate's machine and crashing issues again. We did not identify the source of the crashes at all (it was after 1am). Today we were not surprised when the same problem came up on the test machine. We worked and tried different things for nearly two hours before we realized that the test machine had been wiped clean over the weekend; including the DirectX 9 libraries. Since no other team was using DirectX, they had no issues with this. Luckily we were able to identify the problem and load up the libraries as a fix. We will be taking time later to statically link in the DirectX 9 redistributable libraries.&lt;br /&gt;&lt;br /&gt;I certainly hope our presentation on Thursday goes more smoothly!&lt;br /&gt;&lt;br /&gt;Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-707325006262734862?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/707325006262734862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=707325006262734862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/707325006262734862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/707325006262734862'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/05/alpha-turn-in.html' title='Alpha Turn-In'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-7798739647323516194</id><published>2008-05-03T00:10:00.002-04:00</published><updated>2008-05-03T00:24:15.556-04:00</updated><title type='text'>Pengcasso Making Progress</title><content type='html'>Today was a pretty monumental day for development. It started out really well because I was able to get into a "flow" very quickly and maintained it for hours. The game &lt;span style="font-style: italic;"&gt;looks&lt;/span&gt; a lot more like a game now. The first thing I did was wrap up the "Game Over" sequence. I implemented this as a state for the game class's state machine. It uses placeholder assets (of course), but still looks pretty good. The next area of work was the sequence for completing a world (our game is based on worlds made of levels, but unlike others, we allow the worlds to be played in any order; only their levels progress linearly). I have not finished this up yet, but I think it's good enough for our Alpha build (due Tuesday!). I really enjoy working on these sequences because they allow me to leverage the systems everyone else has put into place. This keeps the work exciting, although some of the systems are admittedly much more user friendly than others. Our rendering guru, Alex, has created a very usable rendering engine based entirely on shaders (fixed function is dead). I am continually surprised at the ease of use and forethought in his systems.&lt;br /&gt;&lt;br /&gt;I also had the opportunity today to extend the functionality of our bitmapped fonts system. It was written by a different team member, but he has other more pressing tasks so I opted to help out. I was able to add in text effects for fading in, fading out, "wavy" text (sine based),  and pulsating (variably scaled) text. I hope that since the functionality is in place, the guys will find more uses for the system than printing debug text to the display!&lt;br /&gt;&lt;br /&gt;Other large improvements made to the build today include putting a skybox in place, working out some collision bugs, and updating some of the more poorly made placeholder assets. The skybox &lt;span style="font-weight: bold;"&gt;REALLY&lt;/span&gt; made things look better. The visual effect it creates during the world rotation is pretty spectacular. The image we are using for the skybox right now is a pretty stock mountain range / cloud sort of deal which makes Pengcasso look pretty epic as he crawls around the level... hahaha.&lt;br /&gt;&lt;br /&gt;All in all, we made a lot of progress today and I look forward to where things go in the next few days during Alpha preparation!&lt;br /&gt;&lt;br /&gt;Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-7798739647323516194?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/7798739647323516194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=7798739647323516194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7798739647323516194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/7798739647323516194'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/05/pengcasso-making-progress.html' title='Pengcasso Making Progress'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-2918672759263682115</id><published>2008-04-30T15:44:00.003-04:00</published><updated>2008-04-30T18:14:47.046-04:00</updated><title type='text'>Broken Microsoft code? No way!</title><content type='html'>I just had to fix some broken Microsoft code that comes with the platform SDK for VS 2005. Yes that's right, fix &lt;span style="font-weight: bold;"&gt;THEIR&lt;/span&gt; code.&lt;br /&gt;&lt;br /&gt;    I was getting crashes from a string operation saying that the buffer was too small. This was obviously not the case. After a bit of investigation, I was led to a piece of code where they (microsoft) were using the sizeof operator to determine the size of the receiving buffer. That's all fine and dandy for statically allocated arrays; not so for dynamic memory! Instead of a usable value, the function was getting 4 (the size of a pointer on my platform) and telling me my buffer was too small!&lt;br /&gt;&lt;br /&gt;Ridiculous....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-2918672759263682115?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/2918672759263682115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=2918672759263682115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2918672759263682115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2918672759263682115'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/broken-microsoft-code-no-way.html' title='Broken Microsoft code? No way!'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-4959765206827340952</id><published>2008-04-29T13:09:00.003-04:00</published><updated>2008-04-29T14:38:10.140-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='serialization'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Serializer</title><content type='html'>The text mode output has been put on the back-burner as there are more pressing areas for work. Also, I overhauled the binary file format so that there is a directory at the end (basically like  PAK file). You can download the &lt;a href="http://files.filefront.com/Serialization+v0+1azip/;10102781;/fileinfo.html"&gt;zip archive&lt;/a&gt; which include the serialization system source, a small driver program, and two created save files. The serializer settings can be edited through the project/scripts/Serializer.ini file (it has comments). Another caveat: the repository files MUST exist as fstream does not play well with creating a file and opening it for reading and writing. Just create an empty file and let the magic happen ;)&lt;br /&gt;&lt;br /&gt;The code is pretty heavily commented but if anything is unclear, feel free to ask!&lt;br /&gt;&lt;br /&gt;Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-4959765206827340952?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/4959765206827340952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=4959765206827340952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4959765206827340952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4959765206827340952'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/serializer.html' title='Serializer'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-8328037213084956085</id><published>2008-04-28T18:29:00.005-04:00</published><updated>2008-04-29T14:38:41.309-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games pengkwik'/><title type='text'>Pengkwik Website</title><content type='html'>The very first version of the website for our game is up. It's not much and desperately needs some love and attention... haha!&lt;br /&gt;&lt;br /&gt;Hopefully we'll have time to put some effort into cleaning it up soon but I don't think we are off to a bad start.&lt;br /&gt;&lt;br /&gt;Here's the link: &lt;a href="http://pengkwik.serveftp.org/pengkwik/"&gt;Pengkwik Games&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-8328037213084956085?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/8328037213084956085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=8328037213084956085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8328037213084956085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8328037213084956085'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/pengkwik-website.html' title='Pengkwik Website'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-4792288435777206283</id><published>2008-04-28T06:58:00.003-04:00</published><updated>2008-04-28T07:05:44.404-04:00</updated><title type='text'>Text-based database design</title><content type='html'>&lt;p&gt;   My initial ideas for the serialization system have proven to be a bit too naive! I thought I had successfully completed the text output functionality, but my test cases were not thorough enough. I was trying to treat the text file as a series of lines (which is how I had it formatted) instead of just a stream of bytes. This works fine for updating entries as long as the data occupies the same number of characters, but once that changes, the whole data file becomes compromised. I'm going to do some research into more advanced techniques, but right now the only solution I can think of is reading the entire file into memory, editing the contents, and then completely overwriting the original save file. There must be a better way as this is a huge waste of memory resources for this task. The binary output functionality is nearly complete but has lost focus until I get the text for working.&lt;p&gt;&lt;br /&gt;More to follow!&lt;br /&gt;&lt;br&gt;&lt;br /&gt;-Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-4792288435777206283?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/4792288435777206283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=4792288435777206283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4792288435777206283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/4792288435777206283'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/text-based-database-design.html' title='Text-based database design'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-8826159479176523040</id><published>2008-04-27T19:05:00.005-04:00</published><updated>2008-04-28T07:33:07.502-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='compilation firewall'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pimpl'/><title type='text'>Pimpl Idiom</title><content type='html'>&lt;p&gt;I was just doing some reading about the "Pimpl" Idiom. The word pimpl in this case refers to using a &lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;rivate &lt;span style="font-weight: bold;"&gt;impl&lt;/span&gt;ementation. This is a technique that helps cut down on compile-time dependencies in languages that are statically compiled. Basically, the idea is to alleviate heavy compile times that sometimes result from changing internals (areas with "private" visibility) in classes. Also, header files are not required for members used by value. This also can help alleviate some of the hairier circular dependency issues that arise.&lt;/p&gt;&lt;p&gt;  So how does one use this technique? It's pretty easy. Basically forward declare a structure type for your class (something like tMyClassImp) and then have your class contain a pointer to this new structure. This structure will contain all your private data members. Then, in the cpp file, define the structure and use it's contents all you need. Of course, since there is dynamic memory involved, the Trilogy of Evil (copy constructor, assignment operator, destructor) need to deal with the struct appropriately.&lt;/p&gt;&lt;p&gt;   There are of course some drawbacks to this approach, but I can already think of a few places that this could be use. Specifically all the globally accessible modules that have pretty self-contained functionality.&lt;/p&gt;&lt;br /&gt;  You can read more about that &lt;a href="http://c2.com/cgi-bin/wiki?PimplIdiom"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;-Dahlgren&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-8826159479176523040?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/8826159479176523040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=8826159479176523040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8826159479176523040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8826159479176523040'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/pimpl-idiom.html' title='Pimpl Idiom'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-8300913746015231811</id><published>2008-04-26T20:44:00.003-04:00</published><updated>2008-04-26T20:55:38.972-04:00</updated><title type='text'>Java vs. C++</title><content type='html'>I was just reading a post on another blog about a presentation Tim Sweeney gave. He covered the deficiencies in languages that were currently being used for game development and talked about this not just from an optimization  and multithreading standpoint, but also from a productivity standpoint. One of the points made was about the weakness of the C++ language with compile times that can quickly reach several minutes. This was compared to Java on the other hand, which in my experience always builds in seconds (a point Sweeney also mentioned). I have noticed this already when comparing the build time of Pengcasso's Puzzle Painting after making a change to an interface, which is usually over a minute, with building as I make changes and additions to major components of OneSAF. Streamlining large builds even more would be a welcome relief to everyone working actively in a large codebase. This is one of the many things that I have found to like about Java. I believe the performance difference between Java programs and native code will soon be negligible. That being said, I believe there will always be a die-hard userbase of C++ developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-8300913746015231811?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/8300913746015231811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=8300913746015231811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8300913746015231811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/8300913746015231811'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/java-vs-c.html' title='Java vs. C++'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-2282249272256200067</id><published>2008-04-22T22:23:00.002-04:00</published><updated>2008-04-22T22:39:06.539-04:00</updated><title type='text'>Shader X4</title><content type='html'>So I recently picked up a copy of "Shader X 4", the fourth installment in the Shader X series. There are some very exciting concepts in this compilation. and there is source code (with VS projects) for all the techniques. The real-time caustics demo particularly struck me as awesome. The real-time lighting effect that it creates is pretty phenomenal. Check out the book, it's worth the read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-2282249272256200067?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/2282249272256200067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=2282249272256200067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2282249272256200067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/2282249272256200067'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/shader-x4.html' title='Shader X4'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5584729569182792012.post-5461161559238670367</id><published>2008-04-22T10:47:00.000-04:00</published><updated>2008-04-22T10:49:44.280-04:00</updated><title type='text'>Inaugural Post</title><content type='html'>Well, this is the first ground-breaking post. I will be posting updates on my experiences in software design and development as they happen. Stay tuned for updates!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5584729569182792012-5461161559238670367?l=dahlgren504.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dahlgren504.blogspot.com/feeds/5461161559238670367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5584729569182792012&amp;postID=5461161559238670367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/5461161559238670367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5584729569182792012/posts/default/5461161559238670367'/><link rel='alternate' type='text/html' href='http://dahlgren504.blogspot.com/2008/04/inaugural-post.html' title='Inaugural Post'/><author><name>Dahlgren</name><uri>http://www.blogger.com/profile/08389150079146528291</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp3.blogger.com/_X94C3f8w84U/SA39oVh7oMI/AAAAAAAAAAM/Nl0Q183vzX0/S220/me_professional2.jpg'/></author><thr:total>0</thr:total></entry></feed>
