May 23, 2007
@ 02:39 AM

As announced, if you are subscribed to my blog at friends.newtelligence.net or staff.newtelligence.net or have the site address in your favorites, now is the time to update those links. The old addresses permanently redirect to the new site and the associated webserver might in fact go away within a few weeks. 

http://vasters.com/clemensv is the new place. Thanks, Richard.

Categories: Blog

Having an Internet Service Bus up in the cloud is not very entertaining unless there are services in the bus. Therefore, I built one (and already showed some of the code basics) that’s hopefully fun to play with and will soon share the first version with you after some scrubbing and pending a few updates to the ISB that will optimize the authentication process. It’s a 0.1 version and an experiment. The code download should be ready in the next two weeks, including those adjustments. But you can actually play with parts of it today without compiling or installing anything. The info is at the bottom of this post.

To make matters really interesting, this sample not only shows how to plug a service into the cloud and call it from some Console app, but is a combo of two rather unusual hosts for WCF services: A Windows Live Messenger Add-In that acts as the server, and a Windows Vista Sidebar gadget that acts as the client.

Since the Silicon Valley scene is currently all over Twitter and clones of Twitter are apparently popping up somewhere every day, I thought I could easily provide fodder to the proponents of the alleged Microsoft tradition of purely relying on copying other’s ideas and clone them as well ;-)  Well, no, maybe not. This is a bit different.

TweetieBot is an example of a simple personal service. If you choose to host it, you own it, you run it, you control it. The data is held nowhere but on your personal machine and it’s using the BizTalk Services ISB to stick its head up into the cloud and at a stable endpoint so that its easily reachable for a circle of friends, bridging the common obstacles of dynamic IPs, firewalls and NAT. No need to use UPnP or open up ports on your router. If you choose to do so, you can encrypt traffic so that there’s no chance that anyone looking at our ISB nor anyone else can see the what’s actually going across the wire.

Right now, lots of the Web 2.0 world lives on the assumption that everything needs to live at central places and that community forms around ad-driven hubs. The mainframe folks had a similar stance in the 70s and 80s and then Personal Computers came along. The pendulum is always swinging and I have little doubt that it will swing back to “personal” once more and that the federation of personal services will seriously challenge the hub model once more.

So what does the sample do? As indicated, TweetieBot is a bot that plugs into a Windows Live Messenger using a simple Add-In. Bart De Smet has a brilliant summary for how to build such Add-Ins. When the Add-In is active and someone chats the bot, it answers politely and remembers the chat line, time and sender. The bird has a leaky long term memory, though. It forgets everything past the last 40 lines.

Where it gets interesting is that the Add-In can stick three endpoints into the BizTalk Services ISB:

  • A Request/Response Web Service that allows retrieving the list of the last 40 (or less) “tweets” and also allows client to submit tweets programmatically.
  • An RSS service that allows (right now) anyone to peek in to the chat log of the last 40 tweets.
  • An Event service that allows subscribers to get real-time notifications whenever a new tweet is recorded.

The accompanying Sidebar Gadget, which is implemented using WPF, is a client for two of these services.

 When you drop the Gadget on the Sidebar, it will prompt for the IM address of the TweetieBot service you’d like to subscribe to. Once you’ve authenticated at the relay using your registered Information Card, the gadget will pull and show the current list of Tweets and subscribe to the Events service for real-time updates. And whenever someone chats the bot, the Sidebar gadget will immediately show the new entry. So even though the Gadget lives on some client machine that’s hidden between several layers of firewalls and behind NAT, it can actually get push-style event notifications through the cloud!

“How do I send events to clients?” must be one of the most frequent questions that I’ve been asked about Web Services in the past several years. Well, this is your answer right here.

While I’m still toying around with the code and the guys on the 1st floor in my building are doing some tweaks on the ISB infrastructure to make multi-endpoint authentication simpler, you can already play with the bot and help me a bit:

Using Windows Live Messenger you can chat (click here) tweetiebot@hotmail.com now. Drop a few lines. If the bot is online (which means that I’m not tinkering with it) it will reply. Then look at this RSS feed [1] and you can see what you and everyone else have been telling the bot recently. Enjoy.

[1] http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss

Categories: Technology | BizTalk | ISB | WCF

May 16, 2007
@ 05:46 AM

Windows Live Alerts  I must have lived under a rock for the past several months so that I didn't see this service. Anyways, if this works as advertised, subscribing to Live Alerts using the button in this post (and the one under the blog calendar) will have Live alert you whenever my feed gets updated.

Categories: Blog

May 16, 2007
@ 04:36 AM

Abgestiegen. Macht nix. Wer Fan der einzig wahren Borussia ist, hat gelernt zu leiden. Wer keine Tore macht, steigt halt ab. 

Jeden Samstag brav um 6:15 Uhr morgens hier in Kirkland aufstehen um durch sensationellen technischen Aufwand Borussia live via Arena und zwei verlinkte Rechner und einen 400KBps Privatstream Woche fuer Woche verlieren zu sehen. Das ist Treue! (Oder grandiose, teure Dummheit). Naechstes Jahr halt Sonntags und Freitag oder Montag. Dann wird aber aufgezeichnet. 

Ach ja, und Bayern wird nicht Meister. Und Schlacke 04 auch nicht. Das ist ja schonmal was. Und Aachen steigt mit ab und Köln nicht auf. Das ist auch was ;-)

 

Categories: Borussia

May 16, 2007
@ 03:48 AM

Changes come little by little. My blog is moving. It's still sitting on the same server in Germany, but in order to take all of you with me to the new home I've flipped the switch on the domain name already. So if you are subscribed to staff.newtelligence.net/com or friends.newtelligence.net/com, this is a good time to edit that entry. Either point to http://vasters.com/clemensv/rss.ashx or directly subscribe to the Feedburner mirror at http://feeds.feedburner.com/clemensv where the first URL redirects to.

Categories: Blog

May 9, 2007
@ 10:26 PM

Mary Jo,

I don't really want to disagree with you in public, but in this instance I really think I have to. In your latest blog post you equate "community" to "everything open-source" and I don't think that makes sense. Is there a "Microsoft Community?". Sure, there is. There are active user groups with tens of thousands of members across the world focusing on all kind of aspects around Microsoft products that exist in independence or under the umbrella of INETA, Culminis or Mindshare. There are fantastic developer community sites out there like CodeProject, DotNetJunkies or ASPAlliance, we have a whole network of Microsoft-driven community sites with a lot of community engagement in forums and community samples (ASP.NET, IIS.NET, etc.) and CodePlex is actually quite impressive for hosting open source projects. The code for this blog engine is on SourceForge along with hundreds and hundreds of Win32 and .NET based other projects. 

It goes further. How about JorDev in Jordan? How about Developers.ie in Ireland? CodeZone.de in Germany? NNUG in Norway? SDN in The Netherlands? GotDotNet.RU in Russia? I could continue this list for several pages. And a lot of these groups speak and publish in their local language so their activities don't pop-up on the New York, Redmond, or Silicon Valley radar screens. In the last 4 years before joining the firm I've spoken at some 250 events in over 40 countries and I can tell you, the community you say is missing is there and very much alive. We even seem to have rabid fanboys like Apple, if someone were to believe this unbiased complaint ;-)

But to the heart of your story. You write "When the vendor whose technology you are using doesn't require your participation to create/advance its products, you tend to feel less personally vested in that vendor." The reality looks different. We require that participation and that participation happens. In fact, customer-defined requirements and quality gates are part of our release criteria these days. We broadly engage in technical discussions in blogs, we invite and solicit opinion from industry luminaries, we listen very closely to what people have to say in the forums (and file bugs and design change requests as the result of it), we speak to customers on on-site visits, we run small and big Software Design Reviews previewing and discussing very early bits or just raw ideas (my division ran such an event right after MIX on the 1st floor of the Venetian Convention Center), and there's a a lot of email (and IM discussions) going back and forth with individuals on a daily basis that helps us doing the right thing. And we're not shy changing plans if we're being told that we're not doing the right thing.

The only thing that we don't do is allowing everyone coming along to check out files from our source code depot and start coding along. If people really want to do work on the internals of the .NET Framework, we'll figure out their skills (as even open source projects eventually end up doing as they succeed and grow), see what parts of the code they can best work on for design, code or test, and hire them if it's a fit.

Lastly, to your question "Could/should Microsoft try to make Visual Studio running on Windows more appealing to Linux developers and deployers? Port Microsoft Office or SQL Server to Linux?". Should we? Not mine to decide. This point isn't about "community", at all, I believe. There's a huge, world-wide community that focuses on Windows and the .NET Framework. A significant part of the open source community build software that runs on Windows - and in very many instances even exclusively on Windows. Isn't that the community we should care about in the first place?

As much as folks with vested interest want to play the story that way, the open source community isn't all about Linux (let alone Java). I don't think anyone at Microsoft needs to have "Slashdot envy" as Scoble once put it. Our community does fantastic work and does a lot of it. It'd be nice if you'd recognize them for it.

And you write "Even though Microsoft and its products have helped a number of resellers, software vendors, peripheral makers, consultants and programmers carve out a living for themselves, most of these folks seem to consider Microsoft a job, not an adventure."  The adventure made me move from Germany to Redmond and work for the firm. The adventure has made me lots of friends all across the world. I love this stuff. So do my friends. It'd be nice if you'd recognize that as well.

Have a great day!
Clemens 

PS: I'm not cross-posting this to the MSDN blog as I usually do these days. This is my personal opinion and one motivated by me feeling to be very much a member of the community that you say doesn't exist.

Categories: Blog

May 8, 2007
@ 03:45 AM

One of the neat features of dasBlog is that the statistics pages filter out search terms so that I get to see all the search terms that lead into my blog. Some are quite naughty, some are very funny (especially the dozen-or-so daily search terms for "alien" that land here), some have a surprising search rank, and some are like this: forgot password windows server 2003. I'm really sorry for that fellow ...

Categories: Blog | dasBlog

May 8, 2007
@ 03:07 AM

After roughly 15 months of working for the firm I've got to say that while it was fun talking about the .NET Framework and BizTalk at conferences and in writing, it's quite a bit more fun to be part of building the .NET Framework and BizTalk. You could be part of it, too, if you have the Jedi skills it takes. [The listed Assistant job requires the mastering the art of coordinating the Jedi Council's schedule across the galaxy; you just believe me - and that's just a small part of the job]. The good news is that we're growing quite a bit:

Job Title

Job Category

Product

Location

Product Manager

Marketing

.NET Framework

WA - Redmond

Group Program Manager

Program Management

.NET Framework

WA - Redmond

Software Development Engineer in Test

Software Testing

.NET Framework

WA - Redmond

Software Development Engineer in Test

Software Testing

.NET Framework

WA - Redmond

Software Development Engineer

Software Development

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Seattle

Software Development Engineer

Software Development

.NET Framework

WA - Redmond

Product Manager

Marketing

Biz Talk Server

WA - Redmond

Software Development Engineer

Software Development

.NET Framework

WA - Redmond

Software Development Engineer in Test

Software Testing

.NET Framework

WA - Redmond

Software Development Engineer

Software Development

.NET Framework

WA - Redmond

Business Manager

Software Development

.NET Framework

WA - Redmond

Technical Writer

User Assistance & Education

Biz Talk Server

WA - Redmond

Program Manager

Software Development

.NET Framework

WA - Redmond

Assistant

Administrative Services

.NET Framework

WA - Redmond

Software Development Engineer in Test

Software Development

.NET Framework

WA - Redmond

Program Manager

Program Management

Biz Talk Server

WA - Redmond

Product Manager

Marketing

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Redmond

Program Manager

Program Management

.NET Framework

WA - Redmond

Test Manager

Software Testing

.NET Framework

WA - Redmond

For privacy and other reasons, please do not send resumes or job applications to me! Go through the jobs site. I'm just pointing to the right place ... ;-)

Categories: Microsoft

May 7, 2007
@ 11:00 PM

Steve Maine explains what's in the newest revision of the BizTalk Services SDK, including quite a few (standalone-) surprises for WCF and WF developers. In case you haven't noticed, we've dropped a new and substantially expanded build of the SDK just a week after we published the first SDK.

Stop. Don't leave yet. Before you say "What do I care about BizTalk?", you should know that while BizTalk has been more or less associated with the BizTalk Server 200x product line in the past few years, (Codename-) BizTalk Services is a complementary set of functionality that's not only interesting to BizTalk Server customers, but really to all .NET developers.

Weird? Flip flopping? Confusing? No. The fact that BizTalk is not only BizTalk Server isn't really new. When BizTalk came out back in 2000 and I was very closely looking at what's going on (get it used for $2), the definition read like this in the press release:

The BizTalk Initiative represents the collective set of investments that Microsoft is making to facilitate business process integration within and between organizations using Internet-standard protocols and formats. It includes the BizTalk Framework, the BizTalk.org community and business document library, as well as BizTalk Server 2000, a business process orchestration server and tools for developing, executing and managing distributed business processes. These investments are being made in conjunction with industry standards groups, technology and service providers, as well as key global organizations.

While the envisioned schema exchange BizTalk.org fell flat since industry-wide message-level-schema standardization for "everything" more or less didn't happen in the way people initially expected, what came out of this initiative as a significant element was that the set of specifications then known as the BizTalk Framework 2.0 that acted as a foundation for quite a few of the WS-* specifications and the BizTalk Server product which evolved into a very successful and leading SOA/BPM suite that's soon seeing its next release, BizTalk Server 2006 R2. Fast forward, read Steven Martin's blog entry where he writes:

[...] We see BizTalk Services as a complement to "traditional" BizTalk Server uses on premise. As you need to coordinate SOA on a broader scale beyond the organization, we see the introduction of hosted services as one way to help support federation of business process, messaging, and identity across boundaries. Over time, we want to ensure that BizTalk Server customers will be able to easily use the cloud services in conjunction with their premise technology. [...]

So all in all, a very sane way to think about BizTalk is that the software and services we publish under that name are providing functionality for messaging, process management and connectivity that go beyond the capability of the core .NET Framework.

Categories: BizTalk | CardSpace | ISB

I wrote a slightly Twitter-inspired, fun app over the weekend that's using the BizTalk Services Connectivity service and relay. In the spirit of Software+Services I'm going to give you half of it [for now] ;-)   You must have the BizTalk Services SDK installed to run the sample.

The server app, which I'm keeping to myself for the next few days as part of the experiment, is an extension (add-in) to Windows Live Messenger. The Messenger add-in monitors all chats with tweetiebot@hotmail.com and keeps circular buffer with the last 40 incoming messages. Using the client (which is in the attached archive), you can get a list of "Tweets" and add a new one (same as chatting)

[ServiceContract(Name = "TweetieBot", Namespace = http://samples.vasters.com/2007/05/tweetiebot)]
public interface ITweetieBot
{
  [OperationContract]
  IList<Tweet> GetTweets(DateTime? since);
  [OperationContract]
  void Tweet(string nickname, string text);
}

or you can subscribe to new tweets and get them as they arrive

[ServiceContract(Name = "TweetieEvents", Namespace = http://samples.vasters.com/2007/05/tweetiebot)]
public interface ITweetieEvents
{
  [OperationContract(IsOneWay=true)]
  void OnTweet(Tweet tweet);
}

The client application hooks up to the client (that lives right on my desktop machine) through the BizTalk Services ISB and the server fires events back through the ISB relay into the client as new tweets arrive. So when you run the attached client app, you'll find that it starts with a dump of the current log of the bot and then keeps spitting out events as they arrive.

The client is actually pretty simple. The EventsClient is the subscriber for the pub/sub service (ConnectionMode.RelayMulticast) that writes out the received events to the console. The rest all happens in Main (parsing an validating the command line argument) and in Run.

    class Program
    {
       
class EventsClient :
ITweetieEvents
        {
           
public void OnTweet(Tweet
tweet)
            {
               
Console.WriteLine("[{0}] {1}:{2}"
, tweet.Time, tweet.User, tweet.Text);
            }
        }

       
static void Main(string
[] args)
        {
           
string usageMessage = "Usage: IMBotClient <messenger-email-address>"
;
           
if
(args.Length == 0)
            {
               
Console
.WriteLine(usageMessage);
            }
           
else
            {
               
if (!Regex.IsMatch(args[0], @"^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$"
))
                {
                   
Console
.WriteLine(usageMessage);
                   
Console.WriteLine("'{0}' is not a valid email address"
);
                }
               
else
                {
                    Run(args[0]);
                }
            }
        }

       
private static void Run(string
emailAddress)
        {
           
EndpointAddress serviceAddress =
               
new EndpointAddress(String.Format(String.Format("sb://{0}/services/tweetiebot/{1}/service"
                                    
RelayBinding.DefaultRelayHostName, Uri
.EscapeDataString(emailAddress))));
           
EndpointAddress eventsAddress =
               
new EndpointAddress(String.Format(String.Format("sb://{0}/services/tweetiebot/{1}/events",
                                   
RelayBinding.DefaultRelayHostName, Uri
.EscapeDataString(emailAddress))));

The URI scheme for services that hook into the ISB is "sb:" and the default address of the relay is encoded in the SDK assemblies. We set up two endpoints here. One for the client channel to fetch the initial list and one for the event subscriber. 

            RelayBinding relayBinding = new RelayBinding();
     

            
ServiceHost eventsHost = new ServiceHost(typeof(EventsClient
));
           
RelayBinding eventBinding = new RelayBinding(RelayConnectionMode
.RelayedMulticast);
            eventsHost.AddServiceEndpoint(
typeof(ITweetieEvents
), eventBinding, eventsAddress.ToString());
            eventsHost.Open();

           
ChannelFactory<TweetieBotChannel> channelFactory = new ChannelFactory<TweetieBotChannel
>(relayBinding, serviceAddress);
           
TweetieBotChannel
channel = channelFactory.CreateChannel();
            channel.Open();

The two *.Open() calls will each prompt for a CardSpace authentication, so you will have to be registered to run the sample. Once you have opened the channels (and my service is running), you'll be able to pull the list of current tweets. Meanwhile, whenever a new event pops up, the EventsClient above will write out a new line.

            IList<Tweet> tweets = channel.GetTweets(lastTime);
           
foreach (Tweet tweet in
tweets)
            {
               
Console.WriteLine("[{0}] {1}:{2}"
, tweet.Time, tweet.User, tweet.Text);
            }

           
Console.WriteLine("Press ENTER to quit at any time"
);
           
Console
.ReadLine();

            eventsHost.Close();
            channel.Close();
            channelFactory.Close();
        }        


So when you run the app, you can chat (anyone can, you don't need to be a buddy) tweetiebot@hotmail.com through Live Messenger and you'll see your chat lines (and potentially others') popping out as events from the service bus.

To run the sample with my bot, you need to call the client with "IMBotClient tweetiebot@hotmail.com" and select your BizTalk Services Information Card twice as you are prompted.

Privacy notice: I'm anonymizing the name of the contact only insofar as I'm clipping anything including and following the "at" sign of the user that chats the bot. So whatever you say is published as "emailname: text line"

IMBotClient.zip (3.61 KB)
Categories: Technology | BizTalk | CardSpace | ISB

We love WS-* as much as we do love Web-Style services. I say "Web-style", full knowing that the buzzterm is REST. Since REST is an architectural style and not an implementation technology, it makes sense to make a distinction and, also, claiming complete RESTfulness for a system is actually a pretty high bar to aspire to. So in order to avoid monikers like POX or Lo-REST/Hi-REST, I just call it what it what this is all about to mere mortals whose don't have an advanced degree in HTTP Philosophy: Services that work like the Web - or Web-Style. That's not to say that a Web-Style service cannot be fully RESTful. It surely can be. But if all you want to do is GET to serve up data into mashups and manipulate your backend resources in some other way, that's up to you. Anyways....

Tomorrow at 10:00am (Session DEV03, Room Delfino 4101A), our resident Lo-REST/Hi-REST/POX/Web-Style Program Manager Steve Maine and our Architect Don Box will explain to you how to use the new Web-Style "Programmable Web" features that we're adding to the .NET Framework 3.5 to implement the server magic and the service-client magic to power all the user experience goodness you've seen here at MIX.

Navigating the Programmable Web
Speaker(s): Don Box - Microsoft, Steve Maine
Audience(s): Developer
RSS. ATOM. JSON. POX. REST. WS-*. What are all these terms, and how do they impact the daily life of a developer trying to navigate today’s programmable Web? Join us as we explore how to consume and create Web services using a variety of different formats and protocols. Using popular services (Flickr, GData, and Amazon S3) as case studies, we look at what it takes to program against these services using the Microsoft platform today and how that will change in the future.
If you are in Vegas for MIX, come see the session. I just saw the demo, it'll be good.
Categories: Talks | Technology | WCF | Web Services