<?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>MindTouch Developer Blog</title>
	<atom:link href="http://blog.developer.mindtouch.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.developer.mindtouch.com</link>
	<description>You’ve reached the home of the MindTouch engineering team. Here, MindTouch enginerds muse about random topics. Kick back and enjoy!</description>
	<lastBuildDate>Tue, 22 Jan 2013 23:43:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>10.1.4 is Released!</title>
		<link>http://blog.developer.mindtouch.com/2013/01/22/10-1-4-is-released/</link>
		<comments>http://blog.developer.mindtouch.com/2013/01/22/10-1-4-is-released/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 23:43:05 +0000</pubDate>
		<dc:creator>jamesv</dc:creator>
				<category><![CDATA[Releases]]></category>
		<category><![CDATA[10.1.4]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2138</guid>
		<description><![CDATA[Tweet 10.1.4 is now available! &#160;This minor release includes the following bug and security fixes. Bug Fixes Nested groups are now successfully synced for MindTouch sites integrated with&#160;Active Directory and LDAP. The default Active Directory group &#34;Domain Users&#34; can now be synced within MindTouch sites&#160;integrated with Active Directory. Fixed an issue where a&#160;page&#160;could not be [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2138" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2013%2F01%2F22%2F10-1-4-is-released%2F&amp;text=10.1.4%20is%20Released%21&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2013%2F01%2F22%2F10-1-4-is-released%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p><a href="http://blog.developer.mindtouch.com/wp-content/uploads/2012/03/open-box.jpg" rel="" style="" target="" title=""><img alt="" class="size-medium wp-image-2115 alignright" height="136" src="http://blog.developer.mindtouch.com/wp-content/uploads/2012/03/open-box-300x227.jpg" style="" title="open-box" width="180" /></a></p>
<p>10.1.4 is now available! &nbsp;This minor release includes the following bug and security fixes.</p>
<h2><strong>Bug Fixes</strong></h2>
<ul style="">
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px; line-height: 1.6;">
<p><em>Nested groups are now successfully synced for MindTouch sites integrated with&nbsp;Active Directory and LDAP.</em></p>
</li>
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px; line-height: 1.6;">
<p><em>The default Active Directory group &quot;</em>Domain Users<em>&quot; can now be synced within MindTouch sites&nbsp;integrated with Active Directory.</em></p>
</li>
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px; line-height: 1.6;">
<p><em>Fixed an issue where a&nbsp;page&nbsp;could not be edited due to a duplicate database key error.</em></p>
</li>
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px; line-height: 1.6;">
<p><em><span style="line-height: 1.6;">Fixed a cosmetic issue where a message was displayed&nbsp;indicating a user did not have access to a page after adding the&nbsp;user to a page&#39;s ACL.</span></em></p>
</li>
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px;">
<p><em><span style="line-height: 19px;">Fixed an issue to prevent the &quot;returnurl&quot; parameter from redirecting to an external site when logging into the Control Panel. This parameter will now only accept relative links.</span></em></p>
</li>
<li class="rn-list-item" style="margin: 0px 0px 0px 5px; padding: 0px 0px 0px 5px;">
<p><em style="line-height: 1.6;">Fixed an&nbsp;issue where a URL encoded Javascript alert could be executed as a URI parameter via &quot;</em><span style="line-height: 1.6;">Special:PageEmail&quot;.</span><em style="line-height: 1.6;">&nbsp;</em></p>
</li>
</ul>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">To upgrade* your installation, please visit our <a href="http://developer.mindtouch.com/en/docs/MindTouch_Administration_Guide/Upgrading_MindTouch" target="_blank">upgrade documentation</a> for further details.&nbsp; In addition, you can download the following Windows MSIs:</p>
<ul style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: disc; list-style-position: outside; list-style-image: initial; ">
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://sourceforge.net/projects/dekiwiki/files/MindTouch%20Windows%20MSI/MindTouch%2010.1.4/MindTouch_Win2003_10.1.4.zip/download">Windows Server 2003&nbsp;MSI</a></li>
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://sourceforge.net/projects/dekiwiki/files/MindTouch%20Windows%20MSI/MindTouch%2010.1.4/MindTouch_Win2008_10.1.4.zip/download">Windows Server 2008&nbsp;MSI</a></li>
</ul>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size:12px;"><strong style="font-style: normal; font-weight: bold; ">*IMPORTANT:</strong><br />
	Within Linux environments, upgrading to MindTouch 10.1+ from any previous version will require a Mono upgrade to Mono 2.10.2. &nbsp;Failure to do so will result in the API crashing; this latest version of MindTouch does require Mono 2.10.2. &nbsp;Please refer to the upgrade documentation referenced above for further details on upgrading your Mono installation within Linux environments.</span></p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2013/01/22/10-1-4-is-released/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Security Vulnerability</title>
		<link>http://blog.developer.mindtouch.com/2012/08/28/security-vulnerability/</link>
		<comments>http://blog.developer.mindtouch.com/2012/08/28/security-vulnerability/#comments</comments>
		<pubDate>Tue, 28 Aug 2012 22:24:01 +0000</pubDate>
		<dc:creator>petee</dc:creator>
				<category><![CDATA[Dev]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2125</guid>
		<description><![CDATA[TweetRecently, a Local/Remote file inclusion vulnerability was reported against MindTouch 10.1.3. &#160;Though the report looks ominous, this vulnerability is only exploitable when PHP is explicitly configured to operate in an insecure manner. The PHP setting that makes this vulnerability exploitable is&#160;register_globals = On. &#160;When register_globals is set to On, input from the client (query string [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2125" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F08%2F28%2Fsecurity-vulnerability%2F&amp;text=Security%20Vulnerability&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F08%2F28%2Fsecurity-vulnerability%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>Recently, a <a href="http://packetstormsecurity.org/files/115479/MindTouch-Deki-Wiki-10.1.3-Local-File-Inclusion-Remote-File-Inclusion.html">Local/Remote file inclusion vulnerability</a> was reported against MindTouch 10.1.3. &nbsp;Though the report looks ominous,<strong><em> </em>this vulnerability is only exploitable when PHP is explicitly configured to operate in an insecure manner.</strong></p>
<p>The PHP setting that makes this vulnerability exploitable is&nbsp;<strong>register_globals = On</strong>. &nbsp;When <a href="http://php.net/manual/en/security.globals.php">register_globals</a> is set to On, input from the client (query string parameters and cookies) are assigned to variables in PHP which can cause unexpected and very unsafe results.</p>
<p>Because register_globals = On is such a high security risk, the default value of the setting is &quot;<strong>Off</strong>&quot; since PHP version 4.2.0, has been deprecated in PHP 5.3.0 and removed entirely in PHP 5.4.0.</p>
<p>MindTouch has never recommened that the setting be turned on nor shipped a product with register_globals = On.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2012/08/28/security-vulnerability/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10.1.3 is Here!</title>
		<link>http://blog.developer.mindtouch.com/2012/03/05/10-1-3-is-here/</link>
		<comments>http://blog.developer.mindtouch.com/2012/03/05/10-1-3-is-here/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 20:08:02 +0000</pubDate>
		<dc:creator>jamesv</dc:creator>
				<category><![CDATA[Releases]]></category>
		<category><![CDATA[10.1.3]]></category>
		<category><![CDATA[mindtouch]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[release notes]]></category>
		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2103</guid>
		<description><![CDATA[Tweet 10.1.3 is here! &#160; This minor release includes various bug fixes and a few new features. &#160;Please see the list below for some notable fixes:&#160; Improved editor load time Corrected an issue when trying to navigate cursor within search field Corrected an issue causing page view count to incorrectly increment (his addresses future increments, [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2103" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F03%2F05%2F10-1-3-is-here%2F&amp;text=10.1.3%20is%20Here%21&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F03%2F05%2F10-1-3-is-here%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p><a href="http://blog.developer.mindtouch.com/wp-content/uploads/2012/03/open-box.jpg" rel="" style="" target="" title=""><img alt="" class="size-medium wp-image-2115 alignright" height="136" src="http://blog.developer.mindtouch.com/wp-content/uploads/2012/03/open-box-300x227.jpg" style="" title="open-box" width="180" /></a></p>
<p>10.1.3 is here! &nbsp; This minor release includes various bug fixes and a few new features. &nbsp;Please see the list below for some notable fixes:&nbsp;</p>
<ul style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: disc; list-style-position: outside; list-style-image: initial; ">
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Improved editor load time</span></em></li>
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Corrected an issue when trying to navigate cursor within search field</span></em></li>
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Corrected an issue causing page view count to incorrectly increment (his addresses future increments, though is not retroactive).</span></em></li>
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Corrected an issue causing&nbsp;links to fail when referencing&nbsp;multiple tags that have define pages.</span></em></li>
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Addressed a rare&nbsp;issue where performing an advanced search would redirect the user to&nbsp;the home page.</span></em></li>
<li class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; "><em><span class="rn-sum">Resolved a cosmetic&nbsp;issue where a user&#39;s configuration within the Control Panel was not displaying group membership.</span></em></li>
</ul>
<p class="rn-list-item" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 5px; line-height: 1.6; ">&nbsp;</p>
<h2 style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>New Features</strong></h2>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">In addition, 10.1.3 adds the following new features!</p>
<ul style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: disc; list-style-position: outside; list-style-image: initial; ">
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><em>Support for HTML5 content elements</em></li>
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><em>Pagination for </em>@api/deki/pages</li>
</ul>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">To upgrade* your installation, please visit our <a href="http://developer.mindtouch.com/en/docs/MindTouch_Administration_Guide/Upgrading_MindTouch" target="_blank">upgrade documentation</a> for further details.&nbsp; In addition, you can download the following packages:</p>
<ul style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: disc; list-style-position: outside; list-style-image: initial; ">
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">prepackaged&nbsp;<a href="http://sourceforge.net/projects/dekiwiki/files/MindTouch%20Deki%20VM/10.1.3%20%28Pipestone%29%20Software%20Appliance/MindTouch_VM_10.1.3.zip/download" target="_blank">Debian VM</a></li>
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://sourceforge.net/projects/dekiwiki/files/MindTouch%20Windows%20MSI/MindTouch%2010.1.3/MindTouch_Win2003_10.1.3.zip/download">Windows Server 2003</a>&nbsp; MSI</li>
<li class="rn-list-item" style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://sourceforge.net/projects/dekiwiki/files/MindTouch%20Windows%20MSI/MindTouch%2010.1.3/MindTouch_Win2008_10.1.3.zip/download" target="_blank">Windows Server 2008</a>&nbsp;MSI</li>
</ul>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size:12px;"><strong style="font-style: normal; font-weight: bold; ">*IMPORTANT:</strong><br />
	Within Linux environments, upgrading to MindTouch 10.1+ from any previous version will require a Mono upgrade to Mono 2.10.2. &nbsp;Failure to do so will result in the API crashing; this latest version of MindTouch does require Mono 2.10.2. &nbsp;Please refer to the upgrade documentation referenced above for further details on upgrading your Mono installation within Linux environments.</span></p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
<p style="margin-top: 8px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2012/03/05/10-1-3-is-here/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rolling your own coroutines</title>
		<link>http://blog.developer.mindtouch.com/2012/01/11/rolling-your-own-coroutines/</link>
		<comments>http://blog.developer.mindtouch.com/2012/01/11/rolling-your-own-coroutines/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 07:51:44 +0000</pubDate>
		<dc:creator>arnec</dc:creator>
				<category><![CDATA[API Team (Red)]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[coroutine]]></category>
		<category><![CDATA[dream]]></category>
		<category><![CDATA[tpl]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2065</guid>
		<description><![CDATA[TweetThis post marks the conclusion of the async programming series I originally started as lead in for my monospace 2011 talk. The remaining subject, as promised in my last article, is the creation of tradtional coroutines using .NET iterators. The example code and Monospace slides talking about it can be found on github. I had [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2065" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F01%2F11%2Frolling-your-own-coroutines%2F&amp;text=Rolling%20your%20own%20coroutines&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2012%2F01%2F11%2Frolling-your-own-coroutines%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>This post marks the conclusion of the async programming series I originally started as lead in for my monospace 2011 talk. The remaining subject, as promised in my last article, is the creation of tradtional coroutines using .NET iterators. The example code and Monospace slides talking about it can be found on <a href="https://github.com/sdether/Monospace.NoThreads" target="_blank">github</a>. I had hoped to time it with a definite date for async/await arriving in .NET but WinRT has kind of derailed future releases, it would seem.</p>
<p>But before I get into, let&#39;s roll up the posts that got us here:</p>
<ul>
<li><a href="http://blog.developer.mindtouch.com/2011/06/10/tasked-to-get-results/">Tasked To Get Results</a>&nbsp;&#8211; Introducing our asynchronous completion handles, DReAM&#39;s Result and the Task Parallel Library&#39;s Task</li>
<li><a href="http://blog.developer.mindtouch.com/2011/06/13/whats-asynchrony-good-for/">What&#39;s Asynchrony Good For?</a> &#8212; When should we use these constructs</li>
<li><a href="http://blog.developer.mindtouch.com/2011/06/21/exit-screen-right/">Exit &#8230; Screen Right</a> &#8212; CPS (Continuation Passing Style) asynchronous chaining using Result and Task</li>
<li><a href="http://blog.developer.mindtouch.com/2011/08/19/asynchrony-and-sequential-workflows/">Asynchrony and Sequential Workflows</a> &#8212; Using DReAM coroutines and TPL&#39;s async/await to bring back sequential flow in asynchronous operations</li>
</ul>
<p>The canonical example of coroutines are producer/consumer pipelines, in which each stage of the pipeline does some amount of work and yields execution to the next stage once it cannot continue. The benefits of this type of processing pipeline is avoidance of locks and maximum utilization of the processing power given to it, in addition to the loose coupling of the pipeline that easily let you add or remove steps in the chain.&nbsp;</p>
<p>For this processing to work the coroutines must all have the same &quot;shape&quot;, e.g. signature. For the Iterator based coroutines I will cover first, I chose the following shape:</p>
<p><script src="https://gist.github.com/1599115.js?file=iterator%20coroutine%20shape"></script></p>
<p>The coroutine accepts the Coordinator and yields once it cannot continue with any more work. The Coordinator contains the shared state <strong>T</strong> that all coroutines have access to. Since only one coroutine is ever executed at a time, the state can be mutated without locks.</p>
<p>The example we&#39;ll use is a producer of a <code>3x4</code> matrix and a consumer that outputs that matrix transpoed to <code>6x2</code>. To show the ability to add random stages to this chain, we will have another coroutine that will take every value and square it.</p>
<p><script src="https://gist.github.com/1599109.js"> </script></p>
<p>We create a <strong><code>Coordinator&lt;int[]&gt;</code></strong>, i.e. our state is a block of <code>int</code>s, requiring a coroutine signature of <strong><code>IEnumerator Coroutine&lt;T&gt;(Coordinator&lt;T&gt; coordinator)</code></strong>, but since the Coordinator accepts the coroutines as an array of <strong><code>Func</code></strong>s, we can curry signatures &nbsp;of different shapes into the required shape. In our example we capture a source and destination for the Producer and Consumer coroutines, respectively, while the Exponetiator already has the required shape.&nbsp;</p>
<p>Let&#39;s look at the Producer:</p>
<p><script src="https://gist.github.com/1599137.js?file=iterator%20producer.cs"></script></p>
<p>The Producer takes the input matrix and writes it one row at a time into the state object. After each row, the producer yields execution to the next coroutine. We yield null, since the iterator is just used for its side-effect of letting us suspend a method mid-execution and continue later. And that&#39;s the magic of it. Yes, it looks like a regular method, but it really does exit and re-enter multiple times. <strong><em>Every time yield is called, the state of the method is suspended while another coroutine gets to run, and once resumed, the method continues on with all its local state from the point right after the yield</em></strong>. We are stopping in the middle of a loop, letting someone else go and then continue on from that exact same place in the loop, all without blocking a thread.</p>
<p><script src="https://gist.github.com/1599207.js?file=iterator%20consumer.cs"></script></p>
<p>The Consumer is provided the output matrix and starts a loop that will continue until its output matrix is filled, reading the block of integers from the state, writing it to the new matrix and yielding its execution to the coordinator, so that the a fresh set of integers can be provided.</p>
<p><script src="https://gist.github.com/1599213.js?file=iterator%20exponentiator.cs"></script></p>
<p>The last coroutine is the Exponentiator which just continues to square every value in the state integer block each time it is resumed and then yields execution until provided a fresh set of integers to square.</p>
<p><script src="https://gist.github.com/1599256.js?file=iterator%20coordinator.cs"></script></p>
<p>Finally, <strong><code>Coordinator&lt;T&gt;</code></strong> allows the construction of these arbitrary co-operative processing chains. It is simply an inversion of a regular iterator. Instead of receiving a new value, one at a time from an enumerator, we have one enumerator per coroutine that we can command to run to its next yield point with <strong>MoveNext()</strong>. <strong>MoveNext()</strong> will return &nbsp;false if it was a yield break, signaling that the coroutine is done or&nbsp;true if it was a yield return, signaling that the coroutine is willing to continue in which case we put the enumerator into our queue, pick the next coroutine from the queue and compel it resume.</p>
<p>In the&nbsp;&nbsp;<a href="https://github.com/sdether/Monospace.NoThreads" target="_blank">github</a>&nbsp;project I also implemented the same coroutines using <code>async/await</code>. The one benefit that implementation has over Iterator based coroutines is that once inside an async method, you can await any other async method. Allowing these types of coroutines to suspend the execution chain to let some other async task (such as a web request) execute.</p>
<p>While interesting and useful in a limited set of circumstances the coroutines introduced in this article are not likely going to find themselves into your next project. Far more useful and applicable in any application liable to block on I/O are the asynchronous workflows introduced in&nbsp;<a href="http://blog.developer.mindtouch.com/2011/08/19/asynchrony-and-sequential-workflows/">Asynchrony and Sequential Workflows</a>&nbsp;since these types of coroutines allow us to use traditional sequential coding styles while never blocking on asynchronous operations.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2012/01/11/rolling-your-own-coroutines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asynchrony and sequential workflows</title>
		<link>http://blog.developer.mindtouch.com/2011/08/19/asynchrony-and-sequential-workflows/</link>
		<comments>http://blog.developer.mindtouch.com/2011/08/19/asynchrony-and-sequential-workflows/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 14:04:05 +0000</pubDate>
		<dc:creator>arnec</dc:creator>
				<category><![CDATA[API Team (Red)]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[await]]></category>
		<category><![CDATA[dream]]></category>
		<category><![CDATA[task]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2029</guid>
		<description><![CDATA[TweetRather than finishing this series on asynchrony before my Monospace 2011 talk on the same subject, I got busy finishing the materials for the talk instead. The slides and example code from the talk can be found here, and the video will be posted on InfoQ in the near future. Since the examples are slightly [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2029" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F08%2F19%2Fasynchrony-and-sequential-workflows%2F&amp;text=Asynchrony%20and%20sequential%20workflows&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F08%2F19%2Fasynchrony-and-sequential-workflows%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>Rather than finishing this series on asynchrony before my <a href="http://monospace.us/" target="_blank">Monospace 2011</a> talk on the same subject, I got busy finishing the materials for the talk instead. The <a href="https://github.com/sdether/Monospace.NoThreads" target="_blank">slides and example code from the talk</a> can be found here, and the video will be posted on <a href="http://www.infoq.com/" target="_blank">InfoQ</a> in the near future. Since the examples are slightly different and the slides less explanatory, I will continue this series of posts as a more in-depth version of the content in the slides.</p>
<p>In the last post, <a href="http://blog.developer.mindtouch.com/2011/06/21/exit-screen-right/" target="_blank">Exit&#8230; Screen Right</a>, I talked about using the CPS (continuation passing style) to chain asynchronous methods together. While this is a proven way of dealing with asynchrony, it puts the <strong>how </strong>in front of the <strong>what</strong>, which makes our code harder to maintain and debug. Ideally we&#39;d continue writing our code in the regular sequential style we&#39;ve always used but steps that do not happen synchronously, suspend the flow and resume once the step is completed instead of blocking their thread. With a regular method that&#39;s not possible, since it controls the flow of execution until it exits, but there exists a variation of the trusty method (which really is just a subroutine), called coroutine:</p>
<blockquote>
<p><strong>Coroutines</strong> are <a href="http://en.wikipedia.org/wiki/Computer_program" target="_blank" title="Computer program">computer program</a> components that generalize <a href="http://en.wikipedia.org/wiki/Subroutine" target="_blank" title="Subroutine">subroutines</a> to allow multiple <a href="http://en.wikipedia.org/wiki/Entry_point" target="_blank" title="Entry point">entry points</a> for suspending and resuming execution at certain locations</p>
<p style="text-align: right;">&#8211; <a href="http://en.wikipedia.org/wiki/Coroutine" target="_blank">Wikipedia</a></p>
</blockquote>
<p style="text-align: left;">With Coroutines, we can suspend the current execution flow, allow an async action to complete and then have its continuation resumes our flow of execution. <em>Great</em>. Except .NET doesn&#39;t have Coroutines, right? Not exactly, but it does have generators for building Iterators, in the form of <code>IEnumerator&lt;T&gt;</code> and the <code>yield</code> keyword. Since Generators are a specialized form of Coroutines it is possible to use them to mimic Coroutine behavior. In addtion, the <a href="http://msdn.microsoft.com/en-us/vstudio/gg316360" target="_blank">AsyncCTP for C# 5.0</a> introduces the <code>async/await</code> constructs, which provide a better syntax for suspending and resuming a method.</p>
<p style="text-align: left;"><a href="https://github.com/MindTouch/dream" target="_blank">DReAM</a> Coroutines are built on top an inversion of the Iterator pattern, which allowed us to introduce them in .NET 2.0, while <code>Task</code> based Coroutines won&#39;t be possible in production until .NET 5.0 ships. Both provide us the ability to write sequential code that suspends on asynchronous work, preserving our workflow.</p>
<h2>Review of our Async Workflow Methods</h2>
<p>Below are the asynchronous method signatures from last time:</p>
<h3>1. GetUserRecentArticles</h3>
<p>This method implements the asynchronous workflow.</p>
<pre class="brush: csharp">// Result
Result&lt;DreamMessage&gt; GetUserRecentArticles(int userId, int limit, Result&lt;DreamMessage&gt; response)
// Task
Task&lt;DreamMessage&gt; GetUserRecentArticles(int userId, int limit)</pre>
<p><code>DreamMessage</code> is DReAM&#39;s symmetric Http Request and Response data container, and serves as the value of the synchronization handle seen by the outside caller. The Http Server would call <code>GetUserRecentArticles</code> to start the asynchronous chain and use the synchronization handle to retrieve the final result.</p>
<h3>2. GetFeedsForUserFromDb</h3>
<p>This method uses asynchronous database queries to get the list of Uri&#39;s the user is subscribed to:</p>
<pre class="brush: csharp">// Result
Result&lt;IEnumerable&lt;XUri&gt;&gt; GetFeedsForUserFromDb(int userId, Result&lt;IEnumerable&lt;XUri&gt;&gt; result)
// Task
Task&lt;IEnumerable&lt;XUri&gt;&gt; GetFeedsForUserFromDb(int userId)</pre>
<h3>3. FetchFeed</h3>
<p>This method uses an asynchronous web request to fetch the feed for a given Uri. We will be multiplexing this call to fetch multiple feeds at once.</p>
<pre class="brush: csharp">// Result
Result&lt;XDoc&gt; FetchFeed(XUri uri, Result&lt;XDoc&gt; result)
//Task
Task&lt;XDoc&gt; FetchFeed(XUri uri)</pre>
<h3>4. FilterViaDb</h3>
<p>This method is called once for each feed that we&#39;ve fetched to turn into a list of only the articles not yet seen by the user</p>
<pre class="brush: csharp">// Result
Result&lt;IEnumerable&lt;XDoc&gt;&gt; FilterViaDb(XDoc doc, Result&lt;IEnumerable&lt;XDoc&gt;&gt; result)
// Task
Task&lt;IEnumerable&lt;XDoc&gt;&gt; FilterViaDb(XDoc doc)</pre>
<h3>5. MarkAsRead</h3>
<p>Step 5 combines the articles, applies the limit and marks the articles to be returned as read. Only the last part is an asynchronous operation, the rest can be performed inline. The method <code>MarkAsRead</code> makes asynchronous calls to the database to insert the canonical Uri&#39;s of the articles to be returned to mark them as read.</p>
<pre class="brush: csharp">//Result
Result MarkAsRead(int userId, IEnumerable&lt;XDoc&gt; aggregatedArticles, Result result)
// Task
Task MarkAsRead(int userId, IEnumerable&lt;XDoc&gt; aggregatedArticles)</pre>
<h2>DReAM coroutine</h2>
<p>A DReAM Coroutine must produce an <code>Enumerator</code> of type <code>IYield</code>, which is the coordination construct for Coroutines and is implemented by <code>Result</code>, i.e. any method returning a <code>Result</code> can be yielded to in a Coroutine. Since this signature requirement would change the expected signature of <code>GetUserRecentArticles</code> from the DReAM Asynchronous Method Pattern and the usage of a Coroutine is really an implementation detail, we hide the actual Coroutine:</p>
<pre class="brush: csharp">private Result&lt;DreamMessage&gt; GetUserRecentArticles(int userId, int limit, Result&lt;DreamMessage&gt; response) {
  return Coroutine.Invoke(GetUserRecentArticles_Co, userId, limit, response);
}</pre>
<p>We use <code>Coroutine.Invoke</code> to execute the enumerator that <code>GetUserRecentArticles_Co</code> returns. The actual implementation now has the familiar sequential flow we are used to:</p>
<pre class="brush: csharp">public Yield GetUserRecentArticles_Co(int userId, int limit, Result response) {

    // yield execution to fetch the user&#39;s feed uris from the DB
    IEnumerable uris = null;
    yield return GetFeedsForUserFromDb(userId, new Result&gt;()).Set(x =&gt; uris = x);

    // start to fetch all feeds
    var feeds = uris.Select(uri =&gt; FetchFeed(uri, new Result())).ToList();

    // yield execution until all fetch calls have signaled completion
    yield return feeds.Join(new Result());

    // start to filter all feeds to only unread
    var allUnreadArticles = feeds
        .Select(feedResult =&gt; FilterViaDb(feedResult.Value, new Result&gt;()))
        .ToList();

    // yield execution until all filter calls have signaled completion
    yield return allUnreadArticles.Join(new Result());

    // combine all filtered articles
    var combinedArticles = (from unreadResult in allUnreadArticles
                            let unreadArticles = unreadResult.Value
                            from article in unreadArticles
                            select article).Take(limit).ToList();

    // yield execution to async method marking all remaining articles as read
    yield return MarkAsRead(userId, combinedArticles, new Result());
    var aggregatedDoc = new XDoc(&quot;articles&quot;).AddAll(combinedArticles);

    // signal response with aggregated article document
    response.Return(DreamMessage.Ok(aggregatedDoc));
}</pre>
<p style="text-align: left;">Instead of chaining <code>.WhenDone</code> on each async method, we now call them with <code>yield return</code> instead, which resumes the body of the method after the async call completes. We still use <code>response.Return</code> to signal completion, since the Iterator doesn&#39;t regular return value. The one caveat causing some syntactic cruft is that we cannot create and assign the value in the yield return. Instead we have to declare it before and use the <code>.Set()</code> extension method, which unwraps the result, allowing us to capture it with a <em>lambda</em>.</p>
<h2 style="text-align: left;">Coroutine flow with async/await</h2>
<p><code>async/await</code> allows the same coroutine flow we create with an Iterator and <code>Result</code>, but since it is custom built into the compiler around <code>Task</code>, it achieves additional syntactic magic for very readable and natural code:</p>
<pre class="brush: csharp">public async Task GetUserRecentArticles(int userId, int limit) {

    // Await the fetching of the user&#39;s feed uris from the DB
    var uris = await GetFeedsForUserFromDb(userId);

    // start fetch all feeds
    var feedTasks = uris.Select(FetchFeed).ToList();

    // Await all feeds being fetched
    var feeds = await  TaskEx.WhenAll(feedTasks);

    // start to filter all feeds to only unread
    var unreadArticleTasks = feeds.Select(FilterViaDb).ToList();

    // Await feeds completing filtering
    var allUnreadArticles = await TaskEx.WhenAll(unreadArticleTasks);

    // combine all filtered articles
    var combinedArticles = (from unreadArticles in allUnreadArticles
                            from article in unreadArticles
                            select article).Take(limit).ToList();

    // Await the database call to mark all remaining articles as read
   &nbsp;await MarkAsRead(userId, combinedArticles);
    var aggregatedDoc = new XDoc(&quot;articles&quot;).AddAll(combinedArticles);

    // return the final result, which in turn sets it on the Task
    // that had already been returned for us
    return DreamMessage.Ok(aggregatedDoc);
}</pre>
<p>With <code>async/await</code>, the only difference between a workflow where all of our calls are synchronous is that we have an <code>await</code> in front of every async method now. That&#39;s a really low syntax tax to pay for completely non-blocking workflows! The other thing you may notice is that the signature of the method is <code>Task&lt;DreamMessage&gt;</code> while we return just a <code>DreamMessage</code>. This is possible, because the method is marked with <code>async</code>, which tells the compiler to rewrite the method body as a series of continuations interrupted by <code>await</code> barriers.</p>
<h2>But how does it work?</h2>
<p>Both <code>yield</code> and <code>async/await</code> are constructs that tell the compiler that the body of the subroutine should be rewritten as a state machine. They make it easy for us to think of the flow of execution as a regular sequential flow, while handling the complexities of tracking the local scope when execution is suspended and resumed. In simplistic terms, a new anonymous class is generated with members to capture the locally available variables of the method. The body of the method is broken up into linear blocks of execution at the <code>yield/await</code> barriers. This way each block can be run until the next barrier, store to which point it was last run to and exit and upon the next invocation continue running the next block.</p>
<p>In <a href="http://blog.developer.mindtouch.com/2012/01/11/rolling-your-own-coroutines/" target="_blank">my next post</a>, I will break down how you can use this behavior to roll your own Coroutines instead of just using <code>yield</code> to return values in a sequence or <code>await</code> to wait for an asynchronous method to complete.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/08/19/asynchrony-and-sequential-workflows/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Watched Pages have been merged with Subscriptions</title>
		<link>http://blog.developer.mindtouch.com/2011/07/27/watched-pages-have-been-merged-with-subscriptions/</link>
		<comments>http://blog.developer.mindtouch.com/2011/07/27/watched-pages-have-been-merged-with-subscriptions/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 15:42:25 +0000</pubDate>
		<dc:creator>kellya</dc:creator>
				<category><![CDATA[Status Updates]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2026</guid>
		<description><![CDATA[TweetYou might have noticed that the Watched Pages link in your &#8220;More&#8221; menu. As I mentioned in a previous post, that&#8217;s intentional. There has been confusion between page subscriptions (where you can subscribe for notifications to page/site changes) and Watched Pages (where you can see what pages you&#8217;re watching and subscribe to them via RSS, [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2026" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F07%2F27%2Fwatched-pages-have-been-merged-with-subscriptions%2F&amp;text=Watched%20Pages%20have%20been%20merged%20with%20Subscriptions&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F07%2F27%2Fwatched-pages-have-been-merged-with-subscriptions%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>You might have noticed that the Watched Pages link in your &#8220;More&#8221; menu. As I mentioned in a previous post, that&#8217;s intentional. There has been confusion between page subscriptions (where you can subscribe for notifications to page/site changes) and Watched Pages (where you can see what pages you&#8217;re watching and subscribe to them via RSS, for example) for some time now. Obviously, this was causing great confusion among new users so we decided to merge the functionality of the two services. Now, instead of having a watched pages page, you just have a Subscriptions page located here: <a href="http://developer.mindtouch.com/Special:Subscriptions">http://developer.mindtouch.com/Special:Subscriptions</a></p>
<p>As a result, the watched pages you were watching have automatically been converted to Subscribed pages. You can manage subscriptions more easily now as well. Learn more here: <a href="http://help.mindtouch.us/kb/Managing_Notifications">http://help.mindtouch.us/kb/Managing_Notifications</a></p>
<p>Note: the Subscriptions link is missing from the Tools menu on Developer.MindTouch.com. This is a known error in the skin being used here. We will likely push a fix live today. In the meantime, you can directly navigate to the subscriptions page by using the link above.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/07/27/watched-pages-have-been-merged-with-subscriptions/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>New 10.1 Feature: Advanced Search</title>
		<link>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-advanced-search/</link>
		<comments>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-advanced-search/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 22:15:04 +0000</pubDate>
		<dc:creator>kellya</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[10.1]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2023</guid>
		<description><![CDATA[TweetUPDATE:  Please accept our sincerest apologies for any miscommunication, though the new Advanced Search feature is currently only available within our TCS Cloud offering.  We are looking to include this functionality in a future release of MindTouch Platform v 10.1. MindTouch Core, Platform and TCS all ship with a new advanced search feature that takes [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2023" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-advanced-search%2F&amp;text=New%2010.1%20Feature%3A%20Advanced%20Search&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-advanced-search%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>UPDATE:  Please accept our sincerest apologies for any miscommunication, though the new Advanced Search feature is currently only available within our TCS Cloud offering.  We are looking to include this functionality in a future release of MindTouch Platform v 10.1.</p>
<p>MindTouch Core, Platform and TCS all ship with a new advanced search feature that takes a normal query and gives you a dedicated UI for going into further detail about what you want. Advanced search allows you to refine your queries by including &#8220;all of these words&#8221; &#8220;exact phrase&#8221; &#8220;any of these words&#8221; or &#8220;been tagged with.&#8221; You can also filter results by &#8220;do not have these words&#8221; &#8220;by author&#8221; &#8220;by type:pages, images, comments, or documents.&#8221; If you are a TCS customer, these results are going to feed into your search analytics as well.</p>
<p>You can <a href="http://help.mindtouch.us/kb/Advanced_Search" target="_blank">read more about advanced search</a> and see some screenshots over on help.mindtouch.us.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-advanced-search/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New 10.1 Feature: Spell-Check</title>
		<link>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-spell-check/</link>
		<comments>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-spell-check/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 21:15:49 +0000</pubDate>
		<dc:creator>kellya</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[10.1]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2019</guid>
		<description><![CDATA[TweetWe&#8217;re not all great spellers. Let&#8217;s face it, most of us are pretty bad spellers. We&#8217;re also not great at grammar. When you ask for collaboration amongst your community, you have to take the bad with the good &#8211; spelling and grammar included. Wouldn&#8217;t it be nice if your collaboration platform had a spell-check and [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2019" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-spell-check%2F&amp;text=New%2010.1%20Feature%3A%20Spell-Check&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-spell-check%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>We&#8217;re not all great spellers. Let&#8217;s face it, most of us are pretty bad spellers. We&#8217;re also not great at grammar. When you ask for collaboration amongst your community, you have to take the bad with the good &#8211; spelling and grammar included. Wouldn&#8217;t it be nice if your collaboration platform had a spell-check and grammar-check built into the editor?</p>
<p>In the 10.1 release of Core, Platform and TCS, MindTouch now ships with that capability out of the box. Look for the ABC button at the top of your editor window and click it. Wait a sec while the spell-check reads your content and then start to click on the items it highlights for you to correct them.</p>
<p>The service is based on <a href="http://afterthedeadline.com/">After the Deadline</a> and is available for free. If you upgrade to 10.1 there is nothing to do to set it up. We&#8217;ve pre-package the connection to that service for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-spell-check/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>New 10.1 Feature: Auto-Save</title>
		<link>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-auto-save/</link>
		<comments>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-auto-save/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 20:15:09 +0000</pubDate>
		<dc:creator>kellya</dc:creator>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[10.1]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2016</guid>
		<description><![CDATA[TweetOne of the most requested features we have had is a way for MindTouch to automatically save content users are in the process of creating. Murphy&#8217;s Law teaches us that when you are hard at work on something for a very long time and you forget to save your progress, that&#8217;s when your computer will [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2016" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-auto-save%2F&amp;text=New%2010.1%20Feature%3A%20Auto-Save&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fnew-10-1-feature-auto-save%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>One of the most requested features we have had is a way for MindTouch to automatically save content users are in the process of creating. Murphy&#8217;s Law teaches us that when you are hard at work on something for a very long time and you forget to save your progress, that&#8217;s when your computer will fail you. Now, in the event your browser crashes, when you get back to your MindTouch site, and navigate to the page you were working on, it will ask you if you want to continue editing the page you were working on or abandon those changes and work with some previous version.</p>
<p>The auto-save feature produces a notification in the editor dialog (top right corner) every time it saves. Look for it after you upgrade and start editing.</p>
<p>This feature is available in Core, Platform and TCS versions of 10.1 and 11.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/06/29/new-10-1-feature-auto-save/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Watched Pages</title>
		<link>http://blog.developer.mindtouch.com/2011/06/29/watched-pages/</link>
		<comments>http://blog.developer.mindtouch.com/2011/06/29/watched-pages/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 17:00:14 +0000</pubDate>
		<dc:creator>kellya</dc:creator>
				<category><![CDATA[Dev]]></category>

		<guid isPermaLink="false">http://blog.developer.mindtouch.com/?p=2011</guid>
		<description><![CDATA[TweetWe&#8217;re going to be deprecating Watched Pages soon. This has been one of the most consistently requested changes in our product. It was a good idea that ended up creating confusion when notifications were added along side it. In this development iteration, we&#8217;re going to be eliminating the confusion by choosing one. Notifications won. There [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton2011" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fwatched-pages%2F&amp;text=Watched%20Pages&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.developer.mindtouch.com%2F2011%2F06%2F29%2Fwatched-pages%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.developer.mindtouch.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>We&#8217;re going to be deprecating Watched Pages soon. This has been one of the most consistently requested changes in our product. It was a good idea that ended up creating confusion when notifications were added along side it. In this development iteration, we&#8217;re going to be eliminating the confusion by choosing one. Notifications won.</p>
<p>There are a number of members of the Developer Community who have already spent time cultivating a watchlist. Don&#8217;t panic. Your watched list will still be available. We&#8217;re going to migrate it to a page where we&#8217;re tracking your notifications. That&#8217;s the good news. The bad news &#8211; unless you get in and unsubscribe &#8211; is that you&#8217;re going to be receiving notifications for pages that you&#8217;re watching (but only when they change).</p>
<p>When the feature goes live on MindTouch.us we&#8217;ll cross-post here since we keep <a href="http://developer.mindtouch.com">developer.mindtouch.com</a> current with those bits.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.developer.mindtouch.com/2011/06/29/watched-pages/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
