Wednesday, August 06, 2008

BizTalk Business Rules Engine Handy functions in .NET

Working with the BizTalk 2006 R2 BRE api, I find myself going back to this code to start of as a base. These 2 functions get ALL of the versions of the policies or vocabularies.  If you want to work with only the latest, or the published ones, change the RulesStore.Filter enum to whatever your needs.

List of Policies

   1: public void GetPoliciesList()
   2: {
   3:     Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver breDriver =
   4:         new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
   5:     Microsoft.RuleEngine.RuleStore breStore = breDriver.GetRuleStore();
   6:  
   7:     Microsoft.RuleEngine.RuleSetInfoCollection colPolInfo = null;
   8:     colPolInfo = breStore.GetRuleSets(RuleStore.Filter.All);
   9:     foreach (RuleSetInfo pInfo in colPolInfo)
  10:     {
  11:         Trace.WriteLine(string.Format("bts- Info = [{0}].v.{1}.{2}",
  12:             pInfo.Name, pInfo.MajorRevision, pInfo.MinorRevision));
  13:  
  14:         //get the policies to extract rules
  15:         Microsoft.RuleEngine.RuleSet pol = breStore.GetRuleSet(pInfo);
  16:         Trace.WriteLine(string.Format("bts- Count = [{0}]", pol.Rules.Count));
  17:     }
  18: }

This is how to get a list of all policies published on the BRE database.  Once you get all of the RuleSets, you can loop through each of them to retrieve the actual rules behind them.  Before getting to the rules, you need to get a RuleSet out of the RuleSetInfo.


List of Vocabularies



   1: public void GetVocabulariesList()
   2: {
   3:     Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver breDriver = 
   4:         new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
   5:     Microsoft.RuleEngine.SqlRuleStore sqlRuleStore = (SqlRuleStore)breDriver.GetRuleStore();
   6:  
   7:     Microsoft.RuleEngine.VocabularyInfoCollection colVocInfo = null;
   8:     colVocInfo = sqlRuleStore.GetVocabularies(RuleStore.Filter.All);
   9:     foreach (VocabularyInfo vInfo in colVocInfo)
  10:     {
  11:         Trace.WriteLine(string.Format("bts- vInfo = [{0}].v.{1}.{2}",
  12:             vInfo.Name, vInfo.MajorRevision, vInfo.MinorRevision));
  13:  
  14:         //get the vocabulary to extract collection of definitions
  15:         Microsoft.RuleEngine.Vocabulary voc = sqlRuleStore.GetVocabulary(vInfo);
  16:         Trace.WriteLine(string.Format("bts- Count = [{0}]", voc.Definitions.Count));
  17:     }
  18: }

This is how to get a list of all vocabularies published on the BRE database.  If you need to see how to get to all of the definitions on a particular vocabulary, see my previous post: How to access BRE Vocabularies from .NET.


Noticed that there are some subtle differences in how you retrieve each piece of information.  For Policies you get a RuleStore while to get the Vocabularies you need to get a SQLRuleStore.


As usual, feedback is always welcome if you use this code.

Tuesday, July 29, 2008

Deploying Business Rules using C# in BizTalk 2006 R2

In one of my last project, I have been working extensively with the Business Rules Engine in BizTalk. This project contains some complex Federal/State/Company/ rules. Being a Health Management Care related project I have to deal with many issues like requirements, changing policies, rules scope to a certain type, etc.

Delivering this project took some time and effort.  Not only the requirements were *agile*, but trying to keep compliance with SOX laws was a challenge.  I can summarized all of the requirements to these 3:

Requirements:

  1. Policies have to be atomic (independent from changes to other policies)
  2. Versionning of policies and being able to execute ANY version, any time.
  3. Need to know which facts were used to determine an outcome.

For the main requirement, I have created a Master Rule that determine the outcome, then I've created several *supporting* rules that will help me determine which of the rules were evaluated. The versionning requirement was already implemented by the BRE in BizTalk.

a sample of this would be something like this:

image

It quickly became very obvious that I have to deal with lots of policies and vocabularies.  If you ever tried using the Rules Deployment Wizard, you will see that it only allows you to export a SINGLE policy at a time.  Having over 500+ policies and over 30+ vocabularies  was not going to work out.

I have found the DeployRules.exe application written by Sreedhar Pelluru from Microsoft.  Here is the original article.  I took his program and modified to meet my needs.  Since I was only testing a set of policies at a time (i.e. Federal policies only), this tool provide me the ability to only load those policies that were relevant to the type I was working on. 

I know I have learned a lot about the BRE api from reading his well documented code.  With his permission, I have posted his original work and the modifications done to it back to the community at http://www.codeplex.com/DeployRules.  Yes it is still a work in progress.

Hope this help someone out there.

Tuesday, July 08, 2008

Importing BRE Vocabulary with Multiple versions

If you ever tried merging all of the versions of a single vocabulary into one XML file, so that you can import it on a single task, you will find that even though the Rules Engine Deployment Wizard understand the file format, it has a huge limitation [Bug..?  ;) ].  It only imports the last version of a vocabulary into the Rules Engine.

image

A sample vocabulary with 2 versions.

image

When Exporting this vocabulary I can't export all versions at once.  I have to export a single version at a time.!!

However, on the import, you can import a file that can contain multiple versions on it:

image

Once you export all individual files, you can merged them into a single xml file.

The format of the merged exported vocabulary will be something like this:

<brl xmlns="http://schemas.microsoft.com/businessruleslanguage/2002">   

  • <vocabulary id="9ab458cc-427a-4cea-bb1d-224dd5f96d98" name="CustomerLevels" uri="" description="">
            <version major="1" minor="1" description="" modifiedby="awing" date="2008-07-07T23:22:33.401-04:00"/>
            <vocabularydefinition id="b36b276e-451d-4783-8a06-623823211f85" name="Silver" description="Silver Description">
                ....................
        </vocabulary>

   

  • <vocabulary id="2422362a-77c0-4d0f-b2aa-fe6c1fe1f1d7" name="CustomerLevels" uri="" description="">
           <version major="1" minor="0" description="" modifiedby="awing" date="2008-07-07T22:39:37.19-04:00"/>
            <vocabularydefinition id="ba912d07-f96d-49ac-a2c4-e619fcec027e" name="Silver" description="Silver Description">
                ........................
        </vocabulary>

</brl>

As you can see there you can add as many versions to this file as you want.  However, the ReDeployWiz.exe only publish and import the latest one.

Trying to figure out why this is the behavior, I used my good old friend Reflector. Bringing Reflector on the Rules Engine Deployment Wizard, I see that there is a call to the RuleSetDeploymentDriver namespace. This doImport method calls the driver.ImportAndPublishFileRuleStore to import and publish at the same time.

RuleSetDeploymentDriver

image

It seems that there is no way around this call.  It seems to be a limitation on the use of the tool.  This ImportAndPublishFileRuleStore seems to only work on a single version at a time.  If you split the versions into their own file, it can handle it. The down side of this, is that you need to make multiple calls for an import.  And let's face it, the whole nature of versioning the policies and vocabularies becomes very cumbersome when you have over 500+ rules with multiple versions in them [yes, my current project has over 500+ policies and over 30+ vocabularies]

To get around this limitation on the tool, you will have to write your own application to deploy/export all versions of a vocabulary.  To accomplish this you will need to to call the SqlRuleStore namespace instead of the RuleSetDeploymentDriver.  This namespace have the ADD method which contain several overloaded parameters. One of which it allows you to publish or not publish your vocabulary.

image

Here is my sample code to import ALL versions of a vocabulary in .NET code:

    1 private static int ImportVocabulary(string filename)
    2 {
    3     int result = 0;
    4     // FileRuleStore - gives access to the BRL (XML) file containing policies and vocabularies
    5     FileRuleStore fileRuleStore = null;
    6 
    7     // RuleSetDeploymentDriver has the following important methods            
    8     Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver dd = new Microsoft.BizTalk.RuleEngineExtensions.RuleSetDeploymentDriver();
    9 
   10     // SqlRuleStore - gives access t0 the rule engine database
   11     SqlRuleStore sqlRuleStore = (SqlRuleStore)dd.GetRuleStore();
   12 
   13     //Get VocabularyInfoCollection object based on the file
   14     fileRuleStore = new FileRuleStore(filename);
   15     VocabularyInfoCollection vocabularyInfoList = fileRuleStore.GetVocabularies(RuleStore.Filter.All);
   16     foreach (VocabularyInfo vocabularyInfo in vocabularyInfoList)
   17     {
   18         string vocabularyNameWithVer = string.Format("{0}.{1}.{2}", vocabularyInfo.Name, vocabularyInfo.MajorRevision, vocabularyInfo.MinorRevision);
   19         ExtractVocabularyNameMajorMinor(vocabularyNameWithVer);
   20         VocabularyInfo vi = new VocabularyInfo(App.vocabularyName, App.vocabularyMajorVer, App.vocabularyMinorVer);
   21         Vocabulary oVoc = fileRuleStore.GetVocabulary(vi);
   22         sqlRuleStore.Add(oVoc, App.publishVocabulary);
   23     }
   24     return result;
   25 }

There, now you don't have to be bound to import a single vocabulary version every time you need to move your rules from DEV to UAT to PROD.


Hope this saves someone lots of time and grief.  Happy BRE'ing... ;)

Friday, June 06, 2008

MOCSDUG: ESB Guidance Toolkit for BizTalk 2006 R2

Last night 2nd meeting was just as good as the first one.  Richard Broida gave a good overview of some of the key points for the ESB Guidance toolkit, as well as some good background info on having a good architecture base.

There were some BizTalk developers in the room and there were some other ones that were interested on BizTalk. Somehow, the seating arrangement turned out to be all BizTalk developers in the middle section and everyone else out on the sides. ;)

Richard's blog is http://gloriousmonster.blogspot.com/, and I'm waiting for his slide deck to show up at the MOCSDUG site.

ESB Guidance Toolkit for Biztalk 2006 R2 

I have been interested on the ESB Guidance toolkit, and after tonight's meeting I have decided to install it and try some of their samples.  Of interest to me are the Message Repair block and the Exception Handler block.  Will post on my findings on those blocks when I get them running.

Wednesday, May 14, 2008

Distinguished fields of type xs:dateTime not Working on Orchestrations

Writing a spyke for a simple program, I came out with this odd behavior when I try to compile my BizTalk project.

image

I have created a simple schema, and in one of the fields I have field of type xs:dateTime. Well, when I have tried to use this field on an expression shape, I get this build compiler error:

'System.Xml.XmlDocument' does not contain a definition for 'XXXX'

where XXXX is the field name of the element that I have declared as a xs:dateTime type. I then went and set it up as a distinguished field. Here is a sample generated xml from my test schema:

  1. <ns0:Customer xmlns:ns0="http://DistingProperty.Test.Customer.v1">
    <FName>FName_0</FName>
    <DOB_datetime>1999-05-31T13:20:00.000-05:00</DOB_datetime>
    <DOB_date>1999-05-31</DOB_date>
    </ns0:Customer>

and this is the schema that I have used


image

When I am trying to use the distinguished field inside an expression shape, noticed that I get the Visual Studio IntelliSense:

image

When you try to read this value, it will always complain about the XmlDocument not being able to find the definition for the field that is defined as DateTime.

To get around this, you should use the System.Convert.ToString() instead of the .ToString() function;


1 Trace.WriteLine(" bad:[" + msgIN.DOB_datetime.ToString() + "]");

2 Trace.WriteLine("good:[" + System.Convert.ToString(msgIN.DOB_datetime) + "]");



Another lengthy way to get around this issue is to assign the distinguish field to an xmlNode and then use the xml Namespace Manager to get to the node value instead.

The code on my expression shape looks like this:


1 System.Diagnostics.Trace.WriteLine("bts- In here");

2

3 //assign values to person

4 xDoc = msgIN;

5

6 xmlnsMgr = new System.Xml.XmlNamespaceManager(xDoc.NameTable);

7 xmlnsMgr.AddNamespace("ns0", "http://DistingProperty.Test.Customer.v1");

8

9 xNode = xDoc.SelectSingleNode("/ns0:Customer/DOB_datetime", xmlnsMgr);

10 System.Diagnostics.Trace.WriteLine("bts-[" + xNode.OuterXml + "]");

11

12 xNode = xDoc.SelectSingleNode("/ns0:Customer/DOB_date", xmlnsMgr);

13 System.Diagnostics.Trace.WriteLine("bts-[" + xNode.OuterXml + "]");

14

15 //this works as expected

16 System.Diagnostics.Trace.WriteLine("bts- " + msgIN.FName);

17


Which ever way you choose, this looks like a limitation on the way the XLANG/s in the Expression shape interprets the command code.

Monday, May 12, 2008

How to Setup Windows SharePoint Services 3.0 with BizTalk 2006 R2

Today I have found this error AGAIN.! [old post]

Setup is unable to proceed due to the following error(s):
This product requires ASP.NET v2.0 to be set to 'Allow' in the list of Internet Information Services (IIS) Web Server Extensions. If it is not available in the list, re-install ASP.NET v2.0.
Correct the issue(s) listed above and re-run setup.

This time I am installing WSS 3.0 with SP1 on a Windows 2003 - SP2 machine.  This is a greenfield installation of BizTalk 2006-R2.

Noticed that on my IIS Manager, there is no ASP.NET 2.0 service extensions

image

I ran the standard command that *everyone* should have memorized by now... ;)

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -iru -enable

Now, when I open my IIS Manager I see the ASP.NET v2 service extension enabled

image

Running the setup.exe for WSS works fine now. 

Hint:  Don't forget to select Advanced settings and then select  the Web Client configuration.  This is a necessary step, if you want to specify the name of the database where the WSS configuration will exist.

Thursday, May 08, 2008

Error trying to re-install SQL Server 2005 on a Failover Cluster environment

I had to un-install the SQL instance that I have on my virtual cluster.  The reason?  I could not get the Service Pack 2 to be recognized by my BizTalk configuration.  Apparently, the SP2 that I had installed was the 9.00.3027.0 and not the 9.00.3042.1  Monish pointed that out that I might have an older version of the Service Pack [he is the only person I know that reads those EULA information...]

 9.0.3027.0  - 12/1/2006 11:17am 9.0.3042.1  - 9/5/2007 12:09am

I am trying to start from scratch the installation of SQL 2005, and when I run the setup I get this message:

image

TITLE: Microsoft SQL Server 2005 Setup
There was an unexpected failure during the setup wizard. You may review the setup logs and/or click the help button for more information.

For help, click: http://go.microsoft.com/fwlink?LinkID=20476&ProdName=Microsoft+SQL+Server&ProdVer=9.00.1399.06&EvtSrc=setup.rll&EvtID=50000&EvtType=datastore%5cmachineconfigscopeproperties.cpp%40InvokeSqlSetupDllAction%40SqlInstallConfigScope.InstanceName%400x2

Well, clicking on that link, does not provided any more help. Click on the help and I get this other screen:

image

the last line tells me about the event type that has failed:

datastore\machineconfigscopeproperties.cpp@InvokeSqlSetupDllAction@SqlInstallConfigScope.InstanceName@0x2

Now, I have the code that causes the installation to fail. What's next?  ;)

Then I found this other technical article on the MSDN 925976, this suggested cleaning up the registry. I went and clear all of the registry entries from my SQLNode1 and I still get the same error.  I then follow the same instructions on my SQLNode2.  This still did not allowed me to run the setup.  So I went one step deeper and instead of removing just the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\ registry key like they suggested, I removed all hives starting from HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server.

Success..! now I am able to run the setup on my primary node, and I *WILL* install the correct Service Pack this time.. ;)

Monday, April 21, 2008

Day of .NET - Wilmington, OH

CIMG5741

One more year of an awesome event. 

Jeff Blankenburg has started what seems like a great tradition: Poker night...!  After the appreciation dinner, we were all invited to room 506 for a poker night. It was amazing that almost everyone went up to the suite to just hang out.  There was an equally amount of people in there just watching than playing.

Hopefully, Jeff will remember to bring something *ELSE* for those of us that just want to hang out and don't play poker. [Xbox 360 / Wii ;).  It was a different way of bringing together all of the masses to a room where we could talk. thanks Jeff.

Sessions that I attended: 

  • Mobile with Nino: I thought that the topic was very interesting; however, I think Nino was not all there.  Maybe that trip to the MVP summit was too tiresome for him ;)  His presentation was good, but I think he could have done a lot better.  I could not attend his 2nd talk on Mobile development, but I heard it was very interesting as well...
  • XML Capabilities in SQL with Jason was great.  Learn a couple of things that I have added to my to-do task of things I want to try when I have some spare time.
  • Soft Skills with Brian.  What can I say, Brian delivered another thought provoking talk, good pointers in there.  I am lining up for the swag-monkey position for next time. ;)
  • Reliable messaging with WFC with James was good.  WFC is one of those topics that are so vast, and James really nail down the point that he was trying to make. He lived up to his *twitter promise* and in fact it was a MUCH improved talk from last year.
  • Agile Practices and TFS with the comrade was good.  I like the way that he show the agile implementation by using a tool like TFS.

I had a blast at this day of .NET event.  The new location was awesome.  We all got to eat sitting at a table.!! (unlike last year's... ;)

Following last year's tradition, it was Monish time to oversleep. And HE did.  I have never seen a Prius doing more than 70mph (or for that matter Monish driving THAT fast...;)  One thing is that me and Alexei learned is that Monish does not know how to avoid things on the road. On the way to finding a Bob Evans for early breakfast, he hit a dead skunk.! Even thought we smell the dead skunk and saw the body over 100ft ahead.!!

Looking forward next year's when it will be Alexei's turn to drive... ;)

Tuesday, April 15, 2008

VPC 2007 not running on Virtual Server 2005 R2

I have been trying to port a VPC 2007 to run on our Virtual Server 2005 R2 with no success. This is the error I am getting:

Virtual Machine
The "Virtual Hardware Standard" (Virtual PC 2007) in the configuration .vmc file for "XXX Server" was not created by Virtual Server. "XXX Server" can start, but some settings may be changed and some settings may not be used.

other errors that I am getting:

Virtual Server
The virtual machine “XXX Server” could not be started. An unexpected error occurred.

Virtual Machine
"XXX Server" could not be started because a disk-related error occurred.

I am still not sure as to what the error is. So I ran the Inspect and also the compact utility on the hard drive hoping that this action might *magically* fixed this issue.

Virtual Server 2005 R2 Pending Actions

I get the message that it did succeed compacting:

Virtual Disk Operation
The virtual hard disk "E:\Virtual Machines\XXXServer\BaseWin2K3 Hard Disk.vhd" was compacted.

However, I still get the unexpected error message. At this point, I decided to merge the diff disk with the parent and then keep a single file. Clicking on the Merge virtual hard disk link yielded this:

Virtual Server 2005 R2 Merging Disk

After this is done, I get this message:

The parent virtual hard disk appears to have been modified without using the differencing virtual hard disk located at "E:\Virtual Machines\XXXServer\W2K3 Diff.vhd". Modifying the parent virtual hard disk may result in data corruption. It is strongly recommended that you lock the parent virtual hard disk to prevent this in the future. If you recently changed time zones on your computer, you can safely continue using this virtual hard disk.

So, I decided to create a new virtual machine. First step, I deleted the VMC file. Then create a new Virtual Machine with no Virtual Hard Disk defined.

Attach a virtual hard disk later (None)

After that was done, clicked on the Configurations for that new Virtual Server, then clicked on the Virtual Hard Disk properties, and added the Virtual Hard Drive that was merged earlier:

Virtual Server 2005 R2 - add existing VHD

Started the New Virtual machine, and PRESTO..!! it's alive [muahh, muahh, muahh] and it has all of my latest changes into it.

Thursday, April 03, 2008

Blue Screen on Vista SP1

Do blue screen still exists in the new and latest Operating system from Microsoft... ?

image 

[Main Instruction]
Windows has recovered from an unexpected shutdown

Problem signature:
  Problem Event Name:    BlueScreen
  OS Version:    6.0.6001.2.1.0.256.4
  Locale ID:    1033

Additional information about the problem:
  BCCode:    a
  BCP1:    0000000000000000
  BCP2:    000000000000000C
  BCP3:    0000000000000001
  BCP4:    FFFFF800026742D4
  OS Version:    6_0_6001
  Service Pack:    1_0
  Product:    256_1

Files that help describe the problem:
  C:\Windows\Minidump\Mini040208-01.dmp
  c:\temp\WER-374105-0.sysdata.xml
  c:\temp\WER6B5F.tmp.version.txt

Clicking on the Check for Solution button, it deleted those files and close the dialog box really quick.  So I went and check on the Windows Error Reporting folder located at C:\ProgramData\Microsoft\Windows\WER\ReportArchive

In there I found two files:  Report.cab and Report.wer.  Opening the Report.cab yield those 3 files reported on the Dialog box.

image

Now I went and open the version.txt file:

Windows NT  Version 6.0 Build: 6001 Service Pack 1
Product (0x4): Windows Vista (TM) Enterprise
Edition: Enterprise
BuildString: 6001.18000.amd64fre.longhorn_rtm.080118-1840
Flavor: Multiprocessor Free
Architecture: X64
LCID: 1033

The sysdata.xml contains a list of all of the drivers currently loaded:

image

so right now I don't know what caused the blue screen, and I am not sure if this information was ever transmitted to Microsoft.  For the record I have a Dell D820 with 4GB Ram running Vista Enterprise 64bits.

I have started to see more and more people getting blue screen's on Vista after they installed SP1. Coincidence?  ;)

Wednesday, April 02, 2008

MOCSDG: Mid Ohio Connected System Developer's Group - OSLO

Yeah, the first meeting of this group will be kicked off this Thrusday.!! Don't miss it. If you want to be on the mailing list, email Monish and he will add you to the list. The meeting will be held at the Microsoft Office in Columbus, OH.

This first meeting, is going to be started with a presentation from Delbert Murphy. He is one out of 90 MCA's that holds this certification. He is the only Certified Architect in both Microsoft .NET and Java that I have met. So this is a good opportunity to meet him (even if you DONT believe in Certifications... blog post coming....;)

He will be talking about OSLO, which is not just the next version of BizTalk, but the next generation of a unified platform for integrating applications and services. (lots of buzzwords... ;) This is all part of the Connected Systems Division at Microsoft and I believe these set of technologies that Microsoft is working on will have everything including the kitchen sink!! Elkay Mystic Kitchen sink Don't believe me?

... the technology to deliver these capabilities will be delivered through BizTalk Server "V6", System Center "V5", Visual Studio "V10", BizTalk Services "V1" and .NET Framework "V4". The code name for this effort is "Oslo"...[read whole article]

  1. Visual Studio v.10
  2. System Center v.5
  3. Biztalk Services v.1
  4. .NET framework v4.0
  5. Biztalk Server v.6

and that is very powerful.! And if you are a Challenge Junkie like Brian said, then OSLO will give you something to get excited about.

Tuesday, April 01, 2008

ReSharper 4.0 upgrade

I am taking the plunge and going for the EAP nightly builds of ReSharper.  Since I have started using Visual Studio 2008, and it is REALLY annoying having to disable ReSharper everytime I want to do any work on it. Plus Harman talks so much about the new features and how they are very stable. So if HE uses it, why not me. ;)

So far, I have an un-easy feeling about this and the message does not provide any comfort...image

Hope that QSI Management hurries up and approved that PO to buy us personal licenses of ReSharper before I run out of trial days.

Here is what happened to my v.3.1 License: License to version 3.x is not acceptable since issued before 12/21/2007.

image

30-days trial vs Full license... argghhh..

image

 

let's see what happens after 30-days.!

image

Sunday, March 30, 2008

DVD Collection = 800..!

I have finally reached a milestone [800 dvd's..!] in my DVD collection.

image

These are the last 25 dvd's that I have added to my collection. The software that I used to keep track of my massive collection is DVD Profiler.  This software allows me to keep track of all of the details on my collection.  From how much I have spent, to when did I purchased it, location, etc.  It also allows me to keep track of dvd's that I have loaned to friends. There is even a section about ratings, choosing a random movie to watch, etc.  Well worth the price of it [$25.00]. The price includes putting your collection online. Here you can view my complete collection online.

image

General information on my collection.

image

noticed that the average price for this year is about $6.13 / dvd..!!

image

The number one question I get asked is how much have I spent?  Not a secret. In this chart you can see, is not that I am buying less in the past 3 years.  Instead, it is that the price of the DVD's have significantly come down.  Also, I am buying mostly used DVD's, so it affects the average price I am paying for them.

image

Tuesday, March 25, 2008

Shutdown Event Tracker

A small annoyance.  When I get a Virtual PC image that has Windows 2003 on it, it seems that the I am always looking for this information on google on how to disable the Event Tracker.

image

Here is a good article that I used all of the time

Disable Shutdown Event Tracker Windows 2003

Now, I won't loose it... :D

Thursday, March 20, 2008

Windows DNA and Biztalk 2000

Being the certification freak, I subscribe to anything Microsoft related. A few weeks back, I have received an email notifying me that the Exam for BizTalk 2000 is going to be retired.! http://www.microsoft.com/learning/exams/70-230.mspx

Of all of the certification tests that I have taken, this is the one that has the most meaning to me.

It's been almost 10yrs since I first hear about this product. Why BizTalk? This is my story. Right at the beginning of the dot COM era, I was an independent consultant doing COM and MTS. I actually knew how to get Windows NT4 to work with DCOM. Those were the years that I have abandoned C++ and their MFC for VB4 and VB5.

I remembered being part of the beta tester for VB5 and VB6 and signing NDA's. I was just starting to play with SQL Server 6.5 when I got this offer from a consulting company up north. They were based on Michigan and they were looking for Developers to work on this new joint application with Ford Motors [carpoint.com]. They mentioned that I would be working alongside Microsoft Consultants developing this new application that was going to revolutionize the automobile industry. I passed all 2 tech phone interviews and drove up there to meet them. Everything went fine, and I did get the Michigan Battle song played while talking to one of the PM's.! Funny, I don't really care about Football.

When the offer came, there were so many factors that I had to take into account. It was just about the same that I was making at that time in Columbus, so the money factor was not there. The challenge factor was there. It was the beginning of Internet boom, and as I can remember signing bonuses and stock options were very popular. Moving up north did not seem like a good career move, so with great dispair, I passed on this one offer.

2 years later, I am playing with this technology preview called BizTalk. Oh yeah, that was it. I am still doing the *what-if's* all of the time.

The buzzword of the day back then was Windows DNA [Windows Distributed InterNet Applications Architecture], then Microsoft stated their new strategy with the eCommerce .NET servers: Commerce Server 2000, Exchange 2000, SQL Server 2000, Application Center 2000, ISA 2000, BizTalk 2000 and some other that I can't remember. And BizTalk was one of the main core that will glue them all together.

I embraced this technology fully. It was the time that there were lots of mergers and acquisitions. Integration was starting to become a real enterprise problem. I had my share of integration projects with Unix and Windows.

The certification for this BizTalk 2000 did not come out until about 2001. I had to admit, I had to take this test 2 times to pass it. There were no materials to study for. At the time there were only 2 books that I could study from:

MCSE Training Kit: Microsoft BizTalk(tm) Server 2000 (Exam 70-230) (Hardcover) Microsoft BizTalk Server 2000 Administrator's Guide (Hardcover)

So finally I conquered this test.

image

Now, after obtaining every single BizTalk Certification (including the ones that dont exist... ;), I can only say that I will miss this test the most for the significance it had in my life..

It is amazing to sit here and think that this product has evolved so much in the past 10yrs. I can't hardly wait when Oslo comes out.

Monday, March 10, 2008

ADIOS

Mom and Dad - 1964
Arnulfo Wing Caceres
Born: August 15, 1938
Decease: March 4, 2008
Married: October 18, 1964

fyi, my dad passed away at 5:30am, I arrived at 2:10pm. :S

Friday, February 29, 2008

Grok talk on Business Rule Engine Essentials

I have presented a grok on BRE essentials tonight at our monthly Solutions Group meeting.  The main focus on my presentation was to give a quick glance at what is available to developers when they enter the realm of BizTalk.  Some smart guy once said that knowing what's available out there is half the battle.

Anyways, the main points of my talk was to show how you can interface with the BRE (from BRE to .NET, and from .NET to BRE).  I have found the BizTalk rules engine to be very efficient and fast.  In the last project we have, we had over 450+ policies, and each policy had an average of about 5-7 rules on each of them.  On top of that I had an orchestration that call the vocabularies, determine the policy that needed to be executed, and then execute that policy.  The time for all of this to happen, is between 1-2 seconds from the time the message enter BizTalk to the time it gets send back to the calling routine.

How do you show this much functionality in 20 minutes or less?  Well, I came out with this fictitious company that had the following requirements:

image

The first thing that you do in BizTalk is that you need to define the schemas that will contain the inputs and output of the message that you are dealing with.  So a simple schema:

image

Next, I have implemented those rules in the BRE composer

image

So now that I have the rules implemented, we need to get a way to call them and executed them.  Here is the sample solution code that will call this policy.

I have also included some code that shows how to call the vocabulary.  And some code to show how to implement a .NET assembly that can be called from the BRE.

image 

 

Feedback [good|bad] is always welcome.  Hope this help someone get a small peek into the vast universe of BizTalk.

Friday, February 22, 2008

How does a BizTalk guy pack?

From Brian Prince's questionnaire, here is my response.

A BizTalk guy knows that the whole world could be fit into a set of enterprise patterns (scatter/gather, aggregator, resequencer, etc).   So, we don't pack, we orchestrate the moving of all of the other so called *entities*.

Moving is what BizTalk does best.  A BizTalk guy will correlate the moving to a scatter/gather pattern application.  Each crate will be considered a message, and the content of each crate will be the message content. Since BizTalk is all about messages (your stuff),  each crate will be labeled (just like a promoted property) and it will be marked with a GUID (Angie...;). 

Once the contents are inside the Crate, the labels will be used for routing and destination.  As each crate is handled by different external entities, the content will still be private, yet still managed to be transported to the correct destination.

A BizTalk guy does not care what's inside each crate (Message content), all it cares is that it is delivery correctly to the final destination.  The order of the crates departing the old office will not be the same order as they arrived to the new office.  But it is OK, since a BizTalk guy knows how to handle asynchronous messages and knows about scheduling, service window, failed delivery and re-routing.

A BizTalk guy will set a pipeline component that will take all of the inputs and translate them to a canonical message (Crate). A BizTalk guy will take all of these crates from different sources (admin, sales, recruiting, pmo, app dev, management, etc) and orchestrate a smooth move by processing them by their labeled information and not their content.

Being BizTalk of course, this crate will have a guarantee delivery that the contents are the exact same that when it was submitted.  The BizTalk guy will create an orchestration that implements the scatter/gather pattern.  All boxes are then send out in no particular order, to different locations, but they will be find their target destination correctly.

Since this is going to be an asynchronous transportation, the BizTalk guy will make sure that a single receive port location will handle the gather pattern and a confirmation receipt will then be issue. A confirmation receipt can then be handled and after the identity is confirmed a FAB key can be issued.

Of course, a BizTalk guy will create an orchestration:

image 

and then attach another orchestration to it

image

so while other entities talk about

  1. Some Borat character(Uzbekistan) and/or browsers add-ins ,
  2. how cool is to stay late coding for free ,
  3. about boxes and their colors ,
  4. color boxes labeled v.2.0 that are not yet delivered,
  5. how to pack a box in 5 minutes, versioned it, and then unpack it and repack it on changesets,
  6. how to move your stuff by writing random xml code,

only a BizTalk guy does know how to move and in the process deliver quality  :P

Not only a BizTalk guy will deliver all crates and their contents to its destination, but it can also get real time monitoring (BAM) on the moving process and then once the move is done, we can provide with KPI's on the whole process as whole, bringing meaningful reports for ROI.

yeah, that's right... ;)

Thursday, February 14, 2008

How to restore TMM settings

If you have deleted the TMM settings from your task scheduler as I have mentioned on my previous post, and need to get them back, here is the xml. Create an xml file and copy the following xml to it and import this file into your Task Schedule under the MobilePC hive:

image

---- Cut here 8<----

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Source>MobilePC Display Handling</Source>
<Author>Microsoft Corporation</Author>
<Description>Microsoft Transient Multi-Monitor Manager</Description>
<URI>Microsoft\Windows\MobilePC\TMM</URI>
<SecurityDescriptor>D:(A;;FA;;;BA)(A;;FA;;;SY)(A;;FR;;;AU)</SecurityDescriptor>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<Enabled>true</Enabled>
<Delay>PT00M02S</Delay>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Users">
<GroupId>Authenticated Users</GroupId>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Users">
<ComHandler>
<ClassId>{35EF4182-F900-4632-B072-8639E4478A61}</ClassId>
</ComHandler>
</Actions>
</Task>

------ cut here 8<-----