What have we been up to? And some future plans
We have been head down for a while, doing some really cool things with RavenDB (sharding, read striping, query intersection, indexing reliability and more). But that meant that for a while,things that are not about writing code for RavenDB has been more or less on auto-pilot.
So here are some things that we are planning. We will increase the pace of RavenDB courses and conference presentation. You can track it all in the RavenDB events page.
Conferences
- Progressive NoSQL – RavenDB – 2nd generation document database.– May 9 London – I’ll be talking about RavenDB to a crowd of NoSQL enthusiastic, should be interesting, especially the compare & contrast part.
- Sharding and Scaling with RavenDB – May 15, London – Prepare for some truly awesome demos.
- DevSum 20120 - RavenDB and the Amazing Features – May 23 , Stockholm, I am going to try and go through some of the more cool features of RavenDB, stuff that is going to make you go gaga wanting to use it.
- NDC 2012 – RavenDB Data Modeling – June 7, Oslo. Itamar is going to go over how to model data in RavenDB. This is one of the greatest challenges people moving over to RavenDB from RDBMS are facing, and Itamar is going to cover common scenarios and walkthrough about how to approach the problem.
- Ordev 2012 - Sharding and Scaling with RavenDB – Nov 5, Malmo.
RavenDB Courses
- 2 Days RavenDB Workshop – Oren Eini – May 14, London.
- 2 Days RavenDB Workshop – Oren Eini – May 21, Stockholm.
- 2 Days RavenDB Workshop – Itamar Syn-Hershko – June 4, Oslo.
- 2 Days RavenDB Workshop – Oren Eini – June 28, Malmo.
- 2 Days RavenDB Workshop – Itamar Syn-Hershko – Aug 21, New York.
- 2 Days RavenDB Workshop – Itamar Syn-Hershko – Sep 12, London.
NHibernate Courses
- 3 Days NHibernate 3.x Workshop – Oren Eini, May 16, London.
Not finalized yet
- August 2012.
- User groups talks in Philadelphia & Washington DC by Itamar Syn-Hershko.
- One day boot camp for moving from being familiar with RavenDB to being a master in Chicago.
- September 2012.
- RavenDB Course in Austin, Texas.
Consulting Opportunities
We are also available for on site consulting in the following locations and times. Please contact us directly if you would like to arrange for one of RavenDB core team to show up at your door step. Or if you want me to do architecture or NHibernate consulting.
- Oren Eini – Malmo, June 26 – 27.
- Oren Eini – Berlin, July 2 – 4.
- Itamar Syn-Hershko – New York, Aug 23.
- Itamar Syn-Hershko – Chicago, Aug 30 or Sep 3.
- Itamar Syn-Hershko – Austin, Sep 3.
- Itamar Syn-Hershko – Toronto, Sep 9 – 10.
- Itamar Syn-Hershko – London, Sep 11.
How to become a speaker?
I get asked that quite frequently. More to the point, how to become an international speaker?
I was recently at a gathering where no less than three different people asked me this question, so I thought that it might be a good post.
Note: this post isn’t meant for someone who isn’t already speaking. And if you are speaking but are bad at it, this isn’t for you. The underlying assumption here is that you can speak and are reasonably good at it.
Note II: For this post, speaking is used to refer to presenting some technical content in front of an audience.
Why would you want to be a speaker anyway?
I heard that it is actually possible to make a living as a speaker. I haven’t found it to be the case, but then again, while I speak frequently, I don’t speak that frequently.
There are several reasons to want to be a speaker:
- reputation (and in the end, good reputation means you get to raise your rates, get more work, etc).
- contacts (speaking put you in front of dozens or hundreds of people, and afterward you get to talk with the people who are most interested in what you talked about)
- advertising for your product (all those “lap around Visual Studio 2010” are actually an hour long ad that you paid to see :-) ).
I’ll focus on the first two, reputation & contacts gives you a much wider pool of potential work that you can choose from, increase the money you can make, etc.
So how do I do that, damn it?
Honestly, I have no idea. The first time that I presented at a technical conference, it was due to a mixup in communication. Apparently when in the US “it would have been delightful” means “we regret to inform”, but in Israel we read that as “great, let us do it”, and put the guy on the spot, so he had to scramble and do something.
Okay, I lied, I do have some idea about how to do this.
Again, I am assuming you are a reasonably good speaker (for myself, I know that my accent is a big problem when speaking English), but there are a lot of reasonably good speakers out there.
So, what is the answer? Make yourself different.
Pick a topic that is near & dear to your heart (or to your purse, which also works) and prepare a few talks on it. Write about it in a blog, comment on other people blogs about the topic. Your goal should be that when people think about topic X, your name would be on that list. Forums like Stack Overflow can help, writing articles (whatever it is for pay or in places like CodeProject). Join a mailing list and be active there (and helpful). Don’t focus on regionally associated forums / mailing list, though. The goal is international acknowledgement.
This will take at least a year, probably, for people to start recognizing your name (it took over 2 years for me). If it is possible, produce a set of tools that relate to your topic. Publish them for free, and write it off as an investment in your future.
For myself, NHibernate Query Analyzer would a huge boost in terms of getting recognized. And Rhino Mocks was probably what clinched the deal. I honestly have no idea how much time & effort I put into Rhino Mocks, but Ohloh estimate that project at $ 12,502,089(!). While I disagree about that number, I did put a lot of effort into it, but it paid itself off several times over.
If you don’t have a blog, get one. Don’t get one at a community site, either. Community sites like blogs.microsoft.co.il are good to get your stuff read, but they have a big weakness in terms of branding yourself. You don’t want to get lost in a crowd, you want people to notice who you are. And most people are going to read your posts in a feed reader, and they are going to notice that the community feed is interesting, not that you are interesting.
Post regularly. I try to have a daily post, but that would probably not be possible for you, try to post at least once a week, and try to time it so it is always on the same date & time. Monday’s midnight usually works.
Okay, I did all of that, what now?
Another note, this is something that you may want to do in parallel to the other efforts.
Unless you become very well known, you won’t be approached, you’ll have to submit session suggestions. Keep an eye on the conferences that interest you, and wait until they have a call for sessions. Submit your stuff. Don’t get offended if they reject you.
If you live in a place that host international conferences (which usually rule Israel out), a good bet is to try to get accepted as a speaker there. You would be considerably cheaper than bringing someone from out of town/country. And that also play a role. Usually, if you managed to get into a conference once, they’ll be much more likely to have you again. They have your speaker eval, and unless you truly sucked (like going on stage and starting to speak in Hebrew at Denmark), and that gives them more confidence in bringing you a second time.
And that is about it for now.
Using Active Record to write less code
The presentations from Oredev are now available, and among them is my talk about Active Record.
You can watch it here, the blurb is:
What would you say if I told you that you can stop writing data access code in .Net? Aren't you tired of writing the same thing over and over again, opening connection, querying the database, figuring out what to return, getting back untype data that you need to start putting on the form? Do you really see some value in writing yet another UPDATE statement?The Active Record framework allows you to fully utilize the power of the database, but without the back breaking work that it used to take. Active Record uses .Net objects to relieve you from the repeating task of persistence. Those objects are schema aware and can persist and load themselves without you needing to write a single line of SQL. Building business application using Active Record is a pleasure, the database stuff just happens, and you are free to implement the business functionality.
To be frank, I consider this to be one of the best presentations that I gave. Everything just ticked.
Presentation Styles
It is sometimes hard to believe, but I have been giving talks all over the world for quite a while now. It is said that practice makes perfect, and I think that practice has certainly made me a much better presenter.
The story about how I learned to handle public speaking is entertaining, and I get to tell it quite a lot. But this post is not about that old story, it is about a new story. I have been doing a lot of presentations for a long while now, and I can track how I improved as a speaker since the beginning.
Detailed Bullet Points is probably by far the most common, and usually considered as flawed. This type of presentation is also referred to as Power Point Poetry. You can safely assume that I am not overly fond of this style.
Recently, I have leant much more toward the presentation zen style of slides. For that matter, I consider the slides a far third in the importance in giving a session. The first being the ability to actually talk and the second is good familiarity with the material.
Before the first & second, however, there is something that is far more important, at least to me. And yes, I am aware of the impossibility of priority zero. Language. I am not a native English speaker, and speaking in English, especially public speaking, is not something that came naturally to me. I still remember doing a talk and switching to Hebrew during the introduction without noticing...
But I have been practicing English quite a lot lately, apparently speaking only English for long period of times does help, and it shows. It got to the point where I sometimes automatically speaks in English, which I find highly disturbing at times. Oh, and if someone can explain to me the process in which I can select which language to talk, I would be grateful, I am extremely interested in that, but I have no clue how it works.
Anyway, given that you are actually able to speak coherently in the language that you are going to use, there is one important thing that you must do before you start prepping for a presentation. Decide what is your goal, given your constraints.
Constraints are things like:
- What is the level of the people in the audience?
- What is their familiarity with the subject at hand?
- How complex is the topic?
- How much time do you have?
The goal is affected by your constraints, not the other way around. And the sad thing is that often enough, it is so easy to get it wrong.
The basic problem is that most of the time, it is so bloody hard to get it right. It is easy to spend hours on a topic, because it deserve to have hours dedicated to it. But most often you have an hour or so, and that is it. And in that timeframe, you have to decide what you want to do.
Broadly, there are several options:
- High level vision - what you can do, why you want to do it, how does this help you make your life better. In technical discussion, you might also want to be able to do a demo or two, but you keep it high level, and don't get mired in the code. The main goal is to give the audience the concepts and the understanding.
- Introduction - show what is going on, demos, skim the surface, don't get too deep, with some minimum level of introduction to the concepts that are being exposed. The main goal is to give the audience an actionable start. They can go home and do something with this.
- Detailed overview - this is a focused discussion on a specific topic. Usually this assumes some level of familiarity with the subject from the audience, and we can dive into the details and discuss a topic or two at length. Note that a topic is a small matter, but we can cover it quite well. The goal is to shine a spotlight into a particular area, and give the audience a lot more knowledge about it.
- Blow their mind - despite the name, and the fact that I had done a presentation just like that very recently, I am not sure that I like this style at all. Somehow, I feel that this is cheating. Basically, in this style of presentation, you identify some problem that your presentation can help solve, and then you try to do the best demo you can to get an impressive result. The reason that I feel like cheating is that it is usually an non actionable presentation. You usually can do something with it right away, but you would need to do a lot more to get the real benefits out of this. This also takes a whole lot of time in prepping for this, and you have better be able to judge the audience and see if you get the appropriate reaction. If you can't keep up the pace of the presentation, you are going to flop badly.
In Oredev, I had done three talks, and a workshop, which falls naturally into each of those categories. Peter Hultgren has this to say about my Active Record presentation:
The best presentation was probably “Using Active Record to write less code” by Ayende Rahien, which was cocky and super motivating. Even though I have some experience using ActiveRecord, and pretty much knew about the features he brought up, I had the same “wow” reaction as everyone else did. If you can deliver an ad-hoc presentation which preaches to a converted and makes him want to re-convert, then you’re on to something.
Leaving aside being immensely flattered by him, that was a "blow their mind" approach, which I purposefully tried to stirred the pot. I assumed that calling everyone in the room a criminal would make sure that it wouldn't be a popular presentation, but apparently that was quite popular. The theme of that talk was Persistence is a Solved Problem.
As I said, this is a dangerous technique. Another talk that I did in this style was ReSharper in DevTeach almost a year ago. And that one is a great example of a flopped presentation. I wasn't able to keep up the wow effect, and I basically lost the audience midway through.
In Oredev, I also had the "Producing Production Quality Software", which was a high level talk. That one went well as well, and it mostly involved telling a story. The key part in this presentation is involving the audience. Since I am talking to a crowd of IT guys, it wasn't hard to get them to commiserate with my war stories about production failure.
I also gave a Rhino Mocks presentation, which unfortunately was at the last talk at the last day. Here I made a major mistake, I fail to read the mood of the audience as wasn't able to adjust as well to a crowd that was simply a bit tired to be fully participating. This is something that I should have handled better, which I hope that I'll be able to utilize in the future.
The interesting part about Oredev presentations is that we had only 50 minutes for each presentation. Most other conferences has an hour to an hour and a half. That gives the speaker a lot more time, and it made prepping for Oredev much more... interesting. On the one hand, it is hard to try to squeeze almost fifteen minutes out of a session. On the other, it does mean that you have a very succinct talk if you manage to do so.
That is another important aspect of the constraints that I mentioned before. Which style of presentation you use is greatly influenced by the amount of time that you have. In particular, for most people, showing code is the most time consuming process in the presentation, except writing code. And there is basically few things worse than leaving the audience hanging without any input from you while you are busy typing code.
If you can cut down the writing code part to less than 20 seconds without input to the audience, it will work, otherwise, you need to prepare ahead of time. Something that I like to do for my presentation is to do a lot of ad hoc coding. Sometimes it works, sometimes it doesn't.
When it does work, it tend to impress people. When it doesn't work, I crash & burn :-) I try to have a backup plan for such scenarios, but I need to actually notice that I need the time to move to it. Another tip, you have ten seconds to debug a problem in your presentation, if you try to do anything more than that, you better back up, blame Murphy, and move on.
For that matter, watch the audience. You need to match the presentation to the people actually listening to it. Always start a presentation by syncing up with the audience. Who are they? What do they know about the subject? Tell them what you are going to talk about, how this is going to help make their life better.
In the timeframe of most presentations, you can't really give a whole lot of information. You just don't have enough time, and worse, you don't have a consistent audience, which would allow you to start from a level ground. What you can do, however, is to raise their interest. If after a talk I give, people in the audience go home (or on next Monday), and start looking up the things that I talked about, then I know that I have been successful.
What I am working on...
I am just going to post that, and watch what happens. I will note that this is code that I just wrote, from scratch.
public class TaxCalculator { private string conStr; private DataSet rates; public TaxCalculator(string conStr) { this.conStr = conStr; using (SqlConnection con = new SqlConnection(conStr)) { con.Open(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM tblTxRtes", con)) { rates = new DataSet(); new SqlDataAdapter(cmd).Fill(rates); Log.Write("Read " + rates.Tables[0].Rows.Count + " rates from database"); if (rates.Tables[0].Rows.Count == 0) { MailMessage msg = new MailMessage("important@legacy.org", "joe@legacy.com"); msg.Subject = "NO RATES IN DATABASE!!!!!"; msg.Priority = MailPriority.High; new SmtpClient("mail.legacy.com", 9089).Send(msg); Log.Write("No rates for taxes found in " + conStr); throw new ApplicationException("No rates, Joe forgot to load the rates AGAIN!"); } } } } public bool Process(XmlDocument transaction) { try { Hashtable tx2tot = new Hashtable(); foreach (XmlNode o in transaction.FirstChild.ChildNodes) { restart: if (o.Attributes["type"].Value == "2") { Log.Write("Type two transaction processing"); decimal total = decimal.Parse(o.Attributes["tot"].Value); XmlAttribute attribute = transaction.CreateAttribute("tax"); decimal r = -1; foreach (DataRow dataRow in rates.Tables[0].Rows) { if ((string)dataRow[2] == o.SelectSingleNode("//cust-details/state").Value) { r = decimal.Parse(dataRow[2].ToString()); } } Log.Write("Rate calculated and is: " + r); o.Attributes.Append(attribute); if (r == -1) { MailMessage msg = new MailMessage("important@legacy.org", "joe@legacy.com"); msg.Subject = "NO RATES FOR " + o.SelectSingleNode("//cust-details/state").Value + " TRANSACTION !!!!ABORTED!!!!"; msg.Priority = MailPriority.High; new SmtpClient("mail.legacy.com", 9089).Send(msg); Log.Write("No rate for transaction in tranasction state"); throw new ApplicationException("No rates, Joe forgot to load the rates AGAIN!"); } tx2tot.Add(o.Attributes["id"], total * r); attribute.Value = (total * r).ToString(); } else if (o.Attributes["type"].Value == "1") { //2006-05-02 just need to do the calc decimal total = 0; foreach (XmlNode i in o.ChildNodes) { total += ProductPriceByNode(i); } try { // 2007-02-19 not so simple, TX has different rule if (o.SelectSingleNode("//cust-details/state").Value == "TX") { total *= (decimal)1.02; } } catch (NullReferenceException) { XmlElement element = transaction.CreateElement("state"); element.Value = "NJ"; o.SelectSingleNode("//cust-details").AppendChild(element); } XmlAttribute attribute = transaction.CreateAttribute("tax"); decimal r = -1; foreach (DataRow dataRow in rates.Tables[0].Rows) { if ((string)dataRow[2] == o.SelectSingleNode("//cust-details/state").Value) { r = decimal.Parse(dataRow[2].ToString()); } } if (r == -1) { MailMessage msg = new MailMessage("important@legacy.org", "joe@legacy.com"); msg.Subject = "NO RATES FOR " + o.SelectSingleNode("//cust-details/state").Value + " TRANSACTION !!!!ABORTED!!!!"; msg.Priority = MailPriority.High; new SmtpClient("mail.legacy.com", 9089).Send(msg); throw new ApplicationException("No rates, Joe forgot to load the rates AGAIN!"); } attribute.Value = (total * r).ToString(); tx2tot.Add(o.Attributes["id"], total * r); o.Attributes.Append(attribute); } else if (o.Attributes["type"].Value == "@") { o.Attributes["type"].Value = "2"; goto restart; // 2007-04-30 some bastard from northwind made a mistake and they have 3 months release cycle, so we have to // fix this because they won't until sep-07 } else { throw new Exception("UNKNOWN TX TYPE"); } } SqlConnection con2 = new SqlConnection(conStr); SqlCommand cmd2 = new SqlCommand(); cmd2.Connection = con2; con2.Open(); foreach (DictionaryEntry d in tx2tot) { cmd2.CommandText = "usp_TrackTxNew"; cmd2.Parameters.Add("cid", transaction.SelectSingleNode("//cust-details/@id").Value); cmd2.Parameters.Add("tx", d.Key); cmd2.Parameters.Add("tot", d.Value); cmd2.ExecuteNonQuery(); } con2.Close(); } catch (Exception e) { if (e.Message == "UNKNOWN TX TYPE") { return false; } throw e; } return true; } private decimal ProductPriceByNode(XmlNode item) { using (SqlConnection con = new SqlConnection(conStr)) { con.Open(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM tblProducts WHERE pid=" + item.Attributes["id"], con)) { DataSet set = new DataSet(); new SqlDataAdapter(cmd).Fill(set); return (decimal)set.Tables[0].Rows[0][4]; } } } }
Storming Castle Windsor & NHibernate - Code & Presentation
Those can be found here, didn't manage to get a recording, though.
Update: Now the presentation is in PDF format.
Presentation/Code from Microsoft Academy
Here you can find both code and presentation from my recent talk, it is in Office 2007 format, because if I try to convert it to 2003 it gets to 25Mb.
Have fun,
Talking in DevTeach
I am going to give several talks in DevTeach on May. The topics are:
- Interaction based testing With Rhino Mocks
- Rapid (maintainable) web development with MonoRail
- Advanced usages of Inversion of Control containers
I am very excited about it.
The part that I really like is the "Advanced usages..." part of the last name. It means that I can assumes that you know what IoC is and I can blow their minds with the interesting stuff (Binsor, Auto Transaction, Bijection, AoP, Generic Specializing Decorators, Scoped Containers, etc). I am now working on a lecture about IoC for developers that doesn't neccesarily knows what it is, and I am frustrated that I can't get to the really cool stuff.
Cruel And Unusual Punishment (or, how I Practice)
I was working on the talk I am going to give in the Microsoft Academy next week, and I really needed to practice saying everything. I quickly gathered some family memebers and subjected them to a high level lecture of IoC. Interesting what you can learn from the amount of glazing in their eyes. :-)
I did the same to some co-workers today, and got even more good feedback (the best piece of advice was from our QA guy, which is certainly not the target audiance). I am starting to get a good feeling about this lecture, even though it is going to be very different from the one I did about Active Record.
That one was basically all code, with a presentation there just to keep me from shooting off in some obscure directions and getting all excited that [HasManyAndBelongToMany] can now do a better job inferring what I mean. This is a more of an overview of the pattern and what advantages it can give me (I have to assume that a significant part of the audiance will be facing this concepts for the first time).
Bum
That is what Microsoft thinks that I am ;-) Take a look at this horrifying video, detailing how I was reduced to begging in order to get to the event. At least I end up arriving in style :-)
At least I wasn't turtored, thrown off a plane, sent to space or Telenovelled.
Seriously, that is nearly 5 hours of my life, compressed into 40 seconds. For those of you who aren't Hebrew speaking, those are teaser videos for the Microsoft Academy Event at the end of the month.
Talking on Microsoft Developer Academy
I'll be giving a talk in Microsoft Developers Academy on the 31 January, 2007.
I am going to give a 400 level talk about Inversion of Control. The main goal is to move from introducing the topic to people who never heard about it to talk about high level stuff such as decorator chains, generics inference and configuration DSL in one hour.
I am on Track B, 10:00 - 11:00, COM414, the talk is called "Inversion of Control - Breaking Up The Dependencies".
You can check the schedule here
Lectures Abstracts
Note: I just spend quite a bit time writing this, I am putting it on my blog so I will remember it exsts.
Who am I?
Level 4/300: Object Relational Mapping += 2: More then just data <-> object
Object relational mapping are becoming only more popular, as people developing complex systems find that they need more than the tabular model to work with in their applications. A sophisticated ORM can do a lot more than merely get the data out of the database in object form, it can be a valuable assest in simplifying development and making things possible. In this session, you will see how you can utilize an ORM in untraditional ways to get an additional, better, approach to solving complex issues.
Some of those ways include business rules, localization, state transitions, inversion of control, etc. All done via the ORM layer, and all can be used to drasticly simplify the complexity of the given scenarios.
Level 100: Using Active Record to write less code
What would you say if I told you that you can stop writing data access code in .Net? Aren't you tired of writing the same thing over and over again, opening connection, querying the database, figuring out what to return, getting back untype data that you need to start putting on the form? Do you really see some value in writing yet another UPDATE statement?
The Active Record framework allows you to fully utilize the power of the database, but without the back breaking work that it used to take. Active Record uses .Net objects to relieve you from the repeating task of persistance. Those objects are schema aware and can persist and load themselves without you needing to write a single line of SQL. Building business application using Active Record is a pleasure, the database stuff just happens, and you are free to implement the business functionality.
Presentation for this can be found here: http://www.ayende.com/91/section.aspx/download/160
Level 200: Rapid (maintainable) web development with MonoRail
If you're a fan of Ruby on Rails and want to see similar capabilities in .NET, or you're an ASP.NET developer looking for an easier way to do things, MonoRail will be irresistible once you find out what it can do for you. Strong support for Ajax makes writing buzzward compliant web applications a breeze. Utilization of the Model-View-Controller architecture and convention over configuration makes web development with MonoRail a pleasure. Free yourself from page-life cycle issues and viewstate worries, start working with MonoRail, where the framework works for you.
This talk will introduce the general concepts of the framework, and how you can use them
Level 100: Interaction based testing With Rhino Mocks
Beyond the simplest scenarios, all objects had collaborators that they work with. This flies in the face of testing objects in isolation. This is the problem that mock objects were created to solve. In this talk you will learn what mock objects are, how to utilize them and best practices on when / how to utilize them. Rhino Mocks is a mock objects framework for .Net whose core goals are to let the developer rely on the compiler work well with refactoring tools.
Level 200: Inversion of Control and Dependency Injection: Breaking out from the dependecy hell
Responding to change is the holy grail of software development. Inversion of Control (IoC) and Dependency Injection (DI) are two related patterns that allows to make significant changes to an application without having to touch every part of the application. IoC and DI encourage breaking the application into discerete, highly cohesive parts, so a change, when it eventually comes, is very local. A nice benefit is that applications that uses IoC are also very testable applications.
This talk will introduce the concepts of IoC and how to use them in your application.
Presentation can be found here: http://www.ayende.com/91/section.aspx/download/145
Level 4/300: Advnace usages of Inversion of Control containers
You already understand the concepts of Inversion of Control and Dependency Injection, now is the time to see how far we can make the IoC container works for us. This talk will focus on using an IoC container in complex scenarios. We will talk about generic decorator chains and generic specialization, contextful containers and IoC DSLs. These powerful concepts can greatly enhance your ability to respond to change in your application.
Level 300: Writing Domain Specific Languages in Boo
Domain Specific Langauge is not just the DSL SDK from Microsoft. A DSL can make working with the domain much easier, since you are capable of leveraging the domain concepts directly. The other alternative to a DSL is an XML file, and we all know how well declarative model can work when you need imperative concepts, just consider NAnt for a minute and you will see the issue. Usually, writing a DSL in .Net would be a complex issue, requiring writing a parser, interpreter, etc. Boo already handles all of that, and its open architecture means that it is very easy to extend it to express the concepts of the domain. This talk will show you how to build DSLs in Boo and how to utilize this power in your applications.
I love Office 2007
I am in the middle of looong install of VS SP1, so I can't code... When I can't code, I tend to write. Since I just has a series of post criticizing Microsoft (with another one that I'm busy writing now), I wanted to stop and thank the Office 2007 team.
Office 2007 is a wonderful application suite, I am currently writing an IoC presentation in PowerPoint, and I am loving what I can do with it. Just take a look at my current slide:

I am extremely annoyed with the two-four "standard" presentation themes (all of which are mostly blue), and I really like that I can create visually pleasing results in such ease. The same goes for Word 2007, I wrote my MSDN article with it, and it produced a very good looking document with very little effort.
Office 2007 makes my life easier, and to the Office team, you did a hell of a good work.
NHibernate Web Cast Series: Thinking about the infrastructure
Here is a status report about the NHibernate Course that I talked about previously. I have talked with Justin, and at the moment is looks like we are going to do a web cast series about NHibernate. The draft syllabus can be found here, although this is merely a list of topics that we would like to cover.
We are thinking of roughly 30 hours(!) or so of web casts, which should be enough to cover NHibernate from end to end, and maybe leave me out of a job :-). A you can imagine, trying to do something like this is a fairly lengthy, and involve quite an invensement in both time and effort. In other words, we would like to get paid for this effort.
Now, beyond producing the web casts, I don't really want to deal with the hassle of creating a a site to sell the web casts. This is more of a headache avoidance issue than anything else. We checked in a couple of places, and it doesn't look like anyone we know is willing to handle the hosting/billing/headache issues. What I would like to know is whatever you can recommend (to me, or me to them) a way to handle this.
If all else fails, we would handle this ourselves, but I would much rather worry about technical purity than about encrypting payments and calculating taxes. We are open to suggestions, so you can either drop me a line here, or contact me directly via my email address.
Pitching Castle
As I mentioned, there is not a very interesting discussion on the Castle Developer mailing list.
One of the topics that just came up is evangelizing Castle to the community. I think that the main problem of Castle is that it help solves the problems that you have after you finished 30% of the project. That is when you start discoverring the limits of the stuff that MS is preaching. It takes prior experiance with this pain to make the trade off visible. I know that in the past I have talked about the seperation of UI / business logic that is inherent to MonoRail, and I got responses like: "Well, that is why we have code-behind files in ASP.Net".
I wasn't sure quite how to deal with that argument then. Every now and then I see people who are fortunate enough to build applications where the UI is truly just the ASPX and maybe a single line or two of databinding in the code behind. But my experiance is that I often need to do complex stuff in the UI. For instnace, show certain rows in a grid with a certain color, Ajax, etc. All of which are intimately tied to the UI, and are not possible to do in the ASPX. This means that they go to the code behind file, and there goes the Seperation of Concerns out the window. I have seen a date picker control that is over 2,500 lines of code. And even in this simple control, there was some business logic involved (mostly around what valid dates are, and how to handle ranges of them.
Anyway, this discussion coincides with a request from a friend to send some information about how to sell Active Record to their team lead / architects. I uploaded the presentation to my Presentations page, so feel free to start pitching Active Record (which is the easiest thing to get into a project, I have found) and then expand your Castle use later on.
Refactor: My.Presentations From Internal To Public
It seems to me that I started to accomolate quite a few presentations, and in the spirit of not keeping stuff internal if I can make it public, I decided to publish them.
Here you can find all the public ones.
They are of varying quality, and are mostly used by me to keep me on track and not digress to interesting (but irrelevant) topics in mid talk.
Not suprisingly, most of them are about OR/M, specifically, Active Record and NHibernate. All the ones that start with "NHibernate " are from a course I gave on NHibernate nearly six months ago. The one about Active Record is from an internal presentation that I gave at work (not the one that I am going to give on Monday). There is also an Inversion of Control presentation that I never really had a chance to give for some reason, which I am particulary proud of.
Have fun, and if you intend to use this, I would like to get a link to any recording / video made.