It's 2008. Where's my flying car? RSS 2.0
 Monday, September 29, 2003

I just deleted a „direct marketing message“ for a lottery with the subject line: “[SPAM] category B winner”. The fact that a spammer labels his spam as [SPAM] is either funny, fair or exhibits an unprecedented case of idiocy. I still have to make up my mind.

By the way, my little experiment started August 8th, where I set up an unmonitored and unused mail account just to see how much spam it attracts by just “being out there” is starting to yield the expected result.

(Before you follow the above links, I recommend that you have a virus scanner running that monitors your web traffic; the “spamthisaccount” page has literal copies of the e-mails, including attachments. We are scanning for viruses and right now there’s nothing harmful in the content directory, but you never know when it hits ….)

Monday, September 29, 2003 3:30:51 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
Other Stuff
 Saturday, September 27, 2003

Steve Swartz, who is one of my very good personal friends and who is, that “personal function” aside, Program Manager in Microsoft’s Indigo team and also was the lead architect for a lot of the new functionality that we got in the Windows Server 2003 version of Enterprise Services (COM+ 1.5 for the old fashioned folks), wrote a comment on my previous post on this topic, where I explained how you can get the XML configuration story of the Framework to work with Enterprise Services using the .NET Framework 1.1.

In response to what I wrote, someone asked whether this would also work on Windows XP, because I was explicitly talking about Windows Server 2003. Steve’s answer to that question completes the picture and therefore it shouldn’t be buried in the comments. Steve writes:

In fact, this will work on XP and Windows Server 2003 so long as you have NETFX 1.1. The field has been there since XP; in NETFX 1.1, we set the current directory for the managed app domain.

This field was originally added to configure unmanaged fusion contexts. In that capacity, the field works with library and server apps alike. In its capacity as a setter of current appdomain directory, it works less well with library apps (natch).

Saturday, September 27, 2003 8:33:35 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
Enterprise Services

Go here and read what Matt Davis at the Cognition and Brain Sciences Unit, in Cambridge, UK has to say says about one of the current "cool quotes" in blog space.

It's a very interesting read from someone who can explain that the following paragraph (that has been replicated across hundreds of blogs in the last two weeks and for which the source doesn't seem to be really known) isn't really accurate in what it's saying:

Aoccdrnig to a rscheearch at Cmabrigde Uinervtisy, it deosn't mttaer in waht oredr the ltteers in a wrod are, the olny iprmoetnt tihng is taht the frist and lsat ltteer be at the rghit pclae. The rset can be a total mses and you can sitll raed it wouthit porbelm. Tihs is bcuseae the huamn mnid deos not raed ervey lteter by istlef, but the wrod as a wlohe.

Saturday, September 27, 2003 5:35:24 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
Other Stuff
 Friday, September 26, 2003

A long while back, I wrote about a hack to fix the dllhost.exe.config dilemma of Enterprise Services. That hack no longer works due to changes in the Framework, but the good news is there is an “official” and very easy solution for this now. Unfortunately there is no documentation on this (or at least it’s not easy enough to find that I could locate it) and Google only yields a few hints if you know exactly what you are looking for. So, index this, Google!

What I call the “config dilemma” of Enterprise Services is that because all out-of-process ES applications are executed using the surrogate process provided by %SystemRoot%\System32\dllhost.exe and the runtime is loaded into that process, the default application configuration file is dllhost.exe.config, must reside just next to dllhost.exe (in System32) and is therefore shared across all out-of-process Enterprise Services applications.

That makes using the XML configuration infrastructure for Enterprise Services very unattractive, to say the least.

Now, with COM+ 1.5 (Windows Server 2003) and the .NET Framework 1.1, things did change in a big way.

To use per-application application configuration files, all you have to do is to create an (possibly otherwise empty) “application root directory” for your application in which you place two files: An application.manifest file (that exact name) and an application.config file. Once your application is registered (lazy or using the RegistrationHelper class or through regsvcs.exe), you will have to configure the application’s root directory in the catalog – that can be done either programmatically using the catalog admin API (ApplicationDirectory property) or through the Component Services explorer as shown above.

The picture shows that the example that you can download using the link below is installed at “c:\Development\ES\ConfigTest\ESTest” on my machine and has these two said files sitting right there.

The application.manifest file content is embarrassingly simple

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
</assembly>

and the application.config isn’t complicated either:

<?xml version="1.0"?>
<
configuration>
  <appSettings>
     <add key="configBit" value="This rocks!"/>
  </appSettings>
</
configuration>

These two files, placed into the same directory and properly configured as shown in the above picture, let this class

       public class SimpleComponent : ServicedComponent
       {
        public string GetConfigBit()
        {
            return ConfigurationSettings.AppSettings["configBit"];
        }
       }

yield the expected result for GetConfigBit(): “This rocks!”

 

 

Download: ESTest.zip

Friday, September 26, 2003 4:37:36 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [6] - Trackback
CLR | Enterprise Services
 Thursday, September 25, 2003

Lots of PDC hype these days. Here's a piece an Avalon by Wesner Moise that's still leaving quite a bit in the fog.

My translation of what I am reading from the abstracts is:

Imagine Microsoft would drop the entire USER32 subsystem of Windows and replace it with a brand-spanking-new windowing and I/O engine and a fully object-oriented, managed API, finally doing the long-overdue overhaul and replacement of the foundation of the Windows UI technologies that have, in essence, been with us since Windows 1.0.

.... and create a WOW ("Windows on Windows") subsystem layer, not dissimilar to what we saw in NT for Win16 apps, to support existing apps.

Thursday, September 25, 2003 10:59:39 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
PDC 03 | CLR

I am in a blogging mood today … Here are some thoughts around composite metadata. Sorry for the bold title ;)

* * *

Whenever I am asked what I consider the most important innovation of the CLR, I don’t hesitate to respond “extensible metadata” coming in the form of custom attributes. Everyone who has followed this blog for a while and looked at some of the source code I published knows that I am seriously in love with attributes. In fact, very few of the projects I write don’t include at least one class derived from Attribute and once you use the XmlSerializer, Enterprise Services or ASMX, there’s no way around using them.

In my keynote on contracts and metadata at the Norwegian Visual Studio .NET 2003 launch earlier this year, I used the sample that’s attached at the bottom of this article. It illustrates how contracts can be enforced by both, schema validation and validation of object graphs based on the same set of constraints. In schema, the constraints are defined using metadata (restrictions) inside element or type definitions, and in classes, the very same restrictions can be applied using custom attributes, given you have a sufficient set of attributes and the respective validation logic. In both cases, the data is run through a filter that’s driven by the metadata information. If either filter is used at the inbound and outbound channels of a service, contract enforcement is automatic and “contract trust” between services, as defined in my previous article, can be achieved. So far, so good.

In my example, the metadata instrumentation for a CLR type looks like this:

      [System.Xml.Serialization.XmlTypeAttribute(
           Namespace="urn:schemas-newtelligence-com:transactionsamples:customerdata:v1")]
       public class addressType
       {
              [Match(@"\p{L}[\p{L}\p{P}0-9\s]*"),MaxLength(80)]
              public string City;
              public countryNameType Country;
              public countryCodeType CountryCode;
              [MaxLength(10)]
              public string PostalCode;
              [MaxLength(160)]
              public string AddressLine;
      }

… while the corresponding schema is a bit better factored and looks like this:

    <xsd:simpleType name="nameType">
              <xsd:restriction base="xsd:string">
                     <xsd:pattern value="\p{L}[\p{L}\p{P}0-9\s]*" />
              </xsd:restriction>
    </xsd:simpleType>
    <
xsd:complexType name="addressType">
              <xsd:sequence>
                     <xsd:element name="City">
                            <xsd:simpleType>
                                   <xsd:restriction base="nameType">
                                          <xsd:maxLength value="80" />
                                   </xsd:restriction>
                            </xsd:simpleType>
                     </xsd:element>
                     <xsd:element name="Country" type="countryNameType" />
                     <xsd:element name="CountryCode" type="countryCodeType" />
                     <xsd:element name="PostalCode">
                            <xsd:simpleType>
                                   <xsd:restriction base="xsd:string">
                                          <xsd:maxLength value="10" />
                                   </xsd:restriction>
                            </xsd:simpleType>
                     </xsd:element>
                     <xsd:element name="AddressLine">
                            <xsd:simpleType>
                                   <xsd:restriction base="xsd:string">
                                          <xsd:maxLength value="160" />
                                   </xsd:restriction>
                            </xsd:simpleType>
                     </xsd:element>
              </xsd:sequence>
       </xsd:complexType>

The restrictions are expressed differently, but they are aspects of type in both cases and semantically identical. And both cases work and even the regular expressions are identical. All the sexiness of this example aside, there’s one thing that bugs me:

In XSD, I can create a new simple type by extending a base type with additional metadata like this

<xsd:simpleType name="nameType">
       <xsd:restriction base="xsd:string">
              <xsd:pattern value="\p{L}[\p{L}\p{P}0-9\s]*" />
       </xsd:restriction>
</xsd:simpleType>

which causes the metadata to be inherited by the subsequent element definition that again uses metadata to further augment the type definition with metadata rules:

<xsd:element name="City">
       <xsd:simpleType>
              <xsd:restriction base="nameType">
                     <xsd:maxLength value="80" />
              </xsd:restriction>
       </xsd:simpleType>
</xsd:element>

So, XSD knows how to do metadata inheritance on simple types. The basic storage type (xsd:string) isn’t changed by this augmentation, it’s just the validation rules that change, expressed by adding metadata to the type. The problem is that the CLR model isn’t directly compatible with this. You can’t derive from any of the simple types and therefore you can’t project this schema directly onto a CLR type definition. Therefore I will have to apply the metadata onto every field/property, which is the equivalent of the XSD’s element declaration. The luxury of the <xsd:simpleType/> definition and inheritable metadata doesn’t exist. Or does it?

Well, using the following pattern it indeed can. Almost.

Let’s forget for a little moment that the nameType simple type definition above is a restriction of xsd:string, but let’s focus on what it really does for us. It encapsulates metadata. When we inherit that into the City element, an additional metadata item is added, resulting in a metadata composite of two rules – applied to the base type xsd:string.

So the about equivalent of this expressed in CLR terms could look like this:

    [AttributeUsage(AttributeTargets.Field)]
    [Match(@"\p{L}[\p{L}\p{P}0-9\s]+")]
    public class NameTypeStringAttribute : Attribute
    {
    }

    [System.Xml.Serialization.XmlTypeAttribute(
       Namespace="urn:schemas-newtelligence-com:transactionsamples:customerdata:v1")]
    public class addressType
    {
        [NameTypeString,MaxLength(80)]
        public string City;
       
        …
    }

Now we have an attribute NameTypeString(Attribute) that fulfills the same metadata containment function. The attribute has an attribute. In fact, we could even go further with this and introduce a dedicated “CityString” meta-type either by composition:

   [AttributeUsage(AttributeTargets.Field)]
   [NameTypeString,MaxLength(80)]

      public class CityStringAttribute : Attribute
    {

    }

 … or by inheritance

    [AttributeUsage(AttributeTargets.Field)]
    [MaxLength(80)]

       public class CityStringAttribute : NameTypeStringAttribute
    {
    }

Resulting in the simple field declaration

    [CityString] public string City;

The declaration essentially tells us “stored as a string, following the contract rules as defined in the composite metadata of [CityString]”.

Having that, there is one thing that’s still missing. How does the infrastructure tell if an attribute is indeed a composite and that the applicable set of metadata is a combination of all attributes found on this attribute and attributes that are declared on itself?

The answer is the following innocent looking marker interface:

    public interface ICompositeAttribute
    {  }

If that marker interface is found on an attribute, the attribute is considered a composite attribute and the infrastructure must (potentially recursively) consider attributes defined on this attribute in the same way as attributes that exist on the originally inspected element – for instance, a field.

    [AttributeUsage(AttributeTargets.Field)]
    [Match(@"\p{L}[\p{L}\p{P}0-9\s]+")]
    public class NameTypeStringAttribute : Attribute, ICompositeAttribute
    {   }

Why a marker interface and not just another attribute on the attribute? The answer is quite simple: Convenience. Using the marker interface, you can find composites simply with the following expression: *.GetCustomAttributes(typeof(ICompositeAttribute),true)

And why not use a base-class “CompositeAttribute”? Because that would be an unnecessary restriction for the composition of attributes. If only the marker interface is used, the composite can have any base attribute class, including those built into the system.

But wait, this is just one side of the composition story for attributes. There’s already a hint on an additional composition quality two short paragraphs up: *.GetCustomAttributes(typeof(ICompositeAttribute),true). The metadata search algorithm doesn’t only look for concrete attribute types, but also looks for interfaces, allowing the above expression to work.

So how would it be if an infrastructure like Enterprise Services would not use concrete attributes, but would also support composable attributes as illustrated here …

    public interface ITransactionAttribute
    {
        public TransactionOption TransactionOption
        {
            get;
        }
    }

    public interface IObjectPoolingAttribute
    {
        public int MinPoolSize
        {
            get;
        }

        public int MaxPoolSize
        {
            get;
        }
    }

 

In that case, you would also be able to define composite attributes that define standardized behavior for a certain class of ServicedComponents that you have in your application and should all behave in a similar way, resulting in a declaration like this:

      public class StandardTransactionalPooledAttribute :
        Attribute, ITransactionAttribute, IObjectPoolingAttribute
    {
    }

      [StandardTransactionalPooled]
    public class MyComponent : ServiceComponent
    {

    }

While it seems to be an “either/or” thing at first, both illustrated composition patterns, the one using ICompositeAttribute and the other that’s entirely based on the inherent composition qualities of interface are useful. If you want to reuse a set of pre-built attributes like the ones that I am using to implement the constraints, the marker interface solution is very cheap, because the coding effort is minimal. If you are writing a larger infrastructure and want to allow your users more control over what attributes do and allow them to provide their own implementation, “interface-based attributes” may be a better choice.

Download: MetadataTester.zip

Thursday, September 25, 2003 1:19:55 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [2] - Trackback
Architecture | CLR
If you are a developer and don't live in the Netherlands (where SOA stands, well known, for "Sexueel Overdraagbare Aandoeningen" = "Sexually transmitted diseases”), you may have heard by now that SOA stands for "service oriented architectures". In this article I am thinking aloud about what "services" mean in SOA.
Thursday, September 25, 2003 8:27:17 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [6] - Trackback
Architecture | IT Strategy

I just uploaded a new build of dasBlog (1.3.3266) to the GotDotNet workspace and the dasBlog site. Although it carries a new minor version number, the changes aren't dramatic and the new build mostly consolidates some cosmetic changes, add-ons (languages) and fixes that were done by the folks in the GotDotNet workspace and myself.

Thursday, September 25, 2003 12:20:44 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
dasBlog
 Tuesday, September 23, 2003

The Register reports that MSN is killing its open, unmointored chat rooms, except for MSN broadband subscribers in order to protect children from abuse. I think that's sad for lots of people who love to chat (and I remember how much of a chat addict I was back in '94/'95), but since those %&$&# apparently can't be stopped unless you take away their ability to communicate, it's probably a good thing. 

It's another example that the era of "free" and "anonymous" on the Internet will and must end at some point. In the long run, the Internet can't remain a lawless and anonymous space, but people will have to be held accountable for what they do. Unless that's understood and accepted by the Internet user community at large, we won't have proper protection from criminals, proper protection against spam, viruses, trojans and worms and appropriate security. In the end, security is not a function of software, but it's a function of administration. Protection from attacks against me, whether digitally or physically, is more important to me than the ability to roam around without being seen and known. You can't make yourself invisible in real life, either.

Tuesday, September 23, 2003 10:58:55 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
Other Stuff

I am investigating a problem that occurs very rarely in dasBlog and causes rendering of pages to fail consistently until restarted by, for instance, touching web.config. I've seen this happen only on the newtelligence website and only once.

Apparently, the resource manager that's used to pull in the localized strings for various elements and is stored in application state is lost at some point and causes the data binding of the controls to throw a NullReferenceException. What I assume is that the Global.Application_Start() event isn't fired in all cases when the worker process recycles.

I am looking into it, but before I have a good answer for the why and a fix, the best workaround is to touch (load and save) web.config in order to restart the app.

Update: While I still don't know why the original problem happened, I have a permanent workaround for 1.3, which is due very very soon (I am already posting using the 1.3 build that consolidates a couple of fixes, language additions and minor enhancements)

Tuesday, September 23, 2003 4:23:29 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
dasBlog

Bob Cancilla’s CNet article is so full of FUD that I can’t help but making a few more comments and post a few questions. Unfortunately, his email address isn’t mentioned near the article … therefore I have to blog it. Mr. Cancilla, feel free to use the comments feature here, if you find this…

Unlike IBM, Microsoft falls short when it comes to helping customers use standards in a productive, cost-effective way. […] Sure, both companies have worked closely to develop and promote a sizable number of important industry standards that will continue to have a big impact on the way business is conducted in the foreseeable future. But cool specs are meaningless to the IT people who must actually assemble all those standards into real business solutions. That's where the rubber meets the road for Web services. Redmond's approach to Web services is a dead-end of closed, Windows-only systems that lock customers into a single computing model. Customers don't have the freedom to choose the best hardware or operating system. Where does that leave the millions of users who rely on non-Microsoft platforms such as mainframes, Unix or Linux?

First of all, Mr. Cancilla, you haven’t understood Web Services, at all. Web Services are about connecting systems, irrespective of operating system, application platform or programming model. Redmond’s approach to web services is just like IBM’s and BEA’s and Sun’s and Oracle’s approach to Web Services. All of them think they have a superior application platform and their embrace of Web Services serves to make that platform the hub of communication for their and all other systems that are (for them: unfortunately) running on other platforms in the reality of today’s heterogeneous IT landscape. It’s about opening services for access by other platforms. I wish I would know how you get the idea that “lock-in” and “Web Services” belong in the same sentence?

Secondly, show me an environment that enables the average programmer to be more productive and hence more cost effective when developing XML and Web Services solutions than Microsoft’s Visual Studio .NET – to a degree that it backs up your “falls short” claim.

Third, I wonder how someone who has dedicated his career to one of the most monopolistic, locked-down and proprietary platforms in existence, that is IBM’s midrange and mainframe platforms, feels qualified to discredit Microsoft for their platform strategy. In fact, I can run Windows on pretty much any AMD and Intel-based server or desktop from any vendor – how’s that with your AS/400 and mainframe apps?

Ultimately, .Net defeats the purpose of open standards because Microsoft products are open only as long as you develop applications on the Windows platform. To me, this doesn't say open, it says welcome to yet another Microsoft environment that is anything but open.

Likewise, IBM’s full Web Services stack is only open as long as you write applications for their WebSphere environment. WebSphere is IBM’s application server and Microsoft’s application server is Windows Server 2003. Every vendor who makes money from software tries to build a superior platform, resulting in features that aren’t covered by standards and therefore cause vendor lock-in. That’s a direct result from market economy. However, this still doesn’t have anything to do with Web Services, because these are “on-the-wire” XML message exchange standards that primarily exist for the purpose of cross-platform interaction.

Proprietary environments deny businesses the flexibility to chose best-of-breed solutions that are fine-tuned to their industry's unique environment.

… like OS/400 and OS/390 ?

Additionally, Microsoft's claim that .Net's Web services platform saves customers money is misleading. Sure, the initial investment is enticing, but how much will it cost when the hard work begins? A recent Gartner report said companies planning to move their old programs to .Net can expect to pay 40 percent to 60 percent of the cost of developing the programs in the first place.

A recent discussion with my 9 year old niece has shown that moving “old programs” from anywhere to anywhere isn’t free and that anyone who’d make that claim shouldn’t be working in this industry.

Building your company's Web services platform on .Net is fine if you don't mind throwing away decades of investment in existing applications. For instance, on any given day, businesses use CICS systems to process about 30 billion transactions, to the tune of $1 trillion. They can't afford to rip out that kind of processing power. Instead, they're looking for ways to exploit it within other applications. But if they were to buy into .Net, they'd better be prepared to stack it on the shelf because Microsoft's Host Integration Server provides limited access to CICS on mainframes.

Ok … here we have it. CICS is a lock-in, proprietary IBM product, right? So, what’s better than Host Integration Server? I suspect it’s an IBM product, correct? So if you were to replace that all so powerful IBM mainframe with any other technology (including Linux), of course using a different approach to architecture (which is entirely possible), how would you have not to throw away that investment?

What seems to be promoted here is “stay with IBM , use their stack”. I have all respect for the power of the IBM mainframe platforms, but using “openness” as an argument in this context and for the conclusions the author is making, is nothing less than perverse.

Tuesday, September 23, 2003 2:13:52 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [4] - Trackback
IT Strategy

Here are the two PPT decks from yesterday's talks at the JAOO conference and a few notes...

Layers-Tiers-Aspects-CV-V2.ppt (1.24 MB):

This deck is about layers and tiers and highlights (well, the talk that goes along with the deck does) how I make a strict distinction between the term "layer" and "tier". "Layer" is about organizing code in order to make it more resilient against change in other layers and "tier" is about distributing layers across processes and machines and defining appropriate boundaries as well as selecting technologies to cross these boundaries. I am also advocating to generalize the "classic" 3-layer (not tier!) model of "presentation", "business logic", and "data access" and make the underlying idea a pervasive and recursive pattern for basically all code in a business app.

Any class and any module may have one or multiple "public interfaces" that may be mapped to several incoming channels bound to different technologies. The public interfaces themselves (this includes public methods of a plain class) don't implement any logic, but always delegate to a strictly private internal implementation. That implementation, in turn, will not talk to external resources and services directly, but bind to abstract interfaces and access them via factories. (I will explain this in more detail here when I can make the time to do so)

At JAOO, the short AOP section of this deck drew some furious comments from an attendee after the session, who said that I was totally wrong and the AOP worked brillantly as a general purpose programming paradigm. However, when talking to him for a while, he had to admit that he and the colleagues on his project are indeed carefully considering and defining aspect dependencies and he sort of acknowledged that while their set of aspects will work great in and by itself, but it would be hard to combine it with an arbitrary foreign set of aspects. My main takeaway from the discussion with him was, though, that (a) it's due time for Java (and C#) to get support for generics, because that may be a better tool for a couple of things he pointed out and (b) that if you give people a tool like AspectJ, they will just jump and reinvent the wheel. The aspects he said his team implemented were (in ES terms) Transactions, JITA, Tracing, Security, etc. All the usual suspects.

SOA-CV-V1-final.ppt (745.5 KB)

This deck is an updated version of the Service Oriented Architectures deck that I've been using for this year's Microsoft EMEA Architect's Tour. I've included a couple of new aspects, including a stronger endorsement of UDDI, an explanation of the relevance WS-Policy and WS-Addressing, a look at the relevance of WSDL in the presence policy and addressing and a reference (and two borrowed slides) to my friend Arvindra Sehmi's most excellent presentation  (free registration may be required) on autonomous computing and queing networks, which has become a very important part of the overall SOA story for me.

 

Tuesday, September 23, 2003 1:05:35 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [3] - Trackback
Talks | JAOO 2003
 Monday, September 22, 2003

This article on news.com is just beyond belief. Mr. Cancilla, exactly how open is OS/400 as per your definition?

Monday, September 22, 2003 10:39:29 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [4] - Trackback
Other Stuff

I am sitting here right outside the conference venue of the JAOO Conference in Aarhus in Denmark, which kicks of the Fall/Winter 2003 conference season for me. I am speaking about Service Oriented Architectures and Web Services in my first talk and will drill down on Layers, Tiers, and Services in my second talk. Unfortunately the time slots are just 45 minutes and I just can't get myself to cut too much of the content .... as usual. Later in the week, I'll go to the BASTA! conference in Frankfurt where I won't speak, but want to check out how Jörg, Achim and Michael are doing and talk to a couple of folks there.

Anyways, after my vacation and a week of orientation on what to do next, I am back in business. And after "the summer of the blog engine", I'll go back to focus more on architectural topics -- including here.

Monday, September 22, 2003 2:13:33 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
Blog | Talks
 Tuesday, September 16, 2003

The new newtelligence homepage now runs on top of it. In fact, there are a couple of features like the nested categories and the whole localization story that only made it into the blog engine, because we wanted to use dasBlog for that purpose as well.

Tuesday, September 16, 2003 4:51:48 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [0] - Trackback
dasBlog