<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Felipe Farinon</title>
	<atom:link href="http://scarvenger.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://scarvenger.wordpress.com</link>
	<description>__asm { int 3h }</description>
	<lastBuildDate>Tue, 17 Mar 2009 19:01:53 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='scarvenger.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/8fba7a14f0ca82af108afae997f153fc?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Felipe Farinon</title>
		<link>http://scarvenger.wordpress.com</link>
	</image>
			<item>
		<title>Maps using string keys</title>
		<link>http://scarvenger.wordpress.com/2009/03/17/maps-using-string-keys/</link>
		<comments>http://scarvenger.wordpress.com/2009/03/17/maps-using-string-keys/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 13:39:59 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=178</guid>
		<description><![CDATA[In the spelling corrector article we read a whole file in memory and hold it&#8217;s data in a std::string object, and then we use a std::map to hold ranges of this big string. Those ranges are created by making copies of the string. While this aproach is satisfatory, it can be greatly improved if we [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=178&subd=scarvenger&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In the <a href="http://scarvenger.wordpress.com/2007/12/11/how-to-write-a-spelling-corrector/">spelling corrector article</a> we read a whole file in memory and hold it&#8217;s data in a <em>std::string</em> object, and then we use a <em>std::map</em> to hold <strong>ranges </strong>of this big string. Those ranges are created by making copies of the string. While this aproach is satisfatory, it can be greatly improved if we can afford holding the file data while <em>std::map</em> is in the scope.</p>
<p><span id="more-178"></span></p>
<p>That&#8217;s because we may hold only information about the string range in the map, not the whole copied string, this will greatly improve spelling corrector loading time:</p>
<pre class="brush: cpp;">

template&lt;class CharT, class Traits = std::char_traits&lt;CharT&gt; &gt;
class basic_const_string_range
{
public:

  typedef CharT value_type;
  typedef Traits traits_type;
  typedef const value_type* const_iterator;
  typedef std::string::size_type size_type;

  size_type size() const { return m_size; }

  basic_const_string_range(const_iterator begin, size_type size)
    : m_begin(begin)
    , m_size(size)
  {
  }

  bool operator&lt;(const basic_const_string_range&lt;CharT&gt;&amp; other) const
  {
    return traits_type::compare(begin(), other.begin(),
      other.size() &gt; size() ? size() : other.size()) &lt; 0;
  }

  const_iterator begin() const { return m_begin;          }
  const_iterator end()   const { return m_begin + size(); }

private:

  const_iterator m_begin;
  size_type m_size;
};

template&lt;class CharT&gt;
basic_const_string_range&lt;CharT&gt; make_range(const CharT* begin, std::string::size_type count)
{
  return basic_const_string_range&lt;CharT&gt;(begin, count);
}

typedef basic_const_string_range&lt;char&gt;    const_string_range;
typedef basic_const_string_range&lt;wchar_t&gt; const_wstring_range;

int main()
{
  std::string str = &quot;apple banana orange &quot;;
  std::map&lt;const_string_range, int&gt; data;

  std::string::size_type first_non_space = 0;
  std::string::size_type last_space      = 0;
  while ((first_non_space = str.find_first_not_of(' ', first_non_space)) != std::string::npos &amp;&amp;
         (last_space      = str.find             (' ', first_non_space)) != std::string::npos)
  {
    data[make_range(&amp;str[first_non_space], last_space - first_non_space)] = first_non_space;
    first_non_space = last_space + 1;
  }
}
</pre>
<p>This class can be adapted to a TR1 <em>unorderep_map</em> providing the correct <em>hash&lt;&gt;</em> overload. The map will continue valid as long as the string object remains in the memory. Yet it has another use, consider for example this input:</p>
<pre class="brush: cpp;">

int lookup(const char* data)
{
  return values[data];
}
</pre>
<p>In a normal <em>std::map&lt;std::string, int&gt;</em> when we called <em>operator[](const std::string&amp;)</em> the variable <em>data</em> would call the <em>std::string</em> constructor and copy all it&#8217;s data to the string internal buffer. Using the <em>basic_const_string_rang</em>e approach we can save that copy using the <em>const char*</em> variable directly.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/178/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=178&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2009/03/17/maps-using-string-keys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/71d30421e84c1132cef07d7fe7314e93?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scarvenger</media:title>
		</media:content>
	</item>
		<item>
		<title>C++ Container View</title>
		<link>http://scarvenger.wordpress.com/2008/11/14/c-container-view/</link>
		<comments>http://scarvenger.wordpress.com/2008/11/14/c-container-view/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 12:02:39 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/?p=63</guid>
		<description><![CDATA[I did a filter_iterator for C++ STL containers which is able to filter container elements based on a predicate, wich I have showed to my friend Thiago Adams. Then he pointed me a CUJ (C/C++ Users Journal) article where Maciej Sobczak introduced the Container View Concept. The main idea behind it is that it is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=63&subd=scarvenger&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I did a filter_iterator for C++ STL containers which is able to filter container elements based on a predicate, wich I have showed to my friend Thiago Adams. Then he pointed me a <a href="http://www.ddj.com/cpp/184401789">CUJ (C/C++ Users Journal) article </a>where <em><strong>Maciej Sobczak</strong></em> introduced the Container View Concept. The main idea behind it is that it is able to move elements without really copying them and being able to integrate multiple container elements in just one view.</p>
<p><span id="more-63"></span></p>
<p>The View contains a collection of pointers to other elements. So the basic interface of the view would look like:</p>
<pre class="brush: cpp;">
const std::string names1[] = { &quot;felipe&quot;, &quot;thiago&quot; };
const std::string names2[] = { &quot;joao&quot;, &quot;andre&quot;, &quot;bruno&quot; };

view&lt;const std::string&gt; names_view(&amp;names1[0], names1 + 2);
names_view.assign(&amp;names2[0], names2 + 3);

std::sort(names_view.begin(), names_view.end());
std::copy(names_view.begin(), names_view.end(), std::ostream_iterator&lt;const std::string&gt;(std::cout, &quot;\n&quot;));
</pre>
<p>So, the idea is that the <em>view&lt;&gt; </em>object will be sorted (his pointers will point to the elements in the arrays in a sorted way) while the <em>arrays </em>itself will remain untouched.</p>
<p>In <em><strong>Maciej&#8217;s</strong></em> post it&#8217;s view was returning the pointer to the elements directly, so when he called <em>std::sort</em> he had to use an adapter in the predicate function to dereference the pointer to the elements. Actually, what we really want in this case is to have a container to store references to objects, but everyone knows that&#8217;s impossible&#8230; right?</p>
<p>Not really, TR1 has arrived with a class called <strong>reference_wrapper&lt;T&gt;</strong> wich basically defines a copyable reference, so:</p>
<pre class="brush: cpp;">

  int data[] = { 51,9,0,5,4 };
  std::vector&lt;std::tr1::reference_wrapper&lt;int&gt; &gt; view;

  for (int i = 0; i &lt; 5; ++i)
    view.push_back(std::tr1::ref(data[i]));

  std::sort(view.begin(), view.end());
  std::copy(view.begin(), view.end(), std::ostream_iterator&lt;int&gt;(std::cout, &quot;-&quot;));
</pre>
<p>Ok, that&#8217;s a pretty nice line reduction compared to the article <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , and now we don&#8217;t need the special predicate in sort for it to work. But problems might still arise:</p>
<p>1) It is annoying to have to use a loop to <em>push_back</em> elements in our view.</p>
<p>2) The <strong>reference_wrapper&lt;T&gt;</strong> doesn&#8217;t define an <strong>operator=</strong> for us to be able to assign a new value to the reference. This can create problems with for example the std::replace algorithm defined in &lt;algorithm&gt;.</p>
<p>With these requirements we can create a class that better adresses our needs:</p>
<pre class="brush: cpp;">

template&lt;class T&gt;
class view_reference
{
  T* value_;
public:
  view_reference(T&amp; value)
    : value_(&amp;value)
  {
  }

  operator T&amp;()
  {
    return *value_;
  }

  view_reference&lt;T&gt; operator=(const T&amp; value)
  {
    *value_ = value;
    return *this;
  }
};

void main()
{
  int data[] = { 51,9,0,5,4 };
  std::vector&lt;view_reference&lt;int&gt; &gt; view;

  std::copy(&amp;data[0], data + 5, std::back_inserter(view));
  std::sort(view.begin(), view.end());
  std::replace(view.begin(), view.end(), 51, 3000);

  std::copy(view.begin(), view.end(), std::ostream_iterator&lt;int&gt;(std::cout, &quot;-&quot;));
}
</pre>
<p>So now we got a nice view container, hope you enjoy it <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=63&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2008/11/14/c-container-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/71d30421e84c1132cef07d7fe7314e93?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scarvenger</media:title>
		</media:content>
	</item>
		<item>
		<title>How to Write a Spelling Corrector</title>
		<link>http://scarvenger.wordpress.com/2007/12/11/how-to-write-a-spelling-corrector/</link>
		<comments>http://scarvenger.wordpress.com/2007/12/11/how-to-write-a-spelling-corrector/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 22:49:50 +0000</pubDate>
		<dc:creator>scarvenger</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://scarvenger.wordpress.com/2007/12/11/how-to-write-a-spelling-corrector/</guid>
		<description><![CDATA[Greetings, i wrote a C++ version of the Norvig&#8217;s spelling corrector. All theory and other language implementations can be found in his website. Here&#8217;s my reduced version with less number of lines, that scored 66 lines of code (Implementation in the same source that the declaration): SpellCorrector in C++. Or just take a look at [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=5&subd=scarvenger&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Greetings, i wrote a C++ version of the <a href="http://norvig.com/spell-correct.html">Norvig&#8217;s spelling corrector</a>. All theory and other language implementations can be found in his website. Here&#8217;s my reduced version with less number of lines, that scored 66 lines of code (Implementation in the same source that the declaration): <a title="SpellCorrector in C++" href="http://scarvenger.files.wordpress.com/2007/12/spellcorrector.h">SpellCorrector in C++</a>. Or just take a look at the complete version:</p>
<p><span id="more-5"></span></p>
<p>If you want to use the Spelling Corrector in your project feel free, but just send me an email to let me know about it.</p>
<p>SpellCorrector.h</p>
<pre class="brush: cpp;">

/*
 * SpellCorrector.h
 *
 * Copyright  (C)  2007  Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 *
 * Version: 1.4
 * Author: Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 * Maintainer: Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 * URL: http://scarvenger.wordpress.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Commentary:
 *
 * See http://scarvenger.wordpress.com/.
 *
 * Code:
 */

#ifndef _SPELLCORRECTOR_H_
#define _SPELLCORRECTOR_H_

#include &lt;vector&gt;
#include
&lt;tr1/unordered_map&gt;

class SpellCorrector
{
private:
	typedef std::vector&lt;std::string&gt; Vector;
	typedef std::tr1::unordered_map&lt;std::string, int&gt; Dictionary;

	Dictionary dictionary;

	void edits(const std::string&amp; word, Vector&amp; result);
	void known(Vector&amp; results, Dictionary&amp; candidates);
public:
	void load(const std::string&amp; filename);
	std::string correct(const std::string&amp; word);
};

#endif
</pre>
<p>SpellCorrector.cpp</p>
<pre class="brush: cpp;">

/*
 * SpellCorrector.cpp
 *
 * Copyright  (C)  2007  Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 *
 * Version: 1.4
 * Author: Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 * Maintainer: Felipe Farinon &lt;felipe.farinon@gmail.com&gt;
 * URL: http://scarvenger.wordpress.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Commentary:
 *
 * See http://scarvenger.wordpress.com/.
 *
 * Code:
 */

#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;iostream&gt;

#include &quot;SpellCorrector.h&quot;

using namespace std;

bool sortBySecond(const pair&lt;std::string, int&gt;&amp; left, const pair&lt;std::string, int&gt;&amp; right)
{
	return left.second &lt; right.second;
}

char filterNonAlphabetic(char&amp; letter)
{
	if (isalpha(letter))
		return tolower(letter);
	return '-';
}

void SpellCorrector::load(const std::string&amp; filename)
{
	ifstream file(filename.c_str(), ios_base::binary | ios_base::in);

	file.seekg(0, ios_base::end);
	int length = file.tellg();
	file.seekg(0, ios_base::beg);

	string line(length, '0');

	file.read(&amp;line[0], length);

	transform(line.begin(), line.end(), line.begin(), filterNonAlphabetic);

	string::size_type begin = 0;
	string::size_type end   = line.size();

	for (string::size_type i = 0;;)
	{
		while (line[++i] == '-' &amp;&amp; i &lt; end); //find first '-' character

		if (i &gt;= end) { break; }

		begin = i;

		while (line[++i] != '-' &amp;&amp; i &lt; end); //find first not of '-' character

		dictionary[line.substr(begin, i - begin)]++;
	}
}

string SpellCorrector::correct(const std::string&amp; word)
{
	Vector result;
	Dictionary candidates;

	if (dictionary.find(word) != dictionary.end()) { return word; }

	edits(word, result);
	known(result, candidates);

	if (candidates.size() &gt; 0) { return max_element(candidates.begin(), candidates.end(), sortBySecond)-&gt;first; }

	for (unsigned int i = 0;i &lt; result.size();i++)
	{
		Vector subResult;

		edits(result[i], subResult);
		known(subResult, candidates);
	}

	if (candidates.size() &gt; 0) { return max_element(candidates.begin(), candidates.end(), sortBySecond)-&gt;first; }

	return &quot;&quot;;
}

void SpellCorrector::known(Vector&amp; results, Dictionary&amp; candidates)
{
	Dictionary::iterator end = dictionary.end();

	for (unsigned int i = 0;i &lt; results.size();i++)
	{
		Dictionary::iterator value = dictionary.find(results[i]);

		if (value != end) candidates[value-&gt;first] = value-&gt;second;
	}
}

void SpellCorrector::edits(const std::string&amp; word, Vector&amp; result)
{
	for (string::size_type i = 0;i &lt; word.size();    i++) result.push_back(word.substr(0, i)             + word.substr(i + 1)); //deletions
	for (string::size_type i = 0;i &lt; word.size() - 1;i++) result.push_back(word.substr(0, i) + word[i+1] + word.substr(i + 2)); //transposition

	for (char j = 'a';j &lt;= 'z';++j)
	{
		for (string::size_type i = 0;i &lt; word.size();    i++) result.push_back(word.substr(0, i) + j + word.substr(i + 1)); //alterations
		for (string::size_type i = 0;i &lt; word.size() + 1;i++) result.push_back(word.substr(0, i) + j + word.substr(i)     ); //insertion
	}
}
</pre>
<p>I am working in some optimizations yet but it should be ready to use. Using the corrector is pretty easy, just download the <a href="http://www.felipefarinon.com/code/big.txt">words database</a>, and see the example:</p>
<pre class="brush: cpp;">

#include &quot;SpellCorrector.h&quot;

using namespace std;

int main()
{
    SpellCorrector corrector;

    corrector.load(&quot;big.txt&quot;);

    string request;
    while (request != &quot;quit&quot;)
    {
        cout &lt;&lt; &quot;Type one word\n&quot;;
        cin &gt;&gt; request;

        string correct(corrector.correct(request));

        if (correct != &quot;&quot;)
            cout &lt;&lt; &quot;Did you mean: &quot; &lt;&lt; correct &lt;&lt; &quot;?\n\n\n&quot;;
        else
            cout &lt;&lt; &quot;No corrections avaiable\n\n\n&quot;;
    }

    return 0;
}
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/scarvenger.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/scarvenger.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scarvenger.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scarvenger.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scarvenger.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scarvenger.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scarvenger.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scarvenger.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scarvenger.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scarvenger.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scarvenger.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scarvenger.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scarvenger.wordpress.com&blog=713264&post=5&subd=scarvenger&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://scarvenger.wordpress.com/2007/12/11/how-to-write-a-spelling-corrector/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/71d30421e84c1132cef07d7fe7314e93?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scarvenger</media:title>
		</media:content>
	</item>
	</channel>
</rss>