Adieu, Userland.
Ladies, if you haven’t switched your feeds to this address yet (it’s a year now), now’s the time.
UPDATE: I've mirrored a few old stories from over there. The rest of the content is here anyways.
-----Original Message----- From: customerservice@userland.com [mailto:customerservice@userland.com] Sent: Friday, July 09, 2004 12:10 AM To: Clemens F. Vasters Subject: Radio UserLand Renewal Reminder
Greetings from the community server for Radio UserLand 8. This is a reminder that your Radio UserLand serial number will expire soon.
This is the third renewal-reminder email. You will receive two subsequent reminders, one the day before your serial number expires, and one when your serial number has actually expired.
At any time you can visit the UserLand store [1] to renew your license for $39.95, so that you can continue to receive software updates and store content on UserLand's community server.
You have 2 days remaining in your Radio UserLand license for the XXXX-XXXX-XXXX serial number.
If you have any questions or concerns, please review the Radio UserLand website [2], or post questions on the mail list [3], or discussion group [4]; or simply respond to this email.
And thanks from all of us at UserLand for using Radio UserLand. We sincerely hope you like it and use it well.
[1] http://radio.userland.com/howToRenew [2] http://radio.userland.com/ [3] http://groups.yahoo.com/group/radio-userland/ [4] http://radio.userland.com/discuss/
Do I do this because I want to or do I do this because I need to?
In my comment view for the last post (comment #1), Piyush Pant writes about the confusion around different pipeline models and frameworks that are popping up all over the place and mentions Proseware, so I need to clarify some things:
I'll address the "too many frameworks" concern first: Proseware's explicit design goal and my job was to use the technologies ASP.NET Web Services, WSE 2.0, IIS, MSMQ, and Enterprise Services as pure as possible and I did intentionally not introduce yet another framework for the runtime bits beyond a few utility classes used by the services as a common infrastructure (like a config-driven web service proxy factory, the queue listener, or the just-in-time activation proxy pooling). What my job was and what I reasonably succeeded at was to show that:
Writing Service Oriented Applications on today's Windows Server 2003 platform does not require yet another framework.
The framework'ish pieces that I had to add are simply addressing some deployment issues like creating accounts, setting ACLs or setting up databases, that need to be done in a "real" app hat isn't a toy. Such things are sometimes difficult to abstract on the level of what the .NET Framework can offer as a general-purpose platform or are simply not there yet. All of these extra classes reside in an isolated assembly that's only used by the installers.
The total number of utility classes that play a role of any importance at runtime is 5 (in words five) and none of them has more than three screen pages worth of actual code. Let me repeat:
Writing Service Oriented Applications on today's Windows Server 2003 platform does not require yet another framework.
I do have a dormant (newtelligence-owned) code branch sitting here that'd make a lot of things in Proseware easier and more elegant to develop and makes reconfiguring services more convenient, but it's a developer convenience and productivity framework. No pipelines, no other architecture, just a prettier shell around the exact Proseware architecture and technologies I chose.
To illustrate my point about the fact that we don't need another entirely new framework, I have here (MessageQueueWebRequest.cs.txt, MessageQueueWebResponse.cs.txt) an early 0.1 prototype copy of our MessageQueueWebRequest/-WebResponse class pair that supports sending WS messages through MSMQ. (That prototype only does very simple one-way messages; you can do a lot more with MSMQ).
Take the code, put it in yours, create a private queue, take an arbitrary ASMX WebService proxy, call MessageQueueWebRequest.RegisterMSMQProtocol() when your app starts, instantiate the proxy, set the Url property of the proxy to msmq://mymachine/private$/myqueue, invoke the proxy and watch how a SOAP message materializes in the queue.
Next step: use a WSE proxy. Works too. I'll leave the receiver logic to your imagination, but that's not really much more than listening to the queue and throwing the message into a WSE 2.0 SoapMethod or throwing it as a raw HTTP request at an ASMX WebMethod or by using a SimpleWorkerRequest on a self-hosted ASP.NET AppDomain (just like WebMatrix's Cassini hosts that stuff).
On to "pipelines" in the same context: Pipelines are a very common design pattern and you can find hundreds of variations of them in many projects (likely dozens from MS) which all have some sort of a notion of a pipeline. It's just "pipeline", not Pipeline(tm) 2003 SP1.
User-extensible pipeline models are a nice idea, but I don't think they are very useful to have or consider for most services of the type that Proseware has (and that covers a lot of types).
Frankly, most things that are done with pipelines in generalized architectures that wrap around endpoints (in/out crosscutting pipelines) and that are not about "logging" (which is, IMHO, more useful if done explicitly and in-context) are already in the existing technology stack (Enterprise Services, WSE) or are really jobs for other services.
There is no need to invent another pipeline to process custom headers in ASMX, if you have SoapExtensions. There is no need to invent a new pipeline model to do WS-Security, if you can plug the WSE 2.0 pipeline into the ASMX SoapExtension pipeline already. There is no need to invent a new pipeline model to push a new transaction context on the stack, if you can hook the COM+ context pipeline into your call chain by using ES. There is no need to invent another pipeline for authorization, if you can hook arbitrary custom stuff into the ASP.NET Http Pipeline or the WSE 2.0 pipeline already has or simply use what the ES context pipeline gives you.
I just enumerated four (!) different pipeline models and all of them are in the bits you already have on a shipping platform today and as it happens, all of them compose really well with each other. The fact that I am writing this might show that most of us just use and configure their services without even thinking of them as a composite pipeline model.
"We don't need another Pipeline" (I want Tina Turner to sing that for me).
Of course there's other pipeline jobs, right? Mapping!
Well, mapping between schemas is something that goes against the notion of a well-defined contract of a service. Either you have a well-defined contract or two or three or you don't. If you have a well-defined contract and there's a sender that doesn't adhere to it, it's the job of another service to provide that sort of data negotiation, because that's a business-logic task in and by itself.
Umm ... ah! Validation!
That might be true if schema validation is enough, but validation of data is a business logic level task if things get more complex (like if you need to check a PO against your catalog and need to check whether that customer is actually entitled to get a certain discount bracket). That's not a cross-cutting concern. That's a core job of the app.
Pipelines are for plumbers
Now, before I confuse everyone (and because Piyush mentioned it explicitly):
FABRIQ is a wholly different ballgame, because it is precisely a specialized architecture for dynamically distributable, queued (pull-model), one-way pipeline message processing and that does require a bit of a framework, because the platform doesn't readily support it.
We don't really have a notion of an endpoint in FABRIQ that is the default terminal for any message arriving at a node. We just let stuff asynchronously flow in one direction and across machines and handlers can choose to look at, modify, absorb or yield resultant messages into the pipeline as a result of what they do. In that model, the pipeline is the application. Very different story, very different sets of requirements, very different optimization potential and not really about services in the first place (although we stick to the tenets), but rather about distributing work dynamically and about doing so as fast as we can make it go.
Sorry, Piyush! All of that totally wasn't going against your valued comments, but you threw a lit match into a very dry haystack.
Benjamin Mitchell wrote a better summary of my "Building Proseware Inc." session at TechEd Amsterdam than I ever could.
Because ... whenever the lights go on and the mike is open, I somehow automatically switch into an adrenalin-powered auto-pilot mode that luckily works really well and since my sessions take up so much energy and "focus on the moment", I often just don't remember all the things I said once the session is over and I am cooled down. That also explains why I almost never rehearse sessions (meaning: I never ever speak to the slides until I face an audience) except when I have to coordinate with other speakers. Yet, even though most of my sessions are really ad-hoc performances, whenever I repeat a session I usually remember whatever I said last time just at the very moment when the respective topic comes up, so there's an element of routine. It is really strange how that works. That's also why I am really a bad advisor on how to do sessions the right way, because that is a very risky approach. I just write slides that provide me with a list of topics and "illustration helpers" and whatever I say just "happens".
About Proseware: All the written comments that people submitted after the session have been collected and are being read and it's very well understood that you want to get your hands on the bits as soon as possible. One of my big takeaways from the project is that if you're Microsoft, releasing stuff that is about giving "how-to" guidance is (for more reasons you can imagine) quite a bit more complicated than just putting bits up on a download site. It's being worked on. In the meantime, I'll blog a bit about the patterns I used whenever I can allocate a timeslice.
Simple question: Please show me a case where inheritance and/or full data encapsulation makes sense for business/domain objects on the implementation level.
I'll steal the low-hanging fruit: Address. Address is a great candidate when you look at an OOA model as you could model yourself to death having BaseAddress(BA) and BA<-StreetAddress(SA) and BA<-PostalAddress(PA) and SA<-US_StreetAddress and SA<-DE_StreetAddress and SA<-UK_StreetAddress and so forth.
When it comes to implementation, you'll end up refactoring the class into on thing: Address. There's probably an AddressType attribute and there's a Country field that indicates the formatting and since implementing a full address validation component is way too much work that feature gets cut anyway and hence we end up with a multiline text field with the properly formatted address and stuff like Street and PostOfficeBox (eventually normalized to AddressField), City, PostalCode, Country and Region is kept separate really just to make searching easier and faster. The stuff that goes onto the letter envelope is really only the preformatted address text.
Maybe I am too much of a data (read: XML, Messages, SQL) guy by now, but I just lost faith that objects are any good on the "business logic" abstraction level. The whole inheritance story is usually refactored away for very pragmatic reasons and the encapsulation story isn't all that useful either. You simply can't pragmatically regard data validation of data on a property get/set level as a useful general design pattern, because a type like Address is one type with interdependency between its elements and not simply a container for types. The rules for Region depend on Country and the rules for AddressField (or Street/PostOfficeBox) depend on AddressType. Since the object can't know your intent of what data you want to supply to it on a property get/set level, it can't do meaningful validation on that level. Hence, you end up calling something like address.Validate() and from there it's really a small step to separate out code and data into a message and a service that deals with it and call Validate(address). And that sort of service is the best way to support polymorphism over a scoped set of "classes" because it can potentially support "any" address schema and can yet concentrate and share all the validation logic (which is largely the same across whatever format you might choose) in a single place and not spread it across an array of specialized classes that's much, much harder to maintain.
What you end up with are elements and attributes (infoset) for the data that flows across, services that deal with the data that flows, and rows and columns that efficiently store data and let you retrieve it flexibly and quickly. Objects lost (except on the abstract and conceptional analysis level where they are useful to understand a problem space) their place in that picture for me.
While objects are fantastic for frameworks, I've absolutely unlearned why I would ever want them on the business logic level in practice. Reeducate me.

I keep blogging about great people who do amazing things. Here’s someone else who did an amazing thing: me Meet the grand master and anchor of our branch of the Vasters clan: Richard Vasters.
My dad is a Bezirksschornsteinfegermeister (“district master craftsman chimney sweep”, very different job description from what it is in the U.S.) and a computer veteran without wanting to be. He’s been using PCs since 1987 and he’s constantly refusing to learn more than absolutely necessary and I keep being “support central”.
Because he’s so stubbornly refusing to deal with computer complexity I don’t even get upset anymore about saying “space” and “enter” whenever I have him navigate the command line over the phone (which luckily became very rare) or keep repeating any detail of sequences getting him through various levels of dialog windows. Also, even though my dad is a language genius (he speaks no other language than German properly, but he mysteriously manages to express himself to people from any corner on the planet just fine), he’s not even remotely willing to deal with “File” and “Edit” menus and insists on having the German “Datei” and “Bearbeiten” menus instead. I mostly don’t even know what most apps look like in German, since I am running the U.S. English versions all the time. Yet, to help him I need to know cold what’s going on his screen when he’s pressing this key and clicking that thing when I have to navigate him though stuff on the phone – otherwise I’d just go insane.
On the way home from TechEd Amsterdam, I finally found time to upgrade his desktop from Windows 98 to XP (the XP carton was sitting idle on his desk for months), set up a wireless network (all the WLAN router was doing was to consume power) with internet connection sharing, firewalled everything, patched the desktop and the notebook up to the latest fixes, installed virus scanners (and sure enough found one), hooked up the printer to the WLAN hub and got him on MSN Messenger – and to my complete surprise (and shock because of the inherent consequences!) Remote Assistance actually works from my place to the “family mansion”. Now he’s thrilled that he can issue print jobs to the printer in the office from the terrace without any wires.
Dad uses his PCs (the desktop and the notebook) exactly for one thing: getting stuff done. He has little to no interest in how things work and if stuff is too complicated he just ignores it and gives up immediately, because it’s just too annoying. For me, he’s always providing an absolutely amazing “reality check”. Sure enough, a German news channel was running a special program on Linux while I was there and there came the inevitable question: “Is that something for me?” Now there’s a support nightmare I am absolutely looking to avoid and answered with a resounding “No!”
You think I am just a stupid dork and too lazy? Here’s the challenge to a daring (sorry, !insane!) individual: Install Linux on the desktop box (the notebook will remain to be XP), offer a year of free German language phone support with 24 hour turnaround time and on-site support with 72 hour turnaround time and get it all to run and maintain it (including patches) so that my dad can comfortably run all the apps he needs to get his work done (sorry, all Windows apps with no Linux alternatives; so WINE would have to do it and the respective ISVs – all relatively small firms with vertical solutions – will deny any of their support on any non-Windows platform). If you succeed and make it through the year without having to check into a psychiatric hospital, I’ll happily admit that Linux is ready for the desktop. If you fail, you owe us a year’s supply of beer. I think that’s a fair deal, because it’s oh-so ready, you can’t fail at that task, right?
Arvindra Sehmi, Architect Lead at Microsoft EMEA, father and mother of the Microsoft Architects JOURNAL, the inspiration and project lead for the FABRIQ, the man who's dragged me twice through Europe on the EMEA Architect Tour (2003, 2004 video archives) and the owner of the Architect Track at TechEd Europe is now finally blogging.
We've built FABRIQ, we've built Proseware. We have written seminar series about Web Services Best Practices and Service Orientation for Microsoft Europe. I speak about services and aspects of services at conferences around the world. And at all events where I talk about Services, I keep hearing the same question: "Enough of the theory, how do I do it?"
Therefore we have announced a seminar/workshop around designing and building service oriented systems that puts together all the things we've found out in the past years about how services can be built today and on today's Microsoft technology stack and how your systems can be designed for with migration to the next generation Microsoft technlogy stack in mind. Together with our newtelligence Associates, we are offering this workshop for in-house delivery at client sites world-wide and are planning to announce dates and locations for central, "open for all" events soon.
If you are interested in inviting us for an event at your site, contact Bart DePetrillo, or write to sales@newtelligence.com. If you are interested in participating at a central seminar, Bart would like to hear about it (no obligations) so that we can select reasonable location(s) and date(s) that fit your needs.
Monday I'll start earnestly working on this year's "summer project". Last year's project yielded what you today know as dasBlog. This year's prototyping project will have to do with running aggregated RSS content through FABRIQ networks for analysis and enrichment, solidifying the newtelligence SOA framework (something you don't even know about yet and it's not Proseware) and architecting/building a fairly large-scale system for dynamically managing user-centric media for targeted and secure distribution to arbitrary presentation surfaces. (Yes, I know that's a foggy explanation). Will the result be free stuff? No. Not this time. Will you hear about what we learn on the road to Bumblebee? Absolutely.
Wow. Done. TechEd Amsterdam was great fun as each year (the partying was a bit less excessive than Barcelona last year, but Forte wasn't here so that explains a lot) and thanks to a great audience who liked my content, I got some really awesome scores this year. I have a couple of pictures and stories to blog, but I will give myself a day to settle in at home. I am really glad that we're now entering the rather quiet summer time. No travel for the next weeks. Goodness.
Ah, if you happen to have pictures of the "The Nerd, The Suit, and The Fortune Teller" session, it would be great if you could share a copy with me or send me a link if you put them anywhere on the web. Haven't seen any so far. That session was a lot of fun for Pat, Rafal and myself.
I had a nice dinner yesterday night with Don Box, Ingo Rammer, Christian Weyer, Christian Nagel, Benjamin Mitchell, Matt Tavis, and Juval Löwy. Don arrived a bit later and started by saying "look, I wanted to have dinner with all of you because we've decided to make some changes to Indigo and by now we've decided to simply bake WSE into Longhorn". Silence. Laughter. No, we didn't buy it and Don couldn't manage to keep the story up for more than two sentences. Dicussions were lively and went from the Windows Kernel to some high level architecture topics and one of the interesting takeaways was that Don elaborated a bit on the "Business Agents" idea he'd been talking about briefly in his CTS200 session. There's apparently a related project Boa (another serpent name along the family line of Viper that was the original codename for MTS), including the business markup language BML (pronounced "Bimmel") that he's involved in and he talked a bit about that, but of course I'd be killed if I gave out more details.
Hello Microsoft Watch readers and El Registraderos: go here for an update.
Update #2: The nice thing about blogs is that I can update this entry all I want. Understand: This *is* a joke. Read the first few sentences. See, there's a little "April Fools" story right there. If that isn't enough, the codename "Viper" is a bit ancient right... like 1995/1996? Still no good? How stupid is Bimmel? And would I really break an NDA here? If the press turns this into a story without asking whether there is any substance .... well.... This is my weblog. I don't work for Microsoft. Thank you for your understanding.
Update #3: If you are less interested in blown-out-of-proportion we-have-nothing-better-to-report summer-time "news" and more interested in the big thing before the next big thing (and -who knows- that next big thing might really be "Business Agents", after all) and are therefore contemplating whether Services and Service Oriented Architectures make sense to you, go here.
On cool aspect about TechEd Amsterdam
is that it is essentially a home game for newtelligence in terms of proximity
to home-base and it’s one of the very few conferences that I can drive to
(I’ve spent way too much time in airports and on planes this recent half
year). Saturday it took me just 1:50h to get here from my place near Düsseldorf.
Part of the fun is of course that a
good part of the trip is on the not-too-busy German A3 Autobahn and therefore I
could drive at a reasonable speed 
 
Of course the real street fun sort of
ends once you hit the Netherlands, but at least there were no traffic jams all
the way into Amsterdam
  
Final approach; the RAI conference
center is in sight:

Once I got to the hotel close to the
RAI, my friend Goksin Bakir (Microsoft Regional Director for the Middle-East
& Africa Region) and I immediately headed out for some drinks:
 
… and went to watch the Holland
vs. Sweden game in some bar amongst the locals:
 
Amsterdam will be great fun. 
Finally, finally, finally. It was a looong wait. As many others, we were in a wait loop for WSE 2.0 for a long time and that let us do what we do today only much, much later than we initially anticipated. So after being able to test on and adjust for the WSE 2.0 RTM bits for the last four weeks, we're now happy enough with our "1.0" that we're ready to share it:
Microsoft EMEA and newtelligence AG present: The FABRIQ. (http://workspaces.gotdotnet.com/fabriq) (When you go there, make sure you get both the bits and the Hands-on Labs; you will need them).
Also, a few things to keep in mind before you go and get the bits:
- This is a proof-of-concept project collaboratively created by Microsoft EMEA and newtelligence AG. We have tested intensively for quite a few sets of use-cases, but this is not a product. We are giving this to you because we think it's very useful architecturally and most implementation aspects isn't too bad either, and we do expect you to play with it. We don't give it to you to install this in a production environment tomorrow or even on the day after.
- The support policy for FABRIQ is very simple: There is none. If you download this, you are absolutely and entirely on your own, legally speaking. We are keen to hear your feedback and are curious whether and for what you find this useful, but this is no product and therefore there's no support whatsoever. (If you find this so useful that you want customization, support, or need help to get this from near-production quality to production-quality, sales@newtelligence.com is a great place to write e-mail to)
- This is "work in progress" and you are getting a version that is not considered finished. You will find artifacts in the code that are not (anymore or yet) used. You will find code branches that we not (anymore or yet) hit. There are a few places, where we cut some corners in terms of implementation efficiency in order to get this out early. You will find that there is a bit of a disconnect between the specification documents that we have in the package vs. the documentation that you'll find and we could have done a better job cleaning it all up. We love this ourselves and will continue to polish it.
- You need WSE 2.0 and the Enterprise Instrumentation Framework to play.
- Contributions: We give you the code and you can use it and change it. For the first version and the next minor drops, we'll not have a public code repository that people can check things into immediately, because the beast turned out to be so complex that we need to stay in control for a little while. If we allowed "random" community contributions early, people who don't live inside in the codebase could too easily seemingly unrelated stuff. Therefore: If you want to change or add stuff, wrap up your changes along with a good reason why that's needed and send it here.
- Discussions: Write what you like or hate or what you don't understand into the forums in the workspace or just blog about it and refer to this entry or relevant entries on my blog or Arvindra's blog once he's fully set up. We'll accept everybody into the workspace; just apply and you'll be granted access as soon as someone sees it.
Credit where credit is due: Very many thanks to the development team in Argentina, with Eugenio Pace, Adrian Nigro, Federico Winkel, and Juan Carlos Elichirigoity, who have worked very very hard turning my "written in two weeks in a hurry" prototype code into something that's actually useful.
After providing some background on what nodes and networks are and how they work, I’ll get to how they are configured. Warning: This post is pretty dense in terms of content
It keeps happening to me and some of my good friends and it's getting to a point where something needs to be said:
Dear Clemens,
we are pleased to announce the YaddaYadda 2004 conference that will be held in Overseas City, Farwaway Country on Octember 24th-27th. We know your great presentation skills .. blah, blah ...
We will cover coach class airfare of up to $500 and will reserve you a room in the speaker hotel where we will cover the overnight stay and breakfast. We will also provide you with a free registration to attend all the sessions of YaddaYadda 2004.
YaddaYadda 2004 is a world-class conference with 40 speakers from 10 countries and we expect an audience of architects, developers and IT-managers from great companies so that we will give you a great platform and exposure to demonstrate your expertise.
Please let us know whether you are interested in speaking at YaddaYadda 2004 and submit your presenentations until ... blah, blah
Best Regards,
YaddaYadda Marketing Droid
The short answer is: No. For several reasons. First of all, YaddaYadda conference is one amongst a hundred conferences held each year in Faraway Country. You are not running a Microsoft TechEd or a Microsoft PDC where I meet a lot of my friends, and you are not running a high-profile academic event that would really interest me, you are running just another developer conference. So we have that out of the way now.
You know that I live in Germany, right? Sure you do. You know my name, you invite me, it should be pretty much public knowledge that I don't live in Faraway Country. So how do you expect me to even dare to talk to a travel agent about a ticket to Faraway Country for $500? Well, right, you say that if I book 12 weeks ahead of time on the cheapest possible connection (with a comfortable 8 hour layover in St. Someairport) I could get a flight for that price. True. Care to have a look at my schedule? I am Norway until 2 days before YaddaYadda 2004 and I need to go to South Africa from there. And as things happen, these dates may move. A tourist ticket that's inflexible and invalid unless I use those exact flights is practically worthless for anybody who needs to be as mobile as us guys (and gals) who are helping you guys out with content. And you know what? My travel agent is so good that he's getting a business class fare on the German gray market that's cheaper than any flexible economy fare that you could ever book from Faraway Country; go figure that out. And you know what? If other speakers decide to drive 20hrs to Overseas City, do you force them to come in a Yugo, too?
The free registration to your conference sounds like a nice benefit, but I'd like to decline that offer and rather trade those $1499 for cash. Of course it'd be a bit difficult for me to get to the session room without a badge, but I am sure you'll figure out how that works.
And just because you say that your conference will give me a great platform and exposure to demonstrate your expertise I suspect (no, I am sure) that you are not paying speakers, right? See, there's an immediate benefit to you and that's me and all the other speakers talking there and adding to the value of your conference. No, sorry, we are the value of your conference. I like to trade immediate benefit against immediate benefit and that usually either translates into $$$ or into something that's a bit more painful for you than giving out "exposure" - let's say a booth or an full page ad in one of your magazines plus a token of appreciation for the talk.
Do you want to know what the value of "exposure" is and how it translates into immediate business opportunities for the speaker? If you are lucky, you get a good lead out of one per 500 attendees (and really lucky if your get two or three) and that doesn't even guarantee a deal yet. How many people did you say will you have at your conference? 450? Sorry. Doesn't translate.
There are many reasons to speak at conferences. Some are just plain fun to be at. Some are great for the parties. Some are fantastic for the money (go figure). For speakers there are many motivations that range from "the kick" to speak in front of 800 people to liking themselves being on stage to actually earning their lives by speaking. Some of the speakers I know got so IPO lucky in 1999 that they're doing it just so and it has nothing at all with their business.
So how about some honesty and saying: We're throwing a conference, we're going to have a raving party at a bar at the beach and many of your best buddies are likely coming too. Minibar in the hotel is on us. Sorry, we can't pay you for speaking, because we're poor and need the money, but we can pay for a reasonable flight ticket and hotel and since we have this hotel deal anyways, why don't you just stay 3 days longer, use your air-miles to upgrade and maybe bring along your girlfriend? Now, YaddaYadda 2004, that'd be a lot more honest and if your location is cool enough I'd even come. Just don't try that exposure argument on me, please, Mr. Marketing Droid.
In this post, I describe the FABRIQ concepts of "networks" and "nodes":
|