Color Schemes in SQL 2005 Management Studio

Link. October 31, 2007. Comments [2]. Posted in: VS Color Scheme

As many of you know, I spend time every now and then coming up with new color schemes for Visual Studio 2005. It's fun, and having a good color scheme can make all the difference in the world to your eyes when spending long times in front of your screen writing code.

I use dark backgrounds, so it was always painful to switch to SQL Server 2005 Management Studio to write SQL code, because I had not configured a custom color scheme there. I also didn't want to have to spend more time doing so, particularly since Management Studio has no Import/Export Settings wizard.

Enter VSColorsToSql

This is a simple utility I wrote last night that will port your current VS2005 Fonts And Colors Settings (just for the code editor, mind you) to Management Studio. It's nothing fancy, so all it does is copy some registry settings around. Here's my current scheme:

SqlColors

It does make some assumptions and and a few changes: Turns out the SQL and XML editors in VS use different settings than the corresponding ones in Management Studio! Hopefully, the mappings I selected will give you something usable as well.

Just to be on the safe side, you can export your existing Management Studio settings by backing up this registry key:

HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\90\
Tools\Shell\FontAndColors\{A27B4E24-A735-4D1D-B8E7-9716E1E3D8E0}

You can download the code from here.

kick it on DotNetKicks.com

VS2008 Beta 2 VMs Expiration

Link. October 30, 2007. Comments [1]. Posted in: .NET

As most will probably know, turns out the Visual Studio 2008 Virtual Machines had an OS expiration date of Nov 1st, so they'll soon stop working. According to Jeff Beehler, the updated VMs have been posted for download now.

However, when I visit the download page linked in his post, the first thing I notice is this big bold announcement:

THESE IMAGES WILL EXPIRE ON NOVEMBER 1, 2007. UPDATED IMAGES WILL BE AVAILABLE AFTER OCTOBER 29, 2007.

So are these the updated files or not? Does anybody know?

Update: The page has been updated and it seems the new downloads are really up this time. Fingers crossed ;-)

View White Space

Link. October 29, 2007. Comments [2]. Posted in: Tools

Quick question: How many of you use the 'View White Space' feature in Visual Studio?

In case you're not familiar with it, this feature makes the VS code/text editor display a small dot everywhere there's a space and a small square at the end of the file, thus making it easier to visualize white space. Here's how it usually looks:

Whitespace

The 'View White Space' feature can be activated through the Edit -> Advanced -> View White Space menu option, or using the Ctrl+R, Ctrl+W key combination (at least on my keyboard layout).

Personally, I only use this very rarely, though I admit it is occasionally useful, for example when working with positional flat files. I do wonder, is there any of you that uses it full time while coding?

Outlook 2007 and IMAP

Link. October 26, 2007. Comments [2]. Posted in: Tools

As everyone and their mothers already know, Google recently started activating IMAP support on Gmail, and it looks like most people seem pretty excited about the announcement.

Now, personally, I seem to get by fairly well just using good old POP3 access, and a few filters on the server and my own custom list of folders on my Outlook PST files where I organize mail I want to keep. It's not exactly elegant, but it's what I'm used to and sort of works, though I'll be the first to admit it is kind of awkward to have some email here and some email there and in different locations.

I've never really used IMAP, but I'm willing to give it a try, who knows, maybe I've been missing out on all the fun! So what do I do? I go into outlook, delete my old Gmail account, and create a new one set up with IMAP.

What is the next thing I notice? For some reason, Outlook 2007 seems to believe that if you choose to use IMAP, you're not worthy of choosing the location of your PST file on disk: the file must be on your Windows profile directory in one of those useless, awfully hidden, un-backupable directories (i.e. C:\Users\<user>\AppData\Local\Microsoft\Outlook\...). Isn't this an extremely silly restriction to have on a mature, v12 product?

Vista Performance Update

Link. October 25, 2007. Comments [0]. Posted in: Vista

A few weeks ago I commented I had found a very promising lead in trying to find out the cause of my performance problems in Windows Vista, in the services/drivers for my simple Microsoft Lifecam VX-6000 webcam.

I can now say that indeed disabling this service has caused a dramatic improvement in performance and responsiveness, and since disabling it I haven't experienced the "machine locking paging frenzy" I was constantly running into.

Now that I feel more confident about the machine not locking up (and now that I resolved my bluetooth issues as well), I've also gotten rid of the pagefile and I switched off Aero and I'm using Vista Basic. It's not as nice looking (alright, the light blue window borders/backgrounds are as ugly as they come), but the machine definitely seems more responsive. It also helps that once you do this you get rid of dwm.exe's memory eating disorder  (and yes, that's another process that loves to page a lot).

All of this definitely makes living on Vista a lot more bearable (though by no means a WOW experience or anything). Oh well, at least this way I don't have to give up Spider Solitaire yet ;-).

Where do you put your braces?

Link. October 24, 2007. Comments [6]. Posted in: Development

If you're writing code in a programming language derived from C (i.e. one of those with pesky curly braces), where do you like putting your braces?

Some people like putting the opening brace on a line by itself right after the declaration/statement:

 NextLineBraces

I'm one of those that usually does this. It just was something I got used to from my C/C++ days and since it was the common convention in .NET back when I started fiddling around with it in 2000/2001. So this is usually what I use when coding on C#.

However, other people like to put the opening brace inline with the declaration/statement:

 InlineBraces

This question is brought to you courtesy of me noticing that IronRuby favors the "inline opening brace" style.

Actually, I use the inline-opening-brace style myself when I'm working with Java. I don't mind it, but it somehow seems wrong sometimes. I mean, using different styles when working across two languages so similar? I mean, I already have enough trouble remembering stuff like string vs. String and ToLower() vs toLowerCase() to worry about how the code looks ;-).

Historical Note: A few years back I used to be weirder and used a mixed style where I used braces-on-next-line for some things and inline-opening-brace for others depending on what it was and how many lines were in between the opening and closing braces. Yes, I was (am?) anal like that. I finally gave up on it when I grew tired of fighting the auto-formatting rules in IDEs.

What style do you favor, and why?

Getting IronRuby Source from SVN

Link. October 23, 2007. Comments [1]. Posted in: .NET

Anyone else having trouble getting the IronRuby source from SVN? Checkout/update fails on my machine with the error:

svn: Failed to add directory 'trunk\src\ironruby\Compiler\Ast': object of the same name already exists

Any ideas?

Update: Yep, repository got screwed up. Looks like it is fixed now, but I had to delete the entire tree and do an "svn co ..." again.

Archiving Original Messages in BTS

Link. October 23, 2007. Comments [0]. Posted in: BizTalk

Siva Ram asks in a comment on a previous post:

"How to Archive/(copy to another location) the Source file as it is , Before the biztalk picks up the file?"

I think what he's really asking is how he could archive an exact copy of the original incoming message (possibly for regulatory compliance, auditing, or simply to provide easier tracing of problems). This is a common question, and the truth is there are several ways to approach this in BizTalk server.

Here are some options:

Double Hop: A fairly simple option is to do a double hop when processing the incoming message. Instead of parsing and processing the message right away, receive it through a pass-thru pipeline (so the message isn't changed) and route it using filters to two FILE send ports. One of them points to your archive location, while the other points to a temporary folder, from which you pick up the message again using the FILE adapter to do the real processing.

This is a rather simple way to implement this, but it can be pretty inefficient. It's particularly bad if messages are large because it involves several round-trips to the message box.

Use BizTalk Tracking: For some scenarios, it is enough to just enable message tracking in your receive location, making sure to select the option to track the message before it goes through the pipeline. Messages will then be saved in your DTA database, from which you can query and retrieve them using HAT or WMI.

Use a pipeline component: Using a custom decoding pipeline component that writes the message out as it is read by the receive pipeline is another good option. It is a bit more complex to implement, but it can be very efficient if implemented properly. Jeff Lynch has a simple Archive component you can use to start, though be aware his version will not work if you're dealing with adapters that use non-seekable streams to hold message content. My own old Tracer pipeline component might also be a place to start with this.

I hope this gives you an idea of how to start fulfilling your requirement!

Fixing Sleep in Ubuntu 7.10

Link. October 23, 2007. Comments [2]. Posted in: Personal | Linux

As I mentioned in a previous post, I did a successful upgrade of my Inspiron 6000 laptop over to Ubuntu 7.10 (Gutsy Gibbon) from 7.04 (Feisty Fawn), though sleep/hibernate wasn't working. I spent a some time yesterday trying to fix it, with some partial success.

Niels Olson was kind enough to comment on my post and mentioned some directions that worked for him on his Latidude laptop. I tried some of those, but they didn't work for me, as my laptop has an ATI X300 card instead of an NVidia. However, it gave me some good ideas to play with.

In the end, I wasn't able to get sleep working with the restricted/proprietary ATI drivers (fxglr) so I reverted back to the initial open source Radeon driver. That way I was able to get sleep working back, though the machine still wouldn't come out of sleep successfully (it just locked up).

Finally, I was able to work around this by tweaking a few parameters in /etc/default/acpi-support:

SAVE_VBE_STATE=false
POST_VIDEO=false
SAVE_VIDEO_PCI_STATE=false
USE_DPMS=true

This works, though the video takes a bit of a long time to reestablish once the machine comes up from sleep, but at least it works ;-).

Custom PropPage in R2 Sample

Link. October 23, 2007. Comments [0]. Posted in: BizTalk

As promised, here's a sample managed adapter implementing a custom adapter configuration dialog for BizTalk Server 2006 R2. It isn't a fancy sample, just a new version of my /dev/null adapter with a simple, custom dialog. It should be enough, however, to illustrate the basic details needed to get you up and running quickly.

Here's a snapshot of the configuration dialog when invoked from the BizTalk Administration Console:

Adapter4

Some things I discovered that complement my previous article on the topic:

COM Registration: The class implementing IPropertyPageFrame needs to be registered with COM. However, you won't be able to use the "Register for COM interop" option in the Visual Studio project settings for this, because you'll get an error saying that the Microsoft.BizTalk.ExplorerOM.dll assembly isn't registered. To work around this, I created a custom build step that calls regasm.exe with the /registered option.

Property Bags: Remember I said you needed to implement two versions of IPersistPropertyBag? Turns out both are indeed needed. Even the BizTalk Administration Console will call both implementations at different times.

Also, it can become cumbersome to implement your adapter configuration load/save code for both IPropertyBag implementations, so I simply wrote a small adapter class that wraps the Microsoft.BizTalk.ExplorerOM.IPropertyBag instance so that it looks like a Microsoft.BizTalk.Admin.IPropertyBag one. This way I could write code just once to serialize/deserialize the adapter settings. You can find the wrapper class in PropBagAdapter.cs,

Registry: As usual, the adapter ships with a .REG file containing the adapter registry entries. Make sure to modify the file paths there so that they point to your project's location on disk. One thing worth noting here is how now the TransmitLocation_PageProv value contains the CLSID I explicitly gave to my TransmitLocPageProvider class (which implements IPropertyPageFrame).

Download: NullAdapterR2.zip.

I think you'll find the code is pretty straightforward and should give you an idea of how to get this up and running in your own adapters, if you're interested.

Custom PropPages in Adapter Configuration

Link. October 22, 2007. Comments [1]. Posted in: BizTalk

OK, time to post some technical content again :-)

If you've used BizTalk server 2004/2006, you've probably seen the configuration dialog where you enter the adapter-specific settings on a send port or receive location. Have you noticed how some adapters simply have a property grid with values, while others have a full-blown set of custom property pages with custom dialogs? Ever wondered why?

Adapter1 The standard property-grid based settings dialog is provided by the BizTalk Adapter Framework by default, all you need to do have your adapter's MgmtClass provide the proper XML Schema (XSD) that defines the adapter options.

In a lot of ways this is very good, as it makes adding design-time configuration support for your adapters very easy, and, while it might not be the best looking UI ever, it is fairly usable and fairly standard, so it works fairly well.

Even more, the adapter framework provides you some useful ways to extend this model, with, for example, custom value editors for specific properties. There's good documentation on this on the BizTalk Documentation on creating adapters, which can be found here.

Adapter2 Other adapters, however, have a completely different configuration UI. A good example of this is the standard FILE adapter, which has several different options and two property pages. This is a lot more usable, but it does mean a lot more work on the part of the developer (after all, you get the regular UI almost for free!).

Some people have asked me recently how you could do this for your own adapters, and I really didn't have a good answer for that (that is, I had no clue!). If you look at the BizTalk documentation you'll notice that there's virtually no discussion of this topic whatsoever. I also realized that the custom UI dialogs are used almost exclusively by unmanaged adapters: FILE, SMTP, Receive Side HTTP, and so on.

Unmanaged adapter development is something supported in BizTalk right from 2004, but I can't say I know anyone doing it except Microsoft itself. It's also noteworthy that no  where on the documentation is the topic of unmanaged adapter development explicitly covered, and  certainly the design-time configuration aspect isn't even mentioned. So I was under the impression that both topics were related somehow.

Managed Adapters can have custom configuration UIs

As it turns out, however, it is possible for a regular, managed adapter to have it's own custom adapter configuration design-time experience in BizTalk 2006 R2, though it isn't very obvious how to do it.

I first realized this when I noticed that all the WCF adapters in BizTalk Server 2006 R2 had custom dialogs [1]. Looking a bit deeper I realized that the HTTP send-side adapter also had one, but the HTTP adapter is a rare beast in the sense that the receive-side adapter is unmanaged (an ISAPI extension, actually), while the send-side adapter is managed (built on top of System.Net.HttpWebRequest). Because of this, the management infrastructure for both receive and send side adapters is unmanaged, so it doesn't really count.

Sidebar: I haven't seen a way in BizTalk 2006/4 to support this yet. In particular, the interface used in R2 to support this is not even available in previous versions, and as far as I can see, unmanaged adapters implement this in a completely different way, using IPropertyPage and IPropertyPageSite, I think.

So, how does the WCF adapter do it? I haven't traced yet all the details necessary, but looking a bit with reflector and poking in the registry revealed some interesting details. Here are some things that might get you started if you decide to try this for yourself:

MgmtClass: Apparently you still need a MgmtClass for your adapter that implements IAdapterConfig (and likely IAdapterConfigValidation as well). However, your implementation of IAdapterConfig.GetConfigSchema() can simply return null, as it isn't apparently relevant.

Custom UI: You implement your custom UI by implementing a class that provides BizTalk a way to load/save your adapter settings as well as provide it with the information to create your custom dialog:

  • It needs to implement the Microsoft.BizTalk.Admin.IPropertyPageFrame interface [2]. This interface has a single ShowPropertyFrame() method which gets handed the HWND of the window you should use as your custom dialog parent (so that you can show it in modal form).
  • It needs to implement IPersistPropertyBag. Apparently, however, you need to implement it in two variations: Microsoft.BizTalk.Admin.IPersistPropertyBag as well as Microsoft.BizTalk.ExplorerOM.IPersistPropertyBag. This is probably done to support both the management console as well as the older BizTalk Explorer inside Visual Studio. This is used to both load/save the adapter configuration as well as some other stuff I'm not quite sure about yet.
  • It needs to be visible to COM and registered in the registry with a proper GUID you can reference.

Registry Settings: For your custom UI class to be used by BizTalk, you need to add a few new values in your adapter's Registry key:

  • ReceiveLocation_PageProv: This will be the GUID of the class implementing IPropertyPageFrame for the receive-side of your adapter.
  • TransmitLocation_PageProv: This will be the GUID of the class implementing IPropertyPageFrame for the send-side of your adapter.
  • InboundProtocol_PageProv: This will be the GUID of the class implementing IPropertyPageFrame for the receive handler configuration.
  • OutboundProtocol_PageProv:This will be the GUID of the class implementing IPropertyPageFrame for the send handler configuration.

I'm in the process of trying this now and I'll let you how it works.

[1] Actually, the WCF adapter creates it's own model internally to handle the custom configuration UI on top of the original extensibility model in the adapter framework, which is then leveraged by all the WCF built-in adapters and custom WCF adapters.

[2] This one is defined in the copy of Microsoft.BizTalk.Admin.dll that's in the GAC, which, oddly enough, is different from the Microsoft.BizTalk.Admin.Dll that can be found in the BizTalk installation folder.

Hello Gutsy!

Link. October 19, 2007. Comments [2]. Posted in: Linux

Yesterday was the release of Gutsy Gibbon (Ubuntu 7.10). For fun, I decided to try and see what it would mean to update my other laptop, which was running Kubuntu 7.04 (Feisty) over to the new release. I first started looking around the ubuntu forums, where I read that the "proper" way to do an upgrade was to run the following command:

gksu "update-manager -c"

Well, turns out neither gksu nor update-manager were installed on my machine, so I got those first (sudo apt-get install....), and then ran the command. It asked a couple of questions and then proceeded to download all 950+ packages that needed updating.

The entire update process was surprisingly problem-free. It took a long time, though - about 12 hours in total - but only because my Internet connection sucks and the ubuntu servers seemed to be a bit hammered. The download stalled several times, but it always restarted on it's own a while later without problems.

After the download was complete, actually installing the packages probably took less than an hour, just had to answer a couple of questions in between, and finally restart, and the machine came back up without any issues. Then I installed the ATI restricted driver again and restarted once more and it was done.

All in all, a much better experience than the last time I had tried to do an in-place upgrade of a linux distro (years and years ago!).

The only problem I've noted so far is that putting the machine to sleep doesn't seem to be working. The machine tries to go into sleep mode but doesn't quite manage it and stays on, but non-responsive. Annoying, but not that much big of a deal, seeing how sleep didn't really work well on Feisty either (about 50% of the times it went on standby it wouldn't be able to wake up).

Visual F#?

Link. October 17, 2007. Comments [0]. Posted in: .NET

I read Somasegar's post on "productizing" F# (man, that sounds ugly!). In general terms, I think this is a great idea; there are many concepts in F# that would be very welcome in a mainstream, supported tool, and I can see a lot of potential for, say, mixing C# and F# solutions together, as each one has its strengths (and add to that a bit of IronRuby to top it off).

Multi-language solutions do become a more interesting proposition when there are clear relative strengths and clear differentiation between languages, such as functional vs. imperative, dynamic vs. static; so it is a completely different proposition than, say, the old argument about mixing VB.NET and C# (which made little sense for most purposes).

On the other hand, am I the only one that had to read three or four times Somasegar's post to see what the deal was? Heck, in fact, I'm still hazy on what exactly "integrate the F# language into Visual Studio and continue innovating and evolving F#" will really mean.

Latitude D820 and Bluetooth

Link. October 16, 2007. Comments [0]. Posted in: Personal

Recently, I started having some weird, intermittent problems with bluetooth on my Dell Latitude D820 laptop. I have a Microsoft Wireless Notebook Presenter Mouse 8000 (which works fine, except for how quick it runs batteries down!) and was using the integrated bluetooth radio on my machine.

This worked fine for several months, until a couple of weeks ago when it started acting up: every now and then (and sometimes very often) the mouse would just stop responding, and you would see the bluetooth led in the machine flicker off and on again. Eventually the mouse would work again (after 20 seconds or so), though sometimes it got permanently disconnected until either I disabled the bluetooth radio and enabled it again or turned the mouse off and on again. Very annoying as it was happening very often. [1]

Finally I went ahead and called Dell support and they told me it was unlikely the bluetooth radio was bad, and to check my mouse, other devices and repave the machine from scratch, which I respectfully declined to do right now because I don't have the time for it.

I did, however, check the mouse again with another machine (worked) and disabled the internal bluetooth radio and installed the original bluetooth dongle included with the mouse, which worked perfectly again. So the mouse itself wasn't the issue.

Couple of days later I chatted with a different Dell support representative and they agreed to replace my bluetooth radio, which they did on friday. Unfortunately, it didn't fix the issue, so they decided to go ahead and schedule a replacement of the machines main board.

Today another guy came and replaced it, and, so far, seems to be working very nicely and I haven't had any problems with the mouse hanging or anything like that. I'm still doing testing but the problem seems to have gone away. It also gave me an excuse to go back to the A06 BIOS (since the new board had revision A00 on it!), which is good, because the current version (A07) apparently has an issue that causes machines to get a lot hotter than with previous versions, and it was definitely noticeable. We'll see how it goes.

[1] I did notice that it would happen every so often whenever I opened any web page that used flash (!) or started any application that used Direct X, like a game, so I wonder if something was causing an issue there because of heating or something.

Ragnarok - A VS2005 Color Scheme

Link. October 13, 2007. Comments [5]. Posted in: VS Color Scheme

Here's a color scheme for VS2005 I had created a few months ago but had not published before (I think). Ragnarok is another high-contrast scheme with a dark background, with two variants:

Ragnarok Grey - download for VS2005 | download for VS2008

Ragnarok_Grey

Ragnarok Blue - download| download for VS2008

Ragnarok_Blue

Both are using Consolas, 15pt, but feel free to change them (they would definitely look good with Damien Guard's Envy Code R using the italics-as-bold variant). I personally think the blue version looks better, and it is actually quite usable.

MSCamSvc dangerous for your health

Link. October 9, 2007. Comments [0]. Posted in: Vista

I've mentioned in the past that I've had some nasty performance problems with Windows Vista, particularly with the machine hanging at times paging so extreme that it completely freezes. Several weeks ago I completely disabled the pagefile and a few other things, and that helped for a while. It didn't remove the problem completely, but now it happened far more infrequently and freezed the machine for shorter periods of time.

This week, however, it happened several times, and I started looking a bit more closely as to what the issue is. I noticed this time it was a bit more reproducible and usually happened when I opened up "Windows Fax And Scan", an application that really shouldn't cause much trouble and that I had noticed before sometimes triggered the issue.

After digging a bit deeper, I think I found the culprit! I have a Microsoft Lifecam VX-6000. It's a simple webcam that does the trick for what little I use it, and my needs are pretty modest to begin with. I always thought the software was a little clunky, but since I rarely used it much, I didn't mind.

However, today, after the machine froze for about 10 minutes paging (remember, with no pagefile!)  I noticed that a process, started by MSCAMS32.EXE, which corresponds to the MSCamSvc service. It usually doesn't seem to use much memory, but seems to page a lot. How much? This time it was to the tune of 64'000.000+ pagefaults. Yes, 64 million pagefaults (and I hadn't even used the cam recently). The closest process in paging was dwm.exe with around 19 million.

And that's when I realized what the deal with Windows Fax and Scan was: The MS software/driver makes the webcam available to WIA (Windows Image Acquisition), which might be what WFaS uses to interact with scanner!

For now I've simply disabled the offending service, and we'll see how it goes. Nasty stuff...

IOCPs and Kernel Non-Paged Pool Memory

Link. October 5, 2007. Comments [0]. Posted in: .NET

Ayende has been doing some interesting stuff recently with threading and using the .NET Thread Pool which is based on the I/O Completion Ports (IOCP) model in the Win32 API and the NT kernel. IOCPs are a very efficient way of handling threads and thread pools and doing async I/O, so they are definitely a good fit, and it's good that the .NET framework encapsulates some of the complexity of using them (though as they are exposed to .NET reduces a bit what you can do with them and how you do so).

In one of those posts, Ayende mentioned trying to emulate the parallel structures in Erlang using the ThreadPool class, and specifically taking advantage of ThreadPool.QueueUserWorkItem() and ThreadPool.RegisterWaitForSingleObject(), and he mentioned he was running into a "Not enough storage available to process this command" error as he increased the size of the dataset he was testing with.

On a comment on the post, I mentioned that perhaps the use of IOCPs here was causing the kernel to exhaust its Non-Paged Pool memory [1], though Ayende mentioned he wasn't convinced that ThreadPool.RegisterWaitForSingleObject() would do this.

I decided to give it a try, so I added a bit of simple code around Ayende's sample and ran it, and sure enough, usage of non-paged pool kernel memory starts going off like a rocket. This is easy to verify using the Task Manager performance tab (under Kernel Memory - Non paged) or using Performance Monitor and the Memory performance counters.

That said, I don't think ThreadPool.RegisterWaitForSingleObject() is the culprit. Rather, I think what causes heavy usage of the non-paged pool memory is ThreadPool.QueueUserWorkItem(). I had vague recollections of a discussion long ago in the MS newsgroups about threading, IOCPs and finding out that IOCPs used non-paged pool memory to keep track of pending request. After searching for a bit on google, I was able to find the original thread on microsoft.public.win32.programmer.kernel. It's a long, but interesting discussion (and do note this was 1999!)

[1] The non-paged pool is a region of physical memory allocated by the kernel that cannot be swapped out to disk. Because of this, it is a very precious and limited resource, and abusing it can impact performance in a big way. There;s some discussion as to how the different memory pools are allocated by the kernel here.

BizTalk MVP + 1

Link. October 3, 2007. Comments [1]. Posted in: BizTalk | Personal

I was just awarded for the second time as a BizTalk Server MVP :-). Pretty cool, and thanks to Fernando Garcia and all the great people in the MVP program and Marjan Kalantar and the rest of the BizTalk/CSD team for talking such good care of us!

About

Tomas Restrepo is co-founder of devdeo. His interests include .NET, Connected Systems, PowerShell and, lately, dynamic programming languages. More...

email: tomas@winterdom.com
msn: tomasr@passport.com
twitter: tomasrestrepo

Technorati Profile

devdeo logo

View my profile on LinkedIn

MVP logo

Syndicate

Ads


Links

Categories

Statistics

Total Posts: 1014
This Year: 84
This Month: 3
This Week: 2
Comments: 776

Blogroll

Post Archive

Other

Copyright © 2002-2008, Tomas Restrepo.

Powered by: newtelligence dasBlog 2.1.8102.813

Sign In