<?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>Space Station Lambda &#187; Web engineering</title>
	<atom:link href="http://blog.viridian-project.de/sections/tech/web-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.viridian-project.de</link>
	<description>Leslie P. Polzer on code, music, literature, design and free software business.</description>
	<lastBuildDate>Wed, 19 May 2010 07:44:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Whoops! Something went wrong. Please try refreshing the page.</title>
		<link>http://blog.viridian-project.de/2009/07/29/whoops-something-went-wrong-please-try-refreshing-the-page/</link>
		<comments>http://blog.viridian-project.de/2009/07/29/whoops-something-went-wrong-please-try-refreshing-the-page/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 08:25:54 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Net Culture]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[wave]]></category>
		<category><![CDATA[xmpp]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/?p=197</guid>
		<description><![CDATA[If you&#8217;re a Twitter user then chances are you&#8217;ve seen this message. Here&#8217;s a rant based on it. The Twitter web interface allows you to take a look at older tweets in bunches of about a twenty each. And every time you want to fetch a new batch you have to click on the large [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re a Twitter user then chances are you&#8217;ve seen this message. Here&#8217;s a rant based on it.</p>
<p>The Twitter web interface allows you to take a look at older tweets in bunches of about a twenty each. And every time you want to fetch a new batch you have to click on the large &#8220;more&#8221; button. Which in turn often brings up the message features in this blog post&#8217;s title.</p>
<p>I&#8217;m annoyed as hell by this of course, but it also gives me the opportunity for a little analysis that will end in the conclusion: <em>Twitter will fail</em> (unless they take some spoons of Tech Clue and change radically, that is).</p>
<p>What&#8217;s behind the little error message? You can&#8217;t really say for sure what happened, but since these errors occur pretty randomly it&#8217;s probably just that their servers are very busy right now.</p>
<p>Plus Twitter is notoriously known for having problems with scalability. For roughly the last two years, in fact. If you ask me they must be pretty clueless about scalability issues. To my knowledge their last action to solve this was to switch to another programming language (Scala). This approach seems to be motivated more by the name of the language than the actual benefit derived from switching to it. I don&#8217;t know if they have made the switch yet or whether they changed their strategy, but chances are their scalability problems won&#8217;t be solved at all with this.</p>
<p>The only thing that could cure their scalability worries would be a proper protocol for distributed twittering. There are suitable and proven distributed protocols like XMPP. You know, that&#8217;s the thing the Jabber instant messaging network is built on. And Google Wave too. This is quite a clue on the ability of Wave to supersede Twitter. Instead the latter ones are wasting their time with fruitless efforts. Come on!</p>
<p>This is made worse by the sheer simplicity of their application. I mean, in one of my projects I&#8217;m the sole developer of a complex game application. It&#8217;s understandable that I can&#8217;t be all things for all people, and scalability is just one of many problems. But what the hell are they doing all day at Twitter? They have 29 employees right now (source: TechCrunch)! Are they all busy keeping the list of top tweets fresh, or making Excel diagrams to please their VCs?</p>
<p>What&#8217;s your opinion on Twitter, scalability and the future of micro-blogging?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2009/07/29/whoops-something-went-wrong-please-try-refreshing-the-page/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Weblocks 0.8.3 released</title>
		<link>http://blog.viridian-project.de/2009/07/12/weblocks-083-released/</link>
		<comments>http://blog.viridian-project.de/2009/07/12/weblocks-083-released/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 09:52:08 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[common lisp]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[weblocks]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/?p=175</guid>
		<description><![CDATA[Weblocks is an advanced web framework written in Common Lisp. It is designed to make Agile web application development as effective and simple as possible. WHY YET ANOTHER WEB FRAMEWORK? This is not your ordinary run-of-the-mill web framework in PHP, Python or Ruby. Weblocks uses powerful Lisp features like multiple dispatch, the metaobject protocol, lexical [...]]]></description>
			<content:encoded><![CDATA[<p>Weblocks is an advanced web framework written in Common Lisp.</p>
<p>It is designed to make Agile web application development as<br />
effective and simple as possible.</p>
<h3>WHY YET ANOTHER WEB FRAMEWORK?</h3>
<p>This is not your ordinary run-of-the-mill web framework in PHP, Python or Ruby.</p>
<p>Weblocks uses powerful Lisp features like multiple dispatch, the<br />
metaobject protocol, lexical closures, keyword arguments, and macros<br />
to build abstractions that make web development easy, intuitive, and<br />
free of boilerplate. In addition, control flow is easily expressed<br />
using continuations.</p>
<p>Things that are hard or mundane in other frameworks become easy and<br />
fun in Weblocks. A fine example of this are Weblocks&#8217; AJAX capabilities<br />
which relieves you from writing Javascript in a lot of situations.</p>
<h3>AUDIENCE</h3>
<p>People who want to get their real-life web programming done<br />
as effectively as possible.</p>
<p>Weblocks is not only targeted at old hands but also at<br />
newcomers to Lisp and Lisp web programming.</p>
<p>It offers a helpful community and code that prevents you<br />
from shooting yourself too easily in the foot.</p>
<h3>IS IT USABLE? CAN I SEE SOME DEMOS?</h3>
<p>Weblocks is well-tested and has proven its worth in daily usage.<br />
It is used by a community of developers all over the world.</p>
<p>Public applications running Weblocks include</p>
<ul>
<li><a href="https://www.lamsight.org/">LAMsight</a></li>
<li><a href="http://aulapolska.pl/">Aula Polska</a></li>
<li><a href="http://www.thanandar.de/">Thanandar</a></li>
</ul>
<h3>CHANGES IN 0.8.3</h3>
<ul>
<li>Greatly enhanced performance in the request handler</li>
<li>Support for request timeouts</li>
<li>Automatic bundling/versioning of static files</li>
<li>Rudimentary profiling</li>
<li>Fundamentally overhauled nav system</li>
<li>CLSQL demo fixed</li>
<li>Updated Simple Blog example</li>
<li>New HTML error handler</li>
<li>More flexible debugger configuration with additional restarts</li>
<li>The usual assortment of fixes and contrib/ additions</li>
</ul>
<h3>MORE INFORMATION</h3>
<h4>Platforms</h4>
<p>  Well-tested on SBCL and Clozure CL.<br />
  Partially tested on CMUCL, Lispworks, AllegroCL, and OpenMCL.</p>
<h4>Official site (with detailed installation guide)</h4>
<p>  <a href="http://weblocks.viridian-project.de/">http://weblocks.viridian-project.de/</a></p>
<h4>Demo</h4>
<p>  <a href="http://weblocks.viridian-project.de/weblocks-demo">http://weblocks.viridian-project.de/weblocks-demo</a></p>
<h3>CONTRIBUTORS</h3>
<p>This release has been made possible by Nandan Bagchee, Benjamin Collins,<br />
Stephen Compall, Chris Hallwright, Jan Rychter and yours truly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2009/07/12/weblocks-083-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weird release policies in PEAR land</title>
		<link>http://blog.viridian-project.de/2008/10/13/weird-release-policies-in-pear-land/</link>
		<comments>http://blog.viridian-project.de/2008/10/13/weird-release-policies-in-pear-land/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 17:26:40 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[alpha]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[quickform]]></category>
		<category><![CDATA[quickform2]]></category>
		<category><![CDATA[release management]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/?p=138</guid>
		<description><![CDATA[I&#8217;m not very fond of PHP, but it&#8217;s hard to dodge it. Fortunately the PEAR project has a set of excellent (well, as close to excellency as PHP lets you get&#8230;) libraries for all sorts of purposes. The only thing with them is that they have problems managing their releases. The main site of the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not very fond of PHP, but it&#8217;s hard to dodge it.</p>
<p>Fortunately the <a href="http://pear.php.net/">PEAR</a> project has a set of excellent (well, as close to excellency as PHP lets you get&#8230;) <a href="http://pear.php.net/packages.php">libraries</a> for all sorts of purposes.</p>
<p>The only thing with them is that they have problems managing their releases. The main site of the popular <a href="http://pear.php.net/package/HTML_QuickForm">HTML Quickform</a> library sports a fat warning sign, claiming that this package had been superseded by the aptly named <a href="http://pear.php.net/package/HTML_QuickForm2">HTML QuickForm 2</a> package.</p>
<p>That&#8217;s funny, because most if not all <a href="http://pear.php.net/search.php?q=quickform&#038;in=packages&#038;x=0&#038;y=0">other packages depending on QuickForm</a> are still built for the old version. Even more funny is what a vanilla install of the PEAR package tool will throws at anyone attempting to install QuickForm2:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> pear <span style="color: #c20cb9; font-weight: bold;">install</span> HTML_QuickForm2
Failed to download pear<span style="color: #000000; font-weight: bold;">/</span>HTML_QuickForm2 within preferred state <span style="color: #ff0000;">&quot;stable&quot;</span>, latest release is version 0.2.0, stability <span style="color: #ff0000;">&quot;alpha&quot;</span>, use <span style="color: #ff0000;">&quot;channel://pear.php.net/HTML_QuickForm2-0.2.0&quot;</span> to <span style="color: #c20cb9; font-weight: bold;">install</span>
Cannot initialize <span style="color: #ff0000;">'channel://pear.php.net/HTML_QuickForm2'</span>, invalid or missing package <span style="color: #c20cb9; font-weight: bold;">file</span>
Package <span style="color: #ff0000;">&quot;channel://pear.php.net/HTML_QuickForm2&quot;</span> is not valid
<span style="color: #c20cb9; font-weight: bold;">install</span> failed</pre></div></div>

<p>Now take into account that this situation has been in place for at least one year. Not really a role model for a sane software development release process.</p>
<p>Evidence B: Structures_Datagrid and a bunch of other packages are also marked &#8220;beta&#8221; but have been used by the majority (I daresay) of developers without any problems over the course of the last dekamonths.</p>
<p>What gives, PEAR?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/10/13/weird-release-policies-in-pear-land/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JES, a KISS mail server</title>
		<link>http://blog.viridian-project.de/2008/10/04/jes-a-kiss-mail-server/</link>
		<comments>http://blog.viridian-project.de/2008/10/04/jes-a-kiss-mail-server/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 13:05:27 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[dwim]]></category>
		<category><![CDATA[kiss]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[simple]]></category>
		<category><![CDATA[small]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[tiny]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/?p=132</guid>
		<description><![CDATA[JES is a tiny Java mail server. Very useful for testing local mail emitting routines. Usage: download, extract, quickly edit the configuration files and execute bin/mail.sh. Thanks, Eric!]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ericdaugherty.com/java/mailserver/">JES</a> is a tiny Java mail server.</p>
<p>Very useful for testing local mail emitting routines.</p>
<p>Usage: download, extract, quickly edit the configuration files and execute <code>bin/mail.sh</code>.</p>
<p>Thanks, Eric!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/10/04/jes-a-kiss-mail-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightning link checker</title>
		<link>http://blog.viridian-project.de/2008/07/13/lightning-link-checker/</link>
		<comments>http://blog.viridian-project.de/2008/07/13/lightning-link-checker/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 09:00:51 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[concurrent]]></category>
		<category><![CDATA[fast]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[quick]]></category>
		<category><![CDATA[smp]]></category>
		<category><![CDATA[speed]]></category>
		<category><![CDATA[urlcheck]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/?p=87</guid>
		<description><![CDATA[Wow! urlcheck is lightweight, concurrent url checker. It uses minimal resources, and is multicore-capable. In contrast to popular link checkers, it uses few resources, will readily take advantage of multiple cores, and is easily killable. Works great and is fast as lightning. Plus, it&#8217;s written in Haskell. Arch Linux users get it from AUR, all [...]]]></description>
			<content:encoded><![CDATA[<p>Wow!</p>
<blockquote><p>
    urlcheck is lightweight, concurrent url checker. It uses minimal resources, and is multicore-capable.</p>
<p>    In contrast to popular link checkers, it uses few resources, will readily take advantage of multiple cores, and is easily killable.
</p></blockquote>
<p>Works great and is fast as lightning. Plus, it&#8217;s written in Haskell.</p>
<p>Arch Linux users <a href="http://aur.archlinux.org/packages.php?ID=17702">get it from AUR</a>, all others from their distribution or directly <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/urlcheck">from source</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/07/13/lightning-link-checker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A minimalistic web site compiler</title>
		<link>http://blog.viridian-project.de/2008/03/18/a-minimalistic-web-site-compiler/</link>
		<comments>http://blog.viridian-project.de/2008/03/18/a-minimalistic-web-site-compiler/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 12:00:05 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Hack]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[clean]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[generation]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[kiss]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[pages]]></category>
		<category><![CDATA[simple]]></category>
		<category><![CDATA[static]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[templating]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/2008/03/18/a-minimalistic-web-site-compiler/</guid>
		<description><![CDATA[The setup of small non-dynamic web sites is an often recurring task. Unfortunately, there&#8217;s a lot of repeated content, most of it in the header of the sites that doesn&#8217;t change except for the title. SSI doesn&#8217;t really help because its syntax is clumsy and the files are compiled again on each request. It also [...]]]></description>
			<content:encoded><![CDATA[<p>The setup of small non-dynamic web sites is an often recurring task. Unfortunately, there&#8217;s a lot of repeated content, most of it in the header of the sites that doesn&#8217;t change except for the title.</p>
<p>SSI doesn&#8217;t really help because its syntax is clumsy and the files are compiled again on each request. It also needs to be enabled on the target host.</p>
<p>A solution that compiles standard HTML from templates is best for performance and portability. It&#8217;s possible to use on of the many HTML template toolkits out there, but why bother? All I want is a standardized header and footer and a page title varying with each HTML file.</p>
<p>So let&#8217;s do just that:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #660033;">-e</span>
&nbsp;
<span style="color: #007800;">OUTDIR</span>=.<span style="color: #000000; font-weight: bold;">/</span>build
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$OUTDIR</span>&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># wrap header and footer, set &lt;title&gt; from first line of body</span>
<span style="color: #000000; font-weight: bold;">for</span> f <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>page1,page2,page3<span style="color: #7a0874; font-weight: bold;">&#125;</span>.html; <span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #007800;">TITLE</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-n1</span> <span style="color: #007800;">$f</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-p</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/^TITLE: *(.*?)$/$1/'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">&quot;s|TITLE|<span style="color: #007800;">$TITLE</span>|&quot;</span> header.html ;
   <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'1d'</span> <span style="color: #007800;">$f</span>;
   <span style="color: #c20cb9; font-weight: bold;">cat</span> footer.html<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$OUTDIR</span>/<span style="color: #007800;">$f</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># auxiliary files</span>
<span style="color: #000000; font-weight: bold;">for</span> f <span style="color: #000000; font-weight: bold;">in</span> logo.png default.css; <span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #007800;">$f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$OUTDIR</span>/<span style="color: #007800;">$f</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>title<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>The files that get wrapped into header and footer need to set their title on the first line:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">TITLE: my page title
&lt;p&gt;So this is it...&lt;/p&gt;</pre></div></div>

<p>If you don&#8217;t like Perl, you can also whip up a sed or awk script in its place.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/03/18/a-minimalistic-web-site-compiler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatic table layout</title>
		<link>http://blog.viridian-project.de/2008/01/30/automatic-table-layout/</link>
		<comments>http://blog.viridian-project.de/2008/01/30/automatic-table-layout/#comments</comments>
		<pubDate>Wed, 30 Jan 2008 20:50:03 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[rendering]]></category>
		<category><![CDATA[table]]></category>
		<category><![CDATA[weblocks.widget]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/2008/01/30/automatic-table-layout/</guid>
		<description><![CDATA[GTK+ has a table layout container that lets you render widgets in a grid. The widgets get assigned to the table cells automatically. I haven&#8217;t looked at their rendering algorithm, but this does something similar in a Weblocks widget: &#40;in-package :weblocks&#41; &#160; &#40;export '&#40;table-composite render-widget-body&#41;&#41; &#160; &#40;defwidget table-composite &#40;composite&#41; &#40;&#40;cols :type integer :accessor cols :initarg [...]]]></description>
			<content:encoded><![CDATA[<p>GTK+ has a <a href="http://library.gnome.org/devel/gtk/stable/GtkTable.html">table layout container</a> that lets you render widgets in a grid. The widgets get assigned to the table cells automatically. I haven&#8217;t looked at their rendering algorithm, but this does something similar in a Weblocks widget:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>in-package <span style="color: #66cc66;">:</span><span style="color: #555;">weblocks</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>export '<span style="color: #66cc66;">&#40;</span>table-composite render-widget-body<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defwidget table-composite <span style="color: #66cc66;">&#40;</span>composite<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>cols <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> <span style="color: #b1b100;">integer</span> <span style="color: #66cc66;">:</span><span style="color: #555;">accessor</span> cols <span style="color: #66cc66;">:</span><span style="color: #555;">initarg</span> <span style="color: #66cc66;">:</span><span style="color: #555;">cols</span> <span style="color: #66cc66;">:</span><span style="color: #555;">initform</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">documentation</span> <span style="color: #ff0000;">&quot;Renders a set of widgets in table layout.&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod render-widget-body <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>widget table-composite<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&amp;</span>rest args<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span>* <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>widgets <span style="color: #66cc66;">&#40;</span>composite-widgets widget<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>num-widgets <span style="color: #66cc66;">&#40;</span>list-<span style="color: #b1b100;">length</span> widgets<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>cols <span style="color: #66cc66;">&#40;</span>cols widget<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>rows <span style="color: #66cc66;">&#40;</span>ceiling <span style="color: #66cc66;">&#40;</span>/ num-widgets cols<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>with-html
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">table</span> <span style="color: #66cc66;">:</span><span style="color: #555;">rows</span> rows <span style="color: #66cc66;">:</span><span style="color: #555;">cols</span> cols
        <span style="color: #66cc66;">&#40;</span>loop for r from <span style="color: #cc66cc;">0</span> below rows
              <span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#40;</span>htm <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">tr</span>
              <span style="color: #66cc66;">&#40;</span>loop for c from <span style="color: #cc66cc;">0</span> below cols
                    <span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>child <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">nth</span> <span style="color: #66cc66;">&#40;</span>+ c <span style="color: #66cc66;">&#40;</span>* r cols<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> widgets<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         <span style="color: #66cc66;">&#40;</span>htm <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">td</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> child <span style="color: #66cc66;">&#40;</span>render-widget child<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;; EXAMPLE CODE:</span>
<span style="color: #66cc66;">&#40;</span>make-instance 'table-composite <span style="color: #66cc66;">:</span><span style="color: #555;">cols</span> <span style="color: #cc66cc;">3</span>
  <span style="color: #66cc66;">:</span><span style="color: #555;">widgets</span> <span style="color: #66cc66;">&#40;</span>loop for i from <span style="color: #cc66cc;">1</span> to <span style="color: #cc66cc;">10</span>
                 collect <span style="color: #66cc66;">&#40;</span>write-to-string i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Yeah, I know a DOLIST would do the same as the LOOP here, but I really like LOOP.</p>
<p>This should be easily adaptable for generic HTML rendering.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/01/30/automatic-table-layout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML tables and exploratory programming</title>
		<link>http://blog.viridian-project.de/2008/01/30/html-tables-and-exploratory-programming/</link>
		<comments>http://blog.viridian-project.de/2008/01/30/html-tables-and-exploratory-programming/#comments</comments>
		<pubDate>Wed, 30 Jan 2008 08:29:55 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[arc]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css sucks]]></category>
		<category><![CDATA[html tables]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/2008/01/30/html-tables-and-exploratory-programming/</guid>
		<description><![CDATA[Today (or yesterday, depending on your time zone) Paul Graham has released Arc, his very own successor to Common Lisp and Scheme. I don&#8217;t care much about it, at least not in its presents state, but the article that accompanied its release is very interesting in its statements on exploratory programming. What particularly struck me [...]]]></description>
			<content:encoded><![CDATA[<p>Today (or yesterday, depending on your time zone) <a href="http:/paulgraham.com/">Paul Graham</a> has released <a href="http://arclanguage.org/">Arc</a>, his very own successor to Common Lisp and Scheme. I don&#8217;t care much about it, at least not in its presents state, but the <a href="http://paulgraham.com/arc0.html">article that accompanied its release</a> is very interesting in its statements on exploratory programming.</p>
<p>What particularly struck me was his comparison of HTML tables with Lisp&#8217;s untyped lists.</p>
<p>First, Paul talks about the evolution of his opinion on untyped lists:</p>
<p><em>“I went through a stage, after I&#8217;d been programming in Lisp for 2 or 3 years, where I thought the old way of using lists to represent everything was just a hack. If you needed to represent points, surely it was better to declare a proper structure with x and y fields than to use a list of two numbers. Lists could contain anything. They might even have varying numbers of elements.</p>
<p>I was wrong. Those are the advantages of using lists to represent points.</p>
<p>Over the years my appreciation for lists has increased. In exploratory programming, the fact that it&#8217;s unclear what a list represents is an advantage, because you yourself are unclear about what type of program you&#8217;re trying to write. The most important thing is not to constrain the evolution of your ideas. So the less you commit yourself in writing to what your data structures represent, the better.”</em></p>
<p>I&#8217;m sure most Lisp programmers will agree to this.</p>
<p>Now, what about HTML tables?</p>
<p><em>“Tables are the lists of html. The W3C doesn&#8217;t like you to use tables to do more than display tabular data because then it&#8217;s unclear what a table cell means. But this sort of ambiguity is not always an error. It might be an accurate reflection of the programmer&#8217;s state of mind. In exploratory programming, the programmer is by definition unsure what the program represents.”</em></p>
<p>And yes, CSS still can&#8217;t do more than three columns, and even for three I would have to look it up.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/01/30/html-tables-and-exploratory-programming/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Classical hack: Apache httpd as CMS</title>
		<link>http://blog.viridian-project.de/2008/01/13/classical-hack-apache-httpd-as-cms/</link>
		<comments>http://blog.viridian-project.de/2008/01/13/classical-hack-apache-httpd-as-cms/#comments</comments>
		<pubDate>Sun, 13 Jan 2008 11:50:38 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Hack]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[content management]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[elegant]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[kiss]]></category>
		<category><![CDATA[simple]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/2008/01/13/classical-hack-apache-httpd-as-cms/</guid>
		<description><![CDATA[In search of a light-weight content management system, I came across this KISS solution. It&#8217;s obviously not really a CMS that one would install for a customer, but it&#8217;s a nice thing for your typical software projects: a flock of small pages gathering around the most important thing, namely the downloads. Well done!]]></description>
			<content:encoded><![CDATA[<p>In search of a light-weight content management system, I came across <a href="http://www.webcodr.com/34/build-a-lightweight-cms-using-htaccess/">this KISS solution</a>.</p>
<p>It&#8217;s obviously not really a CMS that one would install for a customer, but it&#8217;s a nice thing<br />
for your typical software projects: a flock of small pages gathering around the most important thing,<br />
namely the downloads.</p>
<p>Well done!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/01/13/classical-hack-apache-httpd-as-cms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Including static HTML snippets in Weblocks</title>
		<link>http://blog.viridian-project.de/2008/01/11/including-static-html-snippets-in-weblocks/</link>
		<comments>http://blog.viridian-project.de/2008/01/11/including-static-html-snippets-in-weblocks/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 19:42:49 +0000</pubDate>
		<dc:creator>Leslie</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Web engineering]]></category>
		<category><![CDATA[external html]]></category>
		<category><![CDATA[html file]]></category>
		<category><![CDATA[html snippet]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[including]]></category>
		<category><![CDATA[inclusion]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[static html]]></category>
		<category><![CDATA[weblocks]]></category>

		<guid isPermaLink="false">http://blog.viridian-project.de/2008/01/11/including-static-html-snippets-in-weblocks/</guid>
		<description><![CDATA[Generating your HTML directly in Lisp with CL-WHO (or some other HTML generation toolkit) is effective. However, sometimes you need to include HTML from external sources, for example when you want HTML writers to provide page elements. Here&#8217;s a widget for Weblocks that will create a widget from static HTML: &#40;in-package :weblocks&#41; &#160; &#40;export '&#40;static-html [...]]]></description>
			<content:encoded><![CDATA[<p>Generating your HTML directly in Lisp with CL-WHO (or some other HTML generation toolkit) is effective.<br />
However, sometimes you need to include HTML from external sources, for example when you want HTML writers to provide page elements.</p>
<p>Here&#8217;s a widget for Weblocks that will create a widget from static HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>in-package <span style="color: #66cc66;">:</span><span style="color: #555;">weblocks</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>export '<span style="color: #66cc66;">&#40;</span>static-html make-static-html-from-file
          with-widget-header render-widget-body<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defwidget static-html <span style="color: #66cc66;">&#40;</span>widget<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>html <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> string <span style="color: #66cc66;">:</span><span style="color: #555;">accessor</span> html <span style="color: #66cc66;">:</span><span style="color: #555;">initarg</span> <span style="color: #66cc66;">:</span><span style="color: #555;">html</span> <span style="color: #66cc66;">:</span><span style="color: #555;">initform</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">documentation</span> <span style="color: #ff0000;">&quot;Represents a piece of static HTML body mark-up.&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod with-widget-header <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>widget static-html<span style="color: #66cc66;">&#41;</span> body-fn <span style="color: #66cc66;">&amp;</span>rest args <span style="color: #66cc66;">&amp;</span>key
                                                    prewidget-body-fn postwidget-body-fn <span style="color: #66cc66;">&amp;</span>allow-other-keys<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> body-fn widget args<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defmethod render-widget-body <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>widget static-html<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&amp;</span>rest args<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>format *weblocks-output-stream* <span style="color: #ff0000;">&quot;~A~_&quot;</span> <span style="color: #66cc66;">&#40;</span>html widget<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> make-static-html-from-file <span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Create a static-html widget representing the mark-up in “file”.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>with-open-file <span style="color: #66cc66;">&#40;</span>input file <span style="color: #66cc66;">:</span><span style="color: #555;">direction</span> <span style="color: #66cc66;">:</span><span style="color: #555;">input</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>data <span style="color: #66cc66;">&#40;</span>make-string <span style="color: #66cc66;">&#40;</span>file-<span style="color: #b1b100;">length</span> input<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>read-sequence data input<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>make-instance 'static-html <span style="color: #66cc66;">:</span><span style="color: #555;">html</span> data<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>The Lisp paste is at <a href="http://paste.lisp.org/display/54023">http://paste.lisp.org/display/54023</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viridian-project.de/2008/01/11/including-static-html-snippets-in-weblocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
