<?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>Huddled Masses &#187; Recommender</title>
	<atom:link href="http://huddledmasses.org/tag/recommender/feed/" rel="self" type="application/rss+xml" />
	<link>http://huddledmasses.org</link>
	<description>You can do more than breathe for free...</description>
	<lastBuildDate>Fri, 27 Apr 2012 05:42:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<cloud domain='huddledmasses.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>Personal News Update</title>
		<link>http://huddledmasses.org/personal-news-update-december2008/</link>
		<comments>http://huddledmasses.org/personal-news-update-december2008/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 18:00:08 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Huddled]]></category>
		<category><![CDATA[Master's Project]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://huddledmasses.org/?p=858</guid>
		<description><![CDATA[Well, I feel like I left some of you hanging (those who read my blog but don&#8217;t follow me on Twitter or Facebook or FriendFeed or &#8230; something) ... I aced my Master&#8217;s Defense Which is to say, I got the highest grade possible for my project (yes, RIT grades your Master&#8217;s project when you [...]]]></description>
			<content:encoded><![CDATA[	<p>Well, I feel like I left some of you hanging (those who read my blog but don&#8217;t follow me on Twitter or Facebook or FriendFeed or &#8230; something) ... </p>

	<h2>I <strong>aced</strong> my Master&#8217;s Defense  <img src='http://huddledmasses.org/wordpress/wp-includes/' alt='[groupwoot]' class='wp-smiley' /> </h2>

	<p>Which is to say, I got the highest grade possible for my project (yes, <span class="caps">RIT</span> grades your Master&#8217;s project when you defend it) and am (unofficially, since I&#8217;m still waiting for the paperwork to clear) <strong>done</strong> with my Master&#8217;s degree.</p>

	<p>Here are the <a href="/downloads/recommender/defense.pdf">slides from my presentation</a> (not very exciting without all the stuff I said &#8230; maybe I should scan in my 3.5&#8221; cards), along with the <a href="/downloads/recommender/paper.tex.7z">source .tex</a> including my <a href="/downloads/recommender/report.pdf">final paper</a>, the <a href="/downloads/recommender/proposal.pdf">proposal</a> and the original <a href="/downloads/recommender/Research.pdf">research</a> I did. The <a href="/downloads/recommender/code.7z">source code for the prioject</a> is available, as well as <a href="/downloads/recommender/bin.7z">compiled binaries</a> and if you actually want to work on it, I&#8217;ve got <strong>my</strong> database which I could make available.</p>

	<h3>I took the weekend off</h3>

<div class="zemanta-img"><div><dl class="wp-caption alignright" ;width:212;=""><dt class="wp-caption-dt"><a href="http://commons.wikipedia.org/wiki/Image:MythTV-blue_menu.png"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/MythTV-blue_menu.png/202px-MythTV-blue_menu.png" alt="The MythTV menu (default blue theme) Taken fro..." title="The MythTV menu (default blue theme) Taken fro..." width="202" height="152" /></a></dt><dd class="wp-caption-dd zemanta-img-attribution">Image via <a href="http://commons.wikipedia.org/wiki/Image:MythTV-blue_menu.png">Wikipedia</a></dd></dl></div></div>

	<p>I intended to spend last week celebrating my defense by releasing a new PoshCode build, but stuff happened&#8482; and before I knew it, I had spent the whole weekend hanging out with my kids, and setting up a new MythTV box, and then upgrading my main development box to Vista 64bit (I&#8217;ve been frustrated about missing out on some of my <span class="caps">RAM</span> because I was running 32-bit Vista). </p>

	<p>That&#8217;s pretty much completed now (except for the hanging out with the kids part  <img src='http://huddledmasses.org/wordpress/wp-includes/' alt=':D' class='wp-smiley' /> ), so tonight, or tomorrow at the latest, I will get back to the work I had left for PoshCode and try to get that done in time to use it in my presentation next week.</p>

	<h3>I have several backlogged blog posts waiting&#8230;</h3>

	<ul>
		<li>I&#8217;ve got a few more ideas about doing <span class="caps">REST</span> from PowerShell, and about setting up DekiWiki for the PowerShell Community</li>
		<li>I wrote a little script to do compiled C# in PowerShell v1, and a couple functions to do custom IComparer implementations with it.</li>
		<li><a href="http://visifire.com">Visifire now supports WPF</a> (which means you can use their charts from PowerShell)</li>
	</ul>
	<ul>
		<li>I wrote an extensible <span class="caps">IRC</span> bot in under 40 lines of code using <a href="http://sourceforge.net/projects/smartirc4net/">SmartIRC4Net</a> from PowerShell</li>
	</ul>

	<p>And on top of that, I&#8217;ve got a ton of work at work now, mostly involving writing <em>Ruby</em> ...</p>

<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/d368bf7f-6037-4b89-b9f7-1f5a454f76c8/" title="Zemified by Zemanta"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=d368bf7f-6037-4b89-b9f7-1f5a454f76c8" alt="Reblog this post [with Zemanta]" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/personal-news-update-december2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Project Report Accepted &#8212; Defense Scheduled!</title>
		<link>http://huddledmasses.org/project-report-accepted-defense-scheduled/</link>
		<comments>http://huddledmasses.org/project-report-accepted-defense-scheduled/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 00:51:01 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Huddled]]></category>
		<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Master's Project]]></category>
		<category><![CDATA[RIT]]></category>

		<guid isPermaLink="false">http://huddledmasses.org/project-report-accepted-defense-scheduled/</guid>
		<description><![CDATA[Well, my "project report":/downloads/recommender/Report.pdf has been accepted and I'm defending my Master's on December 2nd, 2008 at 4:30pm.  You're all invited to come and see how slick my Self-Organizing Maps Recommender is, from database to PowerShell cmdlets and all.]]></description>
			<content:encoded><![CDATA[	<p>Well, my <a href="/downloads/recommender/Report.pdf">project report</a> has been accepted and I&#8217;m defending my Master&#8217;s on December 2nd, 2008 at 4:30pm.  You&#8217;re all invited to come and see how slick my Self-Organizing Maps Recommender is, from database to PowerShell cmdlets and all.</p>

	<h3>Report Abstract</h3>

	<p>This project comprises designing and implementing a hybrid recommender system for web–pages which uses data from a social tagging system to recommend interesting items to users. For this implementation, the tagging data comes from <a href="http://Del.icio.us">del.icio.us</a>, the oldest and largest public social bookmarking or tagging system for web pages. The system clusters items using a pair of self–organizing maps (<span class="caps">SOM</span>) networks and allows users to see the system’s evaluation of their region of interest, or set their own regions.</p>

	<p>The focus of this project was the web-scraper for gathering tagged URLs from del.icio.us, and the recommender system. The <span class="caps">SOM</span> networks are built using the <a href="http://www.ifs.tuwien.ac.at/~andi/ghsom/" title="Growing Hierarchical Self-Organizing Map">GHSOM</a> implementation, and several recommenders were built to compare results: one using a single map for URLs and users and the other using separate maps to compare the relative quality of the recommendations.</p>

<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/3a17bb00-ac35-403a-ab9a-2b9d534b55aa/" title="Zemified by Zemanta"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=3a17bb00-ac35-403a-ab9a-2b9d534b55aa" alt="Reblog this post [with Zemanta]" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/project-report-accepted-defense-scheduled/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fabruary 4th Progress Report</title>
		<link>http://huddledmasses.org/fabruary-4th-progress-report/</link>
		<comments>http://huddledmasses.org/fabruary-4th-progress-report/#comments</comments>
		<pubDate>Mon, 05 Feb 2007 05:09:11 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>

		<guid isPermaLink="false">http://HuddledMasses.org/jaykul/fabruary-4th-progress-report/</guid>
		<description><![CDATA[The last month went rather badly. First I got distracted by another project for two weeks &#8230; and then when I finally got back to working on the recommender, I found a bunch of problems with the way my database code was working (or rather, not working). Essentially, I made a mistake when I wrote [...]]]></description>
			<content:encoded><![CDATA[	<p>The last month went rather badly. First I got distracted by another project for two weeks &#8230; and then when I finally got back to working on the recommender, I found a bunch of problems with the way my database code was working (or rather, not working).</p>

	<p>Essentially, I made a mistake when I wrote the tests and mostly tested my DataSet? logic, and not the round-trip to the database, or even the individual queries to the database. Even though my unit tests were working, the data wasn&#8217;t being stored in the database right. I&#8217;ve added a few tests which actually run <span class="caps">SQL</span> queries against the back-end database after exercising the interface &#8212; and I&#8217;ll add a few more in the next week or so as I actually try running the scraper, but the couple that are there now will prevent duplicating the same bug again.</p>

	<p>At any rate. I&#8217;m clearly at least three weeks behind schedule, although I expect I&#8217;ll be able to get back on track, it will be partly at the cost of leaving the <span class="caps">SOM</span> code in C++ for now or using an automatic converter to get most of the conversion to C# from C++. Overall, that&#8217;s not really a huge problem, as long as I can hook it in without resorting to a command-line interface.</p>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/fabruary-4th-progress-report/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows RSS Platform &#8211; Part the first.</title>
		<link>http://huddledmasses.org/windows-rss-platform-part-the-first/</link>
		<comments>http://huddledmasses.org/windows-rss-platform-part-the-first/#comments</comments>
		<pubDate>Sun, 07 Jan 2007 04:45:17 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://HuddledMasses.org/jaykul/windows-rss-platform-part-the-first/</guid>
		<description><![CDATA[The inaptly named Windows RSS Platform is actually part of IE7, not part of Windows, and therefore is available on Windows XP if IE 7 has been installed, as well as on Windows Vista (where IE 7 is included originally). However, having said that, it isn&#8217;t just for IE: it includes a complete COM API [...]]]></description>
			<content:encoded><![CDATA[	<p>The inaptly named Windows <span class="caps">RSS</span> Platform is actually part of IE7, not part of Windows, and therefore is available on Windows XP if IE 7 has been installed, as well as on Windows Vista (where IE 7 is included originally).  However, having said that, it isn&#8217;t just for IE: it includes a <a href="http://msdn2.microsoft.com/en-us/library/ms684701.aspx">complete <span class="caps">COM</span> API</a> which is usable from script or the .Net Framework, and the header files are part of the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&#38;displaylang=en">Windows Platform SDK</a> and usable from C/C++.</p>

	<p>The <span class="caps">RSS</span> Platform is intended to introduce a unified approach to <span class="caps">RSS</span> for Windows applications, where all applications use the same <span class="caps">RSS</span> feed store, and a service handles downloading the <span class="caps">RSS</span> feeds &#8212; including enclosures if requested &#8212; and normalizes them so applications need not handle parsing all the different feed formats (that is, you only need to parse the Microsoft-normalized <span class="caps">RSS</span> 2.0 with extensions).  </p>

	<p>As a platform for building RSS-based applications, it&#8217;s very well done, and well thought out. It&#8217;s now ridiculously easy to create an <span class="caps">RSS</span> reader, since the platform removes all need to parse <span class="caps">XML</span> except in the weirdest situations, and allows all applications to be instantly integrated on the same list of <span class="caps">RSS</span> feeds &#8230; let me show you &#8230;.<span id="more-364"></span></p>

	<p>I&#8217;ll be using the <span class="caps">RSS</span> Platform in <a href="/recommender/">my <span class="caps">SOM</span> Recommender</a> project, so I&#8217;ll have some more sample code I can share later on, including use of some of the events (there are events for all the things that could happen to feed folders or feeds themselves, including creations, renaming, deletion, etc). At the very least, you&#8217;d want to check out <a href="http://msdn2.microsoft.com/en-us/library/ms686317.aspx">GetWatcher</a> method (see the <a href="http://msdn2.microsoft.com/en-us/library/ms686416.aspx">examples</a>) and the <a href="http://msdn2.microsoft.com/en-us/library/ms685489.aspx">FeedItemCountChanged</a> and <a href="http://msdn2.microsoft.com/en-us/library/ms685487.aspx">FeedDownloadCompleted</a> events.  </p>

	<p>For now, I have a very simple example: a single function which exercises some of the most interesting methods in the <span class="caps">API</span>, but doesn&#8217;t use any of the events for detecting the arrival of new feed items nor the asynchronous download feature.  This simple example is a console application which will fetch a feed.  As you can see, it parses the command line for the <code>url</code> and <code>name</code> parameters.  </p>

	<p>Once you&#8217;ve specified a feed by name and <span class="caps">URL</span>, it will be stored in the &#8220;RssMe Feeds&#8221; folder so you can just refer to it by name in the future.  However, <strong>there&#8217;s one major problem</strong> with that: the FeedStore doesn&#8217;t have a concept of aliases or shortcuts, and the feed URLs have to be unique, so if you&#8217;ve already bookmarked a feed, RssMe would be able to show you the items from it, but not pull it up by name, unless you specify the full path to it. Honestly, this is the most frustrating thing to me (as a developer, <strong>and</strong> as a user) about the feed store:  what I&#8217;d like to be able to do is add a feed in multiple folders and have them automatically share the &#8220;read&#8221; state of the items.</p>

	<p>That would allow applications to create a subfolder (as RssMe does) and rely on it as a way of organizing the feeds they use. As it is, if third-party applications want to use only <em>some</em> of the feeds in the feed store, they will have to keep a list of URLs separately since they may not be able to add the feed to <em>their own</em> folder if it&#8217;s already in the store elsewhere.  Once they&#8217;ve done that, they can just retrieve them by <span class="caps">URL</span> from the store.</p>

	<p>Although the source code is inline below, you can download the <a href="/downloads/samples/RssMe%20Source.zip">Visual Studio 2005 project</a> which can be compiled by just running msbuild (that&#8217;s in your Microsoft.Net\Framework folder in C:\Windows &#8230; for some reason it&#8217;s not on the path, so you&#8217;ll probably need to type the whole path.  If you&#8217;re not familiar with MSBuild, try the /help argument   <img src='http://huddledmasses.org/wordpress/wp-includes/' alt=';)' class='wp-smiley' />  but you can specify that you want to build the &#8220;Release&#8221; build by just running: <code>MSBuild /p:Configuration=Release</code> assuming you&#8217;ve fixed the path problem).  Or you can download the <a href="/downloads/samples/RssMe.zip">compiled example</a></p>

	<p>The command-line for this sample app is basically:
	<ul>
		<li><code>RssMe /url:http://huddledmasses.org/feed/atom/ /name:HM.O</code></li>
		<li><code>RssMe /url:http://del.icio.us/rss/ /name:&#34;Delicious Recent&#34;</code></li>
	</ul>
	<ul>
		<li><code>RssMe /name:HM.O</code></li>
	</ul></p>

	<div class="csharp code csharp" style="font-family:monospace;"><br />
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">using</span> <span style="color: #008080;">Microsoft.Feeds.Interop</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text.RegularExpressions</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008080; font-style: italic;">// A simple test of the IE7 &quot;Windows RSS Platform&quot;</span><br />
<span style="color: #0600FF;">namespace</span> RssFeedDemo<br />
<span style="color: #000000;">&#123;</span><br />
<span style="color: #FF0000;">class</span> RssMe<br />
<span style="color: #000000;">&#123;</span><br />
<span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; <span style="color: #FF0000;">string</span> feedName <span style="color: #008000;">=</span> <span style="color: #0600FF;">null</span>, feedUrl <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #FF0000;">string</span> fldrName <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;RssMe Feeds&quot;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #FF0000;">int</span> result <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; <span style="color: #008080; font-style: italic;">// Everything comes from the FeedsManager</span><br />
&nbsp; FeedsManager mgr <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> FeedsManagerClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// And everything is inside the RootFolder</span><br />
&nbsp; IFeedFolder root <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeedFolder<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">RootFolder</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// Specifically, all the feeds are ...</span><br />
&nbsp; IFeed feed <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span><br />
<br />
&nbsp; <span style="color: #008080;">#region process the command-line arguments</span><br />
&nbsp; Regex re <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Regex<span style="color: #000000;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #666666;">@&quot;(?:(?:/url:\s*&quot;</span><span style="color: #666666;">&quot;?(?:&lt;url&gt;https?://<span style="color: #008080; font-weight: bold;">\S</span>+)&quot;</span><span style="color: #666666;">&quot;?<span style="color: #008080; font-weight: bold;">\s</span>*)|&quot;</span> <span style="color: #008000;">+</span><br />
&nbsp; &nbsp; <span style="color: #666666;">@&quot;(?:/name:\s*&quot;</span><span style="color: #666666;">&quot;?(?:&lt;name&gt;<span style="color: #008080; font-weight: bold;">\S</span>+)&quot;</span><span style="color: #666666;">&quot;?<span style="color: #008080; font-weight: bold;">\s</span>*))+&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Match mx <span style="color: #008000;">=</span> re.<span style="color: #0000FF;">Match</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Join</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot; &quot;</span>, args<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mx.<span style="color: #0000FF;">Success</span><span style="color: #000000;">&#41;</span><br />
&nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mx.<span style="color: #0000FF;">Groups</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;url&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Success</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; feedUrl <span style="color: #008000;">=</span> mx.<span style="color: #0000FF;">Groups</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;url&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Value</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Access feeds by URL ...</span><br />
&nbsp; &nbsp; &nbsp; feed <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">GetFeedByUrl</span><span style="color: #000000;">&#40;</span>feedUrl<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mx.<span style="color: #0000FF;">Groups</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Success</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; feedName <span style="color: #008000;">=</span> mx.<span style="color: #0000FF;">Groups</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Value</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// if they specified only the name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>mx.<span style="color: #0000FF;">Groups</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;url&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Success</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span> <span style="color: #008080; font-style: italic;">// we assume they already stored it previously</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mgr.<span style="color: #0000FF;">ExistsFeed</span><span style="color: #000000;">&#40;</span>fldrName <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\</span><span style="color: #008080; font-weight: bold;">\</span>&quot;</span> <span style="color: #008000;">+</span> feedName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; feed <span style="color: #008000;">=</span><span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">GetFeed</span><span style="color: #000000;">&#40;</span>fldrName<span style="color: #008000;">+</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\</span><span style="color: #008080; font-weight: bold;">\</span>&quot;</span><span style="color: #008000;">+</span>feedName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mgr.<span style="color: #0000FF;">ExistsFeed</span><span style="color: #000000;">&#40;</span>feedName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; feed <span style="color: #008000;">=</span><span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">GetFeed</span><span style="color: #000000;">&#40;</span>feedName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #0600FF;">else</span><br />
&nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><br />
<span style="color: #666666;">@&quot;You should specify the url and/or name of the feed:<br />
&nbsp; &nbsp; rssme /name:delicious /url:http://del.icio.us/rss/<br />
Once you've defined a name and url, you can just use:<br />
&nbsp; &nbsp; rssme /name:delicious<br />
<br />
Please specify a name for this feed:<br />
&gt; &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; feedName <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>feedName.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Try getting the feed by it's expected path...</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mgr.<span style="color: #0000FF;">ExistsFeed</span><span style="color: #000000;">&#40;</span>fldrName <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\</span><span style="color: #008080; font-weight: bold;">\</span>&quot;</span> <span style="color: #008000;">+</span> feedName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; feed <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">GetFeed</span><span style="color: #000000;">&#40;</span>fldrName <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\</span><span style="color: #008080; font-weight: bold;">\</span>&quot;</span> <span style="color: #008000;">+</span> feedName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><br />
<span style="color: #666666;">@&quot;Please specify an http Url for this feed:<br />
&gt; &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; feedUrl <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #008080;">#endregion process the command-line arguments</span><br />
<br />
&nbsp; <span style="color: #008080; font-style: italic;">// if the feed doesn't already exist ...</span><br />
&nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span> <span style="color: #008000;">==</span> feed<span style="color: #000000;">&#41;</span><br />
&nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Test for the existence of sub folders </span><br />
&nbsp; &nbsp; IFeedFolder somrFeeds <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>root.<span style="color: #0000FF;">ExistsSubfolder</span><span style="color: #000000;">&#40;</span>fldrName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; somrFeeds <span style="color: #008000;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#40;</span>IFeedFolder<span style="color: #000000;">&#41;</span>root.<span style="color: #0000FF;">GetSubfolder</span><span style="color: #000000;">&#40;</span>fldrName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// and you can create folders very easily too</span><br />
&nbsp; &nbsp; &nbsp; somrFeeds <span style="color: #008000;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#40;</span>IFeedFolder<span style="color: #000000;">&#41;</span>root.<span style="color: #0000FF;">CreateSubfolder</span><span style="color: #000000;">&#40;</span>fldrName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Here's the catch:</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Each URL can only be in the storage once!</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// So, try getting the feed by it's URL</span><br />
&nbsp; &nbsp; feed <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>mgr.<span style="color: #0000FF;">GetFeedByUrl</span><span style="color: #000000;">&#40;</span>feedUrl<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// if we found the feed by URL, but not by name</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// we won't be able to (re)create it in here ...</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span> <span style="color: #008000;">!=</span> feed<span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><br />
<span style="color: #666666;">@&quot;Couldn't save this feed with that name because it &quot;</span><br />
<span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;already exists in another location.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; result <span style="color: #008000;">=</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Create a new feed specifiying a name and url</span><br />
&nbsp; &nbsp; &nbsp; feed <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeed<span style="color: #000000;">&#41;</span>somrFeeds.<span style="color: #0000FF;">CreateFeed</span><span style="color: #000000;">&#40;</span>feedName, feedUrl<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; feed.<span style="color: #0000FF;">MaxItemCount</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// store all the items</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// If you wanted to download enclosures...</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// feed.DownloadEnclosuresAutomatically = true;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Override the default synchronization schedule</span><br />
&nbsp; &nbsp; &nbsp; feed.<span style="color: #0000FF;">Interval</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">60</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// specify interval in minutes</span><br />
&nbsp; &nbsp; &nbsp; feed.<span style="color: #0000FF;">SyncSetting</span> <span style="color: #008000;">=</span> FEEDS_SYNC_SETTING.<span style="color: #0000FF;">FSS_INTERVAL</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Manually download it for starters</span><br />
&nbsp; &nbsp; &nbsp; feed.<span style="color: #0000FF;">Download</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// You can check how many items or unread items</span><br />
&nbsp; <span style="color: #FF0000;">int</span> itemCount <span style="color: #008000;">=</span> feed.<span style="color: #0000FF;">ItemCount</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #FF0000;">int</span> readCount <span style="color: #008000;">=</span> itemCount <span style="color: #008000;">-</span> feed.<span style="color: #0000FF;">UnreadItemCount</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; <span style="color: #008080; font-style: italic;">// You can use .Items in a foreach loop</span><br />
&nbsp; IFeedsEnum items <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeedsEnum<span style="color: #000000;">&#41;</span>feed.<span style="color: #0000FF;">Items</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// But it would force starting from the oldest</span><br />
&nbsp; <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> index <span style="color: #008000;">=</span> readCount<span style="color: #008000;">;</span> index <span style="color: #008000;">&lt;</span> itemCount<span style="color: #008000;">;</span> <span style="color: #008000;">++</span>index<span style="color: #000000;">&#41;</span><br />
&nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; IFeedItem item <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>IFeedItem<span style="color: #000000;">&#41;</span>items.<span style="color: #0000FF;">Item</span><span style="color: #000000;">&#40;</span>index<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// Access the item.Xml if you need to, or use the</span><br />
&nbsp; &nbsp; <span style="color: #008080; font-style: italic;">// title, link, description, comments, etc...</span><br />
&nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">Title</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">Link</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;=================================&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; <span style="color: #008080; font-style: italic;">// Once we've processed them, mark them as read.</span><br />
&nbsp; feed.<span style="color: #0000FF;">MarkAllItemsRead</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <br />
&nbsp; <span style="color: #008080; font-style: italic;">// Some extra information</span><br />
&nbsp; Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{0} unread out of {1} &quot;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;total items in RSS Platform storage.&quot;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">+</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\n</span>Press ENTER to continue.<span style="color: #008080; font-weight: bold;">\n</span>&quot;</span>, <br />
&nbsp; &nbsp; itemCount <span style="color: #008000;">-</span> readCount, itemCount<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span><br />
<span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span><br />
&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/windows-rss-platform-part-the-first/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOM Recommender Progress</title>
		<link>http://huddledmasses.org/som-recommender-progress/</link>
		<comments>http://huddledmasses.org/som-recommender-progress/#comments</comments>
		<pubDate>Sat, 06 Jan 2007 18:37:14 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://HuddledMasses.org/jaykul/som-recommender-progress/</guid>
		<description><![CDATA[Rather than just keep everything here in my blog, I created a "Trac":http://trac.edgewall.org/ website so that those of you who are interested can easily track my progress.  I'm hosting that site on my home server (on residential cable) so if you have problems accessing it, it's probably just momentarily off-line, it's at "somr.jaykul.org":http://somr.jaykul.org/trac/.  Trac has a "timeline":http://somr.jaykul.org/trac/timeline which will allow you to easily see the subversion checkins, as well as tracking my "progress against the milestones":http://somr.jaykul.org/trac/roadmap that I set out in my "project proposal":http://huddledmasses.org/jaykul/recommender-project-proposal-accepted/.]]></description>
			<content:encoded><![CDATA[	<p>Well, I&#8217;ve decided to refer to my <span class="caps">SOM</span> Recommender by the initialism <span class="caps">SOMR</span> (which for the sake of the argument, I pronounce &#8220;sommer&#8221; like &#8220;summer&#8221; but with an o), and I&#8217;ve been working on it for about a month. It&#8217;s been a busy month outside of working on this project, with end-of-year stuff at work, and of course, the Christmas holiday with family, but I&#8217;m basically tracking correctly on my schedule despite that. <span id="more-363"></span></p>

	<h3>A Better Project Site</h3>

	<p>Rather than just keep everything here in my blog, I created a <a href="http://trac.edgewall.org/">Trac</a> website so that those of you who are interested can easily track my progress.  I&#8217;m hosting that site on my home server (on residential cable) so if you have problems accessing it, it&#8217;s probably just momentarily off-line, it&#8217;s at <a href="http://somr.jaykul.org/trac/">somr.jaykul.org</a>.  Trac has a <a href="http://somr.jaykul.org/trac/timeline">timeline</a> which will allow you to easily see the subversion checkins, as well as tracking my <a href="http://somr.jaykul.org/trac/roadmap">progress against the milestones</a> that I set out in my <a href="http://huddledmasses.org/jaykul/recommender-project-proposal-accepted/">project proposal</a>.</p>

	<p><a href="http://somr.jaykul.org/trac/">The somr site</a> also allows you to easily <a href="http://somr.jaykul.org/trac/browser">browse the source</a> in the subversion tree, and it has a wiki, which I&#8217;ll be updating more frequently with progress and ideas that come to me as I&#8217;m working.  I&#8217;ll still be posting updates here once a month or so to update those who are less interested in the details.</p>

	<h3>Current Progress</h3>

	<p>The <a class="wiki" href="http://somr.jaykul.org/trac/wiki/WebDownloader">WebDownloader</a> and scraper are done, and I&#8217;ve created the database schema and saved a bunch of <span class="caps">SQL</span> scripts so I can recreate it later as part of the installer?  </p>

	<p>I also created a <a class="wiki changeset" href="http://somr.jaykul.org/trac/changeset/30">SomrDataSet</a> class to handle the interface to the database storage, and a small set of tests for each of these items to validate that they work.  </p>

	<h4>Problems with tests</h4>

	<p>At this point, most of these tests serve more as an example of how to use the classes than as comprehensive test, so I have in mind to try and get some coverage tests going as well to make sure that I have 100% code coverage in the tests going forward (although that will be awfully difficult with the <a class="source" href="http://somr.jaykul.org/trac/browser/trunk/Recommender/Code/Del.icio.us%20Scraper/SomrDataSet.Designer.cs">SomrDataSet.Designer.cs</a> which has quite a lot of generated code in it that I may not really need).</p>

	<h3>The Windows <span class="caps">RSS</span> Platform</h3>

	<p>I&#8217;ve also discovered the new <a class="ext-link" href="http://msdn2.microsoft.com/en-us/library/ms684701.aspx">Windows <span class="caps">RSS</span> Platform</a>, which is part of IE7, and as a result, is built into Vista.  I&#8217;ve <a class="wiki changeset" href="http://somr.jaykul.org/trac/changeset/31">created a simple test case</a> to see how it works, and it&#8217;s pretty simple, and fairly slick. It seems like the absolute best way to parse the <a class="ext-link" href="http://del.icio.us/recent">recent feed</a> because it will continuously download the feed in the background even <span class="caps">SOMR</span> isn&#8217;t running. </p>

	<p>Using the <span class="caps">RSS</span> platform would mean that <span class="caps">SOMR</span> itself would never have to download the feed for recent items at start up, and would be guaranteed a larger number of items to evaluate, since the <span class="caps">RSS</span> Platform service can retrieve the feed as often as every five minutes even when <span class="caps">SOMR</span> isn&#8217;t running.</p>

	<p><strong>However</strong>: it&#8217;s probably not the best way to handle downloading <i>user</i> or <i>URL</i> pages, as downloading through the <span class="caps">RSS</span> Platform seems to require adding the feed to the collection and then invoking the download method.  Considering the number of feeds we&#8217;d be processing (a feed for each <span class="caps">URL</span> we find in the <i>recent</i> feed) it seems like a bad idea to add them to the <span class="caps">RSS</span> platform collection, since we don&#8217;t want to be downloading thousands of feeds on a regular basis.</p>

	<p>Although it might be simplest to parse all the feeds through the Windows <span class="caps">RSS</span> &#8220;normalizer,&#8221; I&#8217;m not entirely convinced.  There are basically two feeds I have to deal with on <a href="http://del.icio.us">del.icio.us</a>: the <em>recent feed</em> and the <em><span class="caps">URL</span> feeds</em> ... even if I&#8217;m getting the recent feed through the platform, it might be worth handling the <span class="caps">URL</span> feeds myself.</p>

	<h2>Issues:</h2>

	<h4>How much data do I need to validly map a URL?</h4>

	<p>Can I really tell if a <span class="caps">URL</span> is interesting when it&#8217;s only been bookmarked by 2 people (unless I knew those people were &#8220;like me&#8221;)?</p>

	<h4>Is it possible it might be interesting later?</h4>

	<p>That is, if I test a <span class="caps">URL</span> initially when it&#8217;s only been bookmarked by 2 people, and it fails to be interesting based on keyword tags, should I retest it when it&#8217;s been bookmarked by 5 or 10 people?  How about when it&#8217;s been bookmarked by 25 or 50?</p>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/som-recommender-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recommender Project Proposal &#8211; Accepted</title>
		<link>http://huddledmasses.org/recommender-project-proposal-accepted/</link>
		<comments>http://huddledmasses.org/recommender-project-proposal-accepted/#comments</comments>
		<pubDate>Fri, 15 Dec 2006 18:10:31 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>

		<guid isPermaLink="false">http://HuddledMasses.org/jaykul/recommender-project-proposal-accepted/</guid>
		<description><![CDATA[My project proposal was accepted, and I've started working on code and databases. I'll be posting regular updates here, along with a link to my subversion server, but I wanted to start by posting a short summary of my project... 

The project comprises designing and implementing a hybrid recommender system for webâ€“pages which uses data from a social tagging system to recommend interesting items to users... The focus of the programming project will be a scraper for gathering tagged URLs from "del.icio.us":http://del.icio.us, a visualizer, and the recommender.]]></description>
			<content:encoded><![CDATA[	<p>After some <a href="http://huddledmasses.org/downloads/recommender/Research.pdf">extensive research</a>, I decided to go the <em>project</em> route instead of the <em>thesis</em> route at <a href="http://www.cs.rit.edu">RIT</a>, primarily because I&#8217;m not immediately going to be working toward a doctorate.  But also because I&#8217;m still a bit more interested in the code part of the research, and the project defense is rumored to be easier than the thesis, without the requirement to prove that my idea is original.  At the end of the day, I&#8217;m still working full time, and have a family, so my primary concern right now is to get my degree completed as soon as I can.</p>

	<p>My project proposal was accepted, and I&#8217;ve started working on code and databases. I&#8217;ll be posting regular updates here, along with a link to my subversion server, but I wanted to start by posting a short summary of my project.</p>

	<blockquote>
		<p>The project comprises designing and implementing a hybrid recommender system for webâ€“pages which uses data from a social tagging system to recommend interesting items to users. For the initial implementation, the tagging data will come from <a href="http://del.icio.us">del.icio.us</a>, one of the oldest and largest public social bookmarking systems. The system will cluster items using a selfâ€“organizing map (<span class="caps">SOM</span>) network and will include a new <span class="caps">SOM</span> visualizer that allows users to see and modify the systemâ€™s evaluation of their regions of interest.</p>
		<p>The focus of the programming project will be a scraper for gathering tagged URLs from <a href="http://del.icio.us">del.icio.us</a>, a visualizer, and the recommender. The <span class="caps">SOM</span> network code will be based on existing implementations, and two recommenders will be built, to compare the relative quality of the recommendations: with one using a single map for URLs and users and the other using separate maps.</p>
	</blockquote>

	<p>For those who are interested, <a href="http://huddledmasses.org/downloads/recommender/Proposal.pdf">the full project proposal is here</a> with a short specification and design document, as well as my proposed schedule &#8212; that I&#8217;m not too far off of, so far  <img src='http://huddledmasses.org/wordpress/wp-includes/' alt=';)' class='wp-smiley' /> .</p>

]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/recommender-project-proposal-accepted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Week 2 &#8211; Progress</title>
		<link>http://huddledmasses.org/week-2-progress/</link>
		<comments>http://huddledmasses.org/week-2-progress/#comments</comments>
		<pubDate>Tue, 20 Jun 2006 17:12:26 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.huddledmasses.org/jaykul/week-2-progress/</guid>
		<description><![CDATA[My wife and I went on vacation for most of last week, so I didn&#8217;t get a whole lot done on my research. I did some searching online for projects and papers related to SOM classifiers, and found a couple that show promise in the sense of incorporating their methods into my project, but nothing [...]]]></description>
			<content:encoded><![CDATA[	<p>My wife and I went on vacation for most of last week, so I didn&#8217;t get a whole lot done on my research.</p>

	<p>I did some searching online for projects and papers related to <span class="caps">SOM</span> classifiers, and found a couple that show promise in the sense of incorporating their methods into my project, but nothing that goes beyond using the <span class="caps">SOM</span> itself as the classifier, and all of the articles related to SOMs seem to involve analysing the full text of documents using TF/<span class="caps">IDF</span> except one, which has an interesting approach to use the <span class="caps">SOM</span> itself to generate weights, but still analyzes the full text of the document.</p>

	<p>I also found a couple of very good background papers including an article on <a href="http://www.citeulike.org/user/lberning/article/566157">what folsonomies are</a>, and <a href="http://www.adammathes.com/academic/computer-mediated-communication/folksonomies.html">a detailed analysis</a> of their strengths and weaknesses.</p>

	<p>This was a slow week, but I&#8217;m ramping up for next week. I have several other papers to read, and I&#8217;m starting to look at how I can best use the <span class="caps">SOM</span> for strict classification, and whether or not applying a Bayes Net on top of it is the best approach.  Hopefully I&#8217;ll get a start on some code for that this week.</p>

	<p>As a side note: I did get to see the Tony Award winning <a href="http://www.montypythonsspamalot.com/">Monty Python&#8217;s Spamalot</a> in DC last week.  It was excellent, and I highly recommend it <em>only</em> to those of you who enjoyed the movie <em>Monty Python and the Holy Grail</em>, from which it is <ins>lovingly</ins> ripped off.</p>

	<p>I&#8217;m also updating <a href="http://www.citeulike.org/user/Jaykul/tag/msproject">my CiteULike page</a> with all of the articles I&#8217;ve been reading, nicely tagged and with my comments on each, in case you want to follow along.</p>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/week-2-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Masters: Thesis or Project</title>
		<link>http://huddledmasses.org/masters-thesis-or-project/</link>
		<comments>http://huddledmasses.org/masters-thesis-or-project/#comments</comments>
		<pubDate>Wed, 14 Jun 2006 14:41:03 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.huddledmasses.org/jaykul/masters-thesis-or-project/</guid>
		<description><![CDATA[Well, I&#8217;ve started taking the &#8220;MS Thesis and Project Seminar&#8221; course at RIT, which is the first step towards registering my Thesis (or project) with the school and finishing off my degree! I&#8217;m currently nursing two main ideas for projects related to Artificial Intelligence, and this past week I met with Jessica Bayliss to discuss [...]]]></description>
			<content:encoded><![CDATA[	<p>Well, I&#8217;ve started taking the &#8220;MS Thesis and Project Seminar&#8221; course at <span class="caps">RIT</span>, which is the first step towards registering my Thesis (or project) with the school and finishing off my degree!</p>

	<p>I&#8217;m currently nursing two main ideas for projects related to Artificial Intelligence, and this past week I met with Jessica Bayliss to discuss the second idea and started work on a independent study focusing on refining this second idea and determining whether it&#8217;s Thesis material or not.  The majority of what I did this week, and plan to do over the next week is researching the existing research in the area of Self-Organizing Maps and classifiers, including reviewing my <a href="/projects/independent/report/ANNTagger.pdf">previous research</a> to refresh my memory.</p>

	<p>I&#8217;ve also created draft documentation of both ideas as posts on my blog. I&#8217;ve linked to them below, but these posts posts will change a lot over the next couple of months, and are marked &#8220;private&#8221; and thus not accessible to the general public &#8230; sign up on the front page and <a href="/email">drop me a line</a> if you&#8217;re really interested.</p>

	<ol>
		<li>The first is a project idea for a <a href="http://www.huddledmasses.org/jaykul/masters-project-proposal/">Learning Notification System</a> which would give more control over computer notifications and alerts to the end user.  The primary product is a system akin to <a href="http://growl.info/">GROWL</a> for the Mac, but with multiple levels of alerts, and a learning classification algorithm which allows the computer to intelligently <em>avoid</em> interrupting the user.</li>
	</ol>
	<ol>
		<li>The second idea is for a full-blown Thesis, which I&#8217;m not really sure I want to attempt.  However, this <a href="http://www.huddledmasses.org/jaykul/masters-thesis-proposal/">idea for an SOM-based classifier</a> <em>could</em> also be done as a project, and in either case would actually be fairly interesting.  It revolves around the idea of building a classification system based on <span class="caps">SOM</span> algorithms.  Currently there&#8217;s many parts to this idea, and it&#8217;s really possible that this could be fodder for several project-length experiments.</li>
	</ol>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/masters-thesis-or-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Masters Thesis Proposal: An SOM Classifier</title>
		<link>http://huddledmasses.org/masters-thesis-proposal/</link>
		<comments>http://huddledmasses.org/masters-thesis-proposal/#comments</comments>
		<pubDate>Wed, 14 Jun 2006 14:32:57 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.huddledmasses.org/jaykul/masters-thesis-proposal/</guid>
		<description><![CDATA[The basic idea here is to build a classification system based on SOM algorithms which can be used to pick &#8220;interesting&#8221; articles from sites like delicious, diigo, magnolia, and lilisto (I have a partial list of possible sites here). There are currently several parts to this idea, and it&#8217;s really possible that this could be [...]]]></description>
			<content:encoded><![CDATA[	<p>The basic idea here is to build a classification system based on <span class="caps">SOM</span> algorithms which can be used to pick &#8220;interesting&#8221; articles from sites like <a href="http://del.icio.us/">delicious</a>, <a href="http://www.diigo.com/">diigo</a>, <a href="https://ma.gnolia.com/">magnolia</a>, and <a href="http://lilisto.com/">lilisto</a>  (I have a partial list of possible sites <a href="http://del.icio.us/Jaykul/%40Public/WebServices/Bookmarking">here</a>).</p>

	<p>There are currently several parts to this idea, and it&#8217;s really possible that this could be fodder for several project-length experiments.</p>

	<h3>The first question</h3>

	<p>Can I build a classifier which rates documents on how closely they match your interests, based on placing them in a self-organizing map which uses keywords to position the document.  I have already built an algorithm which applies <span class="caps">GHSOM</span> to the relationship between keywords which were applied to documents, so the task here is mainly to see how useful this information is for mapping additional documents and for classifying them by interest.</p>

	<p>The next steps:</p>

	<ol>
		<li>Apply the algorithm to individual documents and see where they are placed</li>
		<li>Determine the area of the map that represents the user&#8217;s interests (either by inference from having them rate documents, or by directly &#8220;circling&#8221; on the map their area(s) of interest)</li>
	</ol>
	<ol>
		<li>Rate documents by their (multi-dimensional) proximity to these areas.</li>
	</ol>

	<h3>The second question</h3>

	<p>Is this method more effective when using keywords generated by actual people than when it uses machine-generated keywords.  There are many existing document sumarizing and <a href="http://patft1.uspto.gov/netacgi/nph-Parser?patentnumber=6470307">keyword extraction</a> algorithms, and even commercial products (eg: <a href="http://www.lextek.com/brevity/">brevity</a> <a href="http://summarizer.intellexer.com/">intellexer</a>). One or more of these could be run on the document to extract keywords instead of using the human-generated keywords available on delicious et. al. This would make the algorithm more capable of analyzing &#8220;any&#8221; documents, and would reduce dependency on the websites mentioned earlier (although this seems important, it may be of limited use, since the intent is to classify interesting documents from an incoming &#8220;stream&#8221; of documents, and currently my &#8220;stream&#8221; comes from these same sites where the keywords come from).  </p>

	<p>The next steps:</p>

	<ol>
		<li>Create a collection of documents with their human-generated keywords</li>
		<li>Run machine summarizing algorithms on these documents</li>
	</ol>
	<ol>
		<li>Compare the resulting mappings for relevancy ( <ins>what is the metric here?</ins> )</li>
	</ol>

	<h3>Additional questions</h3>

	<p>The most important open question (to me) is whether this idea is original enough to work as a thesis at <span class="caps">RIT</span> (as opposed to becoming a project).  If it&#8217;s not, I&#8217;m leaning toward working on <a href="http://www.huddledmasses.org/jaykul/masters-project-proposal/">a different project</a> which is somewhat more interesting to me.</p>

	<p>However, there are several other open questions: </p>

	<ul>
		<li>Is <span class="caps">GHSOM</span> better than a non-hierarchical growing <span class="caps">SOM</span>, or even a simple <span class="caps">SOM</span> algorithm for this task? (Instinctively, it seems that the key requirement is that the map size must be inferred, and thus that a growing algorithm is required, but the hierarchy may be uneccessary).</li>
	</ul>
	<ul>
		<li>How does this system using free keywords (anything can be a keyword, including the user-name of the person who creates the keywords) compare to a system which has set categories.  It seems that the classification would have much less adapting to do in a situation where categories are limited, since in the current system new keywords are constantly being added to the database and the algorithm must infer a user&#8217;s interest in these new keywords.</li>
	</ul>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/masters-thesis-proposal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Masters Project Proposal: A Learning Notification System</title>
		<link>http://huddledmasses.org/masters-project-proposal/</link>
		<comments>http://huddledmasses.org/masters-project-proposal/#comments</comments>
		<pubDate>Thu, 01 Jun 2006 16:35:24 +0000</pubDate>
		<dc:creator>Joel 'Jaykul' Bennett</dc:creator>
				<category><![CDATA[Recommender]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Rants]]></category>

		<guid isPermaLink="false">http://www.huddledmasses.org/jaykul/masters-project-proposal/</guid>
		<description><![CDATA[There are many opportunities for the use of AI in improving mainstream user interfaces. One particular area where little has been done is in the way our computers &#8220;alert&#8221; us of problems or information that we may need to know. Current operating systems provide little or no way for the user to control this, making [...]]]></description>
			<content:encoded><![CDATA[	<p>There are many opportunities for the use of AI in improving mainstream user interfaces.  One particular area where little has been done is in the way our computers &#8220;alert&#8221; us of problems or information that we may need to know.  Current operating systems provide little or no way for the <strong>user</strong> to control this, making no attempts to filter the information presented to the user (intelligently or otherwise), leaving the burden of optimizing notifications and alerts to the individual applications.</p>

	<p>Individual application developers, on the other hand, only have control over the way <em>their</em> specific application interacts with the user, and perceive that providing less alerts than other apps, or providing them in a way that is less intrusive than the norm, will be seen by users as inconsistent, and could be considered annoying or even &#8220;buggy&#8221; by end users.  Furthermore, providing sophisticated means for the user to determine what alerts or notifications they see is of little use on a per-application basis for most applications, so few developers have made any efforts in this regard, other than developers of email and instant messaging or news readers applications.</p>

	<p>To illustrate the current state of the art, and show where it is lacking, take Outlook 2003, an example many will be familiar with. Outlook allows you to have sounds play or alerts pop up based on rules you create which are applied to incoming email, but it is not context aware, so is not able, for instance, to avoid playing sounds when you are in a meeting, nor can it choose to use sound alerts instead of popups when the screensaver is engaged. Outlook also lacks any form of learning or intelligence, so it can only perform these notifications based on specific rules the user has created: if you have a rule to be notified when you recieve an email from your manager, it&#8217;s based on the email address, and will not activate if, for instance, your manager emails you from home.</p>

	<p>We propose a way to give more control to the end user by building a notification system with multiple types of alerts, and allowing the user to control which applications and indeed, which specific notifications are allowed to use which types of alerts.  Further, we propose that the operating system itself could ease the burden on end users by building &#8220;smart&#8221; filters based on machine learning algorithms, which can adapt to individual user&#8217;s prefferences and help create adaptive rules for rating the importance and urgency of incoming messages to determine which notifications a user wants to see. Lastly, we propose a contextual awareness system which will modify the ratings of messages based on information about the current state of the user, whether that be in a meeting, playing a game, away from the computer but still in the room, or even out of the office, but available by phone.</p>

	<p>We intend to provide a baseline implementation of this as a <em>replacement</em> for the Windows &#8220;system notification tray.&#8221;  This will be implemented using the <a href="http://sourceforge.net/projects/winshellex">Windows Shell Exchanger</a> toolkit which allows multiple system tray applications to run at the same time, and thus allows our app to run over Explorer, GeoShell or other third-party shells. We will, of course, implement additional APIs for delevopers of third party apps (beyond that of the system tray) which would include additional information for the filters &#8230; but we will endeavor to allow users to create rules for any application that currently uses the default Windows system tray notification area. Our implementation will provide multiple levels of alerts, starting with no notification at all, and progressing through just changing icons, and through sound alerts, and &#8220;toast&#8221; windows to modal popups and even email, <span class="caps">SMS</span>, and pager notification.</p>

	<p>Our implementation will also include <ins>bayesian?</ins> learning filters <ins>based on an implementation from POPFile?</ins> which allows us to automatically categorize different alert or notification messages based on content, source, and source-assigned alert levels.  While this learning system is expected to have only rudimentary success on current system tray applications, we provide a sample application <ins>in the form of a calendar app?</ins> which uses multiple &#8220;levels&#8221; of alerts as provided in our system&#8217;s <span class="caps">API</span>, and will do user testing which we expect will prove that when the system has this full information, it is able to substantially reduce user irritation by prompting the user less frequently and less intrusively than current systems.<span id="more-299"></span></p>

	<p>Possible parameters from third party applications include:</p>

	<ul>
		<li><strong>Message Type</strong> &#8211; A classification for the message
	<ol>
		<li><strong>Notification</strong> &#8211; just letting the user know about something (eg: &#8220;now playing&#8221; notifications from your media player)</li>
		<li><strong>Alert</strong> &#8211; warning the user about something unexpected or about a potential problem (eg: network connection lost, out of space on volume, unable to execute background function (backups, scheduled tasks, etc).</li>
		<li><strong>BoolQuery</strong> &#8211; a yes/no question for the user (eg: are you sure you want to delete? are you sure you want to overwrite? ... )</li>
	</ol></li>
	<ol>
		<li><strong>FreeformQuery</strong> &#8211; more complicated questions</li>
	</ol></li>
		<li><strong>Reversible</strong>  &#8211; Whether the action (if any) is easily reversible (eg: a query about &#8220;are you sure you want to send to the recycle bin&#8221; is reversible, but &#8220;are you sure you want to delete&#8221; is not)</li>
		<li><strong>Importance</strong> &#8211; Application-defined importance in a range from 0 to 4</li>
	</ul>
	<ul>
		<li><strong>Urgency</strong> &#8211; Application-defined time-sensitivity of the message, from 0 to 4</li>
	</ul>]]></content:encoded>
			<wfw:commentRss>http://huddledmasses.org/masters-project-proposal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

