Mono-based Ultima Online Server

by Miguel de Icaza

SunUO is a free Ultima Online server based on "RunUO".

SunUO has released a new version of their server that runs on Mono.

Posted on 21 Dec 2006

SecondLife, Town Hall Meeting

by Miguel de Icaza

Mono adoption in SecondLife was discussed in the Technical Town Hall with Cory Linden:

There are some technical changes we still need to make in particular, we’ll need to compile Mono on the server side which requires a distributed compilation service to be running on the grid (yay, backbone!) but I expect that we will begin testing Mono on the main grid in Q1/Q2 2007.

The process there will be to have places on the grid where you can bring scripts and recompile them into Mono for testing. That will let you report broken scripts to us.

Since Mono tends to execute LSL about 600 times faster, I expect that there will be some interesting borkage around carefully timed scripts. Babbage has talked about the implications of Mono extensively, but it’s important to remember that the sequence will be:

  • Start allowing compilation of LSL to Mono/CLI. Test existing scripts like crazy. (Q1/Q2)
  • Think about ways to include other languages (Q more than 2)

Posted on 21 Dec 2006


by Miguel de Icaza

A small article explaining the dangers that the dollar faces ahead here.

Posted on 19 Dec 2006

Web Developer Tools

by Miguel de Icaza

My Friend Taylor Hayward has launched a site that tracks hundreds of widgets that people can use to develop web applications, the ThePeoplesToolbox.

Check it out, and if you like it, digg it.

Posted on 18 Dec 2006

Parameters in Indexer Properties

by Miguel de Icaza

C# allows an arbitrary number of parameters (similar to varargs in C) in indexer properties. This looks like this:

   class Vector {
	 public object this [params object [] items]
	 	get { ... }
        	set { ... }

    // ...

    Vector v = new Vector ();

    v [1, 2, 3] = 10;

This is one of the parts of the spec that I did not find on the first pass of writing the compiler, so the internal design of the compiler did not allow for this particular usage. Not many applications depended on it, but there have been a few.

The problem was that the compiler had a flag describing whether a method's last parameter was a "params" (setters and getters are treated as methods). This works for the getter method, but the problem is that the setter method has a params in the middle, the above would turn into:

	object set_Item (object [] items, object value) 

Today Marek Safar submitted a fix to this long standing bug. Although the bug was filed by a third party a year ago, it was on my personal compiler TODO list for at least three years.

This fix will be on Mono 1.2.3 or it's available on SVN on r69571.

Posted on 16 Dec 2006

Paint.NET and SafeHandles

by Miguel de Icaza

Earlier this year, I ported Paint.NET to Mono. At the time, we used the port to help us identify performance bottlenecks, missing functionality and bugs in our code. It turned out to be a fantastic test case for Windows.Forms.

The port was never released because the port is botched. In general the port went fine, but I made a few mistakes early on which lead to the half-done Paint.NET port.

Broken Port of Paint.NET 1.x on Linux.

Here are some of the lessons I learned:

Removal of Code: Paint.NET 1.x used a proprietary third-party library that we did not have access to, and this third-party library used plenty of P/Invoke calls to achieve some special effects. This library for doing toolbars and special buttons was called DotNetWidgets and it seems to have morphed from a freeware library to some sort of commercial library.

During the initial phase of the port I started removing references to this library one by one and during this removal I either removed the code completely (those pieces that seemed unnecessary) or I replaced it with Windows.Forms 1.x controls that had similar functionality.

Halfway through the port, I realized it would have been better to just implement the API exposed by this third party control than to amputate left and right Paint.NET.

So I implemented a barely functioning wrapper class that exposed the same API but barely worked. This was good, as I did not have to amputate any more code. The downside is that by the time I did this, half the classes that used this library had been amputated, and I did not feel like redoing the work.

So I ended up with half the code base amputated, and half the code base semi-working (semi-working because my wrapper was not completed).

Emulation vs Refactoring: In a handful of places I decided to implement small native wrappers that are distributed with Mono and that provide some of the P/Invoke methods that Paint.NET uses. In particular the Heap* family of calls from Win32.

At the time, it made sense to emulate a handful of calls, and we also came up with a design for routing P/Invoke calls done to USER32 to be forwarded to our managed System.Windows.Forms library. The infrastructure is still in place and we could use it to simplify the porting of applications, but am still debating if this is a good idea or not.

In retrospect, I should just have taken advantage of Paint.NET's architecture. Paint.NET actually had isolated the system-dependant code in their SystemLayer library, I could have provided Unix alternatives in that library instead of trying to emulate its underlying functionality (this was another part where half the code was emulated, and half was worked around).

Based on the various Moma Reports it seems that we might be better served by having a portability library that developers could use with their application.

From the Moma reports that people have submitted, we have noticed that some people are using incorrect P/Invoke signatures. This means that their software is actually broken and is probably fragile. It only happens to work because this month stars are properly aligned, but it could break easily, or could have undesirable effects easily (and this is on Windows!).

Second, there are some APIs that can be used for many different things, like "SendMessage".

So it seems like it would be best to provide a portability library "Winforms.Portability" and make sure that the software is migrated to use it. The nice side effect of this would be that features that are not supported would be explicitly visible on the source code.

In any case, we are still considering the options and what our recommendation will be.

The Release: So I never felt like releasing the Paint.NET changes because they are broken, and people would judge Mono's Windows.Forms implementation not on its strengths and limitations but on the broken nature of this port (for example, a bunch of button actions are not even wired up).

Paint.NET 2.x

I never went back to fix Paint.NET 1.x because the developers of Paint.NET were working towards their 2.x series, and this release would replace DotNetWidgets with the various "Strip" controls in Winforms 2. So it was not a very good time investment to work on the 1.x codebase anymore.

We still use the 1.x codebase as a gigantic test case, but we are not going to be upgrading it.

Instead, we will complete the support for the Winforms 2.x APIs that are in use and do the Paint.NET refactoring again.

The 2.x port of Paint.NET is underway, but we are still missing some classes in Windows.Forms that prevent it from building.

The SystemLayer, SetupFrontEnd, Resources, Help, PdnLib and Data components compile fine. The Effects component and the shell still needs some API calls to be implemented (TableLayout related code).

Once those APIs are completed, the real porting work will begin. That is when I will have to do the refactoring or provide a Unix-specific implementation of the SystemLayer API that Paint.NET uses.


As part of my mission to modify as little code as possible from the Paint.NET 2.x codebase, I implemented SafeHandles for Mono. The current status of our implementation is tracked here.

Implementing SafeHandle support in Mono was a lot of fun. It was the first time I touched the code in the Mono marshaler and it was interesting to figure out all the relations between SafeHandles, CriticalFinalizerObjects how P/Invoke provided the magic that allowed a type-safe object to be marshaled as an IntPtr and where to hook all the behind-the scene calls that happen inside SafeHandles.

The most important source of information was Chris Brumme's "Finalization" blog entry and Ravi Krishnaswamy's "SafeHandles: the best V2.0 feature of the .NET Framework" blog entry.

The patch to support the user visible features of SafeHandles is now on SVN and I plan on continuing some of the work outlined here. Likely, I will need some help from the runtime guys, as I do not quite understand all the issues involved.

As I was exploring the magic behind SafeHandles, I discovered that some of the features that I considered to be ratholes turned out to not be supported, and instead of trying to come up with a confusing solution, certain uses of SafeHandles are just not supported (changes on a SafeHandles passed in ref structures is not mapped back to the managed world, and instead an exception is thrown).

See the mono/mono/tests/safehandle.2.cs file for some other interesting tidbits.

Posted on 16 Dec 2006

Bush has created a comprehensive catastrophe across the Middle East

by Miguel de Icaza

Excellent article on the Guardian:

So here's the scoresheet for Afghanistan, Iraq, Iran, Israel, Palestine, Lebanon and Egypt: worse, worse, worse, worse, worse, worse and worse.


Many a time, in these pages and elsewhere, I have warned against reflex Bush-bashing and kneejerk anti-Americanism. The United States is by no means the only culprit. Changing the Middle East for the better is one of the most difficult challenges in world politics. The people of the region bear much responsibility for their own plight. So do we Europeans, for past sins of commission and current sins of omission. But Bush must take the lion's share of the blame. There are few examples in recent history of such a comprehensive failure. Congratulations, Mr President; you have made one hell of a disaster.

Posted on 14 Dec 2006

The American Right Punditry

by Miguel de Icaza

The same folks that were calling for "Iraqi Liberation" from Saddam are now pitching the need for a strong man. They never made any sense, but they are now venturing into new delusional grounds when they suggest that Augusto Pinochet is a good model to follow.

Of course, this particular columnist has always shown the intellectual prodigy of a clam, the wit and finese of a dumb rock.

His claim: Pinochet's abuses "helped create a civil society". Well, you can not get any dumber than that. All he knows about Chile he probably learned this week.

Posted on 14 Dec 2006

Palestine Follow Up

by Miguel de Icaza

My books on the Israeli/Palestine conflict now amount for a considerable part of my bookshelf real estate.

A few weeks ago, I was having a discussion with a friend of mine around the pros and cons of the "one state" vs "two state" solutions to the conflict.

For those not familiar with the options, they are:

One State Solution: Israel and the West Bank become one country, with the same rights and laws applying to all the inhabitants. No distinction made based on ethnicity or religion.

Two States Solution: Israel continues as it exists today; the West Bank and Gaza become a sovereign state and the inhabitants of the West Bank are governed by its inhabitants. The Israeli military evacuates the occupied territories, and Israeli citizens living in the West Bank become Palestinian citizens or have an option to emigrate back.

My friend had good points against both solutions, the one state solution and the two state solutions. And I agree that both have problems, but the status quo of "one state and a colony" is way worse.

The One State and a Colony is the current configuration: Israel is an independent country and the West Bank is a colony under a military occupation.

This is a good Q&A with Chomsky on the prospects of a solution. This article lead to Noah Cohen's reply: Apologetics for Injustice in Palestine?. He advocates the one-state solution. Chomsky replied in Advocacy and Realism A reply to Noah Cohen.

The problems of the two state solution today are explored by Haim Bresheeth.

Posted on 13 Dec 2006

Palestine and Iraq Books

by Miguel de Icaza

Just ordered three new books:

Patrick Cockburn's Occupation is a very interesting read on the occuptation of Iraq and what went on. The story is told from the perspective of the Indepedent's journalist point of view. Patrick's book is packed with interesting stories, but Robert Fisk is still a better story teller.

Mexico Updates

Meanwhile, Mexico is going back to the 70's style repression. With hundreds of "disappeared", tortured and a handful of killed protesters at the hands of the state and federal police and an incompetent new president whose only significant act so far has been to propose education budget cuts (he back-pedaled yesterday on his plan) and raise the salaries of the military.

Democracy Now has a complete report on the situation in Oaxaca.

Brad Will's (a journalist with Indymedia) was covering one of the confrontations between the police and Oaxaca protestors, when government gun men shot him. His reporting and in particular his own video where he is killed is available with subtitles in English on YouTube.

Posted on 13 Dec 2006

« Newer entries | Older entries »