<?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>Jamie&#039;s Blog</title>
	<atom:link href="http://www.angelforge.org/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.angelforge.org/wordpress</link>
	<description>My life is words.</description>
	<lastBuildDate>Mon, 07 May 2012 12:00:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>NPM, Vagrant Weirdness</title>
		<link>http://www.angelforge.org/wordpress/programming/troubleshooting/npm-vagrant-weirdness/</link>
		<comments>http://www.angelforge.org/wordpress/programming/troubleshooting/npm-vagrant-weirdness/#comments</comments>
		<pubDate>Mon, 07 May 2012 12:00:47 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[vagrant]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3207</guid>
		<description><![CDATA[I have been using Vagrant to configure a nodejs/redis development server. When I setup my application and ran a npm install on the guest machine based on a local package.json file, I&#8217;d get weird installation errors such as npm not &#8230; <a href="http://www.angelforge.org/wordpress/programming/troubleshooting/npm-vagrant-weirdness/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have been using <a href="http://vagrantup.com/">Vagrant</a> to configure a nodejs/redis development server. When I setup my application and ran a <code>npm install</code> on the guest machine based on a local <code>package.json</code> file, I&#8217;d get weird installation errors such as npm not being able to find node module <code>package.json</code> files. Another error I&#8217;d get intermittently is just a hanging install. A sample is included below.</p>
<p>Then, I figured I&#8217;d try the same command from the host machine. It worked flawlessly. Then, I remembered that there might be performance problems with Virtual Box&#8217;s shared folders. Indeed, <a href="http://vagrantup.com/docs/nfs.html">this article</a> describes the problem and suggests using nfs. </p>
<p>My share_folder command looks something like this in my <code>Vagrantfile</code>.</p>
<pre class="brush: ruby; title: ; notranslate">
Vagrant::Config.run do |config|
  config.vm.share_folder &quot;v-www&quot;, &quot;/www&quot;, &quot;/Users/jamiely/Documents/code/&quot;, :nfs =&gt; true
end
</pre>
<p>Initially, I had problems with this because the path I was sharing was a symbolic link. I didn&#8217;t realize this would be a problem and it took some manual experimentation with the NFS setup to determine what the issue was.</p>
<p>Here&#8217;s the sample npm output in case it&#8217;s helpful to anyone:</p>
<pre class="brush: plain; collapse: true; light: false; title: ; toolbar: true; notranslate">
Issue 1: npm install hangs

vagrant@oneric32:/www/bgc/bgc-api$ npm install
npm http GET https://registry.npmjs.org/express/2.5.8
npm http GET https://registry.npmjs.org/underscore/1.3.3
npm http GET https://registry.npmjs.org/jade
npm http GET https://registry.npmjs.org/hiredis/0.1.14
npm http GET https://registry.npmjs.org/socket.io/0.8.6
npm http GET https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/socket.io-client/0.8.6
HANGING

This is somewhat resolved by creating the directory from the host
machine (or before installing)

Issue 2: npm cannot access/find files:

npm http GET https://registry.npmjs.org/express/2.5.8
npm http GET https://registry.npmjs.org/underscore/1.3.3
npm http GET https://registry.npmjs.org/jade
npm http GET https://registry.npmjs.org/hiredis/0.1.14
npm http GET https://registry.npmjs.org/socket.io/0.8.6
npm http GET https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/socket.io-client/0.8.6
npm http GET https://registry.npmjs.org/coffee-script/1.3.1
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___underscore.npm
npm ERR! error installing underscore@1.3.3
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___express.npm
npm ERR! error installing express@2.5.8
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___socket.io.npm
npm ERR! error installing socket.io@0.8.6
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___coffee-script.npm
npm ERR! error installing coffee-script@1.3.1
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___socket.io-client.npm
npm ERR! error installing socket.io-client@0.8.6
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___hiredis.npm
npm ERR! error installing hiredis@0.1.14
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___jade.npm
npm ERR! error installing jade@0.25.0
npm ERR! Could not create
/www/bgc/bgc-api/node_modules/___redis.npm
npm ERR! error installing redis@0.7.2

npm ERR! Error: UNKNOWN, unknown error
'/www/bgc/bgc-api/node_modules'
npm ERR! You may report this log at:
npm ERR!     &lt;http://github.com/isaacs/npm/issues&gt;
npm ERR! or email it to:
npm ERR!     &lt;npm-@googlegroups.com&gt;
npm ERR!
npm ERR! System Linux 3.0.0-12-generic
npm ERR! command &quot;node&quot; &quot;/usr/local/bin/npm&quot; &quot;install&quot;
npm ERR! cwd /www/bgc/bgc-api
npm ERR! node -v v0.6.11
npm ERR! npm -v 1.1.2
npm ERR! path /www/bgc/bgc-api/node_modules
npm ERR! code UNKNOWN
npm ERR! message UNKNOWN, unknown error
'/www/bgc/bgc-api/node_modules'
npm ERR! errno {}
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /www/bgc/bgc-api/npm-debug.log
npm not ok
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/troubleshooting/npm-vagrant-weirdness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino motorized cart project</title>
		<link>http://www.angelforge.org/wordpress/programming/arduino-motorized-cart-project/</link>
		<comments>http://www.angelforge.org/wordpress/programming/arduino-motorized-cart-project/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 12:00:34 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[embedded systems]]></category>
		<category><![CDATA[ethernet shield]]></category>
		<category><![CDATA[serial]]></category>
		<category><![CDATA[telnet]]></category>
		<category><![CDATA[xbee]]></category>
		<category><![CDATA[zigbee]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3163</guid>
		<description><![CDATA[For our embedded systems class, our team decided to work on a project using a mobile phone interface to drive an Arduino-based motorized cart. My first night with the Arduino and cart was very productive. I started experimenting with just &#8230; <a href="http://www.angelforge.org/wordpress/programming/arduino-motorized-cart-project/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For our embedded systems class, our team decided to work on a project using a mobile phone interface to drive an Arduino-based motorized cart.</p>
<p>My first night with the Arduino and cart was very productive. I started experimenting with just the Arduino connected via USB to my MacBook Air. I made the light blink and had it spit back some output over the serial connection.</p>
<p>Next, I wanted to try to get the wheels spinning on the motorized cart. Our TA sent me a lab from a different class discussing the motorized carts. It gave a sample of some Arduino code to drive the cart, and where to connect the pins. Although I was confused at first about how to connect the cart to the Arduino, it soon became obvious. I hooked things up and ran the code and soon had one of the wheels rotating back and forth.</p>
<p>Although we wanted to setup communication with the Arduino through an XBee device, our TA feared it would be too complicated. He gave me an ethernet shield for the Arduino and said to try to get that working first. So, I stuck the ethernet shield over the Arduino and loaded a sample program that would print the device&#8217;s DHCP-assigned IP over the serial connection. That only took a few tries to get working.</p>
<p>One of the examples included showed how to setup a telnet server. I figured this would be the easiest way to send commands to the device over ethernet, so I experimented a bit with it. It seemed to work just fine. Next, I merged some of the servo-driving code into the telnet server. I made it so you could type certain characters, and they would each control a wheel, and movement forward and backward. It was very straightforward to setup, and I think we&#8217;re ready to move onto the XBees.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/arduino-motorized-cart-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commands of the week</title>
		<link>http://www.angelforge.org/wordpress/programming/administration/commands-of-the-week/</link>
		<comments>http://www.angelforge.org/wordpress/programming/administration/commands-of-the-week/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 12:00:12 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[color]]></category>
		<category><![CDATA[gprof]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[pipe]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[stderr]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3128</guid>
		<description><![CDATA[A weekly listing of commands that are new to me or that I&#8217;ve had to refresh myself with. Piping and Grep C Programming SVN Issues on OSX I got an error when trying to operate on an SVN repo over &#8230; <a href="http://www.angelforge.org/wordpress/programming/administration/commands-of-the-week/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A weekly listing of commands that are new to me or that I&#8217;ve had to refresh myself with.</p>
<h2>Piping and Grep</h2>
<pre class="brush: bash; title: ; notranslate">
# Pipe stderr
command 2&gt;&amp;1 &gt;/dev/null | command

# Grep stderr
command 2&gt;&amp;1 &gt;/dev/null | grep 'pattern'

# Colorize output
command | grep --color 'pattern'

# Grep and colorize stderr
command 2&gt;&amp;1 &gt;/dev/null | grep --color 'pattern'
</pre>
<h2>C Programming</h2>
<pre class="brush: bash; title: ; notranslate">
# Define a macro at compile time with definition = 1
cc -Dmacro_name program.c

# gprof, profiles the time spent in each function of your c program
cc -g -pg -o program program.c #generates gmon.out
gprof program gmon.out &gt; gprof.out

# Includes a table like:
# Each sample counts as 0.01 seconds.
#   %   cumulative   self              self     total
#  time   seconds   seconds    calls  ns/call  ns/call  name
#  78.15     44.28    44.28 200000000   221.40   221.40  get
#   9.64     49.74     5.46 400000000    13.65    13.65  generate_point
#   7.74     54.12     4.38 200000000    21.93    21.93  hash_key
#   2.52     55.55     1.43 200000000     7.15   251.50  calculate_distance
#   1.59     56.45     0.90                             main
#   0.20     56.57     0.12 14514500     7.92     7.92  radians
#   0.16     56.66     0.09  2902900    31.00    31.00  put
#   0.00     56.66     0.00        1     0.00     0.00  hashtable_init
#   0.00     56.66     0.00        1     0.00     0.00  hashtable_init_list
</pre>
<h2>SVN Issues on OSX</h2>
<p>I got an error when trying to operate on an SVN repo over samba:</p>
<blockquote><p>svn: Can&#8217;t move &#8216;.svn/tmp/entries&#8217; to &#8216;.svn/entries&#8217;: Operation not permitted</p></blockquote>
<pre class="brush: bash; title: ; notranslate">
sudo chflags -R nouchg . # unset the OSX immutable flag
</pre>
<h2>Creating empty directories</h2>
<p>I needed to create a bunch of placeholder directories in a repo for logging.</p>
<pre class="brush: bash; title: ; notranslate">
# Lists the numbers 1 to 31, zero padded to length 2
seq -f &quot;%02g&quot; 1 31

# Creates directories logs01 to logs31
for i in $(seq -f &quot;%02g&quot; 1 31); do mkdir logs$i; done;

# Create an empty directory in a git repo, add the following gitignore to the directory
cat &gt; .gitignore
# Ignore everything in this directory
*
# Except this file
!.gitignore
# END WITH CTRL+d

# Copy the .gitignore into each directory
for i in $(seq -f &quot;%02g&quot; 1 31); do cp .gitignore logs$i; done;

# Remove the original .gitignore
rm .gitignore
</pre>
<h2>References</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout">http://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout</a></li>
<li><a href="http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html" target="_blank">http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html</a></li>
<li><a href="http://www.zsh.org/mla/users/2005/msg00215.html" target="_blank">http://www.zsh.org/mla/users/2005/msg00215.html</a></li>
<li><a href="http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC2" target="_blank">http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC2</a></li>
<li><a href="http://gaggle.systemsbiology.net/wiki/doku.php?id=svn">http://gaggle.systemsbiology.net/wiki/doku.php?id=svn</a></li>
<li><a href="http://stackoverflow.com/questions/115983/how-do-i-add-an-empty-directory-to-a-git-repository">http://stackoverflow.com/questions/115983/how-do-i-add-an-empty-directory-to-a-git-repository</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/administration/commands-of-the-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code for America: Philly 2012</title>
		<link>http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/</link>
		<comments>http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 12:00:08 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[code for america]]></category>
		<category><![CDATA[hackathon]]></category>
		<category><![CDATA[haml]]></category>
		<category><![CDATA[koala]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[twitter bootstrap]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3143</guid>
		<description><![CDATA[This past weekend I attended the Code for America event held at Azavea&#8217;s offices around 12th and Callowhill. Their office was spacious and well accommodated, but the wireless was slow during the day. I met a coworker, Hector, there and had &#8230; <a href="http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This past weekend I attended the <a href="http://codeforamerica.org/">Code for America</a> event held at Azavea&#8217;s offices around 12th and Callowhill. Their office was spacious and well accommodated, but the wireless was slow during the day.</p>
<p>I met a coworker, <a href="http://twitter.com/hectcastro">Hector</a>, there and had some coffee and breakfast. We didn&#8217;t really get started until at least quarter of ten, a bit late. Organizers passed out Post-It notes for us to write down ideas. Various people involved in city government and other civic organizations took turns presenting their ideas of projects to work on. I took notes as best I could and when they were done, we discussed which seemed most interesting to work on. People were encouraged to stick the ideas written down onto a whiteboard at the front of the room. Half of the participants helped to group the ideas by topic.</p>
<p>Hector and I talked again about what to work on. Organizers meanwhile passed out colored dot stickers to use in voting for ideas. Once the herd thinned out, we voted as well. Once the voting was complete, 8 main topics/ideas were selected and participants self-selected into those different groups. We considered working on a project to make lobbyist information accessible, but decided to work on a project to publicize statistics about the plight of the more downtrodden areas of the city.</p>
<p>Originally, the concept was to take statistics about the city such as crime and poverty rates, and relate them to a person through their neighborhood. Someone would enter either their zipcode or various other statistics about themselves (perhaps highschool class size), and the site would use that information to give them a statistic like:</p>
<blockquote><p>If you lived in Philadelphia, only 58 of the 100 students in your class would&#8217;ve graduated.</p></blockquote>
<p>or</p>
<blockquote><p>If you lived in Philadelphia, 3 of your 200 neighbors would&#8217;ve been the victim of violent crime.</p></blockquote>
<p>We discussed this concept with other people, and someone suggested this type of site might make someone glad they didn&#8217;t live in Philadelphia rather than promote civic engagement. This helped to lead to the concept that we eventually ran with. We decided that we should use people&#8217;s friends to illustrate the statistics.</p>
<p>So, we went to work implementing Facebook authentication, querying the Graph API, designing the site views, and writing code. I mostly paired with Hector and focused with him on the Graph API. We needed to retrieve friend names and profile pictures. We worked on various other pieces such as sampling friends for the statistics, wiring up the views, and pushing to Heroku.</p>
<p>We had some last minute difficulties shortly before our demo, including:</p>
<ul>
<li>Heroku having limited functionality for the free-app tier</li>
<li>Problems connecting the site on Heroku with the Facebook app</li>
<li>Wireless network issues</li>
</ul>
<div>I am proud of the project we completed, especially since I think we all had fun working on it. There are some things that could be improved, but it was a great experience overall. It&#8217;s up now if you&#8217;d like to check it out at <a href="http://theotherphiladelphia.org">http://theotherphiladelphia.org</a>. We wound up winning 3rd place. Here&#8217;s the repo location: <a href="https://github.com/CfABrigadePhiladelphia/the-other-philadelphia">https://github.com/CfABrigadePhiladelphia/the-other-philadelphia</a>.</div>
<p>In case you&#8217;re wondering, the project that won first price was <a href="http://lobbying.ph/">http://lobbying.ph/</a>, the site that provides information about Philadelphia&#8217;s registered lobbyists. <a href="http://technicallyphilly.com/2012/02/27/mayor-michael-nutter-visits-code-across-america-civic-hackathon-lobbying-ph-wins-first-place">Technically Philly has a writeup about the event.</a> <a href="http://www.viddler.com/v/74b5340a">You can find our presentation on Viddler.</a></p>

<a href='http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/attachment/screen-shot-2012-02-28-at-9-59-31-pm-2/' title='The Other Philadelphia: Main Page'><img width="150" height="150" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/02/Screen-Shot-2012-02-28-at-9.59.31-PM-150x150.png" class="attachment-thumbnail" alt="The Other Philadelphia: Main Page" title="The Other Philadelphia: Main Page" /></a>
<a href='http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/attachment/screen-shot-2012-02-28-at-9-56-11-pm/' title='The Other Philadelphia: Login Page'><img width="150" height="150" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/02/Screen-Shot-2012-02-28-at-9.56.11-PM-150x150.png" class="attachment-thumbnail" alt="The Other Philadelphia: Login Page" title="The Other Philadelphia: Login Page" /></a>
<a href='http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/attachment/imag0017/' title='The Other Philadelphia Team with Michael Nutter'><img width="150" height="150" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/02/IMAG0017-150x150.jpg" class="attachment-thumbnail" alt="The Other Philadelphia Team with Michael Nutter" title="The Other Philadelphia Team with Michael Nutter" /></a>

]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/code-for-america-philly-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Contest Fail</title>
		<link>http://www.angelforge.org/wordpress/programming/contest-fail/</link>
		<comments>http://www.angelforge.org/wordpress/programming/contest-fail/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 12:00:52 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[haskell]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3104</guid>
		<description><![CDATA[Last weekend I had a few hours to spare, so I decided to work on one of the problems from CodeSprint2, InterviewStreet&#8217;s contest to find the best programming talent. Since I didn&#8217;t have long to work, I decided to try &#8230; <a href="http://www.angelforge.org/wordpress/programming/contest-fail/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last weekend I had a few hours to spare, so I decided to work on one of the problems from <a href="http://codesprint.interviewstreet.com/">CodeSprint2</a>, <a href="http://www.interviewstreet.com/">InterviewStreet&#8217;s</a> contest to find the best programming talent.</p>
<p>Since I didn&#8217;t have long to work, I decided to try to complete the algorithm problem with the highest value. I chose to work on <a href="http://codesprint.interviewstreet.com/recruit/challenges/solve/view/4eff8a6c7ac39/4effe61080466">Count Strings (closed now)</a>. Given a regular expression, and a string length N, count the number of distinct strings of length N which the regular expression can match.</p>
<p>I looked at the sample test case, spent some time thinking about the problem and decided to try it. Although bounds for test cases were provided, I gave them only a cursory glance. This would turn out to be a mistake.</p>
<p>In my daily work, I typically focus on getting things working rather than spending time on determining the optimal way to do things. It is with this mindset that I decided that I would actually enumerate every string that a regular expression could produce, and then count them. I failed even before I began.</p>
<p>The regular expression language was limited to the alphabet {a, b}, with operators star, union, and concatenation. </p>
<p>I decided to use Haskell, which has the terseness of Ruby or Python, but the performance and type checking of a compiled language. I created a data type to represent the regular expressions. Recursive data types made this representation very straightforward. </p>
<pre class="brush: haskell; title: ; notranslate">
data RegularExpression = Symbol Char
  | Concat RegularExpression RegularExpression
  | Union RegularExpression RegularExpression
  | Star RegularExpression
  deriving (Show, Eq)
</pre>
<p>I had the enumeration part complete fairly quickly. Pattern matching makes everything really intuitive and readable. The star operation required the most code.</p>
<pre class="brush: haskell; title: ; notranslate">
listPossibilities (Symbol c) limit
  | limit &gt; 0 = [c]
  | otherwise = []

listPossibilities (Concat r1 r2) limit = combos where
  o1 = listPossibilities r1 limit
  o2 = listPossibilities r2 limit
  combos = [ a ++ b | a &lt;- o1, b &lt;- o2, length (a++b) &lt;= limit ]

listPossibilities (Union r1 r2) limit = possibilities where
  o1 = listPossibilities r1 limit
  o2 = listPossibilities r2 limit
  possibilities = o1 ++ o2

listPossibilities (Star _) 0 = [&quot;&quot;]
listPossibilities (Star r1) limit = possibilities where
  opt = listPossibilities r1 limit
  possibilities = &quot;&quot;: whileLimit opt limit optSet
  optSet = Set.fromList opt 

  -- | Uses nub right now, really inefficient. probably should use some sort of memoization
  whileLimit :: [String] -&gt; Int -&gt; [String] -&gt; [String]
  whileLimit base lim acc = pos where
    new = List.nub [a++b | a &lt;- base, b &lt;- acc, length (a++b) &lt;= lim]
    pos = if null new || length new &lt; length acc then acc
          else whileLimit base lim (List.nub $ acc ++ new)
</pre>
<p>The next component I needed was a parser to convert input into these regular expression objects. I used the Parsec parser module to construct the parser. This part actually took a bit longer, as I tried to refine the parser to accept deeply nested expressions.</p>
<p>The regular expression union parser below parses a parenthesized expression or symbol, followed by a pipe, and another parenthesized expression or symbol, returning a RegularExpression object.</p>
<pre class="brush: haskell; title: ; notranslate">
reUnion :: GenParser Char st RegularExpression
reUnion = do
  re1 &lt;- pexpr &lt;|&gt; reSymbol
  char '|'
  re2 &lt;- pexpr &lt;|&gt; reSymbol
  return (Union re1 re2)
</pre>
<p>Once I got the parser working, I glued it together with the enumeration portion, and submitted it to the contest. It immediately failed to compiled due to a dependency on Test.HUnit I had in my code. I reorganized the code so that I could easily remove this dependency, and resubmitted.</p>
<p>This time, it took, but when I went back after a few minutes to check the submission status, it had failed all but 1 of the test cases. It had taken too much time! I went back to the submission guidelines and noted that there was a time limit of 5 minutes.</p>
<p>Originally, I had used an algorithm which enumerated by checking distinctness using a List type. I knew at the time that this was very inefficient, but I focused on finishing the implementation at the time. I went back to this part and used a Set instead. I was optimistic that this would fix my problems and I would be able to knockout at least another test case.</p>
<p>I resubmitted and I failed 10 tests again. Then, I reread the problem, and looks at the boundaries for N. N could be up to 100,000 (IIRC)! Of course enumeration (especially the way I was doing it which would enumerate many strings of less than length N) would fail&#8211;I had taken a totally incorrect approach to this problem. I did not need to enumerate&#8211;I only needed to give a number of potential strings. This could&#8217;ve been done without enumeration. For example, given the expression a*, and a number N, there is only 1 possibility. Given <img src='http://s.wordpress.com/latex.php?latex=%28a%7Cb%29%5E%2A%2C%202%5EN&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(a|b)^*, 2^N' title='(a|b)^*, 2^N' class='latex' />. For example, one of the test cases was <img src='http://s.wordpress.com/latex.php?latex=%28a%7Cb%29%5E%2A%2C%20N%3D5&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(a|b)^*, N=5' title='(a|b)^*, N=5' class='latex' />, which has 32 possibilities. Another of the expressions was <img src='http://s.wordpress.com/latex.php?latex=a%5E%2Aba%5E%2A&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^*ba^*' title='a^*ba^*' class='latex' />. Since b can only appear once, the possible strings include strings of  <img src='http://s.wordpress.com/latex.php?latex=%28N-1%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(N-1)' title='(N-1)' class='latex' /> a&#8217;s and a single b. There are N such combinations (the number of positions b can be in, in an N length string): baa&#8230;, aba&#8230;, aab&#8230;, &#8230; . This is the approach I should&#8217;ve taken.</p>
<p>I left the solution there, and acknowledged my defeat. Source here: <a href="https://github.com/jamiely/count-strings">https://github.com/jamiely/count-strings</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/contest-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cocos2d iOS Game: Balloon Burst</title>
		<link>http://www.angelforge.org/wordpress/programming/libraries/cocos2d-ios-game-balloon-burst/</link>
		<comments>http://www.angelforge.org/wordpress/programming/libraries/cocos2d-ios-game-balloon-burst/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 12:00:48 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[cocos2d]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3085</guid>
		<description><![CDATA[My employer gives us a week off for the holidays, so I&#8217;d been trying to decide what to do with all of the time. Although I originally didn&#8217;t want to work on any programming projects, I wound up working on &#8230; <a href="http://www.angelforge.org/wordpress/programming/libraries/cocos2d-ios-game-balloon-burst/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My employer gives us a week off for the holidays, so I&#8217;d been trying to decide what to do with all of the time. Although I originally didn&#8217;t want to work on any programming projects, I wound up working on a few. One of them was inspired by a play of the iOS game Train Yard. I was paying particular attention to the loading screen when I noticed it had been created using Cocos2d. I&#8217;d seen articles about the engine before, so I decided to take another look at the Website. I was curious about what other game engines were in popular use. Besides <a href="http://unity3d.com/">Unity</a>, I didn&#8217;t notice any that were more popular than <a href="http://www.cocos2d-iphone.org">Cocos2d</a>. I decided to investigate further and found a <a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_1._install_test">tutorial</a> on the site.</p>
<p><a href="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/Icon-72.png"><img class="aligncenter size-full wp-image-3095" title="cocos2d logo" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/Icon-72.png" alt="" width="72" height="72" /></a></p>
<p>Before I knew it, I was working through the tutorial. The API was simple, straight-forward, and intuitive, and I was soon done. Still, I wanted to use it for my own project. Unfortunately, the holidays were winding down, and Spring term classes will start soon, so time is very limited.</p>
<p>As a prepubescent child, I played a shareware game where balloons would rise on the screen. You&#8217;d use your mouse to draw a bowstring, flying an arrow horizontally through the balloon field, timing the ascent of a balloon. It&#8217;s this game that immediately came to mind when I tried to think of simple games. The satisfaction of that balloon popping noise made me long to play. (A satisfaction only outpaced by the sound of popping bubble-wrap.)</p>
<p>So, I decided to work on a game like that other game, and started on making balloons float up. I went to <a href="http://openclipart.org">http://openclipart.org</a> and found a great balloon-popping sound at <a href="http://soundbible.com">http://soundbible.com</a>. I started out by using CCActions, a CCSequence composed of CCMoveUp and CCCallFuncND to perform cleanup. The balloons would randomly spawn at a certain interval below the screen, and rise to a height above the screen, out of the viewport, and be removed from the layer.</p>
<p><a href="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-old-treasures-02.png"><img class="aligncenter size-medium wp-image-3087" title="balloon-burst-old-treasures-02" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-old-treasures-02-300x153.png" alt="" width="300" height="153" /></a></p>
<p>Somewhere along the line, I decided that an bow and arrow would be unnecessary, and that touching a balloon would be enough to pop it. At the same time, I&#8217;d target the game at children. I implemented procedures to detect a balloon touch, show a particle effect upon touch, play the popping noise, and remove the balloon from the layer immediately.</p>
<p>Play-testing confirmed this mechanic was a little boring in of itself. I figured that popping balloons should release things stored inside, so you should be able to earn points for popping balloons and touching a &#8220;treasure item&#8221; dropped from the balloon, things like: diamonds, coins, and treasure boxes. I also added clouds in the background, a timer, and score display, the concept of rounds, and a game over state.</p>
<p><a href="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-old-treasures-01.png"><img class="aligncenter size-medium wp-image-3086" title="balloon-burst-old-treasures-01" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-old-treasures-01-300x153.png" alt="" width="300" height="153" /></a></p>
<p>I got this working, but it didn&#8217;t seem especially targeted towards children. Lisa, my wife, tried it and confirmed as much. We talked about marking each balloon with a letter, and using the balloons to spell words or elsewise learn about words.</p>
<p>After thinking for a bit, I decided that balloons marked with a letter would release a word starting with that letter. When you touched the word dropped by a balloon, that word would be spoken aloud. I downloaded <a href="http://audacity.sourceforge.net/">Audacity</a>, and had Lisa recite a list of words. I spliced them and loaded them into my project Resources folder. Once I got the code working, so that the word sound would play when the word was touched, the audio seemed to low, like it had not been normalized. Even after reducing the volume of the background music and popping sound, the words weren&#8217;t loud enough. We&#8217;ll have to redo the word sounds at some point.</p>
<p><a href="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-ipad-play-01.png"><img class="aligncenter size-medium wp-image-3089" title="balloon-burst-ipad-play-01" src="http://www.angelforge.org/wordpress/wp-content/uploads/2012/01/balloon-burst-ipad-play-01-300x233.png" alt="" width="300" height="233" /></a></p>
<p>At this point, I&#8217;m mostly done, but may add some more graphics and clean up the code. This project has been a great introduction to Cocos2D and Objective-C programming, in general.</p>
<p>Check out game footage below and the complete source code, including assets, on Github: <a href="http://github.com/jamiely/ios-balloon-burst">http://github.com/jamiely/ios-balloon-burst</a></p>
<p><iframe width="567" height="425" src="http://www.youtube.com/embed/W6FI7X5PjN8?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/libraries/cocos2d-ios-game-balloon-burst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell Poetry Parser</title>
		<link>http://www.angelforge.org/wordpress/programming/haskell-poetry-parser/</link>
		<comments>http://www.angelforge.org/wordpress/programming/haskell-poetry-parser/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 12:00:08 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[mse]]></category>
		<category><![CDATA[parser]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3072</guid>
		<description><![CDATA[For our final project for CIS552: Advanced Programming, my partner and I implemented a poetry parser. The program identifies a body of text piped from STDIN as one of: haiku, rhyming poem (aba, or aabba), sonnet, or limerick. The project &#8230; <a href="http://www.angelforge.org/wordpress/programming/haskell-poetry-parser/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For our final project for CIS552: Advanced Programming, my partner and I implemented a poetry parser. The program identifies a body of text piped from STDIN as one of: haiku, rhyming poem (aba, or aabba), sonnet, or limerick.</p>
<p>The project source is located at: <a href="https://github.com/jamiely/poetry-parser">https://github.com/jamiely/poetry-parser</a>.</p>
<p>The project involved using the CMU Pronouncing Dictionary found <a href="http://www.speech.cs.cmu.edu/cgi-bin/cmudict">here</a>, creating parsers for the dictionary, and base parsers that could be combined for various forms.</p>
<p>For example, we implemented a parser for syllables that allows us to create a haiku parser.</p>
<pre class="brush: haskell; title: ; notranslate">
-- | Parses a Haiku
haiku :: PoemParser RhymeMap
haiku = do
  ns 5
  ns 7
  ns 5
  return Map.empty where
  ns = nSyllables
</pre>
<p>and a rhyming scheme parser that allowed us to recognize limericks:</p>
<pre class="brush: haskell; title: ; notranslate">
aabba :: PoemParser RhymeMap
aabba = rhymeScheme &quot;aabba&quot; Map.empty 

-- | The stress pattern of a limerick
-- note: syllable requirement is implicit
limerickStress :: PoemParser RhymeMap
limerickStress = do
  stressLine [D,U, D,D,U, D,D,U]
  stressLine [D,U, D,D,U, D,D,U]
  stressLine [D,U, D,D,U]
  stressLine [D,U, D,D,U]
  stressLine [D,U, D,D,U, D,D,U] 

limerick :: PoemParser RhymeMap
limerick = limerickStress &lt;&amp;&gt; aabba
</pre>
<p>For example, we can determine the type of the following poem:</p>
<blockquote><p>
An old silent pond&#8230;<br />
A frog jumps into the pond,<br />
splash! Silence again.<br />
- Basho
</p></blockquote>
<p>by running the program thusly:</p>
<pre class="brush: bash; title: ; notranslate">
&gt; ./Main &lt; extra/basho.haiku
</pre>
<p>with the result:</p>
<pre class="brush: plain; title: ; notranslate">
Opened file
Poem:
An old silent pond...
A frog jumps into the pond,
splash! Silence again.

Dictionary: 

A  AH0
AGAIN  AH0 G EH1 N
AN  AE1 N
FROG  F R AA1 G
INTO  IH0 N T UW1
JUMPS  JH AH1 M P S
OLD  OW1 L D
POND  P AA1 N D
POND'S  P AA1 N D Z
SILENCE  S AY1 L AH0 N S
SILENT  S AY1 L AH0 N T
SPLASH  S P L AE1 SH
THE  DH AH0

Type: Haiku
</pre>
<p>And the following poem:</p>
<blockquote><p>
something something fox<br />
apple jacks<br />
word here pox
</p></blockquote>
<p>by running the program thusly:</p>
<pre class="brush: bash; title: ; notranslate">
&gt; ./Main &lt; extra/fox.rhyming
</pre>
<p>with the result: </p>
<pre class="brush: plain; title: ; notranslate">
Opened file
Poem:
something something fox
apple jacks
word here pox

Dictionary: 

APPLE  AE1 P AH0 L
FOX  F AA1 K S
HERE  HH IY1 R
JACKS  JH AE1 K S
POX  P AA1 K S
SOMETHING  S AH1 M TH IH0 NG
WORD  W ER1 D

Type: Rhyming poem: aba
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/haskell-poetry-parser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSX Lion Rubygame Install</title>
		<link>http://www.angelforge.org/wordpress/programming/libraries/osx-lion-rubygame-install/</link>
		<comments>http://www.angelforge.org/wordpress/programming/libraries/osx-lion-rubygame-install/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 12:00:04 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Libraries]]></category>
		<category><![CDATA[osx lion]]></category>
		<category><![CDATA[rsdl]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby-opengl]]></category>
		<category><![CDATA[rubygame]]></category>
		<category><![CDATA[sdl]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3052</guid>
		<description><![CDATA[I tried setting up Rubygame on Snow Leopard this time last year. I had many difficulties setting up SDL. I had some time to kill so I tried to set it up again, this time on my new MacBook Air &#8230; <a href="http://www.angelforge.org/wordpress/programming/libraries/osx-lion-rubygame-install/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I tried setting up <a href="http://rubygame.org/">Rubygame</a> on Snow Leopard this time last year. I had many difficulties setting up SDL. I had some time to kill so I tried to set it up again, this time on my new MacBook Air running Lion. </p>
<p>This old blog post from 2005 helped me this time around: <a href="http://inquirylabs.com/blog2005/?p=21">http://inquirylabs.com/blog2005/?p=21</a> to nail down the requirements. Instead of following the installation instructions here, I used <a href="http://mxcl.github.com/homebrew/">Homebrew</a> to set things up.</p>
<p>One of the key requirements is <a href="http://www.kmc.gr.jp/~ohai/rubysdl.en.html">rubysdl</a>, ruby bindings for the <a href="http://www.libsdl.org/">SDL multimedia library</a>, and the <a href="https://github.com/knu/rsdl">rsdl gem</a>. The following Gist is a rubysdl Homebrew formula that will help install the required packages: <a href="https://gist.github.com/1394440">https://gist.github.com/1394440</a>. The <a href="http://www.digitalfanatics.org/cal/sge/index.html">SGE</a> formula is not part of the included formulas. I forked the following Gist to provide SGE: <a href="https://gist.github.com/1394414/">https://gist.github.com/1394414/</a>.</p>
<pre class="brush: bash; title: ; notranslate">

# install the sge graphics lib
wget https://gist.github.com/raw/1394414/4a6bfa4a8bab179ebe263b1d044a4322c7628f60/sge.rb
brew install sge

# install rubysdl ruby sdl bindings
wget https://raw.github.com/gist/1394440/8a71160306ad277f08fbad3eaf028b2e8700f2f1/rubysdl.rb
brew install rubysdl

# install the required gem
gem install rsdl
gem install rubygame
</pre>
<p>Afterwards, most of the rubygame samples ran fine, but the ones requiring opengl had issues. I installed ruby 1.9.2 using <a href="https://github.com/sstephenson/rbenv">rbenv</a>, compiled a new dynamic library libruby.dylib, based on the 1.9.2 source. Then, I cloned this repo providing an upgraded <a href="http://ruby-opengl.rubyforge.org/">ruby-opengl gem</a>: <a href="https://github.com/theymaybecoders/ruby-opengl">https://github.com/theymaybecoders/ruby-opengl</a>. </p>
<pre class="brush: bash; title: ; notranslate">
# clone the repo
git clone https://github.com/theymaybecoders/ruby-opengl
cd ruby-opengl

# make sure that the libruby.1.9.1.dylib compiled from the
# ruby 1.9.2 source is present in the gcc class path. For
# me, it was ~/.rbenv/versions/1.9.2-p290/lib/libruby.dylib
# use build option --enable-shared

rake

# build the gem
rake gem

# install the gem
gem install pkg/ruby-opengl-0.60.1.gem
</pre>
<p>Afterwards, the rubygame opengl samples compiled fine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/libraries/osx-lion-rubygame-install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern Matching in Haskell</title>
		<link>http://www.angelforge.org/wordpress/programming/pattern-matching-in-haskell/</link>
		<comments>http://www.angelforge.org/wordpress/programming/pattern-matching-in-haskell/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 12:00:02 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[pattern matching]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3034</guid>
		<description><![CDATA[I&#8217;ve only been taking one class this semester. It&#8217;s an advanced programming course focusing on the functional language Haskell. While I was familiar with some functional concepts such as map, fold, and currying from using Javascript, and lazy-evaluation from dabbling &#8230; <a href="http://www.angelforge.org/wordpress/programming/pattern-matching-in-haskell/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve only been taking one class this semester. It&#8217;s an advanced programming course focusing on the functional language Haskell. While I was familiar with some functional concepts such as map, fold, and currying from using Javascript, and lazy-evaluation from dabbling with Clojure, this class has introduced a number of new, intriguing concepts.</p>
<p>Not necessarily a functional feature, pattern matching in Haskell is an incredible feature that has really come to make a lot of sense to me. Given a type constructor with two definitions:</p>
<pre class="brush: haskell; title: ; notranslate">

-- Given the type below
data Shape = Rectangle Float Float Float Float | Circle Float Float Float

area :: Shape -&gt; Float
-- We can pattern match below, to change the defn depending on the constructor
area (Rectangle x1 y1 x2 y2) = (y1 - y2) * (x1 - x2) :: Float
-- Use _ to discard matches
area (Circle _ _ radius) = pi * radius * radius
</pre>
<p>In Haskell, tuples are a basic data type. You can pattern match to unpack a tuple, like this:</p>
<pre class="brush: haskell; title: ; notranslate">
tmp = (1, (2, (3, 4)))

unpackTmp1 :: (Int, (Int, (Int, Int)))
unpackTmp1 (_, (_, rtn)) = rtn
unpackTmp1 tmp
-- rtn = (3,4)

unpackTmp2 :: (Int, (Int, (Int, Int)))
unpackTmp2 (_, (_, (_, rtn))) = rtn
unpackTmp2 tmp
-- rtn = 4
</pre>
<p>So, pattern is something really new to me that I haven&#8217;t seen in other languages before. It makes dealing with tuples easy, and you can also use it with lists:</p>
<pre class="brush: haskell; title: ; notranslate">
x = [1..10]
secondItem (_:i:_) = i
secondItem x
-- returns 2

thirdItem (_:_:i:_) = i
thirdItem x
-- return 3

tail' (_:rest) = rest
tail' x
-- returns [2..10]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/pattern-matching-in-haskell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sandwich Roulette</title>
		<link>http://www.angelforge.org/wordpress/programming/software/sandwich-roulette/</link>
		<comments>http://www.angelforge.org/wordpress/programming/software/sandwich-roulette/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 04:30:21 +0000</pubDate>
		<dc:creator>Jamie</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.angelforge.org/wordpress/?p=3123</guid>
		<description><![CDATA[Over the weekend I had the idea to create an app which creates a random sandwich for you to get at Wawa. The result is the Sandwich Roulette! Here&#8217;s the source on Github.]]></description>
			<content:encoded><![CDATA[<p>Over the weekend I had the idea to create an app which creates a random sandwich for you to get at Wawa. The result is the <a href="http://sandwich-roulette.heroku.com/">Sandwich Roulette</a>! Here&#8217;s the <a href="https://github.com/jamiely/sandwich-roulette">source on Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.angelforge.org/wordpress/programming/software/sandwich-roulette/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

