<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>BeerRiot Blog</title>
	<atom:link href="http://blog.beerriot.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.beerriot.com</link>
	<description>The making of BeerRiot and other thoughts.</description>
	<pubDate>Thu, 06 Mar 2008 03:02:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>en</language>
			<item>
		<title>Ping</title>
		<link>http://blog.beerriot.com/2008/03/05/ping/</link>
		<comments>http://blog.beerriot.com/2008/03/05/ping/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 03:02:16 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://beerriot.wordpress.com/?p=51</guid>
		<description><![CDATA[Woah - so much for February, eh?
In case people are wondering what&#8217;s up in BeerRiot land, here&#8217;s the skinny:
January and February were crazy months.  I switched day jobs when I switched the calendar, and that meant a lot of extra planning in January, and a lot of extra concentration in February.
Unfortunately, March probably won&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Woah - so much for February, eh?</p>
<p>In case people are wondering what&#8217;s up in BeerRiot land, here&#8217;s the skinny:</p>
<p>January and February were crazy months.  I switched day jobs when I switched the calendar, and that meant a lot of extra planning in January, and a lot of extra concentration in February.</p>
<p>Unfortunately, March probably won&#8217;t be much different around here.  My new day job has a big deadline on April 1, and we&#8217;re probably going to be at a dead run from now until then.</p>
<p>But, lucky for me, this doesn&#8217;t mean I have to give up Erlang - quite the opposite!  In fact, my day job now has me writing Erlang all day long.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  At some point in the future, I hope to be able to reveal where I&#8217;m working and what I&#8217;m working on, but that&#8217;s under wraps at the moment (it&#8217;s a new venture that doesn&#8217;t want the cat out of the bag just yet).</p>
<p>In the meantime, I do still log in to BeerRiot every night to keep things running.  So, if you&#8217;re still looking for good beer recommendations, keep checking in.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=51&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2008/03/05/ping/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Vimagi on Erlang2facebook</title>
		<link>http://blog.beerriot.com/2008/01/22/vimagi-on-erlang2facebook/</link>
		<comments>http://blog.beerriot.com/2008/01/22/vimagi-on-erlang2facebook/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 01:44:10 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Erlang]]></category>

		<category><![CDATA[ErlyWeb]]></category>

		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2008/01/22/vimagi-on-erlang2facebook/</guid>
		<description><![CDATA[Erlang2facebook continues to gain users.  The lastest is Yariv&#8217;s Vimagi Paint!  Ignore my scribblings, and give it a whirl.  There&#8217;s some really amazing work up there.  (And, nice job, Yariv!)
For anyone else playing with the library, you might want to sync with the repository.  Yariv&#8217;s prodding caught a couple of [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://code.google.com/p/erlang2facebook/">Erlang2facebook</a> continues to gain users.  The lastest is Yariv&#8217;s <a href="http://www.facebook.com/apps/application.php?id=6922737811">Vimagi Paint</a>!  Ignore my scribblings, and give it a whirl.  There&#8217;s some really amazing work up there.  (And, nice job, Yariv!)</p>
<p>For anyone else playing with the library, you might want to sync with the repository.  Yariv&#8217;s prodding caught a couple of bugs, whose fixes were committed a few days ago.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=50&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2008/01/22/vimagi-on-erlang2facebook/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8216;Brain&#8217;fun</title>
		<link>http://blog.beerriot.com/2008/01/02/brainfun/</link>
		<comments>http://blog.beerriot.com/2008/01/02/brainfun/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 02:01:43 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2008/01/02/brainfun/</guid>
		<description><![CDATA[Disclaimer:  The following is a diversion from BeerRiot.  To all Rioters waiting on new features, I apologize.  I can only claim temporary insanity due to cold.
I ran across two interesting Erlang posts recently.  The first was to the Trapexit help form, where someone was attempting to implement a Brainfuck interpreter in [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Disclaimer:  The following is a diversion from BeerRiot.  To all Rioters waiting on new features, I apologize.  I can only claim temporary insanity due to cold.</p>
<p>I ran across two interesting Erlang posts recently.  <a href="http://www.trapexit.org/forum/viewtopic.php?t=11688">The first</a> was to the Trapexit help form, where someone was attempting to implement a <a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> interpreter in Erlang, as a way of learning the language.  I didn&#8217;t understand the question being asked, so I decided to give it a go myself, to see if I ran into a similar question.</p>
<p>A little while later, this is the implementation I had:</p>
<pre>

-module(bf).
-export([run/1]).

run(Program) -&gt;
    run([], Program, [], 0, []).

run(Left, [$&gt;|Right], LP, Data, RP) -&gt;
    case RP of
	[D|Rest] -&gt; run([$&gt;|Left], Right, [Data|LP], D, Rest);
	[]       -&gt; run([$&gt;|Left], Right, [Data|LP], 0, [])
    end;
run(Left, [$&lt;|Right], LP, Data, RP) -&gt;
    case LP of
	[D|Rest] -&gt; run([$&lt;|Left], Right, Rest, D, [Data|RP]);
	[]       -&gt; run([$&lt;|Left], Right, [], 0, [Data|RP])
    end;
run(Left, [$+|Right], LP, Data, RP) -&gt;
    run([$+|Left], Right, LP, Data+1, RP);
run(Left, [$-|Right], LP, Data, RP) -&gt;
    run([$-|Left], Right, LP, Data-1, RP);
run(Left, [$.|Right], LP, Data, RP) -&gt;
    io:put_chars([Data]),
    run([$.|Left], Right, LP, Data, RP);
run(Left, [$,|Right], LP, _, RP) -&gt;
    Data = io:get_chars([], 1),
    run([$,|Left], Right, LP, Data, RP);
run(Left, [91|Right], LP, Data, RP) -&gt;
    if Data == 0 -&gt;
	    {NewLeft, NewRight} = pass_match(91, 93, [91|Left], Right),
	    run(NewLeft, NewRight, LP, Data, RP);
       true -&gt;
	    run([91|Left], Right, LP, Data, RP)
    end;
run(Left, [93|Right], LP, Data, RP) -&gt;
    if Data /= 0 -&gt;
	    {[91|NewRight], NewLeft} = pass_match(93, 91, [93|Right], Left),
	    run([91|NewLeft], NewRight, LP, Data, RP);
       true -&gt;
	    run([93|Left], Right, LP, Data, RP)
    end;
run(Left, [X|Right], LP, Data, RP) -&gt;
    run([X|Left], Right, LP, Data, RP);
run(_, [], _, Data, _) -&gt;
    Data.

pass_match(This, Match, Accum, Source) -&gt;
    pass_match(This, Match, Accum, Source, 0).
pass_match(_, Match, Accum, [Match|Source], 0) -&gt;
    {[Match|Accum], Source};
pass_match(This, Match, Accum, [Match|Source], Depth) -&gt;
    pass_match(This, Match, [Match|Accum], Source, Depth-1);
pass_match(This, Match, Accum, [This|Source], Depth) -&gt;
    pass_match(This, Match, [This|Accum], Source, Depth+1);
pass_match(This, Match, Accum, [X|Source], Depth) -&gt;
    pass_match(This, Match, [X|Accum], Source, Depth).
</pre>
<p>Basically, a list for what is to the left of the current execution point, and another for what is to the right, as well as a list each for what is to the left and right of the current data point.  Just tail-recurse through the right list (with a little extra jumping for the loop operators), pattern matching the opcode at the head of the right program list.  Run the program by calling bf:run(Program) where Program is just a list of characters (including Brainfuck symbols if you want any result other than 0).  For example, the following code will print out &#8220;Hello World&#8221; (found on the Wikipedia page).</p>
<pre>

bf:run("
++++++++++
[&gt;+++++++&gt;++++++++++&gt;+++&gt;+&lt;&lt;&lt;&lt;-] The initial loop to set up useful values in the array
&gt;++.                             Print 'H'
&gt;+.                              Print 'e'
+++++++.                         Print 'l'
.                                Print 'l'
+++.                             Print 'o'
&gt;++.                             Print ' '
&lt;&lt;+++++++++++++++.               Print 'W'
&gt;.                               Print 'o'
+++.                             Print 'r'
------.                          Print 'l'
--------.                        Print 'd'
&gt;+.                              Print '!'
&gt;.                               Print newline").
</pre>
<p><a href="http://12monkeys.co.uk/wp/?p=13">The second post</a> I happened across was someone noticing the alternative way to make Erlang atoms (by enclosing characters in single quotes).  <a href="http://programming.reddit.com/info/644ef/comments/c02rvfo">Commenters were unhappy</a> that they had never found a good use for functions named using these atoms.</p>
<p>Well, guess where that thought took me:</p>
<pre>

-module(bf2).
-export([run/1]).

-export(['&gt;'/2, '&lt;'/2, '+'/2, '-'/2, '.'/2, ','/2, '['/2, ']'/2, stop/2]).

-record(tape, {left=[], current=0, right=[]}).

function_list() -&gt;
    lists:foldl(fun({Atom, _}, Funs) -&gt;
			case atom_to_list(Atom) of
			    [Char] -&gt; [{Char, Atom}|Funs];
			    _ -&gt; Funs
			end
		end, [], proplists:get_value(exports, bf2:module_info())).

run(Program) -&gt;
    Funs = function_list(),
    Atoms = lists:foldl(fun(C, T) -&gt;
				case proplists:get_value(C, Funs) of
				    undefined -&gt; T;
				    A -&gt; [A | T]
				end
			end, [], Program),
    [Current|Rest] = lists:reverse([stop|Atoms]),
    bf2:Current(#tape{current=Current, right=Rest}, #tape{}).

advance(Program, Data) -&gt;
    [Next|Rest] = Program#tape.right,
    bf2:Next(#tape{left = [Program#tape.current | Program#tape.left],
		      current = Next,
		      right = Rest},
	     Data).

stop(_, #tape{current=Value}) -&gt;
    Value.

'&gt;'(Program, Data) -&gt;
    case Data#tape.right of
	[X|R] -&gt; NewPoint = X, NewRight = R;
	_ -&gt; NewPoint = 0, NewRight = []
    end,
    advance(Program, #tape{left = [Data#tape.current | Data#tape.left],
			   current = NewPoint, right = NewRight}).

'&lt;'(Program, Data) -&gt;
    case Data#tape.left of
	[X|L] -&gt; NewPoint = X, NewLeft = L;
	_ -&gt; NewPoint = 0, NewLeft = []
    end,
    advance(Program, #tape{right = [Data#tape.current | Data#tape.right],
			   current = NewPoint, left = NewLeft}).

'+'(Program, Data) -&gt;
    advance(Program, Data#tape{current = Data#tape.current + 1}).

'-'(Program, Data) -&gt;
    advance(Program, Data#tape{current = Data#tape.current - 1}).

'.'(Program, Data) -&gt;
    io:put_chars([Data#tape.current]),
    advance(Program, Data).

','(Program, Data) -&gt;
    In = io:get_chars([], 1),
    advance(Program, Data#tape{current = In}).

'['(Program, Data) -&gt;
    if Data#tape.current /= 0 -&gt;
	    advance(Program, Data);
       true -&gt;
	    {Left, Right} = skip('[', ']',
				 Program#tape.left,
				 Program#tape.right),
	    advance(#tape{left=Left, current=']', right=Right}, Data)
    end.

']'(Program, Data) -&gt;
    if Data#tape.current == 0 -&gt;
	    advance(Program, Data);
       true -&gt;
	    {Right, Left} = skip(']', '[',
				 Program#tape.right,
				 Program#tape.left),
	    advance(#tape{left=Left, current='[', right=Right}, Data)
    end.

skip(Up, Down, Acc, Src) -&gt; skip(Up, Down, [Up|Acc], Src, 0).

skip( _, Down, Acc, [Down|Src], 0) -&gt; {Acc, Src};
skip(Up, Down, Acc, [Down|Src], N) -&gt; skip(Up, Down, [Down|Acc], Src, N-1);
skip(Up, Down, Acc, [Up|Src], N)   -&gt; skip(Up, Down, [Up|Acc], Src, N+1);
skip(Up, Down, Acc, [X|Src], N)    -&gt; skip(Up, Down, [X|Acc], Src, N).
</pre>
<p>Basically, create a function named for each Brainfuck operator.  Then, convert all of the valid Brainfuck operators in the program into atoms, and use them to call the functions sharing their names.  Run it just like the earlier example, bf2:run(Program).</p>
<p>Now, I&#8217;m not going to call the first implementation ugly.  In fact, I think it&#8217;s a fair example of walking a list, doing different things depending on the value of the head of the list.  But, I have to say that The second version does read a bit nicer, in some respects.  (I also tried using the tape record in the first example, but I thought it made things worse.)</p>
<p>Yeah, okay, Brainfuck clearly still isn&#8217;t a great use for quirky-atom function names, but perhaps it represents some problem space that <em>can</em> make good use of them?</p>
<p>Anyone have a better neat trick - for either Brainfuck interpretation or funky-atom function names?</p>
<p>P.S. My apologies for not posting an answer to Alboin (the Trapexit poster).  I can&#8217;t remember my login details for Trapexit.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Disclaimer 2: WordPress really doesn&#8217;t like dealing with so many &lt;s and &gt;s.  I think I got everything, but if something doesn&#8217;t work, that&#8217;s probably the culprit.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/49/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/49/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=49&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2008/01/02/brainfun/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Denormalization, Processes</title>
		<link>http://blog.beerriot.com/2008/01/01/denormalization-processes/</link>
		<comments>http://blog.beerriot.com/2008/01/01/denormalization-processes/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 03:22:00 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Erlang]]></category>

		<category><![CDATA[ErlyWeb]]></category>

		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2008/01/01/denormalization-processes/</guid>
		<description><![CDATA[If you read the news, you&#8217;ll know that tuneups are happening behind the scenes of BeerRiot.  If you came to this blog after reading that story, you&#8217;re wondering what, exactly, they are.
If I&#8217;m not feeling particularly communication-challenged, I&#8217;ll be able to explain them to you.   
The first tuneup is one every webmaster [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>If you read <a href="http://beerriot.com/news/view/20080101">the news</a>, you&#8217;ll know that tuneups are happening behind the scenes of BeerRiot.  If you came to this blog after reading that story, you&#8217;re wondering what, exactly, they are.</p>
<p>If I&#8217;m not feeling particularly communication-challenged, I&#8217;ll be able to explain them to you.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>The first tuneup is one every webmaster has heard of: denormalization.  I had been using a view to select data from three tables with one call.  The performance drag of that query was serious enough, though, that I&#8217;ve decided to complicate things a bit and copy the extra bits of data I need from the other tables into the main one for the query.</p>
<p>The speed gain is great, and, somewhat strangely, the denormalization actually cleaned up a bunch of my code.  ErlyDB lacks a &#8220;one-to-one&#8221; relation, so it was impossible for me to say &#8220;each record in this view is really just a record in this other table with some extra data.&#8221;  That made for a bit of hackery swinging from one type to another.  Without that extra table, I think the code reads more clearly.</p>
<p>(Disclaimer: I&#8217;m far from being an relational database master, so it&#8217;s likely that there is a much better way to express everything I&#8217;m doing.  But, I&#8217;m happy to be making what seems to be forward progress.)</p>
<p>The other main change is more Erlang-centric.  Until now, I had been tracking sessions using a customization of the <a href="http://yaws.hyber.org/session.yaws">Yaws recommended session server</a>.  This is basically a central process that stores opaque data associated with an id string.  Whenever your app gets a request, it pulls the cookie value out and checks with this central process to find out if there is any opaque data associated with this key.  It works (quite well, in fact), but it seems like a bit of a bottle neck.</p>
<p>So, I&#8217;ve decided that there&#8217;s a more Erlangy way to do things.  What BeerRiot is doing now is starting up a new process for each session, and saving that process id in a client cookie.  Then, whenever a request comes in, if it has a cookie with a PID, we can try to contact that session&#8217;s handling process directly.  No central service required.</p>
<p>It turns out that there&#8217;s loads of benefits to having this session hanging around beyond relieving the central service bottleneck.  It can cache data, smartly (i.e. listen for updates, etc.).  It&#8217;s a natural place to run background processes (like propagating live changes to durable storage).  I see other potential uses, but since I haven&#8217;t tested them yet, I&#8217;ll hold my tongue to avoid getting too many hopes up.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>For Facebook developers:  This process-session system wasn&#8217;t possible until just a few weeks ago, when Facebook started supporting cookies on the canvas page.  Unfortunately, they only support them for canvas requests, and not for their &#8220;mock ajax.&#8221;  For mock ajax, I&#8217;ve decided to just encode the cookie values in post parameters.  It works (and it&#8217;s no more inconsistent than the rest of the Facebook Developer experience).</p>
<p><b>Update 2.Jan 18:52 EDT</b>: If you spent any part of today poking at BeerRiot to see how the speed-ups turned out, you were probably rather dissatisfied.  I just figured out that I didn&#8217;t fully rollout the update.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  It&#8217;s there now, and I think you&#8217;ll be much more impressed.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/48/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/48/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=48&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2008/01/01/denormalization-processes/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Downtime</title>
		<link>http://blog.beerriot.com/2007/12/17/downtime/</link>
		<comments>http://blog.beerriot.com/2007/12/17/downtime/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 19:23:02 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/12/17/downtime/</guid>
		<description><![CDATA[Hi all.  In case you&#8217;re wondering why BeerRiot has been down most of today - it&#8217;s a hardware problem.  Something about faulty drives on the machine hosting my VPS, which keeps throwing things into read-only mode.
Hopefully they&#8217;ll get it fixed soon.
       ]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hi all.  In case you&#8217;re wondering why BeerRiot has been down most of today - it&#8217;s a hardware problem.  Something about faulty drives on the machine hosting my VPS, which keeps throwing things into read-only mode.</p>
<p>Hopefully they&#8217;ll get it fixed soon.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/47/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/47/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=47&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/12/17/downtime/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Erlang2Facebook Updates</title>
		<link>http://blog.beerriot.com/2007/12/16/erlang2facebook-updates/</link>
		<comments>http://blog.beerriot.com/2007/12/16/erlang2facebook-updates/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 16:13:53 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[ErlyWeb]]></category>

		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/12/16/erlang2facebook-updates/</guid>
		<description><![CDATA[I&#8217;ve just committed a couple of minor updates to the erlang2facebook library that I&#8217;m sure some of you are interested in.
The first (SVN revisions 7 &#38; 9) is an API update to follow the Facebook team&#8217;s changes to profile_setFBML.  Now, instead of just passing a single chunk of FBML, containing markup for the profile [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve just committed a couple of minor updates to the <a href="http://code.google.com/p/erlang2facebook/">erlang2facebook library</a> that I&#8217;m sure some of you are interested in.</p>
<p>The first (SVN revisions 7 &amp; 9) is an API update to follow the <a href="http://developers.facebook.com/news.php?blog=1&amp;story=61">Facebook team&#8217;s changes to profile_setFBML</a>.  Now, instead of just passing a single chunk of FBML, containing markup for the profile box, profile actions, and mobile profile, there are three distinct fields to shove those chunks in.  Sorry about the non-consecutive SVN commits.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>The second update (SVN revision 8 ) is intended to show how to use ErlTL better (thanks for the tips, Yariv!).  I&#8217;ve created render.et, and moved all of the render_* functions from canvas_controller into it.  This allows me to use the more HTML-like syntax (code efficiency), while also taking advantage of ErlTL&#8217;s automatic use of Erlang&#8217;s binaries (runtime efficiency).</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/46/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/46/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=46&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/12/16/erlang2facebook-updates/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Erlang2facebook has Users!</title>
		<link>http://blog.beerriot.com/2007/11/17/erlang2facebook-has-users/</link>
		<comments>http://blog.beerriot.com/2007/11/17/erlang2facebook-has-users/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 19:13:58 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Erlang]]></category>

		<category><![CDATA[ErlyWeb]]></category>

		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/11/17/erlang2facebook-has-users/</guid>
		<description><![CDATA[Fun news this morning.  BeerRiot&#8217;s Facebook App is no long the only Facebook App based on Erlang!  The word is that these four are also using the erlang2facebook library:
Birthday Greeting Cards
Animated Gifts
Will you KISS me?
FB President
Awesome!  Care to step up and take credit for your accomplishments, Mark?
      [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Fun news this morning.  <a href="http://www.facebook.com/apps/application.php?api_key=f2ef1b9a990cf9c795cb8fc99dfde6b8">BeerRiot&#8217;s Facebook App</a> is no long the only Facebook App based on Erlang!  The word is that these four are also using the <a href="http://code.google.com/p/erlang2facebook/">erlang2facebook library</a>:</p>
<p><a href="http://www.facebook.com/apps/application.php?api_key=8806b2cb3378803f8c50c08d227be562">Birthday Greeting Cards</a></p>
<p><a href="http://www.facebook.com/apps/application.php?api_key=4444e054156f1675f3ec4f2b057e60b5">Animated Gifts</a></p>
<p><a href="http://www.facebook.com/apps/application.php?api_key=d986f51fdd54acd4b26ccec75056aa25">Will you KISS me?</a></p>
<p><a href="http://www.facebook.com/apps/application.php?api_key=3c30a646ccaaeb4e9b73577764b602d2">FB President</a></p>
<p>Awesome!  Care to step up and take credit for your accomplishments, Mark?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=45&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/11/17/erlang2facebook-has-users/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>Beer for Wine Lovers</title>
		<link>http://blog.beerriot.com/2007/11/11/beer-for-wine-lovers/</link>
		<comments>http://blog.beerriot.com/2007/11/11/beer-for-wine-lovers/#comments</comments>
		<pubDate>Mon, 12 Nov 2007 03:06:53 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Beer]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/11/11/beer-for-wine-lovers/</guid>
		<description><![CDATA[As I sit here enjoying a home-brewed wine (!) that my parents made last fall (great, guys, by the way!), I&#8217;m reminded of a thought I had a few days ago, reinforced at yesterday&#8217;s NERAX North event.  I was reading a piece in the New York Times about cask-conditioned ale, when I noticed that [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As I sit here enjoying a home-brewed wine (!) that my parents made last fall (great, guys, by the way!), I&#8217;m reminded of a thought I had a few days ago, reinforced at yesterday&#8217;s <a href="http://beerriot.com/forums/events/6">NERAX North</a> event.  I was reading a piece in the New York Times about <a href="http://www.nytimes.com/2007/10/24/dining/24pour.html">cask-conditioned ale</a>, when I noticed that the piece was written by their <a href="http://topics.nytimes.com/top/reference/timestopics/people/a/eric_asimov/index.html">wine reviewer</a>.</p>
<p>As I was grumbling about a the Times sending their <em>wine</em> reviewer to do a <em>beer</em> review, it occured to me that the pairing was actually perfect: there is no beer that a wine-lover is more likely to enjoy than a properly-served cask-conditioned ale.</p>
<p>Think about it.  What are the main differences between wine and your typical beer?  Forget grapes vs. barley - those are inescapable.  The three that come to my mind are: carbonation, serving temperature, and flavoring particles.</p>
<p>To start with, most wine is uncarbonated.  Unless you&#8217;re specifically talking about champagne or sparkling wine, the assumption is that wine is still.  Some people prefer their beverages this way.  No sparkling on the tongue or in the nose, no unfortunate gaseous releases to deal with later.</p>
<p>What they don&#8217;t know is that most craft beer, especially true for cask-conditioned and &#8220;real ale&#8221;, has <em>much</em> less carbonation than macro-brewed beer.  Artisanal brewers realize that large amounts of carbonation only hide the flavor of beer.  The mild carbonation is intended only to keep the beer dancing on the tongue, and they stop before it goes all house-bouncing-rave style.  Someone expecting a typical beer may even complain that what they got was flat.  I think a wine-lover could truly appreciate the stillness and lack of distraction from the beer&#8217;s other flavors, though.</p>
<p>Most wine is also served only mildly chilled.  Whites are often cool on the tongue, but reds are usually nearly room-temperature.  Again, a certain amount of personal preference plays into the choice.  Teeth are sensitive to temperature swings.  There&#8217;s less pressure to finish a beverage before it gets warm, if it starts out at room temperature.</p>
<p>But, here again is a place where cask-conditioned ale stands apart.  Casks live in, and are served from cellars.  As such, the beer in them is served at &#8220;cellar temperature&#8221;, usually around 50ºF.  At this temperature, the beer&#8217;s flavors are much more available to the tongue.  Beers served colder, sometimes even &#8220;ice cold&#8221;, numb the tongue as they&#8217;re drunk.  The tongue is so frigid, it can&#8217;t tell if it&#8217;s drinking beer or iced tea.</p>
<p>But what about the flavor?  Even if you serve with less carbonation and a higher termperature to allow the tongue to taste more, what if you don&#8217;t like the <em>taste</em> of beer?  Certainly, wine is made from grapes, and beer is made from barley, and they taste different.  But, there is one flavor aspect that are extremely important to many wines: tannins.</p>
<p>Tannins come from woods, and that skins of fruit, leaves of plants, and hulls of grains (really just the &#8220;fruit&#8221; of grasses).  Homebrewers are familiar with cautions not to heat grain too high lest they extract the tannins of the hulls.  However, cask-beers <em>do</em> extract tannins from another source - the cask!  Yes, the wood in the barrel, often the same wood used in wine barrels, contributes tannins to the beer contained within.  Familiar flavors for the wine connoisseur, right there in cask-conditioned ale.</p>
<p>Wine, served still, at or just below room temperature, drawn from a wooden container.  Beer, served only slightly sparkling, just below room temperature, drawn from a wooden container.  Now you&#8217;re just down to grapes vs. barley and hops.  I think there may be hope for converting the wine-lovers yet.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>(And if you really want to push the grapes vs. barley and hops argument, I&#8217;ll offer two for comparison: mead (honey wine) and Brackett ale (honey and malt).  Where&#8217;s the difference now?)</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/44/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/44/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=44&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/11/11/beer-for-wine-lovers/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>RSS Feeds</title>
		<link>http://blog.beerriot.com/2007/11/03/rss-feeds/</link>
		<comments>http://blog.beerriot.com/2007/11/03/rss-feeds/#comments</comments>
		<pubDate>Sat, 03 Nov 2007 20:04:58 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/11/03/rss-feeds/</guid>
		<description><![CDATA[In case you&#8217;re using this blog&#8217;s feed to get updates about new features on BeerRiot, here&#8217;s a notice that BeerRiot now has its own feeds.   
I&#8217;m pretty green to the RSS scene, though, so if I&#8217;ve committed some terrible crime against RSS, please let me know, and I&#8217;ll get on fixing it.  [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In case you&#8217;re using this blog&#8217;s feed to get updates about new features on BeerRiot, here&#8217;s a notice that <a href="http://beerriot.com/news/view/20071103">BeerRiot now has its own feeds</a>.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I&#8217;m pretty green to the RSS scene, though, so if I&#8217;ve committed some terrible crime against RSS, please let me know, and I&#8217;ll get on fixing it.  Or, if there&#8217;s just some way that I could improve the experience, which all of you RSS-fiends know about, those suggestions are most welcome.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/43/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/43/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=43&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/11/03/rss-feeds/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
		<item>
		<title>BeerRiot Forums</title>
		<link>http://blog.beerriot.com/2007/10/28/beerriot-forums/</link>
		<comments>http://blog.beerriot.com/2007/10/28/beerriot-forums/#comments</comments>
		<pubDate>Sun, 28 Oct 2007 19:09:43 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.beerriot.com/2007/10/28/beerriot-forums/</guid>
		<description><![CDATA[Yes, the update I promised earlier in the week is now live.  BeerRiot&#8217;s Forums are now open for discussion.
I know what some of you are thinking.  &#8220;Forums?!  Every site under the sun has forums.  What did you waste weeks on forums for?&#8221;  Clearly, if there was an ounce of sense [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Yes, the update I <a href="http://blog.beerriot.com/2007/10/23/despite-reports-to-the-contrary/">promised</a> earlier in the week <a href="http://beerriot.com/news/view/20071028">is now live</a>.  <a href="http://beerriot.com/forums">BeerRiot&#8217;s Forums</a> are now open for discussion.</p>
<p>I know what some of you are thinking.  &#8220;Forums?!  Every site under the sun has forums.  What did you waste weeks on forums for?&#8221;  Clearly, if there was an ounce of sense in my head, I would have grabbed the nearest PhpBB implementation, tossed it up, and been done with it.</p>
<p>Well, I agree.</p>
<p>Except that I just couldn&#8217;t bear having such a disconnected, tacked on hunk of lameness.  Even assuming that people wouldn&#8217;t mind the pain in the neck of having a second logon for a forum system, what I really wanted was a system that could really relate to the rest of the content on the site.</p>
<p>For example, I expect people to want to talk about a group (or several) of beers.  Maybe someone will have a question about how two styles relate (porter and stout, hefeweizen and wheat, &#8230;), or they will have just returned from an event with an interesting selection.  I think they should be able to easily set up a discussion about exactly the set of beers they want.  So, since we were already doing this to some extent with tags, I have made it a key feature of discussion topics that they should be able to have tags associated with them.</p>
<p>I also expect people to want to get the word out about upcoming beer events.  They&#8217;ll want to tell people where, and when, but then also discuss how it went afterward.  So, in the events forum, all topics are allowed to have dates and locations associated with them.</p>
<p>As such, I went on my merry way developing.  An opportunity to sling more Erlang code - how could I resist?  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>As if that weren&#8217;t bad enough, there was the realization late in the project that the new forum system was so much better than the beer comment system that there was no way I could leave the elder in place.  So, out came the old, and in went the new.  And hey - I always wanted to let people comment directly on breweries, why not add that in too?</p>
<p>If you&#8217;ve been anywhere near the software industry (or, in fact, I suspect <em>any</em> industry), you recognize now the project spiral.  &#8220;Just one more thing, then it will be ready.&#8221;  That&#8217;s how it went for the first couple of weeks.  Luckily I recognized the spiral at that point too, and cut off some of the broader plans to get this pushed out (don&#8217;t worry - they&#8217;re still on the agenda, just on a different deadline).</p>
<p>Believe it or not, I believe I was lucky enough to be able to pick joints at which to truncate plans, that after this big, bulky update I should be able to roll out some nice, smaller updates fairly quickly and smoothly.  The next news item shouldn&#8217;t be three weeks away.  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>So that&#8217;s that.  In case you&#8217;re wondering, no, I still don&#8217;t regret choosing Erlang/ErlyWeb for this project.  I didn&#8217;t run up against anything in this development that this system was incapable of handling.  As mentioned above, I likely would have been delving deep into the guts of any forum system I chose, so development time would have been just as long.  Getting to do it in a language that doesn&#8217;t annoy me [yet] was a real treat.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/beerriot.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/beerriot.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/beerriot.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/beerriot.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/beerriot.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/beerriot.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/beerriot.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/beerriot.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/beerriot.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/beerriot.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/beerriot.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/beerriot.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.beerriot.com&blog=1135025&post=42&subd=beerriot&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.beerriot.com/2007/10/28/beerriot-forums/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/beerriot-128.jpg" medium="image">
			<media:title type="html">beerriot</media:title>
		</media:content>
	</item>
	</channel>
</rss>