<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/wordpress-mu-1.2.5" -->
<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:slash="http://purl.org/rss/1.0/modules/slash/"
        xmlns:opencore="http://www.openplans.org/opencore"
	>

<channel>
	<title>Melkjug Project</title>
	<link>http://www.openplans.org/projects/melkjug/blog</link>
	<description>Just another  weblog</description>
	<pubDate>Mon, 20 Oct 2008 15:22:06 +0000</pubDate>
	<generator>http://wordpress.org/?v=wordpress-mu-1.2.5</generator>
	<language>en</language>
			<item>
		<title>Melkjug redesign live</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/10/17/melkjug-redesign-live/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/10/17/melkjug-redesign-live/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Fri, 17 Oct 2008 17:45:27 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[site upgrades]]></category>

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/10/17/melkjug-redesign-live/</guid>
		<description><![CDATA[­­­­Just wanted to let everyone know our new visual design for melkjug.org is up and running. If you have a sec, give it a try and let us know what you think.

&#160;I&#8217;m really digging it so far and I want to give a big thanks to our awesome design team for pitching in on the [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/10/17/melkjug-redesign-live/"><![CDATA[<p>­­­­<img alt="kindofblue.jpg" src="/projects/melkjug/attachments/kindofblue.jpg" align="right" height="138" width="168" />Just wanted to let everyone know our new visual design for <a href="http://melkjug.org">melkjug.org</a> is up and running. If you have a sec, give it a try and let us know what you think.
</p>
<p>&nbsp;I&#8217;m really digging it so far and I want to give a big thanks to our awesome design team for pitching in on the project.
</p>
<p> With the release of <a href="/projects/melkjug/downloads">version 0.4</a>, we&#8217;re also launching a slew of fixes, improvements to workflows and new features that have been patiently waiting in the wings including openid login, starred item view, tracking folks you know, and a much improved feed se­arch. Gory details can be found in the <a href="https://svn.openplans.org/melk/curdle/trunk/skel/CHANGELOG">Changelog</a> or the <a href="http://trac.openplans.org/melkjug/query?group=status&amp;milestone=0.4">Trac Milestone</a>. Now, back to the eyecandy&#8230;<br />
  
</p>
<p> ­</p>
<p>&nbsp;­ <a href="/projects/melkjug/attachments/redesign_ss1_large.jpg">­­<img alt="redesign_ss1_smaller.jpg" src="/projects/melkjug/attachments/redesign_ss1_smaller.jpg" /></a>
</p>
<p><a href="/projects/melkjug/attachments/redesign_ss1_large.jpg"><img alt="redesign_ss2_smaller.jpg" src="/projects/melkjug/attachments/redesign_ss2_smaller.jpg" />­</a>
</p>
<p>&nbsp;
</p>
<p>
  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/10/17/melkjug-redesign-live/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is there a good reason for this to be annoying?</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/#comments</comments>
        	<slash:comments>4</slash:comments> 
		<pubDate>Sun, 10 Aug 2008 19:12:30 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[mysql]]></category>

		<category><![CDATA[app engine]]></category>

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

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/</guid>
		<description><![CDATA[ ­For some reason my imaginary version of SQL has some nice operations to take a r­andom sample of rows from some table.&#160; In reality, the most common query that I&#8217;ve seen is something like:

SELECT * FROM sometable ORDER BY RAND() LIMIT ­samplesize
In MySQL, this appears to do just what it says: generate a random [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/"><![CDATA[<p> ­<img alt="dice.jpg" src="/projects/melkjug/attachments/dice.jpg" align="right" height="120" width="120" />For some reason my imaginary version of SQL has some nice operations to take a r­andom sample of rows from some table.&nbsp; In reality, the most common query that I&#8217;ve seen is something like:
</p>
<pre>SELECT * FROM sometable ORDER BY RAND() LIMIT ­samplesize</pre>
<p>In MySQL, this appears to do just what it says: generate a random number for every row then sort them and return the lowest few &#8212; which is prohibitively slow for any reasonably big table.
</p>
<p>If you know the identifiers of rows in the table and they form a gapless sequence, the story is somewhat better;&nbsp; you can generate samplesize random numbers from the range and select those identifiers.&nbsp; Of course, this is generally not the case (and almost begs the question).&nbsp; The best approach along these lines that I&#8217;ve seen requires maintaining a table that maps from a gapless sequence of integers to the identifiers of the table that you want to sample from using a bunch of triggers &#8212; <a href="http://jan.kneschke.de/projects/mysql/order-by-rand">http://jan.kneschke.de/projects/mysql/order-by-rand</a> .
</p>
<p>I&#8217;m also unsure of the right way to tackle this in databases like couchdb or the appengine datastore.&nbsp; Maybe a similar tactic with views/query indexes? Anyone implemented anything similar?<br />
  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/08/10/is-there-a-good-reason-for-this-to-be-annoying/feed/</wfw:commentRss>
		</item>
		<item>
		<title>melkjug redesign concept</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/#comments</comments>
        	<slash:comments>3</slash:comments> 
		<pubDate>Wed, 06 Aug 2008 15:53:05 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[user interface]]></category>

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

		<category><![CDATA[feature ideas]]></category>

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/</guid>
		<description><![CDATA[Here&#8217;s some snazzy eyecandy from Phil&#8217;s work on sprucing up the melkjug user interface.&#160; Speaks for itself I think :)
­­ ­ ­

]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/"><![CDATA[<p>Here&#8217;s some snazzy eyecandy from Phil&#8217;s work on sprucing up the melkjug user interface.&nbsp; Speaks for itself I think :)</p>
<p>­<a href="/projects/melkjug/attachments/melkjug_redesign_concept.png">­<img alt="melkjug_redesign_concept_small.png" src="/projects/melkjug/attachments/melkjug_redesign_concept_small.png" height="519" width="600" /></a> ­ ­<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/08/06/melkjug-redesign-concept/feed/</wfw:commentRss>
		</item>
		<item>
		<title>moongifted</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Tue, 05 Aug 2008 15:25:35 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[i18n]]></category>

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

		<category><![CDATA[site upgrades]]></category>

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/</guid>
		<description><![CDATA[ Melkjug was featured on the japanese tech blog moongift yesterday &#8212; thanks guys! Here&#8217;s the original, and google&#8217;s translation.&#160; We probably aren&#8217;t as prepared for international visitors as we ought to be, but I hope everyone is finding the site to be usable.&#160; I put a quick patch through to fix up filtering using [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/"><![CDATA[<p> <img alt="japan.png" src="/projects/melkjug/attachments/japan.png" align="right" height="134" width="130" />Melkjug was featured on the japanese tech blog <a href="http://moongift.jp">moongift</a> yesterday &#8212; thanks guys! Here&#8217;s <a href="http://www.moongift.jp/2008/08/melkjug/">the original</a>, and <a href="http://translate.google.com/translate?u=http://www.moongift.jp/2008/08/melkjug/&amp;hl=en&amp;ie=UTF8&amp;sl=ja&amp;tl=en">google&#8217;s translation</a>.&nbsp; We probably aren&#8217;t as prepared for international visitors as we ought to be, but I hope everyone is finding the site to be usable.&nbsp; I put a quick patch through to fix up filtering using non latin parameters.&nbsp; <a href="http://melkjug.org/feedback">Please let us know if you run into any problems</a>! Suggestions ( and translations ^_^ ) are welcome.<br />
  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/08/05/moongifted/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenID Support is Coming</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/#comments</comments>
        	<slash:comments>2</slash:comments> 
		<pubDate>Thu, 31 Jul 2008 19:54:41 +0000</pubDate>
		<dc:creator>rleeds</dc:creator>
                <opencore:userid>rleeds</opencore:userid>
		
		<category><![CDATA[openid]]></category>

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/</guid>
		<description><![CDATA[ A Melkjug user recently used the Feedback link on the site to recommend support for OpenID. Luke quickly forwarded the idea to the melkjug-dev list asking if anyone wanted to pick up the task. I stepped up.

Thankfully, there exists a very nice python-openid package. The documentation assumes some knowledge of OpenID specifications, so I [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/"><![CDATA[<p align="left"> A Melkjug user recently used the Feedback link on the site to recommend support for OpenID. Luke quickly forwarded the idea to the melkjug-dev list asking if anyone wanted to pick up the task. I stepped up.
</p>
<p align="left">Thankfully, there exists a very nice <a href="http://openidenabled.com/python-openid/">python-openid</a> package. The documentation assumes some knowledge of OpenID <a href="http://openid.net/developers/specs/">specifications</a>, so I had to do some digging there to understand how I was supposed to extract identity information from the response.
</p>
<p align="left">Here&#8217;s a nice screenshot of me logging in using OpenID:
</p>
<p align="left"><img alt="openid_login.png" src="/projects/melkjug/attachments/openid_login.png" height="327" width="613" /><br />
  
</p>
<p>&nbsp;
</p>
<p align="left">The only tricky part to get working was Simple Registration. The OpenID specifications include a way to request Simple Registration information from the provider. In our case, we need a nickname and an e-mail address. Nicknames are used internally by Melkjug to find user&#8217;s jugs. For example, my full reading list exists at http://melkjug.org/tilgovi/full.
</p>
<p>&nbsp;
</p>
<p align="left">in some cases, the OpenID provider does not honor the Simple Registration request. In other cases, the user fails to supply the proper information. In these cases, Melkjug will ask for the additional required information before allowing you to sign up with your OpenID (see screenshot). If everything looks good, you&#8217;re in!
</p>
<p>&nbsp;
</p>
<p align="left"><img alt="openid_signup.png" src="/projects/melkjug/attachments/openid_signup.png" height="328" width="613" /><br />
  
</p>
<p>&nbsp;Look out for OpenID logins in the next release of Melkjug.<br />
  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/07/31/openid-support-is-coming/feed/</wfw:commentRss>
		</item>
		<item>
		<title>melkjug 0.3 is released</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Wed, 30 Jul 2008 20:19:38 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[site upgrades]]></category>

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/</guid>
		<description><![CDATA[
The 0.3 release focuses on lowering barriers to entry for new users based on the work Sonali and Bryan have been putting in.&#160; Most importantly, you can now check out the functionality of the site without creating an account and save what you make if you choose to sign up.&#160; We&#8217;ve also added a more [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/"><![CDATA[</p>
<p><img alt="launch.jpg" src="/projects/melkjug/attachments/launch.jpg" align="right" height="195" width="130" />The 0.3 release focuses on lowering barriers to entry for new users based on the work Sonali and Bryan have been putting in.&nbsp; Most importantly, you can now check out the functionality of the site without creating an account and save what you make if you choose to sign up.&nbsp; We&#8217;ve also added a more informative &#8220;about&#8221; page, made the text more consistent overall and put better blank slates in place.&nbsp; There&#8217;s still a long way to go on this to get it where we want it, but I like how this first pass turned out.
</p>
<p>For existing users, we&#8217;ve implemented some of the most requested features/fixes like sharing links via email / facebook etc, an option to keep you logged in after closing the browser, improvements to speed,&nbsp; and elimination of certain annoying duplicate articles.&nbsp; We have also moved all management of feeds back into the normal reading window and moved the detailed configuration of filters out of the sidebar and into lightbox dialogs.<br />
  
</p>
<p>Of particular note is Josh&#8217;s work to allow the tag filter to use multiple tags at once resulting from Bryan&#8217;s work trying to put together a decent demo. &nbsp; This makes tag filtering&#8230; actually kind of useful.&nbsp; Using this, you can group together related tags to represent a concept, or create clusters of synonymous tags to correct for differences between blogs.&nbsp; Enjoy!
</p>
<p>try it out at <a href="http://melkjug.org">melkjug.org</a> &#8212; download it at <a href="http://melkjug.openplans.org">melkjug.openplans.org</a>
</p>
<p>As always, feedback is appreciated<br />
  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/07/30/melkjug-03-is-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Midsummer in Jugland: The initiation of a wannabe MelkThug</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/07/16/midsummer-in-jugland-the-initiation-of-a-wannabe-melkthug/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/07/16/midsummer-in-jugland-the-initiation-of-a-wannabe-melkthug/#comments</comments>
        	<slash:comments>7</slash:comments> 
		<pubDate>Wed, 16 Jul 2008 21:36:03 +0000</pubDate>
		<dc:creator>magicbronson</dc:creator>
                <opencore:userid>magicbronson</opencore:userid>
		
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/07/16/midsummer-in-jugland-the-initiation-of-a-wannabe-melkthug/</guid>
		<description><![CDATA[(updated 7/21/08)
  

On the cusp of the 0.3 release, coinciding roughly with my first month of full-time work on Melkjug, I thought it&#8217;d be a good time to blog a bit about what I&#8217;ve been up to. While wetting my whistle with cookies, controllers, and captchas, I&#8217;ve also been getting my first real taste [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/07/16/midsummer-in-jugland-the-initiation-of-a-wannabe-melkthug/"><![CDATA[<p align="right"><em>(updated 7/21/08</em>)<br />
  
</p>
<p>On the cusp of the 0.3 release, coinciding roughly with my first month of full-time work on Melkjug, I thought it&#8217;d be a good time to blog a bit about what I&#8217;ve been up to. While wetting my whistle with cookies, controllers, and captchas, I&#8217;ve also been getting my first real taste of some not-so-small potatoes like Pylons, jQuery, and CouchDB. Somehow, somewhere along the way I almost started to feel like a web programmer. And that&#8217;s not all: Recently we stumbled upon the precipice of none other than <a href="http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule">Greenspun&#8217;s Tenth Rule</a>, basked momentarily in its profound and infinite wisdom, and then plowed heedlessly ahead. My past few weeks have been as exciting as they have formative. And some people think programming is dull!
</p>
<p>Now to talk about some of the more interesting things I&#8217;ve been working on&#8230;
</p>
</p>
<p>The 0.3 release will include some work toward <a href="https://melkjug.openplans.org/trac/melkjug/ticket/173">#173</a>: directly email/share articles from melkjug to popular services. After a survey of some available options, Luke noted:
</p>
<blockquote>
<p><a href="http://sharethis.com/">ShareThis</a> has some blood surrounding logo takedown notices so I&#8217;m inclined to skip this one altogether on principle.
  </p>
<p>I&#8217;ve seen <a href="http://addthis.com/">AddThis</a> around and it seem to work and is extremely comprehensive. It&#8217;s probably recognizable and everyone who does this sort of thing would be comfortable with it. It&#8217;s also ugly and divulges information to a centralized server owned by some strange LLC.
  </p>
<p>I&#8217;ve never actually seen <a href="http://ibegin.com/labs/share">iBeginShare</a> used, but it appears to be open source (MIT) decentralized and uses the alternative open sharing logo. It seems to cover most of the huge services.
  </p>
</blockquote>
<p>So I went with iBeginShare and set to work writing a <a href="https://melkjug.openplans.org/trac/melkjug/changeset/894">small integration layer</a> to see how it felt. The code turned out to be a bit hard to work with, and the UI was also not as lightweight as we were looking for, so I decided to scrap it and roll my own
</p>
<p>Here&#8217;s what I&#8217;m calling the &#8220;iBeginWhere?!&#8221; widget (working title):
</p>
<p align="center"> <img alt="Click the green &quot;open share&quot; icon to select a sharing service." src="/projects/melkjug/attachments/share-link-widget.png" height="264" width="688" /><br />
  
</p>
<p align="center"><strong>clicking the green &#8220;open share&#8221; icon reveals the various services to its left </strong><br />
  
</p>
<p>
  <br />Still a work in progress UI-wise, but it&#8217;s a decent approximation.
</p>
<p>Implementing this was educational in a number of different ways. For one, I got to play with jQuery (which I was excited to do after attending <a href="https://svn.openplans.org/svn/topp-talks/jquery/">rmarianski&#8217;s excellent TOPP Talk</a>). But hooking up the email button was particularly interesting. First, a screen shot:
</p>
<p align="center"><img alt="email_link_logged_in.png" src="/projects/melkjug/attachments/email_link_logged_in.png" height="440" width="1049" /><br />
  
</p>
<p align="center"> <strong>email link form (logged-in)<br />
  <br /></strong>
</p>
<p>Getting the above to happen was pretty easy using the javascript Luke had already written. But then we realized it would be nice if, when you filled out the form incorrectly, it would <a href="https://melkjug.openplans.org/trac/melkjug/ticket/212">reappear with the errors indicated</a>, like this:
</p>
<p align="center"><img alt="email_link_invalid.png" src="/projects/melkjug/attachments/email_link_invalid.png" height="495" width="518" />
</p>
<div align="center"> <strong>email link form with errors</strong><br />
  
</div>
<p>This was interesting because it wasn&#8217;t the basic case of synchronous form validation. Instead, the user clicks the email button, and some javascript makes an Ajax request to fetch the form and then display it in that nice modal dialog. If the user submits an invalid form, Pylons has to respond with an error code as well as a snippet containing the form with the indicated errors, which the javascript then pops up again. This was easily the most Ajax I&#8217;ve ever done (as well as my first time using FormEncode), and it was pretty cool getting to see how it works.<br />
  
</p>
<p> Another thing that made this interesting was the non-logged-in case: Unauthenticated users should not be able to send emails without first solving a captcha. Looks a little something like this:
</p>
<p align="center"><img alt="email_link_not_logged_in.png" src="/projects/melkjug/attachments/email_link_not_logged_in.png" height="447" width="980" />­<br />
  
</p>
<p align="center"><strong>email link form (not logged in)</strong><br />
  
</p>
<p>As you can see, we&#8217;re using recaptcha, which has a nice ajax api to generate the captcha. This was interesting not only because it was more ajax, but also because it complicated validation of the form: An incorrectly-solved captcha invalidates the form when the user is not logged in, but when the user is logged in, the captcha is not even present. How do you represent that with a FormEncode schema? After pairing with novalis on this (shout out), we found a nice solution: use the compound validator &#8220;Any&#8221; with two custom validators, one which validates iff the user is logged in, and another which actually makes the request to recaptcha.net to see if the captcha was solved correctly, and validates accordingly. The implementation of this is <a href="https://melkjug.openplans.org/trac/melkjug/changeset/1043">here</a>.
</p>
<p>I should also note that along the way Luke <a href="http://code.google.com/p/recaptcha/issues/detail?id=10#c2">found and fixed</a> a pretty critical bug in the recaptcha python plugin and <a href="http://groups.google.com/group/recaptcha/browse_thread/thread/625400f2b11ee019/400ac279346218eb#400ac279346218eb">submitted a patch</a> to the recaptcha mailing list, but unfortunately we haven&#8217;t heard back yet. Here&#8217;s to good open source karma, anyway.<br />
  
</p>
<p>Working on this ticket was interesting for one last reason, because I got to work with MIMEMultiPart messages (which is what gets sent when a user actually fills out the form correctly). Here&#8217;s a screenshot of what the resulting email looks like:
</p>
<p align="center"><img alt="email_link_email.png" src="/projects/melkjug/attachments/email_link_email.png" height="541" width="598" /><br />
  
</p>
<p align="center"><strong>&#8220;share link&#8221; email</strong><br />
  
</p>
<p>The interesting thing about <a href="https://melkjug.openplans.org/trac/melkjug/changeset/1028">implementing this</a> was figuring out how to correctly attach an html message and a plaintext message to the MimeMultiPart. It turns out that you have to attach the html message first, or else mail clients will show the plaintext message instead. Learned that one the <a href="https://melkjug.openplans.org/trac/melkjug/changeset/1031/">hard way</a>.<br />
  
</p>
<p>
  
</p>
<p>Also in the next release will be work toward <a href="https://melkjug.openplans.org/trac/melkjug/ticket/187">#187</a>: promote articles based on a set of tags. The motivation for this was a use case Bryan thought of while working on a demo of Melkjug for new users: Suppose Blog A uses <a href="http://www.streetsblog.org/category/issues-campaigns/traffic-calming">one tag</a>, but Blog B uses <a href="http://www.commuteroutrage.com/category/uncategorized-rage/">a different tag</a> to refer to the same concept (not to name names). It would be great to have a single filter that controls the presence of articles with <strong>any</strong> of the several tags you&#8217;re interested in. Another use case for the same functionality would be if you wanted to group tags referring to different concepts that are still somehow related. For instance, baseball, golf, and <a href="http://americanmadness.com/2007/06/27/kobayashi-vs-chestnut-the-rematch-that-never-was/">competitive eating</a> could all be grouped under &#8220;sports&#8221;. Enter the <a href="https://melkjug.openplans.org/trac/melkjug/browser/melkjug/branches/ticket187/melkjug/lib/filterui.py?rev=914#L177">MultiTagFilter</a>.
</p>
<p>To effect this feature, we <a href="/projects/melkjug/lists/melkjug-development-list/archive/2008/06/1214430037294">discussed</a> the possibility of transfiguring the simple filters of the <a href="https://melkjug.openplans.org/trac/melkjug/wiki/MixingSpec">mixing spec</a> into meta-filters, entities no longer limited to containing a single atomic filter, but rather allowed to contain an arbitrary function of other filters. The MultiTagFilter then just becomes some SingleTagFilters or&#8217;ed together. <a href="https://melkjug.openplans.org/trac/melkjug/changeset/923/melkjug/branches/ticket187">Implementing</a> <a href="https://melkjug.openplans.org/trac/melkjug/browser/melkjug/trunk/melkjug/lib/itemchoice.py#L112">this</a> was apparently tantamount to defining the <a href="http://en.wikipedia.org/wiki/Lambda_calculus">lambda calculus</a> (hence the reference to <a href="http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule">Greenspun&#8217;s Tenth</a>), but for better or worse, we decided to do it anyway. Keep it under raps though, I hear he sicks <a href="http://www.photo.net/photo/pcd2182/philip-and-alex.jpg">his enormous Siberian dog</a> on serious offenders. The upside, at least, now that filters can be arbitrarily composed, is that if we ever want to offer a MultiAuthorFilter, for example, it will be trivial.
</p>
<p>
  
</p>
<p>The last thing I&#8217;ll mention is work on <a href="https://melkjug.openplans.org/trac/melkjug/ticket/176">#176</a>: logins should be able to last longer. We accomplished this as follows:
</p>
<ul>
<li> set beaker session cookies to never expire</li>
<li>add a random string to the session, the &#8216;authenticator&#8217;</li>
<li>if when the user logs in they select &#8216;keep me logged in&#8217;, store an additional &#8216;melkauth&#8217; cookie which contains the authenticator and never expires</li>
<li>if the user restarts the browser and then hits melkjug, check if the authenticator in the melkauth cookie matches the authenticator in the session. if so, they will be logged in. </li>
</ul>
<p>I&#8217;m blogging about this one because it was my first foray into cookie auth stuff and I found it interesting, but also to solicit feedback. For instance, I suspect this is overkill:
</p>
<pre>def _make_authenticator(self):
    return ''.join(random.choice(ascii_letters) for i in xrange(64)) # 52^64 distinct strings
</pre>
<p>If anyone with more experience and intuition about this wants to chime in, I&#8217;d love to hear it. :)<br />
  
</p>
</p>
<p>&nbsp;
</p>
<p>Thanks for reading,<br />
  <br />Josh
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/07/16/midsummer-in-jugland-the-initiation-of-a-wannabe-melkthug/feed/</wfw:commentRss>
		</item>
		<item>
		<title>app engine notes from io</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/05/29/app-engine-notes-from-io/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/05/29/app-engine-notes-from-io/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Fri, 30 May 2008 01:31:57 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[app engine]]></category>

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/05/29/app-engine-notes-from-io/</guid>
		<description><![CDATA[ A few quick notes if you haven&#8217;t picked them up elsewhere:
  

App Engine is open to everyone now, but still in preview release.&#160; They rolled out access to memcache, an image manipulation api and announced an expected pricing structure for resources beyond the free limits (details).&#160; In the &#8220;fireside chat&#8221; they suggested an [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/05/29/app-engine-notes-from-io/"><![CDATA[<p> <img alt="appengine_lowres.jpg" src="/projects/melkjug/attachments/appengine_lowres.jpg" align="right" height="79" width="100" />A few quick notes if you haven&#8217;t picked them up elsewhere:<br />
  <br /><a href="http://www.readwriteweb.com/archive/google_app_engine_announcements.php"></a>
</p>
<p>App Engine is open to everyone now, but still in preview release.&nbsp; They rolled out access to memcache, an image manipulation api and announced an expected pricing structure for resources beyond the free limits (<a href="http://googleappengine.blogspot.com/2008/05/announcing-open-signups-expected.html">details</a>).&nbsp; In the &#8220;fireside chat&#8221; they suggested an alternate pricing model for non-profits and education, but with no specifics.
</p>
<p>They mentioned a timeline of &#8220;by the end of the year&#8221; for rolling out billing.&nbsp; It&#8217;s worth noting it&#8217;s basically the only thing they would attach a timeline to, although their big priorities also seem to be offline processing and alternate language support.<br />
  
</p>
<p>The question whether you will be charged for the size of the indices that are created to service your queries appears to be a strangely touchy issue.&nbsp; The word so far is they would &#8220;prefer not to&#8221; charge, but it appears this may be a matter of some internal debate?
</p>
<p>There don&#8217;t seem to be any plans around offering versioned objects. Bigtable can do this, they don&#8217;t have the appengine&#8217;s tables configured this way. Versions up to the last committed are garbage collected.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/05/29/app-engine-notes-from-io/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s shakin&#8217; in jug land</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/05/02/whats-shakin-in-jug-land/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/05/02/whats-shakin-in-jug-land/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Fri, 02 May 2008 17:01:33 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[app engine]]></category>

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

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

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/05/02/whats-shakin-in-jug-land/</guid>
		<description><![CDATA[ While I had hoped to get something out the door with the latest release that was cooler off the bat, it turned out to be a slightly bigger ball of wax than I was willing to wait for at this point. Sonali has been doing some great work thinking through alot of the interfaces [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/05/02/whats-shakin-in-jug-land/"><![CDATA[<p> <img alt="pisa.jpeg" src="/projects/melkjug/attachments/pisa.jpeg" align="right" height="143" width="107" />While I had hoped to get something out the door with the latest release that was cooler off the bat, it turned out to be a slightly bigger ball of wax than I was willing to wait for at this point. Sonali has been doing some great work thinking through alot of the interfaces and we&#8217;ve had some very productive discussions about the initial experince that we want for users. I&#8217;m excited about what we &#8216;re aiming, but it&#8217;s going to take a fair bit of rearranging to get there.
</p>
<p>
  <br />The biggest goal is to eliminate (or significantly lower) the barrier to seeing what is special about the site when you arrive. An anonymous user should be able to show up, see some feeds being displayed and immediately get the experience that takes about 4 long boring and meaningless steps to get to currently (sign up, create a jug, add some feeds, add some filters). There should be something on the front page when you show up that is perhaps interesting and that you can immediately start refining without signing up or logging in. We allow you to save the customized thing what you&#8217;ve done if you sign up.</p>
<p>Meanwhile, in the non-user-facing realm, I&#8217;ve been a bit (okay&#8230; maybe more than a bit) distracted from the main line of development trying to absorb what <a href="http://code.google.com/appengine/">Google App Engine</a> is all about, how much it has to offer to melkjug and how much would need to be done to take advantage of it in a significant way. I&#8217;m really excited about it, and I think that certain portions of the application map very well onto what Google is offering. Big props to <a href="http://blog.ianbicking.org/">Ian</a> for <a href="http://code.google.com/p/appengine-monkey/">appengine-monkey</a>.
</p>
<p>In a lot of ways, the changes I put in place to accommodate <a href="http://incubator.apache.org/couchdb/">CouchDb</a> have also payed off in fiddling around with the app engine data api &#8212; in terms of managing data, and constraints on finding it, I find them to be deeply similar. (p.s. looks like <a href="/projects/opencore/architecture/architecture.jpg">opencore</a> isn&#8217;t alone in <a href="http://incubator.apache.org/couchdb/img/sketch.png">hand drawn diagram</a> dept) Put together, CouchDB and App Engine are really starting to shape my concept of what melkjug needs to look like on the inside if it&#8217;s going to handle more than a handful of users.
</p>
<p>They&#8217;re very strange and restrictive environments in some respects, but I think at least some of these constraints are valuable to have right in front of you to prevent you from doing things that just really aren&#8217;t going to scale. I&#8217;m no expert on doing things in these ways, and I&#8217;m certain I&#8217;m doing things stupidly, but I think I&#8217;m starting to see the light&#8230; I&#8217;ll post more on this along with some of the prototypes I&#8217;m been playing around with at some point soon &#8212; poke me if you want them sooner :)</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/05/02/whats-shakin-in-jug-land/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Melkjug 0.2.1 is released</title>
		<link>http://www.openplans.org/projects/melkjug/blog/2008/05/02/melkjug-021-is-released/</link>
		<comments>http://www.openplans.org/projects/melkjug/blog/2008/05/02/melkjug-021-is-released/#comments</comments>
        	<slash:comments>0</slash:comments> 
		<pubDate>Fri, 02 May 2008 15:58:24 +0000</pubDate>
		<dc:creator>ltucker</dc:creator>
                <opencore:userid>ltucker</opencore:userid>
		
		<category><![CDATA[site upgrades]]></category>

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

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

		<guid isPermaLink="false">http://www.openplans.org/projects/melkjug/blog/2008/05/02/melkjug-021-is-released/</guid>
		<description><![CDATA[ Melkjug 0.2.1 includes many small changes and fixes based on your feedback and introduces a new article picking algorithm that should (hopefully) choose a more satisfying mix of articles.
  

Give it a try at http://melkjug.com and don&#8217;t forget to give feedback!



 Feature #10 export feed set as OPML
 Feature #91 change title of [...]]]></description>
			<content:encoded xml:base="http://www.openplans.org/projects/melkjug/blog/2008/05/02/melkjug-021-is-released/"><![CDATA[<p><img alt="launch.jpg" src="/projects/melkjug/attachments/launch.jpg" align="right" height="195" width="130" /><a href="/projects/melkjug/downloads"> Melkjug 0.2.1</a> includes many small changes and fixes based on your feedback and introduces a new article picking algorithm that should (hopefully) choose a more satisfying mix of articles.<br />
  
</p>
<p>Give it a try at <a href="http://melkjug.com">http://melkjug.com</a> and don&#8217;t forget to give <a href="http://melkjug.com/feedback">feedback</a>!
</p>
</p>
<ul>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/10">#10</a> export feed set as OPML</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/91">#91</a> change title of a jug</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/94">#94</a> Use melkjug with Internet Explorer</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/125">#125</a> auto-generate or auto-fill jug &#8216;url&#8217; field</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/131">#131</a> Choice algorithm should produce a balanced set of articles</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/132">#132</a> display component feeds on sidebar of feed view</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/147">#147</a> Display indicator of article loading</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/159">#159</a> pre-create one jug on signup</li>
<li> Feature <a href="https://melkjug.openplans.org/trac/melkjug/ticket/160">#160</a> see filter settings on a jug you don&#8217;t own</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/96">#96</a> No error message when adding a feed fails</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/107">#107</a> dismissed items sometimes blip back into existence momentarily</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/111">#111</a> Using back button in firefox brings back dismissed articles</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/124">#124</a> &#8217;shadow jug&#8217; page icon has wrong proportions</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/127">#127</a> Allow password reset</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/129">#129</a> Dismiss link at bottom of article</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/149">#149</a> There should be a url accessable subscription url</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/152">#152</a> usernames are case sensitive</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/157">#157</a> title bar displays wrong name</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/158">#158</a> dynamic page updates are not reflected when back button is hit</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/163">#163</a> forms are invisible in IE</li>
<li> Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/165">#165</a> javascript does not reload when javascript changes</li>
<li>Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/168">#168</a> Cannot import OPML</li>
<li>Fix <a href="https://melkjug.openplans.org/trac/melkjug/ticket/169">#169</a> Filtering on age is funky</li>
<li>Work to address <a href="https://melkjug.openplans.org/trac/melkjug/ticket/171">#171</a> Many jugs are too slow</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.openplans.org/projects/melkjug/blog/2008/05/02/melkjug-021-is-released/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
