<?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"
	>

<channel>
	<title>Developer Blog</title>
	<atom:link href="http://developerblog.acidcs.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://developerblog.acidcs.co.uk</link>
	<description>Website designer and software developer blog from Acid Computer Services</description>
	<pubDate>Wed, 16 Apr 2008 10:12:59 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Bug when using MySQL from ASP</title>
		<link>http://developerblog.acidcs.co.uk/2008/04/16/bug-when-using-mysql-from-asp/</link>
		<comments>http://developerblog.acidcs.co.uk/2008/04/16/bug-when-using-mysql-from-asp/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 09:56:11 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
		
		<category><![CDATA[Website Development]]></category>

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

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

		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/?p=13</guid>
		<description><![CDATA[I have recently been upgrading a site written in classic ASP to use MySQL instead of SQL Server - a relatively straightforward task given the availability of an ODBC driver for MySQL. Testing on our development server, the new code worked perfectly.
Once uploaded to our hosting server, however, the site no longer worked correctly. More [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently been upgrading a site written in classic ASP to use MySQL instead of SQL Server - a relatively straightforward task given the availability of an ODBC driver for MySQL. Testing on our development server, the new code worked perfectly.</p>
<p>Once uploaded to our hosting server, however, the site no longer worked correctly. More specifically, the page that was supposed to &#8216;list all properties&#8217; was reporting that there were no properties in the database. This was definitely not the case! The connection string and code were identical on our development server and the hosting server.</p>
<p>A little debugging showed that the ODBC driver was actually returning an empty result set (0 rows) on a particular query. Some digging through Google showed that this is a known bug in old version of the MySQL ODBC driver.</p>
<p>It turns out, however, that older version of this driver have an annoying bug that causes some (valid) queries to fail silently and return an empty result set.</p>
<p>Dan.</p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2008/04/16/bug-when-using-mysql-from-asp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paul Davies joins our software development team</title>
		<link>http://developerblog.acidcs.co.uk/2008/04/14/paul-davies-joins-our-software-development-team/</link>
		<comments>http://developerblog.acidcs.co.uk/2008/04/14/paul-davies-joins-our-software-development-team/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 10:05:14 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[General]]></category>

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

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

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

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/?p=20</guid>
		<description><![CDATA[Today we welcome a new member to our software development team - Paul Davies.
Paul has a computer science degree from Staffordshire University and has a wealth of commercial experience developing C#.NET systems.
]]></description>
			<content:encoded><![CDATA[<p>Today we welcome a new member to our <a href="http://www.acidcs.co.uk/software-development.htm">software development</a> team - Paul Davies.</p>
<p>Paul has a computer science degree from Staffordshire University and has a wealth of commercial experience developing C#.NET systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2008/04/14/paul-davies-joins-our-software-development-team/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ryan Murray joins our web development team</title>
		<link>http://developerblog.acidcs.co.uk/2008/03/17/ryan-murray-joins-our-web-development-team/</link>
		<comments>http://developerblog.acidcs.co.uk/2008/03/17/ryan-murray-joins-our-web-development-team/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 08:30:29 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[General]]></category>

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

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

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

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/?p=19</guid>
		<description><![CDATA[Today we welcome a new member to our web development team - Ryan Murray.
Ryan has a computer science degree from Edinburgh University and has a wealth of commercial experience developing dynamic database-driven websites.
]]></description>
			<content:encoded><![CDATA[<p>Today we welcome a new member to our <a href="http://www.acidcs.co.uk/website-development.htm">web development</a> team - Ryan Murray.</p>
<p>Ryan has a computer science degree from Edinburgh University and has a wealth of commercial experience developing dynamic database-driven websites.</p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2008/03/17/ryan-murray-joins-our-web-development-team/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Encircle Marketing Website Launched</title>
		<link>http://developerblog.acidcs.co.uk/2008/01/16/encircle-marketing-website-launched/</link>
		<comments>http://developerblog.acidcs.co.uk/2008/01/16/encircle-marketing-website-launched/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 13:56:12 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Website Design]]></category>

		<category><![CDATA[Website Development]]></category>

		<category><![CDATA[encircle marketing]]></category>

		<category><![CDATA[web design]]></category>

		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/?p=18</guid>
		<description><![CDATA[Encircle Marketing are a market research company specialising in the automotive aftermarket.
Acid Computer Services have designed and developed their new website.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.encircle-marketing.com/">Encircle Marketing</a> are a market research company specialising in the automotive aftermarket.</p>
<p>Acid Computer Services have <a href="http://www.acidcs.co.uk/design-website-design.htm">designed</a> and <a href="http://www.acidcs.co.uk/website-development.htm">developed</a> their <a href="http://www.encircle-marketing.com/">new website</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2008/01/16/encircle-marketing-website-launched/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cast UK Website Launched</title>
		<link>http://developerblog.acidcs.co.uk/2007/12/20/cast-uk-website-launched/</link>
		<comments>http://developerblog.acidcs.co.uk/2007/12/20/cast-uk-website-launched/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 09:28:21 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Website Design]]></category>

		<category><![CDATA[Website Development]]></category>

		<category><![CDATA[cast uk]]></category>

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

		<category><![CDATA[web design]]></category>

		<category><![CDATA[web development]]></category>

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

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/?p=17</guid>
		<description><![CDATA[Today we are proud to announce the launch of the new Cast UK website, for which Acid Computer Services have been solely responsible for the website development.
For recruiters, Cast UK can help with the following executive recruitment:

Procurement Recruitment
Supply Chain Recruitment
Logistics Recruitment
Engineering Recruitment
Manufacturing Recruitment

For job seekers, Cast UK can help you find a job in the [...]]]></description>
			<content:encoded><![CDATA[<p>Today we are proud to announce the launch of the new <a href="http://www.castuk.com">Cast UK website</a>, for which Acid Computer Services have been solely responsible for the <a href="http://www.acidcs.co.uk/website-development.htm">website development</a>.</p>
<p><strong>For recruiters</strong>, Cast UK can help with the following executive recruitment:</p>
<ul>
<li><a href="http://www.castuk.com/">Procurement Recruitment</a></li>
<li><a href="http://www.castuk.com/">Supply Chain Recruitment</a></li>
<li><a href="http://www.castuk.com/">Logistics Recruitment</a></li>
<li><a href="http://www.castuk.com/">Engineering Recruitment</a></li>
<li><a href="http://www.castuk.com/">Manufacturing Recruitment</a></li>
</ul>
<p><strong>For job seekers</strong>, Cast UK can help you find a job in the following sectors:</p>
<ul>
<li><a href="http://www.castuk.com/purchasing-job-vacancies.php">Procurement Jobs</a></li>
<li><a href="http://www.castuk.com/supply-chain-job-vacancies.php">Supply Chain Jobs</a></li>
<li><a href="http://www.castuk.com/logistics-job-vacancies.php">Logistics Jobs</a></li>
<li><a href="http://www.castuk.com/manufacturing-engineering-job-vacancies.php">Engineering Jobs</a></li>
<li><a href="http://www.castuk.com/manufacturing-engineering-job-vacancies.php">Manufacturing Jobs</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2007/12/20/cast-uk-website-launched/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Passion For Perfume Launched</title>
		<link>http://developerblog.acidcs.co.uk/2007/08/15/passion-for-perfume-launched/</link>
		<comments>http://developerblog.acidcs.co.uk/2007/08/15/passion-for-perfume-launched/#comments</comments>
		<pubDate>Wed, 15 Aug 2007 12:44:43 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/2007/08/15/passion-for-perfume-launched/</guid>
		<description><![CDATA[We have recently launched the new website for high street perfume retailer Passion For Perfume, which has been designed and developed by Acid Computer Services.
Passion For Perfume currently have 35 perfume stores across the UK and now have a full ecommerce store to help continue their fast expansion plans. The new online store sells a large [...]]]></description>
			<content:encoded><![CDATA[<p>We have recently launched the new website for high street perfume retailer <a title="www.passionforperfume.co.uk" href="http://www.passionforperfume.co.uk">Passion For Perfume</a>, which has been designed and developed by Acid Computer Services.</p>
<p>Passion For Perfume currently have 35 <a title="UK Perfume Stores" href="http://www.passionforperfume.co.uk/Perfume-Stores/">perfume stores across the UK</a> and now have a full ecommerce store to help continue their fast expansion plans. The new <a title="Online Perfume Store" href="http://www.passionforperfume.co.uk/">online store</a> sells a large range of <a title="Mens Designer Aftershave" href="http://www.passionforperfume.co.uk/Aftershave/">men&#8217;s designer aftershaves</a> and <a href="http://www.passionforperfume.co.uk/Perfume/">women&#8217;s designer perfumes</a> from top brands such as <a title="Bvlgari Aftershave" href="http://www.passionforperfume.co.uk/Aftershave/Bvlgari/">Bvlgari</a>, <a title="Hugo Boss Aftershave" href="http://www.passionforperfume.co.uk/Aftershave/Hugo-Boss/">Hugo Boss</a>, <a title="Ralph Lauren Perfume" href="http://www.passionforperfume.co.uk/Perfume/Ralph-Lauren/">Ralph Lauren</a>, <a title="Dolce and Gabbana Perfume" href="http://www.passionforperfume.co.uk/Perfume/Dolce-%2526-Gabbana/">Dolce and Gabbana</a>, <a title="DKNY Perfume" href="http://www.passionforperfume.co.uk/Perfume/Donna-Karan-New-York/">DKNY</a>, <a title="Gucci Perfume" href="http://www.passionforperfume.co.uk/Perfume/Gucci/">Gucci</a>, <a title="Calvin Klein Perfume" href="http://www.passionforperfume.co.uk/Perfume/Calvin-Klein/">Calvin Klein</a> and <a title="Yves Saint Laurent Perfume" href="http://www.passionforperfume.co.uk/Perfume/Yves-Saint-Laurent/">Yves Saint Laurent</a>.
<p><!--404890784be6d3aec9601eaae0107711-->
<p><!--7ca1f260f2231d1cf7cb40c9825af774-->
<p>
<p><!--c46c8b797516a1ea86c089701a4c2478-->
</p>
<p><!--fc6ef1a4851d38b768aa9085535c7e32--></p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2007/08/15/passion-for-perfume-launched/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Generating PHP Barcode Images</title>
		<link>http://developerblog.acidcs.co.uk/2007/01/08/generating-php-barcode-images/</link>
		<comments>http://developerblog.acidcs.co.uk/2007/01/08/generating-php-barcode-images/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 18:43:29 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Website Development]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/2007/01/08/generating-php-barcode-images/</guid>
		<description><![CDATA[I have just been writing some code to generate a barcode image in PHP, which I thought might be useful to others.
Firstly, you will need this free barcode font and to have the GD or GD2 extension installed on your server.


The page takes a value &#8220;string&#8221; which it converts into an barcode, for example I have been [...]]]></description>
			<content:encoded><![CDATA[<p>I have just been writing some code to generate a barcode image in PHP, which I thought might be useful to others.</p>
<p>Firstly, you will need <a href="http://www.squaregear.net/fonts/free3of9.shtml">this free barcode font</a> and to have the GD or GD2 extension installed on your server.</p>
<p><span id="more-12"></span></p>
<p><!--p<--></p>
<p>The page takes a value &#8220;string&#8221; which it converts into an barcode, for example I have been using &#8220;string=*00001234*&#8221; for my barcode testing. It can also take &#8220;width&#8221;, &#8220;height&#8221; and &#8220;fontsize&#8221; optional parameters.</p>
<p><!--r-->//set the content type this page returns<br />
Header (&#8221;Content-type: image/png&#8221;);</p>
<p>//set the default values<br />
$width = 200;<br />
$height = 35;<br />
$fontsize = 35;<br />
$text = &#8221;;</p>
<p>//Get the parameters passed to the page<br />
if(isset($_REQUEST[&#8217;width&#8217;]))<br />
   $width = $_REQUEST[&#8217;width&#8217;];<br />
if(isset($_REQUEST[&#8217;height&#8217;]))<br />
   $height = $_REQUEST[&#8217;height&#8217;];<br />
if(isset($_REQUEST[&#8217;fontsize&#8217;]))<br />
   $fontsize = $_REQUEST[&#8217;fontsize&#8217;];<br />
if(isset($_REQUEST[&#8217;string&#8217;]))<br />
   $text = $_REQUEST[&#8217;string&#8217;];</p>
<p>//align the barcode at the bottom and one pixel from the left<br />
$startlocation_y = $height;<br />
$startlocation_x = 1;</p>
<p>//create and image of the correct size<br />
$img_handle = imagecreate($width,$height);<br />
//add the black and white colours to the image<br />
$white = imagecolorallocate($img_handle,255,255,255);<br />
$black = imagecolorallocate($img_handle,0,0,0);</p>
<p>//write the barcode text to the image using the &#8220;Free 3 of 9 Extended&#8221;<br />
//barcode font which must be in the same directory.<br />
//The $black colour is negated to remove anti-aliasing.<br />
//The 0 indicates the angle of the text.<br />
imagettftext($img_handle, $fontsize , 0, $startlocation_x, $startlocation_y, -$black, &#8216;FRE3OF9X&#8217;, $text);</p>
<p>//return the image and release resources<br />
imagepng ($img_handle);<br />
imagedestroy ($img_handle);<br />
?></p>
<p> 
<p>
<p><!--ac8a838f8c5e06b090412d96ec554193-->
</p>
<p><!--63763b194c35262244c81a7584fe6556--></p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2007/01/08/generating-php-barcode-images/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Article: Introduction to Information Retrieval - Search Engines</title>
		<link>http://developerblog.acidcs.co.uk/2007/01/08/article-introduction-to-information-retrieval-search-engines/</link>
		<comments>http://developerblog.acidcs.co.uk/2007/01/08/article-introduction-to-information-retrieval-search-engines/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 12:24:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Website Development]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/2007/01/08/article-introduction-to-information-retrieval-search-engines/</guid>
		<description><![CDATA[This article aims to provide readers with an overview of the very basics of information retrieval. Understanding these principles can help you to optimise your website content for the search engines and also help you to analyse search engine algorithm changes. However, the details in this article are not intended to describe how modern search [...]]]></description>
			<content:encoded><![CDATA[<p>This article aims to provide readers with an overview of the very basics of information retrieval. Understanding these principles can help you to optimise your website content for the search engines and also help you to analyse search engine algorithm changes. However, the details in this article are not intended to describe how modern search engines work, as they use many additional factors, including link analysis.</p>
<p>Information retrieval (IR) is the science of searching for documents / within documents. Information retrieval techniques form some of the most fundamental elements of web search engine technology. This article will discuss information retrieval in the context of search engines.</p>
<p><span id="more-11"></span></p>
<p><strong>Indexes</strong></p>
<p>It is unrealistic to remotely access documents in real-time when performing a search, as it would be exceptionally slow and unreliable. Therefore a local index is created, which for search engines is done by a crawler (aka spider). Thus, when you perform a search you are not actually searching the web, but are searching a version of the web as seen and stored by the crawler at some point in the past.</p>
<p>The index would not usually contain the whole document (this may, however, be stored in a separate document cache), but stores a representation of the terms relevant to the document that is quickly and easily searchable. There are various stages to this process (not all systems will include all of these stages):</p>
<ol>
<li><em>Document</em><br />
This is the document in its raw format with all text, structure and formatting.</li>
<li><em>Structure Analysis</em><br />
Recognising headings, paragraphs, titles, bold text, lists, &#8230;, etc.</li>
<li><em>Lexical Analysis</em><br />
Converting the characters in the document into a list of words. This process may include analysing digits, hyphens, punctuation and the case of letters. Proper Noun Analysis can use the case and format of words/phrases to identify important information such as names, places, dates and organisations.</li>
<li><em>Stopwords Removal</em><br />
The removal of words which occur very often and provide no ability to discriminate between documents. For example: &#8220;the&#8221;, &#8220;it&#8221;, &#8220;is&#8221;. However, it can be seen that some search engines leave these words in the index and remove them at the user query level. This allows &#8220;+word&#8221; queries to be performed.</li>
<li><em>Stemming</em><br />
This is a conflation procedure which reduces variations of a word into a single root. For example, both &#8220;worked&#8221; and &#8220;working&#8221; may be reduced to &#8220;work&#8221;. The Porter Stemming Algorithm can be used to perform stemming.</li>
</ol>
<p>After these processes have been performed we have a list of index terms for this particular document.</p>
<p> </p>
<p><strong>Index Term Weighting</strong></p>
<p>We now need to calculate to what degree a term is relevant to a particular document. The following is an example of a weighting scheme:</p>
<ul>
<li><em>Index Term Frequency</em><br />
This is the frequency of a term inside a document. The frequency is usually normalised within the particular document:<br />
TermFrequency(term, document) = (no. occurrences of term in document) / (no. occurrence of term with max occurrences in document)</li>
<li><em>Inverse Document Frequency</em><br />
The inverse of the frequency of a term between all the documents in the set. Terms that appear in many documents are not very useful as they do not allow us to discriminate between documents.<br />
IDF(term) = log([no. documents in collection] / [no. documents in collection containing term])</li>
<li><em>Weight</em><br />
This is the actual index term weight for a particular term in a particular document:<br />
Weight(term, document) = TermFrequency(term, document) * IDF(term)</li>
</ul>
<p>Other items may be a factor in deciding weight, such as: the terms position in the document, whether it was in the title, whether it was bold, whether it was in a list, &#8230;, etc.</p>
<p> </p>
<p><strong>Reverse Index</strong></p>
<p>We now have a list of terms (with their weights) for a given document. However, a list of documents that contain a particular word would be much more useful, rather than a list of words for a particular document. This is called a reverse index.</p>
<p>For example, if we had the following three documents:</p>
<ol>
<li>This is a file about website search engine optimisation</li>
<li>A website design tutorial file</li>
<li>A file about bespoke software design and development</li>
</ol>
<p>Then the index terms for each document may be as follows (weights would be in parentheses):</p>
<ol>
<li>file(?), website(?), search(?), engine(?), optimisation(?)</li>
<li>website(?), design(?), tutorial(?), file(?)</li>
<li>file(?), bespoke(?), software(?), design(?), development(?)</li>
</ol>
<p>However, the reverse index would be:</p>
<table cellspacing="2" cellpadding="0" border="0">
<tr>
<td style="width: 140px">file</td>
<td style="width: 399px">document1(?), document2(?), docuement3(?)</td>
</tr>
<tr>
<td>website</td>
<td>document1(?), document2(?)</td>
</tr>
<tr>
<td>search</td>
<td>document1(?)</td>
</tr>
<tr>
<td>engine</td>
<td>document1(?)</td>
</tr>
<tr>
<td>optimisation</td>
<td>document1(?)</td>
</tr>
<tr>
<td>design</td>
<td>document2(?), document3(?)</td>
</tr>
<tr>
<td>tutorial</td>
<td>document2(?)</td>
</tr>
<tr>
<td>bespoke</td>
<td>document3(?)</td>
</tr>
<tr>
<td>software</td>
<td>document3(?)</td>
</tr>
<tr>
<td>development</td>
<td>document3(?)</td>
</tr>
</table>
<p>The reverse index then allows us to easily find the relevant documents for a particular word</p>
<p> </p>
<p><strong>Similarity Matching </strong></p>
<p>This is the process for computing the relevance of a document to a particular query. It can comprise:</p>
<ul>
<li><em>Query Term Weighting</em><br />
Applies weights to each term in a query. For example, terms at the beginning of a query may be weighted more heavily.</li>
<li><em>Similarity Coefficient</em><br />
Uses the query term weights and document term weights to compute the similarity between a query and a document. The similarity could be calculated using the vector space model and calculating the cosine coefficient (this will not be discussed here).</li>
</ul>
<p> </p>
<p><strong>Refreshing the Index</strong></p>
<p>Documents can continually change, therefore the index needs to be continually refreshed. The crawler needs to decide how often to reindex particular documents, based on how often they are updated. If a document is not updated very often, then reindexing it very often would be a waste of resources. However, documents that are always changing need to be continually reindexed as they may no longer be relevant to terms they are currently indexed for.</p>
<p> </p>
<p><strong>Measuring Accuracy of IR Systems</strong></p>
<p>Two of the simplest ways to assess the accuracy of a basic information retrieval system are Precision and Recall. These are calculated using the number of relevant documents and the number of retrieved documents (the documents perceived to be relevant by the system), the documents actually returned to the user are where these two sets of document overlap.</p>
<ul>
<li><em>Precision</em><br />
Ratio of no. relevant documents returned to the total number of documents retrieved - i.e. the number of documents returned that are relevant.</li>
<li><em>Recall</em><br />
Ratio of no. relevant documents returned to the total number of relevant documents - i.e. the number of relevant documents that are returned.</li>
</ul>
<p>The documents actually returned from the retrieved documents set will be decided using some form of ranking mechanism (discussion of this is beyond the scope of this article).</p>
<p>Generally, there is a compromise between precision and recall, as increasing the number of documents retrieved is likely to also increase the number of irrelevant documents in the set of retrieved documents.</p>
<p> </p>
<p><strong>Web Search Engines </strong></p>
<p>Web search engines (such as Google, Yahoo! and MSN) usually combine information retrieval techniques with link structure analysis, as well as many other unknown techniques. Obviously, the above techniques are very easily spammed, so any useful search engine would need to try to filter out spamming where possible.</p>
<p> </p>
<p><strong>About the author </strong></p>
<p>Michael Hawthornthwaite works at <a href="http://www.acidcs.co.uk">Acid Computer Services</a> who specialize in <a href="http://www.acidcs.co.uk/design.htm">graphic design</a> (including <a href="http://www.acidcs.co.uk/design-website-design.htm">web design</a>), <a href="http://www.acidcs.co.uk/website-development.htm">web development</a> and <a href="http://www.acidcs.co.uk/software-development.htm">bespoke software development</a>, <a href="http://www.acidcs.co.uk/contact-us.htm">based in Manchester, UK</a>. Michael is a project manager and specializes in advanced algorithms and web technologies.</p>
<p>Any reproduction of this article must include the above &#8220;About the author&#8221; information and preserve any links within it.
<p><!--b69e634f93a8566104dea7fe0be0a1c0-->
<p>
<p><!--d02a75bdbfccd7b5ae18236c5a472fbb-->
</p>
<p><!--c102cea96a623d154b4909c0c287ee71--></p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2007/01/08/article-introduction-to-information-retrieval-search-engines/feed/</wfw:commentRss>
		</item>
		<item>
		<title>New Pages On Acid Website</title>
		<link>http://developerblog.acidcs.co.uk/2006/12/22/new-pages-on-acid-website/</link>
		<comments>http://developerblog.acidcs.co.uk/2006/12/22/new-pages-on-acid-website/#comments</comments>
		<pubDate>Fri, 22 Dec 2006 20:04:21 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/2006/12/22/new-pages-on-acid-website/</guid>
		<description><![CDATA[We have launched some new pages on our main site www.acidcs.co.uk.
The sub-headings on each of the services pages (design, web development and software development) are now links to individual pages detailing the services we offer.
We have also added a website map and a free consultation request form.


]]></description>
			<content:encoded><![CDATA[<p>We have launched some new pages on our main site <a title="Acid Computer Services" href="http://www.acidcs.co.uk">www.acidcs.co.uk</a>.</p>
<p>The sub-headings on each of the services pages (<a title="Graphic and web design services" href="http://www.acidcs.co.uk/design.htm">design</a>, <a title="Web and Ecommerce Development" href="http://www.acidcs.co.uk/website-development.htm">web development</a> and <a title="Bespoke Software Development" href="http://www.acidcs.co.uk/software-development.htm">software development</a>) are now links to individual pages detailing the services we offer.</p>
<p>We have also added a <a title="Website Map" href="http://www.acidcs.co.uk/website-site-map.htm">website map</a> and a <a title="Free Consultation and Proposal" href="http://www.acidcs.co.uk/free-web-consultation-proposal.htm">free consultation request form</a>.
</p>
<p><!--01c576d20bdd384a6abd309e2ebbe57e--></p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2006/12/22/new-pages-on-acid-website/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Calling SpamAssassin Programmatically Using C#</title>
		<link>http://developerblog.acidcs.co.uk/2006/12/21/calling-spamassassin-programmatically-using-c/</link>
		<comments>http://developerblog.acidcs.co.uk/2006/12/21/calling-spamassassin-programmatically-using-c/#comments</comments>
		<pubDate>Thu, 21 Dec 2006 10:39:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://developerblog.acidcs.co.uk/2006/12/21/calling-spamassassin-programmatically-using-c/</guid>
		<description><![CDATA[We have recently been developing a program which involves retrieving emails into a ASP.NET system written in C#.
It was quickly realised that we would also need a spam filter to avoid spam messages clogging up the system. Firstly we created a black list and a white list to allow us to pre-approve/disapprove emails from certain addresses.
Next, we needed [...]]]></description>
			<content:encoded><![CDATA[<p>We have recently been developing a program which involves retrieving emails into a ASP.NET system written in C#.</p>
<p>It was quickly realised that we would also need a spam filter to avoid spam messages clogging up the system. Firstly we created a black list and a white list to allow us to pre-approve/disapprove emails from certain addresses.</p>
<p>Next, we needed some way of retrieving a spam score (or probability) for the remaining messages. We looked immpediately to SpamAssassin and easily got it working on our Windows server using the excellent how to guide: <a href="http://www.openhandhome.com/howtosa310.html">Using SpamAssassin with Win32</a>.</p>
<p>However, we did not want the mail to be filtered at the mail server level, we wanted to spam check the messages in our system as they were retrieved and store their spam score.</p>
<p><span id="more-8"></span></p>
<p>To do this we created a SpamAssassinWrapper class library in C# (as our system is in ASP.NET). This class simply called &#8220;spamassassin.bat&#8221; with the email message file as the argument (in its raw format), by starting a new Process (System.Diagnostics.Process).</p>
<p>The Standard Output can be redirected to a StreamReader (<a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx">see this MSDN article</a>), allowing us to get the results.</p>
<p>We then retrieved each line from the output until we found the &#8220;X-Spam-Status&#8221; header. The value of the &#8220;score&#8221; attribute of the header was then retrieved and returned as a nullable float. It is null if for some reason there was no score.</p>
<p>The only problem with this method is that calling &#8220;spamassassin&#8221; on each individual email is slow. This could be solved by setting up &#8220;spamc&#8221; and &#8220;spamd&#8221; on the server and calling this instead as they are C-compiled and much faster, but this looks tricky (on Windows) and for now time is not an important factor.
</p>
<p><!--67e9a50c9759643ef3f4f0e29e5479f3--></p>
]]></content:encoded>
			<wfw:commentRss>http://developerblog.acidcs.co.uk/2006/12/21/calling-spamassassin-programmatically-using-c/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
