<?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>undesigned</title>
	<atom:link href="http://www.joelduffin.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.joelduffin.com/blog</link>
	<description>life is a rum go guv’nor, and that’s the truth</description>
	<lastBuildDate>Thu, 23 Feb 2012 15:43:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lean user experience</title>
		<link>http://www.joelduffin.com/blog/2012/02/23/lean-user-experience/</link>
		<comments>http://www.joelduffin.com/blog/2012/02/23/lean-user-experience/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 15:43:41 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=530</guid>
		<description><![CDATA[&#8220;There are many techniques for building an accurate customer archetype that have been developed over long years of practice in the design community. Traditional approaches such as interaction design or design thinking are enormously helpful. To me, it has always seemed ironic that many of these approaches are highly experimental and iterative, using techniques such [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;There are many techniques for building an accurate customer archetype that have been developed over long years of practice in the design community. Traditional approaches such as interaction design or design thinking are enormously helpful. To me, it has always seemed ironic that many of these approaches are highly experimental and iterative, using techniques such as rapid prototyping and in-person customer observations to guide designers&#8217; work. Yet because of the way design agencies traditionally have been compensated, all this work culminates in a monolithic deliverable to the client. All of a sudden, the rapid learning and experimentation stops; the assumption is that the designers have learned all there is to know. For startups this is an unworkable model. No amount of design can anticipate the many complexities of bringing a product to life in the real world. In fact, a new breed of designers is developing brand-new techniques under the banner of Lean User Experience. They recognize that the customer archetype is a hypothesis, not a fact.&#8221; Eric Ries, The Lean Startup, p.90</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2012/02/23/lean-user-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OER Recommender at RecSysTEL</title>
		<link>http://www.joelduffin.com/blog/2010/09/30/oer-recommender-at-recsystel/</link>
		<comments>http://www.joelduffin.com/blog/2010/09/30/oer-recommender-at-recsystel/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 07:08:21 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[recommender]]></category>
		<category><![CDATA[research]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=488</guid>
		<description><![CDATA[I&#8217;m presenting OER Recommender at RecSysTEL today

]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m presenting <a href="http://oerrecommender.org">OER Recommender</a> at <a href="http://adenu.ia.uned.es/workshops/recsystel2010/">RecSysTEL</a> today</p>
<p><iframe src="https://docs.google.com/present/embed?id=ddfznmqr_199dcm9q6kb" frameborder="0" width="410" height="342"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/09/30/oer-recommender-at-recsystel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Everytime I boot into Windows I have to install a critical security update</title>
		<link>http://www.joelduffin.com/blog/2010/09/23/everytime-i-boot-into-windows-i-have-to-install-a-critical-security-update/</link>
		<comments>http://www.joelduffin.com/blog/2010/09/23/everytime-i-boot-into-windows-i-have-to-install-a-critical-security-update/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 20:56:14 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=486</guid>
		<description><![CDATA[I&#8217;ve had a Mac for years but used it mostly for testing. I always laughed at the religiously zealous mac users. Last October I switched my day to day computer work from Windows to Mac.  My only regret is that I waited so long to switch. I turn on my Windows box about once a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a Mac for years but used it mostly for testing. I always laughed at the religiously zealous mac users. Last October I switched my day to day computer work from Windows to Mac.  My only regret is that I waited so long to switch. I turn on my Windows box about once a week now. It seems like every time I do it asks me to install a critical security update. Just another good reason for the switch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/09/23/everytime-i-boot-into-windows-i-have-to-install-a-critical-security-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Models for Math</title>
		<link>http://www.joelduffin.com/blog/2010/09/08/introducing-models-for-math/</link>
		<comments>http://www.joelduffin.com/blog/2010/09/08/introducing-models-for-math/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 23:36:02 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[geogebra]]></category>
		<category><![CDATA[interactive online math]]></category>
		<category><![CDATA[math education]]></category>
		<category><![CDATA[nlvm]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=480</guid>
		<description><![CDATA[Tonight I will be leading a discussion about the NLVM, eNLVM, and a new site called Models for Math.
Models for Math is partnering with providers of interactive open content for math, including the GeoGebra community, to provide free hosting of websites where they can author  and deliver online lessons. Models for Math will offer [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I will be leading a <a href="http://mathfuture.wikispaces.com/NLVM">discussion about the NLVM, eNLVM, and a new site called Models for Math</a>.</p>
<p><a href="http://www.modelsformath.com/">Models for Math</a> is partnering with providers of interactive open content for math, including the <a rel="nofollow" href="http://geogebra.org/">GeoGebra</a> community, to provide free hosting of websites where they can author  and deliver online lessons. <a href="http://www.modelsformath.com/">Models for Math</a> will offer free accounts for  individual teachers that allow them to use <a href="http://nlvm.usu.edu/">NLVM</a> and <a href="http://enlvm.usu.edu/">eNLVM</a> materials and  other open content. <a href="http://www.modelsformath.com/">Models for Math</a> will sell affordable  subscription-based interactive online math websites for schools and  districts. Revenue from subscriptions will allow <a href="http://www.modelsformath.com/">Models for Math</a> to  continue to improve its online learning environment and to support the  development of high quality interactive online content for mathematics. Come to the meeting or visit the <a href="http://www.modelsformath.com/">Models for Math</a> website to learn more.</p>
<div>
<p>The meeting will be held in Elluminate, Wednesday, September  8th 2010 at 6:30pm Pacific / 9:30pm Eastern. To attend the meeting:</p>
<ol>
<li>Follow this link: <a href="http://tinyurl.com/math20event">http://tinyurl.com/math20event</a></li>
<li>Click “OK” and “Accept” several times as your browser installs the  software. When you see Elluminate Session Log-In, enter your name and  click the “Login” button.</li>
<li>You will find yourself in a virtual room. An organizer will be there to greet you, starting about half an hour before the event.</li>
</ol>
<p>If this is your first Elluminate event, consider coming a few minutes  earlier to check out the technology. The room opens half an hour before  the event.</p>
<p>The discussion is part of the <a href="http://mathfuture.wikispaces.com/events">Math 2.0 Interest Group weekly online event series</a>. The Math 2.0 Interest Group is a creation of <a href="http://www.naturalmath.com/blog/">Maria Droujkova</a>.  The goals of the Math 2.0 Interest Group meetings are to “share  resources, to collaborate on our projects, and to save mathematics from  its current obscurity in social media. From the comfort of your browser,  join live conversations and debates with authors, community leaders,  and innovators in mathematics education.”</div>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/09/08/introducing-models-for-math/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started with Hadoop on Amazon&#8217;s elastic mapreduce</title>
		<link>http://www.joelduffin.com/blog/2010/09/08/getting-started-with-hadoop-on-amazons-elastic-mapreduce/</link>
		<comments>http://www.joelduffin.com/blog/2010/09/08/getting-started-with-hadoop-on-amazons-elastic-mapreduce/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 15:23:54 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[recommender]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=474</guid>
		<description><![CDATA[After playing with Hadoop a bit in the past, I&#8217;m now trying out some things on Amazon&#8217;s Elastic MapReduce.
I signed up for a new AWS account and ran their sample LogAnalyzer Job Flow using the AWS console. That was easy enough. Next I attempted to run the same sample from the command line using the [...]]]></description>
			<content:encoded><![CDATA[<p>After playing with Hadoop a bit in the past, I&#8217;m now trying out some things on <a href="http://aws.amazon.com/elasticmapreduce/">Amazon&#8217;s Elastic MapReduce</a>.</p>
<p>I signed up for a new AWS account and ran their <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2440">sample LogAnalyzer Job Flow</a> using the AWS console. That was easy enough. Next I attempted to run the same sample from the command line using the <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2264">Amazon Elastic MapReduce Ruby Client</a>.</p>
<p><strong>Note</strong>: The <a href="http://github.com/tc/elastic-mapreduce-ruby/blob/master/README">Ruby Client README</a> turns out to be very helpful.</p>
<p>Next I downloaded the source and looked at. Seems simple enough. I notice that this sample uses a library called <a href="http://www.cascading.org/">Cascading</a>, which appears to be a way to simplify common job flow tasks.</p>
<p>After adding the elastic-mapreduce app to my path and setting up my credentials file, I ran:</p>
<p>elastic-mapreduce &#8211;create &#8211;jar  s3n://elasticmapreduce/samples/cloudfront/logprocessor.jar &#8211;args  &#8220;-input,s3n://elasticmapreduce/samples/cloudfront/input,-output,s3n://folksemantic.com/cloudfront/log-reports,-start,any,-end,2010-09-07-21,-timeBucket,300,-overallVolumeReport&#8221;</p>
<p>It produced:</p>
<p>INFO Exception Retriable invalid response returned from RunJobFlow: {&#8221;Error&#8221;=&gt;{&#8221;Details&#8221;=&gt;#&lt;SocketError: getaddrinfo: nodename nor servname provided, or not known&gt;, &#8220;Code&#8221;=&gt;&#8221;InternalFailure&#8221;, &#8220;Type&#8221;=&gt;&#8221;Sender&#8221;}} while calling RunJobFlow on Amazon::Coral::ElasticMapReduceClient, retrying in 3.0 seconds.</p>
<p>After some poking around, I realized that I specified &#8220;west-1&#8243; as my region when it should have been &#8220;us-west-1&#8243;. This resulted in the client trying to contact a non-existent server I&#8217;m guessing.</p>
<p>So now, my jobs started, but failed immediately. I logged into the AWS console and clicked on one of the failed job flows to see the reason for the failure (Last State Change Reason):</p>
<p><span>The given SSH key name was invalid</span></p>
<p><span>Googling found: </span>http://developer.amazonwebservices.com/connect/message.jspa?messageID=166768</p>
<p>Which at first confused me, then I went ahead and followed <a href="https://console.aws.amazon.com/ec2/home#c=EC2&amp;s=KeyPairs">the link</a> (while logged in) and did what it said to. (Amazing how that works sometimes <img src='http://www.joelduffin.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) It prompted me to create a new key and to assign it a name.</p>
<p>After I had generated the key and put its name in the credentials.json, things worked like a charm. It turns out that if you run a job from scratch, it has to fire up an EC2 instance in order to run the job, and that can take a while. To avoid that start up time, you can run:</p>
<p>elastic-mapreduce &#8211;create &#8211;alive &#8211;log-uri s3://my-example-bucket/logs</p>
<p>As mentioned in the README.TXT</p>
<p>My next steps are to:</p>
<ol>
<li>Modify the job flow and run that job flow.</li>
<li>Run the job flow locally.</li>
<li>Debug the MapReduce portion of the job flow.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/09/08/getting-started-with-hadoop-on-amazons-elastic-mapreduce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solving aggregation problems</title>
		<link>http://www.joelduffin.com/blog/2010/09/02/hadoop-based-aggregation-and-recommendation/</link>
		<comments>http://www.joelduffin.com/blog/2010/09/02/hadoop-based-aggregation-and-recommendation/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 23:27:21 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[recommender]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=456</guid>
		<description><![CDATA[In Folksemantic, we run into the following problems:

Duplicate entries. Search and recommendation results that list multiple entries for the same resource.
Catalog pages. Search and recommendation results that link to catalog pages for resources (people would rather go directly to the resource, but the metadata providers want people to go to their catalog entry for the [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.folksemantic.com">Folksemantic</a>, we run into the following problems:</p>
<ul>
<li><strong>Duplicate entries</strong>. Search and recommendation results that list multiple entries for the same resource.</li>
<li><strong>Catalog pages</strong>. Search and recommendation results that link to catalog pages for resources (people would rather go directly to the resource, but the metadata providers want people to go to their catalog entry for the resource).</li>
<li><strong>Dead links</strong>. Results that link to resources that no longer exist.</li>
<li><strong>Urls without metadata</strong>. When someone shares a resource or inserts the recommender widget in a page for which we don&#8217;t have metadata, we need to be able to generate metadata.</li>
</ul>
<p>Duplicate entries show up because:</p>
<ul>
<li>Two feeds specify entries with the same permalink.</li>
<li>The same feed gets added twice (maybe different formats for the same feed, eg. RSS, Atom)</li>
<li>Multiple catalogs provide metadata for the same resource.</li>
</ul>
<h3>Dealing With Duplicate Feeds</h3>
<p><strong>Problem</strong>: In folksemantic a user can enter the url of their blog and we will detect the feeds from the page and add them. We use the feeds to generate personal recommendations. The problem is, a blog typically has 3 or more feeds all of which contain the same content, just provided in different formats (e.g. RSS, Atom etc). So we really don&#8217;t want all of the feeds to be generated.</p>
<p><strong>Solution 1</strong>: One approach to solving this is to try to detect the duplicate feed the first time we harvest it, don&#8217;t add its entries to the index, and then flag the feed as &#8220;duplicate&#8221; so that we don&#8217;t harvest it again. Store in the feed the id of the feed it duplicates. One potential problem with this is that if someone registers a feed that has just the entries tagged a certain way (e.g. all of the entries tagged apple on the gizmodo feed), then if the main feed is already registered, all of the entries on the filtered feeds duplicate the entries in the main feed, so the entries are duplicate, but the feed is not. If we want to use the feed as a basis for making recommendations to the user, we don&#8217;t want to use the main feed.</p>
<p><strong>Solution 2</strong>: Another approach to the problem is to just add the feed, and harvest it, but then flag the entries as duplicates. Our thought about doing this is to store in each entry a list all of the feeds that the entry belongs to. We need to verify that this won&#8217;t slow down our Lucene queries.</p>
<p><strong> </strong>It seems that Solution 2 may be best and make it up to the app to avoid adding duplicate feeds (like the 4 feeds for the same blog that Folksemantic does).</p>
<h3>Dealing with Catalog Entries</h3>
<p><strong> </strong>A number of NSDL and other projects such as OER Commons  have created large catalogs of online resources. Sometimes their metadata is harvested directly from the resource websites. Sometimes they enhance that metadata with new information. Sometimes they create metadata for resources that don&#8217;t provide their own metadata. The catalog websites often provide services such as rating, discussion, and other valuable services and so they want people to come to their websites and use them. While, these services are nice, when people are searching for resources, they likely want to look at the resource first and make their own judgement if that is possible, and then read more about it if they are interested. I think this is because the cost of looking at an online resource is minimal (as compared to buying something or attending a course, for example). So the catalog issue leads to two problems:</p>
<p><strong>Problem</strong>: When people see search results, they likely want to go directly to the resource instead of to a catalog page.</p>
<p><strong>Solution</strong>: When a catalog page is the only entry for a resource, that entry is flagged &#8220;primary&#8221;. As soon as we create an entry that goes directly to the resource, we flag that new entry primary, and the catalog entry as not primary; we also store the id of the catalog entry in the list of duplicate entries that we store in the new entry. When searching, by default return only primary entries unless the application explicitly requests all entries. Return a flag indicating that an entry has catalog entries. Provide an API for requesting catalog entries for a specific entry.</p>
<p><strong>Problem</strong>: In most cases, catalog metadata does not provide the url of the resource it is cataloging.</p>
<p><strong>Solution</strong>: Initially flag the entry as &#8220;primary&#8221; so it will show up in search results. Later, asynchronously crawl the catalog pages to find the url of the catalogued resource. Once the direct url is known, create a new entry for the resource and store the id of the catalog entry in the  list of &#8220;related entries&#8221; that we store for the new entry. Flag the catalog entry as not primary and the new entry as primary. Copy the metadata from the catalog entry into the new entry. Use the resource domain as the key for the feed to add the new entry to. If the feed does not already exist, create one for it.</p>
<p><strong>Problem</strong>: If there are multiple entries (catalog etc for a resource), which metadata should we use to calculate the recommendation for the resource?</p>
<p><strong>Solution</strong>: Options might be: (a) the metadata provided by the resource, (b) metadata generated by a crawl of the resource &#8211; I think this is bad because frequently metadata is more descriptive than the page itself, (c) the first catalog entry found for the resource, (d) the largest set of metadata for the resource. My thought it to always use the largest set of metadata for the resource unless there is no catalog entries (like in the case of where we crawl a website), in which case we must use the metadata generated by the crawl. In order to facilitate this approach, we: (1) for entries, we store whether or not the metadata came from that resource itself or not, (2) whenever we detect a new catalog entry for a resource that already has an entry, we look to see if the metadata in the existing entry was copied from a catalog entry; if it was, compare the size of the metadata from the two entries and update the metadata with the new catalog entry metadata if it is larger. For the purpose of calculating recommendations it might make sense to use all of the metadata from all of the sources.</p>
<p><strong>Problem</strong>: When a website requests recommendations for a url, normally we want to return non-catalog entries, but when a catalog requests recommendations for one of its urls, they likely want their own catalog entries back if they exist.</p>
<p><strong>Solution</strong>: When generating recommendations, for recommended entries that have catalog entries, check those and recommend those catalog entries instead.</p>
<h3>Detecting and Handling Feed Entry Deletions</h3>
<p><strong>Problem</strong>: OAI has a way to tell you that an entry has been deleted, but RSS does not. How can you detect when an entry has been deleted, and what should you do when it is deleted?</p>
<p><strong>Solution</strong>: My thought is that this is just part of what our dead link handler does. It finds entries with dead links and flags them deleted or actually deletes them. When we re-index we remove items from the index that have been flagged deleted.</p>
<h3>Dealing with Dead Links</h3>
<p><strong>Problem</strong>: Many times the resources in our indexes get taken down or moved without notification (the source of the metadata doesn&#8217;t get updated or it doesn&#8217;t get updated for a while). What should we do in that situation?</p>
<p><strong>Solution</strong>: We will write a bot that will flag entries dead. Once entries are dead they won&#8217;t show up in search or recommendation results. Should they still be used as the basis for recommendations? Probably not. Maybe we create another process that looks for the new location of the dead entries?</p>
<h3>Generating Metadata for a URL</h3>
<p><strong>Problem</strong>: When someone adds an entry but doesn&#8217;t provide metadata, we need to be able to generate metadata for the entry. We also need to know which feed to put it into.</p>
<p><strong>Solution</strong>: The application should give us a feed id, or a display url for the feed along with the entry URL. If it does not send a feed ID, we will look for feed using the host portion of the entry permalink. If one does not exist, it will create one and specify the host the display url for the feed, that way future entries for that feed will always go into that feed.</p>
<h3>Generating Recommendations for Web Pages We Haven&#8217;t Indexed Yet</h3>
<p>This is similar to the previous issue, we want people to be able to add the OER Recommender widget to their pages and have them just start working, removing the requirement that they add their resources to our index before we can provide recommendations. We can analyze and provide recommendations in real time, but that tends to bury our server if it gets a bunch of requests for real time recommendations  all at once.</p>
<p><strong>Problem</strong>: Provide recommendations for URLs that haven&#8217;t been indexed yet.</p>
<p><strong>Solution</strong>: When the recommendation is requested, add an entry for the URL, flagging it needing to be scraped. Flag the feed as being not-recommendable. If we don&#8217;t have a domain feed for the URL, add a domain feed for the entry and specify it as the feed for the entry. Queue the feed for approval by site admins.</p>
<p>This brings up the issue of being able to narrow the scope of the space into which recommendations are made. Depending on the context, we want to consider different sets of items to recommend. For example, in folksemantic, for personal recommendations we let users add feeds they produce, but we don&#8217;t necessarily want to include their stuff in recommendations that we make to other people.</p>
<p><strong>Problem</strong>: Narrow the scope of the space that we recommend items from.</p>
<p><strong>Solution</strong>: Define recommendation tasks by specifying the aggregation of feeds that we are recommending from and the aggregation of feeds that we are recommending into. Store those ids in the recommendation table.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/09/02/hadoop-based-aggregation-and-recommendation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring Apache and Tomcat to serve my java web application through port 80</title>
		<link>http://www.joelduffin.com/blog/2010/08/16/configuring-apache-and-tomcat-to-serve-my-java-web-application-through-port-80/</link>
		<comments>http://www.joelduffin.com/blog/2010/08/16/configuring-apache-and-tomcat-to-serve-my-java-web-application-through-port-80/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 14:15:33 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=445</guid>
		<description><![CDATA[Default Tomcat installations run on port 8080 so you get urls like:
http://mydomain.com:8080/lms/index.jsp
Some firewalls block port 8080 so I wanted my site to be available on port 80 so that it uses urls like:
http://mydomain.com/lms/index.jsp.
One option was to modify the Tomcat configuration to listen on port 80. However, I already have Apache installed and listening on port [...]]]></description>
			<content:encoded><![CDATA[<p>Default Tomcat installations run on port 8080 so you get urls like:</p>
<pre>http://mydomain.com:8080/lms/index.jsp</pre>
<p>Some firewalls block port 8080 so I wanted my site to be available on port 80 so that it uses urls like:</p>
<pre>http://mydomain.com/lms/index.jsp.</pre>
<p>One option was to modify the Tomcat configuration to listen on port 80. However, I already have Apache installed and listening on port 80 (to serve other content) so I couldn&#8217;t that. Instead I configured Apache to route requests for my web application to Tomcat. I&#8217;ve been through this process a number of times before, and it never seems to go smoothly, so I document it here. I am running Apache 2.2 and Tomcat 6 on 32 bit Ubuntu Linux.</p>
<h2>Overview</h2>
<p>The steps are:</p>
<ol>
<li>Download the Apache jk connector module (mod_jk.so).</li>
<li>Create Apache module configuration files for the jk connector (jk.load and jk.conf) and enable the module.</li>
<li>Create a worker.properties file to configure the Tomcat worker for the connector.</li>
<li>Define an AJP connector in your Tomcat configuration file (server.xml)</li>
<li>Assign urls to Tomcat in your Apache virtual hosts file.</li>
</ol>
<h2>Download the Apache jk connector module (mod_jk.so)</h2>
<p>Apache uses the jk connector module to talk to Tomcat. I downloaded it from a subdirectory of <a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/</a>. I wasn&#8217;t sure which OS I was running and whether or not I was running a 32 bit version (i586 directory) or a 64 bit version (x86_64). To find this out, I ran:</p>
<pre>file /usr/bin/file
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped</pre>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">So I downloaded: <a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.28/i586/mod_jk-1.2.28-httpd-2.2.X.so">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.28/i586/mod_jk-1.2.28-httpd-2.2.X.so</a></span></pre>
<p>I chose that version because I am running Apache 2.2. There are different versions for different versions of Apache.</p>
<p>I put the file in my Apache modules directory (/usr/lib/apache2/modules/) and renamed it to mod_jk.so.</p>
<h2>Create Apache module configuration files for the jk connector (jk.load and jk.conf) and enable the module</h2>
<p>In order to get Apache to load and configure the jk connector module, I created jk.load and jk.conf files (in /etc/apache2/mods-available/) and then enabled them. jk.load just tells Apache where to find the module:</p>
<pre>LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so</pre>
<p>jk.conf ties everything together by configuring the jk connector module:</p>
<pre># Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/apache2/workers.properties

# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile     /var/log/apache2/mod_jk.shm

# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile     /var/log/apache2/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel    info

# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "</pre>
<p>For more information about the Apache jk connector module configuration, see the <a href="http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html">Tomcat Connector &#8211; Apache Webserver HowTo</a>.</p>
<p>Initially I set the JkLogLevel to debug, so I could see any error messages, but then changed it to info once I had everything working.</p>
<p>After creating the files, I enabled the module using:</p>
<pre>sudo a2enmod jk</pre>
<p>That creates symlinks to the jk.load and jk.conf files in the mods-enabled directory where my Apache is configured to look for modules to load.</p>
<h2 style="font-size: 1.5em;">Define an AJP connector in your Tomcat configuration file (server.xml)</h2>
<p>AJP is an efficient protocol that Apache and Tomcat can be configured to use to talk to each other. I set up an AJP connector in my Tomcat configuration file (/etc/tomcat6/server.xml). The default configuration file has the connector defined but commented out, so I uncommented it:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;!&#8211; Define an AJP 1.3 Connector on port 8009 &#8211;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;Connector port=&#8221;8009&#8243; protocol=&#8221;AJP/1.3&#8243; redirectPort=&#8221;8443&#8243; /&gt;</div>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;">&lt;!-- Define an AJP 1.3 Connector on port 8009 --&gt;
&lt;Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /&gt;</pre>
<p>For details see the <a href="http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html">Tomcat AJP Connector documentation</a>.</p>
<h2 style="font-size: 1.5em;">Create a worker.properties file to configure the Tomcat ajp worker for the connector</h2>
<p>&#8220;A <strong>Tomcat worker </strong>is a Tomcat instance that is waiting to execute servlets or any other content on behalf of some web server&#8221;.</p>
<p><em>Note: this quote from the documentation is a bit curious, because, nowhere in the Tomcat configuration files do I tell Tomcat about the worker. I think that the worker is actually a process that the jk connector spawns</em>.</p>
<p>I configured a worker to listen to Apache requests by creating a worker.properties file in the same directory as the Apache configuration file (/etc/apache2/workers.properties).</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"># Define 1 real worker using ajp13
worker.list=worker1

# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009</pre>
<p>The jk connector knows how to talk to this worker, because the file name is specified in the Apache jk connector configuration file (/etc/apache2/mods-available/jk.conf). For more information see the <a href="http://tomcat.apache.org/connectors-doc/generic_howto/quick.html">Tomcat Connector Quick Start</a> or the <a href="http://tomcat.apache.org/connectors-doc/reference/workers.html">Tomcat Connector Reference Guide</a>.</p>
<h2>Assign urls to Tomcat in your Apache virtual hosts file</h2>
<p>After I configured a Tomcat worker to listen to AJP requests and configured Apache to use the jk connector module to talk to that worker, the last thing that was needed was to configure my web site&#8217;s virtual host (/etc/apache2/sites-available/default) to route urls to Tomcat:</p>
<pre>&lt;VirtualHost *:80&gt;
...
        JkMount /lms/* worker1
...
&lt;/VirtualHost&gt;</pre>
<p>Note that <em>worker1</em> is the name I gave to the worker I set up in the workers.properties file. Note that by using a * mask, I routed all requests (including static files) through Tomcat. Alternatively I could have configured only jsp requests to be routed to Tomcat, using:</p>
<pre>&lt;VirtualHost *:80&gt;
...
        JkMount /lms/*.jsp worker1
...
&lt;/VirtualHost&gt;</pre>
<div>I would then have needed added Directory configurations to the virtual host telling Apache where to serve the static files from.</div>
<h2>Restart Tomcat and Apache</h2>
<div>Of course, after I had done all of this, I had to restart Tomcat and Apache:</div>
<pre>sudo /etc/init.d/tomcat6 restart
sudo /etc/init.d/apache2 restart</pre>
<h2>Lifecycle</h2>
<p>To the best of my understanding, the relevant lifecycle is:</p>
<ol>
<li>When Tomcat starts up, it begins listening for AJP requests on port 8009 (because the connector is defined in /etc/tomcat6/server.xml).</li>
<li>When Apache starts up, it loads the jk connector module (because it is defined in /etc/apache2/mods-enabled/jk.load).</li>
<li>When Apache loads the jk connector, its configuration file (/etc/apache2/mods-enabled/jk.conf) tells it to send requests to the specified Tomcat worker and to use shared memory to do that.</li>
<li>It is not clear to me whether or not the Tomcat worker gets spawned when Apache starts up or on each request. I don&#8217;t see how it could get spawned when Tomcat starts up since Tomcat has no way of knowing about it.</li>
<li>Apache receives a request for a url that is mapped to Tomcat (in the virtual host file &#8211; /etc/apache2/sites-enabled/default).</li>
<li>Apache uses the jk connector module (mod_jk.so) to generate a request to send to Tomcat via a Tomcat worker.</li>
<li>The Tomcat worker communicates with Tomcat using the protocol (AJP) and port (8009) defined in the workers configuration file (/etc/apache2/workers.properties).</li>
<li>Tomcat processes the request and returns the response back through the worker and connector to Apache which returns it to the client.</li>
</ol>
<p>Kind of complicated, huh? And of course, this is just my best guess.</p>
<h2>Questions and problems</h2>
<div>The questions / problems I ran into this time I went through this process were:</div>
<div>
<ul>
<li>Not knowing which version of the JK connector to download</li>
<li>Forgetting I needed to configure the AJP connector in the Tomcat configuration file</li>
<li>Initially I routed only requests for JSP pages to Tomcat and so my stylesheets and images did not show up</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/08/16/configuring-apache-and-tomcat-to-serve-my-java-web-application-through-port-80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoGebra NA 2010</title>
		<link>http://www.joelduffin.com/blog/2010/07/27/geogebra-na-2010/</link>
		<comments>http://www.joelduffin.com/blog/2010/07/27/geogebra-na-2010/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 12:06:53 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[geogebra]]></category>
		<category><![CDATA[nlvm]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=431</guid>
		<description><![CDATA[I&#8217;m presenting at the First GeoGebra North America Conference this morning

]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m presenting at the <a href="http://sites.google.com/site/geogebrana2010english/">First GeoGebra North America Conference</a> this morning</p>
<p><iframe src="http://docs.google.com/present/embed?id=ddfznmqr_185sx93sxkg" frameborder="0" width="410" height="342"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/07/27/geogebra-na-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using Technology to Teach Mathematics</title>
		<link>http://www.joelduffin.com/blog/2010/03/06/using-technology-to-teach-mathematics/</link>
		<comments>http://www.joelduffin.com/blog/2010/03/06/using-technology-to-teach-mathematics/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 14:10:55 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[interactive online math]]></category>
		<category><![CDATA[math education]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=422</guid>
		<description><![CDATA[Today I am presenting Using Technology Effectively to Teach Mathematics at the Utah Association of Math Teacher Educators annual meeting being held at Utah State University.

]]></description>
			<content:encoded><![CDATA[<p>Today I am presenting <a href="http://docs.google.com/present/view?id=ddfznmqr_112fbb225g2">Using Technology Effectively to Teach Mathematics</a> at the <a href="http://uamte.math.byu.edu/">Utah Association of Math Teacher Educators</a> annual meeting being held at Utah State University.</p>
<p><iframe src="http://docs.google.com/present/embed?id=ddfznmqr_112fbb225g2" frameborder="0" width="410" height="342"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/03/06/using-technology-to-teach-mathematics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wide Field Infrared Survey Explorer (WISE)</title>
		<link>http://www.joelduffin.com/blog/2010/02/19/wide-field-infrared-survey-explorer-wise/</link>
		<comments>http://www.joelduffin.com/blog/2010/02/19/wide-field-infrared-survey-explorer-wise/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 14:03:53 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[astronomy]]></category>
		<category><![CDATA[stem]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=417</guid>
		<description><![CDATA[I was excited to see yesterday that images from the Wide Field Infrared Survey Explorer (WISE) are being made public. Amazing images. Here is my new computer desktop image that I stare at in wonder.

For more info and cool images check out the WISE project website.
Some of Technology for WISE was developed at Space Dynamics [...]]]></description>
			<content:encoded><![CDATA[<p>I was excited to see yesterday that images from the Wide Field Infrared Survey Explorer (WISE) are being made public. Amazing images. Here is my new computer desktop image that I stare at in wonder.</p>
<p><a href="http://wise.ssl.berkeley.edu/gallery_andromeda.html"><img class="alignnone" src="http://wise.ssl.berkeley.edu/gallery_images/C-AndromedaGalaxy_m.jpg" alt="" width="500" height="500" /></a></p>
<p>For more info and cool images check out <a href="http://wise.ssl.berkeley.edu/">the WISE project website</a>.</p>
<p>Some of Technology for WISE was developed at Space Dynamics Laboratory here in Cache Valley where some of my neighbors work. Another fun connection for me is that the rocket that carried WISE into orbit was launched from Vandenberg Air Force base where my Dad was serving when I was born.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/02/19/wide-field-infrared-survey-explorer-wise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NLVM team receives Utah Governor&#8217;s Medal for Science and Technology</title>
		<link>http://www.joelduffin.com/blog/2010/01/28/nlvm-team-receives-utah-governors-medal-for-science-and-technology/</link>
		<comments>http://www.joelduffin.com/blog/2010/01/28/nlvm-team-receives-utah-governors-medal-for-science-and-technology/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 21:07:53 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[interactive online math]]></category>
		<category><![CDATA[nlvm]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=396</guid>
		<description><![CDATA[Recently our National Library of Virtual Manipulatives team (Bob Heal, Larry Cannon, Jim Dorward, and myself) was awarded the Utah Governor&#8217;s Medal for Science and Technology.
Here is some press that covered the award:

Utah State Today &#8211; USU Researchers Awarded Governor&#8217;s Medals for Science and Technology
USU College of Science &#8211; Three USU Scientists Receive Governor&#8217;s Science [...]]]></description>
			<content:encoded><![CDATA[<p>Recently our National Library of Virtual Manipulatives team (Bob Heal, Larry Cannon, Jim Dorward, and myself) was awarded the Utah Governor&#8217;s Medal for Science and Technology.<img class="alignright" src="http://science.utah.gov/medals/images/medal.jpg" alt="" width="153" height="326" /></p>
<p>Here is some press that covered the award:</p>
<ul>
<li><a href="http://usu.edu/ust/index.cfm?article=41921">Utah State Today &#8211; USU Researchers Awarded Governor&#8217;s Medals for Science and Technology</a></li>
<li><a href="https://www.usu.edu/science/index.cfm?three-usu-scientists-receive-governors-science-medal">USU College of Science &#8211; Three USU Scientists Receive Governor&#8217;s Science Medal</a></li>
<li><a href="http://www.sltrib.com/ci_14111462">Salt Lake Tribune &#8211; Herbert to honor recipients for contributions to science</a></li>
<li><a href="http://utahpolicy.com/press_release/state-advisory-council-for-science-and-technology-announces-governors-science-medals-f">UtahPolicy.com &#8211; State Advisory Council For Science And Technology Announces Governor&#8217;s Science Medals For 2009</a></li>
</ul>
<p>Here are some previous articles about the team as well:</p>
<ul>
<li><a href="http://www.usu.edu/ust/index.cfm?article=13838">USU &#8211; Developed Virtual Math Tutor Aiding Students Worldwide</a></li>
<li><a href="https://www.usu.edu/science/files/uploads/InsightsWinter_06_screen.pdf">USU &#8211; Winter Insights 2006</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/01/28/nlvm-team-receives-utah-governors-medal-for-science-and-technology/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web crawling on a budget</title>
		<link>http://www.joelduffin.com/blog/2010/01/28/web-crawling-on-a-budget/</link>
		<comments>http://www.joelduffin.com/blog/2010/01/28/web-crawling-on-a-budget/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:39:11 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=391</guid>
		<description><![CDATA[Justin and I submitted proposals to the Digital Media and Learning Competition. I was amazed to see the breadth of the 100 pages of submissions. There are a lot of good ideas there. Not being sure that the submissions will always be kept public, I wanted to archive them for later reference. Here was the [...]]]></description>
			<content:encoded><![CDATA[<p>Justin and I <a href="http://www.dmlcompetition.net/pligg/search.php?search=tatemae">submitted proposals</a> to the <a href="http://www.dmlcompetition.net/learning_labs.php">Digital Media and Learning Competition</a>. I was amazed to see the breadth of <a href="http://www.dmlcompetition.net/pligg/">the 100 pages of submissions</a>. There are a lot of good ideas there. Not being sure that the submissions will always be kept public, I wanted to archive them for later reference. Here was the ruby script I came up with:</p>
<pre>(1..100).each {|page| system("curl -o #{page}.html
   http://dmlcompetition.net/pligg/index.php?page=#{page}")}</pre>
<p>Ruby rocks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/01/28/web-crawling-on-a-budget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to unlock your droid when your kids try to guess the pattern too many times</title>
		<link>http://www.joelduffin.com/blog/2010/01/28/how-to-unlock-your-droid-when-your-kids-try-to-guess-the-pattern-too-many-times/</link>
		<comments>http://www.joelduffin.com/blog/2010/01/28/how-to-unlock-your-droid-when-your-kids-try-to-guess-the-pattern-too-many-times/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:13:59 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[family]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=388</guid>
		<description><![CDATA[My daughter&#8217;s friends got a hold of my droid and thought it would be fun to try to guess the password pattern. After enough times, it locked up my droid and asked me to login with my gmail account credentials. Problem is, that didn&#8217;t work. It is a known bug. After a few minutes of [...]]]></description>
			<content:encoded><![CDATA[<p>My daughter&#8217;s friends got a hold of my droid and thought it would be fun to try to guess the password pattern. After enough times, it locked up my droid and asked me to login with my gmail account credentials. Problem is, that didn&#8217;t work. It is a known bug. After a few minutes of Googling, I found:</p>
<p>http://code.google.com/p/android/issues/detail?id=4784 (comment 35)</p>
<p>1) create a new gmail account on the computer.<br />
2) call your cell phone with a different phone.<br />
3) answer your cell phone then hit the back button and it will take you to the home<br />
screen.<br />
4) turn on wifi so it can do data and voice at the same time (remember that the phone<br />
is still connected)<br />
5) go to Settings -&gt; Location &amp; Security and disable lock pattern (you&#8217;ll need to<br />
enter to correct pattern previously set)<br />
6) go to Settings -&gt; Accounts &amp; Sync and click &#8220;Add Account&#8221; and add your newly<br />
created Gmail account.<br />
7) hang up the phone.<br />
 <img src='http://www.joelduffin.com/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> turn the phone back on, at the lockout screen, enter your new Gmail account info<br />
and it should let you back in<br />
9) once the phone is unlocked, you can go in setting and remove the newly added Gmail<br />
account and keep the old one.</p>
<p>Google giveth, and Google taketh away, and then Google giveth again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2010/01/28/how-to-unlock-your-droid-when-your-kids-try-to-guess-the-pattern-too-many-times/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Presenting personal recommendations</title>
		<link>http://www.joelduffin.com/blog/2009/11/23/presenting-personal-recommendations/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/23/presenting-personal-recommendations/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:31:37 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[recommender]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=374</guid>
		<description><![CDATA[Generating personal recommendations is one thing, presenting them to the user in a way that they find them useful is something else. Here are our plans for folksemantic.com:

Personal recommendations page &#8211; For each user, provide a personal recommendations page. Visually separate recommendations that they have already clicked on.
Personal recommendations tool &#8211; Include a personal recommendations [...]]]></description>
			<content:encoded><![CDATA[<p>Generating personal recommendations is one thing, presenting them to the user in a way that they find them useful is something else. Here are our plans for <a href="http://www.folksemantic.com/">folksemantic.com</a>:</p>
<ul>
<li><strong>Personal recommendations page</strong> &#8211; For each user, provide a personal recommendations page. Visually separate recommendations that they have already clicked on.</li>
<li><strong>Personal recommendations tool</strong> &#8211; Include a personal recommendations button on our folksemantic bar that when clicked on will display their recommendations in the right panel. Linking to the recommendations from that panel will refresh the content in the iframe (not do a full page refresh).</li>
<li><strong>Personal recommendations action link</strong> &#8211; Include a link to the user&#8217;s recommendations page on their dashboard.</li>
<li><strong>Inject recommendations into activity feeds</strong> &#8211; Whenever we generate new personal recommendations, inject them into a user&#8217;s activity feed that is displayed on their dashboard.</li>
<li><strong>Email personal recommendations</strong> &#8211; Email personal recommendations to users as often as they would like (controllable in their account settings).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/23/presenting-personal-recommendations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A personal recommendation algorithm</title>
		<link>http://www.joelduffin.com/blog/2009/11/23/a-personal-recommendation-algorithm/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/23/a-personal-recommendation-algorithm/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:23:21 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[recommender]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=364</guid>
		<description><![CDATA[We&#8217;re in the process of building out personal recommendations for folksemantic.com. The basis for the recommendations is user attention metadata. The data we use includes:

Identity feeds &#8211; RSS feeds that users register that represent their interests. For example, their blog or their delicious account.
Clicks &#8211; The articles that the user clicks on.
Shares &#8211; The articles [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re in the process of building out personal recommendations for <a href="http://www.folksemantic.com/">folksemantic.com</a>. The basis for the recommendations is user attention metadata. The data we use includes:</p>
<ul>
<li><strong>Identity feeds</strong> &#8211; RSS feeds that users register that represent their interests. For example, their blog or their delicious account.</li>
<li><strong>Clicks</strong> &#8211; The articles that the user clicks on.</li>
<li><strong>Shares</strong> &#8211; The articles that the user shares to others.</li>
<li><strong>Comments</strong> &#8211; Articles that the user comments on.</li>
<li><strong>Time on page</strong> &#8211; Amount of time that a user spends on an article before moving on.</li>
<li><strong>Searches</strong> &#8211; Searches the user executes.</li>
</ul>
<h2>Recommendation Assumptions</h2>
<p>Some of our assumptions are:</p>
<ul>
<li><strong>Semantic relatedness</strong> &#8211; The more semantically similar an article is to articles that a user has paid attention to, the more interesting to the user.</li>
<li><strong>Attention types</strong> &#8211; Different types of attention should be given different weights. For example, following a link to an article should not give it as much weight as writing the article.</li>
<li><strong>Attention details</strong> &#8211; The particulars of a given type of attention might make it more important than another attention of the same type. For example, if a person shares an article with 100 people, it might be reasonable to infer that it is more important than an article that they share with one person.</li>
<li><strong>Entry recency</strong> &#8211; The more recently an article has been added to the system, the more interesting to the user (they probably haven&#8217;t seen it before).</li>
<li><strong>Attention recency</strong> &#8211; The more recently a user has showed attention to an article, the more weight that should be given to it.</li>
<li><strong>Attention frequency</strong> &#8211; The more frequently a user has showed attention to an article, the more weight that should be given to it.</li>
</ul>
<p>Stating these assumptions reminds me of the difference between relevance and certainty. So while an item that a user clicks on may be more relevant than an blog article they have written, it is harder to be certain of that. Our approach is to give the click less weight than the article.</p>
<h2>Recommendation Score</h2>
<p>Right now, we score articles using the formula:</p>
<p><strong>(relevance)(attention type)(attention details)(attention recency)(article recency)</strong></p>
<p>For all articles that a user has paid attention to, we score the 20 &#8220;related articles&#8221; using this algorithm; rank the scores and cache the top 20 (that the user hasn&#8217;t already clicked on) to recommend to the user. There are obvious weaknesses to this approach, but we are going to start there and see where to go next.</p>
<h2>Possible Extensions / Improvements</h2>
<p>We are considering:</p>
<ul>
<li><strong>Collaborative Filtering, Bipartite Graph, and Discriminative Weight Algorithms</strong> &#8211; Putting into production, the <a href="http://www.folksemantic.com/papers/descriminative_weights.pdf">algorithm that combines discriminative weights with a novel sparse matrix clustering method</a> we conducted research on.</li>
<li><strong>Modeling user interests separately</strong> &#8211; <a href="http://www.joelduffin.com/blog/2009/11/18/modeling-users-to-provide-recommendations/">Modeling users interests using multiple term vectors</a> (one for each interest) by extracting vectors from closely related (clustered documents) that users have paid attention to.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/23/a-personal-recommendation-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encouraging the creation of assessments to measure deep understanding</title>
		<link>http://www.joelduffin.com/blog/2009/11/19/encouraging-the-creation-of-assessments-to-measure-deep-understanding/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/19/encouraging-the-creation-of-assessments-to-measure-deep-understanding/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 21:21:41 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[stem]]></category>
		<category><![CDATA[#nsdl2009]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=345</guid>
		<description><![CDATA[I had the chance to talk with David Yaron again about how to generate more and better assessments that get at deeper levels of knowledge than what typical assessments do. I didn&#8217;t realize this but, Turadg, whose presentation I attended is one of David&#8217;s students. I shared my reaction to Turadg&#8217;s study with David: in [...]]]></description>
			<content:encoded><![CDATA[<p>I had the chance to talk with <a href="http://www.chem.cmu.edu/groups/yaron/">David Yaron</a> <a href="http://www.joelduffin.com/blog/2008/07/09/measuring-the-wrong-things/">again</a> about how to generate more and better assessments that get at deeper levels of knowledge than what typical assessments do. I didn&#8217;t realize this but, <a href="http://www.joelduffin.com/blog/2008/07/09/teacher-authoring-and-metacognition-at-the-pslc/">Turadg, whose presentation I attended</a> is one of David&#8217;s students. I shared my reaction to Turadg&#8217;s study with David: in order to help teachers produce quality assessments, we should present good examples, help them see the structure of the assessments and how the problems can be adapted. I need to write up some examples of what I mean by this.</p>
<p>David shared <a href="http://en.wikipedia.org/wiki/Evidence-based_design">Evidence Based Design (not sure if this is what he was referring to)</a> as a model. I shared Conditions of Learning &#8211; the idea that different types of learning outcomes should be taught differently, and <a href="http://umep.usu.edu/">Jim Cangelosi&#8217;s (forgive the flashing text)</a> <a href="http://www.amazon.com/Teaching-Mathematics-Secondary-Middle-School/dp/0130950181/ref=dp_ob_title_bk">work on designing mathematics instruction for different types of learning outcomes</a>. Interestingly he has advocated the idea of mini experiments as an approach for teachers to learn about and evolve learning.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/19/encouraging-the-creation-of-assessments-to-measure-deep-understanding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATE &#8211; A sister program to NSF</title>
		<link>http://www.joelduffin.com/blog/2009/11/18/ate-a-sister-program-to-nsf/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/18/ate-a-sister-program-to-nsf/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 02:01:58 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[#nsdl2009]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=327</guid>
		<description><![CDATA[Rachel Bower &#8211; Internet Scout Wisconson Madison, ATE Central, AMSER. Advanced Technological Education is a sister program to NSDL. Designed to connect NSDL with community and technical college faculty. Instead of focusing on a content area, they chose to focus on an audience and to cover all of applied math and science. AMSER is being [...]]]></description>
			<content:encoded><![CDATA[<p>Rachel Bower &#8211; <a href="http://scout.wisc.edu/">Internet Scout</a> Wisconson Madison, ATE Central, <a href="http://www.amser.org">AMSER</a>. Advanced Technological Education is a sister program to NSDL. Designed to connect NSDL with community and technical college faculty. Instead of focusing on a content area, they chose to focus on an audience and to cover all of applied math and science. AMSER is being created by a team of folks led by InternetScout. ATE, AAC, AMATYC, NISOD, MERLOT, NSDL. Scout not only connects higher ed with resources but also best practices. Mellon funded the development of Scout Portal Toolkit, which became CWIS &#8211; DL in a box. I was made aware of Internet Scout when they <a href="http://scout.wisc.edu/Archives/SPT--FullRecord.php?ResourceId=9834">featured the NLVM in 2002</a>.</p>
<p>ATE Central is an example of how a project in NSDL can influence other NSF programs. It brings all of the ATE resources in to one searchable portal. It builds the ATE brand and helps disseminate the projects. ATE is different than NSDL in that they focus on content development, industry connections, and the improvement of training and teaching for workforce development. ATE offers smaller grants and larger center grants. Example national, regional, and resource centers of excellence are <a href="http://www.geotechcenter.org">geoTech</a>, <a href="http://www.carcam.org">CARCAM</a>, <a href="http://www.agrowknow.org">AgrowKnow</a>. ATE Central has been funded for 1 year. They focus more on events than in other portals. This is partially because ATE focuses a lot on workshops including virtual. They create resource areas on ATE Central for each projects and centers. This has been a big deal to their projects to help them collaborate. ATE has a center that is funded just for evaluation. They send out a monthly update and are creating success stories. She showed videos of people that have found success of students that have benefited from ATE.</p>
<p>Linea Fletcher and Rachel is interested in the life of NSDL projects that continue beyond funding (are sustainable). They want to capture and share these stories. Another focus is on how to capture of evidence of impact across projects. They currently track 320 projects and aggregate and share it in interesting ways.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/18/ate-a-sister-program-to-nsf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>per central &#8211; Conference services as a sustainability model</title>
		<link>http://www.joelduffin.com/blog/2009/11/18/per-central-conference-services-as-a-sustainability-model/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/18/per-central-conference-services-as-a-sustainability-model/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 00:29:20 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[#nsdl2009]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=323</guid>
		<description><![CDATA[Lyle Barbato, the comPADRE lead developer talked about conference services as a model for sustainability. Each collection in comPADRE is focused around supporting existing community or a particular course. Teachers, Courses, Specific Students, Specific faculty. They offer workshops etc to those communities. The Physics Education Research community has existed since the 60s. It has grown [...]]]></description>
			<content:encoded><![CDATA[<p>Lyle Barbato, the comPADRE lead developer talked about conference services as a model for sustainability. Each collection in comPADRE is focused around supporting existing community or a particular course. Teachers, Courses, Specific Students, Specific faculty. They offer workshops etc to those communities. The Physics Education Research community has existed since the 60s. It has grown alot in the past 10 years. Until recently, they had few publication outlets. <a href="http://www.physics.ncsu.edu/people/faculty_beichner.html">Robert Beichner</a> came to them asking them to build a central repository which became <a href="http://www.per-central.org/">p(e)r central</a> and a Physics Education Journal, and a PER conference established in 1998. That has become the premier outlet. In 2007 PER came to comPADRE to provide a portal for hosting the annual conferences. It fits into the library model because it allows them to capture and preserve a full record of what happened. They are adapting existing services including rubrics for evaluating abstracts and resources. The conferences and the new content they provide has driven the use of the website.</p>
<p>This work reminds me some of what Justin did with 51weeks &#8211; a platform for supporting communication around a conference and the other 51 weeks of the year.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/18/per-central-conference-services-as-a-sustainability-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Physics &#8211; Adoptable, Adaptable, and Understandable &#8211; Power to the people</title>
		<link>http://www.joelduffin.com/blog/2009/11/18/open-source-physics-adoptable-adaptable-and-understandable-power-to-the-people/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/18/open-source-physics-adoptable-adaptable-and-understandable-power-to-the-people/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 00:27:11 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[#nsdl2009]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=320</guid>
		<description><![CDATA[Bruce Mason &#8211; Open Source Physics. Modern Physics is done with computation no matter whether you are a theoretical or experimental. Our current classroom practice doesn&#8217;t allow with this well. A tri-partrate learning platform. Their project combines Open Source Physics, Easy Java Simulation, and the Compadre Library.
Modeling is important because it is what scientists do. [...]]]></description>
			<content:encoded><![CDATA[<p>Bruce Mason &#8211; Open Source Physics. Modern Physics is done with computation no matter whether you are a theoretical or experimental. Our current classroom practice doesn&#8217;t allow with this well. A tri-partrate learning platform. Their project combines <a href="http://www.compadre.org/OSP/">Open Source Physics</a>, <a href="http://www.um.es/fem/Ejs/">Easy Java Simulation</a>, and the <a href="http://www.compadre.org/">Compadre</a> Library.</p>
<p>Modeling is important because it is what scientists do. It is also a valuable way to interest and help students learn. You can do problems that are too hard or impossible to visualize, that you just don&#8217;t see if you don&#8217;t have the computational resources. &#8220;The difference between physics and math is that I have fun demos. In physics as opposed to math. We do have answer. It is what I measured&#8221;. The <a href="http://www.compadre.org/PSRC/items/detail.cfm?ID=9399">Falling Slinky Model</a>: What happens to the bottom when it begins to fall? Physically, it is hard to see. The bottom doesn&#8217;t know it has dropped until it gets a message from the top of the slinky. <a href="http://www.compadre.org/psrc/items/detail.cfm?ID=8985">Colliding Galaxy</a> model. There is no way for someone to do this on paper.</p>
<p>Adoptable, adaptable, and understandable. They have to be modular, adaptable, visual, interactive, internationalization, quality control, easy to get to, vetted by other teachers, descriptions of how it has been used. Francisco Esquembre &#8211; creator of Easy Java Simulations. He says the most important characteristics are adoptable, adaptable, and understandable. This gives power to the people. This was my theory and excitement in my dissertation study. Give the teachers the tools, and they will create. My findings can be summarized by the 90-9-1 rule. 1% of teachers have the time, interest, and skills to create. Of course more powerful tools make it more possible for people to participate.</p>
<p><a href="http://www.compadre.org/osp/items/detail.cfm?ID=9380">He showed an Inferior Ptolemaic Model of what it would be like if the earth was the center of the earth and Venus went around the earth.</a> How could you tell which model is right? People can conjecture and explore.</p>
<p>He showed the <a href="http://www.compadre.org/OSP/items/detail.cfm?ID=9220">Falling Loop Model</a>. A loop that is falling through a magnetic field. Faraday&#8217;s law. It creates a current that opposes the falling. Other physicists can open (download) the model and modify it with minimal programming. His students can do this as well. This is similar (but more advanced) to my work in the <a href="http://enlvm.usu.edu">eNLVM that allows users to configure and serialize applets</a>. They connect EJS to the library to make it easy for people to find, discuss, and share their models. Their library allows users to rate, collect, relate, comment, sort, annotate, and share. Again, the themes of our Mellon work and the <a href="http://www.tatemae.com/doc/odlms.pdf">ODLMS</a> shows its head. One of the contributors to Open Source Physics has written a text book for which their File Cabinet contains the resources aligned with the sections of the text book. They have build into EJS the ability to browse repositories of EJS models. There is a professor in Taiwan who has over EJS 150 models. Doug Brown, Wolfgang, and Lyle Barbato are some of the key people. A project called <a href="http://www.compadre.org/OSP/webdocs/Tools.cfm?t=Tracker">Tracker</a> that generates video from EJS simulations. They have also done a <a href="http://www.compadre.org/OSP/webdocs/Tools.cfm?t=Datatool">Data Tool</a>.</p>
<p>Their stats (Open Source Physics?) are 350 resources, 1700 users per week, 31,000 downloads per month. By comparison, the NLVM has about 110 applets and gets 40,000 users per day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/18/open-source-physics-adoptable-adaptable-and-understandable-power-to-the-people/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>90-9-1 principle &#8211; getting people to contribute</title>
		<link>http://www.joelduffin.com/blog/2009/11/18/90-9-1-principle-getting-people-to-contribute/</link>
		<comments>http://www.joelduffin.com/blog/2009/11/18/90-9-1-principle-getting-people-to-contribute/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 23:41:24 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[#nsdl2009]]></category>

		<guid isPermaLink="false">http://www.joelduffin.com/blog/?p=315</guid>
		<description><![CDATA[Dan Garcia is charged with motivating users to participate. 90-9-1 principle. 90% of users are audience, 9% of users are editors, 1% of users are creators. Creators are not representative of who the community is. Cites alertbox/participation_ Nielson research about 90% of postings come from 1% of the users. We want to reward participants for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.eecs.berkeley.edu/~ddgarcia/">Dan Garcia </a>is charged with motivating users to participate. 90-9-1 principle. 90% of users are audience, 9% of users are editors, 1% of users are creators. Creators are not representative of who the community is. Cites alertbox/participation_ Nielson research about 90% of postings come from 1% of the users. We want to reward participants for contributions. <a href="http://planetmath.org">PlanetMath.org</a> rewards participation by displaying user ratings on their home page by recent activity and all time activity. <a href="http://www.stackoverflow.com">Stackoverflow.com</a> gives badges to represent activities they are trying to model. Example badges, including: completed profile, voted 300 times. They show how many people have each bad to help indicate how valuable (rare) a given badge is. In Ensemble they have prototyped a rewards system.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelduffin.com/blog/2009/11/18/90-9-1-principle-getting-people-to-contribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
