<?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-3418845461161498172</id><updated>2011-11-27T17:13:12.516-08:00</updated><category term='ruby'/><category term='install'/><category term='logging'/><category term='setup'/><category term='technology'/><category term='deep geekery'/><category term='obfuscation'/><category term='joomla'/><category term='apple'/><category term='development'/><category term='perl'/><category term='cheatsheets'/><category term='product naming'/><category term='source code control'/><category term='iOS4'/><category term='help'/><category term='exceptions'/><category term='developers'/><category term='whydidieatsomuch'/><category term='charity'/><category term='leopard'/><category term='consulting'/><category term='rails'/><category term='iTouch'/><category term='family'/><category term='cakephp'/><category term='windows'/><category term='tdd'/><category term='givecamp'/><category term='search engine optimization'/><category term='code'/><category term='c++'/><category term='tortoise svn'/><category term='iPod Touch'/><category term='database'/><category term='contest'/><category term='linux'/><category term='tech corps ohio'/><category term='macintosh'/><category term='mysql'/><category term='php'/><category term='x11'/><category term='arrays'/><category term='vmware'/><category term='programming'/><category term='best practices'/><category term='configure'/><category term='moodle'/><category term='communities'/><category term='tricky'/><category term='code snippets'/><category term='computers'/><category term='gems'/><category term='null'/><category term='oracle'/><category term='c'/><category term='life'/><category term='online'/><category term='slackware'/><category term='iPhone'/><category term='sql'/><category term='unix'/><category term='mac'/><category term='blackbox'/><category term='unit testing'/><category term='mathematics'/><category term='columbusgivecamp'/><category term='references'/><category term='testing'/><category term='attitudes'/><category term='iPad'/><category term='volunteers'/><category term='utilities'/><category term='svn'/><category term='subversion'/><category term='google'/><title type='text'>Caffeine Makes Me Sleepy</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-4593483854760825884</id><published>2011-07-03T16:45:00.000-07:00</published><updated>2011-07-03T17:02:20.444-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='givecamp'/><category scheme='http://www.blogger.com/atom/ns#' term='whydidieatsomuch'/><category scheme='http://www.blogger.com/atom/ns#' term='volunteers'/><category scheme='http://www.blogger.com/atom/ns#' term='charity'/><category scheme='http://www.blogger.com/atom/ns#' term='developers'/><title type='text'>Columbus Give Camp 2011 wrap up</title><content type='html'>This is a rather late write up of Columbus Give Camp 2011.  The event actually took place May 20 - 22, 2011. This was my third year volunteering as a GiveCamp as a developer.  The past two years, I told them what my skills were and just hopped on whatever team they put me on. It was a good experience both times - show up Friday night, build code with lots of passionate &amp; skilled developers that just want to help people out, and eat all kinds of good food, and demo what you built on Sunday.&lt;br /&gt;&lt;br /&gt;This year, I decided I want to do Rails development &amp; said as much when I applied. I ended up on a team that was developing a website to help a church camp track which families are coming. It was an existing project developed at Give Camp in 2009 and the developer team lead was also the charity rep.  This was a HUGE boost for the project. Most charities have no clue what is even possible with technology. However, with someone that is a developer &amp; charity rep, we came into the weekend and she had a list of what feature she wanted done this year, next year, and wish list for farther down the line as well as a list of bugs that needed to be fixed before any new features started.&lt;br /&gt;&lt;br /&gt;We used GitHub for all our source code &amp; project management. The only time I really use GitHub outside of minor tinkering is Give Camp so this took a quick refresher and unlearning some SVN habits.&lt;br /&gt;&lt;br /&gt;It seemed like everyone got a lot done and all the charities were happy with what they got. One thing - it felt like plenty of devs showed up but only one person I know of there had graphic design skills. So graphic designers, if you want to help out charities - check out Give Camp next year! If I remember right, they are planning to have Columbus Give Camp in the fall next year - likely around October. The dates will be on &lt;a href="http://columbusgivecamp.org/"&gt;columbusgivecamp.org&lt;/a&gt; whenever they are announced.&lt;br /&gt;&lt;br /&gt;I won't bore everyone with details on the food for the weekend - if you really want to know you can just check out the Twitter stream from during May 20 - 22, 2011 and search for #givecamp. But here are the ones that stuck out:&lt;br /&gt;&lt;br /&gt;Beignets - these are awesome. Something like elephant ears meet donuts&lt;br /&gt;&lt;br /&gt;Creole Kitchen in downtown Columbus somewhere - heard this place is hard to find. Glad someone else went to get the food. I don't know what they put in their mac &amp; cheese but it is VERY addictive. The other food was great too.&lt;br /&gt;&lt;br /&gt;Just Pies - yeah, it's exactly what it sounds like. The peanut butter pie was probably some of the best I ever had.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-4593483854760825884?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/4593483854760825884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=4593483854760825884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4593483854760825884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4593483854760825884'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2011/07/columbus-give-camp-2011-wrap-up.html' title='Columbus Give Camp 2011 wrap up'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-2937883421853266707</id><published>2010-10-13T09:23:00.001-07:00</published><updated>2010-10-13T09:23:41.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='configure'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>Slackware 13.1 and VMWare Fusion 3</title><content type='html'>&lt;div&gt;I had been having some problems with Parallels and VirtualBox running Slackware virtual machines, so I decided to give VMWare Fusion a try. *&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;VMWare Fusion works with Slackware pretty well, but it makes a couple assumptions about Linux distros that are not true of Slackware:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. You are using PAM (Pluggable Authentication modules)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. You are using RedHat-style init scripts (/etc/rc.d scripts that start programs when your computer boots).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following steps got me around all the issues I encountered installing the tools:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. The install scripts expect /etc/pam.d/ to be present. It's not since Slackware doesn't use pam. Just run the "&lt;i&gt;&lt;b&gt;mkdir /etc/pam.d&lt;/b&gt;&lt;/i&gt;" as root before installing the VMWare tools. The installer won't run unless it can put a VMWare piece into that directory.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Set up the init script structure as VMWare tools expects it. This step may not be required **&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;cd /etc/rc.d&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;for V in {0,1,2,3,4,5,6}; do ln -s /etc/rc.d /etc/rc.d/rc${V}.d; done&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;cp /etc/rc.d/rc.inet1 /etc/init.d/network&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;cp /etc/rc.d/rc.inet1 /etc/init.d/networking&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Install the tools as normal. When you run vmware-config-tools.pl, it may give you a weird message about X11 not finding some drivers and appear to hang. If this happens, run "&lt;b&gt;&lt;i&gt;killall mkinitrd&lt;/i&gt;&lt;/b&gt;" as root. This kills off whatever process is stuck there and will let the install finish.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This fix was covered in the comments in &lt;a href="http://www.basicconfig.com/software/vmware_tools_slackware"&gt;this blog entry about setting up VMWare's tools in Slackware 13.0&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Parallels issue: Parallels tools don't support Ubuntu 10.10 yet, the kernel modules won't build. I haven't had much luck with them at all in Slackware. They assume you are on an RPM or Debian based system. Virtual Box randomly shuts down my Slackware VM. Yes, I'm going to file a bug report. Decided to try out VMWare Fusion because it is currently only $9.99 for existing Parallels Desktop users until sometime in December 2010. Check out the full details on their V&lt;a href="http://www.vmware.com/vmwarestore/fusion_promo_terms.html"&gt;MWare Fusion promo site.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;** &lt;a href="http://techmix.net/blog/2008/09/11/vmware-tools-on-slackware-121/"&gt;Installing VMWare tools on Slackware 12.1&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-2937883421853266707?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/2937883421853266707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=2937883421853266707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2937883421853266707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2937883421853266707'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2010/10/slackware-131-and-vmware-fusion-3.html' title='Slackware 13.1 and VMWare Fusion 3'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-1522864257107508294</id><published>2010-08-17T20:06:00.000-07:00</published><updated>2010-08-17T20:10:38.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS4'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='iTouch'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Universal iOS apps</title><content type='html'>I'm still developing my first iPhone app (iOS app as of version 4.0 of the OS) and have been coming to the conclusion that XCode makes many, many things easy to do, but it isn't always easy to do these things right.&lt;br /&gt;&lt;br /&gt;Example: universal apps - having one app that runs on both iPhone/iPod Touch and the iPad. When you create an application, you have the choice of making it Universal.  Basically the .xib files (XML version of the .nib files) that define your user interface will have an iPad version and an iPod/iPhone version and the application will load the correct one at launch time.&lt;br /&gt;&lt;br /&gt;The downside: if you want ANYTHING to be different besides the user interface between the iPhone/iPod and iPad, you must write special code to handle those cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-1522864257107508294?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/1522864257107508294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=1522864257107508294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1522864257107508294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1522864257107508294'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2010/08/universal-ios-apps.html' title='Universal iOS apps'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-2669762949260859456</id><published>2010-04-16T20:14:00.001-07:00</published><updated>2010-04-16T20:22:10.944-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='deep geekery'/><title type='text'>Thanks a heap, Apple</title><content type='html'>I've been going through some tutorials for developing on the iPhone (and now iPad) and found this cool utility digging around the developer docs:&lt;br /&gt;&lt;br /&gt;There's this cool little utility called "heap" in OS/X.  If you find the pid (process id) of a running process and just run "heap PID" on the process, it will dump out how memory is allocated in the heap for that process.&lt;br /&gt;&lt;br /&gt;The only two limitations are: you need to have access to that process, so you either have to do it on a process running as the user you are currently logged in or be running as root.  Also, I think it has to be a native Objective C, C++, or maybe C binary.&lt;br /&gt;&lt;br /&gt;It attempts to figure out what type of object each thing allocated in memory is, and breaks it up class. Included stats are total count, total size, average size, and if it can figure out what library the variables are coming from, it includes that too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-2669762949260859456?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/2669762949260859456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=2669762949260859456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2669762949260859456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2669762949260859456'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2010/04/thanks-heap-apple.html' title='Thanks a heap, Apple'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-4995299213400598376</id><published>2009-08-04T18:06:00.000-07:00</published><updated>2009-08-04T18:26:29.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='contest'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Importance of variable naming and whitespace</title><content type='html'>Last week, I decided just for the fun of it to take a crack at this crazy programming contest &lt;a href="http://thedailywtf.com/Articles/Programming-Praxis-Josephus-Circle.aspx"&gt;http://thedailywtf.com/Articles/Programming-Praxis-Josephus-Circle.aspx&lt;/a&gt; I didn't want to spend much time on it, so instead of trying to do it in some esoteric programming language, I turned to the language I am most familiar with: Perl.  I created something that works and then I made it ugly. Really ugly.&lt;br /&gt;&lt;br /&gt;For comparison, I'll show the ugly version first - originally crammed onto one VERY long line. I had to fix the formatting a bit so it would show up here.&lt;br /&gt;&lt;br /&gt;&lt;wrap&gt;&lt;code&gt;($c,$s)=@ARGV;@s=(1)x$c;$ls=$c;my($i,$sk)=(0,0);while($ls&gt;1){$sk=$s[$i]?($sk+1):$sk;if($s[$i]&amp;amp;&amp;amp;($sk eq $s)){$s[$i]=0;$ls--;$sk=0;} $i=($i eq ($c-1))?0:($i+1);}$i=0;foreach my$s(@s){$i++;if($s){last;}}print"Safe $i\n";&lt;/code&gt;&lt;/wrap&gt;&lt;br /&gt;&lt;br /&gt;And here is the original version before I uglified it.  I know it doesn't look like it, but these two pieces of code do the exact same things.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl -w&lt;br /&gt;use strict;&lt;br /&gt;&lt;br /&gt;my ($count, $skip) = @ARGV;&lt;br /&gt;my @soldiers = (1) x $count;&lt;br /&gt;my $live_soldiers = $count;&lt;br /&gt;my $i = 0;&lt;br /&gt;my $sk = 0; #skip counter&lt;br /&gt;while ($live_soldiers &gt; 1) {&lt;br /&gt;   $sk = $soldiers[$i] ? ($sk + 1) : $sk;&lt;br /&gt;   if ($soldiers[$i] &amp;amp;&amp;amp; ($sk eq $skip)) {&lt;br /&gt;       $soldiers[$i] = 0;&lt;br /&gt;       $live_soldiers--;&lt;br /&gt;       $sk = 0;&lt;br /&gt;   }&lt;br /&gt;   $i = ($i eq ($count - 1)) ? 0 : ($i + 1);&lt;br /&gt;}&lt;br /&gt;$i = 0;&lt;br /&gt;foreach my $s (@soldiers) { $i++; if ($s) { last; } }&lt;br /&gt;print "Safe spot is $i\n";&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, in the second version, you can *almost* tell what it does just by reading the code.  Adding a couple comments and named command line arguments and it wouldn't be that bad.  It would also need error checking.&lt;br /&gt;&lt;br /&gt;The only real difference between the two is I removed the whitespace I could and made all the variables one or two characters.&lt;br /&gt;&lt;br /&gt;As you can see, it is possible to write readable Perl.  It is also very easy to write completely unreadable Perl, but that can be said of any language I've seen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-4995299213400598376?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/4995299213400598376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=4995299213400598376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4995299213400598376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4995299213400598376'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/08/importance-of-variable-naming-and.html' title='Importance of variable naming and whitespace'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-4121311983081974485</id><published>2009-07-22T20:35:00.001-07:00</published><updated>2009-07-23T19:09:32.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moodle'/><category scheme='http://www.blogger.com/atom/ns#' term='joomla'/><category scheme='http://www.blogger.com/atom/ns#' term='givecamp'/><category scheme='http://www.blogger.com/atom/ns#' term='columbusgivecamp'/><category scheme='http://www.blogger.com/atom/ns#' term='charity'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='tech corps ohio'/><title type='text'>Columbus Give Camp 2009 == awesome</title><content type='html'>&lt;span style="font-weight: bold;"&gt;What is Give Camp?&lt;/span&gt;&lt;br /&gt;Give Camp is an event that connects volunteer developers, graphic designers, and database administrators with charities who need programming work done.  This includes website redesign, setting up content management systems (CMS), and dynamic database driven web applications.  See &lt;a href="http://givecamp.org/"&gt;GiveCamp.org&lt;/a&gt; or &lt;a href="http://columbusgivecamp.org/"&gt;ColumbusGiveCamp.org&lt;/a&gt; for full details.&lt;br /&gt;&lt;br /&gt;One of my teammates, Joel, is apparently quicker to blog &amp;amp; less long-winded than me. If you're in a hurry, read his take on Columbus Give Camp 2009 on the &lt;a href="http://www.adelphus.com/2009/7/22/retrospective-columbusgivecamp"&gt;Adelphus blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pre-Give Camp&lt;/span&gt;&lt;br /&gt;Last year, I heard about Give Camp from some blog posts right after it happened.  I decided at that point that next year, I would make it a point to attend.  So this year I found out about it pretty much just in time from a post to the &lt;a href="http://www.columbusrb.com/"&gt;Columbus Ruby Brigade&lt;/a&gt; mailing list from &lt;a href="http://twitter.com/GregMalcolm"&gt;Greg Malcolm&lt;/a&gt;.  I had at least 5 other things I wanted to do that weekend, but luckily none of them were plans I couldn't change.&lt;br /&gt;&lt;br /&gt;   I signed up &amp;amp; realized after I signed up that I didn't have any choice on the charity, project, and since I didn't sign up with a team I had no clue who I'd be working with.  The thought did occassionally pop into my head "This event is originally sponsored by Microsoft.  It'll be just my luck if I end up working on a .NET project and I have absolutely no experience in .NET."  It turns out that thought was completely unfounded. Carey Payette and the other Columbus Give Camp organizers did a great job of making sure developers were matched up with projects that fit their skills.&lt;br /&gt;  &lt;br /&gt;I received an email on Wednesday with my team assignment.  There were a few people that I didn't know, but there was one on my team that I did know.  This was Gayle Craig from the Columbus Ruby Brigade.  The charity I was assigned to work with was Tech Corps Ohio, which teaches kids in grades K-12 about technology and computers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Welcome to Columbus Give Camp&lt;/span&gt;&lt;br /&gt;Friday night the event kicked off.  There were just over 40 developers there and at least one representative for each charity.  There were a couple of teams using .NET, and originally one Ruby on Rails development team, which was too big and was broken up into two.  I didn't feel I had enough Rails experience to hack something together during a weekend so put my PHP and Perl experience on my application for the event instead of my limited Ruby on Rails experience.&lt;br /&gt;&lt;br /&gt;   We worked closely with Aung Nay from Tech Corps Ohio (TCO).  The project was this: they had multiple sites running Joomla (CMS system), Moodle (online learning system) and WordPress (blogging software).  All of these were running PHP and each set up by different people, so they all looked like different sites.  Before the event, Erin Corrigan from a firm called Aero313 put together a wonderful Photoshop mock-up of what all the Tech Corps Ohio sites should look like.  Our mission (should we chose to accept it) was to take this template and make all the current TCO sites look the same.  And they had plans to deploy more sites, so we had to build the templates in such a way they would be easy to deploy to new sites.  I can't remember who came up with the name but we became #teamtco on Twitter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TeamTCO&lt;/span&gt;&lt;br /&gt;The team we ended up with was myself and 3 other people: Joel Helbling of &lt;a href="http://www.adelphus.com/"&gt;Adelphus.com&lt;/a&gt; His official title is "Visionary" which is one of the coolest official job titles I've heard.  Joel stepped up and became our project manager and gave everyone a five minute crash course in a project management technique called "Kanban." More on that later...  Also on our team was &lt;a href="http://bumgarnerlaw.com/opensource/index.php"&gt;Chris Bumgarner&lt;/a&gt; who is a lawyer who has taken a major interest in Linux and uses Arch Linux.  Last, but definitely not least is &lt;a href="http://www.codinggeekette.com/"&gt;Sarah Dutkiewicz&lt;/a&gt; (aka &lt;a href="http://twitter.com/sadukie"&gt;sadukie&lt;/a&gt;) who is a &lt;a href="http://mvp.support.microsoft.com/"&gt;Microsoft MVP&lt;/a&gt; because of her involvement with &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython"&gt;IronPython&lt;/a&gt;.  It made the weekend an awesome experience working with such a talented group.  We decided to pair up to work on tasks since we are all developers, not web designers.  Two heads are better than one when you're used to working with databases and such and are working with CSS and PHP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Friday night: network hiccups, planning, and getting started&lt;/span&gt;&lt;br /&gt;   At first we had constant network outages.  It was a sure-fire way to make the network go down if you asked if the network was up.  Carey's husband saved the day by bringing in some network equipment and worked with some other people to get everything running smoothly.&lt;br /&gt;  &lt;br /&gt;Aung was very supportive and already had figured out exactly what he wanted to have done and also had it all prioritized.&lt;br /&gt;&lt;br /&gt;Joel gave us a five minute crash course in Kanban, or at least enough of it we could keep track of what was going on project-wise.  It worked like this: we had a dry erase board and a pile of Post-It Notes.  We wrote every task we had to do on the notes, one task per note and stuck them on the left side column of the board labelled "Backlog."  The next column is labelled "WIP" short for "Work in Progress." This column contains one Post-It Note of a different color for each "development unit" you have working on the project.  Since we had four developers working in pairs, this meant we had two "development units" working on the project.  Once you decide which task is next on the list to do, you move it from Backlog to WIP.  Next up is "Testing" which is where you move a task once you think it is done and needs to be tested.  Last of all is "Done" of course.&lt;br /&gt;&lt;br /&gt;Before we set up the board, looking at the list of what we had to do made me feel a bit panicked but thanks to Kanban and Aung already having everything prioritized, we were able to just jump in and do whatever was most important first, second most important next, etc.&lt;br /&gt;  &lt;br /&gt;Luckily all of us had enough development experience to know we were going to need some kind of source code control tool since we'd all be working on the same set of files at the same time.  Joel suggested git.  I have no git experience, but it is similar enough on the command line to Subversion (svn) I quickly figured it out after a quick lesson on working with git.  Then we had an issue of setting a git server.  Luckily all the CSS will be public anyway, and all the PHP code we were doing was just tweaked themes of already open-source projects.  So Aung gave us the OK to set up a free, public github project.  This saved us from some severe misery throughout the weekend as despite accidentally overwriting each other's changes a couple times, we were always able to revert back to earlier versions and merge everyone's changes in.  We had a couple people roving from project to project helping out, so you never knew who you were going to meet and work with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Saturday: coding, dinosaurs, and foreign substances&lt;/span&gt;&lt;br /&gt;I found out that I actually don't live too far from Chris, so we ended up just carpooling in on Saturday. I checked my email &amp;amp; twitter before I left and saw something about Ninja Dinosaurs.  It turned out that some sleep-deprived programmers had found a video on YouTube called "Go, Go Ninja Dinosaur" which became our theme song for the weekend.&lt;br /&gt;&lt;br /&gt;   Project wise, Saturday was just everyone working to move the tasks across our Kanban board.  James Bender played a big part in helping make sure everyone was fed.  Potbelly Sandwiches donated enough boxes of sandwiches and chips to feed everyone for lunch on Saturday.  Sophic Group took care of supper Saturday - Pei Wei.  Pei Wei apparently gave twice as much food to Give Camp than the original order was!  Also Aung dropped in with a huge box of strawberries and bag of fresh Mandarin oranges.  This was a very welcome change of pace after the pizza, pop, chips, and other similar foods.  Someone joked that fresh fruit was a foreign substance to developers and they'd probably go into seizures from eating fresh fruit.  Luckily this was not the case - the fruit ended up on the big "help yourself" table and quickly disappeared except for a couple over-ripe strawberries.&lt;br /&gt;&lt;br /&gt;   At one point, I hit a snag with git.  In treating a local git clone like a local svn working copy, I got myself into a situaton where I couldn't revert to a previous version and I couldn't push my changes. There were no conflicts, git was just really, really confused.  A google search for the error turned up only one search result, and that was a patch send to the git mailing list in May to make it generate the error message I was seeing instead of doing who knows what...  Failing with some kind of "something unexpected &amp;amp; bad happened" error message, I'd guess was what it would do before the patch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sunday: appreciation, two boxes of silver, and swordfish&lt;/span&gt;&lt;br /&gt;Sunday I managed to wake up in time for the early service at church &amp;amp; then make it back to GiveCamp just in time for lunch.  Everyone was hurriedly wrapping up their projects by fixing bugs in the code and putting in last minute features.  Lunch was Kane's chicken - fried chicken &amp;amp; French fries and some kind of special sauce. So much for eating healthy.&lt;br /&gt;&lt;br /&gt;We put the finishing touches on the Joomla template and made sure it was installable as well as working some on the Moodle template.  We did look at the WordPress template, but that's as far as we got with that.&lt;br /&gt;&lt;br /&gt;   Aung showed up with two boxes that looked like Chinese takeout and said he was paying us in silver.  Someone had joked on Saturday when Aung asked if we needed anything if we could have a bag of money.  So he brought in two boxes of silver in the form of York Peppermint Patties which hit the spot!  Again, so much for eating healthy...&lt;br /&gt;&lt;br /&gt;   Things started to wind down and we ended up doing a group picture with all the volunteers and then each group got to demo what they did on the weekend.  I don't think anyone managed to accomplish everything they wanted to, but everyone seemed blown away by how much was accomplished over the weekend, especially the charities.&lt;br /&gt;&lt;br /&gt;   Afterward Aung asked us all where we wanted to go out to eat, his treat.  Half our team was from Cleveland, half from Grove City and Aung wasn't familiar with the area, so we ended up eating at Meijin, the Japanese Steakhouse across the street from the &lt;a href="http://www.quicksolutions.com"&gt;Quick Solutions&lt;/a&gt; office (where the event was held).  I ordered swordfish, which I remember having once or twice and last time a few years ago.  I only realized on Tuesday, after seeing a twitter message from Joel, they had accidentally given me his salmon and he got my swordfish.  I guess I'll have to go back there again and try the swordfish soon.  Joel seemed to enjoy it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Take-aways from Give Camp (besides the salmon pretending to be swordfish)&lt;/span&gt;&lt;br /&gt;I learned several lessons from this experience.&lt;br /&gt;&lt;br /&gt;* When starting a project, things go MUCH better if you know what is most important to complete to least important.  You also need some way to know who is working on what.&lt;br /&gt;&lt;br /&gt;* Source code control is a must! If you are working on a project alone, you can go back and see what things looked like before if it quits working as expected.  If you are working on a team, it is NOT optional.&lt;br /&gt;&lt;br /&gt;* Each developer should have their own development environment.  Having a local copy of Joomla and Moodle on my laptop allowed me to work on my tasks without stomping all over Joel's, Sarah's, or Chris's changes if I happened to touch the same file.  If we did touch the same file, we could merge all our changes together thanks to git.  See above point about source code control.&lt;br /&gt;&lt;br /&gt;* Community - It was just amazing to see how much could be accomplished by a community of people all working toward the same goal: how much can we get done for these charities in one weekend?  This also allowed for some knowledge and talent to hop from group to group such as getting some help with PhotoShop and CSS when we needed it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Traits of programmers who show up to Give Camp&lt;/span&gt;&lt;br /&gt;What really impressed me about GiveCamp was how much fun it was.  I think it would not have happened if anyone there was a jerk or pretending to know more than they actually knew.  Thinking about it, I think it was this way because only particular types of programmers would even consider participating in GiveCamp.&lt;br /&gt;&lt;br /&gt;* Social - a programmer who is completely antisocial would not have found out about Give Camp.  The only way to find out about it was some level of involvement in the development communtiy.&lt;br /&gt;&lt;br /&gt;* Giving - there's a certain kind of person who volunteers a weekend to help out other people at no charge with no strings attached. These people are much more fun to be around than the average bear.&lt;br /&gt;&lt;br /&gt;* Confident - part of Give Camp is that you have just a weekend to complete a programming project.  It takes a certain amount of confidence to even think of attempting this, and a certain amount of technical skills to gain this much confidence.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Addicted&lt;/span&gt;&lt;br /&gt;I absolutely cannot wait for next year's GiveCamp! I can't remember last time I had this much fun programming and have already started to look for events like it before next July.  The only things I can think of for sure would be other GiveCamps and hackathons.  Unfortunately the only other GiveCamp schduled that I know of is Grand Rapids Give Camp in November.  I don't think I will be able to make that one.  And the only open source project I know of doing hackathons is OpenBSD, and theirs is in Canada on the other side of the continent.  Maybe other projects just call theirs something different?&lt;br /&gt;&lt;br /&gt;   While I may not be able to find a Give Camp to go to between now &amp;amp; the next one, I think I can do the next best thing: be more involved in the programming community.  There are some very active user groups and events in Columbus.  Erubycon, Ohio Linux Fest, Columbus Ruby Brigade, and COLUG (Central Ohio Linux Users' Group) all come to mind.  I'm sure there are a couple more that would interest me I could get involved in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-4121311983081974485?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/4121311983081974485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=4121311983081974485' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4121311983081974485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4121311983081974485'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/07/columbus-give-camp-2009-awesome.html' title='Columbus Give Camp 2009 == awesome'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-2331201194197504516</id><published>2009-07-20T06:42:00.000-07:00</published><updated>2009-07-20T06:50:27.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Life changing experiences</title><content type='html'>I have not been able to update this blog nearly as often as I should.  Recently I had a life-changing experience that has changed my focus.  As of May 6, 2009, I'm a dad!  I'm the proud father of a little girl: Zoe Drobnack.&lt;br /&gt;&lt;br /&gt;One cool thing: as of this writing, if you search for her name with quotes on Google, you get no search results at all.  How often can you say that?  Let's see how long it takes to show up with one search result.&lt;br /&gt;&lt;br /&gt;Expect more updates shortly as I share my experiences from this past weekend's event: Columbus Give Camp 2009.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-2331201194197504516?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/2331201194197504516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=2331201194197504516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2331201194197504516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2331201194197504516'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/07/life-changing-experiences.html' title='Life changing experiences'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-1097608264073641072</id><published>2009-06-20T20:33:00.000-07:00</published><updated>2009-06-20T20:52:48.121-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='search engine optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='communities'/><category scheme='http://www.blogger.com/atom/ns#' term='online'/><category scheme='http://www.blogger.com/atom/ns#' term='product naming'/><title type='text'>Make Yourself Googleable</title><content type='html'>I don't know if this is a real word, but in the last couple weeks I realized that anyone trying to build a business on the internet needs to make sure they do something to make themselves "Googleable."&lt;br /&gt;&lt;br /&gt;For reasons I have yet to figure out for myself, I like to experiment with different personal finance software for making budgets &amp;amp; keep myself on track to make progress toward my goals.  Two that I have have the best like with are &lt;a href="http://www.snowmintcs.com/products/budgetmac/index.php"&gt;Budget&lt;/a&gt; and &lt;a href="http://www.youneedabudget.com/"&gt;YNAB&lt;/a&gt; (You Need a Budget).&lt;br /&gt;&lt;br /&gt;Do a Google search (or really search on any search engine for Budget) and you will end up with tons of completely unrelated search results and product links before finding the site for Budget. The only way searching for "Budget" will bring up the product you are looking for is if you are on a site such as &lt;a href="http://versiontracker.com/"&gt;versiontracker.com&lt;/a&gt; or any other software download site that searches by program name first.&lt;br /&gt;&lt;br /&gt;In contrast, Budget is made by a company called Snowmint Creative Solutions. At this time, searching for Snowmint hits the company's homepage as the first search result because it is such a unique name.&lt;br /&gt;&lt;br /&gt;Now try YNAB or You Need A Budget. Searching for either brings up at least a couple pages of results including the company &amp;amp; product website as well as many blog entries &amp;amp; reviews.&lt;br /&gt;&lt;br /&gt;As more people find out about YNAB and write about it, more people try it out to see what the big deal is. The forums have been starting to be quite active, especially with Microsoft's announcement that they are discontinuing MS Money. The forums are constantly pulling in more users who are becoming more &amp;amp; more active. People will discuss their goals and struggles with finances. There is also a journal area in the forums that many use as mini-blogs.&lt;br /&gt;&lt;br /&gt;Budget, on the other hand has a very small community on their forums, and the only activity seems to be only the rare posting when someone new to the program has problems or someone finds a bug in a new version. Both of these cases are fairly rare occurrences but the developers and the users are quick to respond and very helpful.&lt;br /&gt;&lt;br /&gt;Both great products with helpful users and developers, but one is simply a great useful program with a small group of users and one is a great useful program with a quickly growing community surrounding it. And the difference could be mostly due to choice of names.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-1097608264073641072?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/1097608264073641072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=1097608264073641072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1097608264073641072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1097608264073641072'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/06/make-yourself-googleable.html' title='Make Yourself Googleable'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-6024088431364277535</id><published>2009-04-11T19:50:00.000-07:00</published><updated>2009-04-11T20:04:16.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cakephp'/><category scheme='http://www.blogger.com/atom/ns#' term='macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>CakePHP 1.2 on Leopard 10.5.6</title><content type='html'>&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;VirtualHost www.cakeblog.dev&amp;gt;&lt;br /&gt;  DocumentRoot &amp;quot;/Users/USERNAME/Sites/cakeblog&amp;quot;&lt;br /&gt;  ServerName cakeblog.dev&lt;br /&gt;  ServerAlias www.cakeblog.dev&lt;br /&gt;  &amp;lt;Directory &amp;quot;/Users/USERNAME/Sites/cakeblog/&amp;quot;&amp;gt;&lt;br /&gt;    Options FollowSymLinks&lt;br /&gt;    AllowOverride All&lt;br /&gt;  &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The line you add to /etc/hosts should be: &lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;127.0.0.1   www.cakeblog.dev &lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The tutorial is pretty accurate about how to set up PHP and MySQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-6024088431364277535?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/6024088431364277535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=6024088431364277535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/6024088431364277535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/6024088431364277535'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/04/cakephp-12-on-leopard-1056.html' title='CakePHP 1.2 on Leopard 10.5.6'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-2540758480612647230</id><published>2009-01-29T10:40:00.000-08:00</published><updated>2009-01-29T10:59:07.214-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='attitudes'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>consultant attitudes all programmers should have</title><content type='html'>I have been doing programming as a consultant a little over a year and half. While working last year, I realized that there are a couple attitudes that most consultants have that I think all programmers would do well to adopt, or at least think about.&lt;br /&gt;&lt;br /&gt;* First off, make sure your code is written in such a way to be easily readable and well-commented.  The programmer reading the code and trying to figure it out 6 months later may be you! This will also made the code easier to maintain and debug.&lt;br /&gt;&lt;br /&gt;* Document as you go. This relates to the previous point. There's never time to document a project after it is done, but if you do a few minutes a day as you are developing, it won't be so bad. &lt;br /&gt;&lt;br /&gt;* Keep an ongoing list of features you want to add and bugs you want to fix.&lt;br /&gt;&lt;br /&gt;* Realize you won't be working on any specific program forever. You should have a plan for handing the work you've done off to someone else. People get promoted, transferred to other projects, get better jobs, get laid off, and sometimes get hit by a bus (see last item).&lt;br /&gt;&lt;br /&gt;* Always make sure you are learning new things and coming up with ideas on how to do things better.&lt;br /&gt;&lt;br /&gt;* Know who your customer is &amp; be sure your work is serving them. As a consultant, your customer is your client. As an employee, your customer is your employer, your boss, or whoever is going to be the end user of the program you are creating.&lt;br /&gt;&lt;br /&gt;* Last of all: everyone says you should document things &amp; share information so if you get hit by a bus, people will know what they need to know to continue the project. This point is brought up often enough, programmers should generally just avoid buses, just to be safe. Take the subway or train instead. No one talks about programmers being hit by them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-2540758480612647230?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/2540758480612647230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=2540758480612647230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2540758480612647230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2540758480612647230'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2009/01/consultant-attitudes-all-programmers.html' title='consultant attitudes all programmers should have'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-1661546932761308255</id><published>2008-11-21T10:08:00.000-08:00</published><updated>2008-11-21T10:18:15.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='references'/><category scheme='http://www.blogger.com/atom/ns#' term='tricky'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>Perl references to return values</title><content type='html'>Today I was working on some Perl code that needs to take an array returned from one function, make a reference to that array, and pass the reference to another function.  It seemed like a simple enough thing to do. I've been doing Perl programming for seven years.  After trying a few things and hitting failure, I pulled out the O'Reilly book Programming Perl and read the chapters on references and on subroutines. You can make references to anything: scalars, arrays, file handles, subroutines.  But it seemed you can't just take a sub-routine's return value and make a reference to it.&lt;br /&gt;&lt;br /&gt;A little poking around on Google turned up an indication that I'm not missing something.  There may not be a way to do exactly what I'm trying to do according to a post on &lt;a href="http://www.perlmonks.org/?node_id=61865"&gt;Perlmonks.org&lt;/a&gt;. So instead of making a reference to a sub-routine's return value, you have to make a reference to a copy of the return value.&lt;br /&gt;&lt;br /&gt;Here is the code that demonstrates this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;#From a post on caffeinemakesmesleepy.blogspot.com&lt;br /&gt;# Demonstrate how to take an array return from one function and pass a reference to it into another.&lt;br /&gt;&lt;br /&gt;#[] around return_array function makes a reference to a copy of the return value of that function.&lt;br /&gt;# you need the () after return_array or "return_array" gets passed into take_array_ref&lt;br /&gt;take_array_ref([return_array()]);&lt;br /&gt;&lt;br /&gt;sub return_array {&lt;br /&gt; my @ret;&lt;br /&gt; push (@ret, 'FOO');&lt;br /&gt; push (@ret, 'BAR');&lt;br /&gt; return @ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub take_array_ref {&lt;br /&gt; my $ref = shift;&lt;br /&gt; my $i = 0;&lt;br /&gt; foreach my $value (@$ref) {&lt;br /&gt;  $i++;&lt;br /&gt;  print "Element #$i: $value\n";&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-1661546932761308255?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/1661546932761308255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=1661546932761308255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1661546932761308255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/1661546932761308255'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/11/perl-references-to-return-values.html' title='Perl references to return values'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-8712814365406548468</id><published>2008-10-25T18:52:00.000-07:00</published><updated>2008-10-25T19:00:29.357-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl Test::More trick</title><content type='html'>Recently I was working on a rather large Perl module and writing unit tests for it. I had some tests already completely done and trying to debug another chunk of code &amp; tests. It was hard with debugging on to see what was going on. I just wanted to see one set of tests and nothing from the other sets.  At first I commented out the blocks of code that ran the tests I didn't care about. Then I realized there was an easier way.&lt;br /&gt;&lt;br /&gt;Say you have a test that starts with something like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sub my_batch_of_tests : Test(6) {&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Easy way to disable these: turn the above line to something like&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sub my_batch_of_tests { # : Test(6)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;When you do run_tests() on this test module, it won't run this block of tests because this function will no longer register as a test.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NOTE: this tip assumes you are using Test::More and Test::Class and have it set up so all your tests are in a module and you have a script that loads that module and does -&gt;run_tests on the module with your tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-8712814365406548468?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/8712814365406548468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=8712814365406548468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8712814365406548468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8712814365406548468'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/10/perl-testmore-trick.html' title='Perl Test::More trick'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-2846854482716072120</id><published>2008-10-01T06:46:00.000-07:00</published><updated>2008-10-01T06:58:07.971-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='null'/><category scheme='http://www.blogger.com/atom/ns#' term='tricky'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>SQL - you can't compare NULL to anything</title><content type='html'>Here is a little mind-bender for any of you who are programmers who routinely work with SQL.  Write a little code that checks to see if NULL equals NULL.  It returns false.  Now write code to see if NULL is not equal NULL. It will return false too.  Now repeat with NULL and any value. NULL equals 42 returns false, NULL is not equal 42 returns false. &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; What in the world is going on here?&lt;br /&gt;&lt;br /&gt;Here's what I found when I ran into this issue before.  What we're seeing here is the impact of NULL being a mathematical concept.  SQL is built on many mathematical concepts.  The concept of NULL is an unknown value.  Since NULL is an unknown value, it may be 42, it may be Fred.  We simply don't know.  So comparing anything at all to NULL (even comparing NULL to itself) will *ALWAYS* return false.  This is why you need to specify IS NULL or IS NOT NULL if you want to see if something is or isn't NULL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; I experienced this issue most recently working with Oracle, but it will work with any SQL database such as MySQL, PostgreSQL, and Microsoft SQL Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-2846854482716072120?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/2846854482716072120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=2846854482716072120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2846854482716072120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/2846854482716072120'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/10/sql-you-cant-compare-null-to-anything.html' title='SQL - you can&apos;t compare NULL to anything'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-8574980167413399371</id><published>2008-09-05T06:00:00.000-07:00</published><updated>2008-09-05T06:06:40.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='setup'/><title type='text'>Using Windows environment variables</title><content type='html'>This post will be a little more basic than most things I write here.  I'm used to using MacOS/X on the desktop and Linux on the server side. So when I have to use Windows for one reason or another it sometimes takes me a bit to figure things out.&lt;br /&gt;&lt;br /&gt;Today I was helping a co-worker with Oracle Application Express (APEX for short) and the install directions said to run "cd $ORACLE_HOME/apex" and then run some commands.  The cd command didn't work because Windows does environment variables different than Unix operating systems.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vlaurie.com/computers2/Articles/environment.htm"&gt;This article&lt;/a&gt; covers it in more detail but in short Windows indicates environment variables by putting a % (percent sign) before and after the variable.  Variables are not case sensitive.&lt;br /&gt;&lt;br /&gt;You can show them by running "echo %ENV_NAME%" and set them on the command line by running "ENV_NAME = new_value".  You can make the setting part of your login profile by right-clicking on "My Computer", then click Properties, then Advanced, and then Environment Variables.  This is for XP, the location may be different on Vista or other versions of Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-8574980167413399371?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/8574980167413399371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=8574980167413399371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8574980167413399371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8574980167413399371'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/09/using-windows-environment-variables.html' title='Using Windows environment variables'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-8066057602309594580</id><published>2008-06-07T17:14:00.000-07:00</published><updated>2008-06-07T17:33:15.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='developers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>MySQL++ meets Leopard on an Intel Mac</title><content type='html'>A friend of mine is learning C++ and also wants to learn MySQL. I decided to go ahead and show him how to connect MySQL to a database in C++.  Once I started, I realized I've never done this with MySQL, only with PostgreSQL.  Oh well, how different could it be???&lt;br /&gt;&lt;br /&gt;I decided to install on my Mac Mini which is running MacOS/X 10.5 Leopard.  Installing the latest stable version of MySQL from source was cake.  I got the sample C program working with no problems and then I looked for how to hookup C++ to MySQL.  MySQL itself does not come with a C++ API, only C.  The C++ bindings are provided by a project called MySQL++.  This is when the problems started.&lt;br /&gt;&lt;br /&gt;First off, it gave me some errors about not being able to find some functions. This was the actual error:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;./lib/mystring.cpp: In member function ‘int mysqlpp::String::compare(const std::string&amp;) const’:&lt;br /&gt;./lib/mystring.cpp:67: error: no matching function for call to ‘max(unsigned int, size_t)’&lt;br /&gt;./lib/mystring.cpp: In member function ‘int mysqlpp::String::compare(const char*) const’:&lt;br /&gt;./lib/mystring.cpp:81: error: no matching function for call to ‘max(unsigned int, size_t)’&lt;br /&gt;./lib/mystring.cpp: In member function ‘int mysqlpp::String::compare(const std::string&amp;) const’:&lt;br /&gt;./lib/mystring.cpp:67: error: no matching function for call to ‘max(unsigned int, size_t)’&lt;br /&gt;./lib/mystring.cpp: In member function ‘int mysqlpp::String::compare(const char*) const’:&lt;br /&gt;./lib/mystring.cpp:81: error: no matching function for call to ‘max(unsigned int, size_t)’&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A little googling around turns up &lt;a href="http://www.mydatabasesupport.com/forums/mysql/395524-build-issue-v3-0-3-gcc-4-3-x86_64-patch-proposal.html"&gt;this message&lt;/a&gt; on the MySQL++ mailing list.  Apparently the way things were coded, this "max" function works perfectly fine on 32 bit processors, but not 64 bit.  The fix is to change 1 line of the lib/mystring.h file in the source from "typedef unsigned int size_type;" to "typedef size_t size_type;".  It sounds like this fix will be in the next release of MySQL++ and then no one will have to worry about it.&lt;br /&gt;&lt;br /&gt;Another note here - the library for MySQL++ isn't libmysql++ or mysql++ as one may expect.  It is mysqlpp.  Just as well, special characters tend to mess things up sometimes.&lt;br /&gt;&lt;br /&gt;The other problem I ran into was this error when trying to compile the sample program from the MySQL++ documentation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ld: in /usr/local/lib, can't map file, errno=22&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This turned out to be one of those silly mistakes that causes a big problem. In specified the linker path, I had put &lt;br /&gt;&lt;br /&gt;-L /usr/local/lib&lt;br /&gt;&lt;br /&gt;When I changed it to &lt;br /&gt;&lt;br /&gt;-L/usr/local/lib&lt;br /&gt;&lt;br /&gt;it worked fine. This seems like something the GNU development utilities should be able to be smart enough to handle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-8066057602309594580?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/8066057602309594580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=8066057602309594580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8066057602309594580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/8066057602309594580'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/06/mysql-meets-leopard-on-intel-mac.html' title='MySQL++ meets Leopard on an Intel Mac'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-5407817983235900757</id><published>2008-06-05T19:09:00.000-07:00</published><updated>2008-06-05T19:11:47.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developers'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='tortoise svn'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><category scheme='http://www.blogger.com/atom/ns#' term='source code control'/><title type='text'>Tortoise SVN for Windows tips</title><content type='html'>I just figured out two new features in Tortoise SVN today.  First off, you can get SVN info showing up in Windows Explorer.&lt;br /&gt;&lt;br /&gt;1. Go to a folder that contains files you checked out from SVN.  Go to View -&gt; Details &lt;br /&gt;2. Right click on any column to get a list of available columns. &lt;br /&gt;3. Select "More" and scroll down until you get to the list of "SVN" details. I highly recommend SVN Status &amp; SVN Revision. &lt;br /&gt;4. Click OK and then refresh the window.  You'll have SVN status &amp; revision # on all the files in the folder controlled by SVN. &lt;br /&gt;&lt;br /&gt;5. (Optional) Go to Tools -&gt; Folder Options and click the View tab.  Hit Apply to All Folders &amp; you'll have this same view for all folders next time you open them. &lt;br /&gt;&lt;br /&gt;Trick #2. &lt;br /&gt;1. Open up TortoiseSVN settings &amp; go to "General". &lt;br /&gt;2. Click on the "Set filedates to the "last commit time" &lt;br /&gt;3. Hit Apply &amp; then OK. &lt;br /&gt;&lt;br /&gt;Your files from SVN will now show the last time you committed them as the modification time.  One note here: this didn't seem to work for me until I deleted my files from my SVN working copies &amp; checked them out again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-5407817983235900757?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/5407817983235900757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=5407817983235900757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/5407817983235900757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/5407817983235900757'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/06/tortoise-svn-for-windows-tips.html' title='Tortoise SVN for Windows tips'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-4032596598523828116</id><published>2008-03-07T20:36:00.000-08:00</published><updated>2008-03-07T20:55:39.504-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='code snippets'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Ruby exceptions vs. logging</title><content type='html'>A while ago, I ran into a little problem with some software.  We had some Ruby scripts running from cron.  Going by the logs, they would start up and just go to the bit bucket never to be heard from again.  After checking the code to try to figure out what was going wrong, I decided to just run them by hand to see what would happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;BLAM!!!&lt;/span&gt;  A nice big unhandled exception, which of course in Ruby makes whatever script you are running exploded in a rather show-stopping manner.  Why wasn't this logged?&lt;br /&gt;&lt;br /&gt;It turns out that this is all in how an exception actually works.  If you don't handle an exception, the program keeps going up the call stack (function A calls function B, etc) until it finds something that can handle the exception. If nothing handles the exception, the program just stops right then &amp; there and your exception becomes a fatal error.&lt;br /&gt;&lt;br /&gt;This problem is possible in multiple scripts, and we didn't have time to rewrite them all the catch all possible exceptions, which sounds too time consuming anyway.&lt;br /&gt;&lt;br /&gt;Here's the solution I ended up with.&lt;br /&gt;&lt;br /&gt;It turns out in Ruby when a program exits normally or because of an unhandled exception, it sends the EXIT signal. So all you have to do is catch the EXIT signal and log any exceptions that come across.&lt;br /&gt;&lt;br /&gt;This is one time that Ruby shows its Perl influence. The $! variable is whatever exception is present.  So, trap the signal and check $! for the exception (aka the error).&lt;br /&gt;&lt;br /&gt;There is one final twist on this, and it turns out a normally running Ruby program relies on exception handling, even if you don't know you're using exceptions.&lt;br /&gt;&lt;br /&gt;If you do a call to the exit() function in your code, that actually throws a SystemExit exception, which causes Ruby to immediately stop your program.&lt;br /&gt;&lt;br /&gt;So this is the code I ended up putting in our logger object, which is just an extension of the standard Ruby logger:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  #Catch &amp; log unhandled exceptions        &lt;br /&gt;  Signal.trap("EXIT") { &lt;br /&gt;    unless $!.class.name == "SystemExit"  || $!.nil? &lt;br /&gt;      self.fatal("Unhandled exception:  #{$!.class.name}:  #{$!.to_s}") &lt;br /&gt;    end &lt;br /&gt;  } &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The log entries would end up looking something like:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Unhandled exception: FooException: Something went terribly wrong in the get_important_data method and the program cannot continue.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In retrospect, there are probably two better ways this could be done.&lt;br /&gt;&lt;br /&gt;1. Make each program have an "execute" method of some sort that kicks off all the logic for the rest of the program. You could then wrap exception handling code around the call to "execute" and this would grab all your exceptions that aren't handled elsewhere in your code.&lt;br /&gt;&lt;br /&gt;2. Assuming these are all scripts of some sort, likely to be run from cron, you could have a script that runs scripts.  It could log anything that goes to standard output as "info" messages, standard error as "warning" messages, and any script that exits with a non-zero status (meaning an error) could be logged as a fatal error.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-4032596598523828116?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/4032596598523828116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=4032596598523828116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4032596598523828116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/4032596598523828116'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/03/ruby-exceptions-vs-logging.html' title='Ruby exceptions vs. logging'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-3022482041407053997</id><published>2008-02-26T19:49:00.000-08:00</published><updated>2008-02-26T19:59:55.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='help'/><category scheme='http://www.blogger.com/atom/ns#' term='gems'/><category scheme='http://www.blogger.com/atom/ns#' term='cheatsheets'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>how to cheat with ruby gems</title><content type='html'>It's nice to have a quick reference of commands for whatever technology you are working with. I noticed a Capistrano cheatsheet hanging up in a coworkers cubicle today. I think it was the one that used to be available at this link: &lt;a href="http://weblog.rubyonrails.org/2006/9/30/capistrano-cheat-sheet"&gt;http://weblog.rubyonrails.org/2006/9/30/capistrano-cheat-sheet&lt;/a&gt; but it now seems to result in a Rails application error.&lt;br /&gt;&lt;br /&gt;I went looking for a mirror of it and ended up finding something I like better. Ruby developers at &lt;a href="http://www.errfree.com"&gt;ErrFree&lt;/a&gt; have set up a great gem called "cheat".  More info on the &lt;a href="http://cheat.errtheblog.com/"&gt;cheat page&lt;/a&gt;. Short version:&lt;br /&gt;&lt;br /&gt;You can install the "cheat" gem with "sudo gem install cheat" which works out of the box on MacOS/X Leopard.  This will allow you to snag &amp; view cheatsheets, which are downloaded into .cheats/ in your home directory.&lt;br /&gt;&lt;br /&gt;To see how to use cheat run:&lt;br /&gt;&lt;blockquote&gt;cheat cheat &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Or to view any cheat simple run &lt;br /&gt;&lt;blockquote&gt;cheat [cheatname]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And if you want to snag the latest version just run&lt;br /&gt;&lt;blockquote&gt;cheat --new&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The cheats are served up from a lightweight wiki, which you can add to and update. No usernames or passwords, just a kaptcha to keep spammers out. I added an entry to see if it was as easy as it looked.  The Oracle cheat now contains&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  &lt;br /&gt;See current time:&lt;br /&gt;  &lt;br /&gt;  SELECT SYSDATE FROM DUAL;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-3022482041407053997?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/3022482041407053997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=3022482041407053997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/3022482041407053997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/3022482041407053997'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/02/how-to-cheat-with-ruby-gems.html' title='how to cheat with ruby gems'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-866940073326947435</id><published>2008-01-21T12:41:00.000-08:00</published><updated>2008-01-21T12:59:38.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x11'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='blackbox'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>X11 on MacOS/X 10.5 (aka Leopard)</title><content type='html'>Being a Linux geek who moved to Mac for a desktop, I still do run X11 applications on occasion and wanted to get some of the applications available in Linux working on my Mac.  There are two ways to do this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://macports.org/"&gt;MacPorts&lt;/a&gt; (previously known as Darwin Ports).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://finkproject.org"&gt;Fink&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mac Ports is based on the &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt; "ports" package management system that installs software by fetching the source and compiling it.&lt;br /&gt;&lt;br /&gt;Fink is a system based on the Debian package management tools (apt-get) and will feel quite familiar to anyone who has used Debian-based Linux distributions such as Ubuntu.&lt;br /&gt;&lt;br /&gt;I've had better luck with Mac Ports and installed a light-weight X11 window manager, blackbox, with the following command:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;port install blackbox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I then tried to make it run by creating the following file in my home directory as the file ".xinitrc" and running X11 from the /Applications/Utilities/ folder:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;exec blackbox&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This resulted in X11 starting up and immediately quitting.  I investigated using the Console.app and saw the following error message:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;1/21/08 3:32:33 PM org.x.X11[88661] blackbox: another window manager is already running on display ':0.0' &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A little searching online and I found &lt;a href="http://www.finkproject.org/doc/x11/run-xfree86.php?phpLang=en"&gt;this article on X11&lt;/a&gt; on the Fink project site. So - Apple runs their own window manager and you have to tell it not to run if you want to run something else.  If you're not using Fink, you'll have to leave out the Fink-specific parts (anything that starts with /sw/).&lt;br /&gt;&lt;br /&gt;Here's the .xinitrc file that successfully starts up the blackbox window manager on Leopard:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;PATH="$PATH:/opt/local/bin"&lt;br /&gt;quartz-wm --only-proxy &amp;&lt;br /&gt;exec blackbox&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-866940073326947435?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/866940073326947435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=866940073326947435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/866940073326947435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/866940073326947435'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/01/x11-on-macosx-105-aka-leopard.html' title='X11 on MacOS/X 10.5 (aka Leopard)'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418845461161498172.post-5420600169653669384</id><published>2008-01-21T12:21:00.000-08:00</published><updated>2008-01-21T12:25:19.177-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>puts "Hello world!"</title><content type='html'>Q: Another blog? Why?&lt;br /&gt;&lt;br /&gt;A: There are multiple technologies I'm wanting to learn and learn better.  Rather than to keep all the knowledge to myself, I decided to share what I learn.&lt;br /&gt;&lt;br /&gt;Q: What's up with the blog's name?&lt;br /&gt;&lt;br /&gt;A: It really does seem like if I consume too much caffeine, it does make me sleepy. It sounded like a good name for a blog about programming and technology.&lt;br /&gt;&lt;br /&gt;Q: What will this blog focus on?&lt;br /&gt;&lt;br /&gt;A: Whatever technology I feel like learning at the time. Here's some things I'm wanting to get into: Solaris, Oracle, Ruby on Rails, mod_perl, vim, and MacOS/X.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3418845461161498172-5420600169653669384?l=caffeinemakesmesleepy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://caffeinemakesmesleepy.blogspot.com/feeds/5420600169653669384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3418845461161498172&amp;postID=5420600169653669384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/5420600169653669384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418845461161498172/posts/default/5420600169653669384'/><link rel='alternate' type='text/html' href='http://caffeinemakesmesleepy.blogspot.com/2008/01/puts-hello-world.html' title='puts &quot;Hello world!&quot;'/><author><name>Kenny D.</name><uri>http://www.blogger.com/profile/10173948645018733479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
