Ayende @ Rahien

It's a girl

dasBlog 1.7

As part of my upgrade of the site, I upgraded my blog to dasBlog 1.7, so far it's been too busy jumping up and down calling "Horray" to take the time to post about it.

It's as if someone sat and made a list of all the things that I wanted in my blog, and then made them happen. (BTW, the upgrade was really smooth for dasBlog, the reason for the downtime was that I messed up the Cuyahoga's installation really bad. I really should've known better.)

I'm not talking about just good featuers, each and every one of them is something I wanted as one time or another. Really wanted.

I'm talking about things like:

  • Named posts - so you don't get a GUID in your url - and it work for old posts as well.
  •  Captcha for comments if you want it and additional spammers features (which thankfully I don't have to use for now.)
  • Refferal lists that I can make head & tails from (searches, aggerators, etc).
  • RSS channel image.
  • Full WYSIWYG post editing in FireFox.
  • Many more features that I'd yet to explore.
Omar Shahine Scott Hanselman: A HUGE thank you from me. You made a wish come true.

Published at


I've been trying to use NQA to track down some problem in Cuyahoga (old database version doesn't support sub-quries, sadly).

It has been very difficult to get it to work. In ten minutes of work I added nearly 11 bugs and I'd to walk on the straight and narrow to get it to work.

Sorry for that, the moment I'll fix those NQA will be much more usable.

Source Control Solutions

Note: I only worked with SCM systems such as CVS or Subversion, those systems provide a single feature and that is change management. What I'm searching for here probably exists in one of the more expansive players.

After writing the last post, Peer Review Systems: Proposal, I started thinking about what a developer needs to check right now before he can start coding (this is especially relevant when access a part of the code that he didn't touch for a long time / ever).

  • Documentation (Which in itself may have anything from manife
  • Bugs History
  • Peer Review System  :-)
  • Strange mystical ambiance about the code that only those who wrote it can disperse.
  • The code history - from the SCM.
  • The current code.

What I want is to have some way of brining it all together, so I can look at a module and see everything that went into it in one place.

Are you aware of any such thing?


Published at

Peer Review Systems: Proposal

Scott Baldwin ask about how to setup peer review systems that would work with the developers (check often, review early).

The crux of the matter is that it should be as easy as possible to check in the code, and as hard as possible to ship code that wasn't reviewed. Two factors are working against each other here, if you allow the developers to check often, you will end up with a reviewer that need to read quite a bit of code. On the other hand, requiring that everything that goes into the repository will be reviewed cause either dead-locks (a developer can't continue until he's reviewed) or developers working on code without the benefit of source control. What is worse, it can get to the point where you still get a big pile of code, but now it isn't even on the repository, and you can't track how it changed. That is assuming that the reviewer won't just glance at this, see that the idention is right (about the only thing you can spot right away with reams of code) and approve it.

My propsal is (like everything this days) use rss in conjuction with the source control tags. You need to have two tags, un-reviewed & reviewed. Developers check their code as un-reviewed and then  each reviewer subscribe to the code he's responsible to watch over, (either by module, by person that did the check in, phase of the moon, whatever) and then he can watch the changes. The advantage in that is that the reviewer need only to digest small ammount of code each time (hopefully, they won't neglect this, because then they would again need to face that big pile of code :-D ).

The code that the reviewer will see will be properly displayed (i.e, not diff unless they want them.) proper change viewing can be accomplished with css today, so that shouldn't be too much of a problem (or they can just use the normal tools for code they always use). You would also get the log from the source control as a heading, telling you what this is about. The advantage here is that the developers are now encouraged to write logs that explain why things are happening, rather than what is happening ("added hbm editor" is not very helpful when I gives you ~3,000 LOC, "Compiled the Hbm schema using xsd.exe and added ui with reflection" - is a little better, but what would happen is that you get stuff like: "Compiled hbm schema using xsd.exe and added ui by reflecting on ... ").

I think that this would encourage people to write more why and how than the what.

Furthermore, we can take advantage of the rss pattern usage and have a conversation about the reviewed code. For example, if the reviewer ]didn't understand / like / has a better way/etc] he could use comment this piece asking for clarifications. The developer would need to answer those concerns before the reviewer would approve the code.

When the review decides that he approves the code, he tell it to the system, and it is moved to the reviewed tag.

Advantages of this proposal:

  • Encourage better documentation for checkins and for the reasoning behind the code by encouraging developer to explain in writing what they thought they were doing.
  • Expose concerns and the thought process of the developer.
  • Allow to explore the reasoning behind decisions and what are the possible gotchas.
    ("We can do that for now, but we'll need to change that to Foo when we'll get to 1.2 because of Bar")
  • This put the conversation between the reviewer and the developer, which would otherwise have been lost, as a first class citizen. As important as documentation or e-mails.
  • Useful for teams that works in multiply sites or has complex check-in/approval process.
  • Formalize a best practice in a way that is harder to ignore.
  • Uses RSS, so that answers the current rage :-D

Disadvantages of this proposal:

  • Add process to something that may be as simple as: "John, come and take a look at this" (But on the other hand, if it's as simple as that, it's not a formal code review.)
  • Yet another place to check (Documentation, Bug Tracking System, Peer Review System, etc) before you can touch code.

Published at

Asp.Net: There was pian [down time]

Well, at least now the upgrade seems to have been completed successfully :-)

Most of the problems were because of a flaky FTP connection, though.
I'd to babysit it so it would trasfer all the files.

And then I copied the files to the wrong directory and sc`rewed it all over again ;-) Anyway, I know now that I can have a CMS as the root of my site. I don't have any time left now, so I'll finish it later.

Anyway, to save you the gory details, I screwed up and the server was down, sorry.

It should be working now.


Published at

NHibernate QUery Analyzer - Now in beta!

It's about time that I did this. NHibernate Query Analyzer is now officially in beta status with the release of 0.7.

Let's cut to the chase, the project page is at: http://developer.berlios.de/projects/nqa/

The subversion repository is at: svn co svn://svn.berliod.de/nqa

But, the most important thing, of course, is the pretty long Flash Demo! 

In this release:

  • Functional hbm.xml editor with full UI integration!
    • On the fly verification of the schema and error reporting,
    • Customized menus for each element, so you can't make mistakes.
    • NHibernate QUery Analyzer will also tells you which elements and attributes are missing and then suggest ways to fix it.
  • Many small bug fixes and improvements.

Next release:

Known problems:

  • The cfg.xml editor is not very stable and will be replaced soon.
  • You can't edit elemet's inner text - no particular reason, I forgot about it until it was too late.
  • Tree view names doesn't update when you change an element name.
  • There is little, if any, error recovery.


  • If someone with some graphical talent reads this, I need help making the UI more attractive. The current UI works, but....
  • Please send any problems you've to Bugs@ayende.com, I can't promise to fix everything, but I can promise to try.


  • For NHibernate itself, for making databases a breeze and XML & GUI a nightmare :-D
  • To  Pierre Henri, for several good ideas and new challanges creating them.
  • To xsd.exe, because of all the work it saved me.


  • The whole thing with the matching version numbers is a pure coincidence.


I just spent about three hours sweating on some code to ident text :-)

I hope to finish the integration part in an hour or so and then you'll see what this is all about.

Yes, I'm a tease... :-S

Features, features, features...

To the theme of "Developers! Developers! Developers!"...

The interface for feature requests in berlios.de is a bit awkward to use when you want to do a bulk insert, so here is the features list for the next version of NHibernate Query Analyzer:

  • Recover from errors in mapping / configuration gracefully and then show what items caused the problem (red icon on the configuration screen).
  • Make the Hbm Editor & the Cfg Editor to tabs and allow editing files without openning a modal window.
  • Drag & Drop files to the configuration tab will add them, elsewhere will open them (with a message if they are not part of the current project.
  • Seperate the configuration tab to files in projects and configuration results.
  • Add a summery of the mapped classes and their abilities.
  • Generate code from hbm files via hbm2net & allow to create assembly directly from the menu.
  • Add proper code highlighting for everywhere a code is shown (right now it's hbm editor, sql & hsql windows).
  • Add wait window when waiting for DB.
  • Add severity combobox for logging viewer control when filter by is set to severity.

That is for now, if you want something, drop me a note.

Useful Trick: Upload To Blog

Here is a nice trick to easily upload stuff to your blog, it used to drive me mad that I'd to open the ftp client, log in, browse to the right directory, browse to the right directory on my computer and then click "upload" every time that I wanted to post an image or a file there.

Here is the solution, a simple batch script that will upload it to the spesified directory by itself. I put a shortcut to it on the SendTo Folder (a shortcut so I could change the icon to something nicer :-S) and it certainly help things here.

@echo open ftp.server.com > %tmp%\ftp_cmd.txt
@echo username >> %tmp%\ftp_cmd.txt
@echo password >> %tmp%\ftp_cmd.txt
@echo cd wwwroot/Images/Blog >>%tmp%\ftp_cmd.txt
@echo put %1 >> %tmp%\ftp_cmd.txt
@echo bye >> %tmp%\ftp_cmd.txt
@ftp -s:%tmp%\ftp_cmd.txt
@del %tmp%\ftp_cmd.txt


Published at

Psst, want a question?

Following this and that, I decided that I want to create my own set of questions, I'm not on par with Scot, but anyway... :-)


  • What is the purpose of Contorl.InvokeRequired property? What are the situations that you would use it?
  • Why Form.WndPrc is a protected method? In what cases would you override it?
  • What is the difference between inheriting from Control and inheriting UserControl? When would you do either?
  • What does it mean to set Thread.IsBackground = true?
  • Can you use Data Binding without Datasets? If yes, how? If not, why not?

General .Net Stuff:

  • When would you subscribe to the Thread.UnexpectedException?
  • When would you subscribe to AppDomain.CurrentDomain.UnhandledException? Can you prevent an application termination by subscribing to this event?
  • What is the Thread Local Storage Pattern and when is it applicable?
  • What would happen if an exception is thrown in the first method of a multi-cast delegate (a delegate that contains several methods)? What would be the return value of such a delegate if an exception is not thrown?
  • Name three places where the BCL uses the Strategy pattern.
  • How do I call my old VB code that contains all the business rules?
  • When should you use ClsComplaintAttribute? What are the differences between the CLS and the CLR?
  • What is the preferred way to concentrate strings? Why?
  • What is the difference between Array and ArrayList?
  • When would you override Object.Equals() and what else do you need to do when you do that?
  • What is an AppDomain?

General Programming Info:

  • What is a regular expression and when is it used?
  • What is XPath and when is it used?
  • What is working set and why is it important to application performance?
  • Is it important to preserve locality of reference? Why or why not?
  • What is paging? What are the implications that it has on scalability?

Published at

Asp.Net problems: How to integrate applications?

I want to use Cuyahoga as my CMS, so I place it on the root of the site. I also have a dasBlog on the /Blog/ directory. Both the root & the /Blog/ directory are IIS applications.

Each of those applications works very well on its own, but my problem is making both of them play together. I get the following error when trying to access the /Blog/ directory:

 File or assembly name Cuyahoga.Web, or one of its dependencies, was not found. 

<add type="Cuyahoga.Web.Util.UrlHandlerModule, Cuyahoga.Web" name="UrlHandlerModule" />


My problem is that I can't think of a way to trasfer control from one application to another. Anyone can offer a solution?

Do not touch live server when sick!

If anyone noticed, the Blog was down for a few hours, I trying to use Cuyahoga and I'd a problem in the configuration. The problem is that I'm sick, so I just fell asleep and didn't catch it in time.

Sorry for the downtime, but I hope you'll like the end result.


I try to read on other things beside .Net, just to keep my eyes open, and I've been consistently entertained by James Robertson. This last post, however, tops it all as a master-piece of the written rant.


Tech Support Story

I was just called to support an unamed family member that was having trouble reading a document. I thought that it was the usual lost document issue, but it was much worse.

This person was attempting to open a scanned image in Word, and got confused when word showed it the uknowned encoding. I changed the extention to Jpeg, and everything was fine.

It should be one of those things that you read about in joke sites...

Hbm Editor, nearly finished

Well, I'm nearly done with it, I think that you ought to like the interface, it's not done yet, but it still allows for some really nice stuff like:

  • On-the-fly schema checking - so you get visible errors with clear messages that tell you what you did wrong.
  • Support all the possible valid mapping according to the schema.
  • UI-ish way to add elements & attributes.
  • On-the-fly visual feedback on the way your final Xml will look like.

What remain to be done:

  • Code highlighting for the xml window.
  • Tighter integration with the code & the model, meaning that class variables will give you the ability to search for classes, etc.
  • Finish off some edge cases (id vs. composite-id and several others).
  • Add support for removing elements.
  • Integrate the editor with the rest of NQA.
  • Build the code generation from the mapping document (hbm2net, hbm2ddl, etc).
  • [Update: Make better UI, the icons are just rundom images from my computer. There has got to be a better way to do this.]

What is cool:

  • All the interface is done without knowing anything about the data it is displaying, it's all runtime reflection stuff and some editing of the code to express ideas that were not trasffered by xsd.exe (which elements/attributes are required, types of attributes, etc).
  • You can load an existing document right now and it'll display it on the UI and let you explore/change it in a nice way.

[Update: The code is in the repository if you want to play with it. It's 5:14AM on my timezone, and I didn't feel the time flying, I'm going to sleep now and hopefully I'll manage the rest of the changes tomorrow.]

Process Explorer: Exploring Threads

I've found numerous references to finding out which thread is taking too much CPU time using Process Explorer, but I can't seem to find the UI to find it. VS.Net keeps hanging on me, and that is very annoying. What I would need to know is which thread, and which library it is running from.

Any suggestions?


Published at

Cool utility: Registrar Lite

Registrar Lite is a registry manager that has one useful feature that I haven't been able to find anywhere else: Registery Keys Cut & Paste. This feature is invaluable to me when trying new VS Add Ins (mainly because most of them has trouble running when you are not administrator). Highly recommended (free).


Published at

Plans for NHibernate Query Analyzer

I thought that it might be good to provide some info about the road ahead for NHibernate Query Analyzer:

Version 0.6.5 - hopefully this weekend:

  • Getting the Hbm editor right and integrating it into the UI.
  • Finishing touch of integrating the Cfg editor.

Version 0.7 - beta:

  • Tests!
  • Tests!!
  • Tests!!!

You might want to call the whole of NHibernate Query Analyzer a big spike that went out of control. As such, there are no tests whatsoever being functional tests run by a poor person in the middle of the night with a bottle of Diet Lemon Coke (e.g, Me). That will change as soon as I've a semi-stable release. It'll be a good chance to add tests to "legacy" application. I'll blog about it soon.

Version 0.8:

  • UI spit & polish.
  • Catching much more exceptions and handling it in a nicer way.

Version 0.9:

  • Final chance to fix bugs.

Version 1.0:

  • Secret sauce goes here :-)

Wanted Outlook Addin: Same Email Grouping

I get many emails that are identical (mainly from my blog software, telling me how many visitors from each url).

What I want is to have some sort of magic that would group all identical mail and just show me one copy of it, with a number saying how many message I got of this email.

Stange VS.Net 2003 problem

For the last two weeks or so, I've a problem with VS.Net that drives me crazy.

VS hangs when I stop debugging, this happens around 30% of the time, on two of my computers, both of then when doing NHiberante Query Analyzer work.

The CPU usage goes to 100% and the whole process just freeze. I'm going to install the new version of Process Explorer and see if I can find what is the offending thread and to what library it belongs. I suspect an add-in, but I can't find which.


Published at