<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5419182</atom:id><lastBuildDate>Tue, 03 Nov 2009 05:13:24 +0000</lastBuildDate><title>jimmy.thinking</title><description>Musings on web frameworks, dynamic languages, and playing nice @ Microsoft. And Life ;)</description><link>http://blog.jimmy.schementi.com/</link><managingEditor>jschementi@gmail.com (Jimmy Schementi)</managingEditor><generator>Blogger</generator><openSearch:totalResults>179</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>47.61487</geo:lat><geo:long>-122.345784</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/jimmy-thinking" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-6818404913992991051</guid><pubDate>Thu, 22 Oct 2009 09:20:00 +0000</pubDate><atom:updated>2009-10-22T02:28:06.361-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Dynamic Languages</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><title>IronRuby and IronPython for .NET 4.0 Beta 2</title><description>&lt;p&gt;Quick download links: &lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33305"&gt;IronRuby&lt;/a&gt; | &lt;a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28125"&gt;IronPython&lt;/a&gt; | &lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;.NET 4.0 Beta 2&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="IronRuby and IronPython in .NET 4.0" border="0" alt="IronRuby and IronPython in .NET 4.0" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SuAjvpky3II/AAAAAAAAAMs/8q2A49l6gZ0/irb-ipy-dotnet-beta2%5B8%5D.png?imgmax=800" width="360" height="323" /&gt; &lt;/p&gt;  &lt;p&gt;I’m pleased to announce the release of the &lt;b&gt;IronRuby and IronPython CTPs for .NET 4.0 Beta 2&lt;/b&gt;. This is the third preview of IronRuby and IronPython running under &lt;a href="http://dlr.codeplex.com/"&gt;the Dynamic Language Runtime&lt;/a&gt; that is built directly into .NET 4.0. As before, this release allows you to use IronRuby objects and types as .NET 4.0 dynamic objects from within C# and Visual Basic code. These binaries are roughly equivalent to the functionality found in IronRuby 0.9 and IronPython 2.6 RC. Take a look at &lt;a href="http://devhawk.net" target="_blank"&gt;Harry Pierson&lt;/a&gt;’s &lt;a href="http://devhawk.net/2009/10/21/IronPython+And+IronRuby+CTPs+For+NET+40+Beta+2.aspx" target="_blank"&gt;blogpost about this release&lt;/a&gt; as well, especially if you’re more into snakes than gemstones.&lt;/p&gt;  &lt;p&gt;Here's a small example showing just how powerful the new dynamic feature is for taking advantage of dynamic language functionality in statically typed languages:&lt;/p&gt; &lt;script src="http://gist.github.com/215817.js"&gt;&lt;/script&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gist.github.com/215819" target="_blank"&gt;Here is the IronPython version as well&lt;/a&gt;. It basically loads up the desired scripting engine (in this case, Ruby), loads a script, instantiates the “Mock” class defined in the script, and calls a method on an instance of “Mock” which the C# compiler cannot possibly know of; the Mock class dynamically responds to any method call with a random result. The “dynamic” keyword indicates that the C# compiler should use the DLR to dispatch method calls at runtime, rather than trying to validate the method calls at compile time. This enables a very clean integration between dynamic languages and static languages, and even gives you the ability to define your own dynamic objects. &lt;a href="http://blogs.msdn.com/cburrows/" target="_blank"&gt;Chris Burrows&lt;/a&gt; has a great &lt;a href="http://blogs.msdn.com/cburrows/archive/tags/dynamic/default.aspx" target="_blank"&gt;blog series on how C# “dynamic” works&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Try it out&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;To try out this release:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" target="_blank"&gt;Install NET 4.0 Beta 2 or Visual Studio 2010 Beta 2&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Download either &lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33305" target="_blank"&gt;IronRuby&lt;/a&gt; or &lt;a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28125" target="_blank"&gt;IronPython&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Follow any of the many dynamic walkthroughs online. &lt;a href="http://blogs.msdn.com/vbteam/archive/2008/12/17/walkthrough-dynamic-programming-in-visual-basic-10-0-and-c-4-0-lisa-feigenbaum.aspx" target="_blank"&gt;This would be a good start&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Build from source&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;To build IronPython or IronRuby for .NET 4.0 Beta 2 from source, get the sources from:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IronPython: &lt;a href="http://ironpython.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;CodePlex&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;IronRuby: &lt;a href="http://github.com/ironruby/ironruby" target="_blank"&gt;GitHub&lt;/a&gt; (&lt;a href="http://github.com/ironruby/ironruby/zipball/master" target="_blank"&gt;direct download&lt;/a&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Note: use the &amp;quot;v4&amp;quot; build configurations.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Caveats&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Being a “preview” release, these releases haven’t gone through the usual testing that the normal binary releases go through. However, both IronRuby and IronPython will be supported on .NET 4.0 when it ships for real. Also note that the these releases will run only under .NET 4.0 Beta 2.&lt;/p&gt;  &lt;p&gt;There is no project-system integration between IronRuby and IronPython in Visual Studio 2010 Beta 2, so don’t expect to find File-&amp;gt;New Project-&amp;gt;IronPython or something like that; this release is just about the integration between .NET 4.0 and &lt;a href="http://dlr.codeplex.com" target="_blank"&gt;DLR&lt;/a&gt;-based languages. If you’d like that to not be the case, please continue to let Microsoft know that on the open &lt;a href="http://connect.microsoft.com"&gt;http://connect.microsoft.com&lt;/a&gt; issues for &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=479957" target="_blank"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=475830" target="_blank"&gt;IronPython&lt;/a&gt; Visual Studio 2010 integration.&lt;/p&gt;  &lt;p&gt;If you find any issues, please report them on the language’s respective CodePlex sites (&lt;a href="http://ironpython.codeplex.com/WorkItem/Create.aspx"&gt;IronPython&lt;/a&gt; | &lt;a href="http://ironruby.codeplex.com/WorkItem/Create.aspx"&gt;IronRuby&lt;/a&gt;).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-6818404913992991051?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=bnkxTtUea-s:ELBYimgQbMg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=bnkxTtUea-s:ELBYimgQbMg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=bnkxTtUea-s:ELBYimgQbMg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=bnkxTtUea-s:ELBYimgQbMg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=bnkxTtUea-s:ELBYimgQbMg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=bnkxTtUea-s:ELBYimgQbMg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=bnkxTtUea-s:ELBYimgQbMg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/bnkxTtUea-s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/bnkxTtUea-s/ironruby-and-ironpython-ctps-for-net-40.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/10/ironruby-and-ironpython-ctps-for-net-40.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-8365420027701416090</guid><pubDate>Sun, 02 Aug 2009 00:54:00 +0000</pubDate><atom:updated>2009-08-03T13:53:45.286-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSCON</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Release</category><title>IronRuby 0.9 Released!</title><description>&lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/SnTjqaLzSeI/AAAAAAAAALw/bHORChmv7yk/s1600-h/ir-logo-white%5B4%5D.jpg"&gt;&lt;img style="display: inline" title="ir-logo-white" alt="ir-logo-white" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SnTjqyQdzqI/AAAAAAAAAL0/CbgKyPqQXao/ir-logo-white_thumb%5B2%5D.jpg?imgmax=800" width="400" height="115" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;I'm pleased to announce a new release of IronRuby: 0.9!&lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="5"&gt;&lt;strong&gt;&lt;a href="http://ironruby.net/Download" target="_blank"&gt;Download IronRuby 0.9&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/ironruby/ironruby/zipball/v0.9.0" target="_blank"&gt;You can also get the source code for this release&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s been a long ride since &lt;a href="http://ironruby.net"&gt;IronRuby&lt;/a&gt; was announced at &lt;a href="http://videos.visitmix.com/MIX07/DEV02"&gt;MIX ‘07&lt;/a&gt;, but now all eyes are focused on getting it to 1.0. The &lt;a href="http://blog.jimmy.schementi.com/2009/03/ironruby-03-released.html" target="_blank"&gt;past&lt;/a&gt; &lt;a href="http://blog.jimmy.schementi.com/2009/05/ironruby-05-released.html" target="_blank"&gt;couple&lt;/a&gt; of versions &lt;a href="http://blog.jimmy.schementi.com/2009/07/ironruby-06-released.html" target="_blank"&gt;have made vast compatibility and performance improvements&lt;/a&gt;, and 0.9 marks the last set of &lt;strong&gt;major&lt;/strong&gt; features that will be added to IronRuby. From now on, all IronRuby languages will be primarily focused on bug fixing &lt;strong&gt;and&lt;/strong&gt; anything else the community deems necessary to call IronRuby a 1.0 release. These improvements be delivered as point-point releases (0.9.1, 0.9.2, etc) until &lt;strong&gt;you &lt;/strong&gt;decide it is ready to call 1.0.&lt;/p&gt;  &lt;p&gt;Though IronRuby is breaking away from it’s conference-driven development schedule, this release comes only a week after &lt;a href="http://en.oreilly.com/oscon2009" target="_blank"&gt;OSCON 2009&lt;/a&gt; where I talked about using &lt;a href="http://blog.jimmy.schementi.com/2009/07/ironruby-at-oscon-2009-mono-moonlight.html" target="_blank"&gt;IronRuby with Mono and Moonlight, and scripting open source apps&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000" size="4"&gt;What's in the Release?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Library performance was a big focus for this release; basically going though the &lt;a href="http://github.com/acangiano/ruby-benchmark-suite" target="_blank"&gt;Ruby Benchmark suite&lt;/a&gt; and making sure any obvious slowness was fixed. As I said in &lt;a href="http://blog.jimmy.schementi.com/2009/07/ironruby-at-oscon-2009-mono-moonlight.html" target="_blank"&gt;my previous post about OSCON&lt;/a&gt;, IronRuby is approximately 2x faster than MRI when running the benchmark suite, but in the near future a complete evaluation of IronRuby’s performance will be done and published on the &lt;a href="http://ironruby.info" target="_blank"&gt;website&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;a href="http://antoniocangiano.com/" target="_blank"&gt;Antonio Cangiano&lt;/a&gt; has already published &lt;a href="http://antoniocangiano.com/2009/08/03/performance-of-ironruby-ruby-on-windows/" target="_blank"&gt;benchmark results between IronRuby 0.9 and Ruby 1.8.6, and things look really good for IronRuby&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;On the compatibility front, the &lt;a href="http://ruby-doc.org/stdlib/libdoc/win32ole/rdoc/classes/WIN32OLE.html" target="_blank"&gt;Win32OLE Ruby library&lt;/a&gt; is now &lt;a href="http://github.com/ironruby/ironruby/blob/v0.9.0/Merlin/Main/Languages/Ruby/Libs/win32ole.rb" target="_blank"&gt;available in IronRuby&lt;/a&gt;. This builds on top of IronRuby’s existing COM interop from version 0.5, letting you script any Windows component/application that exposes a &lt;a href="http://msdn.microsoft.com/en-us/library/ms877981.aspx" target="_blank"&gt;COM&lt;/a&gt; interface. Though it hasn’t been fully tested yet, this will make things like &lt;a href="http://wtr.rubyforge.org/" target="_blank"&gt;Watir&lt;/a&gt; work on IronRuby.&lt;/p&gt;  &lt;p&gt;Lastly, there have been interop improvements with .NET, most notably making Generic types more friendly to all the crazy things Ruby can do to them, and also with other DLR languages, making it really easy to call IronPython from IronRuby.&lt;/p&gt;  &lt;p&gt;For more detailed information, please see the &lt;a href="http://rubyforge.org/frs/shownotes.php?release_id=37484" target="_blank"&gt;CHANGELOG&lt;/a&gt; (which includes all commit messages for the release ... not just &amp;quot;syncing to head of tfs&amp;quot;)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;Want to find out more about the release? Read on:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="#pytorb"&gt;Calling Python code from Ruby&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#win32ole"&gt;Win32OLE support&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#generics"&gt;Rubyizing Generics&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#notable-changes"&gt;Some more notable changes&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#bugs09"&gt;Bugs closed&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;a name="pytorb"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Calling Python code from Ruby&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;In an effort to allow Ruby to call Python code easily, IronRuby provides a way to importing files of other DLR languages, giving you access to the DLR scope. Here's a basic usage:&lt;/p&gt; &lt;script src="http://gist.github.com/159528.js"&gt;&lt;/script&gt;  &lt;p&gt;&lt;code&gt;IronRuby#require(path), load(path)&lt;/code&gt; allow you to include script files, just like &lt;code&gt;Kernel#require, #load&lt;/code&gt; except that they execute the given script against a &lt;b&gt;new&lt;/b&gt; &lt;code&gt;Scope&lt;/code&gt; and return it, instead of just returning true/false/nil. If the target is an assembly they return the loaded assembly. Keep in mind you can still use &lt;code&gt;Kernel#require, #load&lt;/code&gt; to use other language's script files, but if the language requires you obtain an object representing that file (in Python it's called a &lt;code&gt;module&lt;/code&gt;) you'll have to get it elsewhere (see below).&lt;/p&gt;  &lt;p&gt;There are other methods to help you use other languages from Ruby:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;code&gt;IronRuby#loaded_scripts&lt;/code&gt; has also been added to returns a dictionary that holds on loaded scripts and their Scopes, in-case you used &lt;code&gt;Kernel#require&lt;/code&gt; to load a script, and need its Scope at a later time. &lt;/li&gt;    &lt;li&gt;&lt;code&gt;IronRuby#loaded_assemblies&lt;/code&gt; returns an array of assemblies already loaded in the current runtime; though this isn’t needed for DLR language interop it makes sense to include along with &lt;code&gt;IronRuby#loaded_scripts&lt;/code&gt;. &lt;/li&gt;    &lt;li&gt;&lt;code&gt;IronRuby#globals&lt;/code&gt; returns the current &lt;code&gt;ScriptRuntime.Globals&lt;/code&gt; scope; this allows you to easily use Python files and work with the modules they define. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Keep in mind these concepts don’t only apply to Python; they can be used with any language that uses first-class scopes.&lt;/p&gt;  &lt;h5&gt;&lt;a name="win32ole"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Win32OLE support&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Since IronRuby 0.1 was released we’ve said &lt;a href="http://ruby-doc.org/stdlib/libdoc/win32ole/rdoc/classes/WIN32OLE.html" target="_blank"&gt;Win32OLE&lt;/a&gt; was not going to be supported, due to the lack of general COM support in the &lt;a href="http://dlr.codeplex.com" target="_blank"&gt;DLR&lt;/a&gt;. However, when the DLR implemented a COM binder for the new &lt;a href="http://msdn.microsoft.com/en-us/library/dd264736(VS.100).aspx" target="_blank"&gt;dynamic feature in C# 4.0&lt;/a&gt;, this allowed IronRuby and IronPython to easily implement COM support. IronRuby 0.5 had this support, but in this release we provided win32ole.rb to implement Ruby’s Win32OLE API. Here’s a simple automation example which opens Excel, adds some data, generates a chart, and rotates the chart. taken from the &lt;a href="http://whytheluckystiff.net/ruby/pickaxe/html/win32.html" target="_blank"&gt;Ruby Pragmatic Programmer’s Guide (aka. the pickaxe book)&lt;/a&gt;, which now works in IronRuby:&lt;/p&gt; &lt;script src="http://gist.github.com/159829.js"&gt;&lt;/script&gt;  &lt;h5&gt;&lt;a name="generics"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Rubyizing Generics&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Note: this feature didn’t make it into 0.9, but it is in the &lt;a href="http://github.com/ironruby/ironruby" target="_blank"&gt;sources&lt;/a&gt; and will be part of 0.9.1&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;IronRuby has great .NET framework integration, so code written with a CLI-based language (C#, VB, F#) can be called from IronRuby, without it feeling like interop. As we work towards a stable 1.0 release and this integration continues to be polished; in this release we most notably made working with generics a bit friendlier to Ruby.&lt;/p&gt;  &lt;p&gt;The first improvement has to do with re-opening a generic class. In the past you couldn’t just re-open a generic class and assume anything you added to it would be found on other versions of that generic class (eg. adding methods to &lt;code&gt;List[]&lt;/code&gt; wouldn’t have them show up on &lt;code&gt;List[String]&lt;/code&gt; and &lt;code&gt;List[Fixnum]&lt;/code&gt;). Now the Ruby class corresponding to the CLR generic type definition is a super-class of all instantiations of that type, making this possible:&lt;/p&gt; &lt;script src="http://gist.github.com/159861.js"&gt;&lt;/script&gt;  &lt;p&gt;There's a much more usability improvements to generics and .NET interop in general in this release, so either take a look at the &lt;a href="http://rubyforge.org/frs/shownotes.php?release_id=37484" target="_blank"&gt;CHANGELOG&lt;/a&gt; or keep an eye on the &lt;a href="http://ironruby.net/Documentation/.NET" target="_blank"&gt;.NET documentation&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;&lt;a name="notable-changes"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Some more notable changes:&lt;/font&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Fix to Module#autoload so it doesn’t squash an existing constant &lt;/li&gt;    &lt;li&gt;Fix parsing of YAML time strings &lt;/li&gt;    &lt;li&gt;Replace DLR closures by a Ruby-specific implementation for performance &lt;/li&gt;    &lt;li&gt;Implement StringIO#ungetc – used in ActiveSuppor &lt;/li&gt;    &lt;li&gt;Re-implements “tr”, “tr!”, “tr_s”, “tr_s!”. The new implementation is almost 12x faster. &lt;/li&gt;    &lt;li&gt;Reimplements “join” to achieve better perf. &lt;/li&gt;    &lt;li&gt;Change ComBinder class to internal. &lt;/li&gt;    &lt;li&gt;Improves the ExpressionVisitor API &lt;/li&gt;    &lt;li&gt;Improves implementation of RubyArray. A loop doing Array#shift is not shifting the entire array content left every iteration. &lt;/li&gt;    &lt;li&gt;Add hosting of IronPython to hosting tutorial &lt;/li&gt;    &lt;li&gt;Implements interpretation of coalescing expression &lt;/li&gt;    &lt;li&gt;Implements Kernel#rand, Kernel#srand. &lt;/li&gt;    &lt;li&gt;Improves scope allocation perf. &lt;/li&gt;    &lt;li&gt;ironruby tutorial in Silverlight &lt;/li&gt;    &lt;li&gt;More fixes to win32ole to get the ADO DBI driver working &lt;/li&gt;    &lt;li&gt;String, Array, and Bignum fixes (thanks Daniele Allessandri!) &lt;/li&gt;    &lt;li&gt;Explicit x64 support with ir64.exe, and force ir.exe to run in a 32bit process on a 64bit OS. &lt;/li&gt;    &lt;li&gt;Implements basic debug views for classes that implement IRubyObject &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For more details, see the &lt;a href="http://rubyforge.org/frs/shownotes.php?release_id=37484" target="_blank"&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;&lt;a name="bugs09"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Bugs closed&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Here are all 26 bugs closed since the last release (2009-07-02). &lt;a href="http://ironruby.codeplex.com/WorkItem/List.aspx" target="_blank"&gt;You can see more information about each one on CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;pre style="overflow: scroll"&gt;1841 	Rubygems Test Failures in 'hash'
1506 	-X:PrivateBinding does not enable referring to classes that have internal visibility
1533 	Unverifiable code generated by mspec :lang
1678 	ArgumentError when calling System.String..ctor(Char[], int, int)
1211 	Adding a random object to Time which responds to to_f
910 	YAML does not properly deserialize Time values.
1626 	Rubygems failures
964 	overriding unsafe methods
1537 	rand doesn't work collectly
468 	Better error message for running ir.exe on pre-.Net 2.0 SP1
1787 	All-caps .NET method names are mangled strangely
1521 	Access is allowed to internal fields
1502 	alias_method fails for :do
821 	File.expand_path does not support a line number after filename
1509 	Proc.to_s should include line number where the block was declared
1501 	WinForms broken
1400 	$? is not always Process::Status
1345 	load_assembly(&lt;partial_name&gt;) should work
1344 	System.Action.new does not work
1306 	Cannot call CLR constructor of builtin type
1184 	public(:foo) does not work correctly for mixed-in methods
1060 	visibility of send :define_method
917 	Passing a Ruby array to a .NET method that expects an IEnumerable derivative fails with GetEnumerator call
783 	Assert in SetMethodBasesNoLock when calling #== on Ruby class inheriting from CLR class which overrides Equals
761 	Wrong behavior when calling redefined methods on object instances
1470 	Can't call the BigIntegerOverload of a method with a DefaultProtocol Attribute on the BigInteger attribute&lt;/pre&gt;

&lt;h5&gt;&lt;font color="#ff8000" size="3"&gt;Enjoy!&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;Please test out IronRuby 0.9 and let us know if you have any issues. We hope you enjoy this release! Please &lt;a href="http://ironruby.codeplex.com/WorkItem/Create.aspx" target="_blank"&gt;submit issues to CodePlex&lt;/a&gt; and help prioritize features for 1.0.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:22650565-0430-4c01-bc82-33d6fda8be12" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronRuby" rel="tag"&gt;IronRuby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Release" rel="tag"&gt;Release&lt;/a&gt;,&lt;a href="http://technorati.com/tags/OSCON" rel="tag"&gt;OSCON&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-8365420027701416090?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=_MxRB824nhs:LSwgVb2DMtU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=_MxRB824nhs:LSwgVb2DMtU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=_MxRB824nhs:LSwgVb2DMtU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=_MxRB824nhs:LSwgVb2DMtU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=_MxRB824nhs:LSwgVb2DMtU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=_MxRB824nhs:LSwgVb2DMtU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=_MxRB824nhs:LSwgVb2DMtU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/_MxRB824nhs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/_MxRB824nhs/ironruby-09-released.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">12</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/08/ironruby-09-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-7332682026707544851</guid><pubDate>Fri, 24 Jul 2009 01:08:00 +0000</pubDate><atom:updated>2009-07-23T18:13:40.130-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSCON</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><category domain="http://www.blogger.com/atom/ns#">Moonlight</category><title>IronRuby at OSCON 2009: Mono, Moonlight, and scripting open source apps</title><description>&lt;p&gt;Today I’ll be giving a talk at &lt;a href="http://en.oreilly.com/oscon2009" target="_blank"&gt;OSCON 2009&lt;/a&gt; titled “IronRuby 0.9”. For any new readers, &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; is an Open Source implementation of the &lt;a href="http://ruby-lang.org" target="_blank"&gt;Ruby programming language&lt;/a&gt; for the &lt;a href="http://microsoft.com/NET" target="_blank"&gt;Microsoft .NET&lt;/a&gt; Framework; it brings the expressiveness of Ruby to .NET, and the capabilities of .NET to Ruby. I’ll walk you through the talk in this post:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Road to IronRuby 1.0 &lt;/li&gt;    &lt;li&gt;Running the same application on the desktop and in the browser, on most major platforms (Windows, Mac OS, Linux) and most major browsers (Firefox, Safari, Internet Explorer) &lt;/li&gt;    &lt;li&gt;Detour – Gestalt: Running Ruby and Python in the browser, again. &lt;/li&gt;    &lt;li&gt;Using code written in any C# and Python from Ruby without it feeling foreign. &lt;/li&gt;    &lt;li&gt;How IronRuby has improved in the past 6 months, and how you can help IronRuby become a 1.0 quality implementation. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Road to IronRuby 1.0&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;It’s been a long ride since &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; was announced alongside &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; at &lt;a href="http://videos.visitmix.com/MIX07/DEV02" target="_blank"&gt;MIX ‘07&lt;/a&gt;, but in a few days the 0.9 version will be available, and all eyes will be focused on getting it to 1.0. The &lt;a href="http://blog.jimmy.schementi.com/2009/03/ironruby-03-released.html" target="_blank"&gt;past&lt;/a&gt; &lt;a href="http://blog.jimmy.schementi.com/2009/05/ironruby-05-released.html" target="_blank"&gt;couple&lt;/a&gt; of versions &lt;a href="http://blog.jimmy.schementi.com/2009/07/ironruby-06-released.html" target="_blank"&gt;have made vast compatibility and performance improvements&lt;/a&gt;, and 0.9 marks the last set of major features that will be added to IronRuby. From now on, all IronRuby languages will be primarily focused on bug fixing and anything else the community deems necessary to call IronRuby a 1.0 release. These improvements be delivered as point-point releases (0.9.1, 0.9.2, etc) until &lt;strong&gt;you &lt;/strong&gt;decide it is ready to call 1.0.&lt;/p&gt;  &lt;p&gt;But we’ll dive into the numbers and metrics at the end; let’s talk about why IronRuby is useful in your toolkit.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Cross-platform, cross-browser Ruby implementation&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Whenever people hear .NET &lt;font color="#808080"&gt;[they first think about a top-level domain, but when in the context of “Microsoft”]&lt;/font&gt; they immediately think “Windows”. But &lt;a href="http://tirania.org/blog/" target="_blank"&gt;Miguel&lt;/a&gt; and the &lt;a href="http://mono-project.com/Main_Page" target="_blank"&gt;Mono&lt;/a&gt; team have shown that isn’t reality. They’ve built a open-source implementation of .NET which runs on Linux, Mac OS, and also Windows. They are also building a open-source Silverlight 2 implementation, called Moonlight, allowing Silverlight applications to run on Linux browsers supporting Mozilla’s plug-in architecture; Silverlight 2 runs on Intel Macs and Windows. Since IronRuby runs on .NET and Silverlight, it also runs on Mono and Moonlight. Let’s explore that a bit:&lt;/p&gt;  &lt;p&gt;With Microsoft.NET and Mono, IronRuby can run on Windows and Linux (anywhere Mono runs, including Mac OS).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/SmkJfUwHRYI/AAAAAAAAALA/fgGEoGaGVaE/s1600-h/ir-mono%5B4%5D.png"&gt;&lt;img style="display: inline" title="ir-mono" alt="ir-mono" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SmkJfxjORNI/AAAAAAAAALI/0HlD5hTs4yk/ir-mono_thumb%5B2%5D.png?imgmax=800" width="400" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You’ll notice that real Ruby code runs, it’s running on a Unix environment on Mono, and .NET types can be accessed in a Ruby-esk way, even generic types.&lt;/p&gt;  &lt;p&gt;Because IronRuby integrates directly with .NET, you can use any existing .NET code from IronRuby. This means that any frameworks, be them Windows Forms, Windows Presentation Foundation (WPF), or GTK(#), can be used from IronRuby because .NET and Mono [respectively] have CLI bindings for these frameworks. Mono even has a Windows Forms implementation that translates to GTK, so the same application can run unmodified on both implementations. Mono only supports the “Silverlight” subset of WPF, which I’ll elaborate on in a bit.&lt;/p&gt;  &lt;p&gt;There’s also a tiny subset of .NET which is part of a browser plug-in called Silverlight; Microsoft’s implementation runs on Windows and Mac, in Firefox, Safari, and Internet Explorer (though any browser which supports ActiveX, Mozilla’s, or Safari’s plug-in architecture should work fine, like Opera or Chrome).&lt;/p&gt;  &lt;p&gt;The IronRuby tutorial application runs as a WPF desktop application (on the left), as well as Silverlight application (on the right).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/SmkJgq8i2-I/AAAAAAAAALM/h2boWHHuRPQ/s1600-h/tut-wpf-sl%5B4%5D.png"&gt;&lt;img style="display: inline" title="tut-wpf-sl" alt="tut-wpf-sl" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SmkJhCwlSyI/AAAAAAAAALQ/vbTlFbJjlgY/tut-wpf-sl_thumb%5B2%5D.png?imgmax=800" width="400" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Also, &lt;a href="http://channel9.msdn.com/posts/mtaulty/Silverlight-3-Running-Out-Of-Browser-Apps-on-the-Macintosh/" target="_blank"&gt;Silverlight 3 supports running applications out of the browser&lt;/a&gt;, very simply on Windows and Mac OS by right-clicking on the Silverlight application and selecting “Install”.&lt;/p&gt;  &lt;p&gt;Through Moonlight the IronRuby tutorial app also runs on Linux:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/SmkJh0YYXMI/AAAAAAAAALU/AhamxrZzaJc/s1600-h/tut-moon%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tut-moon" border="0" alt="tut-moon" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SmkJiYWcHlI/AAAAAAAAALY/uIsilwgKEIg/tut-moon_thumb%5B6%5D.png?imgmax=800" width="404" height="281" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Mono also supports running Moonlight applications through GTK on the desktop, just as a WPF application would work. While direct support isn’t in current daily builds of Moonlight, &lt;a href="http://tirania.org/blog/archive/2009/Jul-20.html" target="_blank"&gt;Miguel shows how easy it is to make the same code target the browser with Moonlight and the Linux desktop with Mono&lt;/a&gt;, just using C# code:&lt;/p&gt; &lt;script src="http://gist.github.com/152611.js"&gt;&lt;/script&gt;  &lt;p&gt;Note: the latest Moonlight stable release will not work for IronRuby, you must install the latest Moonlight build from their build bot: &lt;a title="http://sublimeintervention.com:8123/GetFile.aspx?id=11487919" href="http://sublimeintervention.com:8123/GetFile.aspx?id=11487919"&gt;http://sublimeintervention.com:8123/GetFile.aspx?id=11487919&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Detour: &lt;/font&gt;&lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;&lt;font color="#ff8000"&gt;Gestalt&lt;/font&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt; –- Ruby and Python in the browser&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;My last blog-post talks about a new prototype from the &lt;a href="http://visitmix.com/Lab" target="_blank"&gt;MIX Online Lab&lt;/a&gt; called &lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;Gestalt&lt;/a&gt;, which lets you write Ruby and Python in place of JavaScript – literally in &amp;lt;script&amp;gt; tags. Here’s a very simple example:&lt;/p&gt; &lt;script src="http://gist.github.com/151756.js"&gt;&lt;/script&gt;  &lt;p&gt;It uses Silverlight to do this, so this will work in Moonlight as well.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Dynamic and Static language interop&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;IronRuby has great integration with the .NET framework APIs, so C#/VB code can be called from IronRuby without it feeling like “interop”. C# can also call IronRuby through the &lt;a href="http://dlr.codeplex.com" target="_blank"&gt;Dynamic Language Runtime&lt;/a&gt; (DLR) Hosting APIs. However, in .NET 4.0 dynamic method dispatch is part of C#, so calling IronRuby from C# is just as easy as a C# method call. Being that IronRuby is built on the DLR, it can interoperate with other DLR languages just as easily, so Python and Ruby play along nicely today, and future DLR languages as well.&lt;/p&gt;  &lt;p&gt;A simple way to show that capability is by writing a unit test for a class in .NET; let’s pick “Stack”:&lt;/p&gt; &lt;script src="http://gist.github.com/153361.js"&gt;&lt;/script&gt;  &lt;p&gt;As you can see, creating .NET types, calling methods on .NET classes, and all the other language features Ruby has work against .NET types (even re-opening .NET classes).&lt;/p&gt;  &lt;p&gt;To show the reverse, lets look at a very simple &lt;a href="http://en.wikipedia.org/wiki/REPL" target="_blank"&gt;REPL&lt;/a&gt; implementation:&lt;/p&gt; &lt;script src="http://gist.github.com/153380.js"&gt;&lt;/script&gt;  &lt;p&gt;In less than 100 lines of code, you have a program that runs arbitrary Python and Ruby code. The DLR hosting API lets you run dynamic language code from a static language just from strings.&lt;/p&gt;  &lt;p&gt;Expanding on these ideas, let us give the experience a upgrade to the 21st century. &lt;a href="http://www.iunknown.com/2009/05/dynamic-languages-at-teched-2009.html" target="_blank"&gt;John Lam has shown this before at TechEd 2009&lt;/a&gt;: an editor that can double as a REPL.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gist.github.com/152872" target="_blank"&gt;&lt;img style="display: inline" title="repl-lib" alt="repl-lib" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SmkJijg10GI/AAAAAAAAALc/emG_oamAfXY/repl-lib%5B5%5D.png?imgmax=800" width="339" height="490" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/jschementi/repl-lib" target="_blank"&gt;Downlaod it here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This seems like a great idea, and it is even better once you start using it. It works like a normal editor, but selecting a block of code and pressing ctrl-e will run the code, showing the output directly below selected code as a comment, and ctrl-enter runs the current line. The code that gets run gets syntax highlighted. There is no need to have up-down-cursor history, as it’s all right there in the editor. If you need to modify something you’ve already run just, just modify it in the editor and re-run it! This integrates the editor-repl experience, making it a very valuable tool. &lt;/p&gt;  &lt;p&gt;Note: this is not a new idea by any means, as &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt; does something similar, but no one seems to explain this as an upgrade to your traditional REPL.&lt;/p&gt;  &lt;p&gt;Using this editor, it can be integrated into any .NET project as a lightweight way to experiment with adding scripting support. Using the hosting ideas I presented before, an application written in C# could use IronRuby to allow users to write applications against their object model, or extend it at runtime. Here’s a small example of hosting this editor in Witty, an open-source Twitter client running on .NET:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gist.github.com/152877"&gt;&lt;img style="display: inline" title="witty-scripting" alt="witty-scripting" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SmkJjIFLIYI/AAAAAAAAALg/5HtJOC--4ek/witty-scripting%5B5%5D.png?imgmax=800" width="400" height="202" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/jschementi/irwitty" target="_blank"&gt;You can get this version of Witty from GitHub&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;While it is great that you can so easily add scripting into a .NET application, it ends up exposing the design deficiencies in the application being scripted. In Witty’s case, the Twitter class (T) is very good, but the Window class (U) isn’t in good shape, as there are a ton of methods on the type, and it’s unclear how they should be used to drive the UI. &lt;a href="http://twitter.com/jongalloway/statuses/2774402229" target="_blank"&gt;Jon Galloway wants to merge this into Witty&lt;/a&gt;, so hopefully some of these refactorings can be made to enable scripting better.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;I extend this offer to all open-source .NET/Mono projects – if you want to improve your architecture and add scripting support, please let me know and I’ll help out.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;It's worth noting that .NET 4.0, the next version of the .NET framework, C# supports a &amp;quot;dynamic&amp;quot; keyword which will let you call Ruby or Python (or any DLR language) just by using method calls.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Project status&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://ironruby.info"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/SmkJjpyKYmI/AAAAAAAAALk/J9Hng_e0B4I/image%5B16%5D.png?imgmax=800" width="400" height="89" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Compatibility is really good at this point. We run the &lt;a href="http://ironruby.info" target="_blank"&gt;RubySpec test suite, passing at (85%)&lt;/a&gt; and the test suites from popular Ruby frameworks, including Rails, Rake, RSpec, and RubyGems, on every check-in, and can run pretty substantial Rails applications. Increasing compatibility bugs will definitely be the focus of the point releases approaching 1.0; mainly based on what you tell us needs fixing.&lt;/p&gt;  &lt;p&gt;This upcoming version will boast support for the &lt;a href="http://github.com/shri/ironruby/commit/5fb483dd13b8c0c950627e9624973e4fa60cf784" target="_blank"&gt;Win32OLE&lt;/a&gt; library, making existing Ruby applications with interact with COM work as they do in MRI, like &lt;a href="http://wtr.rubyforge.org/" target="_blank"&gt;Watir&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/SmkJkNq4RwI/AAAAAAAAALo/U9KruHidO7c/s1600-h/image%5B15%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/SmkJkv1QyrI/AAAAAAAAALs/AK3KLnqDduE/image_thumb%5B9%5D.png?imgmax=800" width="400" height="297" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Performance is also in a very good place. This past version has pushed on the Ruby benchmark suite, and now we are &amp;gt;= 2x better than MRI on almost all benchmarks. Those numbers will be published on http://ironruby.info around the same time IronRuby 0.9 comes out. The above image shows that IronRuby (in blue) is normally significantly faster than MRI (in red), except for a handful of cases. The is not the end-all-be-all metric to measuring performance, but it’s nice to see IronRuby continuing to improve here.&lt;/p&gt;  &lt;p&gt;In prior releases, Rails startup has gotten dramatically better, going from 80+ seconds in March to ~20 seconds now. &lt;a href="http://blog.jimmy.schementi.com/2009/07/ironruby-06-released.html" target="_blank"&gt;Read more about Rails performance is the IronRuby 0.6 release.&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Interesting IronRuby usages&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Now that IronRuby is approaching 1.0, we're seeing very interesting usages of Ruby with .NET:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;AutoCAD scripting -- Kean Walmsley &lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/thbar/magic" target="_blank"&gt;magic DSL for Windows UI frameworks&lt;/a&gt; -- &lt;a href="http://github.com/thbar" target="_blank"&gt;Thibaut Barrère&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Automated conversion of an app written in an in-house language (lang runs on FORTRAN77) and MOTIF UI “to” IronRuby and WPF -- Robert Brotherus &lt;/li&gt;    &lt;li&gt;Point of Sale application based on WPF, IronRuby and FoxPro -- &lt;a href="http://twitter.com/nightshade427" target="_blank"&gt;Nick Rickets&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you know of more interesting usages, please send them my way!&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Thanks!&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Thanks for reading this far! Keep an eye out on this blog and the &lt;a href="http://ironruby.net" target="_blank"&gt;ironruby website&lt;/a&gt; for the upcoming 0.9 release.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:888f4617-ecd4-40cd-bfcb-a0fedd7808a8" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronRuby" rel="tag"&gt;IronRuby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/OSCON" rel="tag"&gt;OSCON&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mono" rel="tag"&gt;Mono&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Moonlight" rel="tag"&gt;Moonlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-7332682026707544851?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=SHl7aUzmkFI:miXlBRGY_d0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=SHl7aUzmkFI:miXlBRGY_d0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=SHl7aUzmkFI:miXlBRGY_d0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=SHl7aUzmkFI:miXlBRGY_d0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=SHl7aUzmkFI:miXlBRGY_d0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=SHl7aUzmkFI:miXlBRGY_d0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=SHl7aUzmkFI:miXlBRGY_d0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/SHl7aUzmkFI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/SHl7aUzmkFI/ironruby-at-oscon-2009-mono-moonlight.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/07/ironruby-at-oscon-2009-mono-moonlight.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-8442058915742893952</guid><pubDate>Wed, 22 Jul 2009 03:06:00 +0000</pubDate><atom:updated>2009-07-21T20:06:15.422-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><category domain="http://www.blogger.com/atom/ns#">DLR</category><title>Gestalt: Ruby and Python in the browser, again</title><description>&lt;p&gt;Today &lt;a href="http://visitmix.com/Lab" target="_blank"&gt;Mix Online Lab&lt;/a&gt; released a prototype implementation of Ruby and Python in the browser, named &lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;Gestalt&lt;/a&gt;. Feeling a bit of de ja vu? If not, you can ignore this post and just &lt;a href="http://visitmix.com/labs/gestalt/learnmore/" target="_blank"&gt;see what it’s all about&lt;/a&gt;. Regardless, I suggest you read on.&lt;/p&gt;  &lt;p&gt;A simple Ruby-based web page using Gestalt would look like this:&lt;/p&gt; &lt;script src="http://gist.github.com/151756.js"&gt;&lt;/script&gt;  &lt;p&gt;&lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;Gestalt&lt;/a&gt; adds “ruby” and “python” to the languages supported by the &amp;lt;script&amp;gt; tag. You can also include other files rather than writing the code in the HTML page:&lt;/p&gt; &lt;script src="http://gist.github.com/151758.js"&gt;&lt;/script&gt;  &lt;p&gt;My first reactions when hearing about this project was “Holy crap, wow, they got Ruby and Python running in the browser, that’s freakin’ awesome!” But I work on the &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; integration with &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt;, already letting you write Ruby and Python in the browser instead of JavaScript. Hmm. Not to my surprise, Gestalt uses IronRuby and IronPython in Silverlight to accomplish this. But damn, wouldn’t it be awesome if this is how the world worked?&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#ff8000"&gt;For any new readers, &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt; are implementations of Ruby and Python for the .NET Framework, utilizing the &lt;a href="http://dlr.codeplex.com" target="_blank"&gt;Dynamic Language Runtime&lt;/a&gt; (DLR).&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;Gestalt&lt;/a&gt; is a effort to show what it would be like if there were other &lt;strong&gt;&lt;font color="#ff8000"&gt;standard&lt;/font&gt;&lt;/strong&gt; languages in the browser, other than just JavaScript. The Mix Online Lab focuses on using Microsoft technology in ways that make non-Microsoft developers interested, so this project is right up their alley. They wanted to showcase the DLR languages in Silverlight as a way of showing how our efforts can make the web a better place.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;So what are the difference between IronRuby and IronPython’s Silverlight integration and what Gestalt provides?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Again, you can already make IronRuby and IronPython based applications in Silverlight; Gestalt just puts a new spin on how to do that. IronRuby and IronPython use the XAP file for the application packaging, including script files, and provides a development-tool called Chiron to auto-package the app, providing the edit-refresh experience that is familiar for a web browser app. Chiron is also used to write the package to disk so it can be deployed to any web-server. This model works great for getting new and existing Ruby and Python programs running in Silverlight, as the packaging is transparent to a developer. And it doesn’t fight Silverlight’s packaging conventions, so using Silverlight-specific features will be straight-forward from a DLR language.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://visitmix.com/Labs/gestalt/" target="_blank"&gt;Gestalt&lt;/a&gt; takes a much different approach using &amp;lt;script&amp;gt; tags, making the integration much more familiar to current JavaScript developers. They also handle all the Silverlight &amp;lt;object&amp;gt; tag stuff in gestalt.js, taking away the need to host Silverlight yourself.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Why Gestalt is interesting to me&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;The thing that I really like about Gestalt is that Chiron is not needed for development. Just edit the file and refresh the browser. No need to run something in the background generating a XAP file. Gestalt.js detects which languages the page’s &amp;lt;script&amp;gt; tags use, and picks a pre-packaged Gestalt-*.xap file, one for Ruby, one for Python, one for both, and one for none. This means your application could look something like this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;index.html (can contain Python and/or Ruby code) &lt;/li&gt;    &lt;li&gt;gestalt/      &lt;ul&gt;       &lt;li&gt;gestalt.js &lt;/li&gt;        &lt;li&gt;gestalt-rb.xap &lt;/li&gt;        &lt;li&gt;gestalt-py.xap &lt;/li&gt;        &lt;li&gt;gestalt.xap &lt;/li&gt;        &lt;li&gt;gestalt-x.xap &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Very clean. The gestalt directory is just dropped onto your web-server (to be shared among all your applications), and gestalt.js is referenced from your HTML file, and your good to go. No running Chiron.exe, or installing Mono on the Mac to run Chiron.exe. I’m jealous.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;So what’s the catch?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;While Gestalt is a much simpler to get started writing Ruby and Python applications in the browser, it does not support a major feature of Ruby and Python – accessing something like a file-system. For example, including other files at runtime uses the language’s underlying File access to read the file in and run it’s contents. Ruby uses “require” or “load”, and python uses “import” to do this.&lt;/p&gt;  &lt;p&gt;IronRuby and IronPython in Silverlight normally support this, as all file reads are redirected to the XAP file. Since Gestalt’s XAP files are opaque to the the developer, they do not support File access. This is only an issue when you want to use existing Ruby or Python code in the browser. For example, existing code usually has more dependencies, especially into portion of the language’s standard library which is written the language itself. Usually you’d just put these files in the folder that Chiron is auto-xapping for you, and that’s it. However, Gestalt has no way of doing this today.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Making it better&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;A possible solution is to just cache the contents of &amp;lt;script src&amp;gt; tags, and use the languages path resolution mechanism to test if those files have already been downloaded. If it finds a match, serve the file’s contents. If not, it could either fail fast and say that your missing a &amp;lt;script src&amp;gt; reference, or it &lt;em&gt;COULD &lt;/em&gt;download the file synchronously (and still cache it) and display a warning that you are missing a &amp;lt;script src&amp;gt; reference.&lt;/p&gt;  &lt;p&gt;Unfortunately, this only works for script files; what if you just want to download a txt file? Having &amp;lt;script src=”foo.txt”&amp;gt; is not going to fly. Maybe using &amp;lt;link&amp;gt; tags could work?&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;Why can’t we just download them synchronously?&lt;/strong&gt;&lt;/font&gt; No! Though the current bits do have a synchronous downloading mode, it’s only experimental and should not be used in production. Synchronous downloads are significantly slower since only one download can occur at a time. Downloads need to be synchronous since “opening a file” is expected to block until it is complete. Also, IronRuby/IronPython do not support &lt;a href="http://en.wikipedia.org/wiki/Continuation" target="_blank"&gt;continuations&lt;/a&gt; (for good reasons), so the code cannot be “paused” while a file is downloaded, and then be “resumed” when done. And even if they did support continuations (as there is a way to get it working for the very specific case of file access), the downloads would still all occur one at a time, making the loading much slower. So &lt;font color="#ff8000"&gt;&lt;strong&gt;downloading “on-demand” for file reads is not a good solution&lt;/strong&gt;&lt;/font&gt;, and that’s precisely why the browser doesn’t do that today … so let’s not fight it.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Is Gestalt going to always be separate from IronRuby and IronPython?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;No! :) While Gestalt’s first release was best to be separate, I’m very interested in merging the ideas Gestalt has back into Microsoft.Scripting.Silverlight … &lt;a href="http://lists.ironpython.com/pipermail/users-ironpython.com/2009-July/010813.html" target="_blank"&gt;in-fact discussions have already begun on the IronPython Mailing List&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In short, Ruby and Python Silverlight applications are a bit too complex, and Gestalt shows us that it doesn’t need to be that way. &lt;a href="http://github.com/jschementi/ironruby/commit/da6b54e226adfd3a18d8ad98d618c2350ebd8351" target="_blank"&gt;Work has already begun to merge Gestalt and Microsoft.Scripting.Silverlight&lt;/a&gt;, so play with Gestalt and let me know what you think!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a1a7afdb-3168-465b-bb90-b04b0cfa1b40" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronRuby" rel="tag"&gt;IronRuby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IronPython" rel="tag"&gt;IronPython&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DLR" rel="tag"&gt;DLR&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Browser" rel="tag"&gt;Browser&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ruby" rel="tag"&gt;Ruby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Python" rel="tag"&gt;Python&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dynamic+languages" rel="tag"&gt;dynamic languages&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-8442058915742893952?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=BElVOHJNip4:3VIfjNAxZHc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=BElVOHJNip4:3VIfjNAxZHc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=BElVOHJNip4:3VIfjNAxZHc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=BElVOHJNip4:3VIfjNAxZHc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=BElVOHJNip4:3VIfjNAxZHc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=BElVOHJNip4:3VIfjNAxZHc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=BElVOHJNip4:3VIfjNAxZHc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/BElVOHJNip4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/BElVOHJNip4/gestalt-ruby-and-python-in-browser.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/07/gestalt-ruby-and-python-in-browser.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-1226883076398775337</guid><pubDate>Thu, 02 Jul 2009 19:08:00 +0000</pubDate><atom:updated>2009-07-02T12:30:57.980-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Cucumber</category><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">Release</category><category domain="http://www.blogger.com/atom/ns#">Performance</category><title>IronRuby 0.6 Released!</title><description>&lt;a href="http://chemistry.about.com/od/fireworkspyrotechnics/ig/Fireworks-Displays/Fireworks-Display.-1ce.htm" target="_blank"&gt;&lt;img src="http://www.stgabriels.co.uk/_files/images/fireworks2.jpg" width="400" height="341" /&gt;&lt;/a&gt;   &lt;p align="center"&gt;The IronRuby team is pleased to announce a new release of IronRuby: IronRuby 0.6!&lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="5"&gt;&lt;strong&gt;&lt;a href="http://ironruby.net/Download" target="_blank"&gt;Download IronRuby 0.6&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/ironruby/ironruby/zipball/v0.6.0" target="_blank"&gt;You can also get the source code for this release&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Staying true to our &amp;quot;Conference-driven development schedule,&amp;quot; this release is in conjunction with ... wait, there is no conference this time! Just a good ol' monthly release of &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt;, chock full of awesomeness. And just so happens to be the 4th of July weekend, so hopefully you have some downtime this weekend and can give the new release a spin.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000" size="4"&gt;What's in the Release?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Performance has been a major focus to this release, getting startup time quicker and optimizing built-in types. There has been more progress with Ruby compatibility (&lt;a href="http://github.com/aslakhellesoy/cucumber" target="_blank"&gt;Cucumber&lt;/a&gt; works!) and .NET interop. &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; binaries are back in the release, and there are a couple of samples to help you learn IronRuby.&lt;/p&gt;  &lt;p&gt;Most of these descriptions are from &lt;a href="http://blog.tomasm.net/" target="_blank"&gt;Tomas's&lt;/a&gt; very detailed code review emails, so thanks Tomas! For more detailed information, please see the &lt;a href="http://rubyforge.org/frs/shownotes.php?group_id=4359&amp;amp;release_id=36423" target="_blank"&gt;CHANGELOG&lt;/a&gt; (which includes all commit messages for the release ... not just &amp;quot;syncing to head of tfs&amp;quot;)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="#ir06lazymc"&gt;Lazy method compilation&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#ir06clrmember"&gt;CLR member enumeration&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#ir06gmpi"&gt;Generic-Method Parameter-Inference&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#ir06cucumber"&gt;Testing C# with Cucumber&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#ir06sl"&gt;Silverlight building and updated binaries&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#ir06samples"&gt;Samples&lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;a name="ir06lazymc"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Lazy method compilation&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Last release adaptive compilation was enabled for IronRuby, which uses a fast-to-start-up interpreter to start up the program, while code which gets run a lot is compiling on a background thread. This gave IronRuby significant performance improvements for large apps like &lt;a href="http://rubyonrails.org" target="_blank"&gt;Rails&lt;/a&gt;, &lt;font color="#ff8000"&gt;&lt;strong&gt;which has improved startup by 2.5 times&lt;/strong&gt;&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;This release we've added &amp;quot;lazy method transformation&amp;quot; to the bag of startup performance tricks. In IronRuby 0.5, a method was transformed to the DLR AST as soon as it was defined. IronRuby 0.6 postpones the transformation until the first time the method is called. This significantly improves startup time. For example (not NGEN'd):&lt;/p&gt; &lt;script src="http://gist.github.com/139394.js"&gt;&lt;/script&gt;  &lt;p&gt;This has made &lt;font color="#ff8000"&gt;&lt;strong&gt;Rails startup time 30% faster&lt;/strong&gt;&lt;/font&gt;, coming in approximately 20 seconds on my dual-core laptop running Windows 7.&lt;/p&gt;  &lt;h5&gt;&lt;a name="ir06clrmember"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;CLR member enumeration&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Now methods like &lt;code&gt;Module#instance_methods&lt;/code&gt;, etc, include CLR member names. Though it's a lot cooler than that. The array of methods returns contains strings for Ruby methods, and objects of type &lt;code&gt;IronRuby::Clr::Name&lt;/code&gt; to represent CLR methods that can be called by either the actual CLR name or a mangled (Ruby-esk) name. ClrName has methods &lt;code&gt;to_s&lt;/code&gt;, &lt;code&gt;to_sym&lt;/code&gt;, &lt;code&gt;to_str&lt;/code&gt;, &lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt;, &lt;code&gt;inspect&lt;/code&gt;, and &lt;code&gt;dump&lt;/code&gt; so that it can be used wherever a string can be used. The display string for the name uses single quotes so that you can easily distinguish CLR (dual) names from regular names (plain mutable strings). CLR strings display themselves as single quoted strings, so this fits nicely.&lt;/p&gt; &lt;script src="http://gist.github.com/139395.js"&gt;&lt;/script&gt;  &lt;p&gt;Even cooler, this works well for meta-programming:&lt;/p&gt; &lt;script src="http://gist.github.com/139397.js"&gt;&lt;/script&gt;  &lt;p&gt;A new set of define_method overloads, strongly typed to &lt;code&gt;ClrName&lt;/code&gt;, have been added to enable this. They define the real method using the &lt;code&gt;ruby_name&lt;/code&gt; and alias it using the &lt;code&gt;clr_name&lt;/code&gt;. So both &lt;code&gt;CompareTo&lt;/code&gt; and &lt;code&gt;compare_to &lt;/code&gt;calls are intercepted.&lt;/p&gt;  &lt;h5&gt;&lt;a name="ir06gmpi"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Generic-Method Parameters-Inference&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Thanks to some work by the IronPython team, IronRuby now has parameter inference for generic methods.&lt;/p&gt; &lt;script src="http://gist.github.com/139399.js"&gt;&lt;/script&gt;&lt;script src="http://gist.github.com/139398.js"&gt;&lt;/script&gt;  &lt;p&gt;This needs some more TLC before it works perfectly, but this lets you use simple LINQ methods from IronRuby.&lt;/p&gt; &lt;script src="http://gist.github.com/139603.js"&gt;&lt;/script&gt;  &lt;h5&gt;&lt;a name="ir06cucumber"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Testing C# with Cucumber&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;This release of IronRuby runs the Cucumber testing framework rather well. &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net" target="_blank"&gt;Try out Cucumber against some C# code&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Given a feature file (this being the addition.feature)&lt;/p&gt; &lt;script src="http://gist.github.com/139401.js"&gt;&lt;/script&gt;  &lt;p&gt;A step_definition file (calculator_steps.rb)&lt;/p&gt; &lt;script src="http://gist.github.com/139403.js"&gt;&lt;/script&gt;  &lt;p&gt;And a DLL:&lt;/p&gt; &lt;script src="http://gist.github.com/139405.js"&gt;&lt;/script&gt;  &lt;p&gt;Cucumber will test the addition feature:&lt;/p&gt;  &lt;pre&gt;3 scenarios (3 passed)
12 steps (12 passed)
0m0.753s&lt;/pre&gt;

&lt;h5&gt;&lt;a name="ir06sl"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Silverlight building and updated binaries&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;This release re-adds Silverlight binaries to IronRuby, contained in the &amp;quot;silverlight&amp;quot; directory of the release. These bits have been integrated from the &lt;a href="http://github.com/jschementi/agdlr" target="_blank"&gt;AgDLR project&lt;/a&gt;, and will be maintained in the IronRuby and IronPython source code repositories from now on. The AgDLR GitHub project will redirect to one of those for binaries for both languages in Silverlight. In addition, the &lt;a href="http://sdlsdk.codeplex.com" target="_blank"&gt;SDLSDK CodePlex site&lt;/a&gt; will be redirecting to the IronRuby and IronPython CodePlex sites, for downloads, discussion, and issue tracking. AgDLR was a little side project to add new features to DLR Silverlight applications, and play around with Git. I'm very happy to see it merged back in with the languages.&lt;/p&gt;

&lt;p&gt;Note: &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt; Silverlight assemblies are included directly in the release. They may be moved out to the separate package that contains IronPython desktop DLLs in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/ironruby/ironruby/commit/33211840f7482ffaa4970a6e630725fad2a70f5d" target="_blank"&gt;See the integration commit for more information&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another notable change is that you can now build Silverlight binaries out of IronRuby's GitHub repository very easily. Given that you have Silverlight installed at &lt;code&gt;C:\Program Files\Microsoft Silverlight\2.0.40115.0&lt;/code&gt;, this will build IronRuby for Silverlight:&lt;/p&gt;

&lt;pre&gt;msbuild Merlin/Main/Languages/Ruby/Ruby.sln
  /p:Configuration=&amp;quot;Silverlight Release
  /p:SilverlightPath=&amp;quot;C:\Program Files\Microsoft Silverlight\2.0.40115.0&lt;/pre&gt;

&lt;p&gt;You can also build IronPython for Silverlight in a similar manner. Aliases for this will be added soon, but if you need a custom build of the DLR languages for Silverlight, this is the way to do it.&lt;/p&gt;

&lt;h5&gt;&lt;a name="ir06samples"&gt;&lt;/a&gt;&lt;font color="#ff8000" size="3"&gt;Samples&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;Six samples are included in this release. The first three are desktop samples in the “/samples” directory. The last three are Silverlight samples in the “/silverlight/samples” directory:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/06/ironruby-tutorial.html " target="_blank"&gt;&lt;strong&gt;Tutorial&lt;/strong&gt; - An interactive IronRuby tutorial&lt;/a&gt; 

  &lt;br /&gt;&lt;a title="IronRuby example - Tutorial by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3681583787/"&gt;&lt;img alt="IronRuby example - Tutorial" src="http://farm3.static.flickr.com/2425/3681583787_3e4deb7c3b.jpg" width="400" height="366" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DiskUse&lt;/strong&gt; - A small WPF application which visualizes the disk usage for a particular directory 

  &lt;br /&gt;&lt;a title="IronRuby example - Disk Usage by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3682397770/"&gt;&lt;img alt="IronRuby example - Disk Usage" src="http://farm3.static.flickr.com/2463/3682397770_bdb0aca262.jpg" width="400" height="230" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IRPowerShell&lt;/strong&gt; - a small library and sample applications showing how to interact with PowerShell from IronRuby 

  &lt;br /&gt;&lt;a title="IronRuby example - minsysreq by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3681583811/"&gt;&lt;img alt="IronRuby example - minsysreq" src="http://farm3.static.flickr.com/2477/3681583811_12a38ff54c.jpg" width="400" height="126" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clock&lt;/strong&gt; – a simple Silverlight sample 

  &lt;br /&gt;&lt;a title="IronRuby Silverlight example - Clock by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3681583727/"&gt;&lt;img alt="IronRuby Silverlight example - Clock" src="http://farm3.static.flickr.com/2663/3681583727_b570016904.jpg" width="400" height="402" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Photoviewer&lt;/strong&gt; – do AJAX programming with IronRuby (ARAX =P) 

  &lt;br /&gt;&lt;a title="IronRuby Silverlight example - photoviewer by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3681583659/"&gt;&lt;img alt="IronRuby Silverlight example - photoviewer" src="http://farm4.static.flickr.com/3663/3681583659_61b9c793fb.jpg" width="400" height="317" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REPL&lt;/strong&gt; – Interactive console in the browser. 

  &lt;br /&gt;&lt;a title="IronRuby Silverlight example - REPL by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3682397706/"&gt;&lt;img alt="IronRuby Silverlight example - REPL" src="http://farm4.static.flickr.com/3652/3682397706_f0cde1f3c1.jpg" width="400" height="292" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;&lt;font color="#ff8000" size="3"&gt;Some more interesting changes:&lt;/font&gt;&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Improved DLR Interop: adds support for GetMember/SetMember with method_missing, Binary/Unary operators, and indexers. &lt;/li&gt;

  &lt;li&gt;Handling of CLR protected and private methods and properties &lt;/li&gt;

  &lt;li&gt;Reimplemented File.expand_path such that it does not use System.IO.Path. &lt;/li&gt;

  &lt;li&gt;This allows us to get better compatibility with MRI. The motivating reason was &lt;/li&gt;

  &lt;li&gt;that RSpec does File.expand_path(&amp;quot;filename:linenumber&amp;quot;) &lt;/li&gt;

  &lt;li&gt;Improves the implementation of singleton method dispatch. &lt;/li&gt;

  &lt;li&gt;These changes improve running time of specs significantly (2x) &lt;/li&gt;

  &lt;li&gt;Renames Method, UnboundMethod#overloads (plural) to &lt;/li&gt;

  &lt;li&gt;Method, UnboundMethod#overload (singular). &lt;/li&gt;

  &lt;li&gt;The old name is still available for now and throws an exception. &lt;/li&gt;

  &lt;li&gt;Implements adaptively compiled rules &lt;/li&gt;

  &lt;li&gt;Improves performance of Array#- from quadratic algorithm to linear. &lt;/li&gt;

  &lt;li&gt;Improves implementation of RubyArray &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;&lt;font color="#ff8000" size="3"&gt;Bugs closed&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;Here are all 37 bugs closed since the last release (2009-05-19). &lt;a href="http://ironruby.codeplex.com/WorkItem/List.aspx" target="_blank"&gt;You can see more information about each one on CodePlex&lt;/a&gt;.&lt;/p&gt;

&lt;pre style="overflow: scroll"&gt;1521  Access is allowed to internal fields
1502  alias_method fails for :do
821   File.expand_path does not support a line number after filename
1509  Proc.to_s should include line number where the block was declared
1501  WinForms broken
1400  $? is not always Process::Status	
1345  load_assembly(&lt;partial_name&gt;) should work
1344  System.Action.new does not work
1306  Cannot call CLR constructor of builtin type
1184  public(:foo) does not work correctly for mixed-in methods
1085  Cannot call new on subtypes of builtin classes whose &amp;quot;new&amp;quot; method has optional arguments
1060  visibility of send :define_method
917   Passing a Ruby array to a .NET method that expects an IEnumerable derivative fails with GetEnumerator call
783   Assert in SetMethodBasesNoLock when calling #== on Ruby class inheriting from CLR class which overrides Equals
761   Wrong behavior when calling redefined methods on object instances
1470  Can't call the BigIntegerOverload of a method with a DefaultProtocol Attribute on the BigInteger attribute
1426  The located assembly's manifest definition does not match the assembly reference. (ctp dev10 beta1)
1441  Error with cyrillyc text in Sharepoint	
1352  Test Defects	
814   Allocator underfined for &lt;type&gt; (TypeError)
572   Error when running Cucumber examples with IronRuby
718   IronRuby ignores RUBYLIB environment variable
727   to_proc not working
1351  redist-libs should have rubygems-1.3.1	
466   ''.split(//, -1) returns [&amp;quot;&amp;quot;] instead of []	
940   Can't inherit from abstract classes	
1028  Missing conversion from Duration to Fixnum (ActiveSupport)?
374   irails Foo: undefined method for OpenSLL::Random.random_bytes
459   throw FileNotFoundException =&amp;gt; rescue Errno.NoEntryError
499   Pathname#cleanpath messes up the pathname
467   &amp;quot;igem install rails&amp;quot; fails
375   &amp;quot;ir script\server&amp;quot; causes a YAML parser error
461   Generic type conversion from Fixnum to Integer
674   autoload does not use File::SEPARATOR
1021  Time class instance
578   yield fails in eval'd code
605   Array#hash should properly handle recursive arrays&lt;/pre&gt;

&lt;h5&gt;&lt;font color="#ff8000" size="3"&gt;Enjoy!&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;Please test out IronRuby 0.6 and let us know if you have any issues. We hope you enjoy this release!&lt;/p&gt;

&lt;p&gt;-- The IronRuby team&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2ecdd2dc-79c7-43ba-bc42-a6988ab05145" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronRuby" rel="tag"&gt;IronRuby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Performance" rel="tag"&gt;Performance&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cucumber" rel="tag"&gt;Cucumber&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Testing" rel="tag"&gt;Testing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Release" rel="tag"&gt;Release&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ruby" rel="tag"&gt;Ruby&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-1226883076398775337?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=8j5Hui9FE2k:v1EuFEgoZ_U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=8j5Hui9FE2k:v1EuFEgoZ_U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=8j5Hui9FE2k:v1EuFEgoZ_U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=8j5Hui9FE2k:v1EuFEgoZ_U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=8j5Hui9FE2k:v1EuFEgoZ_U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=8j5Hui9FE2k:v1EuFEgoZ_U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=8j5Hui9FE2k:v1EuFEgoZ_U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/8j5Hui9FE2k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/8j5Hui9FE2k/ironruby-06-released.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/07/ironruby-06-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-1161296163964649056</guid><pubDate>Mon, 29 Jun 2009 07:55:00 +0000</pubDate><atom:updated>2009-06-29T00:55:41.455-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><title>Simple Python testing in Silverlight with unittest</title><description>&lt;p&gt;Since doing a &lt;a href="http://blog.jimmy.schementi.com/2009/03/testing-c-silverlight-apps-with.html" target="_blank"&gt;post about Ruby testing of Silverlight applications&lt;/a&gt;, I’ve felt a bit guilty about leaving Python fans in the dark. However, like Ruby, it takes very little work to run Python unit test frameworks in &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt;, since &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt; is a very compatible implementation of Python. Though my results aren’t as exhaustive as the &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; examples, here’s one simple example:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/europycon2009"&gt;&lt;font size="3"&gt;http://github.com/jschementi/europycon2009&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/europycon2009/zipball/master" target="_blank"&gt;zip download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://twitpic.com/8qp95"&gt;&lt;img style="display: inline" title="unittest-sl" alt="unittest-sl" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/SkhzfAoHhgI/AAAAAAAAAK8/dtOcQGKY6tU/unittest-sl_thumb%5B3%5D.png?imgmax=800" width="400" height="205" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The original example is from the &lt;a href="http://docs.python.org/library/unittest.html#basic-example" target="_blank"&gt;Python website’s unittest documentation&lt;/a&gt;. Very little bootstrapping is required to get this running in Silverlight; this is u1.py code that is the start-script for the Silverlight app, which runs the tests:&lt;/p&gt; &lt;script src="http://gist.github.com/137516.js"&gt;&lt;/script&gt;  &lt;p&gt;I did have to make a modification to &lt;a href="http://github.com/jschementi/europycon2009/blob/aa699c185a15f383bbee68f58fb5ae002de9b49b/u1/app/Lib/unittest.py#L862" target="_blank"&gt;unittest.py&lt;/a&gt;; removing a call to sys.exit since Silverlight doesn’t support that, and just returning the exit code. &lt;/p&gt;  &lt;p&gt;There’s also a GUI test runner (&lt;a href="http://pyunit.sourceforge.net/pyunit.html#GUI"&gt;http://pyunit.sourceforge.net/pyunit.html#GUI&lt;/a&gt;), so it might be interesting to port that to Silverlight to get a nicer test run graphic along with the console, but it’s great that the REPL enables this to just work =) It also helped me find some bugs with the REPL, which will make their way to the IronPython source code shortly.&lt;/p&gt;  &lt;p&gt;Let me know how it works for you. The next step is to tackle testing Silverlight C#/VB apps with Python.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db9ffb84-3699-472c-809f-0f696ccf3057" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronPython" rel="tag"&gt;IronPython&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Testing" rel="tag"&gt;Testing&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-1161296163964649056?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RnR1tYF1sHQ:dxZCGjtMDhA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RnR1tYF1sHQ:dxZCGjtMDhA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RnR1tYF1sHQ:dxZCGjtMDhA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=RnR1tYF1sHQ:dxZCGjtMDhA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RnR1tYF1sHQ:dxZCGjtMDhA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=RnR1tYF1sHQ:dxZCGjtMDhA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RnR1tYF1sHQ:dxZCGjtMDhA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/RnR1tYF1sHQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/RnR1tYF1sHQ/simple-python-testing-in-silverlight.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/06/simple-python-testing-in-silverlight.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-2060916483445214805</guid><pubDate>Tue, 23 Jun 2009 08:49:00 +0000</pubDate><atom:updated>2009-06-23T01:49:54.188-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><category domain="http://www.blogger.com/atom/ns#">tutorial</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><title>“The” IronRuby Tutorial</title><description>&lt;p&gt;Hidden in &lt;a href="http://github.com/ironruby/ironruby/commit/48d2bedfa0986a8ae906928a2006a3a82d2cd935" target="_blank"&gt;yesterday’s commit&lt;/a&gt; to &lt;a href="http://github.com/ironruby/ironruby" target="_blank"&gt;IronRuby’s GitHub repository&lt;/a&gt; is evidence of some polishing changes to the &lt;a href="http://github.com/ironruby/ironruby/tree/master/Merlin/Main/Languages/Ruby/Samples/Tutorial" target="_blank"&gt;IronRuby tutorial app&lt;/a&gt;, which I’d like to introduce to you peoples:&lt;/p&gt;  &lt;p&gt;&lt;a title="ironruby-tutorial by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3652831808/"&gt;&lt;img alt="ironruby-tutorial" src="http://farm4.static.flickr.com/3399/3652831808_802058ed68_o.png" width="400" height="378" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To run yourself:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://wiki.github.com/ironruby/ironruby/getting-the-sources" target="_blank"&gt;Get IronRuby from GitHub&lt;/a&gt; and &lt;a href="http://wiki.github.com/ironruby/ironruby/building" target="_blank"&gt;build it&lt;/a&gt; (in release mode preferably) &lt;/li&gt;    &lt;li&gt;&lt;code&gt;cd Merlin/Main/Languages/Ruby/Samples/Tutorial&lt;/code&gt; &lt;/li&gt;    &lt;li&gt;&lt;code&gt;ir.exe wpf_tutorial.rb&lt;/code&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Isn’t he/she/it a bute!? This app makes Ruby-based tutorials interactive, guiding you through the material with a &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; REPL console and other visual aids such as another window, or whatever the tutorial writer sees fit. There is also a tutorial runner for the command-line, and a exporter for static HTML.&lt;/p&gt;  &lt;p&gt;The IronRuby tutorial included covers topics such as using the interactive window, built-in libraries, exploring .NET libraries, generics, events, Windows Forms, and Windows Presentation Foundation.&lt;/p&gt;  &lt;p&gt;While the tutorial is currently no where near a complete guide to IronRuby, it’s a great place to get started. Also, the first two chapters of the &lt;a href="http://tryruby.hobix.com" target="_blank"&gt;TryRuby&lt;/a&gt; tutorial is included as well for testing reasons, but may or may not be ever finished … unless someone wants to make it work, more on how to do that later.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;But it can teach all by itself!&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;While the content of the tutorials can be awesome, and this app can teach the material very efficiently, it can never teach the real experience of building an app in IronRuby. So the IronRuby tutorial app is written in IronRuby as an example of doing all the things a tutorial can’t. Wow, very meta.&lt;/p&gt;  &lt;p&gt;Currently, the tutorial app itself covers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;User Interfaces in Windows Presentation Foundation &lt;/li&gt;    &lt;li&gt;Ruby as Data: the tutorial domain-specific language &lt;/li&gt;    &lt;li&gt;Testing a Ruby application with test-spec &lt;/li&gt;    &lt;li&gt;Developing a GUI application interactively &lt;/li&gt;    &lt;li&gt;Anything else we can cram into it in the future :) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These area will be covered in a series of future posts, so keep an eye out for them!&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Still plenty of work to be done&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;This app is far from done, so the exploration of IronRuby in WPF has just begun. Here are some known issues, so don’t complain about these =P&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The REPL doesn’t have any history via up/down arrow keys. &lt;/li&gt;    &lt;li&gt;The “Jump to another section” menu scrolls too much. This list can only be two items deep, so it's needs to change to arbitrary depth to have more nesting. &lt;/li&gt;    &lt;li&gt;The content isn’t totally complete, though the IronRuby tutorial is in great shape. If you have suggestions on topics, please let me know. &lt;/li&gt;    &lt;li&gt;Jumping between tutorials a bunch makes the memory usage increase to Rails-like proportions (160MB). Not sure why yet. :( &lt;/li&gt;    &lt;li&gt;The code isn’t the best, but it works. =P I’ll be reorganizing it in future posts about client development, but it serves its purpose for now. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course there are a ton of other things that could be done. See the &lt;a href="http://github.com/ironruby/ironruby/blob/4711ed849340406a44c75e7136ac98b2b97c0173/Merlin/Main/Languages/Ruby/Samples/Tutorial/TODO" target="_blank"&gt;TODO&lt;/a&gt; file for some ideas.&lt;/p&gt;  &lt;p&gt;Please try it out and let me know what you like about it, what you don’t like, and feel free to futz around with the code as well … contributions are welcome. Enjoy!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; color: gray; font-size: 10px; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:802be916-912e-4e7d-b2a6-dc5bd7e6dbb9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IronRuby" rel="tag"&gt;IronRuby&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/tutorial" rel="tag"&gt;tutorial&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-2060916483445214805?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=xdaNvJBEJAs:uP68uLJb0Ug:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=xdaNvJBEJAs:uP68uLJb0Ug:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=xdaNvJBEJAs:uP68uLJb0Ug:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=xdaNvJBEJAs:uP68uLJb0Ug:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=xdaNvJBEJAs:uP68uLJb0Ug:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=xdaNvJBEJAs:uP68uLJb0Ug:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=xdaNvJBEJAs:uP68uLJb0Ug:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/xdaNvJBEJAs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/xdaNvJBEJAs/ironruby-tutorial.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/06/ironruby-tutorial.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-4529322181438788063</guid><pubDate>Thu, 21 May 2009 01:45:00 +0000</pubDate><atom:updated>2009-05-20T18:47:19.473-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rails</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">RailsConf</category><title>IronRuby 0.5 Released</title><description>&lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/ShSyFrt2_UI/AAAAAAAAAKs/KV_RU0jiFaU/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/ShSyInwzfrI/AAAAAAAAAKw/eKrqocdNEMU/image_thumb2.png?imgmax=800" width="400" height="143" /&gt;&lt;/a&gt;I’m pleased to announce a new release of &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt;: &lt;strong&gt;&lt;a href="http://ironruby.net/Download" target="_blank"&gt;IronRuby 0.5&lt;/a&gt;!&lt;/strong&gt; &lt;/p&gt; &lt;style type="text/css"&gt;
.download_ironruby {
color: white; 
padding: 10px; 
border: 3px solid gray; 
background-color: #333;
display: block;
font-size: 18px;
text-decoration: none;
font-weight: bold;
text-align: center;margin: 20px 30px;

}
.download_ironruby:hover {
background-color: #555;
cursor: pointer;
}&lt;/style&gt;&lt;a class="download_ironruby" href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25902#DownloadId=68919" target="_blank"&gt;Download IronRuby 0.5&lt;/a&gt;   &lt;p align="center"&gt;&lt;a href="http://github.com/ironruby/ironruby/tree/v0.5.0" target="_blank"&gt;You can also check out the source code for this release&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Staying true to our &amp;quot;Conference-driven development schedule,&amp;quot; this release is in conjunction with &lt;a href="http://railsconf.org" target="_blank"&gt;RailsConf '09&lt;/a&gt;, where IronRuby was demonstrated running real Rails applications and deploying them on IIS. A ton of work has been done in this release to get real Ruby programs running well, like RubyGems, Rake, Sinatra, and Rails. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/05/ironruby-at-railsconf-2009.html" target="_blank"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;u&gt;Read more about IronRuby at RailsConf here&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Special thanks to &lt;a href="http://github.com/NRK" target="_blank"&gt;Daniele Alessandri&lt;/a&gt;, &lt;a href="http://github.com/Jirapong" target="_blank"&gt;Jirapong Nanta&lt;/a&gt;, and &lt;a href="http://github.com/rvernagus" target="_blank"&gt;Ray Vernagus&lt;/a&gt;, who contributed code during this release, and everyone else who has submitted bugs, updated the wikis, or built software on-top of IronRuby.&lt;/p&gt;  &lt;p&gt;Also, take a look at the &lt;a href="http://blog.jimmy.schementi.com/2009/05/ironruby-ctp-for-net-40-beta-1.html" target="_blank"&gt;IronRuby CTP for .NET 4.0 Beta 1&lt;/a&gt;, which has been released as part of &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx" target="_blank"&gt;Visual Studio 2010 Beta 1&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;What’s in the Release?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;A big language feature of this past release was adaptive compilation; the ability to start-up quicker with a fast interpreter, and then compile code that gets interpreted more than two times. &lt;font color="#ff8000"&gt;This brought Rails startup time down from 89 seconds to 34 seconds, giving Rails approximately 2.5x quicker startup&lt;/font&gt;. Since this compiles “hot” code, your Rails application will get faster after an initial set of requests. There is a lot more to do for performance, but this was a great accomplishment.&lt;/p&gt;  &lt;p&gt;Here are some more interesting changes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Removes ClrString. CLR strings are referred to as System::String &lt;/li&gt;    &lt;li&gt;Removes IronRuby library. &amp;quot;require 'IronRuby'&amp;quot; is no longer needed; IronRuby module is now a built-in module. &lt;/li&gt;    &lt;li&gt;Integer/Float operations for all CLR primitive numeric types &lt;/li&gt;    &lt;li&gt;System::Char and System::String methods so that they behave like an immutable UTF-8 encoded string &lt;/li&gt;    &lt;li&gt;Improves handling of BOM in 1.8 mode &lt;/li&gt;    &lt;li&gt;Debugger visualizer for RubyObject so that VS will display the result of to_s in the Watch window. &lt;/li&gt;    &lt;li&gt;Adds support for .NET operators (op_* special methods) &lt;/li&gt;    &lt;li&gt;Implements bitwise operators on flag enums &lt;/li&gt;    &lt;li&gt;Precompilation of simple Ruby method invocations &lt;/li&gt;    &lt;li&gt;Improves performance for file IO#read method. Previously we were 10x slower than MRI, now we are approx. 1.5-times faster. &lt;/li&gt;    &lt;li&gt;Tons of fixes to File, String, Array, and other built-in types to drive up RubySpec and Ruby application test-suite pass-rates. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For detailed information, please see the CHANGELOG (which is much more verbose now. including all commit messages for the release … not just &lt;a href="http://github.com/ironruby/ironruby/commit/66f3e5e68d76f6819478b24b012faa8a1cae0d20" target="_blank"&gt;syncing to head of tfs&lt;/a&gt;)&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Bugs closed&lt;/font&gt;&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=375" target="_blank"&gt;&amp;quot;ir script\server&amp;quot; causes a YAML parser error&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=467" target="_blank"&gt;&amp;quot;igem install rails&amp;quot; fails&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=578" target="_blank"&gt;yield fails in eval'd code&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=461" target="_blank"&gt;Generic type conversion from Fixnum to Integer&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=499" target="_blank"&gt;Pathname#cleanpath messes up the pathname&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=605" target="_blank"&gt;Array#hash should properly handle recursive arrays&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=614" target="_blank"&gt;ci_files set needed in mspec config&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=674" target="_blank"&gt;autoload does not use File::SEPARATOR&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=1021" target="_blank"&gt;Time class instance&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=545" target="_blank"&gt;__FILE__ doesn't return a canonicalized path&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;… and various old RubyForge bugs during the move to CodePlex &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;RubySpec status&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;IronRuby passed the 80% mark on RubySpec during this release:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/ShSyJwaJIfI/AAAAAAAAAK0/nZHWow5D_UA/s1600-h/image13.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/ShSyKkEg03I/AAAAAAAAAK4/Yezcl-LUwF8/image_thumb9.png?imgmax=800" width="400" height="85" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can see more IronRuby statistics on &lt;a href="http://ironruby.info"&gt;http://ironruby.info&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Also during this release IronRuby has been running other Ruby applications test-suites as part of individual developer tests and in continuous integration, such as RubyGems, Rails (including ActiveRecord, ActiveSupport, ActionPack), and Rake.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Next Release&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;The next release will push harder on application compatibility, especially Cucumber (which has been the most requested application), Rails, and all the other frameworks being tested currently.&lt;/p&gt;  &lt;p&gt;Also, the feature which makes IronRuby stand out, .NET integration, has next-to-no documentation, so that will large focus during this next release as well. Keep an eye on &lt;a href="http://ironruby.net/Documentation/.NET"&gt;http://ironruby.net/Documentation/.NET&lt;/a&gt;, but as I said, is very sparse at the moment.&lt;/p&gt;  &lt;p&gt;In the meantime, please test out &lt;a href="http://ironruby.net/download" target="_blank"&gt;IronRuby 0.5&lt;/a&gt; and &lt;a href="http://ironruby.codeplex.com/WorkItem/Create.aspx" target="_blank"&gt;let us know all the issues you find&lt;/a&gt;. Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-4529322181438788063?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=F8Um7Taf9EU:B2LDt4HY3kk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=F8Um7Taf9EU:B2LDt4HY3kk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=F8Um7Taf9EU:B2LDt4HY3kk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=F8Um7Taf9EU:B2LDt4HY3kk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=F8Um7Taf9EU:B2LDt4HY3kk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=F8Um7Taf9EU:B2LDt4HY3kk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=F8Um7Taf9EU:B2LDt4HY3kk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/F8Um7Taf9EU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/F8Um7Taf9EU/ironruby-05-released.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/05/ironruby-05-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-6485219791474018459</guid><pubDate>Thu, 21 May 2009 01:09:00 +0000</pubDate><atom:updated>2009-05-20T18:48:07.543-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET 4.0</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>IronRuby CTP for .NET 4.0 Beta 1</title><description>&lt;p&gt;We’re pleased to announce the release of the &lt;b&gt;&lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606" target="_blank"&gt;IronRuby CTP for .NET 4.0 Beta 1&lt;/a&gt;!&lt;/b&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606#DownloadId=68918" target="_blank"&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;u&gt;Download IronRuby CTP for .NET 4.0 Beta 1&lt;/u&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is our second preview of &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; running under the &lt;a href="http://dlr.codeplex.com"&gt;Dynamic Language Runtime&lt;/a&gt; that is built directly into a .NET 4.0 release! As before, this release allows you to use IronRuby objects and types as .NET 4.0 &lt;i&gt;dynamic&lt;/i&gt; objects from within C# and Visual Basic code. These binaries are roughly equivalent to the functionality found in &lt;i&gt;IronRuby 0.3&lt;/i&gt;. Please also note that the &lt;b&gt;IronRuby CTP for .NET 4.0 Beta 1&lt;/b&gt; will run only under &lt;b&gt;.NET 4.0 Beta 1&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;This release also includes the binaries for the &lt;b&gt;&lt;a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320"&gt;IronPython 2.6 CTP for .NET 4.0 Beta 1&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;To try out this preview release:&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install some variant of .NET 4.0 Beta 1 or Visual Studio 2010 Beta 1 from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ee2118cc-51cd-46ad-ab17-af6fff7538c9&amp;amp;displaylang=en"&gt;here&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Download the &lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606" target="_blank"&gt;release&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Follow any of the many dynamic walkthroughs online. &lt;a href="http://blogs.msdn.com/vbteam/archive/2008/12/17/walkthrough-dynamic-programming-in-visual-basic-10-0-and-c-4-0-lisa-feigenbaum.aspx" target="_blank"&gt;Here would be a good start&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-6485219791474018459?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=zcPT9q8rzCE:G8Xzq6AmmNg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=zcPT9q8rzCE:G8Xzq6AmmNg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=zcPT9q8rzCE:G8Xzq6AmmNg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=zcPT9q8rzCE:G8Xzq6AmmNg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=zcPT9q8rzCE:G8Xzq6AmmNg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=zcPT9q8rzCE:G8Xzq6AmmNg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=zcPT9q8rzCE:G8Xzq6AmmNg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/zcPT9q8rzCE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/zcPT9q8rzCE/ironruby-ctp-for-net-40-beta-1.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/05/ironruby-ctp-for-net-40-beta-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-2771449511312359785</guid><pubDate>Fri, 15 May 2009 00:06:00 +0000</pubDate><atom:updated>2009-05-19T23:18:49.677-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">IIS</category><category domain="http://www.blogger.com/atom/ns#">rails</category><category domain="http://www.blogger.com/atom/ns#">talks</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">SQLServer</category><category domain="http://www.blogger.com/atom/ns#">RailsConf</category><category domain="http://www.blogger.com/atom/ns#">Sinatra</category><title>IronRuby at RailsConf 2009</title><description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jschementi/3523843503/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="0975_DSC_0115" border="0" alt="0975_DSC_0115" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx1xlLRAI/AAAAAAAAAJE/hS0xAFriXkQ/0975_DSC_0115%5B12%5D.jpg?imgmax=800" width="400" height="167" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I spent last week at &lt;a href="http://en.oreilly.com/rails2009/" target="_blank"&gt;RailsConf 2009&lt;/a&gt; in Las Vegas representing the &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; team. I gave a talk there titled &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7883" target="_blank"&gt;IronRuby on Rails&lt;/a&gt;, and spent the 45 minutes talking about the benefits of IronRuby running Rails, or any other Ruby web framework, can provide. This write-up will walk through the four sections of the talk:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="#intro"&gt;Introduction&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#rails"&gt;IronRuby on Rails&lt;/a&gt;       &lt;ul&gt;       &lt;li&gt;&lt;a href="#sinatra"&gt;Other libraries and web frameworks&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="#sql"&gt;ActiveRecord SQLServer support&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="#iis"&gt;Deploying on IIS&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#mvc"&gt;IronRuby ASP.NET MVC&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="#project"&gt;Project status and roadmap&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/railsconf09/zipball/master" target="_blank"&gt;&lt;strong&gt;&lt;font size="4"&gt;Downloaded all demos&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;(&lt;a href="http://github.com/jschementi/railsconf09/raw/master/railsconf09-jschementi.ppt" target="_blank"&gt;get slides&lt;/a&gt;, &lt;a href="http://github.com/jschementi/railsconf09" target="_blank"&gt;or just visit GitHub page&lt;/a&gt;)&lt;/p&gt;  &lt;h4&gt;&lt;a name="intro"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;Introduction&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/bonguri/128765190/" target="_blank"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/Sgyx2Xf8ReI/AAAAAAAAAJI/-y1_UKSGxs4/image1.png?imgmax=800" width="150" height="101" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Last year, IronRuby was much like this sprout; much of the plumbing was there (xylem and phloem, if you will =P), but it has only just begun to be useful, like running Rails.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jeffjackson/2306771206/" target="_blank"&gt;&lt;img style="border-right-width: 0px; margin: 25px 5px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx2ikcMqI/AAAAAAAAAJM/k_ClDvPIEEQ/image2.png?imgmax=800" width="150" height="113" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Quickly we learned that &lt;strong&gt;&lt;font color="#ff8000"&gt;growing up&lt;/font&gt;&lt;/strong&gt; is hard to do. As IronRuby was dispatching it’s first Rails request for RailsConf 2008, it began to experience all the stresses of the outside world, like loading activesupport on startup, which loads almost everything in the Ruby standard library.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 25px 5px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/Sgyx26bmKiI/AAAAAAAAAJQ/TxbUiTuZJWE/image3.png?imgmax=800" width="150" height="112" /&gt; &lt;/p&gt;  &lt;p&gt;The good news is that IronRuby is maturing; meaningfully interacting with the world around it, and begin to get good at things. Startup has much improved, and can &lt;font color="#ff8000"&gt;&lt;strong&gt;run real Ruby programs like Rails, RubyGems, Rake, and Sinatra&lt;/strong&gt;&lt;/font&gt; (to name only a few relevant apps).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 25px 5px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx3Wqh9GI/AAAAAAAAAJU/kqtotu28RhU/image4.png?imgmax=800" width="150" height="114" /&gt; &lt;/p&gt;  &lt;p align="left"&gt;IronRuby’s &lt;em&gt;real world&lt;/em&gt;, the .NET framework,&lt;em&gt;&amp;#160;&lt;/em&gt;is different environment than the usual Ruby developer is used to, but IronRuby bridges the gap to bring the .NET framework to Ruby developers. An example of this is &lt;font color="#ff8000"&gt;&lt;strong&gt;deploying Ruby web applications just like other .NET framework web applications using IIS&lt;/strong&gt;&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://imagecache2.allposters.com/images/pic/38/018_3345~Childhood-Tom-is-a-True-Mack-Daddy-Pimp-Tom-Pimp-Posters.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgyx3mvWVGI/AAAAAAAAAJY/CUL4_8xBuqY/image51.png?imgmax=800" width="150" height="119" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Due to running real Ruby applications, and playing nice with .NET, &lt;strong&gt;&lt;font color="#ff8000"&gt;people are starting to notice us&lt;/font&gt;&lt;/strong&gt;. Community involvement is starting to pick up, and we’re getting closer to being a “real Ruby implementation”.&lt;/p&gt;  &lt;h4&gt;&lt;a name="rails"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;IronRuby running Rails&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;IronRuby running Rails is not new, but doing it well or completely – is. IronRuby can now run real Rails applications, rather than just toy-hello-world examples. &lt;font color="#ff8000"&gt;This &lt;strong&gt;does not&lt;/strong&gt; mean &lt;em&gt;IronRuby on Rails&lt;/em&gt; is ready for production, but it’s a great measure of forward progress&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a title="IronRuby running Rails by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3530612930/" target="_blank"&gt;&lt;img alt="IronRuby running Rails" src="http://farm3.static.flickr.com/2307/3530612930_8ea102c3ef.jpg" width="400" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/railsconf09/tree/master/4-pictures-rails" target="_blank"&gt;&lt;strong&gt;Get the source code&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;font size="1"&gt;Special thanks to &lt;a href="http://chadfowler.com/" target="_blank"&gt;Chad Fowler&lt;/a&gt; and &lt;a href="http://richkilmer.blogs.com/" target="_blank"&gt;Rich Kilmer&lt;/a&gt; for first building this sample!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;We’ve been tracking our Rails progress by running though all the different Rails development scenarios, like migrating a database, generating a model, etc. The &lt;a href="http://ironruby.net/Documentation/Rails" target="_blank"&gt;&lt;strong&gt;&lt;u&gt;Rails documentation page&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt; on the &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby website&lt;/a&gt;&amp;#160;&lt;font color="#ff8000"&gt;walks through setting up IronRuby to run Rails&lt;/font&gt;, and shows the various scenarios in action, as well as how to run the Rails test suite.&lt;/p&gt;    &lt;h5&gt;&lt;a name="sinatra"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;Other Ruby libraries and web frameworks&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;Rails is not the only thing IronRuby is tracking; we’re running &lt;a href="http://docs.rubygems.org/" target="_blank"&gt;RubyGems&lt;/a&gt;, &lt;a href="http://rake.rubyforge.org/" target="_blank"&gt;Rake&lt;/a&gt;, &lt;a href="http://www.sinatrarb.com/" target="_blank"&gt;Sinatra&lt;/a&gt;, &lt;a href="http://rack.rubyforge.org/" target="_blank"&gt;Rack&lt;/a&gt;, and a bunch more ever-increasing Ruby libraries to catch bugs, find performance issues, and use their test-suites to gather more metrics on IronRuby’s completeness. For example, the Sinatra-basesd &lt;a href="http://ironruby.info" target="_blank"&gt;ironruby.info&lt;/a&gt; website runs perfectly well on IronRuby:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx4NBKY3I/AAAAAAAAAJc/LUzrGgDM_0Q/s1600-h/ir-info%5B6%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="ir-info" alt="ir-info" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgyx4s4eZOI/AAAAAAAAAJg/J04Q1MDh5Fk/ir-info_thumb%5B4%5D.png?imgmax=800" width="400" height="107" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Also, for a while now IronRuby has been using and contributing to &lt;a href="http://rubyspec.org/" target="_blank"&gt;RubySpec&lt;/a&gt; to provide a standard-runnable Ruby specification. IronRuby’s latest numbers are available on &lt;a href="http://ironruby.info" target="_blank"&gt;ironruby.info&lt;/a&gt;.&lt;/p&gt; &lt;h5&gt;&lt;a name="sql"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;ActiveRecord support for SQL Server&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgyx43rNo7I/AAAAAAAAAJk/iZFseimS-l8/s1600-h/image%5B32%5D.png" target="_blank"&gt;&lt;img style="margin: 0px; display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx5TmSDzI/AAAAAAAAAJo/ISRHM-K618E/image_thumb%5B62%5D.png?imgmax=800" width="400" height="207" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/activerecord-mssql-adapter" target="_blank"&gt;&lt;strong&gt;&lt;font size="3"&gt;ActiveRecord SQLServer Adapter&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://ironruby.net/Documentation/Rails#setup-db" target="_blank"&gt;Installation instructions&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To run Rails, IronRuby uses a &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/default.aspx" target="_blank"&gt;SQLServer&lt;/a&gt; adapter for all &lt;a href="http://api.rubyonrails.org/files/vendor/rails/activerecord/README.html" target="_blank"&gt;ActiveRecord&lt;/a&gt; database interactions. This adapter will work against either SQLServer or SQLServer Express (&lt;a href="http://www.microsoft.com/express/sql/download/" target="_blank"&gt;which is a free download&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;ActiveRecord is useful outside Rails, and especially to a .NET developer for interacting with SQLServer. Using Ruby to manage the evolution of a schema through migrations is extremely simple and takes the pain out of doing database development. This is an example of a migration which adds a “people” table (and knows how to undo itself).&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/111555.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ar.rubyonrails.org/classes/ActiveRecord/Migration.html" target="_blank"&gt;&lt;em&gt;You can read more about migrations in the ActiveRecord documentation&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Once your database is created by the above migration, you can fetch and manipulate the data inside of a Ruby REPL:&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/111557.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;Also, using ActiveRecord in a desktop application is pretty straight-forward. The following is an WinForms application which databinds an DataGrid to the ActiveRecord “Person” class.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgyx5ikSCJI/AAAAAAAAAJs/Y8gUDmsFYw4/s1600-h/image%5B37%5D.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx5-FoaRI/AAAAAAAAAJw/FHh3Ipgpgd0/image_thumb%5B67%5D.png?imgmax=800" width="359" height="85" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/railsconf09/tree/master/8-ardb" target="_blank"&gt;&lt;strong&gt;Get the source code&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;a name="iis"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;Deploying Rack-based Ruby Application on IIS&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Being able to run real Ruby applications is great, but what about deploying them? Most Ruby apps are web-based, so in this case deployment means getting the application on a production web-server and database server. The database server is already covered by SQLServer, so wouldn’t it be great to use &lt;a href="http://www.iis.net/" target="_blank"&gt;IIS&lt;/a&gt; as the web-server? &lt;/p&gt;  &lt;p&gt;Of course ...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx6bYVaQI/AAAAAAAAAJ0/AFn-9zfVUG8/s1600-h/image%5B35%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/Sgyx6vPkGKI/AAAAAAAAAJ4/q78YeOD9lJw/image_thumb%5B65%5D.png?imgmax=800" width="400" height="111" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/ironruby/tree/master/Merlin/Main/Hosts/IronRuby.Rack" target="_blank"&gt;&lt;strong&gt;&lt;font size="3"&gt;ironruby-rack: deploy Ruby web applications on IIS&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://rack.rubyforge.org/" target="_blank"&gt;Rack&lt;/a&gt; is a Ruby web-server interface which almost all Ruby web frameworks build on-top of, like &lt;a href="http://rubyonrails.org/" target="_blank"&gt;Rails&lt;/a&gt;, &lt;a href="http://www.sinatrarb.com/" target="_blank"&gt;Sinatra&lt;/a&gt;, and &lt;a href="http://camping.rubyforge.org" target="_blank"&gt;Camping&lt;/a&gt;. This package enables and Rack-based Ruby application to run on IIS. Today this is only possible for Ruby applications through &lt;a href="http://mvolo.com/blogs/serverside/archive/2007/02/18/10-steps-to-get-Ruby-on-Rails-running-on-Windows-with-IIS-FastCGI.aspx" target="_blank"&gt;FCGI&lt;/a&gt;, where this implementation integrates directly with &lt;a href="http://www.asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; (through a &lt;a href="http://msdn.microsoft.com/en-us/library/ms227675(VS.80).aspx" target="_blank"&gt;HttpHandler&lt;/a&gt;), so your application will be “running” whenever IIS is.&lt;/p&gt;  &lt;p&gt;If your organization already has an IIS knowledgebase, you probably want to utilize it. Deploying this way requires no retraining, as this solution is purely ASP.NET based; no throwing away of experience. It’s also a great way to sneak Ruby into your organization.&lt;/p&gt;  &lt;p align="left"&gt;This project is fairly new, so if you want to use it please let me know and I help with any issues.&lt;/p&gt;  &lt;h4&gt;&lt;a name="mvc"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;IronRuby ASP.NET MVC&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Another way to get a Ruby web application running on .NET is to use ASP.NET directly. While there is no IronRuby support for ASP.NET WebForms (IronRuby in .aspx pages), IronRuby &lt;strong&gt;does&lt;/strong&gt; have support for building ASP.NET MVC applications.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx65wEgBI/AAAAAAAAAJ8/ibbI-eerAPU/s1600-h/image%5B42%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx7VHyELI/AAAAAAAAAKA/1bkxYouZMeo/image_thumb%5B70%5D.png?imgmax=800" width="400" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/ironrubymvc" target="_blank"&gt;&lt;font size="3"&gt;&lt;strong&gt;ironruby-mvc: ASP.NET MVC applications in Ruby&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Special thanks to &lt;a href="http://haacked.com/" target="_blank"&gt;Phil Haack&lt;/a&gt; and the ASP.NET MVC team for seeding this implementation, and &lt;a href="http://flanders.co.nz/" target="_blank"&gt;Ivan Porto Carrero&lt;/a&gt; for recently running with this (I’m sure &lt;a href="http://manning.com/carrero/" target="_blank"&gt;his book&lt;/a&gt; will cover this =)).&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/03/scripting-c-silverlight-apps-with.html" target="_blank"&gt;In a previous post&lt;/a&gt; I built a tiny web-service in IronRuby-MVC to persist code typed into a IronPython-scriptable &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; calculator (here running &lt;a href="http://timheuer.com/blog/archive/2009/03/18/silverlight-3-offline-update-framework.aspx" target="_blank"&gt;outside the browser&lt;/a&gt;!).&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgyx7tiKuoI/AAAAAAAAAKE/5PTezDUiijQ/s1600-h/calc-oob%5B6%5D.jpg" target="_blank"&gt;&lt;img style="display: inline" title="calc-oob" alt="calc-oob" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx73igcfI/AAAAAAAAAKI/qLKyl-o7pKw/calc-oob_thumb%5B7%5D.jpg?imgmax=800" width="400" height="314" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;&lt;a name="project"&gt;&lt;/a&gt;&lt;font color="#ff8000"&gt;Project Status&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;As IronRuby is maturing, more and more people are noticing it and (more importantly) using it. Special thanks to the more consistent contributors:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://github.com/casualjim" target="_blank"&gt;Ivan Porto Carrero&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/jirapong" target="_blank"&gt;Jirapong Nanta&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/nrk" target="_blank"&gt;Daniele Alessandri&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/thbar" target="_blank"&gt;Thibaut Barrere&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/rvernagus" target="_blank"&gt;Ray Vernagus&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;They either contribute C# code to the IronRuby codebase, documentation on &lt;a href="http://ironruby.net" target="_blank"&gt;http://ironruby.net&lt;/a&gt; and &lt;a href="http://wiki.github.com/ironruby/ironruby" target="_blank"&gt;http://wiki.github.com/ironruby/ironruby&lt;/a&gt;, or the general ecosystem with active blogs, speaking at user groups, or new projects based on IronRuby. More information about contributing to IronRuby can be found at &lt;a title="http://wiki.github.com/ironruby/ironruby/contributing" href="http://wiki.github.com/ironruby/ironruby/contributing" target="_blank"&gt;http://wiki.github.com/ironruby/ironruby/contributing&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;To get all contributor projects, check out the &lt;a href="http://github.com/ironruby/ironruby-contrib" target="_blank"&gt;ironruby-contrib project&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;IronRuby will be tracking performance and compatibility as it gets closer to 1.0. With &lt;a href="http://ironruby.info/" target="_blank"&gt;84% total compatibility&lt;/a&gt; on RubySpec, focus is being put on running real apps’ test-suites. Startup performance has also been a focus of improvement as of late, and by building an adaptive interpreter/compiler (like &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt; now has) Rails startup time decreased from about 85 to 30 seconds, without sacrificing startup time! Keep an eye on &lt;a href="http://ironruby.info" target="_blank"&gt;http://ironruby.info&lt;/a&gt; for updates to these types of stats.&lt;/p&gt;  &lt;p&gt;Lastly, a little bit after this post is published ironruby-0.5 will be released. Please give it a try and submit any bugs you find to &lt;a href="http://ironruby.codeplex.com/WorkItem/Create.aspx" target="_blank"&gt;Codeplex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/Sgyx8fzQazI/AAAAAAAAAKM/4MjvRGxF7w8/s1600-h/image%5B48%5D.png" target="_blank"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgyx80_MqVI/AAAAAAAAAKQ/HoJ6N7idj7k/image_thumb%5B74%5D.png?imgmax=800" width="400" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-2771449511312359785?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=QjntI2zZW8w:a585Z23uqVc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=QjntI2zZW8w:a585Z23uqVc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=QjntI2zZW8w:a585Z23uqVc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=QjntI2zZW8w:a585Z23uqVc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=QjntI2zZW8w:a585Z23uqVc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=QjntI2zZW8w:a585Z23uqVc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=QjntI2zZW8w:a585Z23uqVc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/QjntI2zZW8w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/QjntI2zZW8w/ironruby-at-railsconf-2009.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/05/ironruby-at-railsconf-2009.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-9110619865718913431</guid><pubDate>Tue, 12 May 2009 21:23:00 +0000</pubDate><atom:updated>2009-07-14T00:21:46.605-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MacOSX</category><category domain="http://www.blogger.com/atom/ns#">MacDrive</category><category domain="http://www.blogger.com/atom/ns#">Windows 7</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>MacDrive 7 with Windows 7</title><description>&lt;p&gt;&lt;span style="color: red; font-weight: bold"&gt;UPDATE: &lt;/span&gt;&lt;a href='http://www.mediafour.com/products/macdrive/' target="_blank"&gt;MacDrive 8&lt;/a&gt; has been released, which has support for Windows 7, so the work-around explained in this post is no longer necessary. Also, people have been experiencing issues with it, so my advice is to upgrade.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;If you’re running Windows on a Mac, and you’re shuffling files between Mac OS and Windows, &lt;a href="http://www.mediafour.com/products/macdrive/" target="_blank"&gt;MacDrive&lt;/a&gt; is the best tool for mounting your &lt;a href="http://en.wikipedia.org/wiki/Hierarchical_File_System" target="_blank"&gt;HFS&lt;/a&gt; (Mac OS’s default file-system format) partitions in Windows. MacDrive costs $49.95, but is well worth it. However, MacDrive does not release versions for pre-release operating systems, and there are a couple speed bumps when trying to use MacDrive on &lt;a href="http://www.microsoft.com/windows/windows-7/" target="_blank"&gt;Windows 7&lt;/a&gt;. There are various version of this solution posted in a bunch of forums, but no definitive guide. Here’s exactly how I solved it:&lt;/p&gt;&lt;p&gt;1. &lt;font color="#ff8000"&gt;&lt;strong&gt;MacDrive’s installer will only run on Windows XP and Vista&lt;/strong&gt;&lt;/font&gt;. To have it run on Windows 7, you must run as Administrator, run in “Windows Vista” compatibility mode.&lt;/p&gt;&lt;p&gt;2.&lt;font color="#ff8000"&gt;&lt;strong&gt; Also remove the operating system version checks the installer makes with &lt;/strong&gt;&lt;/font&gt;&lt;a href="http://www.technipages.com/wp-content/uploads/2007/11/orca.Msi" target="_blank"&gt;&lt;strong&gt;&lt;font color="#8080ff"&gt;Orca&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;. MacDrive’s installer is an self-extracting exe, so you must extract it first; using &lt;a href="http://www.7-zip.org/" target="_blank"&gt;7-zip&lt;/a&gt; or any other unzipping tool will do the trick. Once extracted launch Orca and open MacDrive/x86.en-US/MacDrive7.x86.en-US.msi (or the x64 version if that applies to you). Once open, look for the “LaunchCondition” table and delete all rows from it.&lt;/p&gt;&lt;p&gt;3. If you run the main setup.exe from the extracted location it will install fine, but upon reboot you will not see your Mac OS drive. This is because &lt;font color="#ff8000"&gt;&lt;strong&gt;MacDrive simply doesn’t assign the drive a letter&lt;/strong&gt;&lt;/font&gt;. To do so, download &lt;a href="http://prdownloads.sourceforge.net/ext2fsd/Ext2Fsd-0.46a.zip?download"&gt;Ext2Fsd&lt;/a&gt;, unzip, and run Ext2Mgr.exe. Find your HFSJ-formatted partition, right-click and select “Change Drive Letter”. Assign it a letter, exit the application.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sgno57PMYbI/AAAAAAAAAI0/Yy1xawEql14/s1600-h/image%5B9%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgno6CGWVOI/AAAAAAAAAI4/8kkXsWdsOg8/image_thumb%5B5%5D.png?imgmax=800" width="400" height="323" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;4. &lt;font color="#ff8000"&gt;&lt;strong&gt;Open up your “Computer” screen and you should see your Mac OS drive now:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/Sgno6dgnxaI/AAAAAAAAAI8/e4X5uluVjkA/s1600-h/image%5B15%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sgno6tQIlfI/AAAAAAAAAJA/bxQwAoLZ_G4/image_thumb%5B9%5D.png?imgmax=800" width="400" height="62" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Please post in the comments if this doesn’t work for you, and I’ll update the steps. Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-9110619865718913431?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=vqCTv_8hKXU:4F9d7PlexC8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=vqCTv_8hKXU:4F9d7PlexC8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=vqCTv_8hKXU:4F9d7PlexC8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=vqCTv_8hKXU:4F9d7PlexC8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=vqCTv_8hKXU:4F9d7PlexC8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=vqCTv_8hKXU:4F9d7PlexC8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=vqCTv_8hKXU:4F9d7PlexC8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/vqCTv_8hKXU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/vqCTv_8hKXU/macdrive-7-with-windows-7.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/05/macdrive-7-with-windows-7.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-7075280311705960837</guid><pubDate>Tue, 14 Apr 2009 16:03:00 +0000</pubDate><atom:updated>2009-04-14T09:03:15.618-07:00</atom:updated><title>Lang.NET 2009</title><description>&lt;h4 align="center"&gt;Today is Lang.NET 2009!&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://langnetsymposium.com" target="_blank"&gt;Lang.NET Symposium 2009&lt;/a&gt; is here! A gathering of language geeks, users and implementers alike; an awesome cross-section of developers.&lt;/p&gt;  &lt;p&gt;There is a awesome assortment of topics scheduled, from Google Chrome’s V8 JavaScript engine to a bunch of F# talks, and a ton more awesome talks that can be seen on here:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://langnetsymposium.com/2009/agenda.aspx" href="http://langnetsymposium.com/2009/agenda.aspx"&gt;http://langnetsymposium.com/2009/agenda.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://langnetsymposium.com/2009/speakers.aspx#jason-zander" target="_blank"&gt;Jason Zander&lt;/a&gt; is setting up now, and we’re about 10 minutes away from starting, so I’m excited! Videos of the talks will be posted as soon as humanly possible, so keep an eye on the website for video links.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-7075280311705960837?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=uGzy6-hmix0:gTlekrM626I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=uGzy6-hmix0:gTlekrM626I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=uGzy6-hmix0:gTlekrM626I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=uGzy6-hmix0:gTlekrM626I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=uGzy6-hmix0:gTlekrM626I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=uGzy6-hmix0:gTlekrM626I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=uGzy6-hmix0:gTlekrM626I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/uGzy6-hmix0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/uGzy6-hmix0/langnet-2009.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/04/langnet-2009.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-3027738289837249947</guid><pubDate>Thu, 02 Apr 2009 11:16:00 +0000</pubDate><atom:updated>2009-04-02T17:18:52.952-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><title>Scripting C# Silverlight apps with IronPython</title><description>&lt;p align="center"&gt;&lt;a title="2009-03-31 23:01:41 -0700 by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3403091727/"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="2009-03-31 23:01:41 -0700" src="http://farm4.static.flickr.com/3469/3403091727_c9c5b09789.jpg" width="400" height="302" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;font color="#9a9a9a"&gt;&lt;font size="1"&gt;Image is unrelated to the post; just an awesome view from my building&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;a href="http://videos.visitmix.com/MIX09/T22F"&gt;&amp;laquo; This post is part of the combined&lt;br /&gt; IronRuby and AgDLR release at MIX '09&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;While many developers love to program in dynamic languages like Python or Ruby, they may not have that freedom in their day-to-day jobs, for a variety of tecnical and business reasons. However, dynamic languages are as useful when embedded in existing software, possibly making the design better than a non-scripting-enabled version. Languages based on the &lt;a href="http://dlr.codeplex.com"&gt;dynamic language runtime&lt;/a&gt; are really easy to embed in .NET applications, so hopefully this post inspires you to add scripting support to your applications.&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/11/adding-scripting-to-c-silverlight-app.html" target="_blank"&gt;In a previous post, I showed how to build a C# Silverlight application which evaluated a line of dynamic language code and printed the result&lt;/a&gt;. This post also touched on the philosophical issues around dynamic and static languages, so definitely give it a read first. Combining this with &lt;a href="http://blog.jimmy.schementi.com/2009/03/testing-c-silverlight-apps-with.html" target="_blank"&gt;my most recent post about testing a C# Silverlight Calculator with IronRuby&lt;/a&gt;, this post will walk you through adding the ability to define calculator functions in &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt;.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/SdSeR8sqouI/AAAAAAAAAIs/luLYD0EaDMg/s1600-h/ironpython-400%5B4%5D.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="ironpython-400" alt="ironpython-400" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SdSeSfk_wwI/AAAAAAAAAIw/2Wce441qXiM/ironpython-400_thumb%5B2%5D.png?imgmax=800" width="400" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;em&gt;Note: the same practices apply when scripting your application with &lt;/em&gt;&lt;a href="http://ironruby.net" target="_blank"&gt;&lt;em&gt;IronRuby&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, but it’s been a while since I gave &lt;/em&gt;&lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;&lt;em&gt;IronPython&lt;/em&gt;&lt;/a&gt;&lt;em&gt; some love.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Also, &lt;a href="http://blogs.msdn.com/kirillosenkov" target="_blank"&gt;Kirill Osenkov&lt;/a&gt;, a C# IDE QA'er, wrote up a similar article about &lt;a href="http://blogs.msdn.com/kirillosenkov/archive/2009/03/26/dlr-hosting-in-silverlight.aspx" target="_blank"&gt;Graphing IronPython functions in Silverlight&lt;/a&gt;, so check that out as well.&lt;/em&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;First off, download the &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; Calculator solution that we will build upon.&lt;/p&gt;  &lt;h4 align="center"&gt;&lt;a href="http://jimmy.schementi.com/silverlight/calculator-start.zip" target="_blank"&gt;Download Calculator (start)&lt;/a&gt;&lt;/h4&gt;  &lt;p align="center"&gt;To cheat or follow along while reading,    &lt;br /&gt;&lt;a href="http://github.com/jschementi/mix09/zipball/8a23b2c20cb578e45a8e82accab1f544761fa1eb" target="_blank"&gt;download the finished Calculator from the MIX '09 Demos repository&lt;/a&gt;.&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;Sanity check:&lt;/font&gt; &lt;/strong&gt;You'll need &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en" target="_blank"&gt;ASP.NET MVC 1.0&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=11DC7151-DBD6-4E39-878F-5081863CBB5D&amp;amp;displaylang=en" target="_blank"&gt;Silverlight 3 Tools&lt;/a&gt; installed (SL2 might work, might not). Make sure &lt;code&gt;Calculator.Web&lt;/code&gt; is the start project, and make sure CalculatorWebTestPage.aspx is the start page (both can be set by right-clicking on the respective files). Also make sure the site opens to &lt;code&gt;CalculatorTestAppTestPage.aspx?test&lt;/code&gt; so that the tests run automatically. Compiling and running this solution should show you the following:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Calculator first run by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3406060409/"&gt;&lt;img alt="Calculator first run" src="http://farm4.static.flickr.com/3619/3406060409_6ca7e8a4e1.jpg" width="373" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;This project gives us some UI to type Python code into (&lt;a href="http://github.com/jschementi/mix09/blob/8a23b2c20cb578e45a8e82accab1f544761fa1eb/Calculator/CalculatorTestApp/Page.xaml"&gt;Page.xaml&lt;/a&gt; will show you exactly what XAML creates this), and adds references to the &lt;a href="http://ironpython.codeplex.com"&gt;IronPython&lt;/a&gt; and &lt;a href="http://dlr.codeplex.com/" target="_blank"&gt;DLR&lt;/a&gt; binaries. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="What you need to host IronPython in Silverlight by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3406870674/"&gt;&lt;img alt="What you need to host IronPython in Silverlight" src="http://farm4.static.flickr.com/3612/3406870674_18018cd63a.jpg" width="294" height="185" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;b style="color: orange"&gt;Now for the interesting part&lt;/b&gt;; building a &lt;code&gt;PythonEngine&lt;/code&gt; class to encapsulate all the Python execution. Open &lt;code&gt;Calculator.Tests\Calculator.Tests\tests\python_engine_test.rb&lt;/code&gt; (yes, Ruby is sneaking back into this post) and let's write some tests...&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/88882.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;Now open &lt;code&gt;CalculatorTestApp\Page.xaml.cs&lt;/code&gt; and add this to the CalculatorTestApp namespace to make those tests pass...&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;script src="http://gist.github.com/86573.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;Pretty simple. The code sets up a &lt;code&gt;ScriptEngine&lt;/code&gt; for IronPython, executes arbitrary Python code in a shared scope, finds all the defined methods in that shared scope, and can call those methods with a single parameter. All in ~23 lines of code. Awesome. Here it is in action...&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Testing an IronPython engine with IronRuby by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3406752302/"&gt;&lt;img alt="Testing an IronPython engine with IronRuby" src="http://farm4.static.flickr.com/3632/3406752302_cae7c58f93.jpg" width="400" height="193" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;b style="color: orange"&gt;Now the Calculator is ready to be scripted&lt;/b&gt;. The end goal is to:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;p style="clear: both"&gt;Execute the code as it's being typed into the Calculator&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p style="clear: both"&gt;If it does not produce an error ... find out all the valid top-level methods defined by the code and add buttons to the UI for each method. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p style="clear: both"&gt;Clicking the button will call the appropriate method, sending the calculator's current result as a argument, and the return value will be the new result of the calculator. &lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So let's write tests for this ...&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/89101.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;And the following will make it all pass...&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/86575.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;And now giving it a run will produce the following:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Scripting Silverlight applications by jschementi, on Flickr" href="http://www.flickr.com/photos/jschementi/3406729220/"&gt;&lt;img alt="Scripting Silverlight applications" src="http://farm4.static.flickr.com/3655/3406729220_b5e9468bbb.jpg" width="354" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Clicking the button's above the Python code will call that function, sending the Calculator's current value as the first argument. Pretty cool! And that's all there is to it. Adding scripting support to applications on the desktop is just as simple. So, don't be afraid of this new-found power, go build awesome stuff with it!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-3027738289837249947?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=dmicQyMZo40:MIvZsytuRd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=dmicQyMZo40:MIvZsytuRd8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=dmicQyMZo40:MIvZsytuRd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=dmicQyMZo40:MIvZsytuRd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=dmicQyMZo40:MIvZsytuRd8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=dmicQyMZo40:MIvZsytuRd8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=dmicQyMZo40:MIvZsytuRd8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/dmicQyMZo40" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/dmicQyMZo40/scripting-c-silverlight-apps-with.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/03/scripting-c-silverlight-apps-with.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-6495545690239862724</guid><pubDate>Fri, 27 Mar 2009 09:32:00 +0000</pubDate><atom:updated>2009-03-29T01:01:39.506-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>Testing C# Silverlight apps with IronRuby</title><description>&lt;a class="image-link" href="http://picasaweb.google.com/data/media/api/user/jschementi/albumid/5317377554695295809/photoid/5317377561395917954/1238048439764000?authkey=Gv1sRgCPWiwvPqh9OipAE"&gt;&lt;img style="text-align: center; margin: 0px auto 10px; display: block" class="linked-to-original" src="http://picasaweb.google.com/data/media/api/user/jschementi/albumid/5317377554695295809/photoid/5317377558632300354/1238048439128000?authkey=Gv1sRgCPWiwvPqh9OipAE" width="380" height="304" /&gt;&lt;/a&gt;   &lt;p align="center"&gt;&lt;a href="http://blog-well.com/2008/03/04/100-resources-for-web-developers/"&gt;&lt;span style="font-size: xx-small"&gt;http://blog-well.com/2008/03/04/100-resources-for-web-developers/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;&lt;a href="http://videos.visitmix.com/MIX09/T22F"&gt;&amp;laquo; This post is part of the combined&lt;br /&gt; IronRuby and AgDLR release at MIX '09&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Testing is a great use for dynamic languages, especially if the application being tested is written in a compiled language like C# or VB. &lt;a href="http://www.ruby-lang.org/" target="_blank"&gt;Ruby&lt;/a&gt; is an especially interesting language for writing tests in due to the popularity of &lt;a href="http://rspec.info/" target="_blank"&gt;RSpec&lt;/a&gt;, a &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" target="_blank"&gt;behavior-driven-development&lt;/a&gt; testing framework. &lt;a href="http://ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt; makes it really easy to test .NET applications because of it's .NET integration and ability to run real Ruby programs, like RSpec. However, this becomes much more difficult to do in &lt;a href="http://silverlight.net/" target="_blank"&gt;Silverlight&lt;/a&gt; for a variety of reasons. And Silverlight doesn't have good options for testing to begin with, except for the &lt;a href="http://silverlight.codeplex.com/" target="_blank"&gt;Silverlight Unit Test Framework&lt;/a&gt;, but I yearn for something simpler. This post will show you how to test a C# Silverlight application with IronRuby, using a testing framework called &lt;a href="http://github.com/chneukirchen/bacon/" target="_blank"&gt;Bacon, a lightweight RSpec clone&lt;/a&gt;.&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;em&gt;&lt;b style="color: orange"&gt;Note&lt;/b&gt;: A similar exercise could be performed with &lt;a href="http://ironpython.codeplex.com/" target="_blank"&gt;IronPython&lt;/a&gt; and a Python testing framework like unittest or PyUnit, but I have much less experience with writing test code in Python. If anyone else does, please feel free to put together a similar package for IronPython).&lt;/em&gt;&lt;/p&gt;  &lt;h4 style="color: orange"&gt;Demo: testing a calculator on steroids&lt;/h4&gt;  &lt;p style="color: red"&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/Sc8iZoQc44I/AAAAAAAAAIc/GP8C0EDwDIE/s1600-h/calculator-tests%5B4%5D.png"&gt;&lt;img style="display: inline" title="calculator-tests" alt="calculator-tests" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/Sc8iZ-oiUfI/AAAAAAAAAIg/tvbv80ON8Fw/calculator-tests_thumb%5B2%5D.png?imgmax=800" width="400" height="508" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/mix09/zipball/3ccf72461e24a1b5b1fbc552294dcbff84762ccd"&gt;Download MIX '09 demos&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;This example is in the &lt;a href="http://github.com/jschementi/mix09/tree/3ccf72461e24a1b5b1fbc552294dcbff84762ccd/Calculator"&gt;&lt;code&gt;/Calculator&lt;/code&gt;&lt;/a&gt; directory. Special thanks to &lt;a href="http://itblobs.blogspot.com/" target="_blank"&gt;Boyan Nikolov&lt;/a&gt; for implementing the &lt;a href="http://itblobs.blogspot.com/2008/11/calculator-for-silverlight.html" target="_blank"&gt;Calculator control&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This is a example of testing a calculator (I'll explain the right-side with the Python code in the next post); the tests run in their own text-based REPL console, and even let you poke and prod the application after it's finished running the tests. The tests are very succinct and read easily, showing a big advantage to using IronRuby.&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/87277.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;The tests do not actually click the buttons, as Silverlight doesn't have extensive UI automation support like WPF does, but the tests call the methods that are hooked to the events, and also test that the controls hook the correct method, making it an equivalent test, and a lot less magic-y.&lt;/p&gt;  &lt;p&gt;For another testing example, see the &lt;a href="http://github.com/jflam/spreadsheet"&gt;spreadsheet example&lt;/a&gt; &lt;a href="http://www.iunknown.com"&gt;John Lam&lt;/a&gt; put together for &lt;a href="http://videos.visitmix.com/MIX09/T22F"&gt;his MIX '09 talk&lt;/a&gt;.&lt;/p&gt;  &lt;h4 style="color: orange"&gt;Test any Silverlight app&lt;/h4&gt;  &lt;p&gt;Testing any Silverlight application is pretty straight-forward, so let's walk through how to set it up. You can start from either your own Silverlight application, or a new Silverlight application, however you'll need a website/web-application project to be serving the actual Silverlight application; if you're creating a new application simply use the default options.&lt;/p&gt;  &lt;p&gt;First, &lt;a href="http://jimmy.schementi.com/silverlight/eggs.xap"&gt;download eggs.xap&lt;/a&gt; (&lt;a href="#eggs_explain"&gt;I'll explain what it is later&lt;/a&gt;) and place it at the same location in your webserver as your application's XAP file is being served; most likely the ClientBin directory. If you put it anywhere else, make sure to account for that in the code below. &lt;em&gt;Note: Eggs.xap will be part of &lt;a href="http://github.com/jschementi/agdlr" target="_blank"&gt;agdlr&lt;/a&gt; in 0.5.1, which will come out in a week from this post's date&lt;/em&gt;.&lt;/p&gt;  &lt;p style="clear: both"&gt;Next, &lt;a href="http://jimmy.schementi.com/silverlight/Sample.Tests.zip"&gt;download this Web Application project&lt;/a&gt;, rename it to whatever you want, and add it to the same solution as your Silverlight application; this will hold our tests.&lt;/p&gt;  &lt;p style="text-align: center; clear: both"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://4.bp.blogspot.com/_OqCZhp9yI0Q/Sc10ddcre8I/AAAAAAAAAIU/A7_14lzZp50/s1600-h/eggs-solution.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_OqCZhp9yI0Q/Sc10ddcre8I/AAAAAAAAAIU/A7_14lzZp50/s320/eggs-solution.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;There is a &lt;a href="http://github.com/jschementi/mix09/tree/f81084e069789de7979d2b340fad705826fa2c14/Sample.Tests" target="_blank"&gt;Sample.Tests/tests directory&lt;/a&gt; in that project, with a single &lt;a href="http://github.com/jschementi/mix09/blob/f81084e069789de7979d2b340fad705826fa2c14/Sample.Tests/Sample.Tests/tests/sample_test.rb" target="_blank"&gt;sample_test.rb file&lt;/a&gt;; that where the actual tests will go. You’ll also see &lt;a href="http://github.com/jschementi/mix09/blob/f81084e069789de7979d2b340fad705826fa2c14/Sample.Tests/Sample.Tests/eggs_config.rb" target="_blank"&gt;eggs_config.rb&lt;/a&gt;; this file defines the list of tests we want to run, since Silverlight can't enumerate the files in a XAP file easily.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://github.com/jschementi/mix09/blob/f81084e069789de7979d2b340fad705826fa2c14/Sample.Tests/clientaccesspolicy.xml" target="_blank"&gt;clientaccesspolicy.xml&lt;/a&gt; file makes it possible to download the generated XAP file, since our Silverlight application is being served from a different web-server. You can move these tests to the same domain as the application, but for the sake of this demonstration they are different.&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/86584.js"&gt;
&lt;/script&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;To get your application running the tests, add the following C# code to your application at the point which you want tests to run; this might be on Application_Startup, or at some later time ... it's up to you. If you're not sure, just add this code to the method which handles Application_Startup in App.xaml.cs to download eggs.xap and run the tests, only when the query string contains &amp;quot;test&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/86587.js"&gt;
&lt;/script&gt;&lt;/p&gt;  &lt;p style="clear: both"&gt;When it is all said and done, run your application with &amp;quot;?test&amp;quot; at the end of the URL, and you'll see something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sc8iaVW3A5I/AAAAAAAAAIk/MBY5faRrnE0/s1600-h/eggsfirstrun8.png"&gt;&lt;img style="display: inline" title="eggs-firstrun" alt="eggs-firstrun" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/Sc8ia6e9oWI/AAAAAAAAAIo/jvBeLPx92LA/eggsfirstrun_thumb6.png?imgmax=800" width="400" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The tests run inside a HTML-based IronRuby REPL control, so you can inspect your application after the tests run, maybe to track down a failure or prototype your next test.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;b style="color: orange"&gt;Note&lt;/b&gt;: if you don't see the REPL in your application, or just see the REPL and not the red menu bar below, the Silverlight control is blocking its view. If you make your Silverlight control &amp;quot;windowless&amp;quot;, by adding &lt;code&gt;&amp;lt;param name='windowless' value='true' /&amp;gt;&lt;/code&gt;&amp;quot; to the Silverlight object tag, or &lt;code&gt;Windowless='True'&lt;/code&gt; to the &lt;a href="http://github.com/jschementi/mix09/blob/f81084e069789de7979d2b340fad705826fa2c14/Calculator/Calculator.Web/CalculatorTestAppTestPage.aspx" target="_blank"&gt;ASP.NET control which creates the object tag&lt;/a&gt;, it will allow the REPL to show up. If for some reason you can't make your control windowless, you'll need to set the width and height of the Silverlight control so it doesn't overlap the console&lt;/em&gt;.&lt;/p&gt;  &lt;h4 style="color: orange"&gt;How it works&lt;/h4&gt;  &lt;p&gt;Everything above is pretty transparent on what it's doing, except for two parts: &lt;span style="color: orange; font-weight: bold"&gt;(1) what is this &amp;quot;eggs.xap&amp;quot; thing&lt;/span&gt;, and &lt;span style="color: orange; font-weight: bold"&gt;(2) how did my tests magically become a XAP file?&lt;/span&gt;&lt;/p&gt;  &lt;a name="eggs_explain"&gt;&lt;/a&gt; &lt;h4 style="color: orange"&gt;Eggs&lt;/h4&gt;  &lt;p&gt;&amp;quot;eggs.xap&amp;quot; is a small library to run Bacon in Silverlight. It containing &lt;a href="http://github.com/jschementi/bacon/blob/9a301c14833b4b8a26b95f659cf52df8318edd86/lib/bacon.rb" target="_blank"&gt;bacon.rb&lt;/a&gt;, the Bacon framework, &lt;a href="http://github.com/jschementi/eggs/blob/cdeda77fc92d9ab907e86aed698ab2a2344993d7/lib/eggs.rb" target="_blank"&gt;eggs.rb&lt;/a&gt;, a Bacon test runner for Silverlight, &lt;a href="http://github.com/jschementi/eggs/blob/cdeda77fc92d9ab907e86aed698ab2a2344993d7/src/Eggs.cs"&gt;Eggs.dll&lt;/a&gt;, a simple .NET API for running the tests, and DLLs required to run IronRuby.&lt;/p&gt;  &lt;p style="clear: both"&gt;When you added the code to App.xaml.cs, it:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Downloaded eggs.xap &lt;/li&gt;    &lt;li&gt;Pulled out Eggs.dll and loaded it &lt;/li&gt;    &lt;li&gt;Runs the tests in the supplied XAP via &amp;quot;Eggs.Start&amp;quot; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://github.com/jschementi/eggs/blob/cdeda77fc92d9ab907e86aed698ab2a2344993d7/src/Eggs.cs"&gt;&lt;code&gt;Eggs.Start&lt;/code&gt;&lt;/a&gt; loads IronRuby's DLLs and and uses the DLR Hosting APIs to call the Ruby &lt;a href="http://github.com/jschementi/eggs/blob/cdeda77fc92d9ab907e86aed698ab2a2344993d7/lib/eggs.rb"&gt;&lt;code&gt;Eggs.run&lt;/code&gt;&lt;/a&gt; method. This is abstracted by Eggs.dll so the application being tested doesn't need a compile-time dependency on IronRuby.&lt;/p&gt;  &lt;h4 style="color: orange"&gt;Chiron.XapHttpHandler&lt;/h4&gt;  &lt;p&gt;All you did was put tests in a web application project, so how are they getting packaged up into a XAP file? In that project's &lt;a href="http://github.com/jschementi/mix09/blob/f81084e069789de7979d2b340fad705826fa2c14/Sample.Tests/Web.config" target="_blank"&gt;web.config&lt;/a&gt;, there's one very important line:&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/86951.js"&gt;
&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;Yes, Chiron's XAPing functionality is being used, but it's packaged in an ASP.NET HttpHandler, giving any ASP.NET application the ability to auto-XAP a directory when requested, without having to use Chiron's web-server functionality. So when you give &lt;code&gt;Eggs.start&lt;/code&gt; the Uri to the tests (http://localhost:35863/Calculator.Tests.xap), it resolves to that project, sees that the Calculator.Tests folder exists but no XAP file exists, so it creates one in memory and responds to the request with it. &lt;a href="http://github.com/jschementi/agdlr/blob/master/src/Chiron/XapHttpHandler.cs" target="_blank"&gt;Here is the implementation if you are curious&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This same strategy can be used to develop Python or Ruby Silverlight applications in Visual Studio.&lt;/p&gt;  &lt;h4 style="color: orange"&gt;Now, get to testing!&lt;/h4&gt;  &lt;p&gt;Now you have no excuses for not testing your Silverlight application! Hit me up on twitter (@jschementi) or the comments if you have any questions.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-6495545690239862724?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=rcwSzgwXpIY:9UU7UPGJdXY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=rcwSzgwXpIY:9UU7UPGJdXY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=rcwSzgwXpIY:9UU7UPGJdXY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=rcwSzgwXpIY:9UU7UPGJdXY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=rcwSzgwXpIY:9UU7UPGJdXY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=rcwSzgwXpIY:9UU7UPGJdXY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=rcwSzgwXpIY:9UU7UPGJdXY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/rcwSzgwXpIY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/rcwSzgwXpIY/testing-c-silverlight-apps-with.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_OqCZhp9yI0Q/Sc10ddcre8I/AAAAAAAAAIU/A7_14lzZp50/s72-c/eggs-solution.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/03/testing-c-silverlight-apps-with.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-4052918082785039043</guid><pubDate>Tue, 24 Mar 2009 06:46:00 +0000</pubDate><atom:updated>2009-03-23T23:49:09.098-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">REPL</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><title>Silverlight Dynamic Languages SDK 0.5</title><description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" title="AgDLR" border="0" alt="AgDLR" src="http://jimmy.schementi.com/downloads/agdlr-400.png" /&gt;&lt;/p&gt;&lt;p&gt;In conjunction with &lt;a href="http://videos.visitmix.com/MIX09/T22F" target="_blank"&gt;MIX ‘09&lt;/a&gt; and the announcement of &lt;a href="http://blog.jimmy.schementi.com/2009/03/ironruby-03-released.html" target="_blank"&gt;IronRuby 0.3&lt;/a&gt;, I’d like to announce a new release of &lt;a href="http://sdlsdk.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25120" target="_blank"&gt;AgDLR 0.5&lt;/a&gt; – the &lt;a href="http://sdlsdk.codeplex.com" target="_blank"&gt;Silverlight Dynamic Languages SDK&lt;/a&gt;.&lt;/p&gt;&lt;style type="text/css"&gt;
.download_agdlr {color: white; padding: 10px; border: 3px solid gray; background-color: #333;display: block;font-size: 18px;text-decoration: none;font-weight: bold;text-align: center;margin: 30px 30px}
.download_agdlr:hover {background-color: #555;cursor: pointer;}&lt;/style&gt;&lt;p&gt;&lt;a class="download_agdlr" href="http://sdlsdk.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25120" target="_blank"&gt;Download AgDLR 0.5&lt;/a&gt; &lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://github.com/jschementi/agdlr/tree/v0.5.0" target="_blank"&gt;You can also check out the source code for this release&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is the MIX ‘09 release for Silverlight 2 and Silverlight 3 Beta. It updates the languages to IronRuby 0.3 and IronPython 2.6 pre-alpha, and adds a bunch of new features to Microsoft.Scripting.Silverlight and &lt;a href="http://sdlsdk.codeplex.com/Wiki/View.aspx?title=Chiron&amp;amp;referringTitle=Getting%20Started" target="_blank"&gt;Chiron&lt;/a&gt;. Please read the &lt;a href="http://sdlsdk.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25120" target="_blank"&gt;release notes&lt;/a&gt; for details, but I’ll highlight the awesomeness below.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Silverlight 3 Beta&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;There is a separate package (agdlr-0.5.0-sl3b.zip) which contains binaries specifically for Silverlight 3 Beta. Though the Silverlight 2 binaries will work just fine in SL3, they are slightly different. The Silverlight 3 binaries use the Silverlight Transparent Platform Extension feature to download the &lt;a href="http://dlr.codeplex.com/" target="_blank"&gt;DLR&lt;/a&gt; assemblies on demand, significantly reducing the size of a &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; or &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt;&amp;#160;&lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; application. This feature warrants a post just for itself, so that’ll be coming shortly. &lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;REPL&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/SciBtqvM-uI/AAAAAAAAAHk/1sTFXT-Zjqs/s1600-h/image%5B5%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SciBt97DVwI/AAAAAAAAAHo/Zm0AijJE21w/image_thumb%5B3%5D.png?imgmax=800" width="400" height="310" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Adding “console=true” to the &lt;a href="http://msdn.microsoft.com/en-us/library/cc838255(VS.95).aspx" target="_blank"&gt;initParams&lt;/a&gt; value of a Silverlight control will add a dynamic language &lt;a href="http://en.wikipedia.org/wiki/REPL" target="_blank"&gt;REPL&lt;/a&gt; to any Silverlight app for a explorative developer experience. See &lt;a href="http://github.com/jschementi/agdlr/blob/446d01e6ba570c7a489a4f02d1f7dc60781bc132/samples/python/repl/python/app.py" target="_blank"&gt;samples/python/repl&lt;/a&gt; and &lt;a href="http://github.com/jschementi/agdlr/blob/446d01e6ba570c7a489a4f02d1f7dc60781bc132/samples/ruby/repl/ruby/app.rb" target="_blank"&gt;samples/ruby/repl&lt;/a&gt; as well for how to use REPL programmatically ... in three lines of code.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Testing&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/SciBucEO5fI/AAAAAAAAAHs/yLP_UreXojA/s1600-h/image%5B10%5D.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh4.ggpht.com/_OqCZhp9yI0Q/SciBu95YzGI/AAAAAAAAAHw/F6xH9A8Uq-4/image_thumb%5B6%5D.png?imgmax=800" width="400" height="200" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Having a REPL in the browser is extremely liberating, because all your console applications can run as well. A killer application of this in the browser is testing, so this release has made it really easy to write tests for your Silverlight application, be it written in Ruby, Python, C# or VB, using IronRuby and a small Ruby testing framework, &lt;a href="http://github.com/chneukirchen/bacon/tree/master" target="_blank"&gt;Bacon&lt;/a&gt;. This little subproject is called &lt;a href="http://github.com/jschementi/eggs"&gt;Eggs&lt;/a&gt;, and will be elaborated on in a following post.&lt;/p&gt;&lt;p&gt;AgDLR uses Bacon directly to test itself in the browser, making up a test-suite contained in agdlr-0.5.0-test.zip. This suite contains a lot of new tests written in Ruby, as well as ported Python tests from an internal Microsoft DLR Silverlight test suite.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Contributions&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;Thanks to Dan Eloff for contributing two fixes to Microsoft.Scripting.Silverlight, and &lt;a href="http://www.devhawk.net/" target="_blank"&gt;Harry Pierson&lt;/a&gt; for Chiron.XapHttpHandler, a way to have IIS and the ASP.NET Development WebServer auto-xap dynamic language applications (which is freakin’ awesome, and I’m going to write about it shortly as well).&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;So, download agdlr-0.5.0 and ...&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/SciBvRQEKnI/AAAAAAAAAH0/DNFlpr5hEGk/image%5B16%5D.png?imgmax=800" width="400" height="180" /&gt;&lt;font size="1"&gt; From &lt;/font&gt;&lt;a href="http://www.zune.net/NR/rdonlyres/4448E435-6C2E-4651-A3F9-A65A130D142D/0/480x640_ENJOY.jpg" target="_blank"&gt;&lt;font size="1"&gt;http://www.zune.net&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-4052918082785039043?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=MB3l79dtHsM:VOilNGiMCGQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=MB3l79dtHsM:VOilNGiMCGQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=MB3l79dtHsM:VOilNGiMCGQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=MB3l79dtHsM:VOilNGiMCGQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=MB3l79dtHsM:VOilNGiMCGQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=MB3l79dtHsM:VOilNGiMCGQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=MB3l79dtHsM:VOilNGiMCGQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/MB3l79dtHsM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/MB3l79dtHsM/silverlight-dynamic-languages-sdk-05.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/03/silverlight-dynamic-languages-sdk-05.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-7902917752083388284</guid><pubDate>Sat, 21 Mar 2009 00:53:00 +0000</pubDate><atom:updated>2009-04-02T04:28:52.990-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><title>IronRuby 0.3 Released</title><description>&lt;p&gt;&lt;a href="http://ironruby.net" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ironruby-400" border="0" alt="ironruby-400" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/ScQ6pnmmz3I/AAAAAAAAAHg/9QguNH9nuTY/ironruby4005.png?imgmax=800" width="400" height="113" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’m pleased to announce a new release of &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt;: &lt;strong&gt;&lt;a href="http://ironruby.net/Download" target="_blank"&gt;IronRuby 0.3&lt;/a&gt;!&lt;/strong&gt; &lt;/p&gt; &lt;style type="text/css"&gt;.download_ironruby {
color: white; 
padding: 10px; 
border: 3px solid gray; 
background-color: #333;
display: block;
font-size: 18px;
text-decoration: none;
font-weight: bold;
text-align: center;
margin: 30px 30px
}
.download_ironruby:hover {
background-color: #555;
cursor: pointer;
}&lt;/style&gt;  &lt;p&gt;&lt;a class="download_ironruby" href="http://rubyforge.org/frs/download.php/53552/ironruby-0.3.0.zip" target="_blank"&gt;Download IronRuby 0.3&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://github.com/ironruby/ironruby/tree/v0.3.0" target="_blank"&gt;You can also check out the source code for this release&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Staying true to our “Conference-driven development schedule,” this release is in conjunction with &lt;a href="http://live.visitmix.com/" target="_blank"&gt;MIX ‘09&lt;/a&gt;, where &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; 3 Beta and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en" target="_blank"&gt;ASP.NET MVC 1.0&lt;/a&gt; were announced, to name a few. &lt;a href="http://www.iunknown.com" target="_blank"&gt;John Lam&lt;/a&gt; &lt;a href="http://videos.visitmix.com/MIX09/T22F"&gt;spoke at MIX today at 12:30pm in Las Vegas about using dynamic languages in Silverlight for testing, scripting, and application building. And some ASP.NET MVC with IronRuby is thrown in there too.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The demos are also available for &lt;a href="http://github.com/jschementi/mix09/zipball/master" target="_blank"&gt;download here&lt;/a&gt;. Check out &lt;a href="http://github.com/jschementi/mix09"&gt;http://github.com/jschementi/mix09&lt;/a&gt; for information on what the demos are, and how to use them. Also, throughout the day I will be posting walk-through-style posts about each major usage of dynamic languages in Silverlight.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/03/silverlight-dynamic-languages-sdk-05.html" target="_blank"&gt;AgDLR 0.5 Released&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/03/testing-c-silverlight-apps-with.html" target="_blank"&gt;Testing in Silverlight&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/03/scripting-c-silverlight-apps-with.html" target="_blank"&gt;Scripting in Silverlight&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Application building in Silverlight 3 (coming soon) &lt;/li&gt;    &lt;li&gt;IronRuby and IronPython with ASP.NET (coming soon) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now that that’s out of the way, what did we do in this release?&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://rubyspec.org/" target="_blank"&gt;&lt;font color="#ff8000"&gt;RubySpec&lt;/font&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;IronRuby passes approximately 80% of &lt;a href="http://rubyspec.org/" target="_blank"&gt;RubySpec&lt;/a&gt;, the best test suite Ruby has today. IronRuby is best at language compatibility, passing 95% of those tests, but worse on the standard libraries with a pass-rate of 77%. Overall the pass-rate as gone up approximately 10% since the last release, and there hasn’t been a major library push since getting Rails running. For IronRuby 1.0, that number is going to be as high as possible, and we’ll ensure that by continuing to work with the RubySpec project to improve the test suite.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ironruby.info" target="_blank"&gt;IronRuby.info&lt;/a&gt; shows up-to-date RubySpec statistics about IronRuby.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;.NET inter-operation&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Since this release is around MIX, and John’s talk is going to be focused around Silverlight and ASP.NET MVC, it seems like a great time to polish IronRuby’s .NET interop. For example, the release enables calling generic methods, implementing interfaces with IronRuby, and better conversions between .NET and Ruby types. We’ve also started to build a .NET interop test suite, using the same infrastructure RubySpec uses (MSpec), to provide a executable specification of how IronRuby and .NET play together. There will also be a written specification showing what these .NET interop features are good for, but not for this release.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;For more specifics of what this release contains, checkout out the CHANGELOG.txt in the binary download.&lt;/em&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;What’s with the version number?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;IronRuby is going to be a bit unconventional-Microsoft (as if that’s something new) and simply release 0.x releases (and maybe 0.x.x if needed) until it gets to 1.0, rather than release something with “Alpha”, “Beta”, or “RTW” attached to the name. That being said, 0.3 is a complete underestimation of where IronRuby is; it’s definitely more than 30% completed. We’ll move through the point releases rather fast, compared to the 7 months it took to get 0.1 (Alpha 1) releases, and another 3-4 months for (Alpha 2). Any maybe even skip some numbers along the way.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;What’s next?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;While the .NET interop testing/specing work will continue, the next releases will be much more focused on getting real Ruby applications running well; whether they be already existing apps/frameworks like Rails, RubyGems, Rake, etc, or new applications that people are building with IronRuby. We’re starting to run the gems, rake, and rails tests with IronRuby, and this type of discovery with more Ruby libraries will drive what we work on next. &lt;/p&gt;  &lt;p&gt;In short, expect to see more binary releases, more often. Until then, &lt;a href="http://ironruby.net/download" target="_blank"&gt;Download IronRuby 0.3&lt;/a&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-7902917752083388284?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=ygbSDcv9_AU:tbeU1SxS5u0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=ygbSDcv9_AU:tbeU1SxS5u0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=ygbSDcv9_AU:tbeU1SxS5u0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=ygbSDcv9_AU:tbeU1SxS5u0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=ygbSDcv9_AU:tbeU1SxS5u0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=ygbSDcv9_AU:tbeU1SxS5u0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=ygbSDcv9_AU:tbeU1SxS5u0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/ygbSDcv9_AU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/ygbSDcv9_AU/ironruby-03-released.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/03/ironruby-03-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-4554019320262620641</guid><pubDate>Thu, 05 Mar 2009 19:34:00 +0000</pubDate><atom:updated>2009-03-05T11:48:20.374-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">Dynamic Languages</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">IronPython</category><category domain="http://www.blogger.com/atom/ns#">DLR</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>State of the DLR for Silverlight</title><description>&lt;p&gt;If you’re a frequent reader of this blog, you definitely know what’s going on with the &lt;a href="http://dlr.codeplex.com/" target="_blank"&gt;DLR&lt;/a&gt; in &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt;. For those who are new, or just don’t know, hopefully this post will clarify some things.&lt;/p&gt;  &lt;p&gt;First off: my previous entries about Silverlight since &lt;a href="http://sdlsdk.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17839" target="_blank"&gt;sdlsdk-0.4.0&lt;/a&gt; dropped:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/11/repls-in-silverlight.html" target="_blank"&gt;“console=true”: REPLs in Silverlight&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/11/adding-scripting-to-c-silverlight-app.html" target="_blank"&gt;Adding scripting to a C# Silverlight app&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/12/jimmy-hacking-at-microsoft.html" target="_blank"&gt;jimmy hacking (at) Microsoft&lt;/a&gt; / Silverlight stuff near bottom &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.jimmy.schementi.com/2009/01/dynamic-language-testing-in-silverlight.html" target="_blank"&gt;Dynamic Language Testing in Silverlight&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It would seem the next release will be focused around REPLs, testing, scripting support, and maybe some server-side integration pieces. And you’d be right. Proof is in the &lt;a href="http://github.com/jschementi/agdlr" target="_blank"&gt;project’s public source code repository&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;But what about the dynamic language runtime and the languages themselves?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There has not been a new release of &lt;a href="http://sdlsdk.codeplex.com/" target="_blank"&gt;sdlsdk&lt;/a&gt; for many months, and that’s simply because the above features are not finished, NOT because the DLR and languages have not releases anything for Silverlight since then! The DLR released &lt;a href="http://dlr.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=20378" target="_blank"&gt;dlr-0.9&lt;/a&gt; and IronPython released &lt;a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12481" target="_blank"&gt;ironpython-2.0.1&lt;/a&gt;, both including Silverlight binaries. Also, &lt;a href="http://www.devhawk.net/" target="_blank"&gt;Harry Pierson&lt;/a&gt; put together a &lt;a href="http://nightlybuilds.cloudapp.net/Project.aspx?project=dlr" target="_blank"&gt;nightly build site&lt;/a&gt; for the DLR, which includes &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://ironpython.codeplex.com" target="_blank"&gt;IronPython&lt;/a&gt;, and had Silverlight-specific builds.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;Then why the sdlsdk project?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;sdlsdk is the main project and release vehicle for Chiron and Microsoft.Scripting.Silverlight, which makes writing applications in DLR-languages possible. It’s also the place for collaborating and experimenting with crazy usages of Silverlight+DLR. The DLR and languages are parts of other projects, so I can not justify bumping the version number of sdlsdk simply because a new version of IronRuby, IronPython, and the DLR are in there. The easiest way to update sdlsdk’s DLR+languages is to grab a daily build of the DLR and drop the binaries into sdlsdk’s /bin folder. The next sdlsdk release might include a script to automate that, as long as new builds don’t break it. =)&lt;/p&gt;  &lt;p&gt;This is possible because the DLR, IronRuby, and IronPython teams use a shared continuous-integration server that runs test suites in Silverlight on each checkin, ensuring that they all continue to work really well.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Common misconceptions&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;During development the state of these projects could be completely different within a few weeks, so misconceptions form very fast. Here are ones which beg for correction …&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;Chiron, a special HTTP server, performs language compilation on the server and generates a .xap file.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;FALSE. &lt;/font&gt;&lt;/strong&gt;While &lt;a href="http://sdlsdk.codeplex.com/Wiki/View.aspx?title=Chiron&amp;amp;referringTitle=Getting%20Started" target="_blank"&gt;Chiron&lt;/a&gt; is a special HTTP server, which generates a XAP file for any given directory, &lt;strong&gt;&lt;font color="#ff8000"&gt;it does not perform language compilation on the server&lt;/font&gt;&lt;/strong&gt;! Chiron is a development-time tool which only sticks the script files in the XAP, and they are run in the browser. When putting your app into production, you tell Chiron to write the XAP file to disk, and then you can put your app on any web-server you want. &lt;/p&gt;  &lt;p&gt;Chiron’s existence shows the limitation Silverlight imposes by &lt;em&gt;requiring&lt;/em&gt; a XAP file. DLLs can be downloaded by the AppManifest.xaml outside the XAP, so the XAP just serves as a AppManifest.xaml container. I’m hoping to get this fixed by Silverlight &lt;strong&gt;&lt;u&gt;4&lt;/u&gt;&lt;/strong&gt;. =\ It also shows a limitation in not supporting continuations, which would let the user script pause while asynchronously downloading a script file, and then resume the initial script. I’ve been prototyping ways to get around this, but nothing working yet. &lt;/p&gt;  &lt;p&gt;Also, if you’re using another web-server in your app (like you have a ASP.NET app with a Silverlight control), you can just set up a file-system-watcher and tell Chiron to regenerate the XAP to disk everytime you edit a file, but it will be served with the other webserver. This is used by &lt;a href="http://www.schementi.com/silverline/" target="_blank"&gt;silverline&lt;/a&gt;, a Rails plugin I wrote to integration Silverlight and IronRuby.&lt;/p&gt;  &lt;p&gt;This is why you can’t include JavaScript files from inside other JavaScript files, and all your dependencies need to be pre-defined in the HTML file, because JavaScript can’t download the script files while the JavaScript engine is running.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;Common interface implementations were inconsistent between languages, so I can’t create a solution where advanced users can pick and choose a language.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;FALSE, in theory. &lt;/font&gt;&lt;/strong&gt;&lt;a href="http://dlr.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=59294" target="_blank"&gt;The DLR hosting API (contained in Microsoft.Scripting.dll)&lt;/a&gt; provides a single set of APIs that can be used to host many languages. For example, &lt;a href="http://github.com/jschementi/agdlr/blob/master/src/Microsoft.Scripting.Silverlight/DynamicApplication.cs" target="_blank"&gt;Microsoft.Scripting.Silverlight&lt;/a&gt; uses the DLR hosting APIs to run any DLR language in Silverlight, based on what extension the entry-point script has (.py, .rb, etc ...). &lt;a href="http://github.com/jschementi/orphanage/tree/master/hosting" target="_blank"&gt;There are simple hosting examples here.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It is the language’s responsibility to implement certain interfaces so they are host-able by the DLR. IronRuby and IronPython are existing examples of that, and there is documentation in the hosting spec on how this all works, so new languages can follow suit.&lt;/p&gt;  &lt;p&gt;However, there are always going to be language-specific scenarios which have different ways of using the hosting API, or the hosting API doesn’t support the feature and you have to use the language’s hosting API. In those cases, it’s best to re-think your scripting design and make the hosting code as simple as possible.&lt;/p&gt;  &lt;p&gt;Also, a couple months ago, IronRuby’s hosting support was no where near where it is today. Again, things change fast. If you have any feedback on DLR hosting, please ask around on the &lt;a href="http://dlr.codeplex.com/Thread/List.aspx" target="_blank"&gt;DLR Discussions List&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;And the state is ...&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;I hope that made some things clear; the DLR, IronRuby, and IronPython are committed to supporting Silverlight developers. Unfortunately, the reverse is less strong, so if this is important to you please talk about it on the &lt;a href="http://silverlight.net/forums/17.aspx" target="_blank"&gt;silverlight.net forums&lt;/a&gt;. Things might be a bit nicer when the inner ring of the DLR (Microsoft.Scripting.Core.dll) is part of the System.Core in Silverlight, but we’ll see.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-4554019320262620641?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=UPY60UNDXrQ:4hQP06FR3Ns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=UPY60UNDXrQ:4hQP06FR3Ns:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=UPY60UNDXrQ:4hQP06FR3Ns:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=UPY60UNDXrQ:4hQP06FR3Ns:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=UPY60UNDXrQ:4hQP06FR3Ns:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=UPY60UNDXrQ:4hQP06FR3Ns:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=UPY60UNDXrQ:4hQP06FR3Ns:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/UPY60UNDXrQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/UPY60UNDXrQ/state-of-dlr-for-silverlight.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/03/state-of-dlr-for-silverlight.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-3386768063778664070</guid><pubDate>Wed, 04 Feb 2009 07:57:00 +0000</pubDate><atom:updated>2009-03-05T11:47:06.795-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><title>ironruby.info</title><description>&lt;p&gt;DNS seems to have propagated, so now I can tell you about ...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ironruby.info"&gt;&lt;img style="display: inline" title="ironruby-info" alt="ironruby-info" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/SYlKYgMyg-I/AAAAAAAAAHU/rzJNVAP4trw/ironruby-info%5B7%5D.png?imgmax=800" width="400" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://ironruby.info" target="_blank"&gt;ironruby.info&lt;/a&gt; is a new site &lt;a href="http://github.com/jschementi/ironruby-stats" target="_blank"&gt;I’ve been working on&lt;/a&gt; for a week or so; a place to track daily information about how &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt; is doing. It shows simple performance and &lt;a href="http://rubyspec.org/" target="_blank"&gt;RubySpec&lt;/a&gt; information, compared to Ruby, and random build/source information. There’s a lot more to do, like tracking working set, showing graphs or historical data, and running traces popular Ruby frameworks to show which specs are “most important” to fix … but it provides some useful information already.&lt;/p&gt;  &lt;p&gt;Oh, and the code is on &lt;a href="http://github.com" target="_blank"&gt;github&lt;/a&gt;. &lt;a href="http://github.com/jschementi/ironruby-stats/blob/master/stats.rb" target="_blank"&gt;stats.rb&lt;/a&gt; runs nightly collecting the data, and &lt;a href="http://github.com/jschementi/ironruby-stats/blob/master/app.rb" target="_blank"&gt;app.rb&lt;/a&gt; is the &lt;a href="http://sinatra.github.com/" target="_blank"&gt;Sinatra&lt;/a&gt; &lt;a href="http://ironruby.info" target="_blank"&gt;website&lt;/a&gt; showing the data. Feel free to send me patches/changes, or fork it to track other implementation :)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/jschementi/ironruby-stats"&gt;http://github.com/jschementi/ironruby-stats&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;font color="#c0c0c0" size="1"&gt;Disclaimer: This information is gathered on a Intel Pentium 4 3.5 ghz machine, so performance numbers will be different if you have a faster processor and/or more processors/cores.&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Performance&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;For startup time, it measures the time it takes to start &lt;font color="#ff8000"&gt;ir.exe empty.rb&lt;/font&gt; from the command-line, where empty is a empty file. IronRuby is currently 10x slower for startup on average, regardless of whether you’re using the interpreter or not (though the interpreter is slightly faster … we’re working on fixing that).&lt;/p&gt;  &lt;p&gt;The “100,000 Iterations” is just &lt;font color="#ff8000"&gt;$a *= 2&lt;/font&gt; 100,000 times. Nothing fancy yet. Ideally we’d be running the &lt;a href="http://github.com/acangiano/ruby-benchmark-suite" target="_blank"&gt;ruby-benchmark-suite&lt;/a&gt; here. IronRuby is only 2.5x slower on this, but the interpreter is &lt;em&gt;way&lt;/em&gt; slower. So, for now only use the interpreter for straight-line code ... no loops!&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;RubySpec&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;For those who don’t know what &lt;a href="http://rubyspec.org/" target="_blank"&gt;RubySpec&lt;/a&gt; is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;RubySpec is a project to write a complete, executable specification for the Ruby programming language&lt;/em&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;IronRuby has been using this specification for a while now to gauge our progress towards being a Ruby-1.8.6 compliant implementation. They are divided into three sections:&lt;font color="#ff8000"&gt; &lt;strong&gt;Language&lt;/strong&gt;&lt;/font&gt; which tests Ruby itself, &lt;strong&gt;&lt;font color="#ff8000"&gt;Core&lt;/font&gt;&lt;/strong&gt; which tests the libraries which Ruby needs to run, like Array, Hash, etc, and &lt;strong&gt;&lt;font color="#ff8000"&gt;Library&lt;/font&gt;&lt;/strong&gt; which tests the Ruby standard library. &lt;/p&gt;  &lt;p&gt;While these are a great judge of a Ruby implementation’s progress, they take a bit of time to run yourself (including setup time), and we never gave detailed reports of our own runs. So now, if you’re ever curious to know how IronRuby is doing, you can just check ironruby.info and get the data immediately. Pretty cool. &lt;em&gt;“But wow, that’s a ton of red on the page.”&lt;/em&gt; --- yeah, it looks worse than it is, maybe I should use a range of red? Regardless, let’s explain the results.&lt;/p&gt;  &lt;h5&gt;&lt;font color="#ff8000"&gt;Pass rate&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;The pass rates in the ir.exe and ruby.exe columns are “the number of expectations which passed, divided by the total number of expectations which ruby.exe runs”. So the “all specs pass rate” number is the pure pass rate, regardless of how well/poor ruby.exe does. The “diff” column shows how far away IronRuby is from Ruby for each row.&lt;/p&gt;  &lt;p&gt;Overall, IronRuby passes 86% of all the specs. Ruby (on Windows) passes 98%, so that leaves us with 12% of the specs left to get to Ruby compatibility on Windows. Not too shabby. The &lt;strong&gt;Core &lt;/strong&gt;tests have the highest failure rate (-18%), followed by the Language tests (-5%), and the Library tests have a strangely-low failure rate (1.87%) since Ruby is running 482 expectations less than IronRuby … I need to investigate that.&lt;/p&gt;  &lt;h5&gt;&lt;font color="#ff8000"&gt;Execution time&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;The Core and Library specs are between 4-5x slower (Ruby’s Core specs report a WAY too long run time right now, usually they’re around 2 minutes). The Language specs are a whopping 50x slower, which is crazy. I have to investigate why.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Fun facts&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;There’s other &lt;em&gt;fun facts&lt;/em&gt; it collects; build time, binary size, repository size. Not that interesting, but still good to see … I’d like to know if our repository size shoots up dramatically.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Anyway, that’s what &lt;a href="http://ironruby.info" target="_blank"&gt;ironruby.info&lt;/a&gt; gives you today. Hopefully this gives you an idea of where we are (getting close on the specs, and putting a lot of work into performance).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-3386768063778664070?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=q00cNPmGCAw:279t_vZkkYs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=q00cNPmGCAw:279t_vZkkYs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=q00cNPmGCAw:279t_vZkkYs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=q00cNPmGCAw:279t_vZkkYs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=q00cNPmGCAw:279t_vZkkYs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=q00cNPmGCAw:279t_vZkkYs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=q00cNPmGCAw:279t_vZkkYs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/q00cNPmGCAw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/q00cNPmGCAw/ironrubyinfo.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/02/ironrubyinfo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-1783862898950321166</guid><pubDate>Mon, 12 Jan 2009 03:52:00 +0000</pubDate><atom:updated>2009-03-27T01:03:44.886-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Git on Windows 7</title><description>&lt;p&gt;I use &lt;a href="http://gitscm.org" target="_blank"&gt;Git&lt;/a&gt; everyday, whether it be for &lt;a href="http://ironruby.net" target="_blank"&gt;IronRuby&lt;/a&gt;, &lt;a href="http://github.com/jschementi/agdlr" target="_blank"&gt;AgDLR&lt;/a&gt;, or random other Rails/Ruby work. Being that I work at Microsoft, I got my hands on earlier build of &lt;a href="http://en.wikipedia.org/wiki/Windows_7" target="_blank"&gt;Windows 7&lt;/a&gt; during the fall. Unfortuantely, git didn’t work fully on Windows 7, failing whenever a merge happened, which made push fail, as well as pull when trying to get other people’s changes). &lt;a href="http://blog.jredville.com/" target="_blank"&gt;Jim Deville&lt;/a&gt; has been tracking this with the Windows team, and even bringing it up to the &lt;a href="http://code.google.com/p/msysgit/" target="_blank"&gt;msysgit&lt;/a&gt; maintainer to see if there’s any way around this. It was looking grim, so I left my main development machine on Vista, and was sad.&lt;/p&gt;&lt;p&gt;Windows 7 Beta was released this past Friday, and I managed to download the .iso, get a Product Key, etc, at home during the day on Saturday. Now that it’s released, I’m guessing other people will have this problem ...&lt;/p&gt;&lt;p&gt;I’m not sure of the specific details behind the issue, but msysgit calls into C:\windows\system32\msvcrt.dll during a merge, and the changes to that DLL in Windows 7 breaks msysgit. Last week, &lt;a href="http://www.iunknown.com/" target="_blank"&gt;John Lam&lt;/a&gt; was describing the issue to John Messerly, and realized that the easiest fix would be to copy the Windows Vista msvcrt.dll to the C:\Program Files\Git\bin directory, since Windows DLL resolution will look on the PATH, and “.” is included.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/curth/default.aspx" target="_blank"&gt;Curt Hagenlocher&lt;/a&gt; just &lt;a href="http://twitter.com/chagenlocher/status/1112241244" target="_blank"&gt;reminded me of the fix&lt;/a&gt;, and it works!&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/SWq-biEzmNI/AAAAAAAAAHA/9JoANeiZnlE/s1600-h/gitwin7%5B7%5D.png"&gt;&lt;img style="display: inline" title="gitwin7" alt="gitwin7" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SWq-cVMzCYI/AAAAAAAAAHE/w7lqk80YTsM/gitwin7_thumb%5B5%5D.png?imgmax=800" width="400" height="155" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Pretty awesome. Enjoy Git in Windows 7!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-1783862898950321166?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=syFFxtbAxGk:-VruOHONz3Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=syFFxtbAxGk:-VruOHONz3Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=syFFxtbAxGk:-VruOHONz3Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=syFFxtbAxGk:-VruOHONz3Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=syFFxtbAxGk:-VruOHONz3Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=syFFxtbAxGk:-VruOHONz3Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=syFFxtbAxGk:-VruOHONz3Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/syFFxtbAxGk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/syFFxtbAxGk/git-on-windows-7.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/01/git-on-windows-7.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-601447514296991594</guid><pubDate>Tue, 06 Jan 2009 08:54:00 +0000</pubDate><atom:updated>2009-01-06T03:42:10.894-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">Testing</category><category domain="http://www.blogger.com/atom/ns#">IronRuby</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>Dynamic Language Testing in Silverlight</title><description>&lt;p&gt;A little less than two months ago I moved the Silverlight and DLR integration (AgDLR) project to &lt;a href="http://github.com/jschementi/agdlr"&gt;http://github.com/jschementi/agdlr&lt;/a&gt;, in an effort to get more collaboration. Since then &lt;a href="http://github.com/Eloff"&gt;Dan Eloff&lt;/a&gt; and &lt;a href="http://github.com/markryall"&gt;Mark Ryall&lt;/a&gt; have sent me pull requests, fixing up various error reporting, threading, and HTML bugs. Thanks guys! I promise to pull from you soon!&lt;/p&gt;  &lt;p&gt;Anyway, a little while ago, Mark said:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font color="#ff8000"&gt;I don't want to get all &lt;a href="http://innovationcreators.com/wp/?p=204"&gt;Captain Agile&lt;/a&gt; on you so soon but what do you think I can possibly add in the way of tests to verify that the change doesn't break anything?&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Yeah, not having tests kind of sucks, doesn't it? Unfortunately, testing in Silverlight is a windy, confusing, one-lane road, so getting the infrastructure to run tests has taken some time, but I just committed a Silverlight &lt;a href="http://github.com/jschementi/agdlr/tree/master/test/runner/ruby/app.rb"&gt;spec runner&lt;/a&gt; for &lt;a href="http://github.com/jschementi/bacon/"&gt;bacon&lt;/a&gt; (a little Ruby spec framework) and a &lt;a href="http://github.com/jschementi/agdlr/tree/master/test/runner/ruby/tests"&gt;bunch of specs&lt;/a&gt; for &lt;a href="http://github.com/jschementi/agdlr/tree/master/src/Microsoft.Scripting.Silverlight"&gt;Microsoft.Scripting.Silverlight&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;Here's a short screencast walking you through running the tests:&lt;/p&gt;  &lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2736262&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2736262&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2736262"&gt;Testing AgDLR&lt;/a&gt; from &lt;a href="http://vimeo.com/user704813"&gt;Jimmy Schementi&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.   &lt;br /&gt;  &lt;br /&gt;  &lt;p&gt;So, the tests are written in Ruby, but they test the C# code in Microsoft.Scripting.Silverlight ... pretty cool. This is a deviation from my common belief of &amp;quot;test in the language you write the code in&amp;quot;, but so what ... I never cared for that way of thinking =)&lt;/p&gt;  &lt;p&gt;This test runner can be copied and used to test any Silverlight code; just place your test file in the &lt;a href="http://github.com/jschementi/agdlr/tree/master/test/runner/ruby/tests"&gt;ruby/test&lt;/a&gt; directory and update the test list in &lt;a href="http://github.com/jschementi/agdlr/tree/master/test/runner/ruby/app.rb"&gt;ruby/app.rb&lt;/a&gt;, and that's all their is to it. I'll probably pull it out into it's own git repository, but for now it's part of &lt;a href="http://github.com/jschementi/agdlr"&gt;AgDLR&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;What took so long?&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;Yeah yeah, two months without tests is crazy, especially since these tests were just written in the last two weeks! This being Microsoft and all, with an &lt;a href="http://members.microsoft.com/careers/careerpath/technical/softwaretesting.mspx"&gt;entire discipline devoted to testing&lt;/a&gt;, you'd think we have a ton of automated tests to verify our Silverlight integration. We'll we do. Kind of. Let me explain. &lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://www.nullislove.com/wp-content/uploads/2007/11/wrong_batteries.gif" width="300" height="237" /&gt; &lt;/p&gt;  &lt;p&gt;Currently AgDLR's tests are mostly in-browser tests, with some &amp;quot;sanity&amp;quot; tests running on the command-line. The command-line runner (which I can't release to the public) hosts &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Silverlight"&gt;CoreCLR&lt;/a&gt;, but doesn't work exactly like the managed environment in Silverlight, which is why most are in-browser. The in-browser tests are comprised with a lot of &amp;quot;does this feature of Silverlight work in the DLR&amp;quot; tests, as well as more useful the IronPython and IronRuby test suite, and some end-to-end tests of sample applications (DLRConsole, Clock, etc). They run on an internal version of Microsft.Silverlight.Testing, which stop me from just releasing it, again.&lt;/p&gt;  &lt;p&gt;Today these tests mainly run in a check-in system (the infamous SNAP, aka &amp;quot;the troll&amp;quot;), which runs tests in parallel over a bunch of machines. In SNAP, the Silverlight tests can take 30+ minutes themselves. &lt;strong&gt;On my laptop it takes about 5 hours!&lt;/strong&gt; Basically useless for anyone wanting to contribute to AgDLR and run tests.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.flickr.com/photos/joshsommers/363202072/in/set-72157594405604955/"&gt;&lt;img src="http://farm1.static.flickr.com/176/363202072_b3c2cb59c0_d.jpg" width="300" height="251" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;Yeah, that's how it makes me feel too. Why they are like this is an entire different, and possibly inappropriate post, but I'll summarize. The issue is two fold: &lt;/p&gt;  &lt;p align="left"&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;(1) The browser is killed after each test&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="left"&gt;Yeah, you heard me right. And each test has to run in both Firefox and IE. The tests are launched from a custom test harness, which launches the appropriate browser instance, and waits for the browser to say whether the test passed or failed, and gets any extra information like stack traces, error messages, etc. Sometimes this completion detection happens quick, but other times a failure never happens, so the test must timeout (60 seconds), and then it re-runs itself three times to make sure the timeout wasn't some fluke. Definitely no failing-fast happening here. Much of this is fixed in a newer version of Microsoft.Silverlight.Testing, but this is what's running today.&lt;/p&gt;  &lt;p align="left"&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;(2) The tests aren't unit tests&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="left"&gt;The tests exercise Silverlight features from DLR languages, rather than testing the integration between the two. Actually, the DynamicApplication class is never used in the tests!&lt;/p&gt;  &lt;p align="left"&gt;This makes a good point about testing in general. While end-to-end/sign-off/acceptance tests are wonderful things, they can't be all the tests. If I can't run the tests while developing, then I'm not going to run them period. Having a check-in system run them for you is fine, but I'd like to have a good chance at passing a 1.5 hour job the first time. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#ff8000"&gt;Solution: ditch it all&lt;/font&gt;&lt;/h4&gt;  &lt;p align="center"&gt;&lt;a href="http://www.comicbookjournal.net/wp-content/uploads/2007/09/drawing-board.jpg"&gt;&lt;img src="http://www.comicbookjournal.net/wp-content/uploads/2007/09/drawing-board.jpg" width="300" height="316" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To get tests out to the world, the only sane thing would be to head back to the drawing board, which is what I've done with test/runner. Hopefully by using existing open source projects, a testing paradigm most people understand, and a very small test runner, this testing solution for AgDLR will be kept small and friendly for developers.&lt;/p&gt;  &lt;p&gt;So, now that there's a sane way to verify changes to AgDLR don't break, please fork AgDLR and send me pull requests! Next post will probably be about adding continuous integration to AgDLR, so stay tuned.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-601447514296991594?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=J0jR6HjP2LQ:ziKwYbqBE_Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=J0jR6HjP2LQ:ziKwYbqBE_Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=J0jR6HjP2LQ:ziKwYbqBE_Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=J0jR6HjP2LQ:ziKwYbqBE_Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=J0jR6HjP2LQ:ziKwYbqBE_Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=J0jR6HjP2LQ:ziKwYbqBE_Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=J0jR6HjP2LQ:ziKwYbqBE_Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/J0jR6HjP2LQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/J0jR6HjP2LQ/dynamic-language-testing-in-silverlight.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2009/01/dynamic-language-testing-in-silverlight.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-8589808113566717809</guid><pubDate>Wed, 03 Dec 2008 10:02:00 +0000</pubDate><atom:updated>2008-12-03T16:26:23.318-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">Silverline</category><category domain="http://www.blogger.com/atom/ns#">REPL</category><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">Dynamic Languages</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">DLR</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>jimmy hacking (at) Microsoft</title><description>&lt;p&gt;&lt;em&gt;Here's the &amp;quot;script&amp;quot; I wrote up for my talk this evening at WPI, entitled &lt;strong&gt;&amp;quot;jimmy hacking (at) Microsoft -- open source programming languages.&amp;quot;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://www.slideshare.net/jschementi/jimmy-hacking-at-microsoft-presentation"&gt;Here are the slides&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://www.flickr.com/photos/jschementi/3078944819/"&gt;&lt;img src="http://farm4.static.flickr.com/3281/3078944819_2ddac2f3ef.jpg" width="400" height="294" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;I'm back! For those who are fortunate enough to not know me, I'm Jimmy Schementi, and graduated from &lt;a href="http://wpi.edu"&gt;WPI&lt;/a&gt; in 2007 with a Bachelors and Masters in &lt;a href="http://www.cs.wpi.edu"&gt;Computer Science&lt;/a&gt; from this amazing group of people who had the privilege to go either bald or crazy because of me. I ran the &lt;a href="http://gdc.wpi.edu"&gt;Game Development Club&lt;/a&gt;, and dedicated a year of my life to Neil Heffernan&amp;#8217;s &lt;a href="http://assistment.org"&gt;Assistment&lt;/a&gt; project. Now I work at Microsoft on implementations of Python and Ruby for the .NET platform. I got them to &lt;a href="http://flickr.com/photos/jschementi/2898698253/"&gt;buy me a Mac&lt;/a&gt;. That&amp;#8217;s me.&lt;/p&gt;&lt;p&gt;I&amp;#8217;m going to waste an hour or so of your time talking about implementing two dynamic languages at Microsoft, &lt;a href="http://ironruby.net"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://codeplex.com/ironpython"&gt;IronPython&lt;/a&gt;. I&amp;#8217;ll also touch on what it&amp;#8217;s like working at Microsoft, including the challenges of integrating these languages with &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt;, a platform for the browser.&lt;/p&gt;&lt;p&gt;But first ...&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;How I started with programming&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZY4T40ubI/AAAAAAAAAE0/eXO9GhXAWak/image51%5B1%5D.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZY4yRsqoI/AAAAAAAAAE4/VvNLa3Ea4UQ/image_thumb3.png?imgmax=800" width="400" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;LOGO. 6&lt;sup&gt;th&lt;/sup&gt; grade. But the version I used was in English. Of course, I really didn&amp;#8217;t know I was &amp;quot;programming&amp;quot;, since I was making pretty pictures, but it was still fun. Years later, when I first saw &lt;a href="http://www.smalltalk.org"&gt;Smalltalk&lt;/a&gt;, I could have sword it was LOGO. Anyway, I found &lt;a href="http://logo.twentygototen.org/"&gt;a nifty logo environment on the web&lt;/a&gt;, and if you want to take a trip down memory lane with me here are some things to try out:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b4f84a4f-b3c6-4476-92a6-fb1431d5755f" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="xml"&gt;to spiral :size
  if :size &amp;gt; 30 [stop] ; an exit condition
  fd :size rt 15 ; many lines of action
  spiral :size *1.02 ; the tailend recursive call
end

reset
spiral 10&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which will produce a spiral:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/STZY5BEuzHI/AAAAAAAAAE8/ri85eZRhREk/image101.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY5ru2QeI/AAAAAAAAAFA/0YFymyO0mTc/image_thumb61.png?imgmax=800" width="358" height="320" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;... and ...&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c48d0b83-942f-4f08-8f0d-5fb09ca248dc" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="xml"&gt;to tree :arms :length :count
  if :count &amp;lt; 1 [stop]
  repeat :arms [
    lt 360/:arms
    pd fw :length
    tree :arms 2 * :length / :arms :count - 1
    pu bw :length
  ]
end

reset
tree 7 128 4&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Will make a snowflake:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZY5-0u1wI/AAAAAAAAAFE/ZjgvXsfYkn8/image18.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZY6XyyIKI/AAAAAAAAAFI/pM-Q3o8TJ6M/image_thumb12.png?imgmax=800" width="377" height="372" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;LOGO is a pretty advanced language, supporting recursion, functions, parenthesis-less method calls ... ah, feels like Ruby.&lt;/p&gt;&lt;p&gt;Anyway, why am I showing you LOGO? Because of the way you make logo programs: type a line, run a line, see the result. It&amp;#8217;s an extremely productive way to program, and what most of this talk is going to be about. Let me show you what I mean ...&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Taste of Ruby&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;To introduce Ruby, I made a screen-cast where I build a tiny unit testing framework entirely in a interactive environment. Here's two small environments in the browser that you can use to follow along: &lt;a href="http://jimmy.schementi.com/silverlight/repl"&gt;http://jimmy.schementi.com/silverlight/repl&lt;/a&gt; or &lt;a href="http://tryruby.hobix.com"&gt;http://tryruby.hobix.com&lt;/a&gt;.&lt;/p&gt;&lt;embed height="302" type="application/x-shockwave-flash" width="400" src="http://vimeo.com/moogaloop.swf?clip_id=2414729&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true" /&gt; &lt;br /&gt;
&lt;a href="http://vimeo.com/2414729"&gt;Ruby Testing in a REPL&lt;/a&gt; from &lt;a href="http://vimeo.com/user704813"&gt;Jimmy Schementi&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;. &lt;br /&gt;
&lt;p&gt;This exploring lead to the making of this &lt;a href="http://github.com/jschementi/orphanage/tree/master/tester"&gt;tiny unit testing framework&lt;/a&gt;. A majority of the &lt;a href="http://github.com/jschementi/orphanage/tree/master/tester/lib/tester.rb"&gt;logic is here&lt;/a&gt;, and the rest is for &lt;a href="http://github.com/jschementi/orphanage/tree/master/tester/lib/results.rb"&gt;formatting&lt;/a&gt; and &lt;a href="http://github.com/jschementi/orphanage/tree/master/tester/lib/mocker.rb"&gt;mocking&lt;/a&gt;. They are interesting because of how they redefine the methods defined in tester.rb, feeling very much like &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;aspects&lt;/a&gt;, but built into the language. This allows Ruby to be very powerful for meta-programming, as this unit-testing framework is really a little &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;DSL&lt;/a&gt;, looking very far from traditional Ruby syntax.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Terminology&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;I assume no one here as developed any software on the Microsoft stack, especially since most classes use Java, C, C++, or at least require it to be run-able on the CCC Linux machines. However, there are a lot of parallels between the two worlds, so let me make those connections:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Java langauge &amp;gt;&amp;gt;&amp;gt; C# &lt;/li&gt;
&lt;li&gt;Java runtime/libraries &amp;gt;&amp;gt;&amp;gt; .NET platform (CLR) &lt;/li&gt;
&lt;li&gt;(imagine) Flash + Java applets &amp;gt;&amp;gt;&amp;gt; Silverlight &lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Dynamic Language Runtime&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;IronPython 1.0 was released in September 2006, a Python 2.4 compatible implementation on Microsoft .NET, which performed on par with CPython. That project taught us that the CLR is great for dynamic languages, but there are things common to all dynamic languages that we had to roll ourselves. So, the &amp;#8220;Dynamic Language Runtime&amp;#8221; project was created to initially provide a dynamic language compiler infrastructure for the CLR, but can support static compilation as well. &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;A shout out to Bill Chiles, since these next couple of slides are based off of one of his talks.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZY6yLCJiI/AAAAAAAAAFM/MGIBEgzqkWA/image23.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY7TIXUpI/AAAAAAAAAFQ/MwGJ-1EhgCw/image_thumb15.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Before VMs, compiler writers built tokenizers, parsers, semantic analyzers, one or more passes of data flow and optimizations, code generated to machine code, and then produced a equivalent binary file. With VMs, we remove the last few phases, so languages tokenize, parse to their syntax trees ...&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZY72z-XbI/AAAAAAAAAFU/L8BJBl4GuDQ/image28.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY8ZA7_aI/AAAAAAAAAFY/856C-_bNecM/image_thumb18.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;... then do some semantics analysis, generate MSIL (higher level than machine IS), then write that to disk (an &amp;quot;assembly&amp;quot; in .NET).&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZY86HU7JI/AAAAAAAAAFc/07O7pZ8jvNY/image33.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY9SjjegI/AAAAAAAAAFg/O1e0SYslB84/image_thumb21.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;With the DLR, the front-end is the same: tokenize to a AST, but then map the language's AST to a Expression Tree, which would include binding and semantic information. And that's it. The DLR will take those Expression Trees and generate MSIL ... no code generation phase at all.&lt;/p&gt;&lt;p&gt;The Dynamic Language Runtime is a derivative work of the common functionality needed to build Python, Ruby, and JavaScript, so this method is successful for real languages.&lt;/p&gt;&lt;p&gt;Let's dive a bit into how the DLR actually generates MSIL:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY-Av8K9I/AAAAAAAAAFk/kE5NmCCiV7A/image38.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/STZY-Xw5VsI/AAAAAAAAAFo/5Qwuec5qLF8/image_thumb24.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;There are two ways to compile a method call or operation; statically compile to a known method OR to compile to a dynamic expression that describes what you want to do (call, get member, set item, set member, etc).&lt;/p&gt;&lt;p&gt;At runtime the dynamic expression gets bound to a rule (the method &amp;quot;Handle&amp;quot; in this case), which has the specific code needed to perform the operation when given a set of arguments. The rule has a test for when the implementation of the operation is valid (typically a test on the types of the arguments). The DLR caches these rules.&lt;/p&gt;&lt;p&gt;Take &amp;quot;hello &amp;quot; + name for example, which we can think of as x + y ...&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY_HBssuI/AAAAAAAAAFs/kVGQd3OW9gs/image58.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZY_jOWoQI/AAAAAAAAAFw/uPnRDTmN33g/image_thumb36.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;A DynamicSite is the runtime object that manages method/operation caches for fast lookup of how to perform an operation. We compile an expression such as &amp;#8220;x + y&amp;#8221; to a call to a DynamicSite&amp;#8217;s invoke method. That method starts out with a body that simply calls UpdateBindingAndInvoke.&lt;/p&gt;&lt;p&gt;The first time through, UpdateBindingAndInvoke asks the language that owns the context for the expression if it can perform the operation given the actual objects x and y. The binder may in turn ask the objects if they know how to perform the operation. If the binder gets a rule or can produce one, it returns it to the site.&lt;/p&gt;&lt;p&gt;The rule has a test for when it should be selected in the cache, and it has a target or implementation of the operation in the site (get member, call object, set item, do addition, etc.).&lt;/p&gt;&lt;p&gt;If we call the DynamicSite with different argument types ... &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZZAJlNMOI/AAAAAAAAAF0/iFzLzs3_2Ok/image56.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZZAmbJm5I/AAAAAAAAAF4/GEdHeQaJhG8/image_thumb341.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;... we fail the one test for strings, then fall through to update and bind again.&lt;/p&gt;&lt;p&gt;if we had to integers the second time, we might find the new rule, and we recompile the method that holds the code from the rules. Thus whenever the DynamicSite is invoked on two integers or two strings now, it is very fast.&lt;/p&gt;&lt;p&gt;Since the DLR basically takes text and turns it into executable code, we can expose an API for application developers to &amp;#8220;host&amp;#8221; the DLR and run arbitrary scripts in their application. This &amp;#8220;embedding scripting&amp;#8221; functionality is very powerful.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Tooling&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZZBUazi1I/AAAAAAAAAF8/TGuYOnQY5u4/image55.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZZCPU0yVI/AAAAAAAAAGA/Z-6neXBHDjU/image_thumb31.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;In static languages, it&amp;#8217;s really easy to make a tool that can do &amp;#8220;IntelliSense/code completion&amp;#8221; for you, since you know all the type information (methods, properties, variables, etc) at development time/compile time, so a editor can use a background compiler to parse your code and see where there are syntax errors, and even do static analysis to find runtime errors like null reference errors, etc.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZZC8Lav1I/AAAAAAAAAGE/qAHyM3LWpAY/image60.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZZDutxcDI/AAAAAAAAAGI/A-0ao30G18k/image_thumb34.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;However, with dynamic languages, the code is compiled at runtime, so when you do foo.something, any tool can&amp;#8217;t know what methods &amp;#8220;foo&amp;#8221; has, unless the entire application is running. As more static languages start picking up dynamic traits, this needs to be fixed. So, let's talk about the REPL:&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;History of the REPL&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;Lisp, a 50 year old programming language, has three vital functions: read (read from a command prompt), eval (run as string as lisp code), and print (print to screen). Lisp made popular the environment you saw before, where I type a line of code, and see the result immediately. This pattern maps directly onto those three Lisp functions, so that type of application is called a REPL (Read-Eval-Print Loop).&lt;/p&gt;&lt;p&gt;Today, REPLs are only seen in runtime-compilation languages, aka scripting/dynamic languages. Static languages like Java, C++, C#, etc, do not have the facilities to enable a REPL, outside of shelling out to the compilers. However, C# 5.0 MonoScript, a derivative of C# 3.0, provide APIs for accessing the compiler&amp;#8217;s internals, enabling compiling at runtime, which REPLs depend on.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Hit the breaks&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;Ok. I&amp;#8217;m getting bored of this history lesson, so I&amp;#8217;m going to abruptly change direction and talk about some cool technology that can be use from dynamic languages, Silverlight.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Silverlight&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://silverlight.net"&gt;Silverlight&lt;/a&gt; is a 4MB browser-plugin for Windows/Intel Mac OS 10.4+/Linux(through &lt;a href="http://www.mono-project.com/Moonlight"&gt;Moonlight&lt;/a&gt;) which puts a subset of the .NET framework in the browser. You can use the runtime to manipulate the DOM of the webpage (replace Javascript), or get a vector graphics surface to do fancier graphics/animations. Because it is integrated with the CLR, you can use any .NET language to program in the browser. &lt;/p&gt;&lt;p&gt;To you dynamic languages from Silverlight, you'll need the Silverlight Dynamic Languages SDK: &lt;a href="http://codeplex.com/sdlsdk"&gt;http://codeplex.com/sdlsdk&lt;/a&gt;. The public source repository lives here (&lt;a href="http://github.com/jschementi/agdlr"&gt;http://github.com/jschementi/agdlr&lt;/a&gt;),&amp;#160; if you just want to get the code or even help develop the SDK.&lt;/p&gt;&lt;p&gt;Here I&amp;#8217;ll show Ruby running in the browser.&lt;/p&gt;&lt;p&gt;&lt;a title="images" href="http://www.flickr.com/photos/24458122@N00/2759400768/"&gt;&lt;img border="0" alt="images" src="http://static.flickr.com/2412/2759400768_02c6f84414.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://jimmy.schementi.com/silverlight/photoviewer"&gt;http://jimmy.schementi.com/silverlight/photoviewer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;Note: if you don't have Silverlight installed, it'll prompt you to install. This will only work on Windows or Mac OS 10.4+, as the Linux implementation, Moonlight, is not released yet.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This is a simple Flickr client, entirely running on the client (does not require a server). It is mainly Ruby code, with the exception of a JavaScript library called &lt;a href="http://www.lokeshdhakar.com/projects/lightbox2/"&gt;Lightbox&lt;/a&gt; which I&amp;#8217;m using to do the picture-open animations, since it&amp;#8217;s awesome. This shows the interop between Ruby and JavaScript in the browser. It also directly manipulates the Html directly, so a end user wouldn&amp;#8217;t know the difference.&lt;/p&gt;&lt;p&gt;I mentioned hosting before &amp;#8230; so if I can host the DLR in a Silverlight application, couldn&amp;#8217;t I make a little IDE in the browser? &lt;/p&gt;&lt;p&gt;&lt;a title="DLRConsole Rocks" href="http://www.flickr.com/photos/24458122@N00/2801783695/"&gt;&lt;img border="0" alt="DLRConsole Rocks" src="http://static.flickr.com/3205/2801783695_91cd644382.jpg" width="400" height="249" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://silverlight.net/samples/sl2/dlrconsole/index.html"&gt;http://silverlight.net/samples/sl2/dlrconsole/index.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;DLRConsole is a Python Silverlight application, which hosts the DLR and lets you write Python or Ruby code, and manipulate a Silverlight surface. Here&amp;#8217;s an example of rendering a clock and dragging it around.&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:afc20786-a054-420a-839a-efbed34b1d2e" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="ruby:nogutter"&gt;rb&amp;gt; require 'lib/clock'
rb&amp;gt; require 'lib/drag'
rb&amp;gt; $c = Clock.show
rb&amp;gt; def drag(obj)
rb|   Drag.new(obj).enable
rb| ende
rb&amp;gt; drag($c.canvas)
rb&amp;gt; $t = canvas.children.first.children.first
rb&amp;gt; drag($t)
rb&amp;gt; class UIElement
rb|   def drag
rb|     Drag.new(self).enable
rb|   end
rb| end
rb&amp;gt; $tt = TextBlock.new
rb&amp;gt; $tt.text = "Monkey patched!"
rb&amp;gt; canvas.children.add $tt
rb&amp;gt; $tt.drag&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Back to REPLs&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;Ok, let&amp;#8217;s pull up for a second. I was talking about the REPL before, so can&amp;#8217;t we have it here? Sure! The &lt;a href="http://jimmy.schementi.com/silverlight/repl"&gt;first example I showed (Ruby testing) was entirely written in a Silverlight REPL&lt;/a&gt;! In fact, it&amp;#8217;s functionality built-into the Silverlight+DLR integration, so you can fire up a REPL against your live running app (much like &amp;#8220;python &amp;#8211;i foo.py&amp;#8221;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/11/repls-in-silverlight.html"&gt;I recently talked about this at Seattle CodeCamp v4.0, and wrote about it, so here's the post and demo.&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Embedding Ruby in a Existing C# application&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://blog.jimmy.schementi.com/2008/11/adding-scripting-to-c-silverlight-app.html"&gt;I also talked/wrote about this previously, so view the post here.&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Rails Integration&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZZEnCB7CI/AAAAAAAAAGM/0BOzHzjThsk/image79.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/STZZFbI9YDI/AAAAAAAAAGQ/P9m60WRxG4k/image_thumb47.png?imgmax=800" width="302" height="313" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;There&amp;#8217;s an awesome concept that&amp;#8217;s lurking here: you have Ruby in the browser! That is, a language that runs either on a server or a user&amp;#8217;s local machine can be pushed from a web server to run on the client, much like JavaScript, but it can be the same language on the server. Therefore, it could be the same exact code. I&amp;#8217;ve been playing around with this idea for a while, first talked about it at &lt;a href="http://en.oreilly.com/rails2008"&gt;RailsConf 2008&lt;/a&gt;, and it's current a Ruby on Rails plug-in called &lt;a href="http://schementi.com/silverline"&gt;Silverline&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, here's what I'm talking about ... &lt;/p&gt;&lt;p&gt;&lt;a href="http://silverline.schementi.com/client"&gt;http://silverline.schementi.com/client&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Note: this demo is fairly contrived, &lt;a href="http://github.com/jschementi/silverline/tree/master/client/app_teleport.rb"&gt;since it will only work for controllers named &amp;quot;ClientController&amp;quot;&lt;/a&gt;. Also, it looks like it only works in production-mode once, so don't be surprised if the link above doesn't work for you. If you have Rails installed you can run the demos locally for yourself.&lt;/p&gt;&lt;p&gt;This Rails code ...&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ade0613e-1ceb-4c8e-872c-c5afc0b715e1" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="ruby"&gt;class ClientController &amp;lt; ApplicationController
  def index
    render :layout =&amp;gt; true, :inline =&amp;gt; &amp;lt;&amp;lt;-EOS
      &amp;lt;%= link_to_remote 'Show time', :url =&amp;gt; {:action =&amp;gt; 'time'} %&amp;gt;
      &amp;lt;br /&amp;gt;&amp;lt;div id="time_div"&amp;gt;&amp;lt;/div&amp;gt;
    EOS
  end

  def time
    @time = Time.now
    render :update do |page|
      page.insert_html :bottom, 'time_div', "#{@time.to_s}&amp;lt;br /&amp;gt;"
    end
  end
end&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;... along with a simple template produce this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/STZZGJvfYjI/AAAAAAAAAGU/oPjJ3uXQ2d8/image84.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZZG8QF9qI/AAAAAAAAAGY/R6wjOgxrIkY/image_thumb50.png?imgmax=800" width="400" height="403" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Very simple app; hit &amp;quot;Show time&amp;quot; with your forehead and it prints the time. As Firebug shows, each time request goes to the server.&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e3b8392b-88b9-4eed-9fa3-ae35306c70db" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="ruby"&gt;class ClientController &amp;lt; ApplicationController
  client :time

  # ...
end&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, with the silverline plugin, if you add &amp;quot;client :time&amp;quot; to the controller, it will run the &amp;quot;time&amp;quot; action on the client:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/STZZHc3YSdI/AAAAAAAAAGc/gT2xDG_kfT4/image90.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/STZZIMzgZeI/AAAAAAAAAGg/5OE3WL6JxeI/image_thumb54.png?imgmax=800" width="400" height="371" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Note that clicking on &amp;quot;Show time&amp;quot; this time doesn't send any requests to the server; the code is executing in the browser. &lt;/p&gt;&lt;p&gt;This simple demo shows how a developer can decide to run a Rails action either on the the client or server. Silverline also provides some rendering helpers to &lt;a href="http://silverline.schementi.com/render_test/xaml_erb_partial"&gt;render XAML&lt;/a&gt; &lt;a href="http://github.com/jschementi/silverline-demos/tree/master/app/views/render_test/_clockerb.xaml.erb"&gt;through ERb&lt;/a&gt;. Check out the site if you want to know more.&lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Open Source&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;&lt;a title="Cartman vs Hippie" href="http://www.flickr.com/photos/86515260@N00/444184871/"&gt;&lt;img border="0" alt="Cartman vs Hippie" src="http://static.flickr.com/234/444184871_d86d0a0ec7.jpg" width="400" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Doing Open Source at Microsoft is hard. Like swimming against the current. Sometimes it's even like being the hippies Cartman is spraying. But that's why the people I work with and I do it ... because it's challenging and potentially that much more rewarding. But enough of the sappy talk ...&lt;/p&gt;&lt;p&gt;IronRuby and IronPython are both &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Microsoft Public License&lt;/a&gt; open-source projects, a fully endorsed &lt;a href="http://www.opensource.org/"&gt;Open Source Initiative&lt;/a&gt; license. The Ms-Pl is an BSD-like license; very short and to the point. In even shorter terms, any Ms-Pl project can be forked, sold, modified, etc, and you owe nothing to Microsoft. IronRuby accepts contributions to the Ruby standard library, but all of IronRuby and IronPython are on track for accepting contributions to the entire codebases shortly.&lt;/p&gt;&lt;p&gt;Ruby and Python themselves are not Microsoft languages. They exist outside Microsoft and have their own thriving communities. Since Microsoft sees value in supplying Ruby and Python on .NET, I get paid to help make that happen. Since those languages are open-source to begin with, and Microsoft is benefiting from having those languages, it's only right for the Iron* implementation to be open source themselves. &lt;/p&gt;&lt;h4&gt;&lt;font color="#ff8000"&gt;Fat lady, sing it&lt;/font&gt;&lt;/h4&gt;&lt;p&gt;Whew, that's it! This covered a lot, but I hope you have a better understanding of:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;why dynamic languages are useful &lt;/li&gt;
&lt;li&gt;what the DLR actually does for dynamic languages &lt;/li&gt;
&lt;li&gt;why REPLs are the future of productive IDEs &lt;/li&gt;
&lt;li&gt;how Silverlight and dynamic languages can blow your freakin' mind &lt;/li&gt;
&lt;li&gt;and why in the world Microsoft is relevant to the open source community &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-8589808113566717809?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Vzv7B0M8IkU:5Ti-B6aSvV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Vzv7B0M8IkU:5Ti-B6aSvV4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Vzv7B0M8IkU:5Ti-B6aSvV4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=Vzv7B0M8IkU:5Ti-B6aSvV4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Vzv7B0M8IkU:5Ti-B6aSvV4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=Vzv7B0M8IkU:5Ti-B6aSvV4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Vzv7B0M8IkU:5Ti-B6aSvV4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/Vzv7B0M8IkU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/Vzv7B0M8IkU/jimmy-hacking-at-microsoft.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2008/12/jimmy-hacking-at-microsoft.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-2822183687451509905</guid><pubDate>Fri, 21 Nov 2008 20:30:00 +0000</pubDate><atom:updated>2008-12-03T02:02:50.942-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">wpi</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><title>Speaking at WPI on 2008-11-24</title><description>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_OqCZhp9yI0Q/SScaVfQ_mPI/AAAAAAAAAEs/SapKKhOLVmo/wpi_logo%5B3%5D.gif?imgmax=800"&gt;&lt;img alt="wpi_logo" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SScaVjCR0WI/AAAAAAAAAEw/7HEChAFrKGA/wpi_logo_thumb%5B1%5D.gif?imgmax=800" width="235" height="91" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;&lt;p&gt;Monday, November 24 I'm speaking at Worcester Polytechnic Institute in Worcester, MA about what I've been doing since graduating in May 2007. There will be a trip down memory lane, Ruby, Python, .NET, Macs, Robots, Music, and spontaneity; it will be epic.&lt;/p&gt;&lt;p style="line-height: 1.4em"&gt;&lt;font size="3"&gt;&lt;font color="#ff8000"&gt;&lt;strong&gt;Jimmy hacking (at) Microsoft&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;    &lt;br /&gt;
Monday, November 21, 2008, 6pm     &lt;br /&gt;
Fuller Auditorium, Fuller Labs     &lt;br /&gt;
Worcester Polytechnic Institute     &lt;br /&gt;
100 Institute Road     &lt;br /&gt;
Worcester, MA 01609 &lt;/p&gt;&lt;p&gt;I'm flying to NY tonight (woot for red-eyes) with Felicia, and then driving/busing (depends how much work is left to do ;)) to Worcester Sunday. Should be a fun couple of days.&lt;/p&gt;&lt;p&gt;If you're in the Worcester-area, stop by! Slides/Demos will be posted shortly after the talk, and I'm looking into recording.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-2822183687451509905?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=WQZodnlhBsA:I_2bxe7fvL4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=WQZodnlhBsA:I_2bxe7fvL4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=WQZodnlhBsA:I_2bxe7fvL4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=WQZodnlhBsA:I_2bxe7fvL4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=WQZodnlhBsA:I_2bxe7fvL4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=WQZodnlhBsA:I_2bxe7fvL4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=WQZodnlhBsA:I_2bxe7fvL4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/WQZodnlhBsA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/WQZodnlhBsA/speaking-at-wpi-on-2008-11-24.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2008/11/speaking-at-wpi-on-2008-11-24.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-3962317714816684457</guid><pubDate>Tue, 18 Nov 2008 06:30:00 +0000</pubDate><atom:updated>2008-11-17T23:00:08.048-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>Adding scripting to a C# Silverlight app</title><description>&lt;p&gt;&lt;a title="white minority" href="http://www.flickr.com/photos/9462006@N08/2709696790/"&gt;&lt;img border="0" alt="The Minority" src="http://static.flickr.com/3150/2709696790_669c8488f7.jpg" width="400" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;At Microsoft, the &lt;a href="http://blog.remlog.net/"&gt;people&lt;/a&gt; I &lt;a href="http://www.devhawk.net/"&gt;work&lt;/a&gt; &lt;a href="http://www.iunknown.com"&gt;with&lt;/a&gt; and I are definitely the minority, preaching about the benefits of dynamic languages and &lt;a href="http://channel9.msdn.com/pdc2008/TL44/"&gt;using the right tools for the right jobs&lt;/a&gt;, as in don't use static languages where you don't need it -- though there are plenty of times where you need it.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font color="#ff8000" size="4"&gt;&lt;strong&gt;And now you ask, &amp;quot;Jimmy, but why would I, someone who gets paid to write C#, use a dynamic language?&amp;quot;&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The majority would only have static languages pulled from their cold, dead fingers, and I totally agree with them. Don't change for the sake of change. Though, for certain scenarios, running scripts in a VB/C# application would be useful. For example, a shopping application that has a bunch of business rules, like &amp;quot;when someone has three items in their cart that all have to do with cooking, give them 10% off.&amp;quot; These type of rules can change all the time, and traditionally you'd either store the rules in a database and implement a engine to understand the rules, or hand-code them yourself and have to redeploy the system every time you want to change them. &lt;/p&gt;&lt;p&gt;Or, you could save yourself the hassle and store the rules as Python or Ruby code, and then host the DLR in your application to run the code. Want to update the rules? Just update the code, nothing more. And a dynamic language is probably closer to how the domain-expert would represent them as, so they could even write them. Yes, this is just one scenario, but a powerful one for existing static language developers. This was the last part of my Seattle CodeCamp talk -- how to host the DLR in your C# Silverlight application.&lt;/p&gt;&lt;p&gt;&lt;a href="http://jimmy.schementi.com/downloads/seattle-code-camp-v4.0/SilverlightDLRDemo-Start.zip"&gt;Starting with an existing C# Silverlight application that just takes some input and echos it back&lt;/a&gt;, I'll extend it to &lt;a href="http://jimmy.schementi.com/downloads/seattle-code-camp-v4.0/SilverlightDLRDemo-Answer.zip"&gt;run the code through IronRuby and print the result&lt;/a&gt;. First, open the solution, and hit F5 to see that the app just echos what you type in the grey area. &lt;em&gt;This requires you to have installed the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=129043"&gt;Silverlight Tools&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_OqCZhp9yI0Q/SSJg9TKmcSI/AAAAAAAAAEU/Ft-ILeDdLS0/image%5B14%5D.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SSJg9mGiSmI/AAAAAAAAAEY/HQ3_CbBfCVU/image_thumb%5B10%5D.png?imgmax=800" width="400" height="369" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Now add references to the DLR and IronRuby (in the Dependencies folder):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_OqCZhp9yI0Q/SSJg-PmGDWI/AAAAAAAAAEc/-fsc8WDBp2Y/image%5B19%5D.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh5.ggpht.com/_OqCZhp9yI0Q/SSJg-7AbKTI/AAAAAAAAAEg/n7nQyyXCdls/image_thumb%5B13%5D.png?imgmax=800" width="400" height="368" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Let's write a little wrapper class run Ruby code. Open App.xaml.cs and add the following class to the SilverlightDLRDemo namespace:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ea8b248a-1942-4088-a009-119d87972561" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="csharp:nogutter"&gt;class RubyEngine {
  private ScriptEngine _engine;

  public RubyEngine() {
    var runtime = new ScriptRuntime(
      DynamicApplication.CreateRuntimeSetup()
    );
    _engine = Ruby.GetEngine(runtime);
  }

  public object Execute(string code) {
    return _engine.Execute(code);
  }
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: this exact code won't work on the Desktop; you'd have to just give the ScriptRuntime constructor no parameters. Here I use the DynamicApplication.CreateRuntimeSetup() to use the same ScriptRuntimeSetup object that Microsoft.Scripting.Silverlight uses, which knows how to map File system access to the XAP file, which is useful for dynamic languages to depend on other files. Of course, it's your decision to allow this or not.&lt;/p&gt;&lt;p&gt;You'll also need to add the following &amp;quot;using&amp;quot; statements:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b4d96ca9-5052-44d1-a717-84cd7071ad1f" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="csharp:nogutter"&gt;using Microsoft.Scripting.Hosting;
using IronRuby;
using Microsoft.Scripting.Silverlight;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that's it! That's all we need to run IronRuby code. Now let's hook it up to the page. Open Page.xaml.cs and add an instance variable to the Page class, and initialize it in the Page constructor:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d27c037e-cf12-4b78-b5d7-a61b0bdd6746" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="csharp:nogutter"&gt;// add to Page class
private RubyEngine _ruby;

// add to Page constructor
_ruby = new RubyEngine();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lastly, replace the &amp;quot;Result.Text = ...&amp;quot; line with this, which prints the typed code, and then the result computed by the RubyEngine wrapper we just wrote:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:191dc507-82a5-49bf-809b-6dc0654da4e1" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="c#:nogutter"&gt;Result.Text = "\n\n" + 
  "&amp;gt;&amp;gt; " + Code.Text + "\n" +
  (_ruby.Execute(Code.Text).ToString()) + 
  Result.Text;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now hit F5 again, and type some Ruby into the TextBox, hit enter, and boom, you're C# Silverlight application is running IronRuby code.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_OqCZhp9yI0Q/SSJg_C2swcI/AAAAAAAAAEk/iG_EBapd2B4/image%5B29%5D.png?imgmax=800"&gt;&lt;img alt="image" src="http://lh3.ggpht.com/_OqCZhp9yI0Q/SSJhABIci3I/AAAAAAAAAEo/pkmeDXF2IyM/image_thumb%5B19%5D.png?imgmax=800" width="400" height="368" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;In fact, this is exactly how &lt;a href="http://github.com/jschementi/agdlr"&gt;AgDLR&lt;/a&gt;, aka the dynamic language integration with Silverlight, works -- a C# application (&lt;a href="http://github.com/jschementi/agdlr/tree/master/src/Microsoft.Scripting.Silverlight"&gt;Microsoft.Scripting.Silverlight.dll&lt;/a&gt;) which hosts the DLR and runs a script file (app.rb or app.py). &lt;a href="http://github.com/jschementi/agdlr/tree/master/src/Microsoft.Scripting.Silverlight/DynamicApplication.cs"&gt;Take a look for yourself&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I hope that shows you how easy it is to host the DLR from a C# Silverlight application, and think twice when writing those complex rule engines. =)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-3962317714816684457?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RCHbKSgpXag:9Tdm3QRljyo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RCHbKSgpXag:9Tdm3QRljyo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RCHbKSgpXag:9Tdm3QRljyo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=RCHbKSgpXag:9Tdm3QRljyo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RCHbKSgpXag:9Tdm3QRljyo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=RCHbKSgpXag:9Tdm3QRljyo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=RCHbKSgpXag:9Tdm3QRljyo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/RCHbKSgpXag" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/RCHbKSgpXag/adding-scripting-to-c-silverlight-app.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2008/11/adding-scripting-to-c-silverlight-app.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-9134717009753070621</guid><pubDate>Tue, 18 Nov 2008 01:23:00 +0000</pubDate><atom:updated>2008-11-17T17:38:14.111-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">talks</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>"console=true": REPLs in Silverlight</title><description>&lt;p&gt;At &lt;a href="https://seattle.codecamp.us/"&gt;Seattle CodeCamp v4.0&lt;/a&gt; today, I talked a lot about &lt;a href="http://en.wikipedia.org/wiki/REPL"&gt;REPLs, or &amp;quot;Read, Evaluate, Print Loops&amp;quot;&lt;/a&gt;. They are the true &amp;quot;minimalist&amp;quot; view of programming; type a line, run a line. Most of them are no frills, only a terminal window and a blinking cursor, though they themselves could be really rich development environments. Also, REPLs are a vital tool for runtime-compilation languages, since the methods/variables/classes/etc are only *really* known to exist at runtime. &lt;/p&gt;&lt;p&gt;I started my talk with a Ruby REPL showing off how you can use IronRuby to explore .NET.&lt;/p&gt;&lt;p&gt;&lt;a title="ruby-browser-repl" href="http://www.flickr.com/photos/24458122@N00/3036629807/"&gt;&lt;img border="0" alt="ruby-browser-repl" src="http://static.flickr.com/3001/3036629807_1f8bc64d5f.jpg" width="400" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ah, the beauty of &lt;a href="http://flickr.com/photos/jschementi/2898698253/"&gt;two worlds colliding&lt;/a&gt;. You can use Ruby-idioms to explore the .NET types, starting with an A, B, or C, in the System namespace, just like they were Ruby classes to begin with. Call .NET methods, even with Ruby method naming conventions; IsInterface as is_interface. &lt;/p&gt;&lt;p&gt;The lurking awesomeness here is this REPL is running inside the browser! This is a &lt;a href="http://msdn.microsoft.com/en-us/library/cc189089(VS.95).aspx"&gt;HTML-based Silverlight application&lt;/a&gt;, which provides an IronRuby REPL. It accomplishes this by using the &lt;a href="http://codeplex.com/dlr"&gt;Dynamic Language Runtime&lt;/a&gt; (DLR) hosting APIs, but don't get hung up on the details of how that works, I'll explain later.&lt;/p&gt;&lt;p&gt;&lt;a title="Monkey patching" href="http://www.flickr.com/photos/24458122@N00/3036887651/"&gt;&lt;img border="0" alt="Monkey patching" src="http://static.flickr.com/3192/3036887651_e07658e920.jpg" width="400" height="340" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is nothing *new* in my world. &lt;a target="_blank" href="http://silverlight.net/samples/sl2/dlrconsole/index.html"&gt;DLRConsole&lt;/a&gt; has been around for a while now, and lets you write code in the browser to manipulate a Silverlight canvas. Both REPLs are self-contained, as in they only work against code manually loaded into them, like the previous screenshot shows with loading in the clock.rb and drag.rb files. This is fine for trying small things out, but becomes very cumbersome when trying to interact with a live application.&lt;/p&gt;&lt;p&gt;To interact with a live application seamlessly, the bare minimum would be to have a REPL available directly in the application itself. &lt;a href="http://github.com/jschementi/agdlr/commit/f7e4b6a22974209600b6b95a8126bf63db0cdcf6"&gt;And that's what I've done&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;a title="silverlight-repl" href="http://www.flickr.com/photos/24458122@N00/3039815620/"&gt;&lt;img border="0" alt="silverlight-repl" src="http://static.flickr.com/3287/3039815620_2492553744.jpg" width="400" height="305" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you build the &lt;a href="http://github.com/jschementi/agdlr"&gt;latest bits&lt;/a&gt;, you can add a new initParam option called &amp;quot;console&amp;quot; to enable a REPL in any application:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8761a212-ee2b-4c60-91a9-68decfaa5dbd" class="wlWriterSmartContent"&gt;&lt;pre name="code" class="xml:nogutter:nocontrols"&gt;&amp;lt;object ... &amp;gt;
  ...
  &amp;lt;param name="initParams" value="console=true" /&amp;gt;
&amp;lt;/object&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will inject a HTML-based REPL into whatever web page your app is running on. The language of the REPL is set to whatever language your start script is. To make the console pretty, &lt;a href="http://github.com/jschementi/agdlr/tree/master/samples/ruby/photoviewer/stylesheets/console.css?raw=true"&gt;add this stylesheet to your page&lt;/a&gt;. Eventually this stylesheet will be included in the templates script/sl produces. &lt;/p&gt;&lt;p&gt;In the screenshot above, I did not type/click anything on the UI; the code I typed into the REPL set the search term and &amp;quot;clicked&amp;quot; the search button. This type of integration with your application could easily produce &lt;a href="http://wtr.rubyforge.org/"&gt;Waitr&lt;/a&gt;-like automation, for testing and whatnot. I'd really like to see Waitr ported to IronRuby. =&lt;/p&gt;&lt;p&gt;But there's plenty more to-do: this console is very simple.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It only supports Ruby currently; though simple Python statements will work (white space is a bitch =P). &lt;/li&gt;
&lt;li&gt;It supports single and multi-line statements, but since the text input is implemented on top of a &amp;lt;input&amp;gt; tag, browser history gets in the way =P &lt;/li&gt;
&lt;li&gt;History works, but never resets itself. &lt;/li&gt;
&lt;li&gt;If you make a typo, and it's not clear that you've intended for the statement to be completed (like typing &amp;quot;class &amp;lt;enter&amp;gt;&amp;quot;), you'll have to force the console to run the command with &amp;lt;ctrl&amp;gt;+&amp;lt;enter&amp;gt; &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Please, play around with this new &amp;quot;usefulness&amp;quot; and let me know what you think. I'd prefer you to leave comments on github, so everyone can participate in the discussion. The code for the REPL lives in &lt;a href="http://github.com/jschementi/agdlr/tree/master/src/Microsoft.Scripting.Silverlight/Console.cs"&gt;Console.cs&lt;/a&gt;, so if you want to fix something on the list above, or see something else broken, fix it! If you find more bugs, please post them to &lt;a href="http://www.codeplex.com/sdlsdk/WorkItem/List.aspx"&gt;Codeplex&lt;/a&gt; under the 0.x.0 release.&lt;/p&gt;&lt;p&gt;Hope this little feature makes your live a bit easier!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-9134717009753070621?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=o6ASx96rox8:sUJ5MHLIINI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=o6ASx96rox8:sUJ5MHLIINI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=o6ASx96rox8:sUJ5MHLIINI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=o6ASx96rox8:sUJ5MHLIINI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=o6ASx96rox8:sUJ5MHLIINI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=o6ASx96rox8:sUJ5MHLIINI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=o6ASx96rox8:sUJ5MHLIINI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/o6ASx96rox8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/o6ASx96rox8/repls-in-silverlight.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2008/11/repls-in-silverlight.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5419182.post-7411091678713719472</guid><pubDate>Mon, 17 Nov 2008 21:23:00 +0000</pubDate><atom:updated>2008-11-17T17:38:14.112-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">talks</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>agdlr: Silverlight + DLR + Open Source</title><description>&lt;p align="center"&gt;&lt;img style="border: 0px" src="http://jimmy.schementi.com/downloads/agdlr-400.png" width="240" height="101" /&gt; &lt;/p&gt;&lt;p&gt;The &lt;a target="_blank" href="http://codeplex.com/sdlsdk"&gt;&amp;quot;Silverlight Dynamic Languages SDK&amp;quot; Codeplex project&lt;/a&gt; has existed since March 2008, with signed binary releases and source code drops every month or so. Though it's a good ship vehicle for the Silverlight+DLR integration, it's not really an open source project -- mainly as it lacks a public source repository. That changes today.&lt;/p&gt;&lt;p style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" align="center"&gt;&lt;span style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 5px; background-color: #333; padding-left: 5px; padding-right: 5px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 5px"&gt;&lt;a href="http://github.com/jschementi/agdlr"&gt;&lt;font size="5"&gt;&lt;strong&gt;AgDLR&lt;/strong&gt; Source Repository&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;This repository will contain the sources to Microsoft.Scripting.Silverlight.dll and Chiron.exe, as well as Ruby/Python libraries for writing Silverlight applications. Any &amp;quot;feature&amp;quot; work on those pieces of code will be committed to the public repository first, and eventually make its way into MIcrosoft's internal source control so the DLR/Iron* languages don't break it. This repository takes a binary dependency on the Iron* languages as well as the DLR, since this isn't the place to change that code. The source code for &lt;a href="http://ironruby.rubyforge.org/svn/trunk/"&gt;IronRuby&lt;/a&gt;, &lt;a href="http://www.codeplex.com/IronPython/SourceControl/ListDownloadableCommits.aspx"&gt;IronPython&lt;/a&gt;, and the &lt;a href="http://www.codeplex.com/dlr"&gt;DLR&lt;/a&gt; are available elsewhere, but releases on the &lt;a href="http://codeplex.com/sdlsdk"&gt;Codeplex page for this project&lt;/a&gt; will still contain source drops of everything.&lt;/p&gt;&lt;p align="center"&gt;&lt;img style="background-color: white; margin: 5px" src="http://markelikalderon.com/wp-content/uploads/2008/04/octocat.png" width="210" height="210" /&gt; &lt;/p&gt;&lt;p&gt;The repository is hosted on &lt;a href="http://github.com"&gt;http://github.com&lt;/a&gt;, which is a collaborative development site based around &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt;, a &amp;quot;fast, efficient, distributed version control system ideal for the collaborative development of software&amp;quot;. You can browse the sources on the website, look at &lt;a href="http://github.com/jschementi/agdlr/commit/f7e4b6a22974209600b6b95a8126bf63db0cdcf6"&gt;commits&lt;/a&gt;, &lt;a href="http://github.com/jschementi/agdlr/fork"&gt;fork&lt;/a&gt; your own version of the repository, or just &lt;a href="http://github.com/jschementi/agdlr/zipball/master"&gt;download a snapshot&lt;/a&gt;. If you're new to git, just install it (&lt;a href="http://code.google.com/p/msysgit/downloads/list"&gt;for windows, see here&lt;/a&gt;, &lt;a href="http://git.debuggable.com/screencasts/2:using_git_on_windows"&gt;and here&lt;/a&gt;). If you'd like to learn more about Github, or Git, &lt;a href="http://github.com/guides/home"&gt;Github guides&lt;/a&gt; is a good place to start.&lt;/p&gt;&lt;p&gt;If you'd like to contribute to AgDLR, fork your own version of the repository, commit your changes to your version, and send me a &lt;a href="http://github.com/guides/pull-requests"&gt;pull request&lt;/a&gt; on github. We'll take it from there.&lt;/p&gt;&lt;p&gt;I've already started to work on a new feature which I talked about at Seattle CodeCamp, but that's the next post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5419182-7411091678713719472?l=blog.jimmy.schementi.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Ftsnk0FpBbk:ziKswCFWiz0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Ftsnk0FpBbk:ziKswCFWiz0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Ftsnk0FpBbk:ziKswCFWiz0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=Ftsnk0FpBbk:ziKswCFWiz0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Ftsnk0FpBbk:ziKswCFWiz0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?i=Ftsnk0FpBbk:ziKswCFWiz0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jimmy-thinking?a=Ftsnk0FpBbk:ziKswCFWiz0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jimmy-thinking?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jimmy-thinking/~4/Ftsnk0FpBbk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/jimmy-thinking/~3/Ftsnk0FpBbk/agdlr-silverlight-dlr-open-source.html</link><author>jschementi@gmail.com (Jimmy Schementi)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.jimmy.schementi.com/2008/11/agdlr-silverlight-dlr-open-source.html</feedburner:origLink></item></channel></rss>
