<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
  <channel>
    <title>Monologue</title>
    <description>The voices of Mono</description>
    <link>http://www.go-mono.com/monologue/</link>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Monologue worker: b-diddy powered</generator>
    <item>
      <title>Aaron Bockover: Banshee + GNOME 3.0</title>
      <description>&lt;p&gt;&lt;img border="0" align="right" src="http://abock.org/blog-images/gnome.png" alt="The GNOME logo" /&gt; I spent a little time this weekend doing one of the things I've wanted to do for years - eradicate one of the oldest files in Banshee: &lt;a href="http://git.gnome.org/browse/banshee/diff/src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade?id=d3c06da68d6f286fff6515bfe3a467c5279afd58"&gt;banshee-dialogs.glade&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The vast majority of Banshee's UI is custom widgetry that is laid out dynamically at runtime. The main window and the preferences dialog hasn't been restricted by Glade for a couple of years, but all the other dialogs were defined in part in Glade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Location&lt;/li&gt;
&lt;li&gt;Seek To&lt;/li&gt;
&lt;li&gt;Import Media&lt;/li&gt;
&lt;li&gt;Smart Playlist Editor&lt;/li&gt;
&lt;li&gt;Error list dialog (very unlikely anyone has ever seen this)&lt;/li&gt;
&lt;li&gt;Last.FM Station Editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These were all fairly simple dialogs in Glade -- mostly consisting of a table, some static labels, and placeholders to pack in custom widgets at runtime (e.g. the import source combo box in the Import Media dialog, or the actual query builder UI packed in the Smart Playlist Editor dialog).&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://abock.org/blog-images/banshee-glade-dialogs.png"&gt;&lt;img border="0" src="http://abock.org/blog-images/banshee-glade-dialogs-th.png" alt="Old Banshee Glade Dialogs" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;em&gt;Old Banshee Glade Dialogs&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;These are now fully defined in code, allowing the dialogs to derive directly from &lt;a href="http://git.gnome.org/browse/banshee/tree/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs"&gt;BansheeDialog&lt;/a&gt;, which provides extra common functionality for dialogs on top of Gtk.Dialog.&lt;/p&gt;

&lt;p&gt;The big take-away here is no longer depending on the deprecated libglade/glade-sharp libraries (well, almost -- later this week &lt;a href="http://gburt.blogspot.com/"&gt;Gabriel&lt;/a&gt; will port &lt;a href="http://gburt.blogspot.com/2008/08/muinshee.html"&gt;Muinshee&lt;/a&gt; -- an alternative Banshee client in the image of &lt;a href="http://muine.gooeylinux.org/"&gt;Muine&lt;/a&gt;, but not a core component). Additionally, I removed our dependency on libgnome/gnome-sharp, which is also deprecated.&lt;/p&gt;

&lt;p&gt;This means that Banshee 1.5.4 will be GNOME 3.0 ready. The last thing to do is implement a udev hardware backend. We already have partial DeviceKit support, and GIO support. However, we don't take a hard dependency on HAL. The removal of the last Glade file represents the eradication of any hard obsolete GNOME 2.0 dependencies. Exciting!&lt;/p&gt;

&lt;p&gt;As a quick aside: what was really nice about the porting from Glade to C# was the use of C# 3.0 features - specifically type inference and object initializers. This permits interface construction using a more terse syntax than available in C# 2.0, yielding improved readability and organization. For instance:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;
    var table = new Table (2, 2, false) {
        RowSpacing = 12,
        ColumnSpacing = 6
    };

    table.Attach (new Label () {
            Text = Catalog.GetString ("Station _Type:"),
            UseUnderline = true,
            Xalign = 0.0f
        }, 0, 1, 0, 1, AttachOptions.Fill, AttachOptions.Shrink, 0, 0);
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Bring it on, GNOME 3.0. We are ready! &lt;/p&gt;</description>
      <link>http://abock.org/2010/02/08/banshee-gnome-3-0</link>
      <category>uncategorized</category>
      <category>banshee</category>
      <category>gnome</category>
      <author>Aaron_x0020_Bockover@monologue.go-mono.com</author>
      <comments>http://abock.org/2010/02/08/banshee-gnome-3-0#comments</comments>
      <guid isPermaLink="false">http://abock.org/?p=331</guid>
      <pubDate>Mon, 08 Feb 2010 19:32:54 GMT</pubDate>
    </item>
    <item>
      <title>Unity Technologies: Unity Tech signs a three-year deal with LEGO!</title>
      <description>As y&amp;#8217;all know the user base for Unity is exploding and that growth includes developers across the spectrum, from games to non-games, from small development shops to large studios, from social media outlets to major media providers. Today we have news about not just a major media provider but a major toy manufacturer as well, [...]</description>
      <link>http://blogs.unity3d.com/2010/02/08/unity-tech-signs-a-three-year-deal-with-lego/</link>
      <category>Company News</category>
      <author>Unity_x0020_Technologies@monologue.go-mono.com</author>
      <comments>http://blogs.unity3d.com/2010/02/08/unity-tech-signs-a-three-year-deal-with-lego/#comments</comments>
      <guid isPermaLink="false">http://blogs.unity3d.com/?p=2318</guid>
      <pubDate>Mon, 08 Feb 2010 19:01:43 GMT</pubDate>
    </item>
    <item>
      <title>Jonathan Pobst: Introducing Pinta</title>
      <description>Over the holiday break, I stumbled upon &lt;a href="http://www.osnews.com/story/22541/Ubuntu_Dumps_the_GIMP_Really_Needs_a_Paint_NET"&gt;this article&lt;/a&gt; from &lt;a href="http://www.osnews.com/"&gt;OSNews&lt;/a&gt; stating that there was a need for something like &lt;a href="http://getpaint.net/"&gt;Paint.NET&lt;/a&gt; for Gtk.  Having some &lt;a href="http://code.google.com/p/paint-mono/"&gt;experience&lt;/a&gt; with porting Paint.NET to Mono Winforms before, I knew that that was a massive task.  But it still got me curious about Cairo and creating a layered canvas, since I had never played with Cairo or Gtk.&lt;br /&gt;&lt;br /&gt;After playing around for a few hours, I actually had a working paintbrush and canvas. Intrigued by my success, I played around with it for a few more days.  By the end of the week I had a nifty little paint program with a few features.  Now, a month later, it's time to open my little project up to the world: &lt;a href="http://pinta-project.com/"&gt;Pinta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4IfYnHLEdnY/S271Dz-FWDI/AAAAAAAAAws/ggbXYZfr6Ns/s1600-h/ss1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://1.bp.blogspot.com/_4IfYnHLEdnY/S271Dz-FWDI/AAAAAAAAAws/ggbXYZfr6Ns/s400/ss1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5435551246121785394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pinta-project.com/"&gt;Pinta&lt;/a&gt; is a clone of Paint.NET.  It already has a small, but hopefully useful, set of features like multiple layers and infinite levels of Undo/Redo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4IfYnHLEdnY/S271EDaNbbI/AAAAAAAAAw0/uujW2M23ztA/s1600-h/ss2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_4IfYnHLEdnY/S271EDaNbbI/AAAAAAAAAw0/uujW2M23ztA/s400/ss2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5435551250266287538" /&gt;&lt;/a&gt;&lt;br /&gt;I hope to implement the same feature set as Paint.NET.  Currently there are several tools missing, as well as adjustments like brightness/contrast and levels and Paint.NET's effects.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4IfYnHLEdnY/S271EVYGlBI/AAAAAAAAAw8/BpnFg4yyf5s/s1600-h/ss3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_4IfYnHLEdnY/S271EVYGlBI/AAAAAAAAAw8/BpnFg4yyf5s/s400/ss3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5435551255089288210" /&gt;&lt;/a&gt;&lt;br /&gt;Being written in Mono/Gtk, &lt;a href="http://pinta-project.com/"&gt;Pinta&lt;/a&gt; is naturally cross-platform.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4IfYnHLEdnY/S271EkUszSI/AAAAAAAAAxE/a_IUcmMgAbg/s1600-h/ss4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 260px;" src="http://3.bp.blogspot.com/_4IfYnHLEdnY/S271EkUszSI/AAAAAAAAAxE/a_IUcmMgAbg/s400/ss4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5435551259101547810" /&gt;&lt;/a&gt;&lt;br /&gt;To download Pinta or the source code, check out the &lt;a href="http://pinta-project.com/"&gt;website&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note: I didn't misspell "Hello" in my screenshot, my dog's name is Helo.  ;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1368115163566068223-6287459795361824452?l=jpobst.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://jpobst.blogspot.com/2010/02/over-holiday-break-i-stumbled-upon-this.html</link>
      <author>Jonathan_x0020_Pobst@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1368115163566068223.post-6287459795361824452</guid>
      <pubDate>Sun, 07 Feb 2010 17:07:00 GMT</pubDate>
    </item>
    <item>
      <title>Noam Lampert: Why does Safari/Flash always crash?</title>
      <description>&lt;div&gt;On a personal note, I have started a new job at &lt;a href="http://www.kontera.com"&gt;Kontera&lt;/a&gt;, involving much more web-related development than I have ever done. I will continue posting experiences from this job I find interesting and worthy of sharing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Safari users may have noticed often crashes when visiting sites that contain Flash. I certainly have. This is not related to a specific OS - it happens both on Windows and on Mac (I personally use a Mac). I noticed this when developing a web component that includes also some Flash, and easily reproduced quite frequent crashes on Safari 4.0.4 and Flash 2010.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interestingly enough, Chrome which is based on the same engine does not have these crashes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From examining the stack of Safari (and also knowing the behavior of my flash app ;-), I think that the crash happens when Safari is trying to do something while Flash is calling JavaScript code via ExternalInterface.call(). Reducing the number of calls from Flash to JavaScript and reducing the time spent in the JavaScript calls causes the probability of a crash to be reduced dramatically. The simplest technique is to modify the JavaScript callback to wrap it in a setTimeout(...) as such:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;function foo(param1, param2) { .....} &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;should be replaced with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;function foo(param1, param2, afterTimeout) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if (!afterTimeout) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;setTimeout(function() { foo(param1, param2, true) }, 20);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.... // the original code&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The flash code does not need to be modified at all.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy hacking,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Noam&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/753968399721675468-8039104682809418662?l=noamlampert.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://noamlampert.blogspot.com/2010/02/why-does-safariflash-always-crash.html</link>
      <author>Noam_x0020_Lampert@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-753968399721675468.post-8039104682809418662</guid>
      <pubDate>Sun, 07 Feb 2010 06:07:00 GMT</pubDate>
    </item>
    <item>
      <title>Joe Audette: Form Wizard Pro 0.0.1.5 Released</title>
      <description>&lt;p&gt;
	I&amp;#39;m happy to announce the first major upgrade for my &lt;a href="http://www.mojoportal.com/form-wizard-pro-product.aspx"&gt;Form Wizard Pro product&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;
	New Features:&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;
		Support for multi page forms aka surveys&lt;/li&gt;
	&lt;li&gt;
		You can import and export complete form definitions&lt;/li&gt;
	&lt;li&gt;
		You can import and export individual questions, so if you make a state list dropdown you don&amp;#39;t have to type it again, just export it and then you can import it in a different form to re-use it.&lt;/li&gt;
	&lt;li&gt;
		Support for additional instruction blocks arranged by drag and drop among the questions&lt;/li&gt;
	&lt;li&gt;
		Support for regular expression validation&lt;/li&gt;
	&lt;li&gt;
		and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	This release is a free upgrade for existing customers who bought Form Wizard Pro previously and &lt;a href="http://www.mojoportal.com/form-wizard-pro-product.aspx"&gt;starts at $99&lt;/a&gt; for new customers.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Note:&lt;/strong&gt; This new release requires mojoPortal 2.3.3.6 which was just released a few days ago.&lt;/p&gt;
&lt;p&gt;
	See how easy it is to create custom forms and surveys using mojoPortal and Form Wizard Pro&lt;/p&gt;
&lt;p&gt;
	&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9Hu36brAs58&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;hd=1" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/9Hu36brAs58&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;hd=1" type="application/x-shockwave-flash" width="640"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Oh9w2HGBdSw&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;hd=1" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/Oh9w2HGBdSw&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;hd=1" type="application/x-shockwave-flash" width="640"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://twitter.com/joeaudette" style="color: #6297bc;"&gt;Follow us on twitter&lt;/a&gt; or&amp;nbsp;&lt;a href="http://www.facebook.com/pages/mojoPortal/146363180114" style="color: #6297bc;"&gt;become a fan on Facebook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://twitter.com/joeaudette" style="color: #6297bc;"&gt;&lt;img alt="follow us on twitter" height="60" src="http://www.mojoportal.com/Data/Sites/1/media/newsletterfiles/twitter.png" style="border: 0px initial initial;" width="60" /&gt;&lt;/a&gt; &lt;a href="http://www.facebook.com/pages/mojoPortal/146363180114" style="color: #6297bc;"&gt;&lt;img alt="become a fan on facebook" height="60" src="http://www.mojoportal.com/Data/Sites/1/media/newsletterfiles/facebook.png" style="border: 0px initial initial;" width="60" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href='http://www.mojoportal.com'&gt;Joe Audette&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.mojoportal.com/form-wizard-pro-0015-released.aspx'&gt;...&lt;/a&gt;</description>
      <link>http://feedproxy.google.com/~r/mojoportal/~3/suU06jNAFyU/form-wizard-pro-0015-released.aspx</link>
      <author>Joe_x0020_Audette@monologue.go-mono.com</author>
      <pubDate>Sat, 06 Feb 2010 17:51:13 GMT</pubDate>
    </item>
    <item>
      <title>C.J. Adams-Collier: PPA installation on karmic</title>
      <description>&lt;p&gt;I don&amp;#8217;t know how long add-apt-repository has been around, but I&amp;#8217;ve found it very useful for installing some of the bleeding edge stuff I want to test:&lt;/p&gt;
&lt;pre&gt;
$ for ppa in do-core team-xbmc nvidia-vdpau chromium-daily directhex/monoxide
do
  sudo add-apt-repository ppa:$ppa
done
$ apt-get update
$ apt-get install chromium-browser nvidia-glx-195 gnome-do xbmc monodevelop
&lt;/pre&gt;
&lt;p&gt;Is there anything like this for debian proper, I wonder?&lt;/p&gt;
&lt;div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"&gt;&lt;script&gt;//&lt;![CDATA[
reddit_url="http://wp.colliertech.org/cj/?p=728";
//]]&amp;gt;
&lt;/script&gt;&lt;script language="javascript" src="http://reddit.com/button.js?t=1"&gt;&lt;/script&gt;&lt;/div&gt;</description>
      <link>http://wp.colliertech.org/cj/?p=728</link>
      <category>C.J. Insider</category>
      <category>Free Software</category>
      <category>Software</category>
      <category>Washington State Ubuntu LoCo</category>
      <category>debian</category>
      <category>mono</category>
      <category>ubuntu</category>
      <author>C.J._x0020_Adams-Collier@monologue.go-mono.com</author>
      <comments>http://wp.colliertech.org/cj/?p=728#comments</comments>
      <guid isPermaLink="false">http://wp.colliertech.org/cj/?p=728</guid>
      <pubDate>Sat, 06 Feb 2010 03:20:03 GMT</pubDate>
    </item>
    <item>
      <title>Bertrand Lorentz: A Mirage made of music</title>
      <description>Mirage 0.6 is now available, bringing interesting new features and bug fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hop.at/mirage/"&gt;Mirage&lt;/a&gt; is an extension for &lt;a href="http://banshee-project.org/"&gt;Banshee&lt;/a&gt;, the media player you all know and love. It analyzes all the songs in your music library and is then able to evaluate the similarity between any particular songs, just by looking at the acoustic signal.&lt;br /&gt;&lt;br /&gt;Mirage was originally created by &lt;a href="http://www.schnitzer.at/dominik"&gt;Dominik Schnitzer&lt;/a&gt; as a part of his master thesis (&lt;i&gt;Mirage - High-Performance Music Similarity Computation and Automatic Playlist Generation&lt;/i&gt;, &lt;a href="http://hop.at/mirage/mirage.pdf"&gt;pdf&lt;/a&gt;). I won't even try to pretend that I understand half of what is going on during the acoustic analysis and the similarity calculations, but I can tell you that there are matrices and Fourier transforms, amongst others.&lt;br /&gt;&lt;br /&gt;Analyzing a song shouldn't take more than a few seconds, but of course if you have a music library with several thousand tracks, those seconds can add up to become quite a while. The good thing is that you can stop the analysis at any time, restart later, and Mirage only analyzes tracks that were not already processed.&lt;br /&gt;&lt;br /&gt;When the analysis is finished, you can then select one or several tracks, drag-n-drop them to the "Playlist Generator" source and Mirage will automatically create a playlist of similar songs. The playlist will be refreshed automatically and will adapt itself as you listen to the songs or skip them.&lt;br /&gt;&lt;br /&gt;This release introduces a new and experimental "duplicate search" feature : go to "Tools &amp;gt; Mirage Playlist Generator" and select "Duplicate Search". Mirage will then go through your whole music library and if any two tracks are very similar to each other, they will be added to a "Mirage Duplicates" playlist.&lt;br /&gt;&lt;br /&gt;So go ahead and &lt;a href="http://hop.at/mirage/"&gt;try it&lt;/a&gt; !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30299148-8758514833421666917?l=bl-log.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://bl-log.blogspot.com/2010/02/mirage-made-of-music.html</link>
      <category domain="http://www.blogger.com/atom/ns#">mirage Banshee</category>
      <author>Bertrand_x0020_Lorentz@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-30299148.post-8758514833421666917</guid>
      <pubDate>Thu, 04 Feb 2010 16:31:00 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: Moonlight 3.0 Preview 1</title>
      <description>
	&lt;p&gt;&lt;img src="http://tirania.org/shots/091216105809ogrOjh.png"
	align="right" width="320"&gt;We have just released
	our &lt;a href="http://go-mono.com/moonlight/prerelease.aspx"&gt;first
	preview of Moonlight 3.0&lt;/a&gt;.

	&lt;p&gt;This release contains many updates to our 3.0 support,
	mostly on the infrastructure level necessary to support the
	rest of the features.

	&lt;p&gt;In the release:

	&lt;ul&gt;
		&lt;li&gt;MP4 demuxer support.   The demuxer is in place but
		there are no codecs for it yet (unless you build from
		source code and configure Moonlight to pick up the
		codecs from ffmpeg).

		&lt;li&gt;Initial work on UI Virtualization.

		&lt;li&gt;Platform Abstraction Layer: the Moonlight core is
		now separated from the windowing system engine.   This
		should make it possible for developers to port
		Moonligh to other windowing/graphics systems that are
		not X11/Gtk+ centric.

		&lt;li&gt;The new
		3.0 &lt;a href="http://msdn.microsoft.com/en-us/library/cc189022(VS.95).aspx"&gt;Binding/BindingExpression&lt;/a&gt;
		support is in.
		
		&lt;li&gt;Many updates to the 3.0 APIs
	&lt;/ul&gt;

	&lt;p&gt;The above is in addition to some of the Silverlight
	3.0 &lt;a href="http://tirania.org/blog/archive/2009/Dec-17.html"&gt;features
	that we shipped with Moonlight 2.0&lt;/a&gt;.

	&lt;p&gt;For the adventurous among you, our SVN version of Moonlight
	contains David Reveman's pixel shader support:

	&lt;center&gt;
	&lt;img src="http://tirania.org/shots/1002031057QyMmY5BV.png"&gt;
	&lt;p&gt;
	From &lt;a href"http://kodierer.blogspot.com/2009/07/livin-on-edge-silverlight-parametric_4324.html"&gt;Silverlight
	Parametric Pixel Shader&lt;/a&gt;.
	&lt;/center&gt;
</description>
      <link>http://tirania.org/blog/archive/2010/Feb-03.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Feb-03.html</guid>
      <pubDate>Wed, 03 Feb 2010 21:18:00 GMT</pubDate>
    </item>
    <item>
      <title>Joe Audette: mojoPortal 2.3.3.6 Released</title>
      <description>&lt;p&gt;
	I&amp;#39;m happy to announce the release of &lt;a href="http://www.mojoportal.com/"&gt;mojoPortal&lt;/a&gt; 2.3.3.6, available now on our &lt;a href="http://www.mojoportal.com/download.aspx"&gt;download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	This release fixes a few bugs reported in our forums since the last release, adds a few minor improvements to some features and lots of minor fit and finish improvements based on feedback from our community.&lt;/p&gt;
&lt;p&gt;
	In the previous release I added a &lt;a href="http://www.mojoportal.com/creating-an-admin-toolbar.aspx"&gt;hideable toolbar for administration links&lt;/a&gt; in most of the included skins, this release I &lt;a href="http://i7media.net/skinning-the-mojoportal-admin-toolbar"&gt;took a queue from Joe Davis&lt;/a&gt; and added icons to the toolbar. Also based on community feedback, I made it remember your preference for open/closed across pages. Previously if you closed it and went to a different page it would open again on the new page, now it remembers your preference.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="toolbar with icons" src="http://www.mojoportal.com/Data/Sites/1/media/toolbarwithicons.png" style="width: 640px; height: 33px; " /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Contact Form - added a setting for BCC email, added a setting in case you don&amp;#39;t want to store messages in the database, added a setting allowing you to use the email address entered by the user as the from address in the form notification.&lt;/p&gt;
&lt;p&gt;
	Shared Files - added a setting for the Default Sort, when shared files are returned as search results in the search page, the download link now opens a new window.&lt;/p&gt;
&lt;p&gt;
	Upgrade to &lt;a href="http://www.brettle.com/neatupload"&gt;NeatUpload&lt;/a&gt; 1.3.21&lt;/p&gt;
&lt;h3&gt;
	Updated Translations&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;
		Italian - thanks Diego Mora&lt;/li&gt;
	&lt;li&gt;
		Greek - thanks Yioryos Moschovakis&lt;/li&gt;
	&lt;li&gt;
		Russian - thanks Alexander (aka SkySandy)&lt;/li&gt;
	&lt;li&gt;
		Turkish - thanks to Cenk Kumas&lt;/li&gt;
	&lt;li&gt;
		Swedish - thanks to Par Rohlin&lt;/li&gt;
	&lt;li&gt;
		Spanish - thanks to Matias Molleja&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
	Your Opinion Requested&lt;/h3&gt;
&lt;p&gt;
	I am currently using &lt;a href="http://ckeditor.com/"&gt;CKeditor&lt;/a&gt; as my main editor and it is also now the default for new installations of mojoPortal. The only thing I like better about &lt;a href="http://tinymce.moxiecode.com/"&gt;TinyMCE&lt;/a&gt; at the moment is the spell checker which works much nicer than the one in CKeditor or FCKeditor. Since CKeditor is the successor to FCKeditor and no new development is being done on FCKeditor, I&amp;#39;m considering not including FCKeditor in mojoPortal going forward to reduce our footprint on disk a little as each editor is a lot of javascript. We could reduce 3 or 4 MB of disk footprint leaving it out. I could still make it available as a separate download for anyone who wants to continue using it. So, if you have a strong opinion about whether we should or should not continue to package FCKeditor with mojoPortal, please post in the comments.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://twitter.com/joeaudette" style="color: #6297bc;"&gt;Follow us on twitter&lt;/a&gt; or&amp;nbsp;&lt;a href="http://www.facebook.com/pages/mojoPortal/146363180114" style="color: #6297bc;"&gt;become a fan on Facebook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://twitter.com/joeaudette" style="color: #6297bc;"&gt;&lt;img alt="follow us on twitter" height="60" src="http://www.mojoportal.com/Data/Sites/1/media/newsletterfiles/twitter.png" style="border: 0px initial initial;" width="60" /&gt;&lt;/a&gt; &lt;a href="http://www.facebook.com/pages/mojoPortal/146363180114" style="color: #6297bc;"&gt;&lt;img alt="become a fan on facebook" height="60" src="http://www.mojoportal.com/Data/Sites/1/media/newsletterfiles/facebook.png" style="border: 0px initial initial;" width="60" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;a href='http://www.mojoportal.com'&gt;Joe Audette&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.mojoportal.com/mojoportal-2336-released.aspx'&gt;...&lt;/a&gt;</description>
      <link>http://feedproxy.google.com/~r/mojoportal/~3/WJig25n6EXg/mojoportal-2336-released.aspx</link>
      <author>Joe_x0020_Audette@monologue.go-mono.com</author>
      <pubDate>Wed, 03 Feb 2010 18:32:00 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: Mono at FOSDEM</title>
      <description>
	&lt;p&gt;I will be arriving in Brussels on Saturday Morning for the
	FOSDEM conference.  We have
	an &lt;a href="http://fosdem.org/2010/schedule/devrooms/mono"&gt;activity-packed
	day&lt;/a&gt; on Sunday of all-things-mono.

	&lt;p&gt;This is the current schedule, pretty awesome!

&lt;div class="section" id="track"&gt; 
 &lt;table class="track-index"&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th class="event-time"&gt;When&lt;/th&gt; 
    &lt;th class="event"&gt;Event&lt;/th&gt; 
    &lt;th class="speaker"&gt;Speaker&lt;/th&gt; 
    &lt;th class="event-media"&gt;Media&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td colspan="3" class="schedule-day"&gt;Sunday 2010-02-07&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;09:00-09:15    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_opening"&gt;Opening&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/stephane+delcroix"&gt;Stéphane Delcroix&lt;/a&gt;, &lt;a href="http://fosdem.org/2010/schedule/speakers/ruben+vermeersch"&gt;Ruben Vermeersch&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;09:15-10:00    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_develop"&gt;MonoDevelop&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/lluis+sanchez+gual"&gt;Lluis Sanchez Gual&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;10:00-11:00    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_ruby"&gt;The Ruby and .NET love child&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/ivan+porto+carrero"&gt;Ivan Porto Carrero&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;11:00-12:00    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_edge"&gt;Mono Edge&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/miguel+de+icaza"&gt;Miguel de Icaza&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;12:45-13:15    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_monotorrent"&gt;The evolution of MonoTorrent&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/alan+mcgovern"&gt;Alan McGovern&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;13:15-13:45    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_simd"&gt;Image processing with Mono.Simd&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/stephane+delcroix"&gt;Stéphane Delcroix&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;13:45-14:15    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_parallelfx"&gt;ParallelFx, bringing Mono applications in the multicore era&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/jeremie+laval"&gt;Jérémie Laval&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;14:30-15:30    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_second_life"&gt;Building The Virtual Babel: Mono In Second Life&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/jim+purbrick"&gt;Jim Purbrick&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;15:30-16:00    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_moonlight"&gt;Moonlight and you&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/andreia+gaita"&gt;Andreia Gaita&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;16:00-16:30    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_osctool"&gt;OSCTool - learning C# and Mono by doing&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/jo+shields"&gt;Jo Shields&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="even"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;16:30-16:45    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_smuxi"&gt;Smuxi - IRC in a modern environment&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/mirco+bauer"&gt;Mirco Bauer&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr class="odd"&gt; 
    &lt;td class="event-timespec"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/day/sunday"&gt;Sun&lt;/a&gt; 
&amp;nbsp;16:45-17:00    &lt;/td&gt; 
    &lt;td class="event"&gt; 
     &lt;a href="http://fosdem.org/2010/schedule/events/mono_closing"&gt;Closing&lt;/a&gt; 
    &lt;/td&gt; 
    &lt;td class="speaker devroomtrack-speaker"&gt; 
&lt;a href="http://fosdem.org/2010/schedule/speakers/stephane+delcroix"&gt;Stéphane Delcroix&lt;/a&gt;, &lt;a href="http://fosdem.org/2010/schedule/speakers/ruben+vermeersch"&gt;Ruben Vermeersch&lt;/a&gt;    &lt;/td&gt; 
    &lt;td class="event-media"&gt; 
    &lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/div&gt;

	&lt;p&gt;&lt;b&gt;Feedback requested:&lt;/b&gt; My plan is to do a
	state-of-the-union kind of presentation on Mono, but if you
	have a specific topic that you would like me to present on,
	please leave a comment, I will try to prepare for that.

	&lt;p&gt;See you in Brussels!
</description>
      <link>http://tirania.org/blog/archive/2010/Feb-02.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Feb-02.html</guid>
      <pubDate>Wed, 03 Feb 2010 04:59:00 GMT</pubDate>
    </item>
    <item>
      <title>Andreia Gaita: Solving the gcc 4.4 strict aliasing problems</title>
      <description>&lt;p&gt;A couple of days ago Jeff Stedfast &lt;a href="http://jeffreystedfast.blogspot.com/2010/01/weird-bugs-due-to-gcc-44-and-strict.html"&gt;ran into some problems&lt;/a&gt; with gcc 4.4, strict aliasing and optimizations. Being a geeky sort of person, I found the problem really interesting, not only because it shows just how hard it is to write a good, clear standard, even when you're dealing with highly technical (and supposedly unambiguous) language, but also because I never did "get" the aliasing rules, so it was a nice excuse to read up on the subject.&lt;/p&gt;&lt;p&gt;Basically, the standard says that you can't do this:&lt;/p&gt;&lt;p&gt;&lt;code&gt;int a = 0x12345678;&lt;br /&gt;short *b = (short *)&amp;a;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;I'm forcing a cast here, and since the types are not compatible, they can't be "alias" of each other, and therefore I'm breaking strict-aliasing rules. Note that if you compile this with -O2 -Wall, it will *not* warn you that you're breaking the rules, even though -O2 activates -fstrict-aliasing and -Wall is supposed to complain about everything (right??). Apparently, this is &lt;a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42908"&gt;by design&lt;/a&gt;, though why would anyone not want warnings in -Wall for something that will obviously break code is beyond me. If you want to be told that you're not playing by the rules, make sure you build with -Wstrict-aliasing=2, which will say:&lt;/p&gt;&lt;p&gt;&lt;code&gt;line 2 - warning: dereferencing type-punned pointer will break strict-aliasing rules&lt;/code&gt;&lt;/p&gt;&lt;p&gt;So now you know you're being naughty. Of course, if you did try to access the variable, even just with -Wall it will complain at you - this more complete snippet will give you several warnings with -Wall:&lt;/p&gt;&lt;p&gt;&lt;code&gt;int a = 0x12345678;&lt;br /&gt;short *b = (short *)&amp;a;&lt;br /&gt;b[1] = 0;&lt;br /&gt;if (a == 0x12345678)&lt;br /&gt;  printf ("error\n");&lt;br /&gt;else&lt;br /&gt;  printf ("good\n");&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;line 3 - warning: dereferencing pointer ?({anonymous})? does break strict-aliasing rules&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The problem gets ugly when you're dealing with structs and pointers to them - then -Wall is completely silent about possible issues, and only -Wstrict-aliasing=2 will work, like in this little snippet:&lt;/p&gt;&lt;p&gt;&lt;code&gt;typedef struct type {&lt;br /&gt;  struct type *next;&lt;br /&gt;  int val;&lt;br /&gt;} Type;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;...&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Type *t1, *t2, *t3;&lt;br /&gt;t1 = t2 = NULL;&lt;br /&gt;t1 = (Type*) &amp;t2;&lt;br /&gt;int i;&lt;br /&gt;for (i = 0; i &lt; 2; i++) {&lt;br /&gt;  t3 = malloc (sizeof (Type));&lt;br /&gt;  t1-&gt;next = t3;&lt;br /&gt;  t1 = t3;&lt;br /&gt;}&lt;br /&gt;if (!t2)&lt;br /&gt;  printf ("error\n");&lt;br /&gt;else&lt;br /&gt;  printf ("good\n");&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This doesn't emit any warnings on -Wall because the loop makes it slightly fuzzy for gcc to tell whether things are getting assigned or not. -O2 will optimize away the assignment to t1 on line 3, which will make things not work later on.&lt;/p&gt;&lt;p&gt;So how to fix this? The attribute &lt;em&gt;may_alias&lt;/em&gt; allows a type to bypass the aliasing rules, just like character types do (character types are allowed to alias any other type, according to the c99 standard). Changing the definition of Type to the following will make the compiler happy:&lt;/p&gt;&lt;p&gt;&lt;code&gt;typedef struct type {&lt;br /&gt;  struct type *next;&lt;br /&gt;  int val;&lt;br /&gt;} &lt;b&gt;__attribute__((__may_alias__))&lt;/b&gt; Type;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;One final note: if you mix up code with aliased types and non-aliased types, gcc will not enforce aliasing optimizations on your non-aliased-possibly-broken code... i.e., if you define this type two times, one with the attribute, one without, and then do the loop above with both types (separately mind you, with separate variables, the code just happens to be in the same method), the non-aliased type won't fail. Aren't optimizations fun?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; People have pointed out that the first statement &lt;i&gt;short *b = (short *)&amp;a;&lt;/i&gt; is totally legal and has nothing to do with aliasing.&lt;/p&gt;&lt;p&gt;Yes, that's true, I should have been more precise. The statement is perfectly legal. It's when you try to access the data via the pointer that was assigned on that line that breaks the standard. So when your code blows up, it blows up accessing the data, but that's not the cause, that's the consequence. The cause of said explosion is that optimizations + strict-aliasing look at that (totally legal) statement and say "oh, dude, come on, this is bogus" and throw it away while munching on scooby snacks. Well, not sure about that last part.&lt;/p&gt;&lt;p&gt;Anyways, where was I? Oh yes, so, two things: if you don't want to change your code, you can use may_alias , gcc will say "that's so awesome" and everyone will make merry. Or something. The second thing is, and let me add a little emphasis to this part, because I'm sometimes a bit too subtle, and apparently some things should be said *very clearly*: when a statement is perfectly legal, and yet it IS removed via a combination of default flags with NO warnings whatsoever, something is WRONG, and in my opinion, the problem here is lack of warnings.&lt;/p&gt;&lt;p&gt;And that, as someone said, is that. Or not, whatever tickles your fancy. Hmmmm, tickles...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14338506-1521577249043423262?l=blog.worldofcoding.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://blog.worldofcoding.com/2010/02/solving-gcc-44-strict-aliasing-problems.html</link>
      <category domain="http://www.blogger.com/atom/ns#">c++</category>
      <category domain="http://www.blogger.com/atom/ns#">bugs</category>
      <category domain="http://www.blogger.com/atom/ns#">c</category>
      <category domain="http://www.blogger.com/atom/ns#">hacking</category>
      <category domain="http://www.blogger.com/atom/ns#">coding</category>
      <author>Andreia_x0020_Gaita@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-14338506.post-1521577249043423262</guid>
      <pubDate>Tue, 02 Feb 2010 23:55:00 GMT</pubDate>
    </item>
    <item>
      <title>Unity Technologies: Unity and Mobile pt. 2 : The iPad Cometh</title>
      <description>Ok, so the iPad is now officially old news. Let me get something out of the way, first: yes, we will support it. Yes, we are aiming for 0-day support. If we get there or not basically depends whether on if Apple can get us early access to the device.
With that out of the way, [...]</description>
      <link>http://blogs.unity3d.com/2010/02/01/unity-and-mobile-pt-2-the-ipad-cometh/</link>
      <category>Rants &amp; Raves</category>
      <author>Unity_x0020_Technologies@monologue.go-mono.com</author>
      <comments>http://blogs.unity3d.com/2010/02/01/unity-and-mobile-pt-2-the-ipad-cometh/#comments</comments>
      <guid isPermaLink="false">http://blogs.unity3d.com/?p=2267</guid>
      <pubDate>Mon, 01 Feb 2010 21:20:18 GMT</pubDate>
    </item>
    <item>
      <title>Ben Maurer: Juxtapositions</title>
      <description>&lt;p&gt;From time to time, reCAPTCHA will give users odd juxtapositions of words. I got quite a kick out of seeing this one:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i.somethingawful.com/u/garbageday/photoshop_phriday/2010_01_29/Esplanade_01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px; height: 657px;" src="http://i.somethingawful.com/u/garbageday/photoshop_phriday/2010_01_29/Esplanade_01.jpg" border="0" alt="" /&gt;&lt;/a&gt;

&lt;p&gt;I think this would make a great show!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-859533352966003584?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://bmaurer.blogspot.com/2010/02/juxtapositions.html</link>
      <author>Ben_x0020_Maurer@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-14650593.post-859533352966003584</guid>
      <pubDate>Mon, 01 Feb 2010 18:30:05 GMT</pubDate>
    </item>
    <item>
      <title>Unity Technologies: Granny Theft Tofu</title>
      <description>This past weekend was the Global Game Jam, where teams from all around the world worked tirelessly to create amazing games in a single weekend. Here in Copenhagen, the local branch of the Global Game Jam is the Nordic Game Jam that was held at the IT University of Copenhagen. The cool things about the [...]</description>
      <link>http://blogs.unity3d.com/2010/02/01/granny-theft-tofu/</link>
      <category>Rants &amp; Raves</category>
      <author>Unity_x0020_Technologies@monologue.go-mono.com</author>
      <comments>http://blogs.unity3d.com/2010/02/01/granny-theft-tofu/#comments</comments>
      <guid isPermaLink="false">http://blogs.unity3d.com/?p=2280</guid>
      <pubDate>Mon, 01 Feb 2010 14:28:02 GMT</pubDate>
    </item>
    <item>
      <title>Michael Hutchinson: Iterator-based Microthreading</title>
      <description>&lt;p&gt;Back in May, I was wrapping PhyreEngine and porting the samples to C#. To extend one of them and demonstrate some of the capabilities of C#, &lt;a href="http://tirania.org/blog/"&gt;Miguel&lt;/a&gt; and I decided to use simple iterator-based microthreading, which simulates multithreading but with many microthreads within a single real thread. &lt;a href="http://unity3d.com/"&gt;Unity&lt;/a&gt; does something like it in their game engine too. It enables you to use a very imperative style of coding, as if using a single dedicated thread for each, but without anywhere near the overhead of real threads.&lt;/p&gt;
&lt;p&gt;Here's the usage example we came up initially with that drove my design of the microthread scheduler:&lt;br /&gt;
&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; Enemy1
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Init &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Scheduler scheduler&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		scheduler.&lt;span style="color: #0000FF;"&gt;AddTask&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Patrol &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	IEnumerable Patrol &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;while&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;alive&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;CanSeeTarget &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				yield &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; Attack &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;InReloadStation&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				Signal signal &lt;span style="color: #008000;"&gt;=&lt;/span&gt; AnimateReload &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				yield &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; signal&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				MoveTowardsNextWayPoint &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				yield &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; TimeSpan.&lt;span style="color: #0000FF;"&gt;FromSeconds&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
		yield break&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	IEnumerable Attack &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;while&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TargetAlive &lt;span style="color: #008000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; CanSeeTarget &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			AimAtTarget &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			Fire &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			yield &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; TimeSpan.&lt;span style="color: #0000FF;"&gt;FromSeconds&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The concept is fairly simple. The C# compiler magically transforms this code into an &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerator&lt;/code&gt;&lt;/span&gt; state machine (returned by &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerable.GetEnumerator()&lt;/code&gt;&lt;/span&gt;). Each time &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerator.MoveNext()&lt;/code&gt;&lt;/span&gt; is called, your method "iterates": it runs to the next yield statement, sets the Current property to the value yielded, and keeps enough state that next time it iterates, it can effectively resume where it left off. We can yield nulls to give other microthreads a chance to run, or yield objects to tell the scheduler other things. For example, yielding a &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;TimeSpan&lt;/code&gt;&lt;/span&gt; could cause the microthread to sleep for that long.&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #FF0000;"&gt;interface&lt;/span&gt; IEnumerator
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt; MoveNext &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #FF0000;"&gt;object&lt;/span&gt; Current&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;As you can see, although C# iterators are primarily intended for iterating through collections, the &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;yield&lt;/code&gt;&lt;/span&gt; keyword can also become effectively something like a microthread cooperatively yielding. Your method runs until it yields, then it later resumes from this point, runs to the next yield, and so on.&lt;/p&gt;
&lt;p&gt;The class that enumerates your iterator is the scheduler. Before we get to that, we'll cover the boring bits to set some groundwork. First, we need a class to encapsulate the task. This holds hold the &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerator&lt;/code&gt;&lt;/span&gt; and which &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Scheduler&lt;/code&gt;&lt;/span&gt; it belongs to, is a singly linked list node, and has a field for arbitrary data we'll use later.&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #008080; font-style: italic;"&gt;//tasks may move between lists but they may only be in one list at a time&lt;/span&gt;
&lt;span style="color: #0600FF;"&gt;internal&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; TaskItem
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;readonly&lt;/span&gt; IEnumerator Task&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem Next&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; Scheduler Scheduler&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;long&lt;/span&gt; Data&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;IEnumerator task, Scheduler scheduler&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Task&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Scheduler&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; scheduler&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Next we need a simple linked list for keeping lists of &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;TaskItem&lt;/code&gt;&lt;/span&gt;. We're not using &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;LinkedList&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/span&gt;; this is much simpler, does only what we need, and makes it easy to move tasks between lists and remove them via the enumerator.&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;internal&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;sealed&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; TaskList
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;readonly&lt;/span&gt; Scheduler Scheduler&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem First &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt; get&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;private&lt;/span&gt; set&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem Last &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt; get&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;private&lt;/span&gt; set&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskList &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Scheduler scheduler&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Scheduler&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; scheduler&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Append &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskItem task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;First &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Last &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			First &lt;span style="color: #008000;"&gt;=&lt;/span&gt; Last &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Last.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			Last.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			Last &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Remove &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskItem task, TaskItem previous&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;previous &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task &lt;span style="color: #008000;"&gt;==&lt;/span&gt; First&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			First &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;previous.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;==&lt;/span&gt; task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			previous.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; task.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Last &lt;span style="color: #008000;"&gt;==&lt;/span&gt; task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			Last &lt;span style="color: #008000;"&gt;=&lt;/span&gt; previous&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
		task.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; null&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskEnumerator GetEnumerator &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; TaskEnumerator &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;sealed&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; TaskEnumerator
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		TaskList list&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		TaskItem current, previous&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskEnumerator &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskList list&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;list&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; list&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			previous &lt;span style="color: #008000;"&gt;=&lt;/span&gt; current &lt;span style="color: #008000;"&gt;=&lt;/span&gt; null&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem Current &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt; get &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; current&lt;span style="color: #008000;"&gt;;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt; MoveNext &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			TaskItem next&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;current &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;previous &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
					next &lt;span style="color: #008000;"&gt;=&lt;/span&gt; list.&lt;span style="color: #0000FF;"&gt;First&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;else&lt;/span&gt;
					next &lt;span style="color: #008000;"&gt;=&lt;/span&gt; previous.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				next &lt;span style="color: #008000;"&gt;=&lt;/span&gt; current.&lt;span style="color: #0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;next &lt;span style="color: #008000;"&gt;!=&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;current &lt;span style="color: #008000;"&gt;!=&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
					previous &lt;span style="color: #008000;"&gt;=&lt;/span&gt; Current&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				current &lt;span style="color: #008000;"&gt;=&lt;/span&gt; next&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; true&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; false&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; MoveCurrentToList &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskList otherList&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			otherList.&lt;span style="color: #0000FF;"&gt;Append&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;RemoveCurrent &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; TaskItem RemoveCurrent &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			Debug.&lt;span style="color: #0000FF;"&gt;Assert&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;current &lt;span style="color: #008000;"&gt;!=&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			TaskItem ret &lt;span style="color: #008000;"&gt;=&lt;/span&gt; current&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			list.&lt;span style="color: #0000FF;"&gt;Remove&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;current, previous&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			current &lt;span style="color: #008000;"&gt;=&lt;/span&gt; null&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;return&lt;/span&gt; ret&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Now we can implement the scheduler. Using the scheduler is very simple. You register tasks with &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;RegisterTask(IEnumerable)&lt;/code&gt;&lt;/span&gt;, then call &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Run()&lt;/code&gt;&lt;/span&gt; to run all the active tasks for one yield iteration each. It handles sleeping and waking up tasks and removing tasks once they're finished.&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;sealed&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; Scheduler
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	TaskList active, sleeping&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; Scheduler &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		active &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; TaskList &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		sleeping &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; TaskList &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; AddTask &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;IEnumerator task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		active.&lt;span style="color: #0000FF;"&gt;Append&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #008000;"&gt;new&lt;/span&gt; TaskItem &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task, &lt;span style="color: #0600FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Run &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #008080; font-style: italic;"&gt;//cache this, it's expensive to access DateTime.Now&lt;/span&gt;
		&lt;span style="color: #FF0000;"&gt;long&lt;/span&gt; nowTicks &lt;span style="color: #008000;"&gt;=&lt;/span&gt; DateTime.&lt;span style="color: #0000FF;"&gt;Now&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Ticks&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #008080; font-style: italic;"&gt;//move woken tasks back into the active list&lt;/span&gt;
		var en &lt;span style="color: #008000;"&gt;=&lt;/span&gt;  sleeping.&lt;span style="color: #0000FF;"&gt;GetEnumerator&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;while&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;en.&lt;span style="color: #0000FF;"&gt;MoveNext&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;en.&lt;span style="color: #0000FF;"&gt;Current&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt; nowTicks&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
				en.&lt;span style="color: #0000FF;"&gt;MoveCurrentToList&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;active&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
		&lt;span style="color: #008080; font-style: italic;"&gt;//run all the active tasks&lt;/span&gt;
		en &lt;span style="color: #008000;"&gt;=&lt;/span&gt; active.&lt;span style="color: #0000FF;"&gt;GetEnumerator&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;while&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;en.&lt;span style="color: #0000FF;"&gt;MoveNext&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
			&lt;span style="color: #008080; font-style: italic;"&gt;//run each task's enumerator for one yield iteration&lt;/span&gt;
			IEnumerator t &lt;span style="color: #008000;"&gt;=&lt;/span&gt; en.&lt;span style="color: #0000FF;"&gt;Current&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Task&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #008000;"&gt;!&lt;/span&gt;t.&lt;span style="color: #0000FF;"&gt;MoveNext&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #008080; font-style: italic;"&gt;//it finished, so remove it&lt;/span&gt;
				en.&lt;span style="color: #0000FF;"&gt;RemoveCurrent&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				continue&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
			&lt;span style="color: #008080; font-style: italic;"&gt;//check the current state&lt;/span&gt;
			&lt;span style="color: #FF0000;"&gt;object&lt;/span&gt; state &lt;span style="color: #008000;"&gt;=&lt;/span&gt; t.&lt;span style="color: #0000FF;"&gt;Current&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;state &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #008080; font-style: italic;"&gt;//it's just cooperatively yielding, state unchanged &lt;/span&gt;
				continue&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt;  &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;state &lt;span style="color: #008000;"&gt;is&lt;/span&gt; TimeSpan&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #008080; font-style: italic;"&gt;//it wants to sleep, move to the sleeping list. we use the Data property for the wakeup time &lt;/span&gt;
				en.&lt;span style="color: #0000FF;"&gt;Current&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; nowTicks &lt;span style="color: #008000;"&gt;+&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TimeSpan&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;state&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Ticks&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
				en.&lt;span style="color: #0000FF;"&gt;MoveCurrentToList&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;sleeping&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;state &lt;span style="color: #008000;"&gt;is&lt;/span&gt; IEnumerable&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;throw&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; NotImplementedException &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;Nested tasks are not supported yet&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
				&lt;span style="color: #0600FF;"&gt;throw&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; InvalidOperationException &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;Unknown task state returned:&amp;quot;&lt;/span&gt; &lt;span style="color: #008000;"&gt;+&lt;/span&gt; state.&lt;span style="color: #0000FF;"&gt;GetType&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;FullName&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
			&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; 
		&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;internal&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; AddToActive &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskItem task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		active.&lt;span style="color: #0000FF;"&gt;Append&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;At this point, it looks fairly useful, but let's add a simple synchronization primitive too. Microthreads should never make long blocking calls because they can't be pre-empted. Instead, we're going to let the microthread obtain and yield a signal object,  which means it will not be scheduled until the signal has been set. Instead of using blocking APIs, you can use async APIs, create a signal object, wait on that, and have the callback set the signal. Or, thinking back to the initial game example, some game object's controlling microthread might want to sleep until another game object reaches a certain state; the target object can keep a signal accessible via a property that microthreads can read and wait on.&lt;/p&gt;
&lt;p&gt;A thread can wait for more that one signal, and more than one thread can wait for a signal. Essentially we're going to have an equivalent of .NET's &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;AutoResetEvent&lt;/code&gt;&lt;/span&gt; and &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;WaitHandle.WaitAll(WaiHandle[])&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The signal's job is to keep a list of all the tasks that are waiting for it. When tasks start waiting, they move out of the scheduler's lists and are tracked by all the signals instead. Each signal increments/decrements the task's &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Data&lt;/code&gt;&lt;/span&gt; property to keep track of how many signals the task is waiting for. When the count reaches zero, the task can be moved back to the scheduler.&lt;br /&gt;
&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;class&lt;/span&gt; Signal
&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;static&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;int&lt;/span&gt; nextId &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;int&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;MinValue&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #FF0000;"&gt;int&lt;/span&gt; id &lt;span style="color: #008000;"&gt;=&lt;/span&gt; nextId&lt;span style="color: #008000;"&gt;++;&lt;/span&gt;
	List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;TaskItem&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; tasks &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;new&lt;/span&gt; List&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;TaskItem&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #FF0000;"&gt;bool&lt;/span&gt; isSet &lt;span style="color: #008000;"&gt;=&lt;/span&gt; true&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;public&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Set &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;isSet&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
			return&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		isSet &lt;span style="color: #008000;"&gt;=&lt;/span&gt; true&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #008080; font-style: italic;"&gt;//decrement the wait count of all tasks waiting for thsi signal&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;foreach&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskItem task &lt;span style="color: #0600FF;"&gt;in&lt;/span&gt; tasks&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
			&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&lt;/span&gt;task.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt; &lt;span style="color: #008000;"&gt;==&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
				&lt;span style="color: #008080; font-style: italic;"&gt;//if the wait count is zero, the task isn't waiting for any more signals, so re-schedule it&lt;/span&gt;
				task.&lt;span style="color: #0000FF;"&gt;Scheduler&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;AddToActive&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		tasks.&lt;span style="color: #0000FF;"&gt;Clear&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #0600FF;"&gt;internal&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;void&lt;/span&gt; Add &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;TaskItem task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #008080; font-style: italic;"&gt;//signal only becomes unset when it has tasks&lt;/span&gt;
		&lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;isSet&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
			isSet &lt;span style="color: #008000;"&gt;=&lt;/span&gt; false&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #008080; font-style: italic;"&gt;//the signal keeps a list of tasks that are waiting for it&lt;/span&gt;
		tasks.&lt;span style="color: #0000FF;"&gt;Add&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
		&lt;span style="color: #008080; font-style: italic;"&gt;//use the task's data for tracking the number of signals it's still waiting for&lt;/span&gt;
		task.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt;&lt;span style="color: #008000;"&gt;++;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;And we need to add a couple more checks to the &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Scheduler.Run()&lt;/code&gt;&lt;/span&gt; state handling, so that when the task returns a signal or collection/array of signals, it's moved from the scheduler's lists to the tasks' lists.&lt;br /&gt;
&lt;div class="geshifilter"&gt;&lt;pre class="csharp geshifilter-csharp" style="font-family:monospace;"&gt;&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;state &lt;span style="color: #008000;"&gt;is&lt;/span&gt; Signal&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	TaskItem task &lt;span style="color: #008000;"&gt;=&lt;/span&gt; en.&lt;span style="color: #0000FF;"&gt;RemoveCurrent&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	task.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;0&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Signal&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;state&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #0000FF;"&gt;Add&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;else&lt;/span&gt; &lt;span style="color: #0600FF;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;state &lt;span style="color: #008000;"&gt;is&lt;/span&gt; ICollection&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Signal&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;
	TaskItem task &lt;span style="color: #008000;"&gt;=&lt;/span&gt; en.&lt;span style="color: #0000FF;"&gt;RemoveCurrent&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	task.&lt;span style="color: #0000FF;"&gt;Data&lt;/span&gt; &lt;span style="color: #008000;"&gt;=&lt;/span&gt; &lt;span style="color: #FF0000;"&gt;0&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #0600FF;"&gt;foreach&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;Signal s &lt;span style="color: #0600FF;"&gt;in&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;ICollection&lt;span style="color: #008000;"&gt;&amp;lt;&lt;/span&gt;Signal&lt;span style="color: #008000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;state&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;
		s.&lt;span style="color: #0000FF;"&gt;Add&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;task&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
And, there it is.&lt;/p&gt;
&lt;p&gt;I have a few more ideas to improve this and turn it into a real library:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement a &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;Signal&lt;/code&gt;&lt;/span&gt; that's a &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;ManualResetEvent&lt;/code&gt;&lt;/span&gt; analogue&lt;/li&gt;
&lt;li&gt;Use a &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerable&amp;lt;ThreadState&amp;gt;&lt;/code&gt;&lt;/span&gt; instead of plain &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;IEnumerable&lt;/code&gt;&lt;/span&gt;, where &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;ThreadState&lt;/code&gt;&lt;/span&gt; is a union struct with an enum specifying its type. This could be used to avoid the boxing of &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;TimeSpan&lt;/code&gt;&lt;/span&gt; and the type checks and casts in the scheduler &amp;mdash; just switch on the enum value. It would also prevent consumers returning a zero &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;TimeSpan&lt;/code&gt;&lt;/span&gt; instead of null.&lt;/li&gt;
&lt;li&gt;Dispose any disposable task IEnumerators&lt;/li&gt;
&lt;li&gt;Implement task priorities, probably using different lists&lt;/li&gt;
&lt;li&gt;Tidy up the accessibility and API a bit&lt;/li&gt;
&lt;li&gt;Add a Scheduler.Run overload that only runs some number of iterations, not the whole list.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Some people may wonder why I haven't mentioned interactions with real threads. If the scheduler were thread-aware, then you could have multiple real threads on different cores consuming the microthread queue, and it would be faster with multiple cores and avoid blocking on slow tasks. The problem is not just that this increases the complexity, but that the microthreads all would have to be aware of threading too, and would need to lock all the objects they touched, and so on. This scheduler is meant to run in the equivalent of the GUI thread, purely to enable driving high-level game logic (and similar things) with an intuitive thread-like imperative programming model, and minimal overhead. If it doesn't fit easily on one core you're probably using it for the wrong thing. There might be cases where it's useful to create multiple Schedulers, and run them in different thread, but be careful about what the microthreads touch.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is part of the &lt;a href="http://mjhutchinson.com/tags/catchup2010"&gt;Catchup 2010&lt;/a&gt; series of posts&lt;/em&gt;.&lt;/p&gt;
</description>
      <link>http://mjhutchinson.com/journal/2010/02/01/iteratorbased_microthreading</link>
      <category domain="http://mjhutchinson.com/journal/category/gaming">Gaming</category>
      <category domain="http://mjhutchinson.com/journal/category/mono">Mono</category>
      <category domain="http://mjhutchinson.com/journal/category/programming_languages">Programming languages</category>
      <category domain="http://mjhutchinson.com/tags/catchup2010">Catchup2010</category>
      <category domain="http://mjhutchinson.com/tags/microthreading">Microthreading</category>
      <author>Michael_x0020_Hutchinson@monologue.go-mono.com</author>
      <comments>http://mjhutchinson.com/journal/2010/02/01/iteratorbased_microthreading#comments</comments>
      <guid isPermaLink="false">178 at http://mjhutchinson.com</guid>
      <pubDate>Mon, 01 Feb 2010 06:05:19 GMT</pubDate>
    </item>
    <item>
      <title>Jeffrey Stedfast: Weird bugs due to gcc 4.4 and strict aliasing</title>
      <description>&lt;p&gt;I was just running the unit tests for GMime and I got a couple of failures on my openSUSE 11.2 machine that I have never gotten before. I started debugging and I noticed something &lt;i&gt;very&lt;/i&gt; odd. One of my functions that returned a linked-list of 'word' tokens was returning NULL for something that it should not be returning NULL from, especially since I had just stepped through that method and seen with my own eyes that it was creating and appending nodes to my linked list as it should!&lt;/p&gt;
&lt;p&gt;At this point I split out a tiny test case:&lt;/p&gt;
&lt;pre style="font-family: courier new; font-size: 85%"&gt;
#include &amp;lt;stdio.h&gt;
#include &amp;lt;stdlib.h&gt;

typedef struct _node {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct _node *next;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int value;
} Node;

int main (int argc, char **argv)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node *list, *node, *tail;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list = NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tail = (Node *) &amp;list;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i = 0; i &amp;lt; 10; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node = malloc (sizeof (Node));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node-&gt;next = NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node-&gt;value = i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tail-&gt;next = node;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tail = node;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list == NULL)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("oops, list is null???\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;
}
&lt;/pre&gt;
&lt;p&gt;I then built this test program using &lt;b&gt;gcc -Wall -g -o list-test list-test.c&lt;/b&gt;. When I ran the program, no error.&lt;/p&gt;
&lt;p&gt;Huh.&lt;/p&gt;
&lt;p&gt;Luckily I thought to rebuild with -O2. This time when I ran my test program, it printed out the error I expected. The list was NULL.&lt;/p&gt;
&lt;p&gt;Doing a bit of research suggests that gcc 4.4 has decided to enforce strict aliasing for -O2 and higher, which explains why it works without -O2.
&lt;p&gt;Oddly enough, I get no strict aliasing warnings from gcc even when I use &lt;b&gt;-Wall -O2&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;So be warned... gcc 4.4 may break your perfectly valid code in mysterious ways.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Looks like MySQL had similar problems and according to &lt;a href="http://davmac.wordpress.com/2010/01/08/gcc-strict-aliasing-c99/"&gt;this article&lt;/a&gt;, it is suggested that the gcc developers have interpreted the c99 specification far too strictly.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update 2:&lt;/b&gt; Josh's comment had an excellent explanation of the problem this code hits, so I thought I'd add it to my blog post for anyone who may otherwise miss his comment:&lt;/p&gt;
&lt;blockquote&gt;I imagine that gcc's aliasing thinks that dereferencing a Node* can only write to Node objects, so it won't have any effect on Node*s like list. Thus it thinks that list is never modified in that function, and it propagates the NULL constant throughout.&lt;/blockquote&gt;
&lt;p&gt;I also liked Josh's explanation of why the above code works (since a number of people have been confused by it already, I'll post that too):&lt;/p&gt;
&lt;blockquote&gt;The only reason it "works" in the -O0 case is because the next field happens to be the first field, as Fabian pointed out. The first time you write to tail-&gt;next, you're writing to &amp;list with no offset, so list happens to get the value of node. When next does have an offset, then the value of list is not changed, but something else on the stack after it will be clobbered.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/203063759820106893-5436797640449651593?l=jeffreystedfast.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://jeffreystedfast.blogspot.com/2010/01/weird-bugs-due-to-gcc-44-and-strict.html</link>
      <category domain="http://www.blogger.com/atom/ns#">programming</category>
      <author>Jeffrey_x0020_Stedfast@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-203063759820106893.post-5436797640449651593</guid>
      <pubDate>Sat, 30 Jan 2010 16:05:00 GMT</pubDate>
    </item>
    <item>
      <title>Aaron Bockover: Banshee 1.5.3 and the return of OS X support</title>
      <description>&lt;a href="http://banshee-project.org/download/archives/1.5.3"&gt;&lt;img border="0" align="right" src="http://abock.org/blog-images/new-banshee-logo.png" alt="The Banshee logo" style="border:none" /&gt;&lt;/a&gt;

&lt;p&gt;The Banshee community is proud to announce the availability of &lt;a href="http://banshee-project.org/download/archives/1.5.3/"&gt;Banshee 1.5.3&lt;/a&gt;! With a slew of new features and bug fixes, and a fully refreshed Mac OS X build, this is another solid release on the road to 1.6 (due out on March 31st).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://banshee-project.org/download"&gt;&lt;img border="0" src="http://banshee-project.org/theme/css/images/download-button.png" alt="Get It!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gburt.blogspot.com/2010/01/banshee-153.html"&gt;Gabriel highlights&lt;/a&gt; a number of new features and improvements on his &lt;a href="http://gburt.blogspot.com/2010/01/banshee-153.html"&gt;release announcement blog&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new sync device from playlist option&lt;/li&gt;
&lt;li&gt;Audiobooks library extension&lt;/li&gt;
&lt;li&gt;Library-folder watcher extension&lt;/li&gt;
&lt;li&gt;eMusic importer/downloader extension&lt;/li&gt;
&lt;li&gt;GIO file backend supporting non-local files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, 75 bugs were fixed since the last release. &lt;a href="http://banshee-project.org/download/archives/1.5.3/"&gt;Read the 1.5.3 release notes&lt;/a&gt; to learn about additional new features and improvements.&lt;/p&gt;

&lt;h4&gt;Mac OS X Release&lt;/h4&gt;

&lt;p&gt;What's particularly exciting to me is the return of the &lt;a href="http://banshee-project.org/download#osx"&gt;OS X releases&lt;/a&gt;. I have completely overhauled our OS X build, and we no longer take a framework dependency on Mono or GTK - these dependencies are bundled as part of the binary distribution of Banshee on OS X.&lt;/p&gt;

&lt;p&gt;If you have OS X 10.5 or newer (Intel only), you can simply &lt;a href="http://banshee-project.org/download#osx"&gt;download and run Banshee&lt;/a&gt; - nothing else needs to be installed.&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://abock.org/blog-images/banshee-1.5.3-osx.png"&gt;&lt;img border="0" src="http://abock.org/blog-images/banshee-1.5.3-osx-th.png" alt="Banshee 1.5.3 on Mac OS X 10.6" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gives us greater flexibility to refine and polish Banshee for OS X. For instance, I started working on a new GTK theme that uses the flexible Murrine engine. Currently the Mono framework installation uses Clearlooks.&lt;/p&gt;

&lt;p&gt;There's still a lot to do on the OS X build, so if you're interested in hacking on the platform backend, it's now easier than ever to do so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install XCode&lt;/li&gt;
&lt;li&gt;Clone Banshee from GNOME git&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;./bootstrap-bundle&lt;/code&gt; at the top of the checkout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process will magically build everything that Banshee requires, and from there hacking on Banshee is just like it is on Linux. I recommend using &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; of course to get real work done though.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; There was a &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=608298"&gt;lame bug&lt;/a&gt; preventing startup of Banshee 1.5.3 on OS X. This has been fixed and the DMG image has been respun. If you had problems running the release, &lt;a href="http://banshee-project.org/download/#osx"&gt;download the updated image&lt;/a&gt;. &lt;em&gt;My bad ya'll!&lt;/em&gt;&lt;/p&gt;</description>
      <link>http://abock.org/2010/01/29/banshee-1-5-3-and-the-return-of-os-x-support</link>
      <category>uncategorized</category>
      <category>banshee</category>
      <category>cross platform</category>
      <category>gnome</category>
      <category>mono</category>
      <category>os x</category>
      <author>Aaron_x0020_Bockover@monologue.go-mono.com</author>
      <comments>http://abock.org/2010/01/29/banshee-1-5-3-and-the-return-of-os-x-support#comments</comments>
      <guid isPermaLink="false">http://abock.org/?p=322</guid>
      <pubDate>Fri, 29 Jan 2010 16:38:03 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: iPad - Inspirational Hardware</title>
      <description>
	&lt;p&gt;iPad - Inspirational Hardware

	&lt;p&gt;As a software developer, I find the iPad inspirational.

	&lt;p&gt;Apple's iPad is not a new idea.   They are not the first ones
	to think of a tablet and as many blogs have pointed out the
	Apple iPad is not everyone's dream machine, the hardware is
	lacking gadgets and the software is not that amazing.

	&lt;p&gt;Five elements come together to revolutionize software:

	&lt;ol&gt;
	&lt;li&gt;Price
	&lt;li&gt;Multi-touch centric development
	&lt;li&gt;Standard hardware available for consumers
	&lt;li&gt;Apple's AppStore
	&lt;li&gt;Large form factor.
	&lt;/ol&gt;

	&lt;p&gt;The iPhoneOS is a multi-touch centric operating system.   For
	years application developers have been subjected to the
	tyranny of the mouse and keyboard.   This has been the only
	input technology that developers could reliably depend on and
	expect to be available on the user's system.   Any software
	that requires different input mechanism sees its potential
	market reduced.

	&lt;p&gt;The mouse is a great device for certain class of desktop
	applications.   But it has also led to applications that are
	incredibly frustrating to use.   Software for editing music
	and audio is cumbersome.   Find the target, drag it, move it,
	find the other button, click it, scroll, drag, click.
	Anyone that has used Garage Band to try to play along knows
	this.   The same applies to software to paint or draw.   The
	mouse and keyboard are poor substitutes for using your hands.

	&lt;p&gt;On the iPhone, and now the iPad, the situation is reversed.
	Multi-touch is the only input mechanism that developers can
	depend on.  Apple's iPhone helped create a community of
	developers that think in terms of taps, pinches and twirls
	instead of clicks, double-clicks and right-clicks.  It is no
	longer an after thought.   It is no longer a feature that is
	added if there is enough time in the schedule or enough
	budget.   It is the only option available.

	&lt;p&gt;Taps, pinches and twirls allow us to use the full expression
	of our hands to drive an application.   And it is not just any
	multi-touch, it is multi-touch over the same surface where the
	application is providing feedback to the user.  Software that
	respond to user input in the same way that a physical object
	responds to our physical contact is the key to create new user
	experiences.

	&lt;p&gt;This is a whole new space in which we can research, a new
	space that we can explore and where we can create a whole new
	class of computer/user interactions.   With the new form
	factor, we can now create applications that just made no sense
	on the iPhone.

	&lt;p&gt;It is fascinating.

	&lt;p&gt;The standardized hardware means that software developers do
	not have face testing their software with dozens of
	combinatorial options.   There are only a handful types of
	systems.  If the software works on the core systems, they will
	work on all consumer devices.   Standardized hardware is at
	the core of the success of the console gaming market,
	developers test and develop against a uniform platform.
	Price is the cherry on top of the cake, this device will be
	mass produced and the affordable price means that it will have
	a deep reach.

	&lt;p&gt;The possibilities for new computer/user interactions are no
	longer dampened by this market reality.   As developers, a new
	door to invention and innovation has been opened for us.  No
	longer will software developers have to cripple their user
	experiences based on the mouse and keyboard.

	&lt;p&gt;For the past couple of years I have had some ideas for some
	software that I wanted to build on a touch-based computer, but
	the specter of having a small user base for my experiments
	always discouraged me.  Ever since I heard the rumors about
	Apple producing a tablet computer I have not cared about what
	the device looked like, or what the software stack for it was
	going to be.  I wanted to try new touch-based UI ideas, I have
	dozens of ideas that I want to try out.  And with Mono, I get
	to do it in my favorite language.

</description>
      <link>http://tirania.org/blog/archive/2010/Jan-29.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Jan-29.html</guid>
      <pubDate>Fri, 29 Jan 2010 11:05:00 GMT</pubDate>
    </item>
    <item>
      <title>Jeroen Frijters: New Development Snapshot</title>
      <description>&lt;p&gt;
   I've modified ikvmc to use IKVM.Reflection and largely rewritten ikvmstub to directly
   work with the ikvm internals instead of using the java reflection API. Both ikvmc
   and ikvmstub can now process assemblies independent from the .NET runtime they run
   on. This opens up the possibility to start investigating the possibility of Silverlight
   support.
&lt;/p&gt;
&lt;p&gt;
   Changes:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      Drag-n-drop fix by Nat.&lt;/li&gt;
   &lt;li&gt;
      Fixed regression introduced in previous development snapshot, related to field accessors.&lt;/li&gt;
   &lt;li&gt;
      Removed caching of inner classes.&lt;/li&gt;
   &lt;li&gt;
      Fix for bug &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2908683&amp;amp;group_id=69637&amp;amp;atid=525264"&gt;#2908683&lt;/a&gt;.&lt;/li&gt;
   &lt;li&gt;
      Various AWT fixes by Volker.&lt;/li&gt;
   &lt;li&gt;
      Changed JNI to use standard caller ID mechanism.&lt;/li&gt;
   &lt;li&gt;
      Various JNI optimizations.&lt;/li&gt;
   &lt;li&gt;
      Fixed &lt;a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41696"&gt;http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41696&lt;/a&gt;
   &lt;/li&gt;
   &lt;li&gt;
      Fixed exception sorter bug exposed by recent Mono sorting change.&lt;/li&gt;
   &lt;li&gt;
      Fixed Thread.getAllStackTraces() to resume threads that it suspends.&lt;/li&gt;
   &lt;li&gt;
      Integrated new IKVM.Reflection implementation.&lt;/li&gt;
   &lt;li&gt;
      Added AllowMultiple = true to RemappedClassAttribute.&lt;/li&gt;
   &lt;li&gt;
      Fixed atomic update helper nested types to be invisible from Java.&lt;/li&gt;
   &lt;li&gt;
      Removed support for "ikvm.stubgen.serialver" property that is no longer needed now
      that ikvmstub doesn't use the runtime to generate stubs.&lt;/li&gt;
   &lt;li&gt;
      Removed pre-generated stub jars from cvs and modified build process to generate them
      during the build.&lt;/li&gt;
   &lt;li&gt;
      Removed "constant" instance field support (which was only used by ikvmstub and doesn't
      make any sense anyway).&lt;/li&gt;
   &lt;li&gt;
      Removed ReflectionOnly support from runtime. Now that ikvmstub no longer requires
      it, there's no good reason to allow Java code to see ReflectionOnly types.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   Binaries available here: &lt;a href="http://www.frijters.net/ikvmbin-0.43.3681.zip"&gt;ikvmbin-0.43.3681.zip&lt;/a&gt;
   &lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://weblog.ikvm.net/aggbug.ashx?id=3f7b31fb-ff92-4604-a302-349a9ccad953"&gt;</description>
      <link>http://weblog.ikvm.net/PermaLink.aspx?guid=3f7b31fb-ff92-4604-a302-349a9ccad953</link>
      <author>Jeroen_x0020_Frijters@monologue.go-mono.com</author>
      <comments>http://weblog.ikvm.net/CommentView.aspx?guid=3f7b31fb-ff92-4604-a302-349a9ccad953</comments>
      <guid isPermaLink="false">http://weblog.ikvm.net/PermaLink.aspx?guid=3f7b31fb-ff92-4604-a302-349a9ccad953</guid>
      <pubDate>Fri, 29 Jan 2010 08:35:13 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: iPad Support for MonoTouch!</title>
      <description>
	&lt;center&gt;
	&lt;img src="http://tirania.org/shots/1001280456kpa9ZI9u.png"
	alt="We did it!   MonoTouch for iPad!"&gt;
	&lt;/center&gt;

	&lt;p&gt;24 hours after we got the iPad SDK we completed the support
	for the iPad for MonoTouch!

	&lt;p&gt;To get started with iPad development, go to 
	&lt;a href="http://monotouch.net/iPad"&gt;http://monotouch.net/iPad&lt;/a&gt;
	and follow the instructions.

	&lt;p&gt;Let the iPad# hacking begin!
</description>
      <link>http://tirania.org/blog/archive/2010/Jan-28-1.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Jan-28-1.html</guid>
      <pubDate>Fri, 29 Jan 2010 02:56:00 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: Release-o-Rama</title>
      <description>
	&lt;p&gt;Nice new releases of software that I use in the last few
	days.

&lt;p&gt;&lt;center&gt;&lt;a href="http://tirania.org/blog/pic.php?name=banshee-1.5.3-goodlies.png&amp;caption= Banshee 1.5"&gt;&lt;img border=0 src="http://primates.ximian.com/~miguel/pictures/small-banshee-1.5.3-goodlies.png"&gt;&lt;/a&gt;&lt;p&gt; Banshee 1.5&lt;/center&gt;&lt;/p&gt;
	&lt;p&gt;A
	new &lt;a href="http://abock.org/2010/01/27/banshee-1-5-3-and-the-return-of-os-x-support"&gt;Banshee&lt;/a&gt;
	release, now supports new device syncing options, audiobooks,
	eMusic and GIO for non-local files.   Gabriel has
	more &lt;a href="http://gburt.blogspot.com/2010/01/banshee-153.html"&gt;details&lt;/a&gt;
	as well.


	&lt;p&gt;Now with a fully self-contained Mono and Gtk+ stacks on
	OSX.  On the OSX note, I recommend Michael Hutchinson's blog
	entries on how
	to &lt;a href="http://mjhutchinson.com/journal/2010/01/24/creating_mac_app_bundle_for_gtk_app"&gt;package
	your Gtk# app&lt;/a&gt; for use in OSX as well as his article on how
	to &lt;a href="http://mjhutchinson.com/journal/2010/01/25/integrating_gtk_application_mac"&gt;make
	your Gtk# app integrate with OSX&lt;/a&gt;.   Both based on the
	lessons of bringing MonoDevelop and MonoDoc to OSX.

	&lt;p&gt;&lt;b&gt;Jeroen
	Frijters&lt;/a&gt;&lt;/b&gt; &lt;a href="http://weblog.ikvm.net/PermaLink.aspx?guid=d0dc2476-471b-45f3-96bf-a90bc2f5800b"&gt;released
	his IKVM.Reflection&lt;/a&gt; API.   His API could be very useful
	for Reflection-Emit compiler writers, perhaps we could even
	use it in Mono's C# compiler to solve our long standing issues
	with Reflection.   More research is needed on this area.

	&lt;p&gt;&lt;b&gt;&lt;a href="http://twitter.com/mauritsrijk"&gt;Maurits
	Rijk&lt;/a&gt;&lt;/b&gt; has published a new version
	of &lt;a href="http://sourceforge.net/projects/gimp-sharp/"&gt;GIMP#&lt;/a&gt;
	his Mono-based plugin engine that lets you write plugins in
	any Mono supported language.   There are samples in C# 3, F#,
	Boo, Nemerle, Oxygene, IronPython, Java/IKVM and Visual Basic.


	&lt;center&gt;
	&lt;img src="http://primates.ximian.com/~miguel/pictures/tomboy-jump-lists.png"&gt;
	&lt;/center&gt;
	
	&lt;p&gt;&lt;a href="http://automorphic.blogspot.com/"&gt;Sandy&lt;/a&gt; &lt;a href="http://automorphic.blogspot.com/2010/01/tomboy-111-released-tomboy-online-plans.html"&gt;released
	a new version of Tomboy&lt;/a&gt;, now supports exporting data in
	HTML format to the clipboard and jump Lists on Windows 7.
	
</description>
      <link>http://tirania.org/blog/archive/2010/Jan-28.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Jan-28.html</guid>
      <pubDate>Fri, 29 Jan 2010 02:23:00 GMT</pubDate>
    </item>
    <item>
      <title>Miguel de Icaza: 24 hour race</title>
      <description>
	&lt;p&gt;Another Mono-race, in 24 hours we are aiming to:

	&lt;ul&gt;
		&lt;li&gt;Support the iPad SDK from Apple (freshly baked and
		published).

		&lt;li&gt;Add MonoDevelop support for it.
	&lt;/ul&gt;
	
</description>
      <link>http://tirania.org/blog/archive/2010/Jan-27.html</link>
      <author>Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com</author>
      <guid isPermaLink="true">http://tirania.org/blog/archive/2010/Jan-27.html</guid>
      <pubDate>Thu, 28 Jan 2010 02:34:00 GMT</pubDate>
    </item>
    <item>
      <title>Chris Howie: When FarmVille == Productivity</title>
      <description>Update 2010-02-08: Jonathan Pryor has merged many of my extension methods into Cadenza.  I&amp;#8217;d strongly suggest checking it out.
It&amp;#8217;s no secret to my friends that I love to program&amp;#8230; even more so as I&amp;#8217;ve been developing a FarmVille client in C# and having them test it.  (As much as you might hate FarmVille, [...]</description>
      <link>http://www.chrishowie.com/2010/01/27/when-farmville-productivity/</link>
      <category>C#</category>
      <category>Computer</category>
      <author>Chris_x0020_Howie@monologue.go-mono.com</author>
      <comments>http://www.chrishowie.com/2010/01/27/when-farmville-productivity/#comments</comments>
      <guid isPermaLink="false">http://www.chrishowie.com/?p=348</guid>
      <pubDate>Thu, 28 Jan 2010 00:27:11 GMT</pubDate>
    </item>
    <item>
      <title>Jonathan Pobst: Taking All Bets</title>
      <description>With the massive success of the iTunes App Store (over 3 billion apps downloaded), I think it's safe to assume the next version of OS X will include an App Store for Mac software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The question is:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How many iterations of OS X will it take before Mac software can only be distributed (without "jailbreaking") through the App Store, thus ensuring Apple gets their cut of all Mac software sales?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1368115163566068223-7269986731385410504?l=jpobst.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://jpobst.blogspot.com/2010/01/taking-all-bets.html</link>
      <author>Jonathan_x0020_Pobst@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-1368115163566068223.post-7269986731385410504</guid>
      <pubDate>Wed, 27 Jan 2010 19:36:00 GMT</pubDate>
    </item>
    <item>
      <title>Sandy Armstrong: Tomboy 1.1.1 Released, Tomboy Online Plans Solidify</title>
      <description>&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Tomboy 1.1.1 Brings New Ones&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After a brief release hiatus, I bring you &lt;a href="http://lists.beatniksoftware.com/pipermail/tomboy-list-beatniksoftware.com/2010-January/001491.html"&gt;Tomboy's latest development release: version 1.1.1&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Probably the coolest new feature in this release, courtesy of Stefan Cosma, is support for Windows 7 Jump Lists, which are totally awesome and &lt;a href="http://mail.gnome.org/archives/gnome-shell-list/2009-December/msg00148.html"&gt;should be added to GNOME&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://armstrong-clan.net/dump/tomboy-jump-lists.png" alt="" border="0" /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:78%;"&gt;Jump Lists In Action&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Another cool fix that will make &lt;a href="http://davelargo.blogspot.com/"&gt;Dave Richards&lt;/a&gt; (and everyone else who has ever wanted to copy and paste a Tomboy note into an email or OpenOffice.org document) very happy.  &lt;a href="http://gburt.blogspot.com/"&gt;Gabriel Burt&lt;/a&gt; fixed a long-standing problem with gtk# to enable this (requires not-yet-released gtk# 2.12.10), and patched Tomboy to make rich HTML available in the clipboard.  Thanks dude!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a style="font-size: 16px; line-height: 19px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://armstrong-clan.net/dump/tomboy-rich-copy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; font-size: 16px; line-height: 19px;" src="http://armstrong-clan.net/dump/tomboy-rich-copy-preview.png" alt="" id="BLOGGER_PHOTO_ID_5259175651272039874" border="0" height="362" width="382" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:78%;"&gt;Pasting rich note content into Evolution (click for OO.o Writer and plain-text email examples)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I was planning on having a preview of automatic background sync in this release, but I just didn't get as far as I wanted on it.  I'll be merging that feature in before the next release, though.&lt;br /&gt;&lt;br /&gt;But while I was playing with autosync, I was doing a lot of restarting Tomboy, and got tired of the 2 second startup time.  Most Tomboy users always run it, so startup time is not a huge deal, but for developers this just gets irritating after awhile.  So I rejiggered some startup work to be delayed, causing the Tomboy icon to show up within about &lt;b&gt;0.5-1.0 seconds&lt;/b&gt; on my machine.  This pleased me, so I included it in Tomboy 1.1.1.  Take that fascist scum!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Future of Snowy and Tomboy Online&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You may have seen &lt;a href="http://brad.getcoded.net/blog/entry.php?e=80353898"&gt;Brad's blog&lt;/a&gt; last week about our Snowy meeting.  If you read &lt;a href="http://live.gnome.org/Snowy/Meetings/23Jan2010"&gt;the meeting minutes&lt;/a&gt;, you'll see that we're shifting our focus to be a little more goal-oriented.  Our plan is to get a Snowy instance on GNOME servers as soon as the sysadmin team will let us.  This instance will be Tomboy Online, and its needs will drive core Snowy development.  We'll start with a private alpha and go from there.&lt;br /&gt;&lt;br /&gt;Right now we're working on a &lt;a href="http://live.gnome.org/Snowy/TomboyOnlineRoadmap"&gt;Tomboy Online roadmap&lt;/a&gt; that breaks outstanding work into basic tasks so that contributors know where they can help.  Once this roadmap is in better shape, I'll be blogging again to let you know what our plans are and how you can help us.&lt;br /&gt;&lt;br /&gt;In the meantime, if you have any resources to share on automated testing of web sites, REST APIs, and overall web/server security, I'd really appreciate it.  Ponies are great...pwnies, not soo much.&lt;br /&gt;&lt;br /&gt;By the way, if you have opinions about GNOME hosting Free web services like Tomboy Online, please take &lt;a href="http://www.stormyscorner.com/2010/01/what-should-the-gnome-foundation-accomplish-in-2010.html"&gt;Stormy's survey on GNOME Foundation goals for 2010&lt;/a&gt;!  :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2867321763955747460-7919476418942028941?l=automorphic.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://automorphic.blogspot.com/2010/01/tomboy-111-released-tomboy-online-plans.html</link>
      <category domain="http://www.blogger.com/atom/ns#">web services</category>
      <category domain="http://www.blogger.com/atom/ns#">snowy</category>
      <category domain="http://www.blogger.com/atom/ns#">windows</category>
      <category domain="http://www.blogger.com/atom/ns#">tomboy</category>
      <category domain="http://www.blogger.com/atom/ns#">gnome</category>
      <author>Sandy_x0020_Armstrong@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-2867321763955747460.post-7919476418942028941</guid>
      <pubDate>Wed, 27 Jan 2010 17:07:00 GMT</pubDate>
    </item>
    <item>
      <title>Gabriel Burt: Banshee 1.5.3</title>
      <description>&lt;p&gt;We've just released Banshee 1.5.3, containing a lot of exciting new features and bug fixes.&lt;/p&gt;&lt;b&gt;New Features:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sync device from playlist option&lt;/li&gt;&lt;li&gt;Type-ahead find in track, artist, and album lists&lt;/li&gt;&lt;li&gt;Optional cover art in lower-left corner&lt;/li&gt;&lt;li&gt;Cover art editable via drag-and-drop and right-click&lt;/li&gt;&lt;li&gt;Audiobooks library extension&lt;/li&gt;&lt;li&gt;Library-folder watcher extension&lt;/li&gt;&lt;li&gt;eMusic importer/downloader extension&lt;/li&gt;&lt;li&gt;GIO file backend, supports non-local files&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Read the &lt;a href="http://banshee-project.org/download/archives/1.5.3"&gt;1.5.3 Release Notes&lt;/a&gt; for the full scoop and some screenshots of the new features.&lt;/p&gt;&lt;img border="0" width="600" height="441" alt="screenshot showing manual cover art editing, ipod sync-from-playlist options, and lower-left cover art" src="http://2.bp.blogspot.com/_MXUP18ra1ik/S2CHo9OAmAI/AAAAAAAAA18/AyNBwIZc-HU/s1600/banshee-1.5.3-goodlies.png" /&gt;&lt;p&gt;This release is what will become Banshee 1.6 and be picked up by distros; your help testing it and &lt;a href="http://banshee-project.org/contribute/file-bugs"&gt;filing bugs&lt;/a&gt; is important and appreciated!&lt;/p&gt;&lt;b&gt;Try It&lt;/b&gt;&lt;p&gt;You can get &lt;a href="http://banshee-project.org/download"&gt;packages for your distro&lt;/a&gt;, grab the &lt;a href="http://download.banshee-project.org/banshee/stable/"&gt;source tarball&lt;/a&gt;, or follow the bleeding edge by trying it from &lt;a href="http://banshee-project.org/download/development/"&gt;git master&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Aaron worked hard to bring back the &lt;a href="http://banshee-project.org/download#osx"&gt;OS X build&lt;/a&gt; this release, too.&lt;/p&gt;&lt;p&gt;&lt;font size="small"&gt;&lt;a href="http://digg.com/linux_unix/Banshee_media_player_updated_for_Linux_and_OS_X"&gt;&lt;strong&gt;Digg It!&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33979271-6770829443791721318?l=gburt.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://gburt.blogspot.com/2010/01/banshee-153.html</link>
      <category>banshee</category>
      <category>mono</category>
      <category>freesoftware</category>
      <category>gnome</category>
      <author>Gabriel_x0020_Burt@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-33979271.post-6770829443791721318</guid>
      <pubDate>Wed, 27 Jan 2010 13:52:00 GMT</pubDate>
    </item>
    <item>
      <title>Bertrand Lorentz: The country next door</title>
      <description>&lt;a href="http://www.fosdem.org/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img alt="I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting" border="0" src="http://www.fosdem.org/promo/going-to" /&gt;&lt;/a&gt;&lt;br /&gt;I'm going to FOSDEM, and I'll be in Brussels for the whole week-end. I'm really looking forward to see again some of the people I've met in Gran Canaria, and to meet new faces.&lt;br /&gt;&lt;br /&gt;I just have to decide if I'll be going by car or by train. One thing's for sure : I won't be driving after the Beer Event !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30299148-6670338007181227161?l=bl-log.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>http://bl-log.blogspot.com/2010/01/country-next-door.html</link>
      <category domain="http://www.blogger.com/atom/ns#">Conference FOSDEM</category>
      <author>Bertrand_x0020_Lorentz@monologue.go-mono.com</author>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-30299148.post-6670338007181227161</guid>
      <pubDate>Tue, 26 Jan 2010 22:38:00 GMT</pubDate>
    </item>
    <item>
      <title>Maurits Rijk: GIMP# 0.16 released</title>
      <description>Before I summarize the changes in GIMP# 0.16 I need to apologize to Alexandre Prokoudine. He is a great guy that updates the SourceForge news for GIMP#, reminds me very friendly on a regular basis that I really should release a new version, handles all kinds of feedback from users that somehow end up in [...]&lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maurits.wordpress.com&amp;blog=73044&amp;post=171&amp;subd=maurits&amp;ref=&amp;feed=1" /&gt;</description>
      <link>http://maurits.wordpress.com/2010/01/26/gimp-0-16-released/</link>
      <category>C#</category>
      <category>GIMP</category>
      <category>Programming</category>
      <author>Maurits_x0020_Rijk@monologue.go-mono.com</author>
      <comments>http://maurits.wordpress.com/2010/01/26/gimp-0-16-released/#comments</comments>
      <guid isPermaLink="false">http://maurits.wordpress.com/?p=171</guid>
      <pubDate>Tue, 26 Jan 2010 22:34:27 GMT</pubDate>
    </item>
  </channel>
</rss>