<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Biodegradable Geek &#187; Productivity</title>
	<atom:link href="http://biodegradablegeek.com/category/productivity/feed/" rel="self" type="application/rss+xml" />
	<link>http://biodegradablegeek.com</link>
	<description></description>
	<lastBuildDate>Tue, 22 Jun 2010 21:52:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Learning to Program on Your Own</title>
		<link>http://biodegradablegeek.com/2009/12/learning-to-program-on-your-own/</link>
		<comments>http://biodegradablegeek.com/2009/12/learning-to-program-on-your-own/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 23:18:15 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[getting shit done]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[win32 api]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/2009/12/learning-to-program-on-your-own/</guid>
		<description><![CDATA[Learning how to code is like learning anything else &#8211; You have to do it. The hardest part is figuring out where to begin, and then you need some mechanism to show you that you&#8217;re making progress. The latter is important because it motivates you to keep going.
First, have a goal. I initially wanted to [...]]]></description>
			<content:encoded><![CDATA[<p>Learning how to code is like learning anything else &#8211; <b>You have to do it.</b> The hardest part is figuring out <i>where</i> to begin, and then you need some mechanism to show you that you&#8217;re making progress. The latter is important because it motivates you to keep going.</p>
<p>First, have a goal. I initially wanted to make AOL &#8220;punters&#8221; (apps that kicked other users offline) and malware. I found them interesting. Do you want to program games? websites? Facebook Apps? Apps for OS X?</p>
<p>Once you have the goal, do research on how those apps are made, particularly on the language used, APIs/libraries used, and so on.</p>
<p>When starting, you will be learning a lot of concepts that you will see no use for. If-then statements, variables, etc. You might understand the basic idea of what a variable is, but might wonder &#8211; why would I ever use this instead of putting the value in directly? At this stage, it&#8217;s important that you remain persistant and just go through the examples/exercises in your book (or those provided by your tutor). I noticed that most people will struggle through the first set of concepts, and then lose interest and quit after seeing that they aren&#8217;t doing anything interesting. One day, you&#8217;ll be doing something and everything will fall into place. An A-Ha moment.</p>
<p>You&#8217;re learning a bunch of stuff that doesn&#8217;t really connect with each other. How does printing &#8220;Hello World&#8221; to the screen eventually become a 3D game? How do I go from a console app to a window app? How does knowing what a variable or constant is translate to a web development project?</p>
<p>It&#8217;s a plateau &#8212; and I want to stress that this applies to almost anything, not just programming. You begin by learning a lot of stuff, very slowly making progress, and over time you begin to see that you kinda &#8220;know&#8221; what&#8217;s happening behind the scenes of the apps you&#8217;re using. After that, learning because easier and quicker. Getting to that level requires persistance.</p>
<p><b>My Turning Point &#8211; Stop Asking &#8220;What Should I Code?&#8221;</b></p>
<p>When I first began coding, I had the mentality that I had to &#8220;learn how to program&#8221; before &#8220;making app X&#8221; &#8211; This is logical but the way I structured in my head was important in impeding my progress. I divided learning how to program and making app X into two separate goals. It was a problem because it migrated me away from the goal of &#8220;making app X.&#8221; I began asking the wrong question &#8211; <b>what should I code to learn how to program?</b></p>
<p>Instead, I should have been asking &#8211; what should I learn next, to reach my goal of making app X? I broke down app X into individual tasks, and then began learning how to do each one. For example, let&#8217;s say my goal is to program a game.</p>
<p>If I ask &#8220;<i>what</i> should I code to learn how to program?&#8221; I will spend a lot of time learning things I might not need anytime soon (or ever), I will get nowhere near reaching my goal, and will become unmotivated and quit before getting there. Instead, I would break down the game into individual tasks (this requires research) and work on learning each one.</p>
<p>Let&#8217;s see, I need to figure out how to make a window/draw things on screen. That becomes my new short term goal. I dig deeper and learn that I need to learn the Windows API. I learn that the Windows API is how one draws to the screen. But the Windows API is another thing I need to learn, so that becomes the immediate short term goal. Digging deeper, I realize that the Windows API is just a bunch of functions with some conventions that I need to memorize.</p>
<p>Now my goal is somewhat clearer. I begin reading about the Windows API, making different small apps to make sure I understand what I&#8217;m reading. Eventually I am able to draw a window and controls. Great. I still don&#8217;t have a game. What&#8217;s next? I need to draw graphics. I dig into how it&#8217;s done and learn that the Windows API provides a set of functions graphics. I&#8217;m familiar with the Win API and so I just begin learning the graphics lib. I make a few dozen apps drawing basic circles, loading bitmap images, etc. Now my goal of making a game is starting to take shape in my head. I can mentally structure how the game will be, minus a few concepts I might not have learned yet.</p>
<p>Persistence.</p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/12/learning-to-program-on-your-own/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What Firefox&#8217;s Memory Leak Feature Taught Me About Life</title>
		<link>http://biodegradablegeek.com/2009/11/what-firefoxs-memory-leak-feature-taught-me-about-life/</link>
		<comments>http://biodegradablegeek.com/2009/11/what-firefoxs-memory-leak-feature-taught-me-about-life/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 07:39:57 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[add]]></category>
		<category><![CDATA[adhd]]></category>
		<category><![CDATA[annoying]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[motivational]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[thinking]]></category>
		<category><![CDATA[time management]]></category>
		<category><![CDATA[useability]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/2009/11/what-firefoxs-memory-leak-feature-taught-me-about-life/</guid>
		<description><![CDATA[(draft)
I&#8217;ve been using Firefox since the first public beta, and the one thing always on my wish list was fixing the sluggishness and unbelievable memory consumption (2 GB of RAM?) that results from keeping Firefox open for too long. This is still on my wish list today (almost 2010), and I know it&#8217;s unlikely to [...]]]></description>
			<content:encoded><![CDATA[<p><i>(draft)</i></p>
<p>I&#8217;ve been using Firefox since the first public beta, and the one thing always on my wish list was fixing the sluggishness and unbelievable memory consumption (2 GB of RAM?) that results from keeping Firefox open for too long. This is still on my wish list today (almost 2010), and I know it&#8217;s unlikely to be fixed. In fact, I&#8217;ve realized that &#8211; Zen Moment &#8211; the &#8216;patch&#8217; must come from within.</p>
<p>The Mozilla team claim it is a feature and not a bug. Firefox stores pages you&#8217;ve been to so that you can go back to them instantly upon hitting the &#8220;Back&#8221; button. This means that FF&#8217;s memory needs grow as you browse the net, and leaving a page doesn&#8217;t necessarily mean the page&#8217;s memory has been deallocated. It makes sense, but in practice it results in Firefox becoming unresponsive. You can go into about:config and edit hundreds of settings, but I&#8217;ve never had any success with any of them in any version of Firefox on any OS. Ever.</p>
<p>I probably don&#8217;t use Firefox like the majority of users, and certainly not like the developers intended. For one, I don&#8217;t close it. In fact, I&#8217;ve never voluntarily closed Firefox in my life (I don&#8217;t shut down). I purposely crash it and then re-open it so that it asks me to load up all my previously open tabs. This clears out some memory and restores responsiveness making Firefox useable again.</p>
<p>Why don&#8217;t I just close it? Because I usually have a minimum of 50 tabs open across several FF instances, and some of those tabs are actually those &#8220;Oops, this is embarrassing&#8230;&#8221; windows that let you choose what tabs to re-open when you re-run a crashed Firefox. That means some of the tabs hold the potential to open up dozens or even hundreds of more tabs.</p>
<p><b>I feel</b> <b>relieved</b> <b>when Firefox is unable to restore my tabs. <span style="text-decoration: underline;">Life starts anew.</span></b></p>
<p>I keep tabs open that I intend to go through (never!), and I keep different sets of windows/tabs open depending on what I&#8217;m doing. i.e., cooking tabs in one window, work tabs in another, research tabs in another, etc. But this isn&#8217;t restricted to Firefox. On my Linux desktop I have 2 displays and 8 virtual desktops, making that 16 workspaces, and they&#8217;re usually always full. Since I have the RAM/power to run this setup, it&#8217;s smooth&#8230; except for Firefox and most other browsers (not Chrome).</p>
<p>On this desktop I worked around the Firefox memory problem by creating multiple profiles and using different profiles for different tasks (one for work, one for multimedia, etc). This also allowed me to crash one without affecting the others. It&#8217;s a temporary and crude solution until Firefox natively supports multiple processes like Chrome (see <a href="http://mozillalinks.org/wp/2009/06/first-results-of-electrolysis-multi-process-firefox/" target="_blank">Electrolysis</a>.)</p>
<p>But while there are some workarounds, fixing the technical issue isn&#8217;t going to increase productivity much. Having more sites open will probably make things worse. The habit of putting things off for later is inherently the problem. Having many sites/apps open is normal only amongst abnormal people. There&#8217;s nothing &#8216;wrong&#8217; with it, but I don&#8217;t feel it&#8217;s very efficient, even if it may seem so at the time.</p>
<p>I&#8217;m generally disorganized and severely ADD-ed, and so this issue doesn&#8217;t only exist digitally. My desk is just as messy as Firefox. I have pieces of paper, napkins and anything else I jotted down notes on. I have unopened snail mail, opened but unchecked mail, and mail that has been checked and separated into 2 piles, those that require a reply and those that are to be trashed. There&#8217;s books I&#8217;m reading (multiple), and always unsorted pages of ideas/diagrams/blueprints of things I&#8217;ll probably never get to.</p>
<p>I&#8217;m obviously spreading my attention span thin. Going back to Firefox, if there&#8217;s an important piece of news on a page buried beneath other sites, I subconsciously still have &#8220;must read that article&#8221; somewhere deep in my head. It probably doesn&#8217;t result in any noticeable effect on its own, but when multiplied by 100x, the decline in calmness becomes significant enough to kill productivity. It produces a weak feeling of anxiety or overwhelmingness.</p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/11/what-firefoxs-memory-leak-feature-taught-me-about-life/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Small Vim Shortcut for PHP Tags</title>
		<link>http://biodegradablegeek.com/2009/09/small-vim-shortcut-for-php-tags/</link>
		<comments>http://biodegradablegeek.com/2009/09/small-vim-shortcut-for-php-tags/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 03:59:44 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[annoying]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[vi]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/2009/09/small-vim-shortcut-for-php-tags/</guid>
		<description><![CDATA[The short tags in PHP have been deprecated as of 5.3.0. Short tags provided a shorter alternative to the annoying-to-type &#60;?php and &#60;?php echo. Instead, you could use &#60;? and &#60;?= respectively. This was great but it caused problems when working with XML files, and the short_tags option was disabled in the PHP config by [...]]]></description>
			<content:encoded><![CDATA[<p>The short tags in PHP have been deprecated as of 5.3.0. Short tags provided a shorter alternative to the annoying-to-type &lt;?php and &lt;?php echo. Instead, you could use &lt;? and &lt;?= respectively. This was great but it caused problems when working with XML files, and the short_tags option was disabled in the PHP config by default on some implementations.</p>
<p>To make life easier, I created this vim mapping that will expand <b>&lt;?</b> to &lt;?php and <b>&lt;??</b> to &lt;?php echo. You may change the abbreviation as you see fit. Simply place this in your .vimrc</p>
<pre class="brush: plain;">
inoremap &lt;??    &lt;?php echo  ?&gt;&lt;Left&gt;&lt;Left&gt;&lt;Left&gt;
inoremap &lt;?     &lt;?php  ?&gt;&lt;Left&gt;&lt;Left&gt;&lt;Left&gt;
</pre>
<p>Re-open vim or type use :source ~/.vimrc to reload the config. Now just type &lt;? or &lt;?? in insert mode.</p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/09/small-vim-shortcut-for-php-tags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash Tips for Power Users</title>
		<link>http://biodegradablegeek.com/2009/06/bash-tips-for-power-users/</link>
		<comments>http://biodegradablegeek.com/2009/06/bash-tips-for-power-users/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 19:22:14 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[getting things done]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=105</guid>
		<description><![CDATA[Every Geek site needs an obligatory Bash Tips post
Copy Files Securely Between Two Machines
I used to always forget the syntax for this, until I realized that the syntax is exactly like the standard cp command. In fact, you can copy files like you normally would using scp, on your local machine. The following are equivalent:

$ [...]]]></description>
			<content:encoded><![CDATA[<p>Every Geek site needs an obligatory Bash Tips post</p>
<h2><strong>Copy Files Securely Between Two Machines</strong></h2>
<p>I used to always forget the syntax for this, until I realized that the syntax is exactly like the standard <strong>cp</strong> command. In fact, you can copy files like you normally would using scp, on your local machine. The following are equivalent:</p>
<pre class="brush: bash;">
$ cp file file.orig
$ scp file file.orig
</pre>
<p>Where they differ is, <strong>scp</strong> lets you copy files over a network, through SSH. Here&#8217;s an example:</p>
<pre class="brush: bash;">
$ scp contents.txt silver@ssh.domain.com:/tmp
</pre>
<p>This will copy local file contents.txt to /tmp on the remote machine ssh.domain.com, as user silver. Here are some more examples:</p>
<pre class="brush: bash;">
$ scp draft.pdf ssh.domain.com:
</pre>
<p>(copy draft.pdf to my home dir on remote machine. username is implied to be the same locally and remotely.)</p>
<pre class="brush: bash;">
$ scp swine.jpg rex@ssh.domain.com
</pre>
<p>(<strong>read</strong>: This will copy swine.jpg to local machine as a file named rex@ssh.domain.com. To make it go remote, append a : to the address, like above)<strong> </strong></p>
<p><strong>scp</strong> supports, among other things, compression (-C) and recursive copying of directories (-r).<br />
<strong> </strong></p>
<pre class="brush: bash;">
$ scp -rC code/ ssh.domain.com:/archive/code_02032009
</pre>
<p><strong></strong></p>
<p>Trying to copy to a directory you don&#8217;t have permission to (/usr etc) will fail.</p>
<h2>Don&#8217;t Get Lost Jumping To and Fro Between Directories</h2>
<p>You can use <strong>cd -</strong> to jump to the previous (NOT parent) dir. For example:</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ cd /usr/local/share
kiwi@localhost: /usr/local/share $ cd -
/home/kiwi
kiwi@localhost: ~ $ cd -
/usr/local/share
kiwi@localhost: /usr/local/share $
</pre>
<p>Another way is using <strong>pushd/popd</strong> &#8211; A Last In First Out (LIFO) stack of dirs.</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ pushd /usr/local/share/
/usr/local/share ~
</pre>
<p><strong>pushd</strong> is like cd but keeps note of the current dir before cd&#8217;ing into a new one. The stack of dirs is listed every time you invoke <strong>pushd</strong> <em>(the &#8220;/usr/local/share ~&#8221; output you see above.)</em></p>
<pre class="brush: bash;">
kiwi@localhost: /usr/local/share $ pushd /
/ /usr/local/share ~
</pre>
<p>Stack is ordered left to right, latest push first. If we pop the first dir off:</p>
<pre class="brush: bash;">
kiwi@localhost: / $ popd
/usr/local/share /tmp ~
kiwi@localhost: /usr/local/share $
</pre>
<p>We&#8217;re back in the share dir. We can keep popping until there&#8217;s nothing left (throws an error):</p>
<pre class="brush: bash;">
kiwi@localhost: /usr/local/share $ popd
/tmp ~
kiwi@localhost: /tmp $ pushd /lib
/lib /tmp ~
kiwi@localhost: /lib $ popd
/tmp ~
kiwi@localhost: /tmp $ popd
~
kiwi@localhost: ~ $ popd
bash: popd: directory stack empty
</pre>
<h2>Working with Long Lines</h2>
<p>No need for more Bash shortcut <a href="http://cheat.errtheblog.com/s/bash/" target="_blank">cheat sheets</a>, but here are some useful ones to help you work with long lines.</p>
<p>You can jump to the <strong>start &amp; end</strong> of a line using <strong>CTRL+a &amp; CTRL+e</strong> respectively. Example (* is the cursor):</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ echo al the ducks are swimming in the w*
</pre>
<p>and you want to fix the first word. You can hop to the beginning of the line with <strong>CTRL+a</strong>:</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ *echo al the ducks are swimming in the w
</pre>
<p>and now you can jump to the end of the misspelled word &#8220;al&#8221; using <strong>CTRL+Right</strong> twice to correct it:</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ echo all*the ducks are swimming in the w
</pre>
<p>Now ctrl+e to jump to the end of line:</p>
<pre class="brush: bash;">
kiwi@localhost: ~ $ echo all the ducks are swimming in the w*
</pre>
<p>Instead of backspacing every character, use <strong>ALT+Backspace</strong> to backspace entire words. You can also delete <strong>all</strong> or part of a line using <strong>CTRL+u</strong> combo. It deletes everything before the cursor. Likewise, <strong>CTRL+k</strong> wipes out everything after the cursor. I&#8217;ve developed a habit of using CTRL+e CTRL+k to delete lines.</p>
<p>Bash has a lot of <strong>ALT</strong> commands that let you move and manipulate words. <strong>ALT+l</strong> and <strong>ALT+u</strong> will make a word in front of the cursor lowercase or uppercase, for example. A neat one I don&#8217;t think I ever used is ALT+\ It pulls everything after the cursor left to the first non-whitespace character. Here&#8217;s an example, * is the cursor:</p>
<p><strong>BEFORE:</strong></p>
<pre class="brush: bash;">
$ my     spacebar is    *sticky
</pre>
<p><strong>AFTER (ALT+\):</strong></p>
<pre class="brush: bash;">
$ my     spacebar issticky
</pre>
<h2>Avoid Retyping Commands &amp; Arguments</h2>
<p><strong>ESC + .</strong> is <span style="text-decoration: underline;">very</span> useful. Escape followed by a period will output the argument you sent to your last Bash command. Command calls themselves are outputted if they were invoked without any arguments <em>(popd, ls, etc).</em></p>
<p>Example, unzipping a file and moving the archive to /tmp:</p>
<pre class="brush: bash;">
$ unzip archive-with-a-long-ambiguous-name-03092009-5960-1.2.5.zip
$ mv archive-with-a-long-ambiguous-name-03092009-5960-1.2.5.zip /tmp
</pre>
<p>In the mv command, the archive name was outputted by pressing <strong>ESC+.</strong> (full command being mv (ESC+.) /tmp) There was no need to type the long archive name twice.</p>
<p>The argument is taken from your bash history. You can keep invoking ESC+. to cycle back through all your recent command arguments. (history -c to clear)</p>
<p>Try not to forget this; You&#8217;ll naturally find plenty of uses for it.</p>
<p>Another way to avoid re-typing commands is <strong>CTRL+R</strong>. It will initiate a search of your command history. Begin typing, and watch Bash try to complete your command from previous ones you entered.</p>
<h2>Command Getting Too Big? Send it to your Editor</h2>
<p>Sometimes you begin writing what you think will be a simple command, only to realize that it has grown too complex for the command line, and you wish you were in your text editor.</p>
<p>First make sure your default editor is set. This is either in $EDITOR (export EDITOR=/usr/local/bin/vim) or elsewhere depending on the distro.</p>
<p>Use &#8220;fc&#8221; to open the last executed command in your editor:</p>
<pre class="brush: bash;">
ls -paul --sort=size
... ls output ...
fc
</pre>
<p>Now the <em>ls</em> line will be open in your editor. But what if you hadn&#8217;t executed the command yet? No problem. You&#8217;re sending off an email, but quickly realize that the command line isn&#8217;t ideal for everything:</p>
<pre class="brush: bash;">
echo -e &quot;Dear Santa, \n\n\tIt has become evident that your fat ass is contributing to Global Warming, primarily due to the large quantity of coal you distribute annually. We hereby
</pre>
<p>No matter where you are on the line, hit <strong>CTRL+x, CTRL+e</strong> to invoke your editor, which now contains what you were typing on the cmd line.</p>
<p>I always find myself wanting to finish a command in vim, but unwilling to type the first few lines over, especially when I&#8217;m trying to write a for loop or any ugly multiline Bash code.</p>
<p><strong>IMPORTANT: Whatever you type in your editor is executed automatically after you quit the editor.</strong><br />
<span id="more-105"></span></p>
<h2>Multiple Commands on a Single Line</h2>
<p>There are a number of ways to piece together commands (||, pipes, etc), depending on your need, but sometimes, you just commands executed consecutively. You can use ; or &amp;&amp;.</p>
<p><strong>semicolon (;) vs AND (&amp;&amp;)</strong>: The semicolon will run through each command consecutively, whereas &amp;&amp; is a little smarter, and will not continue if a command does not end successfully (return 0 &#8211; you can check the return value of the last app ran with <strong>echo $?</strong>).</p>
<p>&amp;&amp; is generally safer. i.e., ./configure &amp;&amp; make (&amp;&amp; sudo make install)</p>
<p>AND</p>
<pre class="brush: bash;">
$ cp bogus &amp;amp;&amp;amp; echo &quot;** copied&quot;
cp: missing destination file operand after `bogus'
Try `cp --help' for more information.
</pre>
<p>SEMICOLON;</p>
<pre class="brush: bash;">
cp bogus; echo &quot;** copied... or did I? tun tun tunnn!&quot;
cp: missing destination file operand after `bogus'
Try `cp --help' for more information.
** copied... or did I? tun tun tunnn!
</pre>
<h2>Convert between DOS and UNIX ASCII files</h2>
<p>Sometimes you get a text file that has weird ^M characters in it. These are due to a difference in how Unix and Windows systems end lines. You can convert between these formats using <strong>unix2dos</strong> or <strong>todos</strong> and <strong>dos2unix</strong> or <strong>fromdos</strong>.</p>
<pre class="brush: bash;">
$ mkdir /tmp/rcfl
$ cd /tmp/rcfl
$ echo -e &quot;Justa Lonely\nASCII File&quot; &gt; out
$ file out
out: ASCII text
$ todos out
$ file out
out: ASCII text, with CRLF line terminators
$ vim out # notice [dos] flag in status bar, quit :q!
$ fromdos out
$ file out
out: ASCII text
</pre>
<h2>Background Processes</h2>
<p>Have a little more control over your apps.</p>
<p><strong>Stop Right Thurr</strong><br />
When a program is running in the foreground, you no longer have access to the command line. An example is &#8216;tail -f&#8217; or &#8216;ruby script/server&#8217;</p>
<p>You can have a running process pause for a sec with <strong>CTRL+z</strong>.<br />
Do your dirty work and then bring the app back to the foreground with <strong>fg</strong>.<br />
To list the processes you have paused, use <strong>jobs</strong></p>
<pre class="brush: bash;">
$ tail -f useful.log
00:00:50 User did something that was log-worthy
00:00:56 User did something that was log-worthy
00:00:57 User did something that was log-worthy

# (press CTRL+z)
[1]+  Stopped                 tail -f useful.log

$ echo &quot;look ma, I can type&quot;
look ma, I can type

$ fg
tail -f useful.log

# (press CTRL+z)
[1]+  Stopped                 tail -f useful.log

$ tail -f blah.tmp

# (press CTRL+z)
[2]+  Stopped                 tail -f blah.tmp

$ jobs
[1]-  Stopped                 tail -f useful.log
[2]+  Stopped                 tail -f blah.tmp
$ fg 1
(process [2] continues)
</pre>
<p><strong>In the Background</strong></p>
<p>You can have a process start in the background by appending to it a <strong>&amp;</strong>.<br />
and bring this to the foreground using <strong>fg [#]</strong>.<br />
As before, jobs will list background processes, but with status <em>Running</em> instead of <em>Stopped</em>.</p>
<p>Programs running in the background will still output to stdout, which means they&#8217;ll make the shell ugly. So if you plan on using them, think about redirecting the output.</p>
<h2>Bash Redirection</h2>
<p>Some things are mentioned on nearly every &#8216;bash tips&#8217; page &#8212; like redirecting output. Here are the basics. We&#8217;re concerned with 2 I/O streams: STDOUT and STDERR. STDOUT has a value of 1, and it is the screen. If a program writes to stdout, that text is shown in the console. Errors are sent through a different stream, stderr, which has a value of 2. Value 0 is stdin, used for user input. The technical details aren&#8217;t important. Just remember that 1 is screen and 2 is error.</p>
<p>There&#8217;s a number of ways to redirect output:</p>
<pre class="brush: bash;">
$ echo &quot;asdfasdf&quot; 1&gt; /tmp/asdf.txt # overwrite existing file
$ echo &quot;asdfasdf&quot; &gt; /tmp/asdf.txt # (same, 1 is default, optional)
$
$ echo &quot;32452345&quot; &gt;&gt; /tmp/asdf.txt # append to end of existing file*
$ echo &quot;wash the dishes&quot; &gt; /dev/null # just ignore output
$ echo &quot;wash the dishes&quot; 2&gt; /dev/null # just ignore errors
$
$ more 1&gt; /dev/null # error still shown
$ more 2&gt; /dev/null # nothing shown
$ more &amp;&gt; /dev/null # nothing shown
$
$ more 2&gt;| /dev/null # silence errors
$ more &gt;| /tmp/more.txt # save output to file
$
$ more 1&gt; /tmp/more.txt 2&gt;&amp;1 # redirect stdout to file and redirect stderr to stdout (same file)
$ more 2&gt; /tmp/more.txt 1&gt;&amp;2 # have stdout follow stderr to file
</pre>
<p>To redirect output to a file &amp; screen, use <strong>tee</strong></p>
<pre class="brush: bash;">
$ echo &quot;dont forget the milk&quot; | tee /tmp/toforget.txt
</pre>
<p>More a more extensive guide on redirection, see <a href="http://tldp.org/LDP/abs/html/io-redirection.html" target="_blank">Bash IO Redirection</a> or some of the External Links below.</p>
<h2>Art of teh Alias</h2>
<p>I use a lot of aliases. Here are a few:</p>
<pre class="brush: bash;">
# I use these a lot. Can also have aptupdate, aptremove etc...
alias aptinstall='sudo apt-get install'
alias aptsearch='apt-cache search'
alias suvim='sudo vim'

# Aliasing command names. To use original commands, you'd need to specify absolute path.
alias a2restart='sudo apache2ctl restart'
alias gem='sudo gem'
alias checkinstall='sudo checkinstall'

# I used these to workaround the infamous FF memory leak (ugly)
# alias swapoff='sudo swapoff'
# alias swapon='sudo swapon'

# Going places. This + ssh keypair
alias macbookshell='ssh 192.168.1.17'
alias workshell='ssh meh@ssh.domain.com'

# Pretty output. (--group-directories-first might not work on your system).
alias lsf='ls -hAlF --group-directories-first --color=always --time-style=+&quot; %m/%d/%y %I:%M %p &quot;'

# List only directories
alias lsd='ls -d */'

# I'm a measly human!
alias free=&quot;free -m&quot;

# 'gimme x' is equivalent to 'sudo chown me.me x'
# alias gimme=&quot;ME6=`whoami` &amp;amp;&amp;amp; sudo \&quot;chown $ME6.$ME6\&quot;&quot;

# Usage: nullminate bloated-file.log
alias nullminate=&quot;cat /dev/null &gt; &quot;

# Search contents of an entire dir. Usage: scan &quot;PESKY_VARIABLE ?=&quot; project-123/
alias scan=&quot;grep -Rin --color&quot;
</pre>
<p>These should go in a ~/.bash_aliases file and invoked from within your user conf (.bashrc?)</p>
<p><!--<br />
screen<br />
public keys<br />
sub sections (shortcuts, history, redirection)<br />
--></p>
<p><strong>External links (related): </strong></p>
<ul>
<li><a href="http://www.caliban.org/bash/" target="_blank">Working more productively with bash 2.x/3.x</a></li>
<li><a href="http://www.hypexr.org/bash_tutorial.php" target="_blank">Getting Started with BASH</a></li>
<li><a href="http://www.wains.be/index.php/2007/11/26/bash-tips-and-tricks/" target="_blank">Bash Tips &amp; Tricks</a></li>
<li><a href="http://hacktux.com/bash/script/efficient" target="_blank">10 Tips for Writing Efficient Bash Scripts</a></li>
<li><a href="http://www.linuxtutorialblog.com/post/tutorial-the-best-tips-tricks-for-bash" target="_blank">Best Tips &amp; Trips for Bash</a></li>
<li><a href="http://linuxhelp.blogspot.com/2005/08/bash-shell-shortcuts.html" target="_blank">Bash Shell Shortcuts</a></li>
<li><a href="http://bashish.sourceforge.net/" target="_blank">Bashish</a></li>
<li><a href="http://www.davidpashley.com/articles/writing-robust-shell-scripts.html" target="_blank">Writing Robust Shell Scripts</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/06/bash-tips-for-power-users/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Block AIM&#8217;s Annoying &#8216;AOL System Msg&#8217; in Pidgin</title>
		<link>http://biodegradablegeek.com/2009/05/how-to-block-aims-annoying-aol-system-msg-in-pidgin/</link>
		<comments>http://biodegradablegeek.com/2009/05/how-to-block-aims-annoying-aol-system-msg-in-pidgin/#comments</comments>
		<pubDate>Sat, 02 May 2009 04:44:12 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[annoying]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[pidgin]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=426</guid>
		<description><![CDATA[The following plugin for Pidgin will block the incredibly annoying and useless notifications from AOLSystemMsg on AIM.
&#8220;AOL System Msg: Your screen name (mrEman) is now signed into AOL(R) Instant Messenger (TM) in 2 locations. Click here for more information.&#8221;
To use, paste code in file, save file as blockaolsystemmsg.pl in ~/.purple/plugins/ and then open (or re-open) [...]]]></description>
			<content:encoded><![CDATA[<p>The following plugin for <a href="http://www.pidgin.im/">Pidgin</a> will block the incredibly annoying and useless notifications from AOLSystemMsg on AIM.</p>
<blockquote><p>&#8220;AOL System Msg: Your screen name (mrEman) is now signed into AOL(R) Instant Messenger (TM) in 2 locations. Click here for more information.&#8221;</p></blockquote>
<p>To use, paste code in file, save file as <strong>blockaolsystemmsg.pl</strong> in <strong>~/.purple/plugins/</strong> and then open (or re-open) Pidgin and go to Tools -&gt; Plugins (or press CTRL+U), and enable &#8220;Block AOLSystemMsg.&#8221; That should be it!</p>
<p><em>If you&#8217;re having any trouble, try going to Help -> Debug to open up Pidgin&#8217;s debug console. </em></p>
<pre class="brush: perl;">
#!/usr/bin/perl
# BlockAOLSystemMsg plugin tested on Pidgin 2.5.5. Put in ~/.purple/plugins/ and enable
use Purple;
our $target = 'AOL System Msg'; # case-insensitive
our $plugin_name = 'Block AOLSystemMsg'; 

%PLUGIN_INFO = (
  perl_api_version =&gt; 2,
  name =&gt; $plugin_name,
  version =&gt; &quot;0.1&quot;,
  summary =&gt; &quot;Blocks the screen name 'AOL System Msg'&quot;,
  description =&gt; &quot;Ignore annoying 'your SN has signed on at 2 locations' AIM message&quot;,
  author =&gt; &quot;Isam &quot;,
  url =&gt; &quot;http://biodegradablegeek.com&quot;,
  load =&gt; &quot;plugin_load&quot;,
  unload =&gt; &quot;plugin_unload&quot;
);

sub loginfo { Purple::Debug::info($plugin_name, &quot; @_\n&quot;); }
sub minimize {
  my $r = lc($_[0]);
  $r =~ s/ //g;
  return $r;
}

sub plugin_init { return %PLUGIN_INFO; }

sub plugin_load {
  my $plugin = shift;
  $target = minimize($target);
  loginfo(&quot;Sight set on '$target'&quot;);
  Purple::Signal::connect(Purple::Conversations::get_handle(),
                          'receiving-im-msg', $plugin, \&amp;callback, '');
}

sub plugin_unload {
  my $plugin = shift;
  loginfo('Block AOLSystemMsg Unloaded.');
}

sub callback {
  my ($acc, $sender, $msg, $flags) = @_;
  if (minimize($sender) eq $target) {
    loginfo(&quot;(BLOCKED) &lt;$sender&gt; $msg&quot;);
    return 1
  };
}
</pre>
<p>update: Fixed the botched code. Thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/05/how-to-block-aims-annoying-aol-system-msg-in-pidgin/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>4 Do-It-Yourself Whiteboard Alternatives</title>
		<link>http://biodegradablegeek.com/2009/04/4-do-it-yourself-whiteboard-alternatives/</link>
		<comments>http://biodegradablegeek.com/2009/04/4-do-it-yourself-whiteboard-alternatives/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 01:58:36 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[List]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=165</guid>
		<description><![CDATA[
Whiteboards are as useful as they are overpriced. I built one using tileboard (the thing they use in bathrooms), and I highly recommend making/buying one. It took me awhile to find tileboard in my area. In case anyone has the same problem, here are 4 alternatives I considered:
They are not in any specific order. 
Glass [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://biodegradablegeek.com/wp-content/uploads/2009/04/post_it_note_wall_by_rainbowcookee-300x225.jpg" alt="post it note wall by rainbowcookee 300x225 4 Do It Yourself Whiteboard Alternatives" title="post_it_note_wall" width="300" height="225" class="alignright size-medium wp-image-419" /><br />
Whiteboards are as useful as they are overpriced. I built one using tileboard (the thing they use in bathrooms), and I highly recommend making/buying one. It took me awhile to find tileboard in my area. In case anyone has the same problem, here are 4 alternatives I considered:</p>
<p><em>They are not in any specific order. </em></p>
<h2>Glass or Plexiglas</h2>
<p>Anything Expo markers can write on may be used as a board surface. This means a piece of glass, or <a href="http://en.wikipedia.org/wiki/Acrylic_glass" target="_blank">acrylic glass (Plexiglas)</a>, placed over a bright white surface it (i.e., a wall or table). Glass actually works pretty well in terms of eligibility and clean up, but it&#8217;s heavy, has sharp edges and cannot be drilled into (easily). It&#8217;s also not cheap.</p>
<p>Plexiglas works well, but I heard some dry erase Expo markers have problems coming off. Research this before trying Plexiglas. <strong><a href="http://harleyjcooper.com/2007/02/02/my-expo-markers-story/" target="_blank">Never use Acetone to clean Plexiglas</a></strong> (or any plastic). </p>
<p>Plexiglas might be a hassle to cut. Sawing at a high speed, be it power or manual, might cause the edge to melt and stick back together between each cut. It&#8217;s usually cut underwater ( don&#8217;t try putting a power saw in your bathtub). </p>
<p>What I did was use a regular hack saw, and had my friend shoot the area I was sawing with a <strong>water gun</strong> to cool it between each cut. A water gun.</p>
<p>Both glass and plexiglass have the advantage of letting you make overlays (assuming they are translucent). You can put anything behind this <em>board</em>, as opposed to having an all white surface. Some examples I&#8217;ve seen are adding templates like a blank calendar or checklist behind the glass.</p>
<p>If you put some work into it, this can be a nice, cheap setup.</p>
<h2>Chalkboard or Chalkpaper</h2>
<p>Chalkboards are cheaper than whiteboards, and even cheaper if you go the DIY route and make one using chalk paper. Chalk paper is basically a rough surface you can buy in rolls, which can be written on using standard chalk. Which means.. hopscotch in the office!</p>
<p>Chalkboards have great contrast, and chalk is dirt cheap compared to dry/wet erase markers (unless you steal those from your local college). The problem, and it&#8217;s a big one, is chalk dust. Chalk dust in a small room or office make this route unacceptable for most people. There is &#8220;anti-dust&#8221; / dust-free chalk, but dust can still be a problem if you don&#8217;t have good ventilation.<br />
<span id="more-165"></span></p>
<h2>Paper Whiteboard, or Just Paper</h2>
<p>Paper. Big paper. There exists huge books of pages that you hang up on the wall, meant to act as a huge Post-It book. I&#8217;ve seen these sold at Michael&#8217;s. An alternative is to just hang up a big sketch book, but that might get expensive. Paper has plenty of advantages&#8230;</p>
<p>You can write on a page using a pen, pencil, markers, crayons, blood etc. It&#8217;s flexible and mobile; You can detach papers for storage or to just generally move around, tear in two, etc. Clean up is as easy as curling up a huge piece of paper and shooting a basket.</p>
<p>The cons? Erasing is a nuisance (and only possible if you use a pencil or erasable pen), and the entire thing is meant to be disposable, making this a a recurring expense. This might mean you will end up squeezing as much content on each page as you can to save money. </p>
<p>I&#8217;ve seen &#8220;paper whiteboards&#8221; at IKEA &#8211; but with a short stand, designed for children. You get far less cool points hanging up paper than you would having a <em>real</em> (looking) whiteboard in your house. </p>
<h2>DIY Digital / Touch Whiteboard</h2>
<p>Expensive from scratch, but you might be able to use what you have around the house to hack up a nice digital whiteboard; One great example is the <a href="http://www.google.com/search?q=wiimote+whiteboard" target="_blank">Wiimote Whiteboard</a>:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/5s5EvhHy7eQ&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/5s5EvhHy7eQ&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>If you can find tileboard, I suggest using that instead. It&#8217;s cheap and it works well. You can probably cover an entire wall for $20. These alternative methods are OK, and in some cases might even be great, but they&#8217;re no match for a &#8216;real&#8217; whiteboard, or one made of tileboard. </p>
<p><em><a href="http://rainbowcookee.deviantart.com/art/Post-It-Note-Wall-82626130" target="_blank">* Post-It Wall pic by RainBowCookee</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/04/4-do-it-yourself-whiteboard-alternatives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Can&#8217;t Live Without My vim Config</title>
		<link>http://biodegradablegeek.com/2009/04/i-cant-live-without-my-vim-config/</link>
		<comments>http://biodegradablegeek.com/2009/04/i-cant-live-without-my-vim-config/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 17:43:18 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[vi]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=384</guid>
		<description><![CDATA[I have updated the vim page with my vimrc/gvimrc configs. Instead of repeating myself, I will quote some parts of the page ..
More details and the vim config itself here
I recommend turning backups on if you have them off. I personally hate having the ~ files all over my OS, so I keep them along [...]]]></description>
			<content:encoded><![CDATA[<p>I have updated the <a href="/vim">vim</a> page with my vimrc/gvimrc configs. Instead of repeating myself, I will quote some parts of the page ..</p>
<p><strong><a href="/vim">More details and the vim config itself here</a></strong></p>
<p>I recommend turning backups on if you have them off. I personally hate having the ~ files all over my OS, so I keep them along with the .swp files in 1 backup dir in ~/.vim/</p>
<p>The programming language skeleton stuff will detect what files you are editing and change options in vim by inheriting the specified files which I put in ~/.vim/skeletons and ~/.vim/inherit.</p>
<p>The skeletons are automatically inserted in new files that vim is aware of. For example, in my own config, I have ~/.vim/inherit/c which has all the usual includes and int main() code. When I make a new C file (&#8220;gvim hello.c&#8221;), the new file begins with the skeleton code already present. Neat huh?</p>
<p>The inherit files can be used to set specific options for each language. This can mean different bindings, whitespace options, themes, etc depending on what language you&#8217;re working with, automatically.</p>
<p><a href="/vim">See the vim page</a></p>
<p><strong>What options have helped you the most?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/04/i-cant-live-without-my-vim-config/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Maintain Static Sites with Git &amp; Jekyll</title>
		<link>http://biodegradablegeek.com/2009/03/how-to-maintain-static-sites-with-git-jekyll/</link>
		<comments>http://biodegradablegeek.com/2009/03/how-to-maintain-static-sites-with-git-jekyll/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 04:10:00 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=371</guid>
		<description><![CDATA[Static sites in this context just means non-database driven sites. Your static site can be an elaborate PHP script or just a few markup and image files. For this I am using Jekyll &#8211; A neat Ruby gem that makes your static sites dynamic. It lets you create layouts and embed custom variables in your [...]]]></description>
			<content:encoded><![CDATA[<p>Static sites in this context just means non-database driven sites. Your static site can be an elaborate PHP script or just a few markup and image files. For this I am using <strong><a href="http://github.com/mojombo/jekyll/tree/master">Jekyll</a> &#8211; A neat Ruby gem that makes your static sites dynamic.</strong> It lets you create layouts and embed custom variables in your HTML (this is a &#8220;prototype&#8221; of the site). </p>
<p>Jekyll tackles all the nuisances involved in creating static pages (I used to add just enough PHP to make a layout). It works by running your prototype through some parsers and outputs plain static HTML/XML (RSS feeds) etc. It&#8217;s perfect for lightweight sites that would be impractical on Wordpress, like a few static pages of information, landing pages, portfolio/resume pages, and parked domains. </p>
<p>Git takes care of keeping your development (local) and production (remote) environments synced. Git might be a little confusing if you&#8217;re learning it with the mindset that it works like Subversion. </p>
<p><strong>I&#8217;ll update this post when the guide is done. For now, the following will assume you&#8217;re familiar with Jekyll (or at least have an empty file in the prototype directory) and git. This Bash script simplifies creating the remote git repository:</strong></p>
<p>** please read through the code and make sure you know what this does, and what you&#8217;re doing. As of now, this is bias towards my own Apache/vhost setup. It&#8217;s trivial to edit for your specific needs. <strong>You&#8217;re using this at your own risk</strong>.</p>
<p>(<a href="http://code.biodegradablegeek.com/repogen.sh" target="_blank">direct link &#8211; repogen.sh</a>)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># 04/01/2009 | http://biodegradablegeek.com | GPL </span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># You should be in site (NOT public) root (be in same dir as public/ log/ etc)</span>
<span style="color: #666666; font-style: italic;"># proto/ is created and will house the jekyll prototype</span>
<span style="color: #666666; font-style: italic;"># public/ will be the generated static site</span>
<span style="color: #666666; font-style: italic;"># the public/ folder will be REMOVED and regenerated on every push</span>
<span style="color: #666666; font-style: italic;"># </span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Usage: ./repogen.sh domain.comn&quot;</span>
  <span style="color: #7a0874; font-weight: bold;">exit</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># optional. will make it easier to copy/paste cmd to clone repo </span>
<span style="color: #007800;">SSHURL</span>=<span style="color: #ff0000;">&quot;ssh.domain.com&quot;</span>
<span style="color: #007800;">URL</span>=<span style="color: #ff0000;">&quot;$1&quot;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;** creating tmp repo&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> proto
<span style="color: #7a0874; font-weight: bold;">cd</span> proto
git init 
<span style="color: #c20cb9; font-weight: bold;">touch</span> INITIAL
git add INITIAL
git commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Initial Commit&quot;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;** creating bare repo&quot;</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> ..
git clone <span style="color: #660033;">--bare</span> proto proto.git
<span style="color: #c20cb9; font-weight: bold;">mv</span> proto proto.old
git clone proto.git
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> proto.old
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;** generating hook&quot;</span>
<span style="color: #007800;">HOOK</span>=proto.git<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>post-update
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$HOOK</span> <span style="color: #000000; font-weight: bold;">/</span>tmp
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'#!/bin/sh'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'# To enable this hook, make this file executable by &quot;chmod +x post-update&quot;.'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'#exec git-update-server-info'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">''</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">''</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'URL='</span><span style="color: #ff0000;">&quot;<span style="color: #007800;">$URL</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'PROTO=&quot;/home/$USER/www/$URL/proto&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'PUBLIC=&quot;/home/$USER/www/$URL/public&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span>  <span style="color: #ff0000;">''</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'export GIT_DIR=&quot;$PROTO/.git&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'pushd $PROTO &gt; /dev/null'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'git pull'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'popd &gt; /dev/null'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">''</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;echo -----------------------------&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;echo '** Pushing changes to '<span style="color: #007800;">$URL</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;echo '** Moving current public to /tmp'&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'mv &quot;$PUBLIC&quot; &quot;/tmp/'</span><span style="color: #007800;">$URL</span><span style="color: #ff0000;">'public-`date '</span>+<span style="color: #000000; font-weight: bold;">%</span>m<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">%</span>Y<span style="color: #ff0000;">'`&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'echo &quot;** Generating new public&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'jekyll &quot;$PROTO&quot; &quot;$PUBLIC&quot;'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$HOOK</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;** enabling hook&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">chmod</span> a+x <span style="color: #007800;">$HOOK</span> 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;** clone repo on local machina. example:&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;git clone ssh://<span style="color: #007800;">$USER</span>@<span style="color: #007800;">$SSHURL</span>/~<span style="color: #007800;">$USER</span>/www/<span style="color: #007800;">$SSHURL</span>/proto.git&quot;</span></pre></div></div>

<p><strong>Usage</strong></p>
<p>Your site structure might be different. <strong>repogen.sh</strong> is made by pasting the above code in a new file, and then chmod a+x to make it executable. This should be done on the remote server.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> www<span style="color: #000000; font-weight: bold;">/</span>domain.com<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">ls</span>
public<span style="color: #000000; font-weight: bold;">/</span> private<span style="color: #000000; font-weight: bold;">/</span> log<span style="color: #000000; font-weight: bold;">/</span> cgi-bin<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
.<span style="color: #000000; font-weight: bold;">/</span>repogen.sh domain.com</pre></div></div>

<p>Now on your local machine, clone the new repo, move your files in, and push:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git clone <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>username<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #000000; font-weight: bold;">@</span>ssh.domain.com<span style="color: #000000; font-weight: bold;">/</span>~<span style="color: #7a0874; font-weight: bold;">&#91;</span>username<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>domain.com<span style="color: #000000; font-weight: bold;">/</span>proto.git
<span style="color: #7a0874; font-weight: bold;">cd</span> proto<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #ff0000;">&quot;hello, world&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> index.htm
git add index.htm
git commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">'first local commit'</span>
git push</pre></div></div>

<p>After you push your changes, the post-update hook will delete the public/ directory (the root of the site). This dir and its contents are automatically generated and will get wiped out on EVERY push. Keep this in mind. All your changes and content should reside in proto/. </p>
<p>The proto/ repo will pull in the new changes, and then Jekyll will be invoked to generate the updated site in public/ from the prototype.</p>
<p>Should you need to edit it, the <strong>post-update hook</strong> is in the bare git repo (proto.git/hooks/)</p>
<p>Thanks to the authors in the posts below for sharing ideas. I first read this git method on dmiessler&#8217;s site. </p>
<p><strong>Resources:</strong><br />
<a href="http://dmiessler.com/blog/using-git-to-maintain-your-website">dmiessler.com &#8211; using git to maintain static pages</a><br />
<a href="http://toroid.org/ams/git-website-howto">toroid.org &#8211; using git to manage a web site</a><br />
<a href="http://github.com/mojombo/jekyll/tree/master">Jekyll @ GitHub</a><br />
<a href="http://media.pragprog.com/titles/tsgit/chap-005-extract.html">git info</a><br />
<a href="http://www.nardol.org/2009/2/19/git-basics-reversing-the-git-sucks-effect">more git info</a></p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/03/how-to-maintain-static-sites-with-git-jekyll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Multiple Monitors vs One Big Screen</title>
		<link>http://biodegradablegeek.com/2009/02/multiple-monitors-vs-one-big-screen/</link>
		<comments>http://biodegradablegeek.com/2009/02/multiple-monitors-vs-one-big-screen/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 18:56:03 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dual screen]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=317</guid>
		<description><![CDATA[
Most people I know who&#8217;ve never used dual screen ask me why I don&#8217;t invest in one big monitor instead. There&#8217;s a big difference between having multiple monitors and having just one, no matter the size. Though which is better really depends on what you&#8217;re using the computer for, what OS/window manager you&#8217;re using, and [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://biodegradablegeek.com/wp-content/uploads/2009/02/dualscreen.jpg" alt="dualscreen Multiple Monitors vs One Big Screen" title="dualscreen" width="400" height="300" class="alignright size-full wp-image-319" /><br />
Most people I know who&#8217;ve never used dual screen ask me why I don&#8217;t invest in one big monitor instead. There&#8217;s a big difference between having multiple monitors and having just one, no matter the size. Though which is better really depends on what you&#8217;re using the computer for, what OS/window manager you&#8217;re using, and how you use your particular setup. </p>
<p>For programming, and the way I use my desktop (gnome+compiz), having multiple screens is much more productive than one big screen because I hate minimizing and dragging windows. If I&#8217;m coding in rails for example, I can have <a href="http://biodegradablegeek.com/2007/12/using-vim-as-a-complete-ruby-on-rails-ide/">my editor</a> maximized in one screen, and a reference window or a <strong>`tail -f file.log`</strong> maximized in the other screen. With a big monitor I would need to manually resize each window or depend on my window managers cascade feature, which requires some manual resizing as well. </p>
<p>For coding or writing, a killer setup would be having two or three widescreen displays setup vertically side-by-side. I noticed I only look at 3/4th of the screen real estate when I&#8217;m coding, and when I hack or write, <span id="more-317"></span>I generally prefer having one long narrow window (off topic, but I always exceed <a href="https://launchpad.net/bzr/+bug/39657">80 chars per line</a>). Widescreen wasn&#8217;t made for coding anyway. </p>
<p>When it comes to (photo) editing, whether you&#8217;re using 1 or 2 monitors, widescreen is a must. Many people complain that Gimp doesn&#8217;t support MDI (Multiple Document Interface: Having multiple windows in a container, like Photoshop or AOL), but I noticed that Photoshop on Mac doesn&#8217;t have MDI either, and I finally began Learning to Love the Gimp Interface. I can edit a picture full screen in one monitor, while I have my entire toolset open on another screen. I can also do all my editing in one screen and have tutorials or references on another display. </p>
<p>Taskbars on each screen are also separated, so that apps open in one desktop don&#8217;t show up on the taskbar of another desktop (tweakable). This simplifies the taskbar and makes it quicker to find what you have minimized. <a href="http://biodegradablegeek.com/wp-content/uploads/2009/02/windows_double_taskbar.jpg">No more 256 pixel thick taskbars.</a></p>
<p>I used to think having a split/gap between screens was annoying, but it naturally segregates the workspace. I can banish windows I don&#8217;t care about to &#8216;the other&#8217; screen and focus without distractions on my main desktop. It&#8217;s sorta like the ADHD plugin for compiz. I can also switch my attention to make which ever monitor I want to be my &#8220;main display.&#8221; This brings us to another <strong>huge advantage</strong> a multi-monitor setup has over a huge single display. </p>
<p>You can physically move each screen around independently, which is great when you&#8217;re working in teams (i.e., you wanna demo something) or you just have people over. Just last night I had a basketball game on my 2nd display tilted so my bro can watch (neither of us have cable) while I did my thing in &#8216;my own&#8217; desktop.</p>
<p>With <a href="http://burtonini.com/blog/computers/devilspie">Devilspie</a>, you can probably configure yourself a pretty nice setup for a big monitor, but if you don&#8217;t plan on doing much hacking, dual screens are naturally more productive in OS X and Linux. I noticed Windows XP has problems with dual screen, i.e., the taskbar doesn&#8217;t go across both monitors, and the <a href="http://lifehacker.com/5056337/mousejail-keeps-your-cursor-on-the-right-screen">cursor moves off screen and &#8220;breaks&#8221; into other desktops while you&#8217;re in a game</a>. Very annoying, but Vista or <a href="http://btjunkie.org/search?q=windows+7">Windows 7 </a> might not exhibit these problems, and there are <a href="http://en.wikipedia.org/wiki/UltraMon">workarounds</a> in XP. </p>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2009/02/multiple-monitors-vs-one-big-screen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Learning to Read and Grok Other People&#8217;s Code</title>
		<link>http://biodegradablegeek.com/2008/11/learning-to-read-and-grok-other-peoples-code/</link>
		<comments>http://biodegradablegeek.com/2008/11/learning-to-read-and-grok-other-peoples-code/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 05:21:08 +0000</pubDate>
		<dc:creator>Isam</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[habits]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[oss]]></category>
		<category><![CDATA[persistence]]></category>
		<category><![CDATA[reading code]]></category>

		<guid isPermaLink="false">http://biodegradablegeek.com/?p=269</guid>
		<description><![CDATA[One reason many people don&#8217;t contribute to open source apps is because they find it daunting to look through somebody else&#8217;s code. Some might even think that it&#8217;s just simpler to write something from scratch than to study someone&#8217;s work. This isn&#8217;t true, and reading foreign code is something get used to and excel at [...]]]></description>
			<content:encoded><![CDATA[<p>One reason many people don&#8217;t contribute to open source apps is because they find it daunting to look through somebody else&#8217;s code. Some might even think that it&#8217;s just simpler to write something from scratch than to study someone&#8217;s work. This isn&#8217;t true, and reading foreign code is something get used to and excel at over time. It&#8217;s a necessary skill for every programmer, and has many benefits.</p>
<p>A huge benefit is the massive amount of information you learn and get accustomed to in a short period of time. There&#8217;s no way to download O&#8217;reilly PDFs into your brain just yet, but grokking source code written by those much more experienced than you is one of the fastest ways to see and practice everything you&#8217;re been learning in theory (books, sites, classes).</p>
<p>It&#8217;s certainly overwhelming to jump head first into a huge app trying to understand every line. I think it&#8217;s common for people to open up some code, read it for a few minutes and then never touch it again because they don&#8217;t understand it. This was the case with me when I began programming. Here are some ways i used to justify putting off the need to read third party code.</p>
<p>Their code style didn&#8217;t suit my taste, i.e., they add the opening curly bracket under the function definition, and I would find myself changing their brackets and formatting more than I spent time actually looking at the logic.</p>
<p>I told myself I would learn much more by re-inventing the wheel, or have more control over my app if I built it from scratch. This is only partial true, but the cons outweight the pros. Reinventing the wheel means diviating from writing program logic and having to learn something that might not even remotely be related to the project I intended to start or finish. Here&#8217;s an example that used to be common.</p>
<p><span id="more-269"></span></p>
<p>I would happily hack away and then realize that I need a string library (<strong>I &lt;3 C</strong>). At this point I could have downloaded one, and continued hacking at my app. But instead I would start a new project aimed at writing an efficient string library. Before I knew it, I&#8217;m hours into my string lib and totally abandoned my main project. I usually  anyway. The funny thing is that sometimes I&#8217;ll just give up and use a third party lib, but most of the time I just ended up scrapping both projects. What a waste of time.</p>
<p>Everyone has their own way of learning other people&#8217;s code. I found that what works best for me is to download an app and just browse the source indifferently. It&#8217;s not good, it&#8217;s not bad, it&#8217;s not ugly or inefficient or godly. I just try to get a basic idea of where everything is, what plugins are being used, etc. Layout stuff is in this general area, settings here, plugins are all in there, etc. This step is probably useless and I only do it as a guilt-free way to avoid working for 10 minutes. Or, maybe it does help.</p>
<p>Then I begin by setting up the environment. Put in my DB settings, make sure I have all the requirements installed, etc. Logs are your best lead at this point. I usually open up a fullscreen console and tail -f the log file(s), then watch them like a hawk every time you shift a pixel in the code. It&#8217;s not as tedious as it sounds.</p>
<p>Another thing that helps is knowing the language/framework the code is written in. You should know at least how to read the language &#8211; though if you&#8217;re dedicated, I&#8217;m sure you can muddle through with a crash course/reference sheet. By knowing the lang/framework, you can find or create some functions to help you debug and examine objects (even just <strong>raise object.inspect</strong> is great) in detail. You can also examine other aspects of the code. One thing I do early on is <strong>rake routes &gt; ROUTES</strong>. This saves all the routes to a file which I can glance at if necessary. And <em>rake routes</em> takes forever on my ancient machine.</p>
<p>After this, the code is compiled/started and I&#8217;m <em>ready</em> when I can interact with it live. Now I begin actually reading the code. If I have a specific update I want to make, be it adding a new feature, fixing a bug, or seeing how something works, I work backwards from the live app tracing everything going on around the component I&#8217;d like to edit/update.</p>
<p>This is not easy, not quick, and very error prone when you&#8217;re making updates. Things breaking == You learning, and all you need to do is <strong>be persistent</strong>. It&#8217;s like reading a calculus book. Nothing will make sense until you turn over the page and see how the problems and answers are laid out, and begin doing them on your own. It&#8217;s a great feeling when 2-3 days later you realize that you have a pretty good view of the app&#8217;s design (unless it&#8217;s something like the Kernel).</p>
<p>No matter how cryptic the code looks, don&#8217;t be turned off. Is there some sort of force that will completely stop you from understanding what the logic says? Can other people look at this code and instantly tell you what it&#8217;s doing? (well, they can form a great guess if they have the experience). It&#8217;s time consuming but the concepts apply to other things in life. You can understand how to change your oil without knowing how the engine works, or how to make simple CSS/HTML changes to a layout to change the background or font size without knowing every single CSS tag and technique.</p>
<p><strong>define:persistent: </strong><em>Refusing to give up, especially when faced with opposition or difficulty; continuing firmly or steadily</em></p>
<p>Most of my favorite quotes are about it. It&#8217;s unfortunate my memory isn&#8217;t very persistent.</p>
<p style="text-align: center;"><img class="size-full wp-image-271 aligncenter" title="Persistence is the key to money, fame, power and sex." src="http://biodegradablegeek.com/wp-content/uploads/2008/11/persistenceposter.jpg" alt="persistence poster" width="400" height="336" /></p>
<p style="text-align: center;">
<h2 style="text-align: left;"><span style="color: #ff6600;">Do you have any special techniques/advice for learning to read third party code?</span></h2>
]]></content:encoded>
			<wfw:commentRss>http://biodegradablegeek.com/2008/11/learning-to-read-and-grok-other-peoples-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
