<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>The Helpful Hacker</title>
	
	<link>http://thehelpfulhacker.net</link>
	<description />
	<lastBuildDate>Sun, 05 Feb 2012 18:13:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TheHelpfulHacker" /><feedburner:info uri="thehelpfulhacker" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><item>
		<title>Kindle Fire Connectbot Followup</title>
		<link>http://feedproxy.google.com/~r/TheHelpfulHacker/~3/SsWgbjdIZpk/</link>
		<comments>http://thehelpfulhacker.net/2011/12/28/kindle-fire-connectbot-followup/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 02:09:25 +0000</pubDate>
		<dc:creator>Zach Peters</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle fire hacking code connectbot]]></category>

		<guid isPermaLink="false">http://thehelpfulhacker.net/?p=586</guid>
		<description><![CDATA[Just a quick followup to the previous article I had on getting connectbot to work on the Kindle Fire. A lot of people have been asking for an unofficial apk of the changes I&#8217;ve made. Initially I hesitated &#8211; I wanted to follow the official channels. Initially, I posted this article with some links to [...]
Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/' rel='bookmark' title='Getting Connectbot working on Kindle Fire'>Getting Connectbot working on Kindle Fire</a></li>
<li><a href='http://thehelpfulhacker.net/2010/01/24/whoopsie-the-publish-button-needs-a-molly-guard/' rel='bookmark' title='Whoopsie, the &#8220;Publish&#8221; button needs a molly-guard'>Whoopsie, the &#8220;Publish&#8221; button needs a molly-guard</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/12/12658930.jpg"><img src="http://thehelpfulhacker.net/wp-content/uploads/2011/12/12658930-300x297.jpg" alt="" title="12658930" width="300" height="297" class="alignright size-medium wp-image-588" /></a><br />
Just a quick followup to the previous article I had on <a href="http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/">getting connectbot to work on the Kindle Fire</a>.</p>
<p>A lot of people have been asking for an unofficial apk of the changes I&#8217;ve made.  Initially I hesitated &#8211; I wanted to follow the official channels.  Initially, I posted this article with some links to my changes (admittedly pretty primitive) and posted a followup to the <a href="http://code.google.com/p/connectbot/issues/detail?id=532&#038;colspec=ID%20Type%20Status%20Milestone%20Summary%20Stars">thread on the issue tracker</a>.</p>
<p>Looking at the latest build snapshot (12/19) it still doesn&#8217;t appear that a fix has been incorporated into the main source.  I do not expect that my off-the-cuff additions would be accepted, but there is enough demand that someone should have been able to address this properly by now.</p>
<p>So I&#8217;m offering my personal build of the connectbot source.  Totally unmaintained, not warranty, use at your own risk. <img src='http://thehelpfulhacker.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a href="http://media.thehelpfulhacker.net/index.php?dir=bin/&#038;file=connectbot-kindle-fire-mod-d83c275.apk">http://media.thehelpfulhacker.net/index.php?dir=bin/&#038;file=connectbot-kindle-fire-mod-d83c275.apk</a></p>
<p>Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/' rel='bookmark' title='Getting Connectbot working on Kindle Fire'>Getting Connectbot working on Kindle Fire</a></li>
<li><a href='http://thehelpfulhacker.net/2010/01/24/whoopsie-the-publish-button-needs-a-molly-guard/' rel='bookmark' title='Whoopsie, the &#8220;Publish&#8221; button needs a molly-guard'>Whoopsie, the &#8220;Publish&#8221; button needs a molly-guard</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=SsWgbjdIZpk:QFIKv5Ew_w4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=SsWgbjdIZpk:QFIKv5Ew_w4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=SsWgbjdIZpk:QFIKv5Ew_w4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=SsWgbjdIZpk:QFIKv5Ew_w4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=SsWgbjdIZpk:QFIKv5Ew_w4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=SsWgbjdIZpk:QFIKv5Ew_w4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TheHelpfulHacker/~4/SsWgbjdIZpk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thehelpfulhacker.net/2011/12/28/kindle-fire-connectbot-followup/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://thehelpfulhacker.net/2011/12/28/kindle-fire-connectbot-followup/</feedburner:origLink></item>
		<item>
		<title>Getting Connectbot working on Kindle Fire</title>
		<link>http://feedproxy.google.com/~r/TheHelpfulHacker/~3/8lUHOow-8k8/</link>
		<comments>http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 03:18:55 +0000</pubDate>
		<dc:creator>Zach Peters</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle fire hacking code connectbot]]></category>

		<guid isPermaLink="false">http://thehelpfulhacker.net/?p=580</guid>
		<description><![CDATA[Ever since getting the Kindle Fire I&#8217;ve been dreaming of the day that I can get ConnectBot working.  The first hurdle is that this is not available in the Amazon market.  Luckily, being under the Apache License they did have code available on the google code site. After
Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2011/12/28/kindle-fire-connectbot-followup/' rel='bookmark' title='Kindle Fire Connectbot Followup'>Kindle Fire Connectbot Followup</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-210903.png"><img class="alignright size-full wp-image-581" title="device-2011-11-21-210903" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-210903.png" alt="" width="300" height="512" /></a></p>
<p>Ever since getting the Kindle Fire I&#8217;ve been dreaming of the day that I can get ConnectBot working.  The first hurdle is that this is not available in the Amazon market.  Luckily, being under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a> they did have code available on the google code site.</p>
<p>After <a href="http://code.google.com/p/connectbot/downloads/list"">installing the apk file</a>, i started up a test connection.  Everything was going well until I got to the part where I enter the server name.  The virtual keyboard pops up, but instead of an <em>enter</em> key there is only <em>.com</em>.  I recognized this as the keyboard that comes up when you are in the web browser.  Unfortunately, unlike the web browser, there is no additional &#8220;go&#8221; button.</p>
<p>First thing I did was check the issues to see if this has been reported yet.  Yes it had, sounds like <a href="http://code.google.com/p/connectbot/issues/detail?id=532&amp;colspec=ID%20Type%20Status%20Milestone%20Summary%20Stars">many people are itching</a> to ssh from their Kindle Fire <img src='http://thehelpfulhacker.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>So I dutifully tagged the issue and waited for a fix&#8230;</p>
<p>After waiting a few days I couldn&#8217;t let it sit. I needed to dig in myself and see if i could find anything.  Seemed like a relatively easy problem</p>
<h2>The Process</h2>
<p>First I grabbed the code via git from their <a href="http://code.google.com/p/connectbot/source/checkout">project page</a> and setup my Android dev environment.  This included<a href="http://developer.android.com/sdk/installing.html"> installing the Android SDK</a>, <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u1-download-513651.html">installing JDK</a> and <a href="http://www.eclipse.org/downloads/">installing Eclipse</a>.</p>
<p>Once I got all my goodies installed I connected the Kindle Fire, waited for the &#8220;connecting USB&#8221; to finish&#8230;and&#8230;NOTHING!</p>
<p>After a little research I learned I first needed to<a href="http://www.technipages.com/kindle-fire-enable-usb-debugging.html"> install the Google USB drivers</a> for this device.  Went into device manager and found the Kindle device with missing drivers, right-clicked and pointed to the ini file.</p>
<p>At this point I was able to do an <tt>adb devices</tt> and could verify that my Kindle Fire was detected</p>
<p>At this point I was still pretty much at a loss of where to being.  I knew just from playing around with the Kindle Fire that there definitely <strong>is</strong> a keyboard layout that had an <em>enter</em> key.  For some reason <em>this</em> layout was not using it though, it was defaulting to the same one used for entering websites.  Having the <em>.com</em> where <em>enter</em> should be is normally not a problem &#8211; when the keyboard collapses you can then click on the <em>go</em> button.  In this case, however, the keyboard does not allow for that option.</p>
<p>After doing some research I learned that there are <a href="http://www.androidpeople.com/android-edittext-inputtype">many different</a> <em>inputType</em> fields that will basically <a href="http://developer.android.com/reference/android/text/InputType.html">determine what keyboard layout</a> was used.  Getting closer&#8230;</p>
<p><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-204747.png"><img class="size-full wp-image-583 alignleft" title="device-2011-11-21-204747" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-204747.png" alt="" width="335" height="97" /></a></p>
<p>What I finally stumbled upon was, oddly, the default text in the input field &#8220;username@hostname:port&#8221;.  I was able to use this very unique string to search through the code to eventually come upon my first clue. I was lead to a &#8220;hint&#8221; (literally) in the <em>&lt;EditText&gt;</em> element, inside of which I noticed the <em>android:inputType</em> that was initially set to<em> textEmailAddress</em>, I changed this to <em>textMultiLine</em>.  My theory being that if it had multiple lines there was some way to send a carriage return.</p>
<p>So far success&#8230;</p>
<p>Except now I get to the password line and I&#8217;m facing a &#8220;new&#8221; keyboard with the same issue: a <em>.com</em> where and <em>enter</em> should be.</p>
<p>So doing some more searching I use my same method of searching for the text hint, this time <em>Password:</em> Pretty quickly I found this one but it wasn&#8217;t quite the same.  I was lead to <em>strings.xml</em> which is essentially a &#8220;lookup table&#8221; for strings.  At least now I know that <em>Password: </em>will be in the code somewhere as <em>prompt_password</em>.  So digging some more I found a corresponding <em>&lt;EditText&gt;.  </em>But this lead me to a field for key generation (probably needs to be &#8220;fixed&#8221; for everything to actually work).  This wasn&#8217;t quite what I was looking for.</p>
<p>Browsing the &#8220;layout&#8221; folder, I was eventually able to find the file I needed. I found a <em>console_password</em> line in <em>act_console.xml</em>.  After adding a <em>android:inputType=&#8221;textMultiLine&#8221;</em> I was set.  I ran the file, sending it to my Fire and met with success this time when connecting to my server.  Using the <a href="http://reviewhorizon.com/2011/11/how-to-take-screenshots-with-kindle-fire/">following method</a> I was able to take a screenshot of my victory.</p>
<h3>The changes<span class="Apple-style-span" style="font-size: 13px; font-weight: normal;"> </span></h3>
<p><a href="https://gist.github.com/1384710">https://gist.github.com/1384710</a></p>
<p><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-201027.png"><img class="alignright size-full wp-image-582" title="device-2011-11-21-201027" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/device-2011-11-21-201027.png" alt="" width="300" height="512" /></a></p>
<h3>The results</h3>
<p>I still have little understanding of <em>why</em> what I changed did what it did, or what repercussions this might have on other Android platforms. I hope this does show, however, that with a little persistence to &#8220;scratch an itch&#8221; it is pretty easy to use some really basic research and techniques to modify Android source code to meet your needs.</p>
<p>Since this has sparked in interest in me for learning more about Android development.  I look forward to learning more about the ins and outs of the platform and how to <em>properly</em> submit and implement patches for bugs like this.</p>
<p>Since this was a quick and dirty hack, I look forward to input on the right way to do this.</p>
<hr />
<p><em>Edit 2011-11-22: I forgot to actually describe the problem (lack of Enter key)&#8230;</em></p>
<p>Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2011/12/28/kindle-fire-connectbot-followup/' rel='bookmark' title='Kindle Fire Connectbot Followup'>Kindle Fire Connectbot Followup</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=8lUHOow-8k8:89TvLr6r0EU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=8lUHOow-8k8:89TvLr6r0EU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=8lUHOow-8k8:89TvLr6r0EU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=8lUHOow-8k8:89TvLr6r0EU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=8lUHOow-8k8:89TvLr6r0EU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=8lUHOow-8k8:89TvLr6r0EU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TheHelpfulHacker/~4/8lUHOow-8k8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://thehelpfulhacker.net/2011/11/21/getting-connectbot-to-work-on-kindle/</feedburner:origLink></item>
		<item>
		<title>A Simple OpenBSD Router For Your Virtual Machines</title>
		<link>http://feedproxy.google.com/~r/TheHelpfulHacker/~3/yjFDQFZCbY8/</link>
		<comments>http://thehelpfulhacker.net/2011/11/15/virtual-box-openbsd-router/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 12:50:48 +0000</pubDate>
		<dc:creator>Zach Peters</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[openbsd virtualbox router virtual machine]]></category>

		<guid isPermaLink="false">http://thehelpfulhacker.net/?p=569</guid>
		<description><![CDATA[Why do i need a separate router for virtual servers I tend to use VirtualBox a lot at home for experimenting with different operating systems or trying out scenarios that are too dangerous to &#8220;do it live&#8221;. While I could just give these virtual machines a bridged connection, I like to try to keep things [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img title="Openbsd" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/Openbsd.png" alt="" width="200" height="130" align="right" /></p>
<h2>Why do i need a separate router for virtual servers</h2>
<p>I tend to use VirtualBox a lot at home for experimenting with different operating systems or trying out scenarios that are too dangerous to &#8220;do it live&#8221;. While I could just give these virtual machines a bridged connection, I like to try to keep things as close as possible to the original environment, especially for &#8220;forensic&#8221; inspections.</p>
<p>In order to do this I have come up with a very basic OpenBSD setup that allows me to adapt the router/firewall to the virtual machine rather then make modifications to the image. Using the <a href="http://www.openbsd.org/faq/pf/">PF firewall</a>, we will be able to rapidly assemble a <a href="http://en.wikipedia.org/wiki/Network_address_translation">NAT&#8217;ing</a> firewall. With additional research you, thanks to PF&#8217;s awesome documentation, you should be able to extend this to be a <a href="http://prefetch.net/articles/monitoringpf.html">traffic logger</a>, export to <a href="http://www.undeadly.org/cgi?action=article&amp;sid=20080909151202">netflow</a> and do <a href="http://www.openbsd.org/faq/pf/carp.html">many other things</a>.</p>
<p>I have tried experimenting with many &#8220;embedded&#8221; Linux distros that are targeted more at a hardware appliance, but in the end all of the user friendly settings just ended up getting in the way. Using OpenBSD I am able to get a very low footprint OS with a well-documented and transparent firewall. I know precisely what PF is doing with my packets.</p>
<p>While this setup was done on VirtualBox, it could easily be adapted to any virtual host environment that allows for Bridged and Internal NICs to be assigned.</p>
<p><img title="icona_oracle_virtualbox1" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/icona_oracle_virtualbox1.png" alt="" width="256" height="256" align="right" /></p>
<h2>Creating the Virtual Machine</h2>
<p>For me, Virtual Box is my go to virtual platform for experimentation. The interface makes sense and gets out of my way when creating virtual machines. Virtual HDD&#8217;s and ISOs correspond to real files in your host machines OS, not an abstracted storage device.</p>
<p>For long running servers I prefer ESX, but for just playing around Virtual Box is the way to go.</p>
<ul>
<li>Download and install <a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box for your OS</a></li>
<li>Download load &#8220;cd50.iso&#8221; from a mirror at <a href="http://www.openbsd.org/ftp.html#http">http://www.openbsd.org/ftp.html#http</a>. This is the base install iso with no extras, we&#8217;ll be adding some software as part of the install process.</li>
<li>Create a new VM in VirtualBox</li>
<ul>
<li>32 MB RAM</li>
<li>600 MB HDD (This leaves about 100 MB of free spaces for logs and additional packages)</li>
</ul>
<li>Edit your network settings and add an additional NIC. Set the first one to Bridged or NAT and the second one to Internal</li>
</ul>
<p><img title="OpenBSD" src="http://thehelpfulhacker.net/wp-content/uploads/2011/11/OpenBSD.png" alt="" width="300" align="right" /></p>
<h2>Base Installation</h2>
<p>Though this is a text based installer (a dying breed) the install is very straight-forward with logical defaults. For the most part you can just hit enter.</p>
<ul>
<li>&#8220;I&#8221; install</li>
<li>Choose Keyboard</li>
<li>Set hostname</li>
<li>Configure bridged/NATd nic for downloading installation files</li>
<li>Set your password</li>
<li>Start ssh &#8211; Yes</li>
<li>Start Ntp &#8211; Yes &#8211; set to your favorite ntp server (pool.ntp.org)</li>
<li>Do you expect to run X Windows &#8211; No</li>
<li>Setup default user (your choice)</li>
<li>Set your timezone</li>
<li>Setup the disk</li>
<ul>
<li>Which one is the root disk &#8211; wd0</li>
<li>Use DUIDs &#8211; yes</li>
<li>Use whole disk &#8211; whole</li>
<li>Use auto layout</li>
</ul>
<li>Location of sets &#8211; http</li>
<li>Accept defaults for server, path locations</li>
<li>Set names &#8211; type &#8220;-x*&#8221; to deselect all of the X Windows packages</li>
<li>Set names &#8211; done</li>
<li>There may be a few additional questions about setting the time, adding non-free items to the boot process, just answer as necessary</li>
<li>At the end you&#8217;ll be dumped to a shell prompt, type &#8220;halt&#8221; to shutdown.  Power off and remove the virtual cd.  Power back up</li>
</ul>
<h2>First boot config</h2>
<p>Surprisingly, we are nearly done. Only a few touches are needed to enable NAT and turn on the minimal firewall settings to allow traffic out.</p>
<h3>Configuring Basic Networking</h3>
<p>First we will need to setup our network interfaces. After going through the install your primary interface (<em>em0</em>) should already be setup, but lets review. Network configuration is done by editing the file <em>/etc/homename.interface</em>, for example <em>/etc/hostname.em0</em>. I have mine set as below, adapt as needed.</p>
<p><em>/etc/hostname.em0</em> &#8211; <tt>dhcp</tt><br />
<em>/etc/hostname.em1</em> &#8211; <tt>192.168.1.1 255.255.255.0</tt></p>
<p>Next we&#8217;ll set the nameserver, if you set your primary to use DHCP in the install process this will already be filled in by the values from your DHCP server.</p>
<p><em>/etc/resolv.conf</em> &#8211; <tt>nameserver 8.8.8.8</tt></p>
<p>And finally setting the gateway. Again, if you&#8217;ve set your interface to DHCP it will be set by the DHCP server and this file will not be created, otherwise:</p>
<p><em>/etc/mygate</em> &#8211; <tt>10.0.0.1</tt></p>
<p>Now to restart the network interfaces and settings, run the following:</p>
<p><tt>sh /etc/netstart</tt></p>
<h3>Turning on IP forwarding</h3>
<p>IP forwarding is controlled by the <em>sysctl</em> mechanism. In *BSD, sysctl is basically a way to tweak various kernel settings. Being built into the kernel these pieces are generally more low level and higher performance than a &#8220;user land&#8221; application. For a one-time change you can use the <em>sysctl</em> command to tweak settings. To make these settings persist over reboots, we will be setting them in the <em>/etc/sysctl.conf</em> file.</p>
<p>Edit <em>/etc/sysctl.conf</em> with your favorite editor (<em>vi</em> and <em>mg</em> &#8211; MicroGnuEmacs are among those included). Find the line that says:</p>
<pre>#net.inet.ip.forwarding=1</pre>
<p>and remove the comment</p>
<pre>net.inet.ip.forwarding=1</pre>
<h3>Setting up PF the Packet Firewall</h3>
<p>Now we have turned on the IP forwarding mechanism in the kernel we need to enable the PF firewall and tell it how to route traffic.</p>
<p>First, we will enable the firewall. This is done by simply editing <em>/etc/rc.conf</em> which is somewhat like a master settings file. In here you will find various settings relating to which applications should be running at boot and what settings they take. To turn off an application it is set equal to <em>NO</em>, otherwise it is a <em>&#8220;&#8221;</em> or some setting inside quotes, such as <em>&#8220;en0&#8243;</em>. The comments do a good job of explaining these options.</p>
<p>What we are looking for is the line:</p>
<pre>pf=NO</pre>
<p>set this to:</p>
<pre>pf=YES</pre>
<p>That&#8217;s nearly it!</p>
<h3>Configuring PF</h3>
<p>Now for the most difficult part. Seriously, this is pretty easy stuff right?</p>
<p>We will be editing the settings file for PF, <em>/etc/pf.conf</em>. At the top you will notice some default settings, leave these.</p>
<p>At the bottom of the file we will add the following line:</p>
<pre>pass out on em0 from em1:network to any nat-to (em0)</pre>
<p>What this will do is fairly easy to understand once you realize that the PF configuration is it&#8217;s own mini language ( or <a href="http://en.wikipedia.org/wiki/Domain-specific_language">Domain Specific Language</a> )</p>
<p>Rules are essentially built up like this: <em>action direction on interface from/to destination</em></p>
<p><tt>pass out on em0</tt> &#8211; allow traffic outward from em0 (our &#8220;external&#8221; interface)</p>
<p><tt>from em1:network</tt> &#8211; this is shorthand to say &#8220;whatever IP network we have assigned to <em>em1</em>&#8220;, <em>em1</em> being our internal interface.</p>
<p><tt>to any</tt> &#8211; we don&#8217;t care where the traffic is destined for</p>
<p><tt>nat-to (em0)</tt> &#8211; perform NAT on the traffic to make it appear as if it&#8217;s coming from <em>em0</em>. With the parenthesis around <em>em0</em> we are telling PF to continually update the IP of this interface, as it may change &#8211; for example with a cable modem</p>
<h2>Finishing up</h2>
<p>You could manually activate all of the changes we have made using the <em>sysctl</em> and <em>pfctl</em> commands, but I find it easier to just reboot. A quick reboot will also prove that all of the services will start up correctly.</p>
<p>I hope this little BSD firewall is useful to you. It can easily be adapted to be a DHCP server, DNS server, or <a href="http://www.openbsd.org/faq/faq6.html">provide many other network services</a>. This will help you in building up your virtual network for testing or replicating an existing environment for experimentation with captured P2V machines.</p>
<p>No related posts.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=yjFDQFZCbY8:R1-cOUhQGjY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=yjFDQFZCbY8:R1-cOUhQGjY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=yjFDQFZCbY8:R1-cOUhQGjY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=yjFDQFZCbY8:R1-cOUhQGjY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=yjFDQFZCbY8:R1-cOUhQGjY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=yjFDQFZCbY8:R1-cOUhQGjY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TheHelpfulHacker/~4/yjFDQFZCbY8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thehelpfulhacker.net/2011/11/15/virtual-box-openbsd-router/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://thehelpfulhacker.net/2011/11/15/virtual-box-openbsd-router/</feedburner:origLink></item>
		<item>
		<title>The Backups 321 Rule Illustrated</title>
		<link>http://feedproxy.google.com/~r/TheHelpfulHacker/~3/1rjSWHDQmKs/</link>
		<comments>http://thehelpfulhacker.net/2011/08/04/the-backups-321-rule-illustrated/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 02:08:47 +0000</pubDate>
		<dc:creator>Zach Peters</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[backups illustration]]></category>

		<guid isPermaLink="false">http://thehelpfulhacker.net/?p=528</guid>
		<description><![CDATA[3 &#8211; Have three backups.  So have a backup, and a backup of your backup.  But surely, another is just madness?  The first copy of your backup is just to save yourself from silly mistakes, like accidentally deleting your backup. 2 &#8211; Have your backups on at least two different media.  Which makes sense.  If [...]
Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2010/01/15/quickie-gmail-backups/' rel='bookmark' title='Quickie: Gmail Backups With Getmail'>Quickie: Gmail Backups With Getmail</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://thehelpfulhacker.net/wp-content/uploads/2011/06/disk-268x300.png" alt="" width="161" height="180" align="right" /></p>
<p>3 &#8211; Have three backups.  So have a backup, and a backup of your backup.  But surely, another is just madness?  The first copy of your backup is just to save yourself from silly mistakes, like accidentally deleting your backup.</p>
<p>2 &#8211; Have your backups on at least two different media.  Which makes sense.  If all three of your backups are on the same disk, they aren&#8217;t truly fulfilling their purpose of the disk dies.  So you want to have your backups on at least two different pieces of media.  I would go so far to say two different <em>types</em> of media.  If one is a disk, the other should be a tape, etc.</p>
<p>1 &#8211; Have one offsite copy. If your physical location burns down, how can you retrieve your backups, no matter what different types of media they were on</p>
<p style="text-align: center;"><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/08/Backup321.png"><br />
</a><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/08/Backup321.png"><img class="aligncenter size-large wp-image-564" title="Backup321" src="http://thehelpfulhacker.net/wp-content/uploads/2011/08/Backup321-1024x896.png" alt="" width="491" height="430" /></a></p>
<p style="text-align: center;">
<p>Related posts:<ol>
<li><a href='http://thehelpfulhacker.net/2010/01/15/quickie-gmail-backups/' rel='bookmark' title='Quickie: Gmail Backups With Getmail'>Quickie: Gmail Backups With Getmail</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=1rjSWHDQmKs:ZSNTWH15j2s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=1rjSWHDQmKs:ZSNTWH15j2s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=1rjSWHDQmKs:ZSNTWH15j2s:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=1rjSWHDQmKs:ZSNTWH15j2s:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=1rjSWHDQmKs:ZSNTWH15j2s:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=1rjSWHDQmKs:ZSNTWH15j2s:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TheHelpfulHacker/~4/1rjSWHDQmKs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thehelpfulhacker.net/2011/08/04/the-backups-321-rule-illustrated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://thehelpfulhacker.net/2011/08/04/the-backups-321-rule-illustrated/</feedburner:origLink></item>
		<item>
		<title>Checking Your Reddit Karma with Common Lisp</title>
		<link>http://feedproxy.google.com/~r/TheHelpfulHacker/~3/wvlQdMZqlEg/</link>
		<comments>http://thehelpfulhacker.net/2011/07/10/checking-your-reddit-karma-with-common-lisp/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 19:30:55 +0000</pubDate>
		<dc:creator>Zach Peters</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[reddit karma common lisp]]></category>

		<guid isPermaLink="false">http://thehelpfulhacker.net/?p=558</guid>
		<description><![CDATA[Curious to learn more about programming in Common Lisp I decided to write a quick little reddit karma checker. Having just recently learned of quicklisp (a script that greatly simplifies using 3rd party libraries with Lisp), I was ready to wing it and see what I could come up with.  I&#8217;m going to share with [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://thehelpfulhacker.net/wp-content/uploads/2011/07/path3910-e1310326064182.png"><img class="alignright size-medium wp-image-562" style="border-style: initial; border-color: initial; border-width: 0px;" title="path3910" src="http://thehelpfulhacker.net/wp-content/uploads/2011/07/path3910-225x300.png" alt="" width="144" height="192" /></a>Curious to learn more about programming in <a href="http://en.wikipedia.org/wiki/Common_Lisp">Common Lisp</a> I decided to write a quick little reddit karma checker. Having just recently learned of <a href="http://www.quicklisp.org/beta/">quicklisp</a> (a script that greatly simplifies using 3rd party libraries with Lisp), I was ready to wing it and see what I could come up with.  I&#8217;m going to share with you the process I went through go from just a vague idea of what I wanted to do to the complete Lisp script.</p>
<h2>The Reddit API</h2>
<p>The first step is to check out reddit&#8217;s API to see if and how I can use to to get my current karma. Looking <a href="https://github.com/reddit/reddit/wiki/API">this over</a> I noticed under the section about &#8220;Fetching Information&#8221; it should be a simple matter of requesting a specially crafted URL to get the info I was looking for.</p>
<p>&nbsp;</p>
<p>My first attempt looked something like this:</p>

<div class="wp-terminal">user@computer:$ [zach@server]$ curl http://www.reddit.com/user/cliffwarden/about.json<br/><br/>{"kind": "t2", "data": {"has_mail": null, "name": "cliffwarden", "created": 1151777163.0, "created_utc": 1151777163.0, "link_karma": 294, "comment_karma": 330, "is_gold": false, "is_mod": false, "id": "9440", "has_mod_mail": null}}<br/><br/>[zach@server]$<br/></div>

<p>&nbsp;</p>
<h2>Quicklisp</h2>
<p>I knew that creating http connections to obtain json and then parsing it was a bit out of my abilities (for now) I started looking to see if any of this was built into the flavor of Lisp I was currently using (sbcl) or if there was a third party library somewhere.</p>
<p>After some looking I came across Quicklisp which is Lisp&#8217;s answer to Perl&#8217;s CPAN or Python&#8217;s &#8220;pypi&#8221; or Ruby&#8217;s &#8220;gems&#8221;.  This is seriously cool stuff!  After taking approximately output <a href="http://www.quicklisp.org/beta/">10 seconds to install quicklisp</a> I was able to find two packages that would help me out using the <code>(ql:system-apropos <em>string</em>)</code></p>
<p>My session went something like this:</p>

<div class="wp-terminal">user@computer:$ sbcl --load quicklisp.lisp<br/><br/>This is SBCL 1.0.45.0.debian, an implementation of ANSI Common Lisp.<br/>More information about SBCL is available at .<br/><br/>SBCL is free software, provided as is, with absolutely no warranty.<br/>It is mostly in the public domain; some portions are provided under<br/>BSD-style licenses.  See the CREDITS and COPYING files in the<br/>distribution for more information.<br/><br/>==== quicklisp quickstart loaded ====<br/><br/>To continue, evaluate: (quicklisp-quickstart:install)<br/><br/>* (quicklisp-quickstart:install)<br/>; Fetching #<br/>; 159.59KB<br/>==================================================<br/>163,424 bytes in 1.34 seconds (119.19KB/sec)<br/>; Fetching #<br/>; 180.00KB<br/>==================================================<br/>184,320 bytes in 1.65 seconds (108.96KB/sec)<br/>; Fetching #<br/>; 4.88KB<br/>==================================================<br/>4,995 bytes in 0.001 seconds (4877.93KB/sec)<br/>; Fetching #<br/>; 0.40KB<br/>==================================================<br/>408 bytes in 0.003 seconds (132.81KB/sec)<br/><br/>==== quicklisp installed ====<br/><br/>To load a system, use: (ql:quickload "system-name")<br/><br/>To find systems, use: (ql:system-apropos "term")<br/><br/>To load Quicklisp every time you start Lisp, use: (ql:add-to-init-file)<br/><br/>For more information, see http://www.quicklisp.org/beta/<br/><br/>NIL<br/>* (quit)<br/></div>

<p><em>Install Quicklisp itself</em></p>
<p>To make sure Quicklisp is loaded every time you run Lisp (under the current user) use the <code>(ql:add-to-init-file)</code> to add the appropriate code to your init file.</p>
<h2>Drakma</h2>
<p>Basically what I need is a Curl or Wget for Lisp. After some looking around Drakma looked like it would fit the bill &#8211; more power than I needed initially, but certainly usable.</p>
<p>So the first order of business is getting it installed. Since we have quicklisp loaded it is a simple matter of finding the appropriate package name:</p>

<div class="wp-terminal">user@computer:$ SBCL  Port: 35999  Pid: 6430<br/>; SLIME 2010-07-21<br/>CL-USER&gt; (quicklisp:system-apropos "drakma")<br/>#&lt;SYSTEM drakma / drakma-1.2.3 / quicklisp 2011-06-19&gt;<br/>CL-USER&gt;<br/></div>

<p><em>Yep, just as we suspected, it&#8217;s called &#8220;drakma&#8221;</em></p>
<p>and install it</p>

<div class="wp-terminal">user@computer:$ (quicklisp-quickload "drakma")<br/></div>

<p><em>starting the library install</em></p>
<p>The really cool thing about this is you just use these &#8220;quickload&#8221; statements at the top of your lisp programs &#8211; if it is already downloaded it will load the library, if it needs the code it will automatically download it and continue with the program when its done!</p>
<p>So let&#8217;s experiment with Drakma. I&#8217;m a big fan of exploratory programming so I usually &#8220;learn by tab completion&#8221;, meaning i just hit tab and see what is available. I know I&#8217;m probably looking for a &#8220;get&#8221; or &#8220;request&#8221;. &#8220;http-request&#8221; that is probably what I&#8217;m looking for. And the beauty of the Slime interface comes to the surface. Simply by typing <code>(drakma:http-request <strong></strong></code> I see the arguments that this function takes in emacs status line. URL, this seems pretty straight-forward.</p>

<div class="wp-terminal">user@computer:$ CL-USER&gt; (drakma:http-request "http://reddit.com/user/cliffwarden/about.json")<br/>#(123 34 107 105 110 100 34 58 32 34 116 50 34 44 32 34 100 97 116 97 34 58 32<br/>123 34 104 97 115 95 109 97 105 108 34 58 32 110 117 108 108 44 32 34 110 97<br/>109 101 34 58 32 34 99 108 105 102 102 119 97 114 100 101 110 34 44 32 34 99<br/>114 101 97 116 101 100 34 58 32 49 49 53 49 55 55 55 49 54 51 46 48 44 32 34<br/>99 114 101 97 116 101 100 95 117 116 99 34 58 32 49 49 53 49 55 55 55 49 54<br/>51 46 48 44 32 34 108 105 110 107 95 107 97 114 109 97 34 58 32 50 57 52 44<br/>32 34 99 111 109 109 101 110 116 95 107 97 114 109 97 34 58 32 51 51 48 44 32<br/>34 105 115 95 103 111 108 100 34 58 32 102 97 108 115 101 44 32 34 105 115 95<br/>109 111 100 34 58 32 102 97 108 115 101 44 32 34 105 100 34 58 32 34 57 52 52<br/>48 34 44 32 34 104 97 115 95 109 111 100 95 109 97 105 108 34 58 32 110 117<br/>108 108 125 125)<br/>200<br/>((:CONTENT-TYPE . "application/json; charset=UTF-8")<br/>(:ACCESS-CONTROL . "allow ")<br/>(:SET-COOKIE<br/>. "reddit_first=%7B%22firsttime%22%3A%20%22first%22%7D; Domain=reddit.com; expires=Thu, 31 Dec 2037 23:59:59 GMT; Path=/")<br/>(:SERVER . "'; DROP TABLE servertypes; --")<br/>(:DATE . "Sun, 10 Jul 2011 17:05:35 GMT") (:CONTENT-LENGTH . "231")<br/>(:EXPIRES . "Sun, 10 Jul 2011 19:05:35 GMT") (:CONNECTION . "close"))<br/>#<br/>#<br/>T<br/>"OK"<br/>CL-USER&gt;<br/></div>

<p><em>Well it did *something*</em></p>
<p>Drakma certainly made an http connection and got *something* but this isn&#8217;t the JSON we were looking for. What&#8217;s the deal?</p>
<p>After some search It looks like this is drakma&#8217;s expected response when <a href="http://www.mail-archive.com/drakma-devel@common-lisp.net/msg00206.html">dealing with a content type it isn&#8217;t aware of</a>. So well fix this up by telling it JSON is &#8220;just text&#8221; and try this again.</p>

<div class="wp-terminal">user@computer:$ ; SLIME 2010-07-21<br/>CL-USER&gt; (ql:quickload "drakma")<br/>To load "drakma":<br/>Load 1 ASDF system:<br/>drakma<br/>; Loading "drakma"<br/>............<br/>("drakma")<br/>CL-USER&gt; (setq drakma:*text-content-types* (cons '("application" . "json")<br/>drakma:*text-content-types*))<br/><br/>(("application" . "json") ("text"))<br/>CL-USER&gt; (drakma:http-request "http://www.reddit.com/user/cliffwarden/about.json")<br/>"{\"kind\": \"t2\", \"data\": {\"has_mail\": null, \"name\": \"cliffwarden\", \"created\": 1151777163.0, \"created_utc\": 1151777163.0, \"link_karma\": 294, \"comment_karma\": 330, \"is_gold\": false, \"is_mod\": false, \"id\": \"9440\", \"has_mod_mail\": null}}"<br/>200<br/>((:CONTENT-TYPE . "application/json; charset=UTF-8")<br/>(:ACCESS-CONTROL . "allow ")<br/>(:SET-COOKIE<br/>. "reddit_first=%7B%22firsttime%22%3A%20%22first%22%7D; Domain=reddit.com; expires=Thu, 31 Dec 2037 23:59:59 GMT; Path=/")<br/>(:SERVER . "'; DROP TABLE servertypes; --")<br/>(:DATE . "Sun, 10 Jul 2011 17:18:42 GMT") (:CONTENT-LENGTH . "231")<br/>(:EXPIRES . "Sun, 10 Jul 2011 19:18:42 GMT") (:CONNECTION . "close"))<br/>#<br/>#<br/>T<br/>"OK"<br/>CL-USER&gt;<br/></div>

<p><em>Nearly there</em></p>
<p>We are nearly there, but there is still some unnecessary output that we don&#8217;t really need. Another quick check of the <a href="http://weitz.de/drakma/#*header-stream*">drakma docs</a> reveals that we just need to turn off this setting to turn off header debugging.</p>
<p>Let&#8217;s see what our code looks like so far:<br />
<script type="text/javascript" src="https://gist.github.com/1074729.js">// <![CDATA[</p>
<p>// ]]&gt;</script><br />
<em>Gist at: <a href="https://gist.github.com/1074729">https://gist.github.com/1074729</a></em></p>
<h2>cl-json</h2>
<p>Now we have the JSON response from reddit in a nice little string, what are we going to do with it?</p>
<p>Looking through quicklisp again I found a very promising library with a pretty predictable name &#8220;cl-json&#8221;. This library will take our string representation of json data and decode it into Lisp objects.</p>
<p>This library is so simple to use (as far as decoding goes) you could almost guess the syntax. I fiddled around in Slime repl a bit and here is what I came up with:</p>

<div class="wp-terminal">user@computer:$ CL-USER&gt; (ql:quickload "cl-json")<br/>[install messages]<br/><br/>CL-USER&gt; (setq drakma:*header-stream* nil)<br/>(setq drakma:*text-content-types* (cons '("application" . "json")<br/>drakma:*text-content-types*))<br/><br/>(("application" . "json") ("text"))<br/><br/>CL-USER&gt; (setq out (drakma:http-request "http://www.reddit.com/user/cliffwarden/about.json"))<br/><br/>CL-USER&gt; (json:decode-json-from-string out)<br/>((:KIND . "t2")<br/>(:DATA (:HAS--MAIL) (:NAME . "cliffwarden") (:CREATED . 1.1517772e9)<br/>(:CREATED--UTC . 1.1517772e9) (:LINK--KARMA . 294) (:COMMENT--KARMA . 330)<br/>(:IS--GOLD) (:IS--MOD) (:ID . "9440") (:HAS--MOD--MAIL)))<br/></div>

<p>From here it&#8217;s pretty much downhill. We are going to pass this object off to a few functions to extract the data we are interested in and wrap it all up into a nice format statement to print it out.</p>
<p>Finished code below:<br />
<script type="text/javascript" src="https://gist.github.com/1073810.js">// <![CDATA[</p>
<p>// ]]&gt;</script><br />
<em>Gist at: <a href="https://gist.github.com/1073810">https://gist.github.com/1073810</a></em></p>
<p>Hopefully you&#8217;ve seen through the course of this article it&#8217;s pretty easy with the Lisp environment (Emacs, Slime and Quicklisp) to go from small &#8220;sketches&#8221; and playing around in the repl prompt to incorporating these into a formal program. This is a very powerful platform for learning and exploration.</p>
<p><strong>Update:</strong> I&#8217;ve fixed the script up a bit.  The use of <a href="http://www.ida.liu.se/imported/cltl/clm/node153.html">assoc lists</a> and <a href="http://clhs.lisp.se/Body/m_push.htm">pushing</a> (rather than the ugly <em>setq) </em>was pointed out in the comments</p>
<p><script type="text/javascript" src="https://gist.github.com/1079632.js">// <![CDATA[</p>
<p>// ]]&gt;</script><br />
<em>Gist at: <a href="https://gist.github.com/1079632">https://gist.github.com/1079632</a></em></p>
<p>&nbsp;</p>
<p>No related posts.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=wvlQdMZqlEg:jAa5aSzGgds:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=wvlQdMZqlEg:jAa5aSzGgds:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=wvlQdMZqlEg:jAa5aSzGgds:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=wvlQdMZqlEg:jAa5aSzGgds:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?i=wvlQdMZqlEg:jAa5aSzGgds:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/TheHelpfulHacker?a=wvlQdMZqlEg:jAa5aSzGgds:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/TheHelpfulHacker?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TheHelpfulHacker/~4/wvlQdMZqlEg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thehelpfulhacker.net/2011/07/10/checking-your-reddit-karma-with-common-lisp/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://thehelpfulhacker.net/2011/07/10/checking-your-reddit-karma-with-common-lisp/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.487 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-05 12:28:54 -->

