<?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>Ciaran&#039;s Random Writings &#187; YAWS</title>
	<atom:link href="http://ciarang.com/posts/category/software/yaws/feed" rel="self" type="application/rss+xml" />
	<link>http://ciarang.com</link>
	<description>Random things I&#039;ve written about stuff</description>
	<lastBuildDate>Thu, 15 Mar 2012 12:59:41 +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>Virtual Debian test/dev setup</title>
		<link>http://ciarang.com/posts/virtual-debian-testdev-setup</link>
		<comments>http://ciarang.com/posts/virtual-debian-testdev-setup#comments</comments>
		<pubDate>Sat, 08 Sep 2007 07:47:43 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[ErlyWeb]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[XMPP]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/103</guid>
		<description><![CDATA[I decided to switch my multi-virtual machine test/dev setup over to a minimal Debian install, not least because I couldn&#8217;t keep my mind off the fact that I was carting around a full desktop installation along with various &#8216;pretty&#8217; desktop backgrounds, system administration for GUI-monkeys applications, and god knows what else. One batch of this [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to switch my multi-virtual machine test/dev setup over to a minimal Debian install, not least because I couldn&#8217;t keep my mind off the fact that I was carting around a full desktop installation along with various &#8216;pretty&#8217; desktop backgrounds, system administration for GUI-monkeys applications, and god knows what else. One batch of this stuff is bad enough, but repeated N times it&#8217;s too much for me to handle.</p>
<p><span id="more-103"></span></p>
<p>I also can&#8217;t help viewing those VMware &#8216;appliance&#8217; things with suspicion, and I&#8217;m starting to put real data on these things now, so I went for a clean install from debian-40r1-i386-netinst.iso. Doing the initial setup via the VMware Server console, viewed via VNC, is unbelievably painful but all that was needed after the actual install was to reconfigure the networking and install sshd before getting back to a nice clean SSH login.</p>
<p>I&#8217;m slightly cross with myself for not having scripted the rest of the setup yet, but on the other hand I&#8217;m pleased I was anal enough to document it all in the first place, because all I had to do was copy the commands out of my previous posts here and paste them into the SSH window to get back to where I was. I also set up Debian to use sudo, because I prefer that to using su.</p>
<p>The only differences in all the setup steps from the previous &#8216;doing X on Ubuntu&#8217; posts due to the change of distribution were:</p>
<ul>
<li>The m4 package was already installed.</li>
<li>Instead of libssl-dev, I needed openssl.</li>
<li>I left out the detail of how to fix ejabberdctl. (added as a comment to <a href="http://ciarang.com/index.php/archives/94">that post</a>)</li>
</ul>
<p>I didn&#8217;t go as far as the Mnesia data import stage, stopping instead after installing and testing Erlyweb, for reasons that will become apparent later. For the record, the steps were:</p>
<ul>
<li><a href="http://ciarang.com/index.php/archives/93">Erlang</a></li>
<li><a href="http://ciarang.com/index.php/archives/94">Ejabberd</a></li>
<li><a href="http://ciarang.com/index.php/archives/95">Jabberlang</a></li>
<li><a href="http://ciarang.com/index.php/archives/96">YAWS</a></li>
<li><a href="http://ciarang.com/index.php/archives/97">ErlyWeb</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/virtual-debian-testdev-setup/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Erlyweb, Mnesia and xmerl_xpath</title>
		<link>http://ciarang.com/posts/erlyweb-mnesia-and-xmerl_xpath</link>
		<comments>http://ciarang.com/posts/erlyweb-mnesia-and-xmerl_xpath#comments</comments>
		<pubDate>Thu, 06 Sep 2007 08:28:33 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[ErlyWeb]]></category>
		<category><![CDATA[Mnesia]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/98</guid>
		<description><![CDATA[I stayed up far too late last night playing with Erlang and friends &#8211; much longer than planned due to a few hitches. I did manage to complete more or less what I&#8217;d planned in the end though, so here is the documentation. The initial environment is that built up over my previous posts with [...]]]></description>
			<content:encoded><![CDATA[<div style="float:right; margin-left:10px; margin-bottom:10px;"><a href='http://ciarang.com/wp-content/uploads/2007/09/dj1.png' title='The Erlyweb DJ app'><img src='http://ciarang.com/wp-content/uploads/2007/09/dj1.thumbnail.png' alt='The Erlyweb DJ app' /></a></div>
<p>I stayed up far too late last night playing with Erlang and friends &#8211; much longer than planned due to a few hitches. I did manage to complete more or less what I&#8217;d planned in the end though, so here is the documentation.</p>
<p><span id="more-98"></span></p>
<p>The initial environment is that built up over my <a href="http://ciarang.com/index.php/archives/97">previous posts</a> with one slight change &#8211; I had to switch to revision 171 of ErlyWeb from SVN, as the Mnesia driver is temporarily broken in more recent revisions.</p>
<p>Step one was to create the Mnesia database and import some data I already had in XML format. After a bit of head-scratching and cursing, I came up with <a href='http://ciarang.com/wp-content/uploads/2007/09/djimport.erl' title='djimport.erl'>djimport.erl</a>. It&#8217;s not all pleasant (see the last function, which was the source of most of the cursing until I gave in and committed that horrific crime), but it did suck in 6714 &#8216;record&#8217; records quickly and without even complaining about the awful choice of record name. I used the following Erlang command-line to run it:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">erl <span style="color: #660033;">-s</span> djimport <span style="color: #660033;">-sname</span> dj <span style="color: #660033;">-mnesia</span> <span style="color: #c20cb9; font-weight: bold;">dir</span> <span style="color: #ff0000;">'&quot;db&quot;'</span></pre></div></div>

<p>Step two was to extend the ErlyWeb app created in the previous post by adding a new component, as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">erl -pa /home/ciaran/erlyweb/ebin
1&gt; erlyweb:create_component(&quot;record&quot;, &quot;/home/ciaran/dj&quot;).</pre></div></div>

<p>Finally, all I had to do was to update my <b>dj</b> startup script to include the same <b>-sname dj -mnesia dir &#8216;&#8221;db&#8221;&#8216;</b> on the command-line, and put the following two lines at the beginning of dj.erl:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff4e18;">mnesia</span>:<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span>
<span style="color: #ff4e18;">mnesia</span>:<span style="color: #ff3c00;">create_table</span><span style="color: #109ab8;">&#40;</span>counter<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>disc_copies<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #fa6fff;">node</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
              <span style="color: #109ab8;">&#123;</span>attributes<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>key<span style="color: #6bb810;">,</span> counter<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span></pre></div></div>

<p>The end result was the ability to navigate and edit the database in a browser (see screenshot), albeit with a few issues that I&#8217;ll sort out next time.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/erlyweb-mnesia-and-xmerl_xpath/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Setting up ErlyWeb</title>
		<link>http://ciarang.com/posts/setting-up-erlyweb</link>
		<comments>http://ciarang.com/posts/setting-up-erlyweb#comments</comments>
		<pubDate>Tue, 04 Sep 2007 23:07:58 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[ErlyWeb]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/97</guid>
		<description><![CDATA[Building on the steps in the previous parts of this series, I&#8217;ve added ErlyWeb into the equation. ErlyWeb is a web application framework built on Erlang/YAWS which I&#8217;ve been reading a bit about recently. As well as the main web site linked above, Yariv Sadan&#8216;s blog is a good source of information. All I&#8217;m documentating [...]]]></description>
			<content:encoded><![CDATA[<p>Building on the steps in the <a href="http://ciarang.com/index.php/archives/96">previous</a> parts of this series, I&#8217;ve added <a href="http://www.erlyweb.org">ErlyWeb</a> into the equation. ErlyWeb is a web application framework built on Erlang/YAWS which I&#8217;ve been reading a bit about recently. As well as the main web site linked above, <a href="http://yarivsblog.com/">Yariv Sadan</a>&#8216;s blog is a good source of information.</p>
<p><span id="more-97"></span></p>
<p>All I&#8217;m documentating at this stage is the initial setup of a skeleton app, which starts with getting and building ErlyWeb:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> http:<span style="color: #000000; font-weight: bold;">//</span>erlyweb.googlecode.com<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span> erlyweb
<span style="color: #7a0874; font-weight: bold;">cd</span> erlyweb
<span style="color: #c20cb9; font-weight: bold;">mv</span> Emakefile Emakefile.old
<span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s*/usr/local/src*/usr/local/lib*&quot;</span> Emakefile.old <span style="color: #000000; font-weight: bold;">&gt;</span>Emakefile
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> ..</pre></div></div>

<p>Note that I amended the Erlang makefile to point at the location of my installed YAWS includes from an earlier step. Now, back in the home directory, start Erlang with the following command line:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">erl <span style="color: #660033;">-pa</span> erlyweb<span style="color: #000000; font-weight: bold;">/</span>ebin</pre></div></div>

<p>In the Erlang shell, do this to create the skeleton application:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">1&gt; erlyweb:create_app(&quot;dj&quot;,&quot;/home/ciaran&quot;).
2&gt; halt().</pre></div></div>

<p>A &#8216;dj&#8217; directory was created above with the skeleton ErlyWeb application structure in place. Add two extra files in that directory as follows. Firstly a small Erlang program which runs the app with YAWS in embedded mode &#8211; <b>dj.erl</b>. It&#8217;s just a slight extension of the embeded YAWS test code from last time:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>dj<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>start<span style="color: #014ea4;">/</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">include</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;/usr/local/lib/yaws/include/yaws.hrl&quot;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #006600;">erlyweb</span>:<span style="color: #ff3c00;">compile</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;/home/ciaran/dj&quot;</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>erlydb_driver<span style="color: #6bb810;">,</span> mnesia<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">application</span>:<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span>yaws<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">GC</span> <span style="color: #014ea4;">=</span> yaws_<span style="color: #ff4e18;">config</span>:<span style="color: #ff3c00;">make_default_gconf</span><span style="color: #109ab8;">&#40;</span>false<span style="color: #6bb810;">,</span><span style="color: #ff7800;">&quot;dj&quot;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">SC</span> <span style="color: #014ea4;">=</span> #<span style="color: #d400ed;">sconf</span><span style="color: #109ab8;">&#123;</span>port <span style="color: #014ea4;">=</span> <span style="color: #ff9600;">8001</span><span style="color: #6bb810;">,</span>
                servername <span style="color: #014ea4;">=</span> <span style="color: #ff7800;">&quot;ubuntu01&quot;</span><span style="color: #6bb810;">,</span>
                listen <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#123;</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
                docroot <span style="color: #014ea4;">=</span> <span style="color: #ff7800;">&quot;www&quot;</span><span style="color: #6bb810;">,</span>
                appmods <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #ff7800;">&quot;/&quot;</span><span style="color: #6bb810;">,</span> erlyweb<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span>
                opaque <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #ff7800;">&quot;appname&quot;</span><span style="color: #6bb810;">,</span><span style="color: #ff7800;">&quot;dj&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span> <span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
    yaws_ap<span style="color: #ff4e18;">i</span>:<span style="color: #ff3c00;">setconf</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GC</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">SC</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>And secondly a script to compile and start it, called simply <b>dj</b>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#! /bin/sh</span>
erlc dj.erl
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #7a0874; font-weight: bold;">exit</span>; <span style="color: #000000; font-weight: bold;">fi</span>;
erl <span style="color: #660033;">-pa</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>yaws<span style="color: #000000; font-weight: bold;">/</span>ebin <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>ciaran<span style="color: #000000; font-weight: bold;">/</span>erlyweb<span style="color: #000000; font-weight: bold;">/</span>ebin <span style="color: #660033;">-yaws</span> embedded <span style="color: #c20cb9; font-weight: bold;">true</span> <span style="color: #660033;">-s</span> dj</pre></div></div>

<p>Now to start things up:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">770</span> dj
.<span style="color: #000000; font-weight: bold;">/</span>dj</pre></div></div>

<p>All being well, hitting port 8001 with a web browser should show the skeleton application, which doesn&#8217;t do very much at this stage. The choice of the name &#8216;dj&#8217; for this first application indicates that I&#8217;m planning to replace the back-end of my inexplicable <a href="http://ciarang.com/index.php/archives/29">DJ</a> software with this. It&#8217;s unlikely to be anything to get excited over, unless you&#8217;re me.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/setting-up-erlyweb/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Compiling YAWS on Ubuntu</title>
		<link>http://ciarang.com/posts/compiling-yaws-on-ubuntu</link>
		<comments>http://ciarang.com/posts/compiling-yaws-on-ubuntu#comments</comments>
		<pubDate>Sun, 02 Sep 2007 09:49:41 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/96</guid>
		<description><![CDATA[Part 4 of the series, documenting the setup of an Erlang test platform. In this episode, it&#8217;s YAWS (discussed previously here) that we&#8217;re adding. Another dependency first: sudo apt-get install libpam0g-dev Now we can get, build and install YAWS from SVN. Note that as before I&#8217;m grabbing a specific revision so I have a stable [...]]]></description>
			<content:encoded><![CDATA[<p>Part 4 of the series, documenting the setup of an Erlang test platform. In this episode, it&#8217;s <a href="http://yaws.hyber.org">YAWS</a> (discussed previously <a href="http://ciarang.com/index.php/archives/88">here</a>) that we&#8217;re adding.</p>
<p><span id="more-96"></span></p>
<p>Another dependency first:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libpam0g-dev</pre></div></div>

<p>Now we can get, build and install YAWS from SVN. Note that as before I&#8217;m grabbing a specific revision so I have a stable and repeatable setup:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #660033;">-r</span> <span style="color: #000000;">1129</span> <span style="color: #c20cb9; font-weight: bold;">co</span> https:<span style="color: #000000; font-weight: bold;">//</span>erlyaws.svn.sourceforge.net<span style="color: #000000; font-weight: bold;">/</span>svnroot<span style="color: #000000; font-weight: bold;">/</span>erlyaws<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>yaws
<span style="color: #7a0874; font-weight: bold;">cd</span> yaws
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>To use YAWS in embedded mode, you need to start up Erlang with something like the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">erl <span style="color: #660033;">-pa</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>yaws<span style="color: #000000; font-weight: bold;">/</span>ebin <span style="color: #660033;">-yaws</span> embedded <span style="color: #c20cb9; font-weight: bold;">true</span></pre></div></div>

<p>Finally, here&#8217;s a very small test program that just serves static files from the &#8216;wwwtest&#8217; subdirectory of the directory you run from. Before running this, you need an empty directory .yaws/yaws/yawstest off your home directory. To be honest I don&#8217;t know why yet as the parameter is newly added and (surprise surprise) undocumented, but the final part corresponds to the second parameter to make_default_gconf.</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>yawstest<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>main<span style="color: #014ea4;">/</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">include</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;/usr/local/lib/yaws/include/yaws.hrl&quot;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">main</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff4e18;">application</span>:<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span>yaws<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">GC</span> <span style="color: #014ea4;">=</span> yaws_<span style="color: #ff4e18;">config</span>:<span style="color: #ff3c00;">make_default_gconf</span><span style="color: #109ab8;">&#40;</span>false<span style="color: #6bb810;">,</span><span style="color: #ff7800;">&quot;yawstest&quot;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">SC</span> <span style="color: #014ea4;">=</span> #<span style="color: #d400ed;">sconf</span><span style="color: #109ab8;">&#123;</span>port <span style="color: #014ea4;">=</span> <span style="color: #ff9600;">8001</span><span style="color: #6bb810;">,</span>
		servername <span style="color: #014ea4;">=</span> <span style="color: #ff7800;">&quot;ubuntu01&quot;</span><span style="color: #6bb810;">,</span>
		listen <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#123;</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
		docroot <span style="color: #014ea4;">=</span> <span style="color: #ff7800;">&quot;wwwtest&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
    yaws_ap<span style="color: #ff4e18;">i</span>:<span style="color: #ff3c00;">setconf</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GC</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">SC</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Stick some documents in wwwroot, run the above and test away.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/compiling-yaws-on-ubuntu/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>YAW(N)S</title>
		<link>http://ciarang.com/posts/yawns</link>
		<comments>http://ciarang.com/posts/yawns#comments</comments>
		<pubDate>Fri, 17 Aug 2007 15:24:00 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/88</guid>
		<description><![CDATA[Last post on this subject for now, hopefully, since even I&#8217;m getting bored of it. Just for the sake of completeness, I did the ISO date formatting &#8216;properly&#8217;, as follows: w3cdtf&#40;GregSecs&#41; -&#38;gt; Date=calendar:gregorian_seconds_to_datetime&#40;GregSecs&#41;, &#91;UDate&#124;_&#93;=calendar:local_time_to_universal_time_dst&#40;Date&#41;, USecs=calendar:datetime_to_gregorian_seconds&#40;UDate&#41;, &#123;&#123;Y, M, D&#125;,&#123;HH, MM, SS&#125;&#125; = Date, io_lib:format&#40;&#34;~4..0b-~2..0b-~2..0bT~2..0b:~2..0b:~2..0b~s&#34;, &#91;Y,M,D,HH,MM,SS,tzid&#40;GregSecs-USecs&#41;&#93;&#41;. &#160; tzid&#40;Secs&#41; when Secs==0 -&#38;gt; &#34;Z&#34;; tzid&#40;Secs&#41; -&#38;gt; &#123;HH,MM,_&#125;=calendar:seconds_to_time&#40;abs&#40;Secs&#41;&#41;, io_lib:format&#40;&#34;~c~2..0b:~2..0b&#34;, &#91;case [...]]]></description>
			<content:encoded><![CDATA[<p>Last post on <a href="http://ciarang.com/index.php/archives/87">this subject</a> for now, hopefully, since even I&#8217;m getting bored of it. Just for the sake of completeness, I did the ISO date formatting &#8216;properly&#8217;, as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">w3cdtf</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #45b3e6;">Date</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #006600;">gregorian_seconds_to_date</span><span style="color: #fa6fff;">time</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">UDate</span>|_<span style="color: #109ab8;">&#93;</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">local_time_to_universal_time_dst</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Date</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #45b3e6;">USecs</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">datetime_to_gregorian_seconds</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">UDate</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">M</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">HH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">MM</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">SS</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Date</span><span style="color: #6bb810;">,</span>
	<span style="color: #ff4e18;">io_lib</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;~4..0b-~2..0b-~2..0bT~2..0b:~2..0b:~2..0b~s&quot;</span><span style="color: #6bb810;">,</span>
		<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">M</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">HH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">MM</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">SS</span><span style="color: #6bb810;">,</span><span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">USecs</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Secs</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">Secs</span><span style="color: #014ea4;">==</span><span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #ff7800;">&quot;Z&quot;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Secs</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">HH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">MM</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #006600;">seconds_to_</span><span style="color: #fa6fff;">time</span><span style="color: #109ab8;">&#40;</span><span style="color: #fa6fff;">abs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Secs</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #ff4e18;">io_lib</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;~c~2..0b:~2..0b&quot;</span><span style="color: #6bb810;">,</span>
		<span style="color: #109ab8;">&#91;</span><span style="color: #186895;">case</span> <span style="color: #45b3e6;">Secs</span> &amp;gt<span style="color: #6bb810;">;</span><span style="color: #014ea4;">=</span> <span style="color: #ff9600;">0</span> <span style="color: #186895;">of</span> false <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span> $<span style="color: #014ea4;">-</span><span style="color: #6bb810;">;</span> true <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span> $<span style="color: #014ea4;">+</span> <span style="color: #186895;">end</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">HH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">MM</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>As well as being shorter and clearer still, it doesn&#8217;t use the calendar:time_difference like the original did. That&#8217;s good because not only is that function very silly, it turns out it is marked as obsolete in the documentation. I suspect those two points are not unrelated.</p>
<p>Anyway, I&#8217;ll probably give the above some more rigourous testing and submit a patch. It may seem rather trivial, but actually it was a good exercise in getting to know Erlang a bit better. Half an hour of practical problem is usually worth ten of reading TFM.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/yawns/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>YAWS continued</title>
		<link>http://ciarang.com/posts/yaws-continued</link>
		<comments>http://ciarang.com/posts/yaws-continued#comments</comments>
		<pubDate>Thu, 16 Aug 2007 20:20:00 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/87</guid>
		<description><![CDATA[There was a suggestion in the comments that the code excerpt I showcased in my previous post was not shit at all, but rather just the way you do things in a functional programming language. By way of illustrating why it actually is shit, I present the following code that does exactly the same thing, [...]]]></description>
			<content:encoded><![CDATA[<p>There was a suggestion in the comments that the code excerpt I showcased in my <a href="http://ciarang.com/index.php/archives/86">previous post</a> was not shit at all, but rather just the way you do things in a functional programming language. By way of illustrating why it actually is shit, I present the following code that does exactly the same thing, using the same methodology:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">less_shit</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #45b3e6;">Date</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #006600;">gregorian_seconds_to_date</span><span style="color: #fa6fff;">time</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Date</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">UDate</span>|_<span style="color: #109ab8;">&#93;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">local_time_to_universal_time_dst</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Date</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">time_difference</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">UDate</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">Date</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	<span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;lt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffH</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #ff7800;">&quot;+&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #ff7800;">&quot;+&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">23</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">60</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
	<span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">24</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">60</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">tzid</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff7800;">&quot;Z&quot;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>The point to note is that no complex expression is repeated multiple times, and nor is the actual logic of generating the timezone identifier buried within one. It&#8217;s much clearer, and much shorter.</p>
<p>Another point to note is that it is still shit, and I make no apologies for that, as firstly I wanted to keep the methodology the same, and secondly I am still getting to grips with Erlang.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/yaws-continued/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>YAWS</title>
		<link>http://ciarang.com/posts/yaws</link>
		<comments>http://ciarang.com/posts/yaws#comments</comments>
		<pubDate>Thu, 16 Aug 2007 12:53:00 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/86</guid>
		<description><![CDATA[I said I would have another look at YAWS, given the apparently amazing performance. I decided to dive straight into the source, since I had more than a hunch that anything substantial written in Erlang would be an unmaintainable mass of crap. I certainly wasn&#8217;t disappointed in this case. The following excerpt is one of [...]]]></description>
			<content:encoded><![CDATA[<p>I said I would have another look at <a href="http://yaws.hyber.org/">YAWS</a>, given the apparently amazing performance. I decided to dive straight into the source, since I had more than a hunch that anything substantial written in Erlang would be an unmaintainable mass of crap. I certainly wasn&#8217;t disappointed in this case. The following excerpt is <strong>one</strong> of several chunks of code I came across that do exactly* the same thing:</p>
<p><span id="more-86"></span></p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">%%%</span>
<span style="color: #666666; font-style: italic;">%%% Create W3CDTF (http://www.w3.org/TR/NOTE-datetime) formatted date</span>
<span style="color: #666666; font-style: italic;">%%% w3cdtf(GregSecs) -&amp;gt; &quot;YYYY-MM-DDThh:mm:ssTZD&quot;</span>
<span style="color: #666666; font-style: italic;">%%%</span>
<span style="color: #ff3c00;">w3cdtf</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>    <span style="color: #45b3e6;">Date</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">calendar</span>:<span style="color: #006600;">gregorian_seconds_to_date</span><span style="color: #fa6fff;">time</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">GregSecs</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Date</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">UDate</span>|_<span style="color: #109ab8;">&#93;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">local_time_to_universal_time_dst</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Date</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #014ea4;">=</span><span style="color: #ff4e18;">calendar</span>:<span style="color: #ff3c00;">time_difference</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">UDate</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">Date</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">%%%  w3cdtf's helper function</span>
<span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;lt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffH</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
    <span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;+&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
&nbsp;
<span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
    <span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;+&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
&nbsp;
<span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
    <span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">23</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">60</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
&nbsp;
<span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> &amp;gt<span style="color: #6bb810;">;</span> <span style="color: #ff9600;">12</span><span style="color: #6bb810;">,</span>  <span style="color: #45b3e6;">DiffD</span> <span style="color: #014ea4;">/=</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffMi</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
   <span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">24</span><span style="color: #014ea4;">-</span><span style="color: #45b3e6;">DiffH</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">DiffMi</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span> 
&nbsp;
<span style="color: #ff3c00;">w3cdtf_diff</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mo</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">D</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mi</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">S</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_DiffD</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">DiffH</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_DiffMi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">when</span> <span style="color: #45b3e6;">DiffH</span> <span style="color: #014ea4;">==</span> <span style="color: #ff9600;">0</span> <span style="color: #014ea4;">-</span>&amp;gt<span style="color: #6bb810;">;</span>
    <span style="color: #ff3c00;">i2l</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mo</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;-&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">D</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;T&quot;</span> <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">H</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mi</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;:&quot;</span>  <span style="color: #014ea4;">++</span>
        <span style="color: #ff3c00;">add_zero</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">S</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">++</span> <span style="color: #ff7800;">&quot;Z&quot;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>I&#8217;m sure I&#8217;m would be offending a number of people, were they to read this, but nonetheless I will say it &#8211; that&#8217;s absolutely shocking, and it&#8217;s fairly typical of the project in general. At some points in the source, there are slight redeeming features of some actual documentation headers above some of the functions, but they&#8217;re few and far between and incomplete when they do occur. All in all I&#8217;d say it either needs some dramatic clean-up and refactoring, or a good sprinkling with parmesan and black pepper to make a meal for a tramp&#8217;s dog.</p>
<p>I very much doubt that this is a YAWS issue, because the underlying OTP framework smells very similar, but I do live in hope of seeing a &#8220;well engineered&#8221; Erlang project. On the other hand, perhaps my assessment of the YAWS code is wrong. Disagreements are welcome.</p>
<p>Anyway, for now I am sticking with my opinion that it&#8217;s the &#8220;Erlang way of doing things&#8221; that&#8217;s interesting (and I mean the high-level design concepts obviously), and not Erlang itself.</p>
<p style="font-size: x-small"><em>*It&#8217;s somewhat difficult to verify the &#8216;exactly&#8217; actually &#8211; suffice to say they ought to do the same thing. The above example came from yaws_rss.erl. See yaws.erl and yaws_log.erl for other examples.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/yaws/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Erlang &#8211; First Impressions</title>
		<link>http://ciarang.com/posts/erlang-first-impressions</link>
		<comments>http://ciarang.com/posts/erlang-first-impressions#comments</comments>
		<pubDate>Thu, 09 Aug 2007 19:10:00 +0000</pubDate>
		<dc:creator>CiaranG</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[YAWS]]></category>

		<guid isPermaLink="false">http://blog.ciarang.com/index.php/archives/85</guid>
		<description><![CDATA[I decided to have a brief play around with Erlang a couple of weeks ago. If you don&#8217;t know what it is already, you are unlikely to be interested, so switch off now. On the other hand if you do know what it is, I&#8217;m sure you know more than me about it, so switch [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to have a brief play around with <a href="http://www.erlang.org">Erlang</a> a couple of weeks ago. If you don&#8217;t know what it is already, you are unlikely to be interested, so switch off now. On the other hand if you do know what it is, I&#8217;m sure you know more than me about it, so switch off now. That leaves me writing for my future self, who is probably here either trying to refresh his goldfish-like memory or wanting a chuckle at what his former self got wrong.</p>
<p><span id="more-85"></span></p>
<p>Erlang is a functional programming language designed specifically to deal with the issues of concurrent and fault-tolerant distributed systems. It was conceived and developed at Ericsson, and to this day finds its primary application in telephony switches and the like. However, the characteristics that made it useful in this area are rapidly becoming more relevant to &#8216;mainstream&#8217; computing with the rise of technologies such as the internet and multi-core CPUs, for example.</p>
<p>In general, the main thing that surprised me is the very strong smell of ad-hoc &#8216;hackishness&#8217; around the language. In the past, I&#8217;ve created countless domain-specific languages for various purposes and something about Erlang reminds me of many of these. This isn&#8217;t really a criticism, I find it rather endearing, but it doesn&#8217;t really bode well for the longevity of the language (yes, I know it&#8217;s 20 years old already) or its widespread adoption.</p>
<p>I like the terse elegance of it as well. The more you get into the language, the more elegant it becomes. I would love to unleash this language on developers I&#8217;ve worked with who favour a complex class structure (&#8220;We should use the MultiTentacledSquid Pattern&#8221; ; &#8220;Why?&#8221; ; &#8220;Dunno&#8221;) over a &#8216;few lines&#8217; (ish!) of straightforward code and think that ThisIsASensibleWayToNameAVariable.</p>
<p>However, while I&#8217;m sure Erlang is addressing the needs of the future, and was doing so way before its time, I am not at all convinced it is a development platform of the future. I tend to think it will remain more or less within its current niche, although attempting to contradict me are several conspicuous counterexamples* to this already.</p>
<p>The defining features of Erlang though, will definitely be part of those future platforms, and I see these as being the <em>cheap processes</em> and <em>lightweight interprocess messaging</em>. To my mind, much of the rest of the touted benefits of Erlang come for free with these in place. I&#8217;m talking about fault-tolerance, hot-swapping (clumsy in Erlang if you ask me), scalability and distributability (if that&#8217;s even a word), for example. That&#8217;s assuming you make use of your cheap processes properly of course &#8211; it&#8217;s more about methodology than anything else I think. There&#8217;s no reason you can&#8217;t take any language/platform and develop a system in &#8216;the Erlang way&#8217;, but it would be likely to perform very badly. It&#8217;s the presence of those two key features that make the methodology practical.</p>
<p>Anyway, that&#8217;s enough for now. I will continue to play with Erlang a bit more, but I&#8217;m pretty close to the point where I would need to develop something substantial and purposeful to learn much more, which will definitely have to wait for a less busy time.</p>
<p style="font-size:xx-small"><em>*One good example is probably ejabberd, a Erlang-based XMPP server. I run a few installations of <a href="http://www.igniterealtime.org">OpenFire</a> (Java-based) currently, whcih is very well featured and stable, but I use it under relatively small loads. Despite having no evidence to back this up, I&#8217;d be willing to bet ejabberd would totally wipe the floor with it when it comes to dealing with heavy traffic.</em></p>
<p><u>Update</u></p>
<p>Here is an example with some evidence. <a href="http://yaws.hyber.org">Yaws</a> is an Erlang web server, and <a href="http://www.sics.se/~joe/apachevsyaws.html">here</a> are the results of a face-off between Apache and Yaws. Rather convincing I think. I&#8217;ll be looking more closely at Yaws at some point.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciarang.com/posts/erlang-first-impressions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

