<?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>From Accessibility to Zope &#187; Web Apps</title>
	<atom:link href="http://blog.mauveweb.co.uk/category/web-apps/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mauveweb.co.uk</link>
	<description>experiments in contemporary web development</description>
	<lastBuildDate>Thu, 18 Aug 2011 23:26:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Scheduling Events</title>
		<link>http://blog.mauveweb.co.uk/2007/08/09/scheduling-events/</link>
		<comments>http://blog.mauveweb.co.uk/2007/08/09/scheduling-events/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 18:25:15 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2007/08/09/scheduling-events/</guid>
		<description><![CDATA[There are several situations in web application programming where it is necessary to schedule events to happen in the future, outside of the request driven model. Some of the most common are these:

Expiring static files from the webserver. Some data can be cleaned up whenever a page is requested. On occasion, though, the application establishes [...]]]></description>
			<content:encoded><![CDATA[<p>There are several situations in web application programming where it is necessary to schedule events to happen in the future, outside of the request driven model. Some of the most common are these:</p>
<ul>
<li>Expiring static files from the webserver. Some data can be cleaned up whenever a page is requested. On occasion, though, the application establishes the contract that a file will stay around for a fixed period of time. When access to these files is provided by the webserver (not through the application itself) then the files need to be deleted at a given future moment.</li>
<li>Time-based notifications. For example, if you deal with dates and times in your web application it's sometimes necessary to actually notify users (most often, via email) at a given time. It's clearly not acceptable to wait until someone hits a page (possibly hours or days later) to issue these notifications.</li>
<li>Syndication. Polling data on remote servers has to be done ready for when a user hits a page, because otherwise it can introduce an unacceptable delay while variously contactable remote hosts are queried.</li>
</ul>
<p>In several of my web applications now I've come to a sticking point when it comes to scheduling events. As far as I know this is always left up to the developer to arrange. Scheduling events is considered outside their remit.</p>
<p>There are a few solutions I know of.</p>
<ul>
<li>The application can provide a script which the administrator must schedule to be run periodically at install time. Drupal, for example, recommends adding a crontab entry which periodically wgets a script on the web site. In redistributable apps, many users will obliviously skip this step and wonder why the application won't work.</li>
<li>Run scheduled tasks after serving each page. This approach doesn't solve the above problems. In mod_php/perl/python applications this hogs a webserver thread too, which could degrade performance.</li>
<li>There are websites like <a href="http://www.webcron.org/index.php?lang=en">webcron.org</a> that will fetch a script on your server at intervals. It would be madness to rely on this in your own applications or suggest this as a solution for a redistributable applications, so it's only suitable as a fallback if all else fails.</li>
<li>The application may be able to use to the system scheduler (cron/at on Posix, Windows Scheduler Service on Windows). While it should be possible for a <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> application to enqueue things into the webserver's user's crontab (as long as <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> isn't restricted to "safe mode"), I'm not sure that this is advisable. Most offline applications I know that need to schedule something spawn their own daemon to handle scheduled events, even if it sits idle most of the time.</li>
</ul>
<p>I can't see why the frameworks shouldn't provide an <acronym title="	Application Programming Interface">API</acronym> for scheduling tasks. This would have the advantage of being simple, integrated and portable, and it could negotiate to use the platform scheduler or fall back to spawning a daemon to dispatch events.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2007/08/09/scheduling-events/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>File uploads</title>
		<link>http://blog.mauveweb.co.uk/2007/01/23/file-uploads/</link>
		<comments>http://blog.mauveweb.co.uk/2007/01/23/file-uploads/#comments</comments>
		<pubDate>Tue, 23 Jan 2007 21:59:38 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2007/01/23/file-uploads/</guid>
		<description><![CDATA[I have mentioned briefly work that I was doing to wrap file uploading in AJAX for a proper experience. Browser-based file uploads have been downtrodden over the past few years.
In client terms, file uploads work in almost exactly the same way as they have always done: the page blocks while the data is posted, and [...]]]></description>
			<content:encoded><![CDATA[<p>I have mentioned briefly work that I was doing to wrap file uploading in <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> for a proper experience. Browser-based file uploads have been downtrodden over the past few years.</p>
<p>In client terms, file uploads work in almost exactly the same way as they have always done: the page blocks while the data is posted, and a very small progress bar shows up in the status bar. This is a user interface disaster for big files.</p>
<p>On the server side, the situation is more varied, but there is often little support for streaming of file uploads. In <acronym title="PHP: Hypertext Preprocessor">PHP</acronym>, file uploads are read wholly into memory, parsed and saved out to a temporary folder before a script even gets called. The request must fit within both <acronym title="PHP: Hypertext Preprocessor">PHP</acronym>'s file upload size limit and its memory limit. As far as I can tell, something similar happens in Zope although you can argue that Zope allows other standards for upload such as DAV and <acronym title="File Transfer Protocol">FTP</acronym> natively. In plain <acronym title="Common Gateway Interface">CGI</acronym>, of course, there is no handling of the uploads, so if you're using a <acronym title="Common Gateway Interface">CGI</acronym> wrapper, it can do whatever you want to handle this. <acronym title="Practical Extraction and Report Language">Perl</acronym>'s <code><acronym title="Common Gateway Interface">CGI</acronym>.pm</code> module allows a hook, at least. Python's <code>cgi</code> module doesn't, nor is it easy to subclass.</p>
<p>All in all, the situation of binding file uploads to form submissions, and processing of those in common server-side languages is wholly inadequate as file size gets large. File uploads are convenient because they are a commonly-supported fall-back, but the workarounds, although solving some of these problems, don't have the simplicity of a browser-native solution.</p>
<p>In my recent project I looked at ways of working around these limitations. The best workaround for the client-side problems I have found so far is to perform the upload in an &lt;iframe&gt;, using <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> queries to present a progress bar. This still has problems, notably that it's one file at a time, both on the choosing and the uploading. In Firefox I can actually perform two concurrent uploads in different &lt;iframes&gt;, but the <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> progress bar doesn't then update.</p>
<p>Server-side, I wrote the whole thing as a webserver so that the <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> queries could talk directly to the thread streaming the upload. Additionally I wrote my own parser to parse on-the-fly the data uploaded, so that the daemon knows what is uploading at any given stage. It works quite well, and the system is extensible in that it could combine a daemon that allows other forms of upload; feedback for these would also appear in the browser windows.</p>
<p>Even so, I wish that file uploading was something people were thinking about more. It's central to so many web applications now.</p>
<p>There are numerous problems:</p>
<ul>
<li>File uploads are synchronous. Downloads can happen in the background in their own, but uploads can't.</li>
<li>File uploads don't have a proper <acronym title="User Interface">UI</acronym>. Current browsers appear to show a tiny upload bar that isn't really very accurate and doesn't give data rates or estimated time remaining.</li>
<li>Uploads are chosen one at a time.</li>
<li>Javascript can't be used for polish. The model that has empowered Web 2.0 improvements is that of taking an existing <acronym title="HyperText Markup Language">HTML</acronym>/HTTP model and allowing it to be controlled by Javascript. However, there is no way into the uploading or the file selection processes with Javascript.</li>
</ul>
<p>The most general solution I can see would provide a Javascript <acronym title="	Application Programming Interface">API</acronym> for uploading. This would allow Javascript to show a (native) file chooser dialog, and instruct the browser on what to do with the files it returns. POST or PUT to the origin server seem useful, as does <acronym title="File Transfer Protocol">FTP</acronym> upload. Clearly there are security concerns, but I fail to see how, as long as Javascript may instigate an operation, read upload statistics, but not read the filesystem, this presents a problem.</p>
<p>Perhaps an <acronym title="Asynchronous JavaScript and XML">AJAX</acronym>-style <acronym title="	Application Programming Interface">API</acronym> could be along these lines:</p>
<pre><code><span style="color: #009900; font-style: italic;">//configure a native dialog to present to the user</span>
<span style="color: #003366; font-weight: bold;">var</span> ufc=<span style="color: #003366; font-weight: bold;">new</span> UploadFileChooser<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
ufc.<span style="color: #006600;">setAcceptableFileTypes</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'image/jpeg'</span>, <span style="color: #3366CC;">'image/png'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #003366; font-weight: bold;">var</span> uploads=ufc.<span style="color: #006600;">chooseFiles</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;

<span style="color: #000066; font-weight: bold;">for</span> each <span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> u <span style="color: #000066; font-weight: bold;">in</span> uploads<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
u.<span style="color: #006600;">onreadystatechange</span>=doSomething; <span style="color: #009900; font-style: italic;">//callback</span>
<span style="color: #009900; font-style: italic;">//this <acronym title="Uniform Resource Locator">URL</acronym> is constrained the origin server to prevent <acronym title="Cross-site scripting">XSS</acronym></span>
u.<span style="color: #006600;">beginHttpPost</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'http://example.com/upload'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></code></pre>
<p>After this, the user could close the tab or leave the page, and the browser would upload the files in the background, perhaps with a progress bar appearing within the Downloads window. Note that it could queue the files rather than uploading them all at once, depending on user settings. The Javascript, and indeed the user, should be able to request that an upload is aborted. The Javascript should also be able to query the upload, using the object reference provided.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2007/01/23/file-uploads/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scriptable Interfaces Revisited</title>
		<link>http://blog.mauveweb.co.uk/2006/11/03/scriptable-interfaces-revisited/</link>
		<comments>http://blog.mauveweb.co.uk/2006/11/03/scriptable-interfaces-revisited/#comments</comments>
		<pubDate>Fri, 03 Nov 2006 01:27:22 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2006/11/03/scriptable-interfaces-revisited/</guid>
		<description><![CDATA[I solved my problem mentioned in my last post by creating my own scriptable interface in Python.
Happily, I had decoded enough of the database format to be able to write a class &#8211; about 50 lines of Python &#8211; which encapsulates the configuration I needed to modify, and the ability to store it into the [...]]]></description>
			<content:encoded><![CDATA[<p>I solved my problem mentioned in my last post by creating my own scriptable interface in Python.</p>
<p>Happily, I had decoded enough of the database format to be able to write a class &#8211; about 50 lines of Python &#8211; which encapsulates the configuration I needed to modify, and the ability to store it into the database (I didn't fully implement reading the old configuration from the database though).</p>
<p>Then I was able to do the reconfiguration as simple object instantiation and member function calls. As expected, it was much easier than logging in as administrator for each <acronym title="Content Management System">CMS</acronym> in turn, going through the interface to find the configuration page required, and updating and saving it.</p>
<p>There were a number of advantages:</p>
<ul>
<li>All the configuration to be input was collected at the bottom of the script, together on one page, so it was easy to check that everything was present and correct.</li>
<li>The script can be re-run at any point, so it's maintainable.</li>
<li>The script performs some checks to ensure the new configuration is valid.</li>
</ul>
<p>Obviously, it would be easier if Joomla offered this kind of capability so it didn't have to be maintained separately in Python. Joomla is written in <acronym title="PHP: Hypertext Preprocessor">PHP</acronym>, but that doesn't mean you can just write a <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> script that loads up Joomla's classes and tweaks them as I've described. <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> doesn't have <code>import</code> semantics, so you need knowledge about what has to be included and in what order. It also doesn't have a very strong object model so trying to make object manipulations correspond to data manipulations is inherently inconvenient. Finally, Joomla's <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> objects are comprised, as far as I've examined, of monolithic functions that do a lot of procedural steps rather than small, reusable functions.</p>
<p>So I'm one step closer to defining exactly what I need here for administering web applications. I need to be able to write administration scripts quickly, without prior knowledge of the application's internals (ideally using interactive introspection to obtain the knowledge I need).</p>
<ol>
<li><strong>An <acronym title="	Application Programming Interface">API</acronym> which allows me to succinctly retrieve and manipulate the application's data. </strong>This should be object-oriented so that for any object I'm handed, I know what operations I can perform with it. The structure of the object model should reflect the way the data is presented in the web app's front end, so that I go blindly using what I see of the web app's data model.</li>
<li><strong>A very low overhead in terms of lines of code for getting up and running.</strong> I don't want to learn code by rote just so I can bootstrap this <acronym title="	Application Programming Interface">API</acronym>.</li>
<li><strong>Implicit or succinct persistence for the objects I've retrieved.</strong> I can call <code>store()</code> on each object I modify, if I must, but implicit persistence (ie. everything is automatically updated when the script ends) will better allow the <acronym title="	Application Programming Interface">API</acronym> to handle <acronym title="Atomicity, Consistency, Isolation and Durability">ACID</acronym> for me.</li>
<li><strong>No <acronym title="Structured Query Language">SQL</acronym> queries</strong>. I don't want to have to understand the database structure. I also don't care about efficiency in this instance so just hand me a list of all the objects and I'll filter it myself.</li>
<li><strong>No using built-in types to represent abstract data.</strong> For example, no using associative arrays to represent objects. A class for everything, with useful member functions, please. I don't want to have to work out the semantics or write any code that might already exist in the application.</li>
<li><strong>A few <acronym title="Command-Line Interface">CLI</acronym> utilities that use this <acronym title="	Application Programming Interface">API</acronym>.</strong> Not only can these perform useful tasks, but they prove the <acronym title="	Application Programming Interface">API</acronym> works, is succinct, and gives examples of it in use that I can copy.</li>
</ol>
<p>Note that the <acronym title="	Application Programming Interface">API</acronym> doesn't need to remain backwardly compatible. I'm happy to modify my management scripts. The aim is for the scripts to be as brief as possible, so it shouldn't be hard to tweak them if the data model is changed (improved, we hope).</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2006/11/03/scriptable-interfaces-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web apps need scriptable interfaces</title>
		<link>http://blog.mauveweb.co.uk/2006/11/01/web-apps-need-scriptable-interfaces/</link>
		<comments>http://blog.mauveweb.co.uk/2006/11/01/web-apps-need-scriptable-interfaces/#comments</comments>
		<pubDate>Wed, 01 Nov 2006 00:59:06 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2006/11/01/web-apps-need-scriptable-interfaces/</guid>
		<description><![CDATA[I was just working on a set of separate Joomla installations for a client today when I realised that I really needed to be able to run scripts against the different installations.
I was trying to install three different Mambots (one of Joomla's three different types of extensions) in about 8 installations of Joomla &#8211; each [...]]]></description>
			<content:encoded><![CDATA[<p>I was just working on a set of separate <a href="http://joomla.org/">Joomla</a> installations for a client today when I realised that I really needed to be able to run scripts against the different installations.</p>
<p>I was trying to install three different Mambots (one of Joomla's three different types of extensions) in about 8 installations of Joomla &#8211; each with different database configurations and paths, and having started out with a Bash script to merely copy the plugin files into place, I realised that because automating the whole operation would involve reading a configuration file in <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> syntax and performing some queries in MySQL with it, coding this would probably take longer than installing the plugins manually.</p>
<p>There are not very many web apps which have any kind of scriptable <acronym title="	Application Programming Interface">API</acronym>. In fact, I only really know of <a href="http://www.gnu.org/software/mailman/">Mailman</a>, which is only partly a web application. But it's a feature I've used frequently in Mailman &#8211; there is a script <code>bin/withlist</code> which acquires locks and opens the list, allows you to modify the list as a Python object, and saves it on exit. Mailman provides a few <acronym title="Command-Line Interface">CLI</acronym> tools too which can be used in scripting but which are really only trivial examples of the power of the scriptable <acronym title="	Application Programming Interface">API</acronym>.</p>
<p>When I began writing <a href="http://www.mauveinternet.co.uk/products.xml">Mailhammer</a>, my own announcement-only mailing list software, I took this scriptability even futher based on my positive experience with Mailman's scriptable <acronym title="	Application Programming Interface">API</acronym>. All of the working parts are implemented in Python, and the <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> is just an <acronym title="HyperText Markup Language">HTML</acronym> wrapper which opens and talks to a <acronym title="Command-Line Interface">CLI</acronym> Python script over pipes. This means that the <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> is kept extremely simple, and the Python core is a very clean and simple <acronym title="	Application Programming Interface">API</acronym>, and that the <acronym title="Command-Line Interface">CLI</acronym> can do everything reliably. It's a cleanly divided implementation of an <em>n</em>-tier architecture. In fact in practice, I only use the web interface for viewing the data already in the database. Consequently, that interface isn't very powerful &#8211; yet!</p>
<p>Python is well-suite for scriptable <acronym title="	Application Programming Interface">APIs</acronym> &#8211; its interactive interpreter and neat object model mean that it's easy to perform arbitrary operations interactively on complex, persistent data structures. In <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> web applications it might be more feasible to build an <acronym title="eXtensible Markup Language">XML</acronym>-<acronym title="Remote Procedure Call">RPC</acronym> interface of some kind and provide a command-line client.</p>
<p>I don't think that scriptability is considered as even a <em>potential</em> feature for almost any web application I've tried;  their operation is tied inextricably to their unique interfaces.</p>
<p>For anybody developing a new web application please ask yourself this: will administrators using your software want to be locked in to your pretty and easy-to-use interface, or will they end up cursing you for failing to provide them with power beyond what <acronym title="HyperText Markup Language">HTML</acronym> can provide?</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2006/11/01/web-apps-need-scriptable-interfaces/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Picasa Web Albums</title>
		<link>http://blog.mauveweb.co.uk/2006/09/21/picasa-web-albums/</link>
		<comments>http://blog.mauveweb.co.uk/2006/09/21/picasa-web-albums/#comments</comments>
		<pubDate>Thu, 21 Sep 2006 01:53:52 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[e-Commerce]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/2006/09/21/picasa-web-albums/</guid>
		<description><![CDATA[Well what do you know&#8230; what with all my recent work with client-side scripting and then today's look at Mauvesoft Gallery and scanning for photos, I was just thinking about an AJAX-powered web-based Picasa clone when I stumbled across Google's Picasa Web Albums, which I hadn't seen before.
I've uploaded a few photos to it, and [...]]]></description>
			<content:encoded><![CDATA[<p>Well what do you know&#8230; what with all my recent work with client-side scripting and then today's look at <a href="http://www.mauvesoft.co.uk/scripts/">Mauvesoft Gallery</a> and scanning for photos, I was just thinking about an <acronym title="Asynchronous JavaScript and XML">AJAX</acronym>-powered web-based Picasa clone when I stumbled across Google's <a href="http://picasaweb.google.com/">Picasa Web Albums</a>, which I hadn't seen before.</p>
<p>I've uploaded a few photos to it, and it's OK I suppose, but it's not as developed as some of the other Google webapps: it's just a basic web gallery. It's better than <a href="http://gallery.menalto.com/">Gallery</a> (Capital G) because Gallery is a mess these days. Gallery 2.0 is hugely bloated, and for all that bloat it isn't very much more powerful and certainly not as easy to use as Picasa Web albums.</p>
<p>Still, I think Mauvesoft Gallery is a fairly good web gallery core, and it's simple and hackable enough that I could probably rig up some <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> over the top quite easily. It would certainly make for an easy-to-use administration interface, but I was thinking more of the on-the-fly searching, and Picasa's wonderful 'Timeline' feature. I wonder whether the publishing to the world of photos is the main aim when people use web galleries, or is it that they just want access to all their photos wherever they are? (Or a third option: my brother, on holiday, uploads photos from Internet Cafes so that he can delete them from his camera to free up space.)</p>
<p>A fork of Mauvesoft Gallery is used to power the ImageChooser component in <a href="http://www.mauveinternet.co.uk/products.xml">my e-Commerce software</a>, and that is desperate for some attention. The <acronym title="User Interface">UI</acronym> is <em>appalling</em> at the moment. Perhaps I'll download <a href="http://dojotoolkit.org/">Dojo</a> and see if that can speed up the development.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2006/09/21/picasa-web-albums/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mauvesoft Gallery</title>
		<link>http://blog.mauveweb.co.uk/2006/09/20/mauvesoft-gallery/</link>
		<comments>http://blog.mauveweb.co.uk/2006/09/20/mauvesoft-gallery/#comments</comments>
		<pubDate>Wed, 20 Sep 2006 17:35:44 +0000</pubDate>
		<dc:creator>mauve</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://blog.mauveweb.co.uk/?p=15</guid>
		<description><![CDATA[One of my old online friends, Twisted, messaged me this morning to say that he was having problems with his installation of Mauvesoft Gallery. He had reinstalled in on a new Ubuntu box but it was not thumbnailing properly: first it was not generating thumbnails; then, having fixed that, he found that it was not [...]]]></description>
			<content:encoded><![CDATA[<p>One of my old online friends, Twisted, messaged me this morning to say that he was having problems with his installation of <a href="http://www.mauvesoft.co.uk/scripts/">Mauvesoft Gallery</a>. He had reinstalled in on a new Ubuntu box but it was not thumbnailing properly: first it was not generating thumbnails; then, having fixed that, he found that it was not caching them.</p>
<p>Anyway, I tarballed up my unstable development version, 1.5, which adds a few features and fixes a few bugs.</p>
<p><strong>Changelog</strong></p>
<ul>
<li>Feature: <acronym title="PHP: Hypertext Preprocessor">PHP</acronym>-based templates</li>
<li>Feature: Watermarking of thumbnails</li>
<li>Feature: Images now support <acronym title="EXchangeable Image File">EXIF</acronym> captions and titles</li>
<li>Theme: New theme 'corporate'</li>
<li>Theme: 'slides' rewritten in <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> and <acronym title="Cascading Style Sheets">CSS</acronym></li>
<li>Bug: Thumbnail transparent <acronym title="Portable Network Graphics">PNGs</acronym> with GD</li>
<li>Bug: .JPG extensions not considered images</li>
<li>Bug: Directory names containing '+' character</li>
<li>Bug: Imagemagick engine doesn't work with <acronym title="Cyan Magenta Yellow blacK">CMYK</acronym> <acronym title="Joint Photographic Experts Group Image">JPEGs</acronym></li>
</ul>
<p>He installed that and after a few permissions bugs, it's <a href="http://twisted.evangelion.nu/~twisted/gallery-1.5/">up and running</a>.</p>
<p>I suppose this makes it almost ready for an <acronym title="Release Candidate">RC</acronym>. The first alpha is already running on a site I did a couple of months ago for a client, <a href="http://test.photography2you.co.uk/">Photography2you</a>.</p>
<p>When I actually package this for release I'm going to use shar, which I am fairly confident I can use to configure the installation after it has unpacked. All webapps suffer from this installation problem, and there doesn't seem to be a generic solution for installing them, even though there is a very limited range of things that need to be configured to get them off the ground on a single-vhost basis. I can't imagine that it would be hard to write a package manager for them. Mauvesoft Gallery works on Windows and even <acronym title="Internet Information Services">IIS</acronym> too I believe (although I've not tested it recently), but Windows is much more lax on the permissions (although I've not tried Server 2003), so a normal <acronym title="PkZip Archive">ZIP</acronym> file may suffice.</p>
<p>It also occurs to me that as part of this shell-based installer I could offer the user the option to scan their $HOME and symlink any directory it find containing photos (for some definition of photo&#8230; perhaps <acronym title="Joint Photographics Experts Group"><acronym title="Joint Photographic Experts Group Image">JPEG</acronym></acronym> image over 1 Megapixel?) into the Albums root. Zero-configuration installs here we come. The goal is to make Mauvesoft Gallery simpler to install and use than any other gallery software.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mauveweb.co.uk/2006/09/20/mauvesoft-gallery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

