Monologue The voices of Mono http://www.go-mono.com/monologue/ http://backend.userland.com/rss Monologue worker: b-diddy powered Joe Audette: 19th Skin Completed - mitchinson-golden <p>I've just completed the 19th new skin of my campaign, <a href="http://www.mitchinson.net/designs/67_golden/index.html">mitchinson-golden</a>, which can be seen on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a></p> <p><img width="500" height="524" src="http://www.mojoportal.com/Data/Sites/1/mitchinson-golden.jpg" alt="mitchinson-golden skin screen shot" /></p> <p>One more to go and I'm finished with skinning for a while!</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=455&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=455 Joe_x0020_Audette@monologue.go-mono.com Sun, 11 May 2008 11:44:26 GMT Joe Audette: 17th and 18th New Skins, mitchinson-khaki, styleshout-coolwater <p>I've just completed the 18th new skin for mojoPortal, far exceeding <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=433&amp;mid=19">my original goal of 10 new skins</a>. This one is named <a href="http://www.mitchinson.net/designs/51_khaki/index.html">mitchinson-khaki</a>, and the one below is <a href="http://www.styleshout.com/templates/preview/CoolWater1-0/index.html">styleshout-coolwater</a>, which I completed yesterday. You can see these skins now on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a>. I still have 2 more designs that I want to try and make skins with today while I have skinning momentum. Tomorrow I will package a new release of mojoPortal to include all these new skins. I've been working full blast on skins since April 23rd until today. I'm very happy with the results, but ready to get working on other priorities.</p> <p><img width="500" height="527" src="http://www.mojoportal.com/Data/Sites/1/mitchinson-khaki.jpg" alt="mitchinson-khaki skin screen shot" /></p> <p><img width="500" height="546" src="http://www.mojoportal.com/Data/Sites/1/styleshout-coolwater.jpg" alt="styleshout-coolwater skin screen shot" /></p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=454&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=454 Joe_x0020_Audette@monologue.go-mono.com Sun, 11 May 2008 06:02:16 GMT Andres G. Aragoneses: A new community devolopment model? <!--img src="http://superalumnos.net/files/images/chequeAdsense.preview.jpg" /--><br /><h4 id="ANewCommunityDevModel-long">Long story</h4> (Go to the <a href="#ANewCommunityDevModel-short">short story</a> if you're too lazy to read a lot.)<br /><br />Some time ago I <a href="http://knocte.blogspot.com/2006/09/el-software-libre-ms-comercial-que.html">wrote</a> about the usual confusion between the terms "commercial" and "propietary". FLOSS <strong>is</strong> commercial software because it's not only driven by the generosity of some developers with their spare time. A FLOSS developer can be paid by a software company, either by being employed (the most common case currently) or either by a consultancy/bounty basis. And there are still even <a href="http://www.db4o.com/about/productinformation/whitepapers/db4o%20Whitepaper%20-%20db4objects%20and%20the%20Dual%20Licensing%20Model.pdf">open source companies which still indirectly refer to FLOSS as non-commercial</a> when they compare both most popular development models nowadays by saying "open source VS commercial software".<br /><br />And why the bounty system is not so popular? Well, because:<br />1) It's very project-driven: bounties are usually published in means very related to the project. This can be considered an advantage because only motivated/interested developers will apply, but sometimes the project is too small, too recent or not very popular, or with a lot of similar projects around.<br />2) There's no strong system to manage the bounty in respect to requirements, secure payment, trust system between parts, etc.<br />3) Many people don't advocate for it (or they advocate for a bounty system that works as a task exchange without money intervention: <em>I fix this for you if you fix this for me</em>) because, we know, one of the reasons of the excellence of free software is because developers love what they do without rewards. (But IMHO one of the big downsides is also because there are also important tasks in a project that nobody likes to do. Besides, I think people tend to spend less spare time on free software as their age grows.)<br /><br />An exception to the 1st item could be <a href="http://www.bountycounty.org/">bountycounty.org</a>: a site that tries to announce bounties from free software projects. However, it seems to be an initiative that hasn't got much audience (the last bounty is 2 years old), either because the people that offer bounties forget to notify to this system, or, maybe because in the end the bounty development model doesn't work in FLOSS?<br /><br />Well, I don't think this is the case, because there's a bounty system that is succeeding, and which is also an exception to the (2) item of the above list: Google Summer of Code.<br /><br />However, GSoC has the following disadvantages to be "complete" for this matter:<br />a) Only students can apply.<br />b) All projects happen in the same time-frame and have the same duration (a summer).<br />c) All bounties are the same for each developer.<br />d) A concrete company controls all the process (because, it's true, they put the money).<br /><br />But we need something similar to GSoC (similar in the "It Works" aspect) and that saves these problems and is not a mere "announcement" site like BountyCounty.org.<br /><br />Some initiatives have appeared that tried to solve these situation: BountySource.com and SourceForge.net marketplace. The common problem to both is that they try to solve it by attracting the developers to host their projects, so this causes big and mature projects not to apply (because they have currently good hosting solutions, or are self-hosted, like Mozilla projects for instance).<br /><br />One of the ideas is to implement a bounty system in our bug tracking system software, like <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=124096">Bugzilla</a>. If I had time and liked Perl more, I would try to contribute something for it. Maybe we're in the chicken-egg problem here: we need a bounty system for that task.<br /><br />Surprisingly, there's already a general purpose web-based service for this task: <a href="http://www.rentacoder.com/">RentACoder.com</a>. But I haven't seen any free software projects using it, because it seems very focused on propietary developments.<br /><br />And then <strong>it happened</strong>: Some weeks ago a new FLOSS-oriented service was born: <a href="http://www.fossfactory.org/">FOSS Factory</a>. I wanted to start using it by publishing some mini-bounties (which hopefully would grow if other people are interested, similarly to voting systems in Bug Tracking software), but I got disappointed when even the project creation had a cost. But yesterday I received this e-mail:<br /><br /><em><br />Andres G. Aragoneses,<br /><br />Thanks so much for your interest in FOSS Factory! As one of our early adopters, I wanted to keep you in the loop on two very important developments.<br /><br />First, in response to user feedback, we've removed all costs for creating FOSS Factory projects! Instead, we now charge a 5% transaction fee on payouts. This aligns our interests with yours by ensuring that we will only make money if your projects succeed. It also enables developers to post their own projects without having to spend money.<br /><br />Second, we recently released our website source code under a FOSS license. You can now download the code from http://www.fossfactory.org/get-source.php. Our primary reason for doing this was so that we could take advantage of our own system to help improve the site. In case you're interested, we've already posted a few bounties for improvements that we haven't had time to implement ourselves: http://www.fossfactory.org/project.php?p=p30&tab=subprojects. Please feel free to participate.<br /><br />If you have any questions or concerns, please either reply to this message, or email me directly at jjgignac {at} fossfactory {dot} org. Your feedback is very important to us!<br /><br />Sincerely,<br /><br />John-Paul Gignac<br />President and Founder<br />FOSS Factory Inc.<br /></em><br /><br />Unfortunately, there's a 5% transaction charge for each bounty, but hey, we need to support their service! Also, the software is PHP based, so I won't likely spend time on improving it (you know, I already fled from PHP and Perl some years ago ;) ).<br /><br />But I like the initiative and I'll start to publish the bugs/features I consider interesting to have, but have no time/interest to hack on. Here are the first ones (take in account that, if every voter of the bug payed 10$, the bounty would be enough attractive for a developer I guess, because they are not very complicated):<br /><br />- Thunderbird/Seamonkey feature <strong><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=11048">Auto-watch threads you've posted to</a> (21 votes)</strong><br />- Thunderbird/Seamonkey regression <strong><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=11048">Allow edit of unsent message (Unsent folder messages should open to a compose window when double click)</a> (26 votes)</strong><br />- Bugzilla's feature (or fix for highly confusing workflow for newcomers) <strong><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=11368">Move all bug activity onto main bug screen</a> (17 votes)</strong><br />- Banshee's feature (currently handled by an outdated addin AFAIK) <strong><a href="http://bugzilla.gnome.org/show_bug.cgi?id=361210">Banshee needs a way to cleanup (remove stale tracks)</a> (reporter+4CC; no voting system in BGO)</strong><br />- Banshee's feature (patch proposed but I guess someone should make it apply to trunk) <strong><a href="http://bugzilla.gnome.org/show_bug.cgi?id=421376">[Patch] Automatically scan music folders for new songs</a> (reporter+6CC; no voting system in BGO)</strong><br />- Gnome's bug (someone wrote a patch but not sure if it will finally make it for 2.24...) <strong><a href="http://bugzilla.gnome.org/show_bug.cgi?id=47893">The ``Replace File'' dialog should display the two file sizes, times, etc.</a> (reporter+23CC; no voting system in BGO)</strong><br />- Monsoon's crazy feature (maybe implies the creation of a new Gtk widget) <a href="https://bugzilla.novell.com/show_bug.cgi?id=378750"><strong>When the option "Minimize to notification area on close" is not enabled, we should have a new widget on the title bar for that action</strong></a> (just me)<br />- Real fix for Mono's issue (because we already have a workaround) <a href="https://bugzilla.novell.com/show_bug.cgi?id=375987"><strong>System.Windows.Forms dependency on GTK makes code to crash if it uses ATK# and GTK_MODULES contains 'atk-bridge'</strong></a><br /><br />The last of the issues affected <a href="http://www.mono-project.com/Accessibility">our project</a> until we found a workaround overriding environment variables. If we reach our milestones properly and nobody has fixed it at that time, we could have a try! Now we still have <a href="http://www.mono-project.com/Accessibility:_Mapping_UIA_to_ATK">tons of work</a> which Calvin and the team have perfectly outlined. Unfortunately I haven't helped in this doc effort because I was busy debugging the issues I mentioned in my last post, which turned out to be an invalid bug (but at least gave me an idea for a <a href="http://nestor.babuine.net/?p=36">Gendarme Rule</a>) and a GAPI parser bug that Mike fixed) and because on thursday afternoon I was affected by <a href="http://automorphic.blogspot.com/2008/03/fevers-and-hacking-go-together-like.html"> some small rock ;)</a> and probably was the cause of me trying to debug something I didn't correctly updated on Friday (and maybe because of our dumb deployment methodology that <a href="http://mkestner.blogspot.com/">Mike</a> has already blamed). Well, I'll talk about this in a later entry...<br /><br /><h4 id="ANewCommunityDevModel-short">Short story</h4>Maybe this day will be remembered in the Free Software community as the day in which a first software draft is presented in order to fill some <a href="http://nat.org/2005/january/#bountysystem">awesome ideas from devs like Nat Friedman</a> about a general-purpose bounty system:<br /><h3><a href="http://www.fossfactory.org/">FOSS Factory</a></h3><br />Especially interesing is their <a href="http://www.fossfactory.org/why.php">reasonings</a> for its creation. http://knocte.blogspot.com/2008/05/new-community-devolopment-model.html Mozilla Programacion SoftwareLibre Ingenieria General CSharp Mono Andres_x0020_G._x0020_Aragoneses@monologue.go-mono.com tag:blogger.com,1999:blog-13199395.post-628234887210510310 Sat, 10 May 2008 17:59:00 GMT Jeffrey Stedfast: Wouldn't it be nice if... Over the past week, I've been spending some time hacking on Evolution again because of my frustration with the current IMAP backend. This got me to wondering... why hasn't anyone stepped up to the plate and rewritten Evolution's IMAP code yet?<br /><br />I think the reason can be summed up with the following 2 problems:<br /><br />1. IMAP is hard<br />2. Coding something complicated like a multithreaded multiplexed IMAP client library in C is harder.<br /><br />That got me and Michael Hutchinson wondering... wouldn't it be nice if we could write Camel provider plugins in C# or in any other managed language that we might prefer?<br /><br />I think Camel, like Evolution itself, should allow developers to implement plugins in C# as well. I really think this might help lessen the burden of implementing new mail protocol backends for Camel/Evolution.<br /><br />On that note, I've created a new svn module called camel-imap4 which can be built against your installed evolution-data-server devel packages.<br /><br />Currently, however, it'll probably only work with e-d-s >= 2.23.x because some things (and assumptions) in Camel have changed recently.<br /><br />One problem I'm having is that the symbol camel_folder_info_new() used to not exist in older versions of e-d-s, but recently that symbol was added and makes use of g_slice_alloc0(). The problem is that the way providers used to allocate CamelFolderInfo structures before was using g_new0() themselves. Why does this pose a problem? There's no guarantee that I'm aware of that you can mix and match g_malloc/g_slice_free or g_slice_alloc/g_free.<br /><br />This makes it difficult for me to implement a plugin that builds and works with my installed version of Evolution (2.12) and also work with Evolution svn (2.23). This is quite unfortunate :(<br /><br />While I'm at it, allow me to also propose some changes to the GChecksum API. Please, please, please make it so that we ned not allocate/free a GChecksum variable each time we need to checksum something?<br /><br />I propose the ability to do the following:<br /><br />GChecksum checksum;<br /><br />g_checksum_init (&checksum, G_CHECKSUM_MD5);<br />g_checksum_update (&checksum, data, len);<br />g_checksum_get_digest (&checksum, digest, &len);<br /><br />Then I'd like to be able to either call g_checksum_init() on checksum <i>again</i> or maybe have another function to clear state, maybe g_checksum_clear() which would allow me to once again use the same checksum variable for calculating the md5 of some other chunk of data.<br /><br />Camel generates md5sums for a lot of data, sometimes in loops. Having to alloc/free every iteration is inefficient and tedious. http://jeffreystedfast.blogspot.com/2008/05/wouldnt-it-be-nice-if.html mono evolution Jeffrey_x0020_Stedfast@monologue.go-mono.com tag:blogger.com,1999:blog-203063759820106893.post-2242048895043945677 Sat, 10 May 2008 17:49:00 GMT Francisco Figueiredo: Going to Canada... Hi, all!!<br /><br />It's a great pleasure to say I'm going to attend PGCon2008 this year!! :)<br /><br />I'm going to Canada tomorrow (May, 11) and hope to enjoy Ottawa and Canada before conference starts.<br /><br />If you live in Ottawa and would like to talk about Npgsql, Mono, .Net or anything else, please drop me a mail.<br /><br />About Npgsql, I posted on npgsql-devel list about an <a href="http://lists.pgfoundry.org/pipermail/npgsql-devel/2008-May/000704.html">Npgsql2 beta4 release this week</a>. But unfortunately it won't be possible. Josh is fixing some last bugs and will be doing a release next week. Sorry for any problems this announce may have caused.<br /><br /><br />So, that's it!<br /><br />Stay tuned! http://fxjr.blogspot.com/2008/05/going-to-canada.html canada travel Npgsql viagem Francisco_x0020_Figueiredo@monologue.go-mono.com tag:blogger.com,1999:blog-15237920.post-1590232489820430033 Sat, 10 May 2008 17:05:00 GMT Joe Audette: 2nd Skin for 11th Design - styleshout-envision <p>I've completed the second skin of 3 for the 11th design of my <a href="../../../BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">11 design campaign</a>, <a href="http://www.styleshout.com/templates/preview/Envision1-1/index.html">styleshout-envision</a> which can be seen on <a href="http://demo.mojoportal.com/">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p><img width="500" height="537" src="http://www.mojoportal.com/Data/Sites/1/styleshout-envision.jpg" alt="styleshout-envision skin screen shot" /></p> <p>Coming up next,</p> <a href="http://www.styleshout.com/templates/preview/CoolWater1-0/index.html">styleshout-coolwater</a> <p>.</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=453&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=453 Joe_x0020_Audette@monologue.go-mono.com Sat, 10 May 2008 05:51:38 GMT Joe Audette: 11th Design Completed - styleshout-refresh <p>I've completed one skin of 3 for the 11th design of my <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">11 design campaign</a>, <a href="http://www.styleshout.com/templates/preview/Refresh1-0/index.html">styleshout-refresh</a> which can be seen on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p>There are 2 more skins coming, <a href="http://www.styleshout.com/templates/preview/CoolWater1-0/index.html">styleshout-coolwater</a>, and <a href="http://www.styleshout.com/templates/preview/Envision1-1/index.html">styleshout-envision</a>, but they are really just variations on the same design.</p> <p><img width="500" height="539" src="http://www.mojoportal.com/Data/Sites/1/styleshout-refresh.jpg" alt="styleshout-refresh skin screen shot" /></p> <p>This will be in svn trunk later today for developers and will be in the next release of mojoPortal for everyone else.</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=452&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=452 Joe_x0020_Audette@monologue.go-mono.com Fri, 09 May 2008 11:40:19 GMT Jackson Harper: Inversion Tables <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4wtItLnZ3X0/SCRs5LNiUGI/AAAAAAAAAIQ/iJMkKBpRvVk/s1600-h/inversion-table.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_4wtItLnZ3X0/SCRs5LNiUGI/AAAAAAAAAIQ/iJMkKBpRvVk/s320/inversion-table.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5198399599410303074" /></a><br /><br />Has anyone ever tried one of these? My back has been totally killing me for the last couple weeks and none of the usual stuff is helping.<div class="feedflare"> <a href="http://feeds.feedburner.com/~f/JacksonsActivityLog?a=sAZ9QH"><img src="http://feeds.feedburner.com/~f/JacksonsActivityLog?i=sAZ9QH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/JacksonsActivityLog?a=dbCm7H"><img src="http://feeds.feedburner.com/~f/JacksonsActivityLog?i=dbCm7H" border="0"></img></a> </div> http://jacksonito.blogspot.com/2008/05/inversion-tables.html Jackson_x0020_Harper@monologue.go-mono.com tag:blogger.com,1999:blog-4677537836173626009.post-5369882005449140923 Fri, 09 May 2008 11:22:00 GMT Alan McGovern: It's funny. I always thought that DRM should be used as a way to make life difficult for people pirating software/music. I never though it would be used as a way to convince people that pirating software is the better way:<br /><br />http://www.theinquirer.net/gb/inquirer/news/2008/05/07/mass-effect-wins-award-worst-pc<br /><br />Seriously, what are these people thinking? http://monotorrent.blogspot.com/2008/05/its-funny.html Alan_x0020_McGovern@monologue.go-mono.com tag:blogger.com,1999:blog-29153919.post-7635672926238868863 Fri, 09 May 2008 09:18:00 GMT Jeroen Frijters: Compiler Intrinsics <p> Most compilers have some (or in some cases many) <a href="http://en.wikipedia.org/wiki/Intrinsic_function">intrinsic functions</a>. HotSpot has a number of them (see <a href="https://openjdk.dev.java.net/source/browse/openjdk/jdk/trunk/hotspot/src/share/vm/classfile/vmSymbols.hpp?rev=257&view=markup"> here</a>, search for &quot;intrinsics known to the runtime&quot;) as does the CLR JIT. IKVM has had a couple as well (<a href="/PermaLink.aspx?guid=6d43cef3-f478-4af7-bd8d-e73d30884d61">System.arraycopy()</a>, <a href="/PermaLink.aspx?guid=5402bb0a-5f05-4939-9d13-fd42166155b6"> AtomicReferenceFieldUpdater.newUpdater()</a>, <a href="/PermaLink.aspx?guid=33aed348-a990-40bd-9a01-7b903b918b55"> String.toCharArray()</a>). These were sort of hacked into the compiler and I finally decided to clean that up a little and add more scalable support for <a href="http://ikvm.cvs.sourceforge.net/ikvm/ikvm/runtime/intrinsics.cs?view=markup"> adding intrinsincs</a>. The trigger to do this was that I added four more intrinsics: <a href="http://java.sun.com/javase/6/docs/api/java/lang/Float.html#floatToRawIntBits(float)"> Float.floatToRawIntBits()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/Float.html#intBitsToFloat(int)"> Float.intBitsToFloat()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/Double.html#doubleToRawLongBits(double)"> Double.doubleToRawLongBits()</a> and <a href="http://java.sun.com/javase/6/docs/api/java/lang/Double.html#longBitsToDouble(long)"> Double.longBitsToDouble()</a>. </p> <p> <b>Benchmark</b> </p> <p> Here's a micro benchmark: </p> <p> <code><font color="#0000FF">public class</font> <font color="#2b91af">test</font> {<br> &nbsp; <font color="#0000FF">public static void</font> main(<font color="#2B91AF">String</font>[] args) {<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">long</font> sum = 1;<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">long</font> start = <font color="#2B91AF">System</font>.currentTimeMillis();<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">for</font> (<font color="#0000FF">int</font> i = 0; i &lt; 10000000; i++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += <font color="#2B91AF">Double</font>.doubleToRawLongBits(sum);<br> &nbsp;&nbsp;&nbsp; }<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">long</font> end = <font color="#2B91AF">System</font>.currentTimeMillis();<br> &nbsp;&nbsp;&nbsp; <font color="#2B91AF">System</font>.out.println(end - start);<br> &nbsp;&nbsp;&nbsp; <font color="#2B91AF">System</font>.out.println(sum);<br> &nbsp; }<br> }</code> </p> <p> Here are the results: </p> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td style="border-right: solid 1px black; border-bottom: solid 1px black"> &nbsp;</td> <td style="border-bottom: solid 1px black"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x86 (aligned)</td> <td style="border-bottom: solid 1px black"> &nbsp;&nbsp;&nbsp; x86 (unaligned)</td> <td style="border-bottom: solid 1px black"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; x64</td> </tr> <tr> <td style="border-right: solid 1px black"> JDK 1.6 HotSpot Server VM&nbsp;&nbsp;&nbsp; </td> <td align="right"> 287</td> <td align="right"> &nbsp;</td> <td align="right"> 109</td> </tr> <tr> <td style="border-right: solid 1px black"> JDK 1.6 HotSpot Client VM</td> <td align="right"> 335</td> <td align="right"> &nbsp;</td> <td align="right"> &nbsp;</td> </tr> <tr> <td style="border-right: solid 1px black"> IKVM 0.36 .NET 1.1</td> <td align="right"> 479</td> <td align="right"> 565</td> <td align="right"> &nbsp;</td> </tr> <tr> <td style="border-right: solid 1px black"> IKVM 0.36 .NET 2.0</td> <td align="right"> 570</td> <td align="right"> 704</td> <td align="right"> 124</td> </tr> <tr> <td style="border-right: solid 1px black"> IKVM 0.37</td> <td align="right"> 338</td> <td align="right"> 468</td> <td align="right"> 101</td> </tr> </table> <p> <br> Since the x86 .NET results are highly sensitive as to whether the double on the stack <a href="/PermaLink.aspx?guid=f300c4e1-15b0-45ed-b6a6-b5dc8fb8089e"> happens to be aligned or not</a>, I included both results. </p> <p> <b>Implementation</b> </p> <p> Here's the MSIL that IKVM generates for the loop: </p> <p> <code>IL_000b:&nbsp;&nbsp; ldloc.2<br> IL_000c:&nbsp;&nbsp; ldc.i4&nbsp;&nbsp;&nbsp; 0x989680<br> IL_0011:&nbsp;&nbsp; bge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IL_0028<br> IL_0016:&nbsp;&nbsp; ldloc.0<br> IL_0017:&nbsp;&nbsp; ldloc.0<br> IL_0018:&nbsp;&nbsp; conv.r8<br> IL_0019:&nbsp;&nbsp; ldloca.s&nbsp; V_3<br> IL_001b:&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int64 [IKVM.Runtime]IKVM.Runtime.DoubleConverter::ToLong(float64,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valuetype [IKVM.Runtime]IKVM.Runtime.DoubleConverter&amp;)<br> IL_0020:&nbsp;&nbsp; add<br> IL_0021:&nbsp;&nbsp; stloc.0<br> IL_0022:&nbsp;&nbsp; ldloc.2<br> IL_0023:&nbsp;&nbsp; ldc.i4.1<br> IL_0024:&nbsp;&nbsp; add<br> IL_0025:&nbsp;&nbsp; stloc.2<br> IL_0026:&nbsp;&nbsp; br.s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IL_000b</code> </p> <p> The conversion isn't actually inlined, but instead a local variable of value type <code>IKVM.Runtime.DoubleConverter</code> is added to the method and a static method on that type that takes the value to be converted and a reference to the local variable is called. Here's the code for <code>IKVM.Runtime.DoubleConverter</code>: </p> <p> <code>[<font color="#2B91AF">StructLayout</font>(<font color="#2B91AF">LayoutKind</font>.Explicit)]<br> <font color="#0000FF">public struct</font> <font color="#2B91AF">DoubleConverter</font> <br> {<br> &nbsp; [<font color="#2B91AF">FieldOffset</font>(0)]<br> &nbsp; <font color="#0000FF">private double</font> d;<br> &nbsp; [<font color="#2B91AF">FieldOffset</font>(0)]<br> &nbsp; <font color="#0000FF">private long</font> l;<br> <br> &nbsp; <font color="#0000FF">public static long</font> ToLong(<font color="#0000FF">double</font> value, <font color="#0000FF">ref</font> <font color="#2B91AF">DoubleConverter</font> converter)<br> &nbsp; {<br> &nbsp;&nbsp;&nbsp; converter.d = value;<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">return</font> converter.l;<br> &nbsp; }<br> <br> &nbsp; <font color="#0000FF">public static double</font> ToDouble(<font color="#0000FF">long</font> value, <font color="#0000FF">ref</font> <font color="#2B91AF">DoubleConverter</font> converter)<br> &nbsp; {<br> &nbsp;&nbsp;&nbsp; converter.l = value;<br> &nbsp;&nbsp;&nbsp; <font color="#0000FF">return</font> converter.d;<br> &nbsp; }<br> }</code> </p> <p> It uses the .NET feature that allows you to explicitly control the layout of a struct&nbsp; to overlay the double and long fields. Note that this construct is fully verifiable. </p> <p> For comparison, the standard <a href="http://msdn.microsoft.com/en-us/library/system.bitconverter.doubletoint64bits(VS.71).aspx"> System.BitConverter.DoubleToInt64Bits()</a> uses unsafe code and looks something like this: </p> <p> <code><font color="#0000FF">public static unsafe long</font> DoubleToInt64Bits(<font color="#0000FF">double</font> value)<br> {<br> &nbsp; <font color="#0000FF">return</font> *((<font color="#0000FF">long</font>*)&amp;value);<br> }</code> </p> <p> For some reason (probably because it isn't verifiable) the JIT doesn't like this so much and doesn't inline this method. </p> <p> <b>JIT Code</b> </p> <p> Here's the x86 code generated by the .NET 2.0 SP1 JIT: </p> <p> <code>049E15CE&nbsp; cmp&nbsp;&nbsp;&nbsp; ebx,989680h<br> 049E15D4&nbsp; jge&nbsp;&nbsp;&nbsp; 049E1600 <br> 049E15D6&nbsp; lea&nbsp;&nbsp;&nbsp; ecx,[esp+8] <br> 049E15DA&nbsp; mov&nbsp;&nbsp;&nbsp; dword ptr [esp+10h],esi <br> 049E15DE&nbsp; mov&nbsp;&nbsp;&nbsp; dword ptr [esp+14h],edi <br> 049E15E2&nbsp; fild&nbsp;&nbsp; qword ptr [esp+10h] <br> 049E15E6&nbsp; fstp&nbsp;&nbsp; qword ptr [esp+10h] <br> 049E15EA&nbsp; fld&nbsp;&nbsp;&nbsp; qword ptr [esp+10h] <br> 049E15EE&nbsp; fstp&nbsp;&nbsp; qword ptr [ecx] <br> 049E15F0&nbsp; mov&nbsp;&nbsp;&nbsp; eax,dword ptr [ecx] <br> 049E15F2&nbsp; mov&nbsp;&nbsp;&nbsp; edx,dword ptr [ecx+4] <br> 049E15F5&nbsp; add&nbsp;&nbsp;&nbsp; eax,esi <br> 049E15F7&nbsp; adc&nbsp;&nbsp;&nbsp; edx,edi <br> 049E15F9&nbsp; mov&nbsp;&nbsp;&nbsp; esi,eax <br> 049E15FB&nbsp; mov&nbsp;&nbsp;&nbsp; edi,edx <br> 049E15FD&nbsp; inc&nbsp;&nbsp;&nbsp; ebx <br> 049E15FE&nbsp; jmp&nbsp;&nbsp;&nbsp; 049E15CE</code> </p> <p> Here's the x64 code generated by the .NET 2.0 SP1 JIT: </p> <p> <code>00000642805B8A90&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,989680h<br> 00000642805B8A96&nbsp; jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00000642805B8AB1 <br> 00000642805B8A98&nbsp; cvtsi2sd&nbsp;&nbsp; xmm0,rdi <br> 00000642805B8A9D&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rax,[rsp+20h] <br> 00000642805B8AA2&nbsp; movsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mmword ptr [rax],xmm0 <br> 00000642805B8AA6&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rax,qword ptr [rax] <br> 00000642805B8AA9&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rdi,rax <br> 00000642805B8AAC&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,1 <br> 00000642805B8AAF&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00000642805B8A90</code> </p> <p> In both cases the construct is inlined properly. It is also obvious why the x64 code is so much faster, it uses SSE (as we've seen before) and only uses one memory store/load combination. </p> <p> <b>HotSpot</b> </p> <p> For completeness, here's the code generated by HotSpot x64: </p> <p> <code>0000000002772EA0&nbsp; cvtsi2sd&nbsp;&nbsp; xmm0,r11 <br> 0000000002772EA5&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,10h <br> 0000000002772EA8&nbsp; movsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mmword ptr [rsp+20h],xmm0 <br> 0000000002772EAE&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r10,qword ptr [rsp+20h] <br> 0000000002772EB3&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r10,r11 <br> 0000000002772EB6&nbsp; cvtsi2sd&nbsp;&nbsp; xmm0,r10 <br> 0000000002772EBB&nbsp; movsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mmword ptr [rsp+20h],xmm0 <br> 0000000002772EC1&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r11,qword ptr [rsp+20h] <br> 0000000002772EC6&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r11,r10 <br> 0000000002772EC9&nbsp; cvtsi2sd&nbsp;&nbsp; xmm0,r11 <br> 0000000002772ECE&nbsp; movsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mmword ptr [rsp+20h],xmm0 <br> 0000000002772ED4&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r10,qword ptr [rsp+20h] <br> 0000000002772ED9&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r10,r11 <br> [...]<br> 0000000002772FC0&nbsp; cvtsi2sd&nbsp;&nbsp; xmm0,r10 <br> 0000000002772FC5&nbsp; movsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mmword ptr [rsp+20h],xmm0 <br> 0000000002772FCB&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r11,qword ptr [rsp+20h] <br> 0000000002772FD0&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r11,r10 <br> 0000000002772FD3&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,r9d <br> 0000000002772FD6&nbsp; jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000000002772EA0</code> </p> <p> It actually unrolled the loop 16 times (which appears not be helping in the case), but otherwise the code generated is pretty similar to what we saw on the CLR. Of course, in HotSpot <code>Double.doubleToRawIntBits()</code> is also an intrinsic because in Java the only alternative would be to write it in native code and the JNI transition would add significant overhead in this case. </p> <img width="0" height="0" src="http://weblog.ikvm.net/aggbug.ashx?id=0404dd8a-88a8-4d62-9bcb-98324d57a2a9"> http://weblog.ikvm.net/PermaLink.aspx?guid=0404dd8a-88a8-4d62-9bcb-98324d57a2a9 Jeroen_x0020_Frijters@monologue.go-mono.com http://weblog.ikvm.net/CommentView.aspx?guid=0404dd8a-88a8-4d62-9bcb-98324d57a2a9 http://weblog.ikvm.net/PermaLink.aspx?guid=0404dd8a-88a8-4d62-9bcb-98324d57a2a9 Fri, 09 May 2008 05:27:51 GMT Rodrigo B de Oliveira: Towards Extensible Parsing <p style="font-size: 15px;">Almost four years ago <a href="http://jira.codehaus.org/browse/BOO-1">the first feature request</a> was entered into the boo issue tracker.</p> <blockquote> <p style="font-size: 15px;">There should be a way to extend the parser so it could recognize custom measurement unit literals such as <strong>1kg</strong> and <strong>2cm</strong>.</p> </blockquote> <p style="font-size: 15px;">Since then boo has improved a lot but with no solution for BOO-1 in the horizon.</p> <p style="font-size: 15px;">I think I'm getting close to solve it in a interesting way using <a href="http://citeseer.ist.psu.edu/643425.html">PEGs</a> implemented as a <a href="http://en.wikipedia.org/wiki/Interpreter_pattern">graph of expression objects</a>.</p> <p style="font-size: 15px;">PEGs are very likable. Conceptually simple and composable.</p> <p style="font-size: 15px;">Take the PEG that recognizes integer expressions involving the <strong>+</strong> and <strong>*</strong> operators:</p> <blockquote> <p style="font-size: 15px;">grammar &lt;- spaces addition eof<br /> addition &lt;- term ("+" spaces term)*<br /> term &lt;- factor ("*" spaces factor)*<br /> factor &lt;- [0-9]+ spaces<br /> spaces &lt;- (' ' / '\t')*<br /> eof &lt;- !.</p> </blockquote> <p style="font-size: 15px;">where:</p> <blockquote> <p style="font-size: 15px;"><strong>()</strong> means grouping.</p> <p style="font-size: 15px;"><strong>*</strong> means zero or more matches.</p> <p style="font-size: 15px;"><strong>+</strong> means one or more matches.</p> <p style="font-size: 15px;"><strong>/</strong> is the prioritized choice operator. If the first expression succeeds, the whole expression succeeds. If the first expression fails, it backtracks and evaluates the second expression.</p> <p style="font-size: 15px;"><strong>!</strong> is the not predicate operator which succeeds if its operand fails. It never consumes any input.</p> <p style="font-size: 15px;"><strong>.</strong> matches any input.</p> </blockquote> <p style="font-size: 15px;">The grammar can be translated to boo very simply using the <strong>peg</strong> macro from <a href="http://code.google.com/p/boo-extensions/source/browse/trunk/extensions/src/Boo.Pegs">Boo.Pegs</a>:</p> <blockquote> <pre> <font color="#000000"><font color="#006699"><strong>import</strong></font> Boo.Pegs peg<font color="#000000"><strong>:</strong></font> grammar <font color="#000000"><strong>=</strong></font> spaces, addition, eof addition <font color="#000000"><strong>=</strong></font> term, <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC">+</font><font color="#FF00CC">"</font>, spaces, term<font color="#000000"><strong>)</strong></font> term <font color="#000000"><strong>=</strong></font> factor, <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC">*</font><font color="#FF00CC">"</font>, spaces, factor<font color="#000000"><strong>)</strong></font> factor <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>++</strong></font><font color="#000000"><strong>[</strong></font><font color="#FF0000">0</font><font color="#000000"><strong>-</strong></font><font color="#FF0000">9</font><font color="#000000"><strong>]</strong></font>, spaces spaces <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#CC00CC">'</font><font color="#CC00CC"> </font><font color="#CC00CC">'</font> <font color="#000000"><strong>/</strong></font> <font color="#CC00CC">'</font><font color="#CC00CC">\t</font><font color="#CC00CC">'</font><font color="#000000"><strong>)</strong></font> eof <font color="#000000"><strong>=</strong></font> <font color="#006699"><strong>not</strong></font> any<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#0099FF"><strong>assert</strong></font> grammar.Match<font color="#000000"><strong>(</strong></font>PegContext<font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC"> </font><font color="#FF00CC"> </font><font color="#FF00CC">6</font><font color="#FF00CC">*</font><font color="#FF00CC">6</font><font color="#FF00CC"> </font><font color="#FF00CC">+</font><font color="#FF00CC"> </font><font color="#FF00CC">6</font><font color="#FF00CC"> </font><font color="#FF00CC">"</font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font></font> </pre> </blockquote> <p style="font-size: 15px;">I had to be a little creative in mapping the PEG operators to valid boo expressions because as it must be clear by now boo doesn't allow the introduction of completely new syntax and that's what the fuss is all about here.</p> <p style="font-size: 15px;">I actually like the way it looks.</p> <p style="font-size: 15px;">Implementing something more useful such as expression evaluation on top of that requires a few semantic actions operating a stack:</p> <blockquote> <pre> <font color="#000000"><font color="#006699"><strong>import</strong></font> Boo.Pegs <font color="#006699"><strong>import</strong></font> System.Collections.Generic stack <font color="#000000"><strong>=</strong></font> Stack<font color="#000000"><strong>[</strong></font><font color="#006699"><strong>of</strong></font> <font color="#009966"><strong>int</strong></font><font color="#000000"><strong>]</strong></font><font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> push <font color="#000000"><strong>=</strong></font> stack.Push pop <font color="#000000"><strong>=</strong></font> stack.Pop peg<font color="#000000"><strong>:</strong></font> grammar <font color="#000000"><strong>=</strong></font> spaces, addition, eof addition <font color="#000000"><strong>=</strong></font> term, <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC">+</font><font color="#FF00CC">"</font>, spaces, term, <font color="#000000"><strong>{</strong></font> push<font color="#000000"><strong>(</strong></font>pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>+</strong></font> pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>}</strong></font><font color="#000000"><strong>)</strong></font> term <font color="#000000"><strong>=</strong></font> factor, <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC">*</font><font color="#FF00CC">"</font>, spaces, factor, <font color="#000000"><strong>{</strong></font> push<font color="#000000"><strong>(</strong></font>pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>*</strong></font> pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>}</strong></font><font color="#000000"><strong>)</strong></font> factor <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>++</strong></font><font color="#000000"><strong>[</strong></font><font color="#FF0000">0</font><font color="#000000"><strong>-</strong></font><font color="#FF0000">9</font><font color="#000000"><strong>]</strong></font>, <font color="#000000"><strong>{</strong></font> push<font color="#000000"><strong>(</strong></font><font color="#009966"><strong>int</strong></font>.Parse<font color="#000000"><strong>(</strong></font>$text<font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>}</strong></font>, spaces spaces <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font><font color="#CC00CC">'</font><font color="#CC00CC"> </font><font color="#CC00CC">'</font> <font color="#000000"><strong>/</strong></font> <font color="#CC00CC">'</font><font color="#CC00CC">\t</font><font color="#CC00CC">'</font><font color="#000000"><strong>)</strong></font> eof <font color="#000000"><strong>=</strong></font> <font color="#006699"><strong>not</strong></font> any<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#0099FF"><strong>assert</strong></font> grammar.Match<font color="#000000"><strong>(</strong></font>PegContext<font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC"> </font><font color="#FF00CC"> </font><font color="#FF00CC">6</font><font color="#FF00CC">*</font><font color="#FF00CC">6</font><font color="#FF00CC"> </font><font color="#FF00CC">+</font><font color="#FF00CC"> </font><font color="#FF00CC">6</font><font color="#FF00CC"> </font><font color="#FF00CC">"</font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#0099FF"><strong>assert</strong></font> <font color="#FF0000">42</font> <font color="#000000"><strong>=</strong></font><font color="#000000"><strong>=</strong></font> pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font></font> </pre> </blockquote> <p style="font-size: 15px;">Semantic actions are just closures that get executed as matching succeeds. <strong>$text</strong> returns the text matched so far by the current rule.</p> <p style="font-size: 15px;">Beautiful.</p> <p style="font-size: 15px;">The underlying implementation based on a graph of expression objects really shines when one considers what it takes to extend the grammar above with support for hexadecimal literals:</p> <blockquote> <pre> <font color="#000000">peg<font color="#000000"><strong>:</strong></font> <font color="#CC0000">//</font><font color="#CC0000"> </font><font color="#CC0000">rebind</font> factor.Expression <font color="#000000"><strong>=</strong></font> hex_number <font color="#000000"><strong>/</strong></font> factor.Expression hex_number <font color="#000000"><strong>=</strong></font> <font color="#FF00CC">"</font><font color="#FF00CC">0x</font><font color="#FF00CC">"</font>, <font color="#000000"><strong>++</strong></font>hex_digit, <font color="#000000"><strong>{</strong></font> push<font color="#000000"><strong>(</strong></font><font color="#009966"><strong>int</strong></font>.Parse<font color="#000000"><strong>(</strong></font>$text<font color="#000000"><strong>[</strong></font><font color="#FF0000">2</font><font color="#000000"><strong>:</strong></font><font color="#000000"><strong>]</strong></font>, NumberStyles.HexNumber<font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>}</strong></font>, spaces hex_digit <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>[</strong></font><font color="#FF0000">0</font><font color="#000000"><strong>-</strong></font><font color="#FF0000">9</font>, a<font color="#000000"><strong>-f</strong></font>, A<font color="#000000"><strong>-<span style="font-weight: normal;">F</span></strong></font><font color="#000000"><strong>]</strong></font> <font color="#0099FF"><strong>assert</strong></font> grammar.Match<font color="#000000"><strong>(</strong></font>PegContext<font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC"> </font><font color="#FF00CC"> </font><font color="#FF00CC">0xa</font><font color="#FF00CC">*</font><font color="#FF00CC">2</font><font color="#FF00CC"> </font><font color="#FF00CC">+</font><font color="#FF00CC"> </font><font color="#FF00CC">11</font><font color="#FF00CC">*</font><font color="#FF00CC">0x02</font><font color="#FF00CC">"</font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font> <font color="#0099FF"><strong>assert</strong></font> <font color="#FF0000">42</font> <font color="#000000"><strong>=</strong></font><font color="#000000"><strong>=</strong></font> pop<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font></font> </pre> </blockquote> <p style="font-size: 15px;">It's not yet clear how this extensibility mechanism will be exposed at the boo language level but the simplicity at the peg level is encouraging.</p> <p style="font-size: 15px;">One last feature worth pointing out is the ability to match based on a previously matched rule. For instance, the closing tag of a xml element must match the name in the starting tag:</p> <blockquote> <pre> <font color="#000000"><font color="#006699"><strong>import</strong></font> Boo.Pegs peg<font color="#000000"><strong>:</strong></font> element <font color="#000000"><strong>=</strong></font> <font color="#CC00CC">'</font><font color="#CC00CC">&lt;</font><font color="#CC00CC">'</font>, tag, <font color="#CC00CC">'</font><font color="#CC00CC">&gt;</font><font color="#CC00CC">'</font>, content, <font color="#CC00CC">'</font><font color="#CC00CC">'</font>, @tag, <font color="#CC00CC">'</font><font color="#CC00CC">&gt;</font><font color="#CC00CC">'</font> tag <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>++</strong></font><font color="#000000"><strong>(</strong></font>a<font color="#000000"><strong>-</strong></font>z<font color="#000000"><strong>)</strong></font> content <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>--</strong></font><font color="#000000"><strong>(</strong></font>element <font color="#000000"><strong>/</strong></font> text<font color="#000000"><strong>)</strong></font> text <font color="#000000"><strong>=</strong></font> <font color="#006699"><strong>not</strong></font> <font color="#FF00CC">"</font><font color="#FF00CC">&lt;</font><font color="#FF00CC">"</font>, any<font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#0099FF"><strong>assert</strong></font> element.Match<font color="#000000"><strong>(</strong></font>PegContext<font color="#000000"><strong>(</strong></font><font color="#FF00CC">"</font><font color="#FF00CC">&lt;</font><font color="#FF00CC">foo</font><font color="#FF00CC">&gt;</font><font color="#FF00CC">&lt;</font><font color="#FF00CC">bar</font><font color="#FF00CC">&gt;</font><font color="#FF00CC">Hello</font><font color="#FF00CC">&lt;</font><font color="#FF00CC">/</font><font color="#FF00CC">bar</font><font color="#FF00CC">&gt;</font><font color="#FF00CC">&lt;</font><font color="#FF00CC">/</font><font color="#FF00CC">foo</font><font color="#FF00CC">&gt;</font><font color="#FF00CC">"</font><font color="#000000"><strong>)</strong></font><font color="#000000"><strong>)</strong></font></font> </pre> </blockquote> <p style="font-size: 15px;">I've found the idea for the <span style="font-style: italic;">last</span> <span style="font-style: italic;">match</span> operator <strong>@</strong> first described in <a href="http://www.mail-archive.com/peg@lists.csail.mit.edu/msg00020.html">this article</a>. Great idea.</p> <p style="font-size: 15px;">I've been also greatly inspired by conversations I've had with <a href="http://primates.ximian.com/~massi/blog/">Massi</a> who's <a href="http://primates.ximian.com/~massi/blog/archive/2008/Feb-03.html">exploring similar territory</a> and <a href="http://evain.net/blog/">Jb</a> during the last Mono Meeting in Barcelona and with <a href="http://www.ohloh.net/accounts/3973">Cedric</a> over a beer in Paris. I think Massi will be pleased to know that I haven't given any thoughts to performance leaving all the fun to him.</p> <p style="font-size: 15px;">Extensible parsing. Soon in a boo compiler close to you.</p> <p style="font-size: 15px;"><br /></p> http://blogs.codehaus.org/people/bamboo/archives/001688_towards_extensible_parsing.html Rodrigo_x0020_B_x0020_de_x0020_Oliveira@monologue.go-mono.com http://blogs.codehaus.org/people/bamboo/archives/001688_towards_extensible_parsing.html Thu, 08 May 2008 22:40:19 GMT Gabriel Burt: Banshee Podcast Support Coming in Beta 2 First, a quick note to people using the Ubuntu Banshee 1.0 PPA packages. Unfortunately, the packager messed up and at first released packages without iPod or MTP support. And now it has come to my attention (via comments and bugs from disappointed users) that the packages include the podcast extension, when it is pre-alpha and should not have been included. Hopefully the Ubuntu guys will get fixed packages out soon, and be more careful with packaging in the future. <a href="http://stompbox.typepad.com/blog/">Jorge</a> is working to make things right.<br /><br />We do expect to have the podcast extension ready by Beta 2. And Beta 2 will have auto-rip support which I just committed last night. After enabling it in your Preferences, whenever you insert a CD it will automatically begin importing it, if it's not already in your library and if MusicBrainz information can be found for it. Very useful if you are ripping many CDs. http://gburt.blogspot.com/2008/05/banshee-podcast-support-coming-in-beta.html banshee freesoftware gnome Gabriel_x0020_Burt@monologue.go-mono.com tag:blogger.com,1999:blog-33979271.post-1825229502850185800 Thu, 08 May 2008 13:32:00 GMT Joe Audette: 10th Design of 11 Completed - styleshout-stylevantage and styleshout-cistrusisland <p>I've completed the 10th design of my <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">11 design campaign</a>, which resulted in 2 skins, <a href="http://www.styleshout.com/templates/preview/Stylevantage1-0/index.html">styleshout-stylevantage</a> and <a href="http://www.styleshout.com/templates/preview/CitrusIsland1-1/index.html">styleshout-citrusisland</a>, which can be seen on <a href="http://demo.mojoportal.com/">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p><img width="500" height="545" src="http://www.mojoportal.com/Data/Sites/1/stylevantage-screen.jpg" alt="styleshout-stylevantage skin screen shot" /></p> <p><img width="500" height="545" src="http://www.mojoportal.com/Data/Sites/1/citrusisland-screen.jpg" alt="styleshout-citrusisland skin screen shot" /></p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=451&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=451 Joe_x0020_Audette@monologue.go-mono.com Thu, 08 May 2008 12:06:53 GMT Joe Audette: 9th Design of 11 Completed - styleshout-brightsideoflife <p>I've completed the 9th design of <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">my 11 design campaign</a>, <a href="http://www.styleshout.com/templates/preview/BrightSide1-0/index.html">styleshout-brightsideoflife</a>, which can be seen on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p><img width="500" height="490" alt="styleshout-brightsideoflife skin screen shot" src="http://www.mojoportal.com/Data/Sites/1/brightside-screen.jpg" /></p> <p>This will be in svn trunk later today for developers and will be in the next release of <a href="http://www.mojoportal.com">mojoPortal</a> for everyone else, hopefully available sometime this weekend.</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=450&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=450 Joe_x0020_Audette@monologue.go-mono.com Thu, 08 May 2008 05:08:36 GMT Joe Audette: 8th Design of 11 Completed - snop-plasticboy-reflection <p>I've now completed 11 skins based on 8 designs of my <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">10 design campaign</a>. The newest is <a href="http://www.openwebdesign.org/viewdesign.phtml?id=2083">snop-plasticboy-reflection</a>, which can currently be seen on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p><img width="500" height="533" alt="snop-plasticboy-reflection skin screen shot" src="http://www.mojoportal.com/Data/Sites/1/snop-platicboy-ref.gif" /></p> <p>A few of the designs I've made alternate versions of which accounts for 11 skins so far. I really only need 2 more designs to meet my original goal but I've decided to do 1 extra design. The 3 remaining designs will actually result in 6 more skins. These are the designs I've chosen to complete this skinning campaign:</p> <p><a href="http://www.styleshout.com/templates/preview/BrightSide1-0/index.html">styleshout-brightsideoflife</a><br /> <a href="http://www.styleshout.com/templates/preview/CitrusIsland1-1/index.html">styleshout-citrusisland</a> and&nbsp; <a href="http://www.styleshout.com/templates/preview/Stylevantage1-0/index.html">styleshout-stylevantage</a> (which I consider as variations on the same design)<br /> <a href="http://www.styleshout.com/templates/preview/Refresh1-0/index.html">styleshout-refresh</a>, <a href="http://www.styleshout.com/templates/preview/Envision1-1/index.html">styleshout-envision</a>, and <a href="http://www.styleshout.com/templates/preview/CoolWater1-0/index.html">styleshout-coolwater</a>, which are all variations on the same design in my opinion.</p> <p>Hopefully, I can complete all of these by sometime this weekend and then ship a new release with all these new skins.</p> <p>&nbsp;</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=449&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=449 Joe_x0020_Audette@monologue.go-mono.com Wed, 07 May 2008 09:20:56 GMT Gabriel Burt: Banshee 1.0 Beta 1 Released We have just released <a href="http://banshee-project.org/Releases/0.99.1">Banshee 1.0 Beta 1</a>, aka 0.99.1! This release adds some major features and lots of polish.<br /><br /><ul><li> View the <a href="http://banshee-project.org/Releases/0.99.1">release notes</a><br /><li> <a href="http://banshee-project.org/files/banshee/banshee-1-0.99.1.tar.bz2">Banshee 1.0 Beta 1 Source (bz2)</a><br /><li> <a href="http://opensuse.org/">openSUSE</a> 10.3 users can <a href="http://download.opensuse.org/repositories/Banshee:/Preview/openSUSE_10.3/banshee.ymp"><img src="http://banshee-project.org/files/1click-install-button.png" border="0"></a><br /><li> Foresight 2.0 users: Use PackageKit or Conary to install banshee-1</ul><br />MTP and iPod device support have landed! Both MTP and iPod support <b>album artwork</b>, on-the-fly <b>transcoding</b> (converting between file formats), and <b>video support</b>!<br /><br /><img src="http://banshee-project.org/files/shots/banshee_0.99.1_animated.gif" alt="Animation showing Banshee playing music, transferring files to a MTP device, and showing large cover art." width="600" height="397" /><br /><span style="font-size:small;"><i>Banshee playing music, showing cover art, and transferring to an MTP device</i></span><br /><br />Other features and fixes include:<br /><ul><li>Fullscreen video playback (go to Now Playing and press f or hit the Fullscreen button)</li><li>Extensions can be enabled and disabled in the new Mange Extensions tab within your Preferences.</li><li>Banshee <a href="http://mail.gnome.org/archives/banshee-list/2008-May/msg00000.html">can be scripted</a> using <a href="http://boo.codehaus.org/">Boo</a></li><li>Improved gstreamer error handling (for missing files, codecs, etc)</li><li>A bug with play counts, introduced in Alpha 3, has been fixed</li><li>Writing metadata to file was not working in the Alphas, is fixed</li><li>Issues with the play queue should all be resolved</li><li>Limiting smart playlists by file size or duration works</li><li>Shuffle and repeat are automatically disabled while playing Last.fm</li></ul><br /><div style="float: right;"><img src="http://bp1.blogger.com/_MXUP18ra1ik/SCDJPMlTlfI/AAAAAAAAAZw/gD0vmFWRfTc/s400/default_smart_playlists.png" alt="Default smart playlists in Banshee" border="0" width="179" height="247" /><br /><span style="font-size:small;"><i>Default Smart Playlists</i></span></div>This release also features default smart playlists, created for new users and users with zero smart playlists. There is a more extensive list of predefined smart playlists, including the defaults, available in the <i>New Smart Playlist</i> dialog.<br /><br />Thanks to <a href="http://abock.org">Aaron Bockover</a>, <a href="http://blogs.mediati.org/alex">Alexander Hixon</a>, Bertrand Lorentz, Christopher Rogers, <a href="http://themonkeysgrinder.blogspot.com/">Scott Peterson</a>, Sebastian Dröge, and <a href="http://uwstopia.nl/blog/">Wouter Bolsterlee</a> for code contributions for this release, and to Daniel Nylander (sv), Gabor Kelemen (hu), Jordi Mas (ca), and Wouter Bolsterlee (nl) for updated translations! And to <a href="http://stompbox.typepad.com/blog/">Jorge Castro</a> for testing and release notes help, and Michael Monreal and Andrew Conkling for testing and bugzilla work!<br /><br />You can follow the posts of Banshee contributors on <a href="http://planet.banshee-project.org/">Planet Banshee</a>. We are a friendly, vibrant community and always glad to have people join us! If you have been wanting to contribute back to free software and GNOME, I think you'll find Banshee's code and C# a <a href="http://gburt.blogspot.com/2008/03/banshee-10-alpha-1.html">pleasure to work</a> in, and a healthy amount of support and encouragement from a very active community. <a href="http://banshee-project.org/Developers">Join us</a> on our <a href="http://mail.gnome.org/mailman/listinfo/banshee-list">mailing list</a>, in our <a href="irc://irc.gnome.org/#banshee">IRC chatroom</a>, and on our <a href="http://banshee-project.org/Main_Page">wiki</a>!<br /><br /><font size="small"><a href="http://digg.com/linux_unix/Banshee_1_0_Beta_1_Released_MTP_iPod_Sync_Including_Video"><strong>Digg It!</strong></a></font><br /><p style="padding-top: 1em"><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p> http://gburt.blogspot.com/2008/05/banshee-10-beta-1-released.html banshee freesoftware gnome Gabriel_x0020_Burt@monologue.go-mono.com tag:blogger.com,1999:blog-33979271.post-384459606710991212 Tue, 06 May 2008 19:11:00 GMT Vladimir Vukicevic: Well Isn?t That Qt I and a few others have been poking at our widget layer for the past few weeks, looking at adding Qt support.  There was an earlier attempt at a Qt backend, but it never really got maintained, and there wasn't much interest in it back then.  Recently, though, Qt has made great strides on embedded [...] http://blog.vlad1.com/2008/05/06/well-isnt-that-qt/ Mozilla gecko gfx qt widget Vladimir_x0020_Vukicevic@monologue.go-mono.com http://blog.vlad1.com/2008/05/06/well-isnt-that-qt/#comments http://blog.vlad1.com/?p=55 Tue, 06 May 2008 15:53:12 GMT Miguel de Icaza: Cross-platform, standalone Silverilght Applications <p>Tamir Khason <a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/02/stand-alone-multiplatform-silverlight-application.aspx">published an interesting approach</a> at hosting standalone Silverlight applications. <p>His solution is a Windows.Forms application that hosts a Windows.Forms.WebControl and inside the WebControl he hosts Silverlight. <p>Unlike <a href="http://tirania.org/blog/archive/2008/Apr-17.html">my proposal</a> for standalone Silverlight Applications that is currently Moonlight-specific (and currently limited to Linux/X11) this approach works on Windows with .NET and with Linux using Mono and Moonlight: <center> <img src="http://primates.ximian.com/~miguel/pictures/image_bd3dfa68-9af8-41c0-bb75-eb150c3500eb.png"> <p><i>Left side: .NET hosting WebControl and Silverlight on Windows; Right side: Mono hosting WebControl and Moonlight running on Linux.</i> </center> <p>In addition to hosting the WebControl for hosting Silverlight, a thread is running to dispatch http requests locally using HttpListener. HttpListener is an embeddable HTTP server that is part of the class libraries, and exposes a very limited API. You can host ASP.NET with HttpListener by doing the bindings by hand, or you could use our Mono.WebServer library (part of our XSP/mod_mono distribution) to allow your applications to have a fully hosted ASP.NET server. <p>Mono.WebServer is what <a href="http://www.ifolder.com">iFolder</a> uses to embed the ASP.NET server to expose SOAP-based WebServices to clients. <p>Of course, this currently does not work on MacOS X as we do have no implementation of WebControl for Windows.Forms on OSX, something that a contributor might want to look into. <p>You can get the source for the sample from <a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/02/stand-alone-multiplatform-silverlight-application.aspx">Tamir's page</a>. http://tirania.org/blog/archive/2008/May-06-1.html Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com http://tirania.org/blog/archive/2008/May-06-1.html Tue, 06 May 2008 15:41:00 GMT Miguel de Icaza: Consulting Gig at Novell <p>We are looking for consultants to work on a six to nine month project at Novell to write a prototype for a Visual Studio addin in C# or C++ that will connect Visual Studio and its debugging infrastructure to a remote Linux machine running Mono and the Mono Debugger. <p>If you are interested in working with us in this project, you must have good C# and C++ skills, experience with networking and protocol design, knowledge of COM and assembly language programming are pluses. <p>We are looking to bring two consultants for the duration of this project. If you are interested, please <a href="mailto:miguel@novell.com?Subject=VSDebuggerApplication">click this link</a> and attach your resume, pointers to some existing projects of yours and so on. http://tirania.org/blog/archive/2008/May-06.html Miguel_x0020_de_x0020_Icaza@monologue.go-mono.com http://tirania.org/blog/archive/2008/May-06.html Tue, 06 May 2008 14:06:00 GMT Andres G. Aragoneses: Now Gnash is to Flash what Mono is to .NET And we have to thank the cool <a href="http://www.osnews.com/story/19703/Adobe_Launches_Open_Screen_Project">Adobe's Open Screen Project</a> for this. Why is this positive (extracted originally from <a href="http://barrapunto.com/comments.pl?sid=76487&cid=1039558">here</a>)?<br /><br />1) Projects that seek to implement this standard (like <a href="http://www.gnu.org/software/gnash/">Gnash</a>), won't have to do reverse engineering anymore (unless the spec is not enough for some things, or the official Adobe software contradicts the specs because of bugs/typos).<br /><br />2) These projects will provide implementations for architectures that are not supported by the official Adobe propietary software.<br /><br />3) The implementations will no longer be considered risky because of future patents or intellectual property violations.<br /><br />But, BEWARE:<br /><br />a) this doesn't mean that Flash is now free/open source. This only means that projects like Gnash are analogous as Mono right now: they are open source projects that follow a standard published by a company with an open spec.<br /><br />b) this doesn't mean that any flash content is patent-free either, because you can still embed proprietary formats inside it like MP3.<br /><br />What I'll do now is start supporting Gnash, firstly by testing it and reporting any bugs I find. Fortunately I have <a href="http://software.opensuse.org/search">some packages ready for OpenSUSE</a>!<br /><br />This news is positive, of course, but now let me give my technical opinion of this technology:<br /><br />- The programming languages you can use with it are very few (some months ago I think the only one was ActionScript, which has the majority of limitations of JavaScript) and still today AFAIK there's no statically typed language you can use.<br />- AFAIK it's not accessible (and I mean for disabled people and for automation technologies like search-engine-bots).<br /><br />However, with Moonlight, you already know that you can use C# with it so the first of these disadvantages doesn't affect it. And in respect to the last item, well, the second phase of my project in Novell is bring accessibility support to it so this item will be hopefully solved soon.<br /><br />Will this mean the end of the Flash monopoly? Will this force Adobe to open its software too?<br /><br />BTW, is Moonlight/Silverlight one of the reasons for publishing Flash specs freely? All I can see is that in Adobe they are start to changing their minds quickly. One of the most important facts of this is the liberation of the Tamarin project, which has supposed a big step forward in the Mozilla community (FYI, <a href="http://ejohn.org/blog/why-tamarin-instead-of/">the Mono VM was also a candidate for the Tamarin current job</a>, but unfortunately wasn't considered in the end).<br /><br />Well, and how's the progress of the first phase of the A11Y project? We're progressing slowly, but hopefully cooking the base for the ton of work we already lack. Many issues are because we needed to complete Atk#, and other ones are appearing which may be related with the runtime (hopefully not, but here they are if you want to have a look: <a href="https://bugzilla.novell.com/show_bug.cgi?id=386802">386802</a>, <a href="https://bugzilla.novell.com/show_bug.cgi?id=387221">387221</a>). I have to thank <a href="http://mkestner.blogspot.com/">Mike Kestner</a> for all his help in this side (thanks to him I'm learning a lot about bindings, and about how delicate :) are the glib/gtk/atk bindings in particular; I love when someone is so meticulous for maintaining a project!), and <a href="http://automorphic.blogspot.com/">Sandy</a> for all the help on the bridge (which recently got a nice refactoring, but I already got some additional ideas I need to share...). <a href="http://mgorse.freeshell.org/">Mike Gorse</a> seems to progress a lot (and now <a href="http://blog.floopily.org/2008/04/23/codethink-d-bus-based-accessibility/">there will be cooperation with Nokia as well on the CORBA->DBUS migration!</a>), and <a href="http://blog.carrion.ws/">Mario</a> is starting with us these days, welcome Mario! Unfortunately I don't deal too much with the rest of the <a href="http://www.mono-project.com/Accessibility:_Team">team</a> (Brian, Calen, Neville, Ray) but they seem very busy too all the time! http://knocte.blogspot.com/2008/05/now-gnash-is-to-flash-what-mono-is-to.html Miscelanea Mozilla Programacion General CSharp Mono WebDev Andres_x0020_G._x0020_Aragoneses@monologue.go-mono.com tag:blogger.com,1999:blog-13199395.post-7349654879373348139 Tue, 06 May 2008 10:18:00 GMT Joe Audette: 7th Skin of 10 Completed andreasviklund-02 <p>I've completed the 7th skin of my <a href="http://www.mojoportal.com/BlogView.aspx?pageid=2&amp;ItemID=439&amp;mid=19">10 skin campaign</a>, <a href="http://andreasviklund.com/files/demo/andreas02/">andreasviklund-02</a>, which can be seen on <a href="http://demo.mojoportal.com">demo.mojoportal.com</a>. Of course since its a public demo site, someone may come along and change it, but you can change it back or checkout the different skins by (key icon) Administration Menu &gt; Site Settings.</p> <p>Actually I made 2 skins from this design and named the second one andreasviklund-02-alt1. The interesting thing about this skin is that it has 2 levels of tabbed menus and then a vertical menu for any pages deeper than that. In my alt1 version I took it a step further and used 3 levels of tabs and then a vertical menu to show anything deeper. This screen shot shows the alt version with 3 levels of tabs and a vertical menu for pages below that.</p> <p><img width="468" height="538" alt="screen shot of andreasviklund-02-alt1 skin" src="http://www.mojoportal.com/Data/Sites/1/andreasviklund-01skin-scree.gif" /></p> <p>This will be available in svn trunk later today for developers and will be in the next release of mojoPortal for everyone else.</p><br /><br /><a href='http://www.mojoportal.com'>Joe Audette</a>&nbsp;&nbsp;<a href='http://www.mojoportal.com/BlogView.aspx?pageid=1&ItemID=448&mid=19'>...</a> http://www.mojoportal.com/BlogView.aspx?pageid=2&mid=19&ItemID=448 Joe_x0020_Audette@monologue.go-mono.com Mon, 05 May 2008 12:10:12 GMT Jeroen Frijters: IKVM 0.36 Update 2 Release Candidate 1 <p> A couple of fixes. </p> <p> <b>Changes:</b> </p> <ul> <li> Remapped exceptions with explicit remapping code now call suppressFillInStackTrace (to make sure the proper stack trace is captured).</li> <li> Fixed memory mapped file bug (mapping at a non-zero file offset would fail).</li> <li> Fixed .NET type name mangling for nested types that contain a dot in their name (which the C# 3.0 compiler generates for some private helper types).</li> <li> Fixed java.io.File.getCanonicalPath() to swallow System.NotSupportedException (thrown when the path contains a colon, other than the one following the drive letter).</li> <li> Fixed bug in deserialization of double arrays.</li> </ul> <p> Binaries available here: <a href="http://www.frijters.net/ikvmbin-0.36.0.12.zip">ikvmbin-0.36.0.12.zip</a> <br> Sources (+ binaries):<a href="http://www.frijters.net/ikvm-0.36.0.12.zip">ikvm-0.36.0.12.zip</a> </p> <img width="0" height="0" src="http://weblog.ikvm.net/aggbug.ashx?id=e7edbafa-82e6-4e0d-b3e5-0a9fd6dea416"> http://weblog.ikvm.net/PermaLink.aspx?guid=e7edbafa-82e6-4e0d-b3e5-0a9fd6dea416 Jeroen_x0020_Frijters@monologue.go-mono.com http://weblog.ikvm.net/CommentView.aspx?guid=e7edbafa-82e6-4e0d-b3e5-0a9fd6dea416 http://weblog.ikvm.net/PermaLink.aspx?guid=e7edbafa-82e6-4e0d-b3e5-0a9fd6dea416 Mon, 05 May 2008 00:23:35 GMT Alex Graveley: Top 10 authors with pathetic Amazon Kindle representation Here are some authors who have fundamentally influenced my life, and who might not effect yours if the Amazon Kindle were the only access you had to their works: Italo Calvino (only _Hermit in Paris_) Albert Camus (zero) Richard Dawkins (only _The God Delusion_) Umberto Eco (zero) William Faulkner (zero) Allen Ginsberg (zero) Joseph Heller (only _Catch as Catch Can_) Vladimir Nabokov (zero) George [...] http://www.beatniksoftware.com/blog/?p=93 Life Alex_x0020_Graveley@monologue.go-mono.com http://www.beatniksoftware.com/blog/?p=93#comments http://www.beatniksoftware.com/blog/?p=93 Sun, 04 May 2008 21:20:43 GMT R. Tyler Ballance: NAnt and ASP.NET on Mono <p>Most of my personal projects are built on top of ASP.NET, <a href="http://www.mono-project.com" target="_blank">Mono</a> and <a href="http://www.lighttpd.net/" target="_blank">Lighttpd</a>. One of the benefits of keeping them all running on the same stack (as opposed to mixing Python, Mono and PHP together) is that I don't need to maintain different infrastructure bits to keep them all up and running. Two key pieces that keep it easy to dive back into the the side-project whenever I have some (spurious) free time are my <a href="http://nant.sourceforge.net/" target="_blank">NAnt</a> scripts and my push scripts.</p> <p><strong><big>NAnt</big></strong><br /> I use my NAnt script for a bit more than just building my web projects, more often than not I use it to build, deploy and test everything related to the site. My projects are typically laid out like: <ul> <li><strong>bin/</strong> Built DLLs, not in Subversion</li> <li><strong>configs/</strong> Web.config files per-development machine</li> <li><strong>libraries/</strong> External libraries, such as Memcached.Client.dll, etc.</li> <li><strong>schemas/</strong> Files containing the SQL for rebuilding my database</li> <li><strong>site/</strong> Fully built web project, including Web.config and .aspx files</li> <li><strong>sources/</strong> Actual code, .aspx.cs and web folder (<em>htdocs/</em> containing styles, javascript, etc)</li> </ul> </p><p>Executing "<strong>nant run</strong>" will build the entire project and construct the full version of the web application in the <strong>site/</strong> and finally fire up <a href="http://www.mono-project.com/ASP.NET#ASP.NET_hosting_with_XSP" target="_blank">xsp2</a> on localhost for testing. The following NAnt file is what I've been carrying from project to project.<br /> <div class="geshifilter"><pre class="geshifilter-xml"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="font-weight: bold; color: black;">?&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MyProject&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;library&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;debug&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">overwrite</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;project.name&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;MyProject&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;project.version&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;1.0.0&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;library&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;MyProject.dll&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;tstamp</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;build.date&quot;</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">&quot;yyyyMMdd&quot;</span> <span style="color: #000066;">verbose</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- These are being definde for posterity's sake, as they may change in the future --&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;bin_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;bin&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;src_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;sources&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;lib_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;libraries&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;site_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;site&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;deps_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;deps/&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;contrib_dir&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;contrib/&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- xsp specific properties --&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xsp_port&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;8088&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xsp_root&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${site_dir}&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;xsp_apps&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;/:../${bin_dir}&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!--// End properties --&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;library&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Basic MyProject build task&quot;</span> <span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Building ${project.name}-${project.version}&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;csc</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;library&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${bin_dir}/${library}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;sources<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${src_dir}/**.cs&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/sources<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;references<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Npgsql.dll&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/references<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/csc<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/target<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;clean&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Clean up MyProject&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Cleaning ${project.name}&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;delete<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${bin_dir}/**.dll&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${site_dir}/**.dll&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${site_dir}/**.aspx&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/delete<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/target<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;site&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Populate the site/ directory&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${site_dir}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${src_dir}/htdocs&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;**&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/copy<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${site_dir}/contrib&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${contrib_dir}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;**&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/copy<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${bin_dir}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${lib_dir}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;*&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/copy<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- Copying bin/ into the site/ directory sucks, but xsp2 is buggy</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #808080; font-style: italic;">&nbsp; with the applications parameter</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #808080; font-style: italic;">&nbsp; --&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${site_dir}&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;bin/*.dll&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileset<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/copy<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/target<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;run&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Runs the xsp2 web server on the port cited above&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;library, site&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Starting the xsp2 web server running on port ${xsp_port}&quot;</span><span style="font-weight: