<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.practicalweb.co.uk" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>PracticalWeb Ltd - websites that work for you</title>
 <link>http://www.practicalweb.co.uk/frontpage</link>
 <description>The basic front page view.</description>
 <language>en</language>
<item>
 <title>Drupal file_copy won&#039;t work outside of the Drupal instal</title>
 <link>http://www.practicalweb.co.uk/blog/08/11/11/drupal-filecopy-wont-work-outside-drupal-instal</link>
 <description>&lt;p&gt;&lt;b&gt;The selected file could not be uploaded, because the destination  is not properly configured&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;
This &quot;feature&quot; has bitten me before. It&#039;s one of those annoying Drupal things which would be fine if the error message wasn&#039;t so misleading.
&lt;/p&gt;
&lt;p&gt;
What&#039;s happening is that file_copy() calls file_create_path()
&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;file_copy&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$source&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$dest &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$replace &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;FILE_EXISTS_RENAME&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$dest &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;file_create_path&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$dest&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;While file_copy() doesn&#039;t declare that it only works in the Drupal folders - file_create_path is clear about this.&lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/**&lt;br /&gt; * Make sure the destination is a complete path and resides in the file system&lt;br /&gt; * directory, if it is not prepend the file system directory.&lt;br /&gt; *&lt;br /&gt; * @param $dest A string containing the path to verify. If this value is&lt;br /&gt; *&amp;nbsp;&amp;nbsp; omitted, Drupal&#039;s &#039;files&#039; directory will be used.&lt;br /&gt; * @return A string containing the path to file, with file system directory&lt;br /&gt; *&amp;nbsp;&amp;nbsp; appended if necessary, or FALSE if the path is invalid (i.e. outside the&lt;br /&gt; *&amp;nbsp;&amp;nbsp; configured &#039;files&#039; or temp directories).&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;file_create_path&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$dest &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;
I need to copy files outside of the DocumentRoot to keep them private (yes I could put them in the DocumentRoot and restrict access to the folder but that is just perverse - and easy to get wrong).
&lt;/p&gt;
&lt;p&gt;
So I need to avoid these functions.
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/11/11/drupal-filecopy-wont-work-outside-drupal-instal#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/drupal">Drupal</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/php">PHP</category>
 <pubDate>Tue, 11 Nov 2008 20:52:04 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">76 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Eclipse PDT and Subversion</title>
 <link>http://www.practicalweb.co.uk/blog/08/11/02/eclipse-pdt-and-subversion</link>
 <description>&lt;h2&gt;
Version conflicts to be aware of&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Ubuntu 8.10 (Intrepid Ibex) now ships with Subversion 1.5 
&lt;/p&gt;
&lt;p&gt;
You can&#039;t use a svn 1.4 client and a svn 1.5 client on the same working copy.
&lt;/p&gt;
&lt;p&gt;
While the subversion integration in Eclipse is great I still prefer to do some things on the command line and some with kdesvn.
&lt;/p&gt;
&lt;p&gt;
Then you need to upgrade your subclipse plugin to subclipse 1.4
&lt;/p&gt;
&lt;p&gt;
If you can - then upgrade to Eclipse 3.4 
&lt;/p&gt;
&lt;p&gt;
But Eclipse 3.4 doesn&#039;t run the latest stable version of PDT - and last time I tried to use an Integration build it was unusable - I may try again sometime but right now I want a small upgrade.
&lt;/p&gt;
&lt;p&gt;
I followed this instructions here &lt;a href=&quot;http://subclipse.tigris.org/install.html&quot; title=&quot;http://subclipse.tigris.org/install.html&quot;&gt;http://subclipse.tigris.org/install.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
But Eclipse reported a &amp;quot;Network problem&amp;quot;
&lt;/p&gt;
&lt;p&gt;
So I downloaded the zip file&lt;br /&gt;
&lt;a href=&quot;http://subclipse.tigris.org/files/documents/906/43792/site-1.4.5.zip&quot; title=&quot;http://subclipse.tigris.org/files/documents/906/43792/site-1.4.5.zip&quot;&gt;http://subclipse.tigris.org/files/documents/906/43792/site-1.4.5.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Unpacked it in a folder on my local webserver, pointed Eclipse at this location and the installation worked!
&lt;/p&gt;
&lt;p&gt;
Phew - I have a working Eclipse for PHP development on Ubuntu 8.10
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/11/02/eclipse-pdt-and-subversion#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/eclipse">Eclipse</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/php">PHP</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/svn">svn</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/ubuntu">Ubuntu</category>
 <pubDate>Sun, 02 Nov 2008 17:21:34 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">75 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>IE6 on VirtualBox - installing the network driver</title>
 <link>http://www.practicalweb.co.uk/blog/08/11/02/ie6-virtualbox-installing-network-driver</link>
 <description>&lt;p&gt;
One of the trial of web development is ensuring that your site works across a range of browsers.
&lt;/p&gt;
&lt;p&gt;
Standards compliance is an important part of this - but testing cannot be avoided.
&lt;/p&gt;
&lt;p&gt;
I work on Ubuntu, and use VirtualBox together with a licensed copy of Windows XP to test in a Windows environment, which also allows me to at least test the Sindows version of Safari.
&lt;/p&gt;
&lt;p&gt;
Unfortunately Microsoft&#039;s decision to tie Internet Explorer closely with the operating system means that it isn&#039;t possible to install IE6 alongside IE7.
&lt;/p&gt;
&lt;p&gt;
(&lt;a href=&quot;http://tredosoft.com/Multiple_IE&quot;&gt;Multiple IEs&lt;/a&gt; gets close but doesn&#039;t exactly replicate each version, and isn&#039;t compatible with the IE developer toolbar)
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blogs.msdn.com/ie/archive/2006/11/30/ie6-and-ie7-running-on-a-single-machine.aspx%22&quot;&gt;Microsoft have recognised the problem&lt;/a&gt; and do provide an &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2006/11/30/ie6-and-ie7-running-on-a-single-machine.aspx&quot;&gt;Internet Explorer Application Compatibility VPC Image&lt;/a&gt; which allows you to create a virtual Windows with IE6 installed
&lt;/p&gt;
&lt;p&gt;
It is possible to &lt;a href=&quot;http://blog.mozmonkey.com/2008/vpc-ie6-ie7-ie8-on-mac-os-x/&quot;&gt;convert this image for use in VirtualBox&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
But I couldn&#039;t initially get the network working. What I had missed is that you have to
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;go into the VirtualBox settings for this virtual machine &lt;/li&gt;
&lt;li&gt;in the to select the network section &lt;/li&gt;
&lt;li&gt;specify the &amp;quot;PCnet-PCI II (am79C970A)&amp;quot; network adpator &lt;/li&gt;
&lt;li&gt;boot up the vitual machine&lt;/li&gt;
&lt;li&gt;Windows will try and install the Driver&lt;/li&gt;
&lt;li&gt;Specify a location manually&lt;/li&gt;
&lt;li&gt;Browse to D:\32Bit\Windows\3rdParty\AMD_PCnet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The above assumes you have already installed the Guest Additions.
&lt;/p&gt;
&lt;p&gt;
This should succesfuly install the network driver - it worked for me.
&lt;/p&gt;
&lt;p&gt;
I now have a true copy of IE6 on Ubuntu and can test away.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/11/02/ie6-virtualbox-installing-network-driver#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/linux">Linux</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/testing">testing</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/ubuntu">Ubuntu</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/web-development">Web Development</category>
 <pubDate>Sun, 02 Nov 2008 12:03:49 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">74 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Ubuntu 8.10</title>
 <link>http://www.practicalweb.co.uk/blog/08/11/01/ubuntu-810</link>
 <description>&lt;p&gt;
Having just upgraded to Ubuntu 8.10 my key observation is that it&#039;s important to read the release notes first.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.ubuntu.com/getubuntu/releasenotes/810&quot; title=&quot;http://www.ubuntu.com/getubuntu/releasenotes/810&quot;&gt;http://www.ubuntu.com/getubuntu/releasenotes/810&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
There are a few bugs which have affected me
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;there is no bluetooth support in KDE&lt;/li&gt;
&lt;li&gt;my wifi card only works in the US&lt;br /&gt;
	(there&#039;s a workaround and I&#039;m back online)&lt;/li&gt;
&lt;li&gt; Dual head display with xrandr is causing problems&lt;br /&gt;
	(my screen flashes and KDE is putting widgets in parts of the screen I can&#039;t see)&lt;/li&gt;
&lt;li&gt;Subversion has moved to version 1.5 and getting Eclipse to use a compatible svn library is proving tricky&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
On the plus side KDE 4.1 is looking very pretty, and the move to subversion 1.5 will be very useful in the long run.
&lt;/p&gt;
&lt;p&gt;
I had hoped to get my 3G connection working as a previous update seems to have broken it - but so far still no joy.
&lt;/p&gt;
&lt;p&gt;
update:&lt;br /&gt;
There&#039;s a solution for the Kubuntu Intrepid Dual Monitor Blinking&lt;br /&gt;
issue here: &lt;a href=&quot;http://blog.nixternal.com/2008.10.22/kubuntu-intrepid-dual-monitor-blinking/&quot; title=&quot;http://blog.nixternal.com/2008.10.22/kubuntu-intrepid-dual-monitor-blinking/&quot;&gt;http://blog.nixternal.com/2008.10.22/kubuntu-intrepid-dual-monitor-blink...&lt;/a&gt;
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/11/01/ubuntu-810#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/3g">3G</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/eclipse">Eclipse</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/kde">KDE</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/linux">Linux</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/svn">svn</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/ubuntu">Ubuntu</category>
 <pubDate>Sat, 01 Nov 2008 23:01:43 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">73 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>How to read compressed Apache docs </title>
 <link>http://www.practicalweb.co.uk/blog/08/10/18/how-read-compressed-apache-docs</link>
 <description>&lt;p&gt;
One of the great things about Debian/Ubuntu is the consistency with which system documentation is placed in /usr/share/doc/
&lt;/p&gt;
&lt;p&gt;
Assuming you have a web server installed this documentation is then available at &lt;a href=&quot;http://localhost/doc/&quot; title=&quot;http://localhost/doc/&quot;&gt;http://localhost/doc/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
But to keep filesize down - many files are compressed and have to be decompressed before you can read them.
&lt;/p&gt;
&lt;p&gt;
The browser can actually do that compression on the fly - if it receives the right headers - what it needs to be told is that the content is compressed plain text.
&lt;/p&gt;
&lt;p&gt;
To achieve this add the following lines to your default apache config for the docs directory (there should already be a docs section)
&lt;/p&gt;
&lt;p&gt;
&amp;lt;Directory &amp;quot;/usr/share/doc/&amp;quot;&amp;gt;&lt;br /&gt;
AddEncoding x-gzip gz tgz&lt;br /&gt;
AddType text/plain .gz&lt;br /&gt;
&amp;lt;/Direcory&amp;gt;
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/10/18/how-read-compressed-apache-docs#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/debian">Debian</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/documentation">documentation</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/linux">Linux</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/ubuntu">Ubuntu</category>
 <pubDate>Sat, 18 Oct 2008 10:26:38 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">72 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>svnversion</title>
 <link>http://www.practicalweb.co.uk/blog/08/10/16/svnversion</link>
 <description>&lt;p&gt;
I just discovered a nifty little utility
&lt;/p&gt;
&lt;p&gt;
Often working copies are only partially updated, this command gives a very quick command-line summary of the state of the working copy.
&lt;/p&gt;
&lt;p&gt;
It&#039;s not as rich an output as kdesvn which will colour code all the updateable files, but its a standard part of svn so should always be available.
&lt;/p&gt;
&lt;h2&gt;Name&lt;/h2&gt;
&lt;p&gt;
svnversion — Summarize the local revision(s) of a working                    copy.
&lt;/p&gt;
&lt;div class=&quot;refsect1&quot;&gt;
&lt;h2&gt;Synopsis&lt;/h2&gt;
&lt;pre class=&quot;programlisting&quot;&gt;
svnversion [OPTIONS] WC_PATH [TRAIL_URL]
&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;refsect1&quot;&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;
&lt;span&gt;&lt;strong class=&quot;command&quot;&gt;svnversion&lt;/strong&gt;&lt;/span&gt; is a program for&lt;br /&gt;
summarizing the revision mixture of a working copy.  The&lt;br /&gt;
resultant revision number, or revision range, is written to&lt;br /&gt;
standard output.
&lt;/p&gt;
&lt;p&gt;
TRAIL_URL, if present, is the trailing portion of the&lt;br /&gt;
URL used to determine if WC_PATH itself is switched&lt;br /&gt;
(detection of switches within WC_PATH does not rely on&lt;br /&gt;
TRAIL_URL).
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;refsect1&quot;&gt;
&lt;p&gt;
If the working copy is all at the same revision (for&lt;br /&gt;
example, immediately after an update), then that revision is&lt;br /&gt;
printed out:
&lt;/p&gt;
&lt;pre class=&quot;screen&quot;&gt;
$ svnversion .
4168
&lt;/pre&gt;&lt;p&gt;
For a mixed-revision working copy, the range of&lt;br /&gt;
revisions present is printed:
&lt;/p&gt;
&lt;pre class=&quot;screen&quot;&gt;
$ svnversion .
4123:4168
&lt;/pre&gt;&lt;/div&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/10/16/svnversion#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/programming">programming</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/svn">svn</category>
 <pubDate>Thu, 16 Oct 2008 10:25:40 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">71 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Number Crunching : Database vs OOP</title>
 <link>http://www.practicalweb.co.uk/blog/08/10/05/number-crunching-database-vs-oop</link>
 <description>&lt;p&gt;
For the last few months I&#039;ve been working on a project that is part website and part data processing.
&lt;/p&gt;
&lt;p&gt;
In theory the website is the bulk of the project, but in practice processing the data has taken a disproportionate amount of resources.
&lt;/p&gt;
&lt;p&gt;
Data exchange with another organisation is always tricky - and in this case we have incoming data that doesn&#039;t conform to specification, business rules that change, and a daily data import to run.
&lt;/p&gt;
&lt;p&gt;
The code I&#039;ve been working on has been through a couple of versions, and now I have in mind a third
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;process data from file a line at a time, comparing each record with the database individually&lt;/li&gt;
&lt;li&gt;load all data from file into a temporary table, apply all rules as SQL updates to the whole table - joined to other tables where comparisons are needed.&lt;/li&gt;
&lt;li&gt;load all data from file into a temporary table, retrieving data joined with the comparison data - process in batches say 1000 lines at a time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Version 1 was impossibly slow, and it was bad code we inherited so it had to go.
&lt;/p&gt;
&lt;p&gt;
Version 2 is much faster, but as the business rules are documented per record and we&#039;re performing set based operations it has proved very hard to verify that the code matches the required logic.  It&#039;s also very hard to unit test as all the logic is performed in the database.
&lt;/p&gt;
&lt;p&gt;
Version 3 probably won&#039;t get written now - as is the way of programming - you always learn how you&#039;d do it next time.
&lt;/p&gt;
&lt;p&gt;
I have one colleague in particular who thinks that the database should do the heavy lifting as that is what it is optimised for, and to an extent I agree. But the more I get into unit testing the more I want to write code that neatly packages up logic in a testable way.
&lt;/p&gt;
&lt;p&gt;
It has also become apparent just how important it is to have code that follows business rules in a clear way. It&#039;s not enough that the output should be right. I recently handed this code to a very capable developer - he&#039;s normally so polite - but trying to reconcile a flowchart with a long series of SQL queries tested his patience.
&lt;/p&gt;
&lt;p&gt;
In the end leaning so hard on the database has made the system much harder to read, test, change, and maintain.
&lt;/p&gt;
&lt;p&gt;
I wonder if version 3 would be any slower anyway - it might even be faster. In fact version 3 could be run multithreaded - or split into multiple processes....
&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/10/05/number-crunching-database-vs-oop#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/best-practice">best practice</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/oop">OOP</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/sql">SQL</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/testing">testing</category>
 <pubDate>Sun, 05 Oct 2008 09:50:21 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">70 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Software Estimation</title>
 <link>http://www.practicalweb.co.uk/review/software-estimation</link>
 <description>&lt;p&gt;
This is another great book by Steve McConnell.
&lt;/p&gt;
&lt;p&gt;
His empahsis is on large projects with thourough development processes; he gives many examples of rigorous studes that back up his advice.
&lt;/p&gt;
&lt;p&gt;
If you follow all the advice in this book - you&#039;ll be able to make very accurate estimates with a clear idea of the risks involved.
&lt;/p&gt;
&lt;p&gt;
Even if you don&#039;t need so much detail - the book provides many tips to greatly improve the accuracy of even rough calculations. 
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Tip #1  Distinguish between estimates, targets and commitments.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;
Tip #31 Look for something you can count that is a meaningful measure of the scope of work in your environment.
&lt;/p&gt;&lt;/blockquote&gt;
</description>
 <comments>http://www.practicalweb.co.uk/review/software-estimation#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/best-practice">best practice</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/programming">programming</category>
 <pubDate>Sun, 05 Oct 2008 09:14:13 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">69 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Drupal multisite with shared tables</title>
 <link>http://www.practicalweb.co.uk/blog/08/08/07/drupal-multisite-shared-tables</link>
 <description>&lt;p&gt;Drupal allows you to create multiple sites sharing some or all of the same code and optionally sharing some database tables.&lt;/p&gt;
&lt;p&gt;The documentation for the Drupal settings file&lt;br /&gt;
&lt;a href=&quot;http://api.drupal.org/api/file/sites/default/settings.php/5/source&quot; title=&quot;http://api.drupal.org/api/file/sites/default/settings.php/5/source&quot;&gt;http://api.drupal.org/api/file/sites/default/settings.php/5/source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;includes the following &lt;/p&gt;
&lt;p&gt;&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/*&lt;br /&gt; * To have all database names prefixed, set $db_prefix as a string:&lt;br /&gt; *&lt;br /&gt; *&amp;nbsp;&amp;nbsp; $db_prefix = &#039;main_&#039;;&lt;br /&gt; *&lt;br /&gt; * To provide prefixes for specific tables, set $db_prefix as an array.&lt;br /&gt; * The array&#039;s keys are the table names and the values are the prefixes.&lt;br /&gt; * The &#039;default&#039; element holds the prefix for any tables not specified&lt;br /&gt; * elsewhere in the array. Example:&lt;br /&gt; *&lt;br /&gt; *&amp;nbsp;&amp;nbsp; $db_prefix = array(&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;default&#039;&amp;nbsp;&amp;nbsp; =&amp;gt; &#039;main_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;users&#039;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; &#039;shared_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;sessions&#039;&amp;nbsp; =&amp;gt; &#039;shared_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;role&#039;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; &#039;shared_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;authmap&#039;&amp;nbsp;&amp;nbsp; =&amp;gt; &#039;shared_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#039;sequences&#039; =&amp;gt; &#039;shared_&#039;,&lt;br /&gt; *&amp;nbsp;&amp;nbsp; );&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This allows you to have several related sites which might (for example) share user tables so that users have single sign on, while having different tables for content.&lt;/p&gt;
&lt;p&gt;Note that to get this functionality the sites have to share a single database.&lt;/p&gt;
&lt;p&gt;I&#039;ve never quite seen the point of multi site Drupal installs for unrelated projects, in theory this could save on upgrade work - but in practice I&#039;d rather have the greater control that separate install gives you.&lt;/p&gt;
&lt;p&gt;For a family of websites I can see a multi site install with some shared data being a really powerful and effective solution.&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/blog/08/08/07/drupal-multisite-shared-tables#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/drupal">Drupal</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/sql">SQL</category>
 <pubDate>Thu, 07 Aug 2008 11:42:21 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">68 at http://www.practicalweb.co.uk</guid>
</item>
<item>
 <title>Don&#039;t make me think!</title>
 <link>http://www.practicalweb.co.uk/review/dont-make-me-think</link>
 <description>&lt;p&gt;This book is well written, short, and clear.&lt;/p&gt;
&lt;p&gt;It has reassured me about much of what I do - and given me some pointers for areas I can improve on.&lt;/p&gt;
&lt;p&gt;One of the great things about this book is the way it addresses the combination of technical and political issues that web projects can get bogged down in - it has a nice section called &quot;Help my boss wants me to ___&quot; with some good sample letters to the boss.&lt;/p&gt;
&lt;p&gt;It really brings home that conventions are useful - and you need to test the site on users - little and often.&lt;/p&gt;
&lt;p&gt;I&#039;m a bit surprised that the second edition doesn&#039;t deal with web 2.0 issues. There is a lot of (good) discussion on navigation hierarchies - but no acknowledgement of the more free flowing practices like content tagging.&lt;/p&gt;
&lt;p&gt;There is useful guidance on forms - but nothing on the newer issues of AJAX feedback mechanisms.&lt;/p&gt;
&lt;p&gt;But the book can be forgiven these faults because its just so easy to read and absorb, other issues can be left to further reading.&lt;/p&gt;
</description>
 <comments>http://www.practicalweb.co.uk/review/dont-make-me-think#comments</comments>
 <category domain="http://www.practicalweb.co.uk/category/tags/testing">testing</category>
 <category domain="http://www.practicalweb.co.uk/category/tags/usability">usability</category>
 <pubDate>Wed, 06 Aug 2008 08:43:44 +0000</pubDate>
 <dc:creator>sean</dc:creator>
 <guid isPermaLink="false">67 at http://www.practicalweb.co.uk</guid>
</item>
</channel>
</rss>
