April 26, 2003
@ 10:09 PM

"Bill Gates! Bill Gates!"

Steve and I went to the Kremlin and the Red Square here in Moscow today. We toured the Kremlin and its churches before we went to see Lenin (that's a warped experience and a "must see") and quite a few other sights around Red Square. Yesterday we had a great event with about 700 people, lots of very interesting questions, two most excellent guys doing simultaneous translation, our slides in a booklet all translated into Russian, and we were even asked to give autographs....

The funniest little story at the Kremlin went like this: We're walking by the congress center (of the former communist party) towards the Palace of the Patriarchs and a group of maybe 20 school kids from St. Petersburg walks in front of us. Suddenly one of the kids (who were all about 15) turns around after hearing us chat and says "Where you from?". Steve grins and says "Seattle ... Washington ... USA". All of a sudden he's got the crowd's attention, all the kids stop. And then he puts up his special kind of amused smile and says "I work for Microsoft". Awe. Disbelief. Happiness. One kid says: "Windows XP!". Steve, very visibly enjoying himself, says "Yes. Yes", pointing to himself, "I worked on that!". More happiness and the kids start chanting joyfully "Bill Gates! Bill Gates! Bill Gates!" and would not let us get further away than 10 meters while we were in the museum in that building. Finally, Steve made one of the kids the star of the day by trading 2 rubels (about 6 cents) for a 1 dollar note. The dollar from the "Amerikanskij" was surely one of the trophies of the day judging by the way they were all inspecting it. Since they're not from Moscow, it appears like they're not seeing Amerikanskijs that often, much less Microsofties.

I am not making this up. And for me as a German, non-Microsoft person it was sure a lot of fun to watch ;)



April 23, 2003
@ 09:59 PM

Aspects in Bucharest.

Tomorrow (today, strictly speaking), Steve and I will be doing the second round of talks on our tour speaking about scalable systems. Microsoft Romania expects 700 (!) people and on Friday we're going to have another 700 in Moscow. Add the 200 people we had on the first event yesterday in Warsaw (which went really well) and we'll have had 1600 people altogether in a single week. Fantastic! Great fun.

On of the things I'll be showing tomorrow (in the context of "programming model extensibility") and which you can build yourself using VS.NET 2003 and my new set of libraries is a little custom "aspect" (or "interceptor" for more old-fashioned thinking people):

using System;
using newtelligence.Aspects;
using newtelligence.EnterpriseServices;
namespace AspectComponentServer
 public class MonitorData
  private string data;
  public MonitorData( string data )
   this.data = data;
  public string Data 
    return data;
  public class MonitorAspectAttribute : Attribute, IAspectServerContextLeave, IAspectServerContextEnter
  public MonitorAspectAttribute()
  public void OnServerContextEnter(object transparentProxy, System.Runtime.Remoting.Messaging.IMessage message, 
System.Reflection.MemberInfo member, System.Reflection.ParameterInfo paramInfo) { Console.WriteLine( "Enter context for method {0}", message.Properties["__MethodName"] ); Console.WriteLine( " -- Setting property into context" ); ContextUtilEx.SetUserProperty( "AspectComponentServer.MonitorAspectAttribute.MonitorData",
new MonitorData("Test information") ); } public void OnServerContextLeave(object transparentProxy, System.Runtime.Remoting.Messaging.IMessage message,
System.Reflection.MemberInfo member, System.Reflection.ParameterInfo paramInfo, bool ReturnValue) { Console.WriteLine( "Leave context for method {0}", message.Properties["__MethodName"] ); MonitorData monitorData =
ContextUtilEx.GetUserProperty( "AspectComponentServer.MonitorAspectAttribute.MonitorData") as MonitorData; Console.WriteLine( " -- Property value found: {0}", monitorData.Data ); } } }

and use it like this

using System;
using System.EnterpriseServices;
using newtelligence.EnterpriseServices;
using newtelligence.Aspects.Constraints;
using newtelligence.Aspects;
[assembly: ApplicationActivation( ActivationOption.Library)]
[assembly: ApplicationAccessControl( false )]
namespace AspectComponentServer
 public class FlightReservation : AspectServicedComponent 
int jitaSessionState;
   public string ReserveSeat( 
            string Airline, 
            string FlightNumber,
            int Row,
            string Seat,
            string DepartureAirport,
            DateTime DepartureTime,
            string ArrivalAirport)
  public bool ConfirmSeat( [MinLength(1),MaxLength(8),Match("[0-9]+")] string ReservationCode )
  public bool CancelSeat( string ReservationCode )

Steve said yesterday that the capability to add your own interceptors and my extended "ContextUtilEx" class that allows you to flow arbitrary items in the context is enough to build your own services on top of the Enterprise Services infrastructure much in the same way as COM+ does it internally.

The [ContextState] attribute sits on top the ContextUtilEx and gives you custom "session state" for just-in-time activated components, which means that you can have fields that have context scope and whose values will survive the recycling of the actual object instance across activations. That brings Enterprise Services and ASMX one step closer together in terms of programming models.

If Microsoft wouldn't be grumpy with me if I did it (and they would), I would name my stuff not "newtelligence SDK for Enterprise Services" but rather "COM+ 1.75" ;)


April 23, 2003
@ 02:00 PM

"Resistance is futile". Someone said that to me at a dinner a few weeks ago, and it seems that happened to Chris, too. Seems like Chris gave in straight away and got assimilated ;)


newtelligence SDK for Enterprise Services.

Here's the first drop ("RC0") of the library that I am releasing along with our tour. The ZIP file contains a single MSI, which installs into Visual Studio .NET 2003. There will be more drops during the next two weeks, which will mostly add more documentation and more samples.

Greetings from Warsaw...
PS: Does Aspects, too.


April 20, 2003
@ 07:08 PM

Steve in the house

Steve Swartz and myself have been preparing our "Scalable Applications" tour over the last three days, and in between things we spent some time at Patricia's and my families' houses for holiday lunches and afternoon coffee, opened the BBQ season on our balcony, watched the sunset at Düsseldorf's Rhein riverside over some Alt-beers and are now getting ready for travel. Tuesday we'll speak in Warsaw, Thursday in Bucarest, Friday in Moscow and next week we'll be in Oslo (Monday), Copenhagen (Tuesday), Paris (Wednesday) and Lisbon (Friday). Just in time for this tour, Steve has now set up his own blog at gotdotnet and we're planning to write about the tour here and over there as we go along. 

Update: You can download our slide decks from www.thearchitectexchange.com (under "Scalable Apps Tour"). Mind that PPTs only tell half of the story, of course. A bag of binaries and sample code should be there Tuesday, the latest.


April 13, 2003
@ 02:11 PM
Content Pipelines, discussed. Check the comments.

AspectServicedComponent, NETFX 1.1 and GC

This morning I had the first chance to compile my AOP framework for Enterprise Services on the RTM versions of VSNET 2003 and the Framework 1.1. At first sight, the stress tests showed that something was still leaking memory, but -- oh, wonder! -- about 10 minutes into the stress test run, it all seems to stabilize and the heap sizes in all GC generations including the critical Gen 2 actually start to shrink and grow in a saw-tooth shape in the perfmon-charts as expected. I guess that means that you can expect bits in time for TechEd 2003 Dallas, where I will do a "400 level" talk on AOP and will finally give away some better hints at how this was done.


April 11, 2003
@ 09:45 PM

A search for "definately" yields "about 686.000" links on Google, but none in the dictionary. Last time I looked, it was definitively spelled "definitely".


April 11, 2003
@ 06:37 PM

Content Pipelines?

On the flight from Athens to Madrid this last week I had an idea that I'd like to float in order to see what other people think.

The weblog infrastructure that I am (still, due to little free time) building, has its own aggregation system that flows aggregated content though a pipeline until it's pushed into the storage system. So, what the system does is to pull content from RSS feeds, from Exchange public folders, websites and others sources (the "feed readers" are pluggable), maps everything into a common representation and flows articles through the pipeline. The stages in the pipeline can look at the content and make adjustments (fix up HTML), do filtering (assign categories) and, most importantly, can enrich the content with metadata. So, when the system is pulling information from an RSS source, it may invoke a stage that runs all the words in the article against a dictionary and add links to a site like dictionary.com, it may invoke a stage that find relevant books on amazon.com or a stage to get Google links or even a stage that translates the original Russian text into German for me, and add all that additional information to the "extended metadata" of the article, etc.  Everything is pluggable.

Here's the idea: I really don't want to write the Amazon, Google, Dictionary and Babelfish stages, myself. What I rather want to do is to enlist those sites as web services into my pipeline. Using one-way messaging and <keyword>WS-Routing</keyword> I could say "here's an article, add your metadata to it and send it back <to> me or <via> the next pipeline stage here at my system or <via> elsewhere when you're done". Or I could just walk up to an RSS provider and say, "don't reply to be directly, please route back to me <via> these stages".

So, if such a distributed infrastructure existed, and you'd aggregate this entry "backrouted" through a pipeline of filters provided by Weather.com, Google.com, Dictionary.com and Amazon.com, you'd have the weather for Athens and Madrid, all relevant Google links and books on "content" and/or "pipelines" and WS-Routing, and links to explanations of all non-trivial words in this text. How's that?


  • Use the BCL type names
  • Don't redefine your type's names to match your old habits ;-)

[Ingo Rammer's DotNetCentric]

Sorry.... string, int, char and long are part of the language. Int32 is just some detail of the underlying platform. The fact that C# and VB.NET very convienently map onto the CLR type system doesn't mean that all languages do. Using BCL types also takes away the flexibility only a high level language and its abstraction over the platform can provide. Mind WPARAM and LPARAM in Win16 (16bits,32bits) vs. Win32 (32bits) vs. Win64 (64bits). (For the younger amongst us, the "W" in WPARAM used to mean "WORD" as in "16bit processor word" and "L" used to mean "LONG" as in, ahem, "long" or "double word"). Been there, hated that. If a language can fix those problems for me by providing a layer of abstraction ... thank you, will buy.


April 6, 2003
@ 01:29 AM

Fresh look. I got bored with my blog template at last and designed a new one. I used the only graphics editor that ever really made sense for me (a matter of taste, really) in terms of handling and which wasn't too bloated: Microsoft Image Composer 1.5. Unfortunately discontinued.


My conference schedule for the next weeks....

I guess "busy" is the right word to describe this table. However, I am not complaining. A lot of this will be fun.

Date From/To Event Location
2003-04-07 Microsoft EMEA Architect's Tour Athens, Greece
2003-04-08/2003-04-09 Microsoft EMEA Architect's Tour Madrid, Spain
2003-04-15/2003-04-16 Microsoft EMEA Architect's Tour Milano, Italy
2003-04-22 Scalable Architectures Tour Swartz/Vasters Warsaw, Poland
2003-04-24 Scalable Architectures Tour Swartz/Vasters Bucarest, Romania
2003-04-25 Scalable Architectures Tour Swartz/Vasters Moscow, Russia
2003-04-28 Scalable Architectures Tour Swartz/Vasters Oslo, Norway
2003-04-29 Scalable Architectures Tour Swartz/Vasters Copenhagen, Denmark
2003-04-30 Scalable Architectures Tour Swartz/Vasters Paris, France
2003-05-02 Scalable Architectures Tour Swartz/Vasters Lisbon, Portugal
2003-05-05 Windows Server Launch Roadshow Germany Frankfurt, Germany
2003-05-06 Windows Server Launch Norway Oslo, Norway
2003-05-07 NT Konferenca 2003 Portoroz, Slovenia
2003-05-08 Windows Server Launch Roadshow Germany Munich, Germany
2003-05-09 Windows Server Launch Roadshow Germany Berlin, Germany
2003-05-12 Windows Server Launch Roadshow Germany Hannover, Germany
2003-05-13/2003-05-14 Microsoft DNA/.NET Workshop Reading, UK
2003-05-19/2003-05-23 TornadoCamp IV Bad Ems, Germany
2003-05-26/2003-05-30 BizTalk Workshop Karlsruhe, Germany
2003-06-01/2003-06-06 Microsoft TechEd 2003 Dallas, TX, USA
2003-06-17/2003-06-18 Microsoft DNA/.NET Workshop Munich, Germany
2003-06-30/2003-07-04 Microsoft TechEd Europe 2003 Barcelona, Spain



April 4, 2003
@ 08:08 PM


So.... I just got the word that I am confirmed as speaker at TechEd Dallas (my first major U.S. Microsoft conference) Of course I'll be at TechEd Barcelona, too. I may even go to TechEd South Africa in Sun City. We'll see.

Anyways, the title of my session ".NET Web Services Internals: I didn't know you could do that!" promises more whacky demos, more attributes, more WSDL hacking (I use while it lasts ;) and more black magic done by the ASMX runtime. The other session is about AOP and may come with some surprises as well ;)


Me, with big time jet lag, on video, talking about SOA and AOP.
I listened to "Service-Oriented Architectures", presented by Clemens Vasters at the EMEA Architects Tour. Its a great description of SOAs and Clemens makes several thought-provoking points. Thanks to Harry Pierson for the link.

Best line of the presentation:

We owe XML to our children.
True. True.


Microsoft sets Office bundling terms. Microsoft will not include InfoPath and OneNote as part of the Office suite sold at retail or installed on new computers. [CNET News.com]

There are things I will probably never understand. The Office bundling is one of them. I have a hard time figuring out why InfoPath shall only be an "Enterprise" thing.


Even more on UDDI UDDI provides the opportunity for metadata to describe the services, and the likely response here will be that "This will be one of the constraints you can establish when querying UPS, FedEx and DeutschePost for the service", but that presumes that I don't have some kind of partner-based relationship with one or the other; in short, it doesn't reflect the larger business concern that I want to cut deals with companies to give them exclusive access to my business in exchange for price breaks, priority service, and whatnot.  [The Mountain of Worthless Information]

That's just why I distinguish between global and local registries. You'll only dispatch from you local UDDI registry. That will only have services registered that you trust and that you have an estalished relationship (and SLA) with. The power is that you can add and remove services from there without having to change anything in your code and it is a consistent place and a consistent model to do so for any service. The global UDDI registries are yellow pages, the local UDDI registry (yours) is a Rolodex(tm).


April 2, 2003
@ 03:01 PM

There's an interesting comment on Ted Neward's blog which is related to what I've been saying here:

Ian Fairman wrote:
This whole approach of munging your own shipping request schema to the parcel company's schema reminds me of how some people would tout entity beans as reusable simply by using object-relational mapping tools to map them to 3rd party database schemas. Unfortunately the "magic" in these mapping tools can be quite easily fooled by extra fields in either the bean or the database table - what do you do with them? And that is probably the simplest problem you'd meet. This mapping magic is a pipe dream. The real solution is to define standard schemas. Getting everyone to agree on these schemas may be a pain in the arse but at least it will work when you've done it.

The problem with the standardization and agreement dream is that it is indeed much less realistic than doing all the mapping work. What we need are stable schemas that we can rely on and map from and to, but not necessarily standardized ones. Until you get people from all state-owned postal services around the world and all the private courier and parcel services to agree on a set of schemas to use in unmodified form (or all banks, or all whatever-you-choose-industry), XML has likely already been replaced by the next thing. 

Message standards are hard to agree on. If you look at EDIFACT or ANSI X.12, you'll find that neither really defines something like a schema. Both standards define "dictionaries" of segments which you can choose from when you assemble/trim message definitions. An EDIFACT ORDERS message is never caught in the wild as specified in the EDIFACT dictionaries. In fact, it's already a messy manual task to go from one user's ORDERS to another user's ORDERS, because the precise implementations of ORDERS may differ wildly.

Even worse ... what if industry A agrees on a standard format for exchanging purchase orders and industry B does the same for themselves and now a company from industry A wants to purchase something from a company in industry B. Poof!

The moment the first company came up with a graphical, easy-to-understand editor for XML Schema, the whole standardization hope was gone out the window already. Everyone can define schema and if they can, they will. Now with stuff like InfoPath, my Dad can even define schema. It's not going to be pretty, but it is schema.

If one out of 500 companies doesn't support a "standard schema" or even augments it with their own idea of certain things and that one company happens to be a big fish, forget standardization. You will have to understand what they mean and you will have to map between schemas. Schema standardization won't work on a grand scale and it will just not happen.

At the same time, "generic mapping" won't work, unless we take metadata much further than we do now and start to formalize semantics. The "semantic web" efforts go into that direction, but there's plenty of work to be done. In the absence of standardization, mapping between schemas is a growing necessity and while it seems like an ugly job -- it is a job. It's a manual job. There's no magic here. And it surely will create jobs. It's simply a necessary new field in programming and it's begging for better tools.


April 2, 2003
@ 10:37 AM

More on UDDI. [...] OK, UDDI-as-the-yellow-pages I'll buy, but this idea of "give me the WSDLs for those services" implies that I'm going to dynamically invoke a web service, meaning now essentially you're tying me into a loose-binding situation similar to writing Java or .NET Reflection code. Quite frankly, I don't buy this argument whatsoever--I *need* to have some idea of the service I'm trying to invoke, otherwise, how can I know what to pass where? I recognize this idea of "dynamic glue" is an attractive one, allowing me to walk up to any web service at runtime and consume it without any a priori knowledge whatsoever, but this is akin to suggesting that I can write a generic Java user interface that can gather any sort of data from the user without any sort of a priori knowledge whatsoever, driven by an XML file--you can do it, but boy will the UI suck. I'm still not convinced that UDDI is worth saving from the cliff; essentially we're talking about a naming/directory server (remember I can always attach attributes to an entry in an LDAP-like environment), coupled with dynamic binding at runtime of the endpoints. I still don't see the value here. [The Mountain of Worthless Information]

Get over RPC. Think messages. Get over coding and programming models. Think data.  

When you have a choice of three different services to call -- I will stick with my previous example -- one at UPS, one at FedEx and one at Deutsche Post, you will always know what data you have to give them and you know what you want from them. The challenge is to find those services by meaningful criteria and to map from your internal representation of data to their representation and back. Precisely, it's about mapping their idea of representing well-understood and agreed semantics into your representation of the same semantics. The global UDDI space (public registries) is the place where you can locate those services in general, the local UDDI space (enterprise registry) is where you can augment this information with your own metadata and mapping information.

All of this and Web services in general are not about taking someone's WSDL, code-generating a proxy and calling that proxy via reflection. That's RPC or Automation. That's last century's technology. That's old programming. The center of programming is shifting towards messaging. Enjoy.


April 2, 2003
@ 10:24 AM
Don points out that "IBM" is a recursive acronym.

April 1, 2003
@ 04:01 PM

A place for UDDI after all?. [...] I can understand the desire to see WSDL die--Lord knows, after having experienced firsthand the complications of building a truly interoperable web service using WSDL, I share his desire entirely--but I still don't see the relevance of UDDI in the service-oriented architecture. In many ways, it feels like Don and Clemens want UDDI to turn into some kind of centralized "workflow" (although I hate using that word in this context, since it clashes with what I consider workflow to be) repository, acting as a router from service to service, a layer of indirection to keep processing nodes in the chain from having to know the next and previous nodes in the chain. And it just feels to me like UDDI, having not really been designed for that, won't be the best choice for doing that--perhaps we'd be better off with a new implementation with less baggage? Or am I just missing something somewhere? [The Mountain of Worthless Information]

The answer is: It's the yellow pages. No, it's actually the yellow pages plus custom, extensible, and queryable metadata. You walk up to your enterprise UDDI registry and say (the formal equivalent of) "I have a bunch of packages here, all between 5kg and 20kg and I would like to have a truck in front of my building at 4pm this afternoon which will pick them up and I want them to be sent overnight to several places in Europe". UDDI answers: "Here are the service references for FedEx, UPS and Deutsche Post".

Then you say to UDDI: "Please give me the WSDLs for those services and a reference to the XSLT mappings that I have stored in the registry to map my internal XML Schema for shipping requests and shipping cost inquiries to the XML Schema for the respective messages in those WSDLs". UDDI says: "Here you go".

Then you make "give me today's shipping prices for those packages" calls to a local endpoint which takes a request using a Schema you defined, the local endpoint maps your internal schema to one of the remote service's schema, and then routes the call to the remote services. One to FedEx, one to UPS, one to Deutsche Post. You get back three prices, pick the lowest one and make a similar "come pick up the packages" call to the winner. At 4pm there'll be a truck.

The shorter answer: UDDI powers business logic driven "class factories".