Wednesday, 25 April 2012

Les plaisirs solitaires

a one minute blog, just came out as is, publishing it as raw as it came to me. No English, sorry.

Les plaisirs solitaires

Solitaire est un mot. Un mot pas tout seul, non loin s'en faut.

Solitaire c'est avant tout le cri silencieux. Je crois qu'on ne comprend la solitude que très tard, trop tard, et c'est quand même vachement dommage. On se rend compte qu'on es seul que quand on a trouve ceux qui nous entourent, ceux qui arrivent trop tard. Le jury à rendu son verdict, audieu, difficile, crument réaliste: sol tu es, ré tu sera, do au mur verras tu ce que tu as toujours re-cherche, la famille que tu as découvert trop tard. La se trouve la si difficile frontière entre le réel et le dommage.

Les plaisirs solitaires sont à l'homme ce que dieu est au croyant, un abandon illusoire, parfois réprobateur mais jamais substantiel. Personne ne peut croire en l'absolution après l'absorption de ce corps ingrat et menteur.

Les parisis artificiels, au final, ce ne sont même pas les échappatoires tant décriés par nos illustres écrivains désuets, anciens ou / et goncourt. Non monsieur, laissez moi vous dire pourquoi ces paradis artificiels sont parfois la seule réalité acceptable.

Vous avez ruine notre réalité. Le monde est un marasme flou, étouffant, aveugle aux besoins de sentiments de l'humain. Votre prose à tué l'homme, j'ai lu votre prose, j'y ai cru et je n'y vois plus que vous.

Saturday, 25 February 2012

Singing in the rain

I’ve notified y’all that this blog is turning into something very personal. The majority of you are still reading this through apathy and lack of will to read my blog, and I understand the feeling. If you don’t unsubscribe now, welcome to the rabbit hole, for that’s where I am and where I shall lead you. You’re probably going to learn way too much about the intricate inanity my brain is full of. Spare yourself and spare me, don’t read this unless you want to be in Seb’s head.

If you’re still here, I would ask you for one thing, and one thing only: do realize that I’m not sharing these thoughts with you or anyone else. I share for I need to expel those thoughts in a written, however raw, medium. I’m writing this for me, not for you.

Singing in the rain… An amazing program for sure, but more importantly the title of the latest musical at the Palace Theater around the corner. It’s funny how the world evolves silently around you.

It’s not that one doesn’t care or doesn’t take notice. No, the intent is not where the cookie crumbles. There is one thing that makes one feels more human, more comfortable, and more in-tune with the greater scheme of things. Or maybe we like to kid ourselves in the delirious delicious illusion that we do have that one thing. It is not control, for this would be very naive . The real Houdini in this world is the illusion that you *know* what’s going on.

You see, I live next to the Palace Theater. Last year, I bought some tickets to go and see Priscilla Queen of the Desert with my mom. Life has a funny way to get back at you: she introduced me to that movie when I was only a lad, but her seat ended up being used as a very expensive cloakroom for I got the dates wrong, my passion for the film didn’t extend to the musical, and out of all things, it was raining. Ignoring the obvious may well be a human trait.

They changed the musical in that theatre and *i had no idea*, even though I’m their neighbour. I live next door. It’s only by accident, on the way back from a night I attended to celebrate someone’s departure, that I learnt about it - why we celebrate losing people is another one of those questions I never had a valid answer for.

Tonight, I ended up being there for a friend I’ve not seen for a long time. That friend was in distress, needed a shoulder. When you love someone, you ought to be their rock when they crumble. This friend, very much younger than I, is going through cancer, chemotherapy, and did it without telling me.

It hurts so bad. The pain is beyond words. I’m thirty years old, and I have had one friend dying from drugs, another dying from a brain tumour, a member of my family having near-death experiences twice and now being on constant medical care, and another member having to go through breast cancer. Another one of my friends went back to California for another cancer treatment, and while I’ve heard he’s in remission, I was never to have known about it in the first place. Thankfully, indiscretions in circle of friends sometimes include you back in something you’ve bee pushed out of. That said, we don’t talk about it, I don’t talk about it, no one talks about it. Why is it that there is no talking when my heart feels like screaming so loudly, so intensely against the injustice of this world?

That’s not even starting to discuss the impact of HIV on my life. A statistic was recently published showing that 3 out of 7 gay men in London were infected. I was only 18 when my best friend was the first to get over the hedge. Since then, it’s such a regular occurrence that I ought to be prepared for the announcement, and as sad as life is, for it is, it’s a regular occurrence.

It’s not only the raw feelings about those situations, mind you. It’s more profound, complex and dark. I couldn’t possibly imagine not being completely and uttermosly available to do whatever is in my power to help, but I feel guilt for feeling drained by it. My selfishness is as painful as the pain I share with those that are going through this. It’s not only survivor’s guilt, it’s survivor helper’s guilt. Worse, one can only resent the incompetence in one’s ability to deal with those matters. How can anyone look at oneself in a mirror in the morning and accept the sharing of the suffering of others, as well as the realization of one’s obsession with one’s petty concerns?

It’s way too young an age to be dealing with so much grief and loss. The most insulting thing I ever heard from someone was at a dinner when told I lacked empathy. I’ll tell you what empathy is: it is the cancer and the HIV and the death you share with those around you. It is the constant pain felt for all things that are not right in the world. It is the thing that makes you cry when no one looks. It is the thing that makes you detest a world that can provide so many beautiful butterflies and take them away as quickly as they came. Empathy is what makes me cry when I look at the world around me. Maybe I cry too much, but more likely I don’t cry enough, for the pain debt will never get repaid.

We’re not provided with the right equipment to deal with pain and loss. Or maybe some are, I just was never given those tools. It hurts and I hurt. I hurt for my friend, my family members, those that I lost, those that I could have lost and all those that I don’t know the pain of.

There is only one thing more painful than sharing the burden of the life we all have to carry: the pains I cannot share.

Wednesday, 11 January 2012

A new year

The last two years have been very tough on me. Work has been a succession of pleasurable experiences and massive conflicts. My OSS projects have been getting competition, some friendly and some down-right uncalled for. I’ve fought a couple of sour battle with Microsoft and received many hits below the belt, while others have welcome my contribution openly. I’ve separated from a 3 years relationship. I’ve had issues with my business. I’ve recreated a group of friends, lost some, recovered some.

I’ve also turned 30. Most people at my age seem to be getting married (and a lot of my geek friends have done just that), some even going as far as getting children or cats. And I still seem to live day after day without much evolution, spending most of my time fulfilling an unreasonable amount of commitments, and with what is left of my time trying to not think about those I have failed or going out with friends to try and do something else.

Over time, my relationship with people has also been strained by what some refer to as OCPD, but I won’t talk about this here too much. Let’s just say that it’s difficult to build self-worth when you continuously have to question yourself for not being the perfect business suit one would want you to be.

So it’s time for a change. This year, I’m simplifying. I’m posting this here in the hope that at the end of the year I’ll have achieved some of those goals. But really, it’s a catharsis, a way to get out what I keep in at all times. I wish I could talk about everything on here, and I can’t (as this will be indexed by google forever and follow me like the plague for the rest of my life), but it’s as good a start as any. And I’m pretty sure no one subscribes to this blog anymore, so it won’t be too much of an annoyance to people.

So here we go.

I’ve always struggled with friendship, I have been very demanding and have expected far more from people than what they were probably willing or able to give. This has lead many times to outbursts and strained relationships as I have tended to express my frustration and feeling of being unloved by rejecting people. This stops now. Those that are here are, those that are not I will let go without resentment. This is going to mean something with my use of facebook, but I’ve not decided what it’s going to be yet.

Work-wise, I have too much on my plate. My OSS activities started from a desire to build cool software, and turned years ago in constant marketing and competition rather than enjoying writing new code. The amount of projects is also straining my capacity to create new stuff I’m interested in. I’m letting go of this too. I’ll focus on the two things I want to build (mainly OpenRasta 3 and OpenWrap), and everything else I’m putting the community in charge, although it’s not excluded that the community may be called-in on OpenWrap soon too. This should relieve a lot of pressure I’ve had. Talks are also going to be reduced, less quantity and more quality.

It’s also time to reconsider my relationship to partying. I’ve done way too many parties, nights out and others that I didn’t really want to attend or wasn’t really going to enjoy. This year it will be quality over quantity. It’s a hard balance to strike however, as when you don’t see friends they tend to stop calling you, a vicious circle that can leave you very isolated. On the other hand of the spectrum, the social pressure to “just go to the pub” or “come for one” or “one more” is a very difficult one to counteract. Only way to be happy not going out is if you’re happy staying home, so I’ll be spending more time making my home a happier place to stay on my own.

Information overload is problematic when you react emotionally and radically to things. A lot of my energy has been spent defending viewpoints or debating online, mostly through twitter. So I’m reducing that too and I’ve now removed the “All friends” column from my client. I won’t read what anyone writes unless they ask me about it or mention me. I’m pulling the plug like I did with blog readers years ago.

Personality is a strange thing. Each person has their own view of what their personality is and ought to be, and for some people it doesn’t match friends and strangers’ perception. I have spent many years trying to appear softer, more proper, more socially acceptable, as I have been made to understand those were desirable features for success. It’s taken a lot of energy and made me fight and hate myself a lot, and it hasn’t even worked that well. Reading Steve Jobs’ biography has made me think a lot about interpersonal relationships at work.

I say what I think and I like things done right, and I’m not going to be apologetic about it anymore, it’s straining me. Those that work with me learn how I work and react and have always worked with / around it just fine. I’ve never gotten anyone to cry (I think). It only affects projects I work on for the better, that’s why people give me work. So this year I’ve decided to let go of the self-censorship and self-loathing. It’s who I am, and whatever the cause, fighting it will only lead me to a path full of moments I don’t want to have to live through again for no actual benefits.

Simpler, more fulfilling and focused on being happier. That’s what 2012 ought to be. What’s your new year’s resolutions?

Tuesday, 3 May 2011

Next GayGeekDinner this Friday

After all the lovely royalty events of the last weekend, it’s our turn to queen it out. Come and join us for the next GayGeekDinner this Friday.

All the details are at

See you then!

Monday, 7 March 2011

I have moved

I don’t really post on this blog anymore, I’m keeping it for announcements about OpenSpaceBeers, GayGeekDinners and other less global matters. The new blog has been up for a while at so I suggest you add the new one to your aggregator (how last century!).

QCon, OpenRasta, OpenWrap and OpenSpaceBeers (and that’s enough OpenXxx things for now)

A great conference is nearly upon us, QCon London has opened its doors today for the first of two days of workshops. As it happens, I am presenting on OpenRasta on Thursday and on OpenWrap and composite applications on Friday.

For those of you that don’t know OpenSpaceBeers, we’re also organizing an open-space Jerry Springer style on Thursday night. It’s always very invigorating, very lively, you contribute if you want to: one hour time-boxed open space to discuss whatever you feel like on that night. Come and join by registering right now, it’s opened to everyone (QCon or no QCon).

We may see the release of a few prototypes being demoed at QCon very soon, so if you have the opportunity, come talk about OpenRasta 3.0 and OpenWrap 1.1 with me, it sure is going to be a fun ride.

Tuesday, 19 October 2010

Announcing OpenSpaceBeers, the open-space for all developers, whatever the platform

We’ve been running open-spaces for a while. It’s now time to build something new, and something that will hopefully benefit all communities.

OpenSpaceBeers are open-space monthly events, where the beer flows, the ideas fuse and the right questions get asked to all developers interested in contributing. It doesn’t matter if you’re .net, java, python, php, coldfusion, ruby, scala or basic. We all face the same issues, and there’s a lot of sharing to do.

A developer is a developer, whatever platform they’re on.

First OpenSpaceBeers is next Tuesday, 26th of October. Tickets are going to be released as follow. They will all be open at random times during the day.

  • Round 1: Today, 19th of October, 1PM
  • Round 2: 21st of October, 3PM
  • Round 3: 23rd of October, 6PM
  • Last chance: 25th of October, 9M.

Come and enjoy the best regular developer-focused event, in a relaxed pub environment.

Register on EventBrite now.

Thursday, 9 September 2010

Seb does Australia

I've been wanting to do it for a long while, and now seems like the right time to be planning. If you are in Australia, New Zealand, Tokyo, Singapore and can host me for an evening or a couple of days of training on ReST, nhibernate, distributed architectures, package management, software practices or just want me to hang around, please send me an email at The more of you show an interest, the longer I'll stay. Let me know.

Tuesday, 17 August 2010

OpenWrap late changes and release date

I’ve delayed slightly the tutorial on Part 2, as ready or not, I’m pushing binaries and the server online on the 26th of August. Call it a first preview. Delays are due to my really wanting some features that I didn’t think we would have for a first release, but I think it’s worth it, and is due to my frustration in having to deal with all the mechanics of building OpenWrap and it’s server itself.

Expect the second part of the guide sometime this week.

Monday, 2 August 2010

OpenWrap’s view on versioning

There has been a bunch of questions regarding the differences between CoApp and OpenWrap when it comes to versioning. If you follow the blogs and that project, you know that they are planning to install everything in the GAC whenever packages are installed, and require everything to be Authenticode signed.

OpenWrap takes the opposite view, and discourages strong-naming your assemblies. The reason is very simple: in .net, whenever you update an assembly to a newer version, as long as the assembly is not strong-named, the assembly version is blissfully ignored, which lets people swap the dll around as and when needed, when there’s a fix / update available.

The only way to not break project references when packages are updated would be to never update the AssemblyVersion in an assembly, rendering the versioning scheme useless.

The alternative is to create policy redirections as part of the deployment to the GAC of a strong-named assembly, or for the consumer to add those redirections manually in each of their projects. Either way, it’s either a huge burden on publishers (and people don’t bother), or on the consumers (and people get angry). Either way, we’re still in unhappy land.

All this versioning is not needed, for the simple reason that OpenWrap has its own versioning scheme, per package, providing you with many more features than the 1-1 coupling provided by strong-named assemblies.

And finally, last but not least… If like me you believe very strongly in xcopy-friendly development and deployment, the GAC breaks all this: you now require the assemblies to be GAC’d on your build server and locally before you can use them, as otherwise any odd version already installed on the system would take over. And there lays the major pain point, the GAC takes over from your local references and there is *nothing* you can do about it.

As the goal of OpenWrap is to enable rapid development and update of packages, strong-naming assemblies and GAC’ing them is diametrically opposite to the vision of the tool, and as such will be discouraged. I’ll even put a big fat red warning if you take a dependency on a package that has assemblies already in the GAC, offering you in one swoop the option of removing them interactively. I may even provide the option to automatically strip out strong-naming from assemblies you try to package.

Help yourself and help versioning, say no to the GAC. If you do have scenarios where you believe strong-naming is the right solution, please leave a comment and we can discuss it.

[Note: Strong-naming has nothing to do with signing. Signing assembly code with a certificate is not useful to reduce malware (I don’t see how it would), and it pauses the risk of the certificate revocation being checked before being ran. But it has nothing to do with the key signing used in strong-naming, it’s a different process.]

Adding OpenWrap to an existing project (Part 1)

I’m continuing writing up teaser posts on how to use OpenWrap. Building a new office has taken away my Sunday, so the server is still not up, and the code unfinished. A few more days and we’ll be there.

In the meantime, assuming you have OpenWrap installed, here’s how to convert an existing site (here an OpenRasta site running on top of to OpenWrap.

From a default project…

Here’s the layout of my project.

PS C:\src\caff\git\openwrap-server> tree
Folder PATH listing for volume BOOTCAMP
Volume serial number is 60DA-D801

First step is to add a wrap descriptor file and a version file that will be used to build the package.

PS C:\src\caff\git\openwrap-server> "Description: an openwrap server implementation based on OpenRasta." | ac openwrap-server.wrapdesc
PS C:\src\caff\git\openwrap-server> "1.0.0" | ac version

And finally, we want to create a project repository in which openwrap packages will be stored so OpenWrap can know where to put those. We can do this by creating a wraps folder.

PS C:\src\caff\git\openwrap-server> md wraps | out-null; tree
Folder PATH listing for volume BOOTCAMP
Volume serial number is 60DA-D801
│   └───OpenWrap.Server
│       ├───App_Data
│       ├───Handlers
│       ├───Properties
│       ├───Resources
│       └───Views

Adding OpenWrap to the project

Time to add OpenWrap to our project, which will add the necessary instruction to our wrap descriptor and all needed files.

PS C:\src\caff\git\openwrap-server> o add-wrap openwrap
# OpenWrap v1.0.0.0 ['C:\Users\sebastien.lambla\AppData\Local\OpenWrap\wraps\_cache\openwrap-']
No wrap descriptor found, installing locally.
Project repository found.
Dependency added to descriptor.
Copying 'openwrap-' to 'Project repository'
Expanding packages to cache...
PS C:\src\caff\git\openwrap-server> tree
Folder PATH listing for volume BOOTCAMP
Volume serial number is 60DA-D801
│   └───OpenWrap.Server
│       ├───App_Data
│       ├───Handlers
│       ├───Properties
│       ├───Resources
│       └───Views
    │   ├───bin-net35
    │   ├───build
    │   └───commands

Couple of interesting notes. First, you can see that the o.exe tool redirects all calls to the last version of the OpenWrap pacakge on the system.

Secondly, the wrap decriptor now contains the line depends: openwrap.

A folder structure…

Let’s examine what files are actually in this wraps folder that now exists:


    │   openwrap-
    │   │   openwrap-
    │   │   version
    │   │
    │   ├───bin-net35
    │   │       ICSharpCode.SharpZipLib.dll
    │   │       OpenFileSystem.dll
    │   │       OpenRasta.Client.dll
    │   │       OpenWrap.dll
    │   │
    │   ├───build
    │   │       OpenWrap.Build.Tasks.dll
    │   │       OpenWrap.CSharp.targets
    │   │       OpenWrap.Resharper.dll
    │   │       OpenWrap.tasks
    │   │
    │   └───commands
    │           OpenWrap.Commands.dll
            │   openwrap-
            │   version
            │       ICSharpCode.SharpZipLib.dll
            │       OpenFileSystem.dll
            │       OpenRasta.Client.dll
            │       OpenWrap.dll
            │       OpenWrap.Build.Tasks.dll
            │       OpenWrap.CSharp.targets
            │       OpenWrap.Resharper.dll
            │       OpenWrap.tasks

There are a couple of interesting things happening. First, the wrap package itself got copied over in the wraps folder. The goal here is for you to always commit those dependencies as part of your project in source-control. Second, you’ll notice that the content of this file is uncompressed in the _cache folder. This one should always be part of your ignores, as you really don’t want to be committing the zip file *and* the content.

Finally,you’ll notice there’s also an openwrap folder that has the same content as the _cache/openwrap- folder. Lets look more closely.

PS C:\src\caff\git\openwrap-server> ls wraps

Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----    02/08/2010    01:23   <JUNCTION> openwrap [C:\src\caff\git\openwrap-server\wraps\_cache\openwrap-]

Indeed, this folder is not a real folder but a junction to the latest version. This linking is only done for pacakges that are anchored. So why do we have this?

In an ideal world, everything would use OpenWrap for finding stuff, and the latest version for a project would always be selected. But we live in a world full of dragons and daemons that require a bit more of a stable path. As OpenWrap hooks in MSBuild (we’ll see how in the next post), it’s important that the msbuild files are in a reasonably stable location. It’s also important that OpenWrap is available the first time you checkout your files, so a build can happen instantly.

Folder structure

You may notice that packages contain multiple folders (which are called an export in OpenWrap). The bin-Xxx are the ones in which assemblies needed for referencing in a project are contained. Each .net framework profile has its own identifiers, and the resolution algorithm uses those identifiers to decide what assembly to load. If you’re on .net 3.5, the probing will go bin-net35, bin-net30, and bin-net20, and will fail when it cannot resolve assemblies.

There are a couple more exports in the package: commands contain all the commands you can execute from the command-line (or from any host that can execute those commands, currently only the command line), and build contains all msbuild-related extensibility points (which I really hope to manage to import automatically further down the road).


So, there you have it, in a few seconds we installed OpenWrap in the solution. Next up, we’ll hook-up our project by changing a line in an MSBuild file.

The initial OpenWrap installation

Going down OpenWrap’s rabbit hole, the first thing you do is retrieve a fresh copy of o.exe, the Command shell. At a whopping 32k (for the debug build), you could get the initial file in 234 text messages. Lets open the file straight from the web site, and we’re greeted by installation options.

The OpenWrap shell is not installed on this machine. Do you want to:
(i) install the shell and make it available on the path?
(c) use the current executable location and make it available on the path?
(n) do nothing?

I think the options are quite self-explanatory, but let’s recap:

  • (i) will copy o.exe to ~/AppData/Local/OpenWrap/ and add this path to your PATH environment variable for the current user
  • (c) will simply add an file in ~/AppData/Local/OpenWrap/ and add this path to your PATH
  • (n) will do nothing this time around and run o.exe as normal.

Let’s choose the first option

OpenWrap packages not found. Attempting download.
Downloading [....................]
Downloading [.............]
Expanding pacakge...
# OpenWrap v1.0.0.0 ['C:\Users\sebastien.lambla\AppData\Local\OpenWrap\wraps\_cache\openwrap-']
Command was not understood. Type 'help' to get a list of supported commands.

I do hope that this is also quite self-explanatory, but just in case… When the shell tries to execute the first time, it will not find the OpenWrap packages anywhere. At that stage, it will go to the openwrap web-site and download the bootstrap packages to the correct location, which is just a list of URIs to download in a text file.

Once all this is done (and notice the wonderful typo in the output, you can check on github that this is all live code), the shell can now delegate to the openwrap code itself to parse the command. And as there was no command (remember, we started the application from a web browser), the system tells us that the command was not understood.

I tried to make it more complicated but I just didn’t have the time.

Saturday, 31 July 2010

The future of OpenRasta

You may have noticed that development on OpenRasta has slowed down quite a bit recently. It’s a double-edge sword: the codebase is stable enough for most people, which has helped adoption of the 2.0 branch quite a bit, but at the same time there are new features that I want to see implemented.

As you probably know, I’m putting most of my energy on OpenWrap until we have a fully functioning first beta release, because I want the next version of OpenRasta to be completely built on top of it. So what is the future of OpenRasta?

OpenRasta 2.0 RTM coming to a shop near you soon

The current branch on github is going to be enhanced slightly by the addition of a few fixes / features that will close the loop for a 2.0 release:

  • Http header processing will special-case our friend Set-Cookie, which will solve a bunch of issues people have been reported when trying to use those evil babies.
  • The diagnostics output is going to be made a bit nicer by actually showing the log on the web page itself rather than the dreaded “There was an error in a contributor”.
  • I’ll pull in the fixes requested by those that want to use the binder to do constructor value injection.
  • We’ll put the nice logo we’ve had and not used for so long.

That’s it. This should happen in the next week or so.

OpenRasta 3.0

I’ve decided to rename 2.1 in 3.0, for the simple reason that I’m going to move stuff around quite a bit, all driven by my need for better componentisation of the codebase, most of it driven by OpenWrap. I’m not ready to discuss the feature-set yet, but August will be the big development push on the first iteration. Expect a lot of splitting of code, of re-evaluation of some features that are not as much in use as I’d like, and hopefully a lot of bug fixes in the process.

In the meantime…

In the meantime, you may as well get yourself acquainted with OpenWrap, because it will be mandatory for OpenRasta 3.0.

I’d also like to thank Hadi and the codebetter guys, as our bug tracking has now moved to youtrack on, at Let me know what you think of the new system.

Thursday, 29 July 2010

ReSharper 5 incompatible with OpenRasta...

Let's do a social engineering experiment. You see, ReSharper has been ignoring pageParserFilter code in (the thing MVC and OpenRasta use to enable you to use the C# syntax in your Inherits attribute in pages) for what feels like forever.

Before the 5.x release, it was still working fine (call it a feature by accident), recognizing the type and enabling full intellisense. Behavior has changed, first by marking everything as an error (in 5.0), and now by compeltley ignoring the base type (5.1). The only reason MVC works is because they special-cased that codebasae, but not OpenRasta's one.

Let's all help JetBrains do the right thing and ask them to re-enable OpenRasta support through a hotfix of their current versions, by voting on this issue:

In the meantime, you should be able to get by by specifying the old ResourceView`1 syntax in your Inherit clause, or just do like me and don't switch to version 5 just yet.

Saturday, 24 July 2010

An intro to what OpenWrap is

I vowed not to come out too early with loud propaganda on what OpenWrap is, but many have told me that they want to see it happen now rather than together with a beta, and I’ve been coding away for long enough that the code may be of interest to some. So, without further do, I announce my latest venture in world OSS domination called OpenWrap.

What’s OpenWrap

OpenWrap is currently classified as a package management system. In reality, it’s an export management system. The reason for OpenWrap existing is to deliver stuff to whatever environment is needing it, be it at development time within Visual Studio, at deployment time when pushing an OpenRasta or MVC web-site, or at run-time for a rich client.

What’s Stuff?

An application is usually made of a bunch of stuff. Some are components, some are static files, some are executable tools, and some may be an energy pattern that needs to go from point A to point B.

OpenWrap is a simple packaging format that deals with separating those stuff things into exports. An export is whatever you want, and only the consumer of an export need to know and understand a certain kind of export.

An example of exports: assembly references and build files

One of the many exports that everyone is focusing on at the moment is binary assembly distribution. You want to easily add a component built by someone else, without the hassle of having to download binaries and all their dependency hell yourself. I hear you! While projects like horn have attempted to take away some of the pain by automating cross-trunk version building, the lack of binary distribution and versioning has made using the tool a hit-or-miss, because of the nature of how open-source software is built more than because of what horn is.

So, in OpenWrap, you can use the OpenWrap shell, called o.exe, to issue a bunch of commands. So if you want a reference to nhibernate, you’d do

o add-wrap nhibernate

OpenWrap will try and find the package called nhiberante, and all the packages it depends on, and install them in your system repository. At build time, each package you depend on will automatically get its references added to your project. There’s even a ReSharper plug-in to make it real-time.

In your package, which happens to be a simple zip file, each dll present in the /bin-netXXX folder will be automatically resolved. Why the XXX? Because in OpenWrap, the binary exports are dependent on the version of .net you’re running under. That means that if you run under .net 2.0, you’ll get all the DLLs present in /bin-net20, but if you’re under .net 3.5, you’ll get the ones in /bin-net35.

Want to provide architecture-dependent code? Just put the same dll and the same API in both /bin-x86-net20 and /bin-x64-net20, and OpenWrap will figure out which of the versions to use.

Another example of exports: commands

In OpenWrap, commands are also a type of export, that live in /commands. Want to provide command-line commands to execute as part of your project? As long as your package is present in a solution, all of the commands you create will be available from the command-line. XCopy command-line extensibility is the feature used by openwrap itself to execute its own commands, so you have the guarantee that only the version of OpenWrap (and other packages) you have in your project repository will be the ones executed when you are running the shell.

The sky is the limit

Of course, package exports are extensible, so if you want for your project a custom export, or if you feel (like me) that web applications should share a same export for things like jQuery, then you can integrate yourself with that and make it your own.


There’s a few repositories in OpenWrap. The System repository is the one living in your /Users/UserName/AppData/Local/OpenWrap/wraps folder. Anytime you execute an OpenWrap command anywhere that’s not an OpenWrap folder, it will come from your system repository.

As you may have guessed by now, each of your projects will also have its own repository. You can consider that an equivalent to your vendors folder in Rails. In each of your projects, all exports (commands, assemblies etc) come from your project repository first.

And of course, multiple repositories can exist. The repository at is maintained by myself, and you should be able to upload your own packages there very soon. If you want to add your own repository, the openwrap-server will provide you with a full-fledged repository you can install locally. You then only need to issue a o add-remote myRepository command to add your own.


Whenever you execute the o add-wrap xxx command in a project, a line will be added to your descriptor file. This file is the description of what your application does, what other packages it depends on and what versions it needs to execute. The end-result in your file would add a line. Here’s a typical package descriptor, to give you a sense of what things look like. (note the syntax is slightly different than what is on the wiki, those changes are coming up on github in the next few days as we ramp up for release).


Depends: nhibernate >= 2.0.0 and < 3.0 Depends: openfilesystem = 1.0.0 Description: A wiki system based on the textile language and using GIT as a repository.

Versions are very simple, you decide what your package is compatible for. When it comes to dependencies, only [Major[.Minor[.Build]]] are taken into account. If you add the fourth number, the revision, openwrap will always update the package to the latest revision.

Of course, you can update all packages in one go automatically by doing o update-wrap. This will update the project repository to the latest compatible version of packages, as described in your wrap descriptor file.


One of the things I don’t want to address just yet is building packages. There’s an MSBuild task that makes building the zip files easier, but I don’t want to go down the route Horn got and turn a dependency manager into dependency hell. So for now, people are expected to build their own zip files. It’s only temporary however, as I do expect in the next few versions for OpenWrap to not be built from a build script anymore, which may end up being the default convention. Who knows? For now, OpenWrap integrates itself in your existing projects by replacing the target import by openwrap’s one.


I’ve not put up binary releases just yet, but when they are made available (or if you build it yourself), the shell is able to automatically install itself and retrieve the latest version of packages that it needs to run. That means that the installer is 35kb. You shouldn’t have much difficulty downloading o.exe and running with it very quickly.

Going forward

There’s a lot more to OpenWrap so far, from anchoring to the build system, but this is enough of an intro to give you a taste of what I’ve been up to for a few months.

Bar one piece of functionality on the client, which I’m in the middle of changing around (anchoring, a blog post at some point will explain what that is), we’re nearly ready for a first beta release.

Want to contribute? The site is at While it’s under the OpenRasta brand, the project is stand-alone, and I will be managing OpenWrap as an independent tool. I will however base any further OpenRasta developments on it.

I know there has been recently a lot of noise from many parties in the package management space. The only thing I can tell you is that I’m fully committed to bringing OpenWrap in the hands of developers as quickly as possible. It’s a different approach to a complicated problem, and I think it’s hitting a damn nice spot even if I may say so myself. I’ll post in a few days the first binaries (when the server is up) so you can start playing with it, open accounts and start publishing your own wraps. After that, there’s a lot of work to do to enable testing, documentation and many other scenarios.

One last word

If I was to request one last thing from you, reader, it would be the following. Package management is going to be the next Vietnam war on .net, and many people will come up with different solutions. It’s all for the best, and most projects, as they have done many times before, will die off on their own. This is to be expected. As such, I implore the .net world to let enough time for each of those projects to compete purely on the quality and functionality they provide, and let the best one eliminate naturally the other ones. Don’t succumb to the belief that standardizing early will help, or that popularity would be a distinctive factor. If we fuck-up the package management story on .net, we may never recover, so give it a bit of time and be circumspect in your analysis.

And don’t forget, my project got a cooler name anyway.


Wednesday, 19 May 2010

Why I haven’t blogged about OpenWrap yet.

Because it’s not ready and I haven’t announced it yet.

I showed the state of the code-base at the workshop, to gather feedback from smart people. There was good feedback, and the latest architectural change happened the night before, so I’m still coding.

I’m doing it in the open, you can have a look at the code but I won’t link to it.

But please, please, to some of you, get off my back! If you think your package manager is better, good, I’m glad you found a tool you like.  If you think the project is a bad idea because yours is better, please commit some code and show us the money.

Until I’ve officially announced the project, I’d be quite happy not dealing with all the negativity that has come my way since Rob’s post.


Tuesday, 18 May 2010

Chuck Norris doesn’t follow people, he is the follow process


Saturday, 3 April 2010

OpenRasta needs an msdn license

I don’t usually use this blog for requesting help, but I’m afraid on this one I have to.

I don’t have access to an MSDN license anymore, as the cost is too high, I’m not an MVP and the ActionPack works for my professional needs. Except it doesn’t work so well with OpenRasta.

With the upcoming Visual Studio release, and the new OSs out there, I’m out of licenses to continue testing OpenRasta on all those platforms.

So, my friends, the communnity, I’m turning to you. Do you have a spare MSDN license somewhere? Do you know someone at a vendor happy to provide such a license? Maybe even Microsoft? Now is the time to help OpenRasta!

Email with your suggestions! Thanks!

Tuesday, 30 March 2010

OpenSource on .net at Microsoft TechDays

Register now at

The .net ecosystem is rich in open-source solutions that many have already adopted as part of their business-sensitive toolkit. Come and listen about open-source web frameworks, object-relational mapping tools and other must-have frameworks the .net community has produced over the years, by the most prominent figures of the UK developer community.

Come and enjoy free food and drinks and listen to experts present you the best of breed of open-source software for Microsoft platforms.

Current program:

  • OpenRasta - A web application framework for .net

  • An introduction to IoC with Castle Windsor

  • FluentValidation, doing your validation in code

  • CouchDB, NoSQL: designing document databases

  • Testing your applications with IronRuby

  • Building a data-driven app in 15 minutes with FluentNHibernate

Thursday, 4 February 2010

Announcing the “20 days to OpenRasta” project

As some of you already know, I’m very excited that OpenRasta is being presented at Mix10 in Vegas by none other than the talented Kyle Baley. As I’ve not realised the 2.0 RTM bits yet, I thought it’d be great if we could release a fresh 2.0 RTM build for the occasion.

This is a call to action to the users, adorers and believers: OpenRasta needs you!

In the next 20 days, starting from this Friday, let’s try and all commit some of our time to OpenRasta in one way or another. There’s a lot to be done and focused on, from the new web site, to updates to the code base, to enhancing the documentation.

To participate, just join the mailing list, find something interesting you’d like to be doing, and commit to work on it on a certain day.

On top of that, from this weekend, I’ll be organizing a code-a-thon on either day, with anyone that cares to join me for a day of pure pair programming coding on some of the OpenRasta code-base. Want to see extensible authentication done? Donate your day, we’ll have coffee and lunch and lots of code! Not in London? We’ll use Skype. No excuse!

As for me, I hereby promise to start posting a videocast a day for 20 days. Provided we have somewhere to host the videos and someone can help out with the encoding!

I’ll update this post with all the commitments that were made to help get a new release out of the door in time for Mix.

Thursday, 19 November 2009

OpenRasta 2.0 release party!

The time is upon us, for a release and for a party to celebrate it.

Come and join all the UK OpenRasta users, it’s on the 12th of December and in Central London.

Go register on the eventbrite site now, quick!

Friday, 30 October 2009

Derivative work for speakers, or a guide on how to use my content

I realize I’ve never clarified what you can or cannot do with my slides and my talks. So here’s a clarification for anyone that wishes to inspire themselves from my work (aka derivative works) or reuse them.

I do not release my presentations, the videos or the content / slides under any kind of open-source license. Not even creative commons. Presentations take a while to build, structure and mature, and this cost me money. If you’re going to use them, you’re effectively using my work.

Now, I’m not anal about how you use the content, it’s written to benefit the community. However, ff you want to create a derivative work, or even re-present my presentations, I’m happy for you to do so provided the following conditions are met:

  • The original work author is to be named (that’s me), together with my company name (that’s Caffeine IT).
  • It would be terribly appreciated to link to the original content, or my blog, or both.
  • You notify me that you’re going to use the content, or created a derivative work.

If you have any issue with any of that, don’t hesitate to send me an email we can chat about it.

Thursday, 22 October 2009

Announcing the first Cambridge AltNetBeers – StackOverflow edition

We are expanding, how brilliant is that! If you want to have an open-space after the Cambridge StackOverflow dev-day, you now can!

Monday, 12 October 2009

#AltNetWorkshop on CQS with Greg Young

I’m very pleased to announced that this weekend, for a day only, Greg Young will be delivering a workshop for the AltNetGroup, for free, in London, on Command-Query Separation.

3 tickets will be available daily at 2PM on the AltNetGroup site.

Thursday, 8 October 2009

AltNetBeers StackOverflow DevDays edition

The registration for the post-StackOverflow conference in London is now open at

I’m sure it’s going to be an absolutely brilliant event, so register early as space will be limited.

Monday, 5 October 2009

London GayGeekDinner – Friday 9th of October

Just a quick reminder for those not monitoring the site, our next event is this Friday, and you can register at

It’d be great if you could do it by Wednesday so I can have an idea of numbers. :)

Monday, 21 September 2009

Announcing a new kind of events: AltNetCrossTalks, this Friday at MRM!

And there you go. When you can’t scale up, scale out! We’re creating a new kind of talks, one where communities will meet and cross the technological Styx.

The first one is on Ruby, RubyOnRails and IronRuby, the presenter is Shay Friedman, the place is MRM, the time is this friday, and the this is the link.

Wednesday, 16 September 2009

Last day to enter the raffle for a ticket to Roy Osherove’s TDD workshop

As you know, Roy is delivering the first of our AltNetWorkshops on Saturday the 26th of September. Most of the tickets are now gone, but you have the chance to enter a raffle for the last remaining ticket by sending me an email at

Sunday, 13 September 2009

The first AltNetWorkshop with Roy Osherove on Intro to TDD

I'm very glad to announce that we launched the AltNetGroup website last week, and opened the first couple of tickets to the first AltNetWorkshop, something that I've been very keen on organizing. Roy has been generous enough, together with bbits and Onalytica, to give the first of our workshops for free. The bad news is that the event date has changed, and is now handled on the 26th of September. The good news is that there will be another 5 tickets, of which two will be released on monday, and two additional ones on tuesday. This leaves us with one last final ticket that will be picked randomly to all those sending me an email to

Tuesday, 8 September 2009

Alternative Network Group News – AltNetBeers #12

As the ever excellent Udi Dahan is in town, it’s only natural that I organize an AltNetBeers. So get ready for another session on the 16th of September! You can register now on the ukdotnet site.

Thursday, 3 September 2009

Seb does Ireland – 30th of September to 3rd of October

And because I’m equally excited about going back to Ireland as I am going back to Scotland, I’ll be doing a bunch of things there.

Wednesday 30th September

Dublin at 8pm in Seagrass

An intro to OpenRasta 

Thursday 1st October


Not confirmed yet but should be a talk on agility in Dublin

Friday 2nd of October


Speaking at a conference on agility, will post about it when I get more details.

Seb does Scotland – 23rd to 25th of September

Well, it’s been a while since I’ve been a up north, and with such a great community up there, it was only a matter of time before I got back. Frankly, I was just looking for an excuse, and the guys have given me a beautiful one!

So here’s the schedule.

Wednesday 23rd September

Dundee –

When agile goes bad, how to stay calm and move forward

With applying agile methodologies comes changes in many aspects of delivering software. And with any change will come a time when something fails. How to keep everyone calm? How to provide practical solutions to prevent people from reverting back to non-agile practices at the first roadblock? Through examples gathered from personal experience and the community, we’ll explore ways to prevent the boat from sinking at the first spilled glass of water.

Thursday 24th September

Edinburgh -

An intro to OpenRasta

Everybody seems to rediscover the MVC model, and new frameworks seem to appear all the time. Most of those hide the richness of the web. Come discover OpenRasta, a very opinionated framework that help you write MVC-style web applications and data services, using a unified API.

Friday 25th September

AltNetBeers Scotland edition

The scot guys have asked me to facilitate a session of AltNetBeers, which I’m really excited about. Will update with the details when I know where it’ll be organized.

See you there!

Friday, 28 August 2009

NHibernate repository that Oren won’t like

public interface IRepository<T> : INHibernateQueryable<T>
ITransaction BeginTransaction();
void Delete(T item);
T Get(object id);
void Save(T target);
void Update(T item);
public class NHibernateRepository<T> : IRepository<T>, IDisposable
readonly ISessionManager _sessionManager;

INHibernateQueryable<T> _queryable;
ISession _session;

public NHibernateRepository(ISessionManager sessionManager)
_sessionManager = sessionManager;

INHibernateQueryable<T> AsQueryable
if (_queryable == null)
_queryable = Session.Linq<T>();
return _queryable;

public Type ElementType
get { return AsQueryable.ElementType; }

public Expression Expression
get { return AsQueryable.Expression; }

public IQueryProvider Provider
get { return AsQueryable.Provider; }

public QueryOptions QueryOptions
get { return AsQueryable.QueryOptions; }

public ISession Session
if (_session == null)
_session = _sessionManager.OpenSession();
return _session;

public void Dispose()
if (_session != null)

IEnumerator IEnumerable.GetEnumerator()
return GetEnumerator();

public IEnumerator<T> GetEnumerator()
return AsQueryable.GetEnumerator();

public IQueryable<T> Expand(string path)
return AsQueryable.Expand(path);

public ITransaction BeginTransaction()
return Session.BeginTransaction();

public void Delete(T item)

public T Get(object id)
return Session.Get<T>(id);

public void Save(T target)

public void Update(T item)

public static class CustomerQueries
public static IQueryable<Customer> ByName(
this IQueryable<Customer> repo,
string name)
return repo.Where(x => x.Name == name);
public static IQueryable<Customer> ByCity(
this IQueryable<Customer> repo,
string city)
return repo.Where(x => x.City == city);

public class MyPage
IRepository<Customer> _repository;

public MyPage(IRepository<Customer> repository)
_repository = repository;

public Customer UpdateCustomer()
return _repository
public class when_filtering_by_city
public void the_wong_city_is_not_selected()
var myTestData = new List<Customer>
new Customer { City = "Aarhus" },
new Customer { City = "London" }
var funPlaceToBe = myTestData

Debug.Assert(funPlaceToBe.City == "London");

public class Customer
public string Name { get; set; }

public string City { get; set; }

Friday, 21 August 2009

OpenRasta 2.0 beta 2 is out

Grab the binaries at or the code at