Thursday, 18 December 2008

Visual Studio 2008 has buggy windowing code introduced in SP1… And no hotfix planned!

Update: Microsoft has released a hotfix. Thanks!

This issue keeps on coming up in my day to day work, and it takes me an hour or so everytime to fix… Whenever you have to deal with docked windows and visual studio changes the mode it is in, you end up with a fatal crash. It can happen when you start debugging, when you stop debugging, when you open a project or when you close the app.

This issue was, of course, not in the original vs2008…

These are the bugs I collected on Connect explaining the problem in more details. Microsoft has said they won’t fix because the code has been rewritten in vs10… But considering the stability of it at the moment, I want a hotfix now!

Anyway, here are the links. Don’t hesitate to nag everyone you know in DevDiv until someone takes responsibility to release a hotfix.

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345345
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355130
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362433
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363412
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362508
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=369540
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=377247
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=376251
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=378065
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=377549
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=364335

VS Shell team, do your homework and fix your regressions!

Tuesday, 9 December 2008

From talking to doing – Open Space Coding Day

We are having very interesting debates and conversations at every single alt.net event that has been organized. Talking with others is a great way to reach a common understanding and evolve as a community.

There has however not been that much coding involved, something that many people have found was missing. That’s why I’m very glad Alan Dean has announced the first iteration of a project he mentioned at our last alt.net Beers: the Open Space Coding Day. Go and give feedback now!

Saturday, 6 December 2008

OpenRasta is available

This entry may be outdated. For the latest updates on openrasta, see www.openrasta.com.

Don’t get too excited, I’m still quite far from beta 1… But here goes.

As you can see, the documentation is still very much a work in progress and I’ll add several tutorials over the next few days. Expect some code churning as I increase the code coverage and continue delivering some functionality.

Didn’t think I’d get to the point of releasing that baby, but it’s finally there. Woo!

Thursday, 4 December 2008

Blog design updated

For those of you only reading from an RSS reader, have a look at the website when you got time. I’ve updated the logo. Gives some well-deserved character to this blog.

Wednesday, 3 December 2008

OpenRasta status update

This entry may be outdated. For the latest updates on openrasta, see www.openrasta.com.

I’ll be adding the proper headers tomorrow and release this version. It’s getting to a point where it can start marching to beta status openly. Here’s the change log since the last status update.

IO

  • new stream chain infrastructure for accurate content length discovery
    Codecs don’t have to deal with knowing the content-length anymore, it’s all done by wrapping the stream with one that tracks the Content-Length accurately.
  • Multipart support
    Support is in, and for the most part there is no more issues with asp.net taking over. The next step is to completely bypass asp.net and use the IHttpWorkerRequest directly. There’s preliminary support for that, but I want to have a clean-cut separation between streamed and buffered modes, which means implementing bulk transfer. Support is only buffered at the moment.
    At the IO level, you’ll find the goods in BoundaryStreamReader and BoundaryStreamWriter, as well as the new HistoryStream class. The problem with potentially non-seekable streams when reading boundaries is that you may read past the end of the boundary and need to go back… But It’s not seekable! HistoryStream keeps a fixed buffer of the last couple of reads and let you seek within that.
    One level up, the MultipartReader and MultipartWriter classes are the ones able to give you IHttpEntity objects from / to your streams.

Configuration

  • new configuration syntax
    Everything is now on ResourceSpace. I didn’t like the focus on URIs the previous versions had. Furthermore, they’re all attached to an IHas singleton, so you can add your own configuration language from the top-level ResourceSpace.Has.new demo site
    This should hopefully be used in the future to run some Watin automated tests.
  • Configuration auto-wireup
    You can either do the configuration in your global.asax or use a class at the root of your app. You used to need IRastaConfiguration (how confusing), it’s now called IConfigurationSource

Infrastructure

  • new dependency resolver flow
    No more direct access to the IDependencyResolver. The framework treats the internal one and any external one you may want to use (aka your favourite container) equally. Fixed a bunch of bugs when registering singleton instances in the internal container.
  • Error infrastructure
    The pipeline has been modified to be able to go back and restart the processing. That means that your error page will be subject to content-type negotiation.
  • Resource matching
    By default, resource instances you return from your handlers are seeked as an exact match you registered. There’s an opt-out by registering a resource as AnyChildOf<Customer>, which will then match Customer and any class inheriting from it. Feedback welcome.

Refactoring

  • Heavy renaming
    Folders now have the proper names, there should not be anything left with the Rasta moniker. Lot of interfaces and classes have been updated to reflect the http spec a bit better (IHttpEntity, IHttpMessage…) or to be more meaningful (ICommunicationContext replaces IRastaContext, IRequest and IResponse are shorter than the previous interface names). All the asp.net specific implementations have been renamed to AspNetXxx.
  • Http handlers and modules
    The http handler is now OpenRastaHandler. It may be changed to optimize the code path for IIS7 integrated mode when available. The module is now OpenRastaModule.

Bug fixes

  • Integration tests
    Just fixed the infrastrucutre to copy web.config automatically to the correct folder. The default destination is now in a separate folder. Other projects will follow soon.
  • Removing god objects
    RastaConfiguration used to be a big mammoth with way too much happening on it. It’s been split between DependencyManager (a service locator for the few repositories being used) and OpenRastaConfiguration (that exposes only the Manual property).
    All the same, IRequest and IResponse are much leaner than they used to be, with all the implementation details moved to the PipelineData object. TODO: Auto-register IRequest and IResponse in the container so you don’t need the dependency on ICommunicationContext.

Codecs

  • Content negotiation and media types
    I thought I had this one fairly nailed-out, turned-out I was wrong. The mime types are now prioritized on the server, so that when the client asks for */* (<cough>IE<cough>), the mime type with the highest quality is selected. Reprioritized both the webforms codec and the html error page codec to prefer text/html over application/xhtml+xml.
    HttpContentType is now called MediaType, which should solve the confusion between the ContentType header and what a media type is.
    TODO: Write the tests to ensure the Vary header is appended correctly.
    TODO: Have a way for the codec to get involved during the selection of the correct mime type. This would let the webforms engine detect the doctype and set the content-type appropriately.
  • Error codes
    There’s some new properties on OperationResult to detect client and server errors. This is used to automatically pad the returned representation, as IE (again) hides anything returned with a size less than 512 bytes.

Webforms engine

  • Webforms url rewriting
    I’ve now re-enabled the capability to register a webforms page at a fixed Uri with new extension methods, associated with a behind-the-scene handler and some changes to the codec.
  • Markup
    I’ve started refactoring the extension methods used for generating html content, which you’ll find in OpenRasta.Markup. There should be much more tomorrow.
  • Uri creation
    IUriResolver has been simplified, and a lot of noise implementation is now done with extension methods. Also a work in progress so expect more unit tests in the next few days. And you can now automatically generate URIs from any object by using myCustomer.CreateUri(); Sweet.
  • Plain text codec
    I thought it was more than time to bring plain-text back on the scene. So now you have a text/plain codec out of the box.
  • Silverlight
    Work on this is suspended for now until we reach beta 1.

What’s missing

  • For both the MultipartFormDataCodec and the ApplicationXWwwUrlFormEncodedCodec, we still haven’t gained back the support for complex types. This is coming back tomorrow, with a common code-base. That should be the end of ReflectionHelper, as the code gets migrated (and unit-tested).
  • The license header files, which will also be there tomorrow. Once it’s done I’ll give the svn and trac addresses, and open the mailing list to the public :)

There you go, there’s probably a lot missing as I didn’t log everything in svn, but we’re approaching the end of the tunnel. Aim is to be feature-complete for beta 1 in a month time. Patches are welcome :)

Tuesday, 2 December 2008

And you wonder why I haven’t got my next contract yet…

Received yesterday.

A key aspect of the job would be your ability with using multiple SQL server data-sources within one application, calling from one or more data-sources, manipulating the data and inserting into another.

So apparently people still do horrible things like that. Makes me break in cold sweat.

Alt.net London Beers Proceedings available

http://www.altnetpedia.com/AltNetBeers.ashx

OpenRasta finally gets its yellow screen of death.

image

The infrastructure to generate the page presented when an error occurs has been in place for a while, but lack of time and a bunch of bugs were preventing it from happening. It’s now resolved!

Anyone has any preference for the color of the future error message page? I’m thinking red or green.

Friday, 21 November 2008

Blend 3 will use the Visual Studio 2010 C# editor

I could be wrong. But I could be right. Announced at the next Mix?

Wednesday, 19 November 2008

A birthday and looking back on my digital life

So it’s my birthday today. Every year until this now, my birthday has be the time for doing absolutely nothing. As I geared-up my community involvement this year, I find myself with so much to do and so little time that my birthday will be an after-thought this evening. Editing of alt.net content (7 hours of raw HD material to cut, compress, publish, of which I have only started), preparation of a talk next week, publication of a detailed guide for OpenRasta’s official launch (including delivering on my plan to port the Suteki project), a backburner project for Paris… And so far no contract in London, with agents driving the prices down and a global recession that is starting to ripple its effects through non-financial companies.

So I thought I’d celebrate the year by looking through my blog entries and twitters to provide for myself a roadmap of what I’ve done right and wrong.

2007

Had issues with a company and a manager with which I didn’t manage to work. Lesson learnt from it, there is a right time to move on and a right place to be efficient. Started a long rant on mocks and their uses, trying (poorly) to debunk the ideas that mocks were always better than fakes, and that there was a life outside of mocking frameworks. However, with the latest mocking framework syntaxes and new defaults, the problem will slowly go away.

2008

Spent a lot of time comparing and pondering how to provide data for the very poor http client called flash. Attended the first UK alt.net conference and felt so much more energized than I have been in years. Started giving presentations in user groups. Started working on the first version of Rasta that would lead me to write OpenRasta. Predicted that skydrive and foldershare (now WL Sync) would interop through the Sync framework (but Live Mesh doesn’t use skydrive yet, so this is not realized just yet). Organized the first alt.net beers event. Changed my relationship to code by switching my desktop to 30”. Started using twitter (and it’s all @CAMURPHY’s fault).Went to NxtgenUG Fest08. Made a point of supporting Linq2Sql and ignore Linq2Entities. Gave more talks. Went to Mix:UK, PDC, VBUG, TechEd…

 

And I’m  not including all the stuff I didn’t blog about. Very busy year indeed. And yet I feel I’ve pretty much under-achieved. So I take the public vow here to try harder. 5 year plan etc etc.

Friday, 14 November 2008

One more day at a conference…

And one more night of discussion, passion and learning. I get so much from meeting the people that attend conferences that I really think that not attending the sessions and only meeting people at dinner is where the value really is. I may just do that next year and skip the conf itself, and reserve myself for dinners, drinks and beer chatting.

Monday, 10 November 2008

Beginning of #TechEd – Early Bird WTF.

Thought I’d moan a bit more about the organization… By registering early, you get given, I quote the guide, ”a reserved seat” at the keynote.

When you check in, you get given a nice wristband supposedly giving you access to those seats. Comes in a nice plastic bag, together with a cap.  But no explanation notice explaining that, in fact, you need to come 30 minutes early to have your seat. So the wristband gives you the right to arrive early when no one else is there to choose a good spot. But it’s not reserved.

Of course, the very heavy booklet provided with the conference bag doesn’t mention those 30 minutes. Neither is any sign in the conference centre. Nor do the ladies giving you the goods in the morning.

So no “reserved” seat for me, because the reserved seat wasn’t really reserved at all. Fair enough.

But then one of the attendants that was managing the event replied, after my questioning:

“- you’re 15 minutes late, it was at half past for early birds
- but no one bothered telling me this
- well it must have been indicated, you should’ve been on time
- but there’s no sign, no documentation, no nothing about being there at half past?
- well we had those three rows over there. Don’t be late next time”

So it’s my fault no one mentioned we had to be there half an hour before? Or that you didn’t print it? Or that the documentation doesn’t show it anywhere?

Add to that there’s no Wifi in the room and not a single twitter mention anywhere, or facebook group, and I have to wonder what happened between last year and this year.

At least we get a nice conference bag, of about the same quality as the one from last year. As that one is nearing the end of its useful life, the new one arrives just on time.

#TechEd – Keynote

[Update: Indeed, the unannounced stuff was the sharepoint visual studio integration. Paul Andrew just blogged about it.

Introduction from the business guy. I assume the black blocks in front of the stage the presenter keeps looking at is some sort of teleprompter. It’s always very annoying to see any speaker fixed on his slides / script.

Talking about how great it is to do business in Europe. Slides showing partners. Still don’t understand why a developer conference ends up with marketing and business cases. Could they do TechEd decision makers and stop boring me with all this amazing stuff people do with Microsoft software? Or at the very least try and hit my geek soft spot?

Zander is now on stage. No powerpoint, just Visual Studio demos. Thanks god a geek is finally presenting. Will be releasing stuff not talked about at PDC. Good! Wonder if that’s in the bits we got at PDC, need to rerun the VM tonight.

Showing the reflector equivalent that’s built in vs10, which we’ve seen at PDC. Showing assembly dependency analysis, delving into class dependencies. Sequence diagrams (see pdc bits). Gets me worried to see all this UML stuff creeping back in.

Showing off the blackbox replay for testers. Sweet if it comes for free, other tools have provided this for quite a few years now.

So the machine they’re demoing is actually being RDP’d into. Wow. Showing off vista’s graphics capabilities!

More WPF editor goodness. Still no sign of the new windowing promised for vs10. Lot of code visualization stuff. Mentions of MEF (@gblock is gonna be happy :) ).

Trying to debug a session, find the bug… But changes live code without writing a single unit test to confirm the problem. There really is a need for Microsoft to start a cultural change.

In no particular order, saw snippets for xml and javascript, jquery, web deployment and a test-first demo of MVC. There’s still a lack of understanding of the difference between test-driven and test-first, shame the two words are still used interchangeably. Some VB10 goodness.

Xml transformations for config files. So you mean I can solve my config problems with some config solutions? Wow.

Some sharepoint stuff I have no interest in, dozing off.

C++ parallel_for keyword to use 8 cores to do ray rendering of pong in 3d. Some touch support to move the pong cursor (what, you mean with a touch screen i can move stuff around? Wow.)

That part of the keynote has been delivered perfectly, but what was shown was mostly PDC stuff. Not seen that many non-PDC news, but maybe I missed a bit (or was that the Sharepoint thingy?)

Sunday, 9 November 2008

On my way to Barcelona….

[pre-nagging: this post contains jokes about Italians, British, Spanish and French people. If you’re offended by generalization about nationalities on holidays, please skip this post altogether.]

What a joy to travel. Only a few hours after I left home, I am already feeling incontrollable urges to hate 4hundred of people that have been encumbering my travel plans. Let’s review what happened for me to manage to board the plane.

  1. International
    I was ready to leave the house on time, until I realized that for some Murphy’s law reason, my travel pass *and* my Gatwick express pass didn’t actually print, and Vista just silently failed on me. 5 minutes delay.
  2. British
    The cab then shows up 5 minutes late, getting me to the Gatwick express at 15:03. And *then* do I realize that, for maintenance work, said service leaves every 30 minutes instead of every 15. 35 minutes delay.
  3. More British!
    Well, you didn’t really expect the Gatwick express to arrive on time did you? 50 minutes delay.
  4. Italian
    As it happens, a big Italian contingency was sharing the same train as I. Having been raised with Italians, I’m fairly used to them being slow and unorganized (and nearly as rude as the French). But when there’s only one elevator for the already overcrowded train, things just add-up. Wait for 15 minutes to get an elevator, 65 minutes delay.
  5. British more and more, and some Italians
    Thanks to BAA, once I finally arrived at the airport level, and only one floor from checking in, a BAA representative barks at me that my luggage is too big to take the escalator. Bless the spotty face and the arrogance of the yellow-wearing Gatwick idiots.  At that point, I’m lower on the food chain and have to accommodate with the 2 out of 4 functioning elevators to get to departure. Wait for another 10 minutes, 75 minutes delay.
  6. British Airways
    Well, by that point, even though I was checked-in, the whole masquerade of pretending to call the controller about late-checking of luggage is unfolding, me knowing that under no circumstance do you try to get in touch with the guys handling the luggage by phone. Ever. You need a radio. But the masquerade to protect the attendants from telling me to fuck off unfolds, adding another 10 minutes. At that point we reach 85 minutes of delay.
  7. British Airways again
    Wait to get ticket changed at Customer Service. 15 minutes wait. Get told that I should queue (again) in the ticket buying queue. another 15 minutes. The fact that I have a business ticket seems to have no importance on how fast you get treated when you have a problem. People may wear smile well, but the customer service still painfully sucks. I stop counting.
  8. Easyjet
    Last flight to leave for Barcelona is Easyjet, from which I buy a cattle-class ticket for £139. I never travelled with them until now, and I know why. Gate checking an hour late, hundred of people just trying to walk on each-others and a waiting room that is probably not dissimilar to the corridor leading you to the fatal injection room in some Texas prisons. None of the staff has shown a single smile by now.
  9. Spanish
    Well, considering the destination, I have to moan about those a bit. While the lady next to me has been very polite and adorable, the (overweight) guy in front of me has insisted on reclining on his seat. Either that or said seat is reclining under the weight. In either case, the 17” laptop keeps on pressing uncomfortably against my stomach, making me regret the minute I thought getting the laptop out would be a good idea.
  10. Spanish on the other side…
    So of course, with the lack of space and strong sense of agoraphobia growing on me, not tamed in the slightest by the double bloody-Mary I inflicted upon myself, I politely ask the Andalusian woman behind me if she wouldn't mind too much if I reclined my seat. Of course, I did check that the only thing on her table was one of those miniature overly-salted overly-aromatized overly-fat overly-disgusting and overly-non-bio  Pringle pack. If you’ve never had the delicious pleasure of enduring airline snacks, the cylinder measures roughly 3 inches. But of course, said brunette, either not understanding my desperate attempts at sign language, or just being an annoying bitch (my preferred explanation so far), refuses with an arrogant no. Not the polite one you would expect, being apologetic for denying your freedom to ensure theirs. No no no. The aggressive “are you kidding me” refusal. Thought about slapping her face, or worse, just reclining the seat anyway. Give up, tuck in and put the laptop in my belly.
  11. German
    At last a smile from one of the flight attendants. I wondered for a long time why traditional airlines attendants always looked middle-aged, and where the young ones were. Now I know, they’re all trying to make a living working for easyjet.
  12. British
    Uh. Yeah, you guessed it. The plane is *very* late.
  13. American
    My iphone battery dies before I manage to connect to any network.
  14. Spanish
    Finally make my way out of the plane and try to accommodate my smell to the lack of locker-room scent that I had to suffer for the last two hours. Of course, TechEd buses are not running anymore, and the (4) guys waiting with a TechEd sign have no will to help you get to your hotel, pointing you to a cab. Sweet.
  15. Spanish
    Get in cab that has a big logo specifying they accept credit cards. Of course the guy refuses to take my card at all, so it’s off to the cash point, at a total interest of nearly 7% + £2 of transaction fee. Silly me I leave him a tip. Should’ve let him rot in hell. His teeth seem to enjoy the place.
  16. Hilton Diagonal Mar
    So you’d think with such an insane trip, with a booking made in June, Hilton would at the very least solve my problems. Nope, non-smoking room and no way to get a smoking room. At that point I’m exhausted and will just flaunt the non-smoking status until I get a room of equivalent size or more in *smoking* environment. Otherwise they’ll have to rebrand my room. Or charge me. But as there’s no mention of such a charge anywhere…
    Speaking of which, don’t even get me started with the quality of the internet, that I have the privilege of paying a freakin 100€ per 7 days for. Or the fact that their book where you supposed to have all the information for your stay, including the room service, is still unordered and missing entries. Second year in a row.

Oh, and in the process I just realized I forgot my TechEd card at home!

Follow Sebastien’s adventures tomorrow as he tries to get the room he booked and get registered at the convention center. *orders another beer and pops a prozac*.

[Update: after feeling bad and going down to smoke outside the hotel, I managed to get my room changed tomorrow. There’s some light at the end of the tunnel.]

[Update 2: On the up, hotel room changed. On the down, breakfast eggs made me sick this morning. At the conf center, hopefully everything will be a smooth ride from now.]

Apologies for the silence… Out of work and conferences

Sorry to all people reading (and not taken over by tweeter fever). Between PDC and KaizenConf, I took a couple of days off and am now getting ready to meet even more great people in TechEd.

I’m doing the initial edit for some of the videos I took at KaizenConf / PDC (mainly recording of sessions, the interviews will take a bit longer). I hope to manage to get a few more at TechEd. Bittorrent of the raw material to follow.

Oh, and I still don’t have a contract, so any work you feel I may be able to help out with, please shoot me an email at seb@serialseb.com. Thanks!

Saturday, 1 November 2008

KaizenConf , so far, has been about…

  • Self-improvement
  • Corporate adoption of lean
  • Talking about how learning how to be a good developer and a good chefs are one and the same thing
  • Talking about the American economy
  • Talking about the meaning of feature
  • Talking about the interaction between France and Quebec from the 1960s
  • Talking about the cost of adopting technology and its value depending on the project / team size
  • Talking about the waste of adopting lean in the silo of IT
  • Talking about recognizing failure and success

I probably forget many, but my brain is obscured by the level of discussion and contribution that happens here. None of the PDC / TechEd events compare to the thrill you get when surrounded by extremely opinionated and excited people. I’m in geek heaven.

Tuesday, 28 October 2008

I am a ToolWindow

For anyone that attended Glenn’s talk.

black_tshirt_girls_FF

Monday, 27 October 2008

Alt.net OpenConf session at PDC!

For all of you alt.netters and interested parties, I just came back from the OpenConf style area next to the exhibit floor, and there’s an alt.net track being proposed.

It’s at 15:30 on Tuesday. Be there or be square! (how tacky…)

Alt.net London Beers #4 – 25th of November

If you plan to attend, please leave a comment on this entry.

I should have the time in the next few days to publish the result of the third edition of the alt.net beers. Thanks for everyone who came and made it a very successful event.

So let’s plan the date for the next one. From now on, I’ll organize the event on the last Tuesday of each month. To make sure we don’t step on each others toes, most of the UK community events now share their dates in a central location, so hopefully you won’t ever have to make a choice between all the amazing events that happen in the UK.

Following on the success of the previous events,I am happy to announce the next alt.net London Beers event. Tequilla\ has been nice enough to let us use their downstairs lounge bar, to continue with the tradition of beer-oriented conferencing.

The format is a mini openconf-style session. Here are the rules, slightly changed to learn from the previous event.

  • Arrivals, discussion and socializing between 18:00 and 19:15, with one necessity: find the topic of the day and find the questions that we will try to answer.
  • Between 19:15 and 19:30 we will vote on the subject we want to talk about, in two rounds, by raising hands.
  • At 19:30 the big clock will start ticking for a time-boxed 60 minutes workshop on the subject. The goal is simple: can we as a group get insight and progress our understanding of the problem.
  • At 20:30 the clock will ring and that will be it of the conversation. Everyone will be invited to fill-in a wiki with a one or two line answer to two questions: what did you want to get out of the session, what did you get. The goal is to capture a snapshot of the state of mind at the event, and to be able to compare those with the result of our reflections that, I’m sure, will be extensively shared on blogs, mailing lists, twitter, etc.
  • Once this is all written down, everybody will be able to continue the discussion in the pub or wherever they see fit.

The location:

TEQUILA\ London Limited
82 Dean Street
London, UK
W1D 3HA


View Larger Map

We’re always looking for new locations and one or several sponsors. If you or your company is interested, pop me an email seb@serialseb.com.

Sunday, 26 October 2008

PDC tomorrow, WeHo tonight

Anyone wanting to come for dinner / drinks in WeHo (gaying PDC up a bit), or meet from tomorrow, phone number is +44 7789 00 8282 :)

Friday, 10 October 2008

Being in a printed program again

I just got confirmation that you voted for one of my sessions for DDD. I’m thrilled! It’s going to be an absolute pain to write the material needed to get what I want out of it, but the community and the people attending will choose the content, which I am very excited about.

And on the same level of excitement, the VBUG annual conference will be receiving yet another game of Bingo with me delivering a more polished version of the MVC talk I gave in London and Brighton.

The interesting bit about the VBUG conference is the printed agenda. I need to get a proper speaker picture, because the one I gave looks dreadful. Actually, the picture is alright, but I look dreadful :)

Seeing my face on that leaflet reminded me of the leaflets I received for various conferences I attended and spoke to, on peer-to-peer networks, back in 2000.

Interesting how life can seem like a rollercoaster sometimes, but is all but cyclic. You raise, you fall, you learn. I’ve been truly blessed in 2008 to meet fantastic people and go back in the speaking circuit, meeting countless amazing people and working on exciting things.

All this just to thank the people that listen to my rants when I give talks, the London .net User Group for getting me back in the speaking mood and giving everyone the opportunity to do it, the absolutely brilliant community we have in the UK, to the alt.net crowd, to the non alt.net crowd, and even to the Entity Frameworks proponents :)

Monday, 6 October 2008

While I’m in a ranting mood…

Seen in the wild.

        /// <summary>

        /// This is only for Unit Test Use

        /// </summary>

Code is not shown to protect the guilty, but it’s a method to set a property on an entity class.

Multiplying project files…

I was going to have yet another rant on separating everything in a ridiculous amount of project files, to ensure separation, and started venting to one of my colleague, at which point he mentioned Jeremy just posted on the issue: Separate Assemblies != Loose Coupling. Amen.

Thanks Jeremy, that saves me a post.

Sunday, 5 October 2008

HttpResponse.Flush forces Chunked transfer…

That one took me quite a while to understand. I’ve been building the integration tests for OpenRasta, a bunch of classes that configure a full web-server and run a real request-response scenario. This should hopefully help in limiting regressions, and may also be used in the future to ensure continuous compatibility with IIS6 on plain .net 2.0.

I’m leveraging the kernel http support present since Windows XP SP2 to create an http listener dynamically and initializing the asp.net runtime inside it, though the very useful HttpListener class.

After a lot of debugging, I discovered that my test was failing because of an encoding issue. Instead of returning the content that was sent to it by OpenRasta, an 18 bytes string, I ended up with much more than that, with line breaks in the middle. A quick look at the returned headers and it became very obvious that the system was sending me back chunked-encoding, a process by which the data is sent in blocks, each prefixed with the size, and suffixed with entity headers. The thing is, there is no support at all yet in OpenRasta for chunked encoding.

Here is the block of code causing all thesetroubles.

        public void ProcessRequest(HttpContext context)

        {

            IRastaContext rastaContext = RastaConfiguration.GetService<IRastaContext>();

            rastaContext.SetContext(context);

 

            _pipeline.Run(rastaContext);

 

            context.Response.Flush(); // <!-- see that one?

        }

As you can see, I was calling Flush on the HttpResponse object in the IHttpHandler that runs the OpenRasta pipeline. I quite understand the reasoning behind switching transparently to chunked encoding when requesting a data flush, you want to clear the data queue by sending it to the client, but you do not know yet how much data you will send later. At that point, using Content-Length is not possible, and chunked encoding is the only way to achieve the desired result.

Looking at the msdn documentation for HttpResponse.Flush you will notice there is no mention of that behavior. But not to worry, other developers thought it may come handy to document, and you will find the following on the mono documentation.

HttpResponse by default will buffer all of the output before it is sent to the client. To control the delivery of the data developers can use this method (or alternatively set the HttpResponse.Buffer property to false).

If chunked transfers are enabled for this response, this will try to use the chunked transfer.

Elementary, my dear Watson.

Once upon a time, code I wrote…

  After installing Windows Live Photo Gallery Beta, I noticed that it automatically indexed files shared on my big tera-server. And below is a nugget from code I’ve lost a long time ago, back when I was helping write a failed emulator for Dark Age of Camelot. A C# OpenGL reader that could render models of the game.

CamelotSharp Nif Viewer

Saturday, 4 October 2008

Track me down!

Added to the site, the calendar of which events I’m attending. That way, anyone wanting to give me a million pound, or punch me in the face, and everything in-between, will know where to find me :)

Thursday, 2 October 2008

OpenRasta status update

This entry may be outdated. For the latest updates on openrasta, see www.openrasta.com.

A couple of people have access to the code and have been kind enough to give reviews. I’m always open to more people helping out in the very early design phase before I go all public with the framework I’ve been nagging everybody about for months and months, so pop me an email to seb@serialseb.com and I’ll give you access. OpenRasta will be under an MIT license and I’ll publish it all to the world. I need to ensure what needs refactoring before release is refactored and that it is a fully functional beta first.

So here is what can be done with OpenRasta now and what I’m currently working on. See it as both an announcement and my task-list to the runner-up to the official release. You can refer back to the previous version of OpenRasta I already introduced. For various reasons the original Rasta never made it to open-source and its code has now died, and as far as I know no one will maintain it. OpenRasta is a fresh take on it, but keeps the same configuration API and the same concepts in a fresh new format with fresh new codes (and fresh juicy unit tests).

So by now you know there are essential components in OpenRasta: URIs, Resources, Handlers, Codecs and the pipeline.

The framework

  • OpenRasta.dll contains the bulk of the implementation, and compiles successfully on the .net framework 2.0 and on Silverlight. Great for embedding OpenRasta in your traditional asp.net application and start migrating your code over. And why not provide a REST-friendly server from the .net Compact Framework? (starting to sound like a marketing drone there)
  • The silverlight support will eventually provide for duplex http so you can architect your RAI test-first and REST-friendly, reduce coupling, and enjoy your life more. IN PROGRESS.
  • Most of the features are implemented straight into OpenRasta, such as dealing with form content-types browser send you. That means no reliance on some of the asp.net limitations on file uploads.
  • OpenRasta.Server.dll is your asp.net integration point, with support for traditional IIS6 and Integrated IIS7 modes.
  • Did I mention OpenRasta runs on asp.net 2.0? Alongside your webforms?

The pipeline

  • The pipeline is a series of pipeline contributors. They all act upon a small area of functionality, change a couple of things and give control back. The good news is that you have full power to change any of the existing contributors, add your own, etc. The default pipeline has 17 components which support the execution of the whole system.
  • Each contributor registers when it wants to be executed, and it is always relative to another contributor. The pipeline, once initialized, builds a chain of calls and execute them sequentially. And there is a small type that will let you register for multiple steps in the pipeline and be called only when you are ready.
  • You can add and remove contributors at configuration time to replace or modify existing behavior. IN PROGRESS.

URIs and URI decorators

  • You define your resource Uris using the common http template syntax. It’s a clean-room implementation of the .net 3.0 UriTemplate and UriTemplateTable classes to run on 2.0. It will support both the 3.5 modifications and some extra features sometime in the future. May donate the code to mono if their implementation hasn’t progressed much.
  • Several Uris can identify the same resource, but in different languages. /home and /accueil will automatically set-up everything you need to override the default client’s language.
  • Of course, in any real-world scenarios, your URI doesn’t only describe an abstract resource that is easy to name. There are plenty of little tidbits of things you may want to include, such as the document type (.html anyone?), the language (/en/mydocument), maybe even the version (/en/mydocument(v1)). Most frameworks would have you declare all the combinations of those urls to design your resources. In OpenRasta you simply define a Uri decorator that will change the way the request is processed and clean-up the Uri before passing it on for processing. Out of the box, you’ll have document types, language, http method overrides (for those nasty PUT you want to do from your html forms) and view selection (for when one resource have several views applied to it).

Handlers

  • Once your Uri is matched to a resource, a handler is going to be selected and one of its methods called.
  • You don’t have to inherit from anything, or implement any interface.
  • You name your method using the name of the http method the client sent you. Want to send data? Implement a Get(). Want to append data? Implement a Post().
  • Sometimes you want more meaningful names. Just declare a small attribute to map the correct http method to the correct clr method.
  • Parameters are declared naturally, without multitudes of hacks, strings or attributes. The codec will be responsible for mapping whatever the client sent to whatever CLR types you are expecting. The framework will map your url templates to your parameters too.
  • Want optional parameters? Add an [Optional] attribute. Want a default value? Enter [DefaultValue]. And any CLR language implementing default values will support those too. I think that includes the VB guys :)
  • You can even have parameters that map to http headers.
  • Your handler method returns what makes sense to you. Don’t want to return any resource to your client? Discover the joy of the void return type! Always return a type? Just declare that type as the return type. And when you want to return RESTful information, simply return an OperationResult.
  • Your handler only select objects, not views or other things that doesn’t concern it. You return an object and a Codec will render it to the client.
  • And of course, you can add plenty of filters that execute before and after the method calls. A logging filter (IN PROGRESS) and a Principal security filter come out of the box, so you can get people to authenticate.

Codecs

  • A resource can be read and written from and to an http connection using Codecs. Some are provided in Rasta (json, xml, html, html form data), and writing one is brain-dead easy.
  • You can let the client decide which content-type it will receive by using well-established content-type negotiation semantics. It’s all done for you. And it even serves application/xhtml+xml to firefox without you having to touch a line of code.
  • When sending data from html forms, <input name=”customerName” value=”value” /> will call Post(string customerName);
  • Ok, everybody does that. When using <input name=”Customer.Name” value=”value” /> this will call Post(Customer customer) with the correct property done for you.
  • Ok, most MVC frameworks do that. When using <input name=”AddressOf(Customer).PostCode” value=”value” /> this will call Post(AddressOf<Customer> customer) with the postcode property set.
  • Ok, some MVC frameworks do that. When using immutable types, <input name=”Customer.DateOfBirth.Date” value=”12” /> the method Post(Customer c) will be called with the date set on a new date of birth. And you can set property chains as far as you want, and write to read-only properties. Convinced yet?
  • Ok, maybe some MVC frameworks may be able to do that. When using <input name=”Customer.DateOfBirth.Date” value=”12” /> the method Post(ChangeSet<Customer> c); will be called, and you can update your objects with whatever changes are being sent through.
  • Oh, and the same stuff can work with other content-types too. Implementing http patch has never been that easy.
  • Codecs also can use different views. Want to have one page to view and one page to edit your customers? Just declare a view using TranscodedBy<WebFormsCodec>(new { index = “~/CustomerView.aspx”, edit = “~/CustomerEdit.aspx” });
  • The return data depends on what the client requested. And that includes error pages, 404s, 401s, etc. IN PROGRESS.
  • You can stream data from the client rather than have asp.net download everything for you, for any multipart type. IN PROGRESS.

And the rest

  • Http Digest Authentication out of the box. IMPLEMENTED. With time-sliding security window and logoff functionality! IN PROGRESS
  • An error mechanism for your webforms to manage validation errors while still returning RESTful status codes, that still renders correctly when dealing with json, xml, etc. IN PROGRESS.
  • Everything, and I do mean everything, goes through an IoC container. If you don’t use one, OpenRasta use its internal one. If you use one, OpenRasta automatically registers all its dependencies in it. Comes with a Windsor Castle implementation.
  • All the configuration can be done without a single attribute anywhere, either by leveraging conventions or using the fluent configuration API.
  • Automatic cache management based on your resources (including Last-Modified and ETags). IN PROGRESS.

What to look forward to in beta 2

  • VB9 XML literals, NHAML and NVelocity view engines. NOT STARTED.
  • Full AtomPub support. NOT STARTED.
  • StructureMap support. NOT STARTED.
  • An additional configuration mode for the attribute junkies that will scan your assemblies and configure OpenRasta automatically. NOT STARTED.
  • Support for asynchronous operations (need to define the exact use-cases for this first). NOT STARTED.
  • An optional reverse cache for your handlers. NOT STARTED.

Way past my bed-time. That should give you a good idea of where I am at with OpenRasta and what kind of things it will enable you to do. Email me to peek at the code before anyone else!

Wednesday, 24 September 2008

Porting the Suteki Shop to OpenRasta

Mike Hadlow has just announced the commercial release of Jump the Gun, an online shop based on his Suteki Shop cms. Mike is an extremely bright guy that I’ve met quite a few times at various conferences, and he’s built it all on asp.net MVC.

Because OpenRasta doesn’t have much of a documentation at the moment, and because it would be nice to have a comparison between the two systems, I’ve offered Mike to start porting Suteki to OpenRasta sometime over the weekend. The good news is that it will live side-by-side with the existing Suteki Shop. I’m leaning towards calling it Sutekool :) . And then we’ll be able to compare the performance and flexibility of both frameworks. I’ll porbably learn a lot in the process,

Thanks Mike for the great work and for the opportunity of having the first side-by-side comparison of asp.net MVC and OpenRasta! Now if we had someone porting it to monorail, we could have a real overview of what the .net MVC world has to offer.

Sunday, 21 September 2008

Building a new server at RapidSwitch

I’ve been on the lookout for a windows server 2008 server for quite a while, and have now selected one. The thing that surprised me in my search has been the complete lack of professionalism exhibited by some hosts on their websites.

  • If you don’t tell me where your datacenters are, you probably don’t have datacenters and are just reselling.
  • If you don’t provide your company details on every single of your pages (hint: uk limited companies *must* provide their company number, vat registration number, registered office and full name, including “limited” or “ltd”. copyright midnight software is *not* enough), I don’t know who you are and for all I know you don’t actually have a company.
  • If you don’t provide an SLA, I do not trust you will apply it.

So with all those, 90% of the hosts I found selling Server 2008 hosting were out. RapidSwitch seems to have had good reviews, so I just created an account, and have had two tickets in the last few hours telling me my server was now racked and the OS is installing, from a gent called Kyle. Although I am pretty sure Kyle is a bot, it’s still very nice to know what is going on.

I’m going to keep this post open to give my feedback on their service as I use them. They are confident enough in their service to not tie you to a 12-month contract. Depending on how things go in the next couple of weeks, they'll probably sign me for 12 months or loose me. Kudos for leaving the customer in control.

Roll Server 2008!

Wednesday, 17 September 2008

The content of the presentation at VBUG Brighton tonight

As last time I got completely overloaded with work and forgot to post the content of the demo, this time I’m doing it the other way around. Code is available on my public mug (get it? caffeine-it, mug, public? Funny? No? Oh well). Point your favourite svn tool to

http://svn.caffeine-it.com/mug/bingo

From the command line

C:\> svn co http://svn.caffeine-it.com/mug/bingo bingo

Will add the updates I’ll tweak till then and the powerpoint slide sometimes tomorrow at the same place.

See you all tonight in Brighton, or over the next two days at Mix!

Monday, 15 September 2008

Alt.net London Beers #3 – 14th October 2008

Following on the success of the previous events,I am happy to announce the next alt.net London Beers event.

The format is going to be different from the previous event, as it will be a sort of mini openconf-style session. Here are the rules

  • Arrivals, discussion and socializing between 18:00 and 19:00, with one necessity: find the topic of the day and find the questions that we will try to answer. We may provide post-its, white boards or body painting equipment to help people focus.
  • At 19:00 the big clock will start ticking for a time-boxed 60 minutes workshop on the subject. The goal is simple: can we as a group get insight and progress our understanding of the problem. The specifics of the format will probably change when we get there, but I’d like us to focus on up to 4 questions.
  • At 20:00 the clock will ring and that will be it of the conversation. Everyone will be invited to fill-in a wiki with a one or two line answer for each of those questions. The goal is to capture a snapshot of the state of mind at the event, and to be able to compare those with the result of our reflections that, I’m sure, will be extensively shared on blogs, mailing lists, twitter, etc.
  • One this is all written down, everybody will be able to continue the discussion in the pub or wherever they see fit.

Please leave comments here and everywhere you feel relevant, or hit me on twitter, to suggest topic ideas or to provide criticism of the whole concept. Without feedback one cannot separate success from failure, and recognizing those are necessary to progress and improve.

If your company wants to invest a bit of money behind the bar for food and drinks, don’t hesitate to let me know.

And of course, the location is the same as the previous event, and I have been told the kitchen staff will stay a bit longer for us this time.

The Blue Posts
18, Kingly Street
London W1B 5PX


View Larger Map

Wednesday, 10 September 2008

Developing .net code since 2000?

Over the years, I’ve had a couple of people in interviews being surprised at my assertion that I started development on .net in 2000. As I go through yet another cleanup of my email archives (I’m an archival freak) that are reaching around 15GB of data, I found this email.

From: DeveloperStoreAdministrator@developerstore.com [mailto:DeveloperStoreAdministrator@developerstore.com]
Sent: 14 November 2000 03:09
To: …
Subject: Thank you for your recent Microsoft purchase

Thank you for visiting our store, Sebastien P. Lambla.

Your order has been entered into our ordering system, and will be delivered to you soon. At that time, the charge of $15.99 will be charged to your credit card.

This is an unmonitored email alias. Please do not reply directly to this email alias as the messages will not be answered. If you have questions or would like to check on the status of your order, please email us at mstoolbox@interactservices.com.

Refer to order number MSDSTB129915 when contacting us.

Thank You,

Microsoft Developer Tools

This was the first beta of visual studio. 8 years of C#, how time flies!

Friday, 5 September 2008

Kaizenconf is open

For those that were waiting for the kaizenconf registration to be open, it now is. But it’s not really a registration, it’s a request for a registration. So if I understand that correctly, I still don’t know if I’ll be there or not.

If you come from good old Great Britain, I’d recommend booking anyway. With the sterling going down, cancellation fees will probably be cheaper than waiting and see your money be half what it was.

Tuesday, 2 September 2008

Work availability

If you’re looking for help with your project and need a consultant, I’m available for the first two weeks of October. And if you’re looking for a developer / lead developer, I’ll be available from mid-November!

So don’t hesitate to contact me at seb@serialseb.com and cut some of those agencies cost!

Monday, 1 September 2008

Vote now for DDD!

Quite many very interesting session proposed for the next DDD.

Go and vote now for your favorite sessions (and if you don’t like any, you can always vote for mine!)

Sunday, 31 August 2008

The case of global.asax not being executed in IIS7

Global.asax is used in both asp.net MVC and OpenRasta for implementing your configuration. In Rasta 1.x, the handling of request was done through a catchall http handler. This has a couple of adverse effects for the application: all requests went through rasta first, and got delegated to IIS when there was no match. This can cause a range of performance issues, from lack of caching to constant file access when the delegation ends up using DefaultHandler rather than StaticHandler, as in those instances the files will systematically be streamed from the disk.

Another struggle I had with this system was the various issues encountered when trying to host the system on IIS7, something I started doing a while ago. I remembered reading from a blog that asp.net MVC was using both a handler and an http module, and investigated using a similar configuration for OpenRasta. As I do not want to be influenced by other people’s coding abilities, I have stayed away from reading the asp.net MVC source-code and tried to come up with my own scheme.

One particular issue comes from the different framework versions supported by OpenRasta: I run on plain old asp.net 2, and this means that all the new APIs that let you change a handler on the fly during a request will not work, as they are added by .net 3.5 sp1. Instead I came up with a clever trick: Just before the handler is resolved, I rewrite the url to a fake url, properly called ignoreme.rastahook. The extension rastahook is always associated with a compatibility handler that then gets called by the asp.net infrastructure, at which point I rewrite the url to what it was before the change, and execute my own http handler from there. The solution is not entirely perfect yet, as there is no support for asynchronous handlers, but as with every other part of OpenRasta I’ll be able to change that without impacting any handler already in existence.

As soon as I implemented those changes, everything went much more smoothly on IIS6 and cassini (the visual studio web server), but broke completely on IIS7 integrated mode on my local box. After much debugging, I realized that my global.asax wasn’t being called. When I added back an http handler to my web.config, the global.asax code was called again.

The reason is a bit confusing to understand at first. In IIS7 integrated mode, http modules are treated as being part of IIS, be it that they are managed or not. This means that a module may or may not rely on asp.net. Your module will be executed but your web app won’t necessarily have been compiled. Handlers on the other hand, when they are managed, trigger the asp.net application, and your code will get executed.

So to conclude this issue that i’ve been chasing for two months now: if you don’t have a managed http handler for your request, your http module will be called but the asp.net part of your site will not have been compiled and / or won’t be called, including global.asax. The solution is to ensure you have a managed handler in place, or force a compilation of the root site using BuildManager.GetReferencedAssemblies.

P.S.: this is all based on empirical evidence, so I may be absolutely wrong, and would be glad for anyone to come up with an alternative explanation.

Wednesday, 27 August 2008

Microsoft, for Christmas I’d like…

  • A Visual Studio SP1 ++ that fixes all the bugs you’ve recently introduced
  • A web designer that passes the ACID2 test
  • A browser that implements the *freakin DOM*

I promise I won’t be a good boy, but then again, when I have to work with some of the tools you sell, I know who is to blame.

/me goes back to his office and wreck a few toys

Monday, 25 August 2008

The rubber duck in agile teams

Saw this from twitter and it made me smile: http://www.ademiller.com/blogs/tech/2008/08/scrum-bestiary-the-rubber-duck/

Have you had a rubber duck to deal with?

Saturday, 23 August 2008

Proposing a syntax to attach behaviors to html elements

ScriptSharp, like asp.net AJAX, has the notion of behaviors, javascript code that can attach itself to DOM elements and change their, well, behavior.

As part of my spike on ScriptSharp (and I’ll have to admit having spent way too much time on it to still be called a spike), I’ve built a simple container that automatically resolves and binds behaviors to DOM elements, to reduce to a maximum the amount of inline code required within my generated pages.

The one thing I went round and round about was how to declare in markup that binding. Here’s a few solutions I tried or seen proposed through various tools.

<div style="behavior: url('myBehavior.htc')" />

This is something introduced in ie4, but it breaks the CSS standard *and* htc are only recognized by Internet Explorer. No good to me.

The next contender is…

<input type="text" id="searchText" />
<input type="button" id="searchButton" />

<script type="text/xml-script">
  <page xmlns="http://schemas.microsoft.com/xml-script/2005">
    <references>
      <add src="ScriptLibrary/Atlas/AtlasUI.js" />
      <add src="ScriptLibrary/Atlas/AtlasControls.js" />
    </references>
    <components>
        <textbox id="searchText" /> […]

…xml-script, and was originally presented early in the life of asp.net AJAX (back when it was called ATLAS). This is awfully verbose, and worse than that it won’t ever validate in non-xml languages (aha HTML 4.01 or XHTML5). The same is true of the proposed changes in asp.net AJAX Futures, which uses namespaces everywhere even though they’re not allowed in non xml renderings.

[Update: As Simon Pieters correctly points out in the comments, this syntax would indeed be compatible with HTML5 (the non-xml serialization one), because the definition of CDATA sections has been modified to include anything not including the closing tag. Hence what is after <script> can be anything that is not </script>. This redefined definition of a CDATA element is not something the XML specification agrees with however, which means that in all languages, aka XHTML 5.0, XHTML 1.1, XHTML 1.0 and HTML 4.01, you need to enclose the content of the script tag in a CDATA section, aka <![CDATA[ … ]]>. This makes HTML5 the only rendering with which xml-script would work. I may have misread some of those specs however, so if I have please comment and I’ll update and buy you a beer.]

In choosing how to map behaviors, I had several goals:

  • declare the behaviors contextually within an element,
  • being able to use the exact same notation for both HTML 4.01 (the SGML language), XHtml 1.0 and 1.1 (the XML language) and Html 5 (both the whatever it is format that is not sgml anymore *and* the xml language, as both exist)
  • being able to pass additional customizations and parameters specific to an instance
  • Not look too out of place.

I initially settled on an extension to the way content type definitions are expressed:

<div class="behavior/graphicscroll;horizontal=true;vertical=true;">test</div>

This says, ask the behavior family to add a graphicscroll behavior and pass it values for horizontal and vertical. All was good and I was happy with myself. For a whole five minutes.

Then you realize that while that syntax works like a charm, it is invalid in Xhtml 1.1, because the class attribute was redefined to be of type NMTOKENS, where the previous version had a type of CDATA. This is a serious breakage for content out there, and I wonder what the reason for this is.

The other issue I had with this is the need to declare the full syntax for each element I wanted to use, and I really wanted to leverage CSS selectors. One solution I would have wanted to use was to simply extend the CSS stylesheets with custom css attributes. This would have then looked like the following.

    <style type="text/css">

        div {

          -rasta: "behavior/graphicscroll;horizontal=true;vertical=true";

        }

    </style>

The syntax just felt very unnatural. And worse than that, the CSS validator doesn’t validate CSS with vendor expansions, even though they are defined as such in the specification.

After twiddling around endlessly, I’ve settled on defining a css-like language, behavior stylesheets, without some of the restrictions of the existing CSS. I now have this code:

    <style type="text/vnd.rasta.bss">

        div

        {

          behavior: graphicscroll {

              horizontal: true;

              vertical: true;

            }

        }

    </style>

The  selector syntax is simply the CSS one, which means you can combine and match them in the same way you would define your stylesheets. The properties however are dynamic, with the first level name always matching a family of components (implemented as a loader) with a value matching the component, and a sub-group letting you define properties on that component.

You’ll notice I mentioned my first goal was for this to be contextual within the element. Because you’re still using selectors, nothing prevents you from declaring a value in your class attribute and do your selection on that. The same of course goes for ids.

Time will tell if this is as compatible with current UAs as it could be, and I have the feeling it will be ignored when necessary, but it’s extensible, simple enough, doesn’t require the script engine, leverages an existing html element and still passes in all versions of html that support the style element.

Wednesday, 20 August 2008

When a provider ditch its own product…

I’m currently researching Server 2008 VPS products available, and stumbled upon bytehouse’s offering:

Why use a Windows operating system?

Windows Hosting is only really needed if you require ASP (Active Server Pages), Access Databases or VBScript.

Why use a Linux operating system?

If you just need to host HTML (Hypertext Markup Language) or PHP Web Pages, then Linux Hosting would be the better and cheaper choice for you. Linux has a proven track record of performance, stability and security within the Web Hosting industry.

Oh, god, I have Linux envy now, thanks!

Tuesday, 19 August 2008

Come and listen (or talk) about asp.net MVC in Brighton!

VBug apparently didn’t learn their lessons from the last presentations and asked me to come back to deliver my Bingo asp.net MVC talk in Brighton, the day before ReMix! You can have a look at the event, and frighteningly it is already fully booked!

You can expect a run-down of the MVC pattern, plenty of code (but less than last time), and of course Bingo.net in its third version. I may have some surprises in stock so be prepared for anything.

For anyone down in Brighton on that day, I’ll be staying there so expect a full attendance at the pub. The only true way to start any conference is with a hangover.

Saturday, 16 August 2008

Using getElementsBySelector in ScriptSharp

I’m on my way to my second spike for one of my clients on playing with ScriptSharp to extend Rasta with Ajax functionality, and really wanted to be able to select elements as I would in CSS, using selectors (something I got quite used to with jQuery).

ScriptSharp comes with various assemblies you can link to. The one called sscorlib is a .net mapping over a javascript library that extends document to have a getElementsBySelector method. But for some reason, ScriptSharp doesn’t map that method.

So how do you call random code in ScriptSharp without resorting to evil eval code? You create a function of course! Here’s the snippet.

        public static DOMElement[] GetElementsBySelector(string selector, DOMElement root)

        {

            return new Function("return document.getElementsBySelector(selector, arg);", "selector", "arg")

                .Call(Document.DocumentElement, selector, root) as DOMElement[];

        }

We define a function that calls the correct javascript code, declare the argument names we will pass it, and finally call it by passing our selector and the root.

In one word, sweet.

Monday, 11 August 2008

Received this morning

Dear Sebastien

We are currently searching for a JOB TITLE to work in  CITY, COUNTRY  for DURATION plus extensions. This is a fantastic contract opportunity for a large multi-national client.

The ideal candidate must have the following skills: SHORT JOB DESCRIPTION.

A nice way to start the morning! Where do I sign?

Thursday, 7 August 2008

“It doesn’t work”

Something seriously cracks me up. I hear day after day people telling me one technology or another, one tool or another, fails in matching their expectation, and explain the situation by it doesn’t work.

As soon as those words are muttered by someone in a team with low knowledge of the toolkit they are dealing with, you see developers running around to work around the symptom, replace the technology, or completely screw up an architecture or a design just to make it work.

Just the same, while TDD and fast feedback cycles have brought to the development community an antidote to the press F5, it works, I’m l33t, you still find a large number of rogue developers that still manage to write no test, go head down in development, produce unmaintainable code and still manage to lift it off because the UI is shiny and the managers don’t have a clue about the importance of quality and maintainability, as they don’t have the responsibility of their v2 budget.

Whenever faced with an intellectual challenge, you have two categories of people: those who step up, learn and understand a problem before finding a solution, and the it doesn’t work and Oh I press F5 I’m good! developers. My word of advice to the latter, if you are given guidance and mentoring and refuse to step up, you will eventually be out of work. Embrace change, challenge yourself and don’t discard mentoring when it’s given to you.

Monday, 4 August 2008

Updating Hyper-V to RTM

As is usually the case when you’re under pressure to push a new release of an app for a client, something goes horribly wrong.

What went wrong tonight is simple: my Server Core install was never updated to hyper-v RTM, but windows update did its job fine on one of the client VMs that also runs Server 2008. Suddenly, the whole server is down.

Second install on the core install and still failing. I wonder how I’m going to apologize profusely to my client tomorrow. Oh the joy.

[Update 03:22: License wasnt activated properly, trying yet another install…]

[Update 04:05: Need my bed. Trying an uninstall of the role, followed by an update with the .msu. If that works I’ll reinstall the Hyper-V role tomorrow]

[Update 04:13: Apparently uninstalling the role rebooted the machine which then updated itself on its won with the RTM version. Don’t know if I should cry or laugh. Reinstalling the role now (seeing as there’s one less boot as previously expected, I have a boot to spare)]

[Update 04:27: All back in order, machines are up. Lost 6 hours of my life, less than impressed.]

Thursday, 17 July 2008

The testing anti-pattern

I've now finished my previous gig and the guys are busy chasing some recurring issues with the application. Because of its complex architecture, those issues are equally complex to understand and debug.

Most of the code in this application happens around things we cannot put under unit-tests, because they all rely on heavy integration: syncrhonization of data between tiers, integration with external RFID hardware and 3G modems, sqlce and its multiple connections issue, and other equally difficult things to debug without running the system with said external entities. As a result, our code coverage is very low, and while we do have fakes for most of those external entities, we have to think hard and strong about the value provided by tests relying on fakes, or we'd end up testing a fake implementation. Not very useful to say the least.

That made me think of some testing anti-patterns I see recurring a lot on various project, and I thought I'd highlight them. That will let me reevaluate my position in a year time, and I also know that some of the people still invovled in some of my projects are reading this blog, so it will serve as a constructive criticism for their next projects.

  1. I'll paraphrase Chad Myers, code coverage is the new LOC/day. Code coverage doesn't ensure quality, and the percentage is just that, a number. It needs to be put into context of the project: some areas do not need unit tests because they don't provide value. If you chase 100% code coverage, you're on a wild goat chase and you should reevaluate your understanding of the value of code-coverage (beyond the marketing bullsh*t).
  2. It is more important to have a code-base with low cyclomatic complexity and loose coupling than it is to have thousands of text. Evaluating code quality is not only about testing scenarios, it is also about maintainability, understandability, extensibility, etc. Use NDepend to understand where you need to refactor or rework part of the systems.
  3. Finally, and more importantly, I see no value in spending time after your code is released to write unit tests for the sake of it. Because the code has already shipped, you should not do any refactorings to it (or you'd end up with changes that you'd need to re-deploy and re-test, in which case you'll have to ship again, it all becomes a virtuous circle). So you end-up putting code under tests without bringing much value at all (again, except for increasing code coverage, see 1). Unit testing is a tool *during development* that helps you shape your objects and functionality and refactor your code until you get a satisfying result. Writing code aftewards doesn't serve much purpose.

There you are. With the advances like BDD, the focus on unit tests and code coverage by management should hopefully die a much to be celebrated death, as the focus shifts to the real issue: shared knowledge and process, arriving at a common definition of the what and why, and let developers handle the how.

Monday, 14 July 2008

asp.net MVC presentation - the results are in!

The nice people at VBUG just sent me the result of the evaluation forms, and I am very pleased with the result, as a vast majority seems to have enjoyed the talk.

A couple of points were raised by an apparently unimpressed attendee, and as those forms are anonymous I thought I would take the time to provide some feedback here.

The font size was too small to read from the back

The font had been set to quite a big font size, added with a very large DPI. I'm afraid the length of the room compared to the size of the projector made it very difficult to accommodate everyone. If anyone has suggestions to reach to more people while still managing to put 30 characters in the wideness of the screen, I'd be very interested. Any experience from using different fonts? Maybe high contrast with dark background? I'd be quite interested in learning a few new tricks to make it work better.

That said, there were spaces on the front row, and I did ask everyone to confirm my font size was alright with them. I should have indicated this was a strong hint for people to reshuffle based on their sight :)

Discover powerpoint, where are the diagrams?

This one is quite accurate, I do not have powerpoint slides as a rule: unless I have something very compelling to show in a diagram I don't see a point in showing one. I had a slide introduction for the previous version of the asp.net MVC talk I did at DNUG, but I find them distracting and get the audience passive. Especially as for MVC I would end up showing either a product roadmap (I don't think it's my job) or a diagram of MVC, which in itself seems of poor value.

While pictures do speak a thousand words, I think code does speak more efficiently to most developers. So I'd be interested in knowing what people think. Do you prefer a screencast approach of demoing step by step what is going on, or have an introduction to the concept of MVC with nice diagrams, arrows, blocks and what not? I tried both and felt the tutorial approach worked better, but from the presenter side of things it's always difficult to make those judgement calls.

Lots of mistakes in the demo

Yeap, some glitches here and there happened. Some, like the exception thrown when a view is not found, were on purpose to demo a feature, some others were due to my poor typing. On an interesting note, when presenting just like when working, apologizing for something no one has complained about usually seems to trigger complains that otherwise would have been silent. From now on I think I'll stop apologizing for my typing errors and rely on my audience to correct me (which I really like because it means they're reading and understanding the code as I type it. Spot on!)

The examples were poor

Oh, I did like my Bingo game. I'm just sick and tired of the same stuff everyone does with Northwind / NotNorthwind / Southwind. Storefront is there to provide you with an end-to-end real demo and does it so well. I'll stick to my guns on that one, boring things are one of the reasons I don't work in the city anymore :)

Conclusion

What worries me slightly more is the discrepancy between speaker rates and overall session rates, which leads me to think the presentation itself was less than excellent. I think it really comes down to two issues: expectations should be managed to reflect the code-intensive nature of the presentation, and the content is probably slightly too complex, with too many points being presented, including containers, dependency injection, inversion of control, testability, c#, javascript, html, etc.

On the bright side, only one of you has not been satisfied by the content or the presenter, with 67% rating the session as Very Good or Excellent, and 72% rating me as Very Good or Excellent (see my head growing out of proportion!), so a massive thanks to all of you for making this the presentation I've enjoyed the most so far.

P.S. I seem to remember two people chatting and laughing away during parts of the presentation at the back of the room. A good thing I had my back to the audience the whole time or I would have given the eye. Presenters do put a lot of effort in preparing those sessions, if the content or the presenter doesn't interest you, I apologize for failing to make the subject interesting to you, but I'd rather you stayed quiet or left. The law of two feet should apply, even during a presentation.

Sunday, 13 July 2008

asp.net MVC presentation

What an absolutely crazy week! I've been working flat-out all week and still have a mountain of TODO: all over my screen.

Thanks to everyone that came to the asp.net MVC presentation. It's a presentation I really enjoy and look forward to give it again to other user groups. I have the feeling that I'll finally be happy with the content the third time I deliver it. And suffice it to say that I'm working very hard to actually make the bingo.net game playable.

Apologies are in order as I'm late delivering the code (will get around to do it, probably around Tuesday) and the slides (slide.txt) and answering some of your emails. Please bare with me while I work through the backlog.

Friday, 11 July 2008

Alt.net UK Conference

Register now! http://altdotnet.org/events/5

Friday, 27 June 2008

Rewriting history?

I very often update and modify my posts until I feel they carry the meaning I intended. With English being a foreign language to me, there are many instances where my posts end-up being interpreted the wrong way or don't represent my message really well.

I'll be migrating this blog over to my own servers quite soon, and I've been wondering if all those edits should be done the way they are now, without history, or if I should adopt a more bliki approach and leave anyone to see the variations and edits I do on posts.

Does historic truth matters to you? Do you want to see my edits? Or do you only care about the end result?

Thursday, 26 June 2008

Linq-to-Entities and me: Does what it says on the tin

For those not reading on the web, the subtitle of my blog is the result of a lovely name-calling session by an anon on this site. Proof that it works, another person has now proclaimed that I am indeed what it says on the tin.

The same blog argues that alt.net has turned into the nHibernate mafia, and that we all have a vested interest in nHibernate and are trying to defend our territory. One of the tenets of alt.net is to be pragmatic about the tools we use, and I've delivered projects with nHibernate, activerecord and linq2sql, and will use whichever tool works for the job. I don't have dogma for one tool over the other when they deliver what I need.

And to be absolutely clear, some of my clients will eventually, for better or worse, use the Entity Framework, and I'll have to use that tooling, be it that it fits or not in my personal practices.

On a more positive note, there's been some very interesting comments to my entry. I thought I'd highlight my understanding of the discussion so far. If I've misunderstood those arguments, feel free to respond in the comments or insult me by messenger, I'm always available.

Proponents of L2E argue that this new framework has been developed to provide the same tooling for modelling your entities across your different needs: reporting, data access, etc. As such, it should be seen as a tool that lets you re-use knowledge across models. Furthermore, it should not be understood as a tool to create global entities shared across applications.

This could very well be the case, and indeed bring benefits for people using Reporting Services and other data-centric tools that are apparently a pain. But if we see L2E as a tool, then for reasons that have been highlighted previously, they won't fit my toolbox because they do not support the development model I have adopted.

That said, other people still look affectionately at the idea of a global model for your application / applications. My projects tell me those models fail and my experience shows me that a DTO approach to boundary crossing is more effective.

I have expressed concerns at the fact that L2E has been at the core of  other frameworks (like ado.net data services), because it brings the fundamental idea that the same model could be exposed as a REST service, sent over a WCF service to another windows client, and put in a can of Coke to the moon. Doing each of those things represents a completely different set of challenges, each with a different model. Maybe if LinqToEntities could fit in my toolbox, I could reuse it to model every single of those different entities I need to have for each boundary in my application. But I don't believe the power of the designer is going to solve any of my issues, and will probably introduce more.

I stay unconvinced but I'm overall happy to realize that many proponents of linq2entities have an understanding of the issues with a unique entity data model and with sharing of models.

The Entity Framework - don't get fooled in what is wrong about it

[edit: modified text slightly to more accurately reflect my point and remove references to Julia being fooled, which apparently has been interpreted as Julia being a fool. Apologies.]

I'm off to bed, but thought I'd end up the day on a note. There are many flaws in the programming model adopted by the Entity Framework and they've been documented enough. But this is not what makes me cringe the most.

The Entity Framework team responds to the vote of no confidence by proposing fixes to programming issues in v2, talks of openness in the design of the next version, and have got people thinking that we object with the programming model. They even suggest that it's alright for Microsoft to deliver a tool that violates best practices established by people that built real systems.

[edit: I don't believe this is done with malicious intent, but I do believe there is a fundamental misunderstanding of the arguments that have been put forward, both by the EF team and their supporters and by the signatories of the letter]

The idea that a conceptual model can represent everything for everyone through designer-generated angle-bracket files is the issue. The fundamental of selling your product as one model crossing tiers and being standardized to all is a sweet dream that will end up biting anyone getting in contact with such a system. When Microsoft says transparently, I hear painfully.

The EF team explain how to fix the syntactic sugar without addressing the elephant flaw in the model is equivalent to telling people disagreeing with the one conceptual model to rule them all that they're just nitpicking over syntax. It's quite amazing that the people voicing their anxiety at the ripple-effect of introducing EF are being discarded as a small minority of weirdos that shouldn't complain because their way is not being adopted until v2. The reality is that a majority of those people are leading the industry in interesting directions discovered through experience and reflection, and their ripple effect is wide. . There is no wonder why TDD and BDD (and DDD and DDDD and all those acronyms I hate so much because of their opacity) all started with a couple of people, not with a couple of tools and designers.

Microsoft has a responsibility, because of its size, to not screw the people that are trying to promote a better craft. When those people react to a technology like they have with the Entity Framework, they should be listened to, because by delivering yet another monster (sharepoint anyone?), Microsoft may generate business but in the process degrade the overall quality of their development ecosphere. In the long term that may just end-up killing them, as the market will decide on better, simpler and more efficient tools. It's the law of two feets. But this movement takes years and impacts everyone that has to maintain a system.

As for Entities, they exist as several transpositions adapted to not only the programming model but also the context in which you use them. My notion of a user and your notion of a user only share a couple of trivial rules. If you ever, ever try to come up with one model that covers everything, you'll be too flexible or not enough, and your project, and the projects depending on your project, will fail. Full stop. It's been tried and tested. It is wrong. Like putting mustard in your corn flakes.

[updated for clarity and minor adjustments]