I've never blogged enough to have a loyal following. So if you have been waiting for me to post for all this time, I'll give you Bon Jovi's answer when asked about the follow up to New Jersey... "Four long years, no new albumn. Too bad. We're artists!" I just got back from the Microsoft MVP summit where everyone and their dog had a blog. I can't count the number of times I was asked "what's your blog? or why don't you blog." The short answre is that I've just never been able to stop with short posts, and I don't have enough time for regular long posts. So I'll stop here and write more blog thoughts more often and see if I can break that habit.
You can find my blog at its new home at the following address: http://home.infusionblogs.com/nlandry/default.aspx
. The whole post archive has been transferred to this address too, so there is no longer any need to come back here. Note that my main blog URL will soon be redirected to the new location automatically. You will most probably have to refresh your RSS feeds as well. Bear with us as we iron out the kinks during this transition. Thanks!
After 8 months of inactivity due to a busy schedule and also partially due to spammers invading my posts, my blog will soon move to a new engine. All archived posts will be available at the new location and the blog URL will stay the same. I have turned off comments in the meantime. Stay tuned.
We here at the Infusion blogger community are doing a weee bit of a renovation. In the meantime, check us out at our beta bloghome.infusionblogs.com
And specifically my blog at:home.infusionblogs.com/kguenther
Its been a while since I have blogged but one of my "resolutions" is to get back into the blogging mode... When I teach, I often regale my classes with the "really stupid things I have done in my career". Tends to be humanizing and humorous but also teaches a key point I like to drive home. I learn much more from my mistakes than I do my successes. I had a very big lesson learned over the holidays. I have been planning to take my family to Europe for a “last chance vacation together”. Both kids will be in college/university in the fall and are definitely moving on with their lives. So since I am helping them with their school costs, I was trying to save a few dollars and get some flights on points. Now, those of you know me, I travel a lot. But its short distances. Those air miles are scattered across several airlines. So I decided to give Points.com a shot and as a result put a bullet in some very hard earned airmiles. I was trying to get my US Airways miles (53844) over to Delta. Now Delta does not allow you to see the current balance so when I moved the miles it only shows an exchange amount. Mistake #1 not reading what “Exchange Rate” means with Points.com. Mistake #2 was not reading that the exchange was final and could not be reversed. Well, those two mistakes resulted in 53,844 points being “exchanged” to 2,106 Delta Miles. Somehow Points.com took 96% of my airmiles in the exchange. Considering the travel that went into those almost 54,000 miles, a VERY large lesson learned – basically that is a return flight to Europe. A mistake that I will not repeat. Just how Points.com can justify this is beyond me but now they are on my junk mail list and will stay there. So its back to hunting for the seat sales leaving the points for other flights in the future.
As you gain experience in business, a lot of the sophistication and nuance you once saw in people will boil away. People, you will realize, are not so complex and, for right or wrong, you will find yourself summing up and categorizing people fairly quickly after very compressed interactions. It is something you need to learn to do: as you succeed you will find yourself in contact with exponentially more people and situations, so you need to develop your own personal heuristics to quickly find the signal in the noise. Never forget that, as a leader, your job is to extract action from complexity and to glean discrete knowledge from ambiguity.
So, for me, I have developed two main categories within which I put the people who work with and for me. They are either Executives or Admins. I value Executives. I do not value Admins.
Before I go on, it is very important to note that these are *not* job titles. They are mindsets. There can be business executives that are really Admins and admins that are Executives. There can be a receptionist that is Executive, and a vice president who could be Admin; whether someone is an Executive or Admin has to do with attitude and perspective, not the title of the job they are doing. Being an Executive or Admin is about a state of mind and approach to problems. In the simplest terms, an Executive is able to prioritize their time efficiently, allocating the maximum time and energy around what they instinctively know is of the greatest strategic importance, often starving less important priorities in the process. An admin, on the other hand, looks at each task individually and tends to weight them more or less equally at first and ultimately gives priority to things based on outside forces without involving their own judgment. An Admin will prioritize based on what is due in the shortest time and/or what is most able to be done based on resources presently available. An Admin mindset is a dangerous mindset for reasons I will get into shortly.
Fortunately, as I’ve said, Executive and Admin is a mindset, not an attribute of the person. So, if one realizes it, one can change. Let me give you some examples of what I mean.
Some time ago we had the “enviable” problem of having far more work than our present recruitment strategies could supply new employees to service. We had many open positions with our banking clients for whom we consult, I think twenty or so new positions. We couldn’t fill it at the time. Because we have a very high standard for our hires, we often can’t bring on more than 3-4 new people a month. We get hundreds of resumes, but almost none make it through. Some people say to me, “hey, that’s a great problem to have!”. But the way I look at a situation like that, is that every month we don’t fill those open positions, we lose $500,000 in revenue in addition to credibility on the part of our clients believing we can scale to fulfill their needs. These clients came to us first to fill them, because they know we have top people. But if we can’t fill them, they’ll go elsewhere and say things like, “well, Infusion has great people, but maybe they can’t really scale for really large things.” I can’t have that.
So, I decided to get more directly involved in recruiting. I went to see the HR Director. We’ll call her Jean. Jean was relatively new, had only been with us for a few months but had done well so far; while we didn’t have the size of pipeline of new hires we needed, she certainly was finding and hiring bright folks. I wanted to see what more could be done to widen the pipeline.
Now, I don’t remember exactly what the situation was…I think that I went into her office and she wasn’t there or something. It was mid-morning, unusual, but I thought, hey, maybe she had an off-site interview or something. Certainly we were so desperate for bright new hires, she could have gone to a campus to interview. I don’t remember exactly, so some of this scenario you can take as apocryphal. Anyway, I think I asked the receptionist where she was and receptionist replied, “Oh, Jean went to return the grill.”
Return the grill? What grill? And even if there was a grill to return, why on earth was my HR director returning it when we were positively dying for resources to hire? I wanted to get to the bottom of it.
So, when Jean gets back I sat down with her, and I asked her about “the grill”.
It turns out that the night before there was a roof-top BBQ for the staff of the Toronto office. Ok, cool. It was Jean’s idea, and Jean arranged it. Great. But, ultimately, since Jean arranged it and it was her initiative, she felt that it was her responsibility to return the grill. And that is where I took issue. Specifically, I asked her if spending part of the morning returning a grill was really the best use of her time given that we were “losing” 500k a month because of unfilled positions. Wouldn’t the time better have been spent interviewing people in the hiring queue? She agreed that, yes, it absolutely would have…but the grill needed to be returned and there didn’t seem to be anyone else who could have done it, and she didn’t want to presume to ask someone else to do a task like that.
Ok, so right there you see an Admin perspective. Let’s examine why:
The decision on how Jean allocated her time in this instance was based on
1) An assumption: that no one else could do it
2) Moralism: she probably felt on some level that she didn’t want to seem imperious and may have wanted to show that she was one the same level as everyone else by doing a task like that
3) Low Priority Obligation that Achieves High Priority Attention: the grill had to be returned by a specific date and time
So in this case, Jean achieved the following:
1) She feels good about herself in that she didn’t ask anyone else to do it, and she completed a clear-cut goal: the grill was returned
2) The grill gets returned (the grill vendor is happy) and the firm avoids a hefty $15 in penalties
3) The administrative staff appreciates Jean’s willingness to do any task, even though she is a manager
Note that none of the above furthered the company’s goals in any significant way. In fact, a matter of hours is the difference between getting a hot candidate or losing them to a competing company when that candidate has multiple offers (as many of our candidates do). So, for the sake of $15 and some esoteric considerations of the feelings of others, Jean may very well have risked and lost 250-300k of revenue for the year because a candidate we didn’t get to in time just took an offer from a competing firm!
Now an Executive mindset would have thought like this:
1) I have a crisis, I am losing 500k a month in missed revenue. All my time and focus must be spent there.
2) There must be someone other than me who can perform the task of returning a grill. There is nothing in that task that requires me in any way, ANYONE else could do it and it detracts from #1, which must be my priority. If there is no one to delegate to, maybe I can hire a courier or messenger to do it. Perhaps I can call the rental company and pay them extra to pick it up. Even if it costs $25, that is small compared to the risk of not getting offers out to some of the candidates in the queue.
3) If the grill is late, the fee is very nominal. This can not be a priority for me right now given #1. I must either delegate it or just put it at lowest priority, bear the late fee, and just address it when #1 is solved.
Some people might feel the attitude of the Executive is bourgeoisie. Maybe it is. But it is not important that you are liked, or perceived as a swell person, or beloved by your administrative staff. What matters is that you take care of business and, hell or high water, you do not spend your time on low priority things.
I explained all this to Jean, and she understood completely. So I asked her:
“Jean, which are you: An Executive or an Admin?”
To which she answered:
And from then on, she was. Her performance has been stellar and over 1/3rd of my present staff came into the company through Jean. She is awesome, and I never again found her returning grills.
We arranged a major outing for our New York office. Paintball! So, we have about 30-40 guys, we rented a tour bus and drove up into the mountains of upstate New York and fired paint pellets at each other on a variety of fields and woodsy settings. It was fantastic for team building, and everyone had a tremendous time.
So the plan was, after the paintball, the bus would come and we would all go to this place where there would be BBQ around a big fire. There’d be steaks, ribs, vegetarian stuff, beer, a party to cap the day where we could recount our misadventures of the day and solidify the esprit d’corps. Everyone was looking forward to it.
Now the paintball fields were very busy that day, and at the end of the day we had to wait for a particular field to clear (other people were playing on it). This was the best field: full of metal structures you could hide behind…it was what everyone had been waiting for the entire day. This is where we’d have the final battle and decide trophy winners for the day. But right about the time we were going to go onto the field, “Mary” our office manager comes over to me and says we really should leave now, that we might not be able to do the final field. I told her that everyone was looking forward to this, all our gear was already readied and unpacked, and that we should do it. So why was she insisting we go?
The answer was that the bus driver we’d hired for the day had been told to pick us up at 530pm, and it was almost that time now. I then asked her why we couldn’t just call the driver and tell him we’d be half an hour later and she seemed a little agitated. She said we had a contract with him, and we told him it would be 530 and she just seemed very concerned about keeping our commitment to the driver.
Now, Mary booked and arranged for the entire event and really did a tremendous job, she is an Executive almost all the time. But she, like of all of us, can have Admin moments.
Mary knew that we were paying somewhere in the neighborhood of $20,000 for this outing. Personally, after spending that much money, building all this enthusiasm, to burst everyone’s bubble and miss the final trophy game because the driver had been told 530 just didn’t seem like a great trade off. We were 2.5 hours outside of new York city (where the bus would be taking everyone ultimately)…the driver was taking us first to dinner and then back to NYC. He wouldn’t be home until 12am in the best of circumstances. Did ½ hour really matter that much to him? Relative to the cost of morale for ending the day prematurely and on a down note? I didn’t think so, so I told Mary, “contact the driver and ask him what it would cost to get more time here. How much does he want for another hour or so. We are paying 20k for the day out here. Another $ 100-$200 dollars in tip for the driver wouldn’t break the budget.”
So, she offered it to the driver, the driver accepted, and we were able to finish our final game. And what a game it was. I still have welts.
The point here is that you see another Admin perspective. A non-important variable becomes somehow immutable (driver commitment) and is given priority above what is actually much more important(team building). So now the bigger goal contorts around the need to realize a much more minor goal. It is the willingness to challenge assumptions and prioritize intuitively that is the hallmark of an Executive mindset.
I have many more stories, of course. Like the internal IT guy, “Tom” I once had who spent 4 days trying to figure out an issue with Microsoft Exchange. When I asked him, “hey, man, why didn’t you just call the support line and open an issue?” he said, “because that costs $199!” But, of course, Tom had spent much more than that in salary and missed priorities figuring it out himself.
You get the point.
Again, I want to emphasize that Admin and Executive is a mindset, not a role. You might have an administrative job. But if you have an Executive mindset, you will be promoted into management (my one-time receptionist 5 years ago is now branch manager of my London, UK office we’ll be opening this year.) On the other hand, if you have an administrative job and an Admin mindset, then you are not likely to ascend very high in an organization. Ditto for the vice president with the Admin mindset; he won’t rise very high in business.
None of us are immune to bouts of Admin perspectives…so, when you are doing anything important that you need to success, add this query to your internal self-assessment kit and ask yourself: the way I am performing right now, am I an Executive or an Admin? You’ll find that in every case, it is clearly one or the other.
Check out how easy it is to customize the Document Information Panel inside of Office 2007 using InfoPath. This article leads you through an approximately 3 step process that should allow you to have custom Document Information Panels up and running.
Two things I've noticed:
1. It's even easier than I previously thought. If you don't want to customize the panel beyond the xml data being stored, it's quite simple. You can simply edit the Content Type and the Document Information Panel default form will automatically pick up the changes (including specialized drop down fields).
2. This walk through doesn't seem to work on my version of Beta 2 TR. Not sure if that's a bug across all copies, but I have seen it work on the RTM. Something to watch out for.
Some screens and maybe a video walk through are in order, I think. Hopefully, I can post them at the end of the week.
Yesterday, I was giving a technical interview for Infusion. This is a fairly normal occurance for me as I give about 3 tech interviews a week(Infusion is going through a period of record growth and is looking for candidates *all the time* - more about this to come soon).
But the candidate said something that made me laugh. When I asked him a BizTalk related question, he said "Oh, yeah, that's easy, like you said on your blog ..."
and suddenly it hit me that people might actually be reading this thing. I'll have to stop taking my tech interview questions directly from my blog.
For the record, the guy lost points for knowing the answer, but gained more for reading my blog. Kudos to you, blog-reader-candidate.
Have you noticed the disparity about backup procedures documentation and how much information one can find about restoring from those backups?
What I am going to provide here is not new information: I just hope that this post will come up in some searches, therefore sparing some frustration.
Recently we had a bad day with our TFS database server, we decided to cut or losses and restore to the previous day's backups. Little we knew...
You will find comprehensive instructions on how to restore (http://msdn2.microsoft.com/en-us/library/ms252458.aspx or http://blogs.msdn.com/vstsue/articles/511396.aspx), you will diligently perform all the steps, fire up the servers, connect using Visual Studio and everything will seem to work properly. Until a week later when all of a sudden you will open a project you didn't touch for a while and when checking out an aspx page you'll see that it contains XML code. Or you'll find C# code belonging to another project into a DataSet XSD.
What happened? This happened: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=251122&SiteID=1.
Yes, there is a cache in the TFS Application server, and restoring the databases without manually deleting the cache ("%Program Files%\Microsoft Visual Studio 2005 Team Foundation Server\Web Services\VersionControl\Data") leads to bad, bad things.
Hope this helps.
I was on a phone a couple weeks back with another relatively young business owner. Probably mid-thirties like me, doing well by almost any metric, starting a product company…early yet for him, but the market seems right for his company (big prospective clients are interested), he’s well funded (VC money), and very smart. Hard worker…his parents are proud, his friends respectful (maybe a tad envious) of what he’s accomplished thus far. His future is bright, he’ll make very large money one day.
I stepped outside of a party to make a call with him… I was in a Phoenix Arizona resort at a hoe-down, shin-dig, wild-west themed party thrown by Microsoft for its top partners in US State and Local Government (SLG). Earlier in the day I’d gotten an award from the general manager of this Microsoft division (one of Microsoft’s largest) for outstanding work with top clients. A partner-of-the-year “Innovation Award” thing. Got called up to a big stage, was on large monitors getting the award…all that. And earlier in the day I met with the Microsoft division heads talking about all the work we’d be doing together in the coming year in education, municipalities, even federal…pentagon, department of defense…other things. Net net, a lot of work on the horizon for my 100+ consultants.
I should have been happy. He should have been happy. We had set a time to talk about how to partner, how I might be able to sell his product through my sales channels (that is, my existing clients). So I snuck off from the shin-dig, and camped out by a wagon wheel and dialed in while sitting on a bale of hay. “Cotton eyed Joe” played in the distance.
But something was off. Where we both would normally be very chirpy, excited by the potential, thrilled with what we were doing…it was just, off. The conversation was perfunctory, no excitement. At one point in the conversation we both lapsed into silence and, in one of those uncanny moments that hint of psychic phenomena, I had a strong sense of what was wrong. I said:
“Are you, by any chance, thinking about Google buying youtube.com for 1.5 billion dollars?”
“Oh my god…yes. How did you know that?” He laughed.
“I’m bummed about that too. Been thinking about it all day since I read the announcement this morning.” I said.
“S**t, I know! I mean, Jesus Christ! How can you read something like that an go off and function doing what you are doing?”
“I didn’t actually read the whole article. I just didn’t want to find out that it is a twenty-something who did it for a year or something like that. I hope to God it is a bunch of rich old private equity guys that started this site.”
“Me too…but I have to know…hold on…” I heard him typing in the background, and then: “Mother F***er! The CEO is 29 years old and it says the site never made any money and is only a year old.”
And then he cursed. It wasn’t cursing in jest all of a sudden…and it wasn’t very loud. It sounded, sad, resigned and then angry…all in the space of like a second. The guy was genuinely upset about this. Then he said, almost sighingly:
“You know, you work your ass off for years, building a business, dealing with s**t, worried about someone else knocking you out before you get enough traction in a market…you cross 35 and start bumping up against ‘old guy’ territory, and you hope, you pray, at one point before you are too old to give a damn, that you’ll make some big money. But you’d be giddy if you could pull 5 million out of an exit and then do this a couple of more times building on your success. But then a kid lets people post videos on a website, and he’s…a f***ng…billionaire...Seriously, G*d damn it!”
I knew what he was saying. I’d felt the same way. For a fleeting moment as I read that news (on Google news of course) on my mobile phone that morning, I felt all my motivation and excitement about being where I was slip away. I was in a top resort in Phoenix with waterfalls cascading into pools…but it suddenly appeared grey. And then “the voice” piped in:
“What HAVE you accomplished, smart guy? Oh, BIG DEAL you have over 100 people. Give that man one white chip! There are thousands of companies doing what you do many, many times your size. You know, the Forbes list of wealthiest Americans don’t even have millionaires on it anymore! You have to be a billionaire to make it on that list! So, you think you are doing well??? You aren’t even CLOSE! Took you eight years to get here, but look what that kid did in two! Garden variety millionaires are the new middle-class at the very best, dude! ”
I don’t like “the voice”. It likes to rob me of things. I thought I was unusual in having a voice like that, but it turns out..I’m not.
Out of curiosity, I started asking other entrepreneurs I know to see if they felt Google-depression like I did. They did! And it was strikingly similar: everyone I spoke to was half-angry and half-sad. One entrepreneur said he switched his default homepage from Google to ask.com, because, “I just can’t look at them anymore...Google is no longer officially cute. It is petty, small and meaningless, but at least I can do that much.”
Another friend who has an infrastructure consulting company said, “the mood of my whole company was depressed, I could sense it walking in. It was really weird. I guess because they all thought, ‘why not me? That could have been me but I’m doing this instead…’ And it got to me too because I work like 80 hours a week and travel so much every time I see my wife we have to remind each other who we are. Then something like that youtube happens, and you question if you are really doing things the easiest and smartest way. Instead of thinking about quality, building a business over years…the youtube thing kind of makes a mockery of that. So you start wondering about ways you might coral dummies and aggregate content on the internet, you think about the end goal, tons of money, and start trying to work backward into some kind of idea. It is depressing. I’m still getting over it. And don’t even get me started on myspace and facebook…”
“Did you see how on the Google home page they added that diminutive little link, ‘Videos-new’ like it was just some little thing…you know, hey users, we’re nice little Google here, a little thing you might want to check out, awww-shucks! Not like they went out and paid one-point-five BILLION dollars for thing! You know, f**k them. Seriously. F***K them.”
So, where does this leave us?
Well, “the voice” I have is afraid of one and only one thing. It fears my wife.
After 8 years of marriage, I pretty much can run a lot of my wife’s algorithms without her even present to determine what she’ll say in a given context, but sometimes you need the face to face. Before I tell you what she said, you must understand that my wife’s mother, Onriet, survived the holocaust. When the Nazi’s invaded France she fled (she was three but remembers it she remembers, particularly, that she was not allowed to bring her doll)…they got as far as, I believe, Spain, she won’t talk about exactly what happened, but they were captured and put in prison there. Then Onriet and her mother got separated. Fortunately, the European war ended, and Onriet ended up in a Red Cross orphanage in Morocco where her mother eventually found her after searching for several months. Then they came to America. And, to this day, Onriet’s house….filled with dolls. I never understood that until my wife explained it to me…”my mother, she couldn’t bring her dolls when that night.”
I tell you this because my wife and what’s left of her family are pretty happy just to be alive. They are not typically impressed by anyone. Only the quality of the person matters to them and none of them could pick out a single celebrity or know who anyone in hollywood is. They believe money, like life, countries, and even people you love are transitory, temporary. The very worst in the world can and does happen. And after it happens, you move, start over, and maybe you build a business for thirty years and make yourself rich. And, at the same time, be humble because, in Onriet’s words (and you have to imagine a heavy French accent here as she smokes a cigarette) :“Money, my dear, is a state, and a temporary one at that…it is not an attribute of a person, as so many people seem to believe.”
So, when I whine to my wife about my own success inferiority complex, she is as likely as not to point to the wall of one hallway, on which is a typed document with the seal of the Nazi party. It is an official typed list of what her grandmother and her toddler daughter was allowed to take with her on one of the relocation trains which, fortunately, she did not take. And then my wife might point to pictures my vivacious daughter and smiling infant son.
Ok, I get it. I do have it all. And I know… there is Darfur, 9/11, Rhawanda…no one has a right to complain about anything. I should be happy…I KNOW that…I wish I was a better person. But it still bothers me…
And then, sometimes, she’ll say something like this:
“Greg…that youtube thing is in the news because it is fantastically rare, unusual, unnatural…in other words, it IS news. That kind of thing happens to one person in 6 billion. You don’t get upset what some dope wins the 200 million dollar lottery Powerball, but youtube upsets you? So this kid posted videos. Maybe it was even a good idea. But the lottery winner bought a ticket with his Ring Dings, a good move on his part also. If you want to, go, go and do that…join the hundred-million wannabees who believe in the overnight and never make it…like your idiot-friend Jim [I will blog about Jim one day] who produces gorgeous brochures and raises endless money for idiotic ideas that he, himself, doesn’t even believe in in the hopes that one will ‘hit it’. Forget about what you read, how many people do YOU know, you know personally, that are doing better than you? Aside from the more outrageous things you want to do like flying privately, what is there that you truly want that you don’t already have? Listen: maybe there is a way to make money quickly, a super-duper idea that transmogrifies you into a billionaire and doesn’t take a lot of work…I know you like the VC stuff and have your friends in that world and they all talk about the big scores….if there is a knack for that, I don’t have it. But I do know how to build a sustainable business on sound principals…I know from my family how to take advantage of good years and ride out the bad ones, and how to build significant wealth over years. You bring in the sales, chart the direction, and I’ll make sure we hold onto it and the firm has the internal processes and access to capital to sustain that growth. You may never make the paper, and maybe that all seems quite dull to you…but real power is quiet, and real wealth is built over time.”
My wife has a point…and it reminds me of something I read that Warren Buffet (whom I am not married to) had said about “super stars”…something that might be applicable in this context. A billionaire himself many times over, he did it over many years and by investing in “unsexy” businesses, usually non-technological..for example, Dairy Queen was a business Buffet invested in. In Warren’s own words:
"I would like you to imagine a national coin-flipping contest." Let's imagine all 268 million people in the United States are asked to wager one dollar on their ability to call the flip of a coin. "If they call correctly, they win a dollar from those who called wrong." After each flip the losers drop out, and on the subsequent flip the stakes multiply. Each person has a 50-50 chance of calling each flip and approximately half of the people will lose and drop out each round. After ten flips there would be approximately 260,000 people that had successfully called ten consecutive coin flips. After 20 flips, based purely on chance, there would be approximately 250 people that had called 20 consecutive coin flips - a seemingly miraculous feat.
The surviving callers would have over one million dollars each at that point. Press coverage and inquiries about their coin calling ability would increase with each successive flip. Several callers might even attempt to profit from their good fortune by writing books on coin calling, setting up 900 phone lines, or by sending mass mailings or spam Email solicitations offering to share their secrets with intrigued members of the public.
As with winners of the lottery, it’s obvious that those remaining would have been blessed with good luck. But what if a large percentage of remaining coin flippers had a common characteristic or trait. What if a disproportionate number had came from one town or had been educated by one "patriarch." Would this signify that more than luck was involved in calling coin flips?”
The Buffet comments are true of dotcom things as well. The dollars in the youtube case are to dollars of the stock owners of Google who capitalized that company so fantastically, that it can now go out and buy that 1.5 billion dollar web site that made it where, no doubt, thousands of similar sites did not reach that critical mass.
So, do I feel any better for all of this? I dunno. But I am, at least, comforted that I am not alone. And while I fear the resurgence of the dotcom mentality, of people spending ridiculously, of instant millionaires and billionaires and renewed sense of I-should-be-able-to-retire-by-thirty entitlement in the twenty-somethings…my wife reminds me of one other thing…
This crazy spending, this excitement of tech and the internet…all this stuff…a hot tech sector is good for our business. We can probably raise our rates J
This tip comes from Marty Waz (described yesterday in my post about Publishing as Web Services) . As you’ll remember, I’m at the Virtual TS Boot Camp, where we did a simple BizTalk 101 project – Marty Waz Style. Basically, it’s a Hello World Web-Services project, but using all best practices and done in 20 minutes.
Ok. Not a problem.
But it turned out to be quite a problem. The class is made up of mostly Virtual TS’s and actual Microsoft TS’s so it’s not like it’s a slacker group (although we’ve all run into the occasional bonehead TS). Probably one of the best groups to program BizTalk outside of the actual BizTalk Server team at MS. Anyway, enough praises – cause we sucked big time. Not a single person was able to do the assignment even with extra time following all of Marty’s best practices. Personally, I forgot to isolate the external schemas from the internal, used maps inside my orchestrations, and used Schemas directly as Messages.
Well, that last part is the topic of this post. Marty showed us how to save an extreme amount of time by loosely coupling our messages inside our orchestrations. No more messages of type schema. It’s a little odd, so let’s start from the beginning.
Here’s the non-leet method: Create your orchestration. Add a receive shape and a logical port. Well, now I need a message. Add a new Message in the Orchestration Explorer. Set the Message Type to the schema you want. Hook up your receive to that logical port. Nothing out of the ordinary so far. And let’s do something that should be pretty easy: change our schema type. So we go to the Message, select the Message Type and select a different Schema. We get the following error:
Property value is not valid: One or more Send or Receive actions are connected to Ports and are using this Message. Please disconnect the actions before changing the Message Type.
Now this is a fairly common thing. I mean, sometimes we change our schemas – during development this happens all the time. The object oriented equivalent is changing variable “int foo” to “double foo” in code. What if you couldn’t do that without removing all the references to foo. That would suck.
Here’s Marty’s super hot way around this: Create your orchestration. Add a receive shape. Well, now I need a message. ADD A NEW MULTI-PART MESSAGE TYPE. Give it name that doesn’t include the schema –remember, you are using this as an abstraction over your schemas so you can change between types (Object oriented analogue: changing “int foo” to “double foo”). Change the “MessagePart_1” to “Body” (CAPITAL B – it’s important). Now set the Type for this to the schema you were going to use before. NOW add a normal Message, name it, but instead of choosing a Schema for the Message Type, choose your Multi-part Message Type. Use this message like you normally would.
Go ahead, try changing the underlying schema type. Instead of doing it at the Message Level, you can do it at the Multi-part Message Type. Your links are still valid because the ports are bound to the wrapper around the schema (multipart message), not the schema itself. You have successfully changed from “int foo” to “double foo”.
Sounds pretty simple, but no one in the room knew it. So I figured I would blog it so we don’t see any more of this in the field. So, there you go, no more schema type messages, only multi-part messages.
[Editors note: this text is a little confusing without sitting down with an orchestration and trying it yourself. I may post a video shortly that walks you through the changes.]
"But I swear my Two Way Ports are Public scoped"
Publishing an Orchestration as a Web Service: it's a common thing. You create an orchestration; create a send-receive logical port; and try to expose via web-service. Ah, but you forgot to make it Public scoped - by default it's Internal - no biggie. Intuitively, per the error message you get ["There are no orchestrations with public receive ports in this BizTalk assembly. Click back and specify a BizTalk assembly containing orchestrations with public receive ports."], you change the scope to Public and re-try the Publish Orchestration as Web Service.
But you still get the message that it's not public.
I have run into this a number of times, and I should be ashamed because I have listened to erroneous blog posts that tell you to re-write your project. Normally, my projects are small enough that it doesn't matter.
But now, here's the canonical word on the subject - it comes via Marty Wazsnicky, Regional Program Manager at Microsoft and head of the Virtual TS program (which I am a part of). Mix equal parts caffeine and BizTalk and you have Marty. It's ashame he doesn't blog more often, because he's full of good information.
Anyway, to solve your problem Restart the BTSNTSVC.exe. As Marty explains it, BizTalk 2006 uses .NET 2.0 caching for inspection of the Assembly that contains your newly public ports. Thus, it never really inspects your new assembly and just relies on the old assembly (with Internal port scopes). This is a dependency on the .NET CLR 2.0, so that's why this is a problem with BizTalk 2006 and not BizTalk 2004.
To sum up: Restart the service, the caching goes away and you can now create your service.
Seems like there's not a lot of activity here - but I assure you there is..just not on the publish side. I've gotten about 20 emails (and a related number of comments) from people who are running into problems with the SharePoint Forms Authentication. Proves at least my setup isn't unusually bad ;) In fact, my post on the "File Not Found" issue was translated into Japanese!
Right now I am outside of Boston (Waltham) getting training from Marty Waz from Microsoft in BizTalk Server 2k6. Already both certified and a Virtual TS in BizTalk, but this is the code-until-you-drop-14-hour-a-day program that makes the VTS team worth its salt. Hopefully will be able to blog a few lessons.
Speaking of blogging a few lessons, I have run into a number of SharePoint issues that I uncovered from our internal implementation and from our clients. I'll be blogging them this week now that I have a "manageable" 14 hour a day schedule. *Gulps Coffee* Hopefully I'll get a post out tonight - thinking SharePoint Forms Authentication and how it breaks MySites.
In the previous entry I mentioned that the project’s UI design required me to create an interface similar to the Office 2007 UI. I decided to start with seems to be a simple part: tab control. In the proposed design it looks like that:
While the standard Tab looks like this:
So I started to play with the available properties of the Tab control in XAML. While I managed to apply the appropriate gradient backgrounds, I still needed to modify the shape of the tabs and the background of selected tabs. The internet search yielded the suggestion to use the Interactive Designer to create a custom template and style for the standard WPF’s TabControl. And I desided to fiddle with the Interactive Designer, thinking that if this tool is created for a non programmer type in mind, I should be able to figure it out pretty easy. I took the Martin’s guide for creation of a glass button and tried to follow the steps to create a required style for the Tab. That was a mistaken assumption. I immediately got lost in the hierarchy of the objects. After many tries, I finally came upon the SimpleStyles sample which is a part of the .NET 3.0 SDK. It is located in the Controls\ControlTemplateExamples\XAML folder and contains minimal templates for all standard controls. So I took the template for the Tab control as a base and using the VS started modifying XAML by hand. As it occurred later, this was the best decision for me to get things done. Every time I needed to get the custom style for a standard control, the SimpleStyles sample proved to be the best way to approach creation of the custom templates. You can download the resulting XAML from here:
Recently I was submerged into the WPF. I had to create a proof of concept screens for one of the clients. The UI that was designed closely resembled the Office 2007 interface with Ribbon and such. So I bravely jumped into WPF. Installed .NET 3.0, Orcas extensions for VS, Interactive Designer and started on the UI. It is only after I jumped, I realized that am in a completely new world of the client development, that the learning curve has become a “learning cliff” and all of the tricks that I had learned when developing WinForm applications don't work here anymore. I had to start learning basics. Layouts and positioning, coloring, fonts and text etc... And as an early adapter you encounter with limited information available on the subject. There's only one book exists at this time (Chris Sells and Ian Griffits). Everything else is spread around in the WPF blogs, MSDN forums and documentation. When starting development with WPF you are presented with just a somewhat XP like looking standard controls. How do you change the look and feel of the control? Umm... inherit from the control and override some painting procedure... Right? - Nope, wrong! You create your own template and style in XAML! After 4 days of intensive “how do I do that, try, learn, search, download sample, try again...”, I started to see the light. The bits started to fall into pieces and the world had become a logical place to live again. With a mix of amusement and excitement I realized that MS had finally achieved its long winding goal - separate the presentation code from the functionality. A somewhat sophisticated UI that I have created had almost non existent C# code. Everything else has been done in XAML. In the next posts I'll try to share a few tips that I learned during this process and hope they'll help somebody ease up the transition.
This post comes from a former employee of mine, Joe. He is from Europe and moved there about a year ago. He started a small consultancy there, and we keep in touch.
I hope all is well with you and Infusion. I spoke with **** recently and he indicated that business was good which is great to hear. I’m doing well and am enjoying running my own little business. I have a question for you, and am hoping I still qualify for the ‘Ask Greg’ category. Whether you want to answer this on your blog or not is up to you.
I am in a position where I am getting many more work offers than I can handle and it’s starting to bug me. I’m seriously thinking about hiring someone in the New Year and while it is still a few months off, I want to prepare as best as I can. To that end, do you have any advice of things I need to look for and look out for? I realize the legal matters are much different here in Europe, but I believe there is much more than legal issues when trying to go from a one man show to a multiple person company. I remember your advice to start a product business but I have yet to stumble upon a good idea for that. In the meantime I am doing consulting work and having a great time with it.
Thanks for any advice and all the best to you and all the folks at Infusion.
Well, I think the first order of business is that you need to be very honest with yourself. Honest about a couple of things. First, you aren’t running a business yet. You are an individual sub-contractor. And while you can do quite well this way for a time, there is an ultimate limit on your compensation (there is only so-high an hourly rate you can get, regardless of your skills), so you are well advised to be thinking of hiring other people. Bringing on other people is an entirely new dimension.
The thing you have to be honest about when bringing on another employee into a services company, is whether or not you legitimately have something to offer them relative to other opportunities they can pursue. And this goes to the heart of what kind of company you want to be. As a services company, you need to make a choice up front: you are going to go commodity or high-end. You cannot do both. Choose now.
Commodity (sometimes known as “body shop”) is where you will compete with Indian, Chinese, and other vendors for on-site positions. You are looking at lower-end development talent, not necessarily the brightest stars, but folks that have a demonstrated ability in a specific technical area that you clients ask for. This is really a war of resumes and rates. We at Infusion didn’t take that path (we chose to go high-end, but more on that in a moment) but that doesn’t mean you can’t make money at the lower end. In fact, the market is much much larger for lower end talent than higher end. The good part of commodity services is that it is relatively easy to hire a given skill set if that is all you are hiring for. So your client says, “I need a VB.NET guy to do some winforms” and you go off and look for exactly that skillset. He might not have good communications skills or have other deficits, but he meets the client-stated criteria. You place this guy in the position, and make a cut of their billable. They might even be subcontractors of yours as opposed to employees. You will have to do a lot of volume to make any money and your turnover is high, but you grow to a significant size doing this. And for wrong or right, there are many clients who are just looking to hire a “VB guy” or a “C#” guy or a “BizTalk guy” and don’t know how to evaluate the person overall.
For a commodity (body shop) business:
· Easy to find and hire people, you can scale quickly
· People are not expensive
· Many clients are only focused on resume and skillset, so very large market for these type of resources. Especially in government.
· You can get quite large very quickly just filling open requisition.
· You will not be known for quality or exceptional work, quality will always be a problem
· Very high turnover, your people will be opportunistic and not have loyalty. Your clients will convert your best people to full-time eventually.
· Very low margin (you will have to do a lot of volume)
· Not much fun, you won’t be working with the best and brightest
· A *lot* of competition. You will have to be very aggressive in selling clients and selling recruits
· Impossible to distinguish yourself from thousands of other companies doing similar work
· A down market will wipe our most your business. You will only make money when the market is up.
· Managing lower-end talent is difficult and draining, you will have to put out many fires as they leave, disappoint, or otherwise cause difficulties with your clients.
· You need to be an *excellent* judge of character. You will come across liars, cheats, dishonest, disingenuous, lazy, angry, disturbed people. You will encounter the whole range of the human spectrum. And some are dangerous to your business. You need to make sure they don’t get in.
Personally, I got into IT to do solutions and change the way (for the better) business gets done. So although there is money in the commodity model, I wasn’t interested in it. We went high-end.
High-end is where you become more of a boutique. Your people are of unusually high quality, and clients come to know you for exceptional service. Here are the pros and cons
· You will establish very loyal customer base that will sustain you even during down markets
· Easy to distinguish yourselves from competitors, very few quality shops out there that deliver as promised
· Over time you will get more and more interesting strategic projects as your firm gains reputation and matures
· Sales become progressively easier as you a build a network of satisfied clients
· Good retention of your best people
· Many new business opportunities for products, new services, etc. will open up for you as clients come to know, like and trust you.
· Very hard to hire people. You will go through 100-300 resumes and almost that many interviews …and if you find one person of quality, you are doing quite well. Quality is very, very tough to find. Your size will always be constrained by your rate of hire.
· Challenging to find growth paths for all your motivated people. A “job” is not enough. You will need to show career road-maps to people.
· High maintenance. Quality, high-end people often have egos or a slightly self-inflated sense of entitlement and accomplishment. It can be difficult to navigate, so unless you are comfortable wearing “kid gloves” and spending a lot of time explaining your strategies to them, this is not the path for you.
· Very capital intensive, you have to provide higher-end salaries, bonuses, and additional incentives to keep your people happy. Takes a lot of money to find, recruit, and keep high-end talent. Often your talent will ask for salaries and bonuses that leave to margin. So you need to offer compensation in other ways, such as percentage of revenue of the people they manage, etc. Very difficult to set this up effectively.
· Cash Flow Crunch: you must pay salaries regularly, but clients and work bring in revenues sporadically. A client slow to pay can put you out of business. You need a capital source behind you, a sizable one, to ride through delayed projects and late payments. You will be most stressed financially and most likely to go out of business when business is good!
Anyway, if you go body-shop, not much to tell you. Put an add on monster, you’ll get 300 applicants from all over the world in 15 minutes. But you are best off finding the position first based on your own reputation and then hiring to fill it quickly. You do not want to hire ahead of the position, or you’ll end up with this person on the bench, sucking all the resources out of your company. You become like a trader, you’ll need to identify the opportunities quickly, find the resumes, get the resumes to the client asap, bill as low as you possibly can, and get the guy in there. Then repeat. And that’s all there is to body shop.
For high-end, like I said, it is tough. The idea here is, you want to hire someone *better* than you. Or at least as good. But smart people will quickly look around and say, “hey, you are billing me at Y but only paying me X!” and you’d better have an answer for that, or they will simply leave you or take your client. Which brings me back to what I said earlier: you have to have something compelling to offer them. For Infusion , we offer a drastically ramped up skillset (we work with the latest techs), interesting resume enhancing clients, work in New York City, Boston or Toronto (or all three at different times) and have different paths to different forms of management. Most recently, we added the opportunity for our folks to actually start their own businesses with us backing them through Infusion Angels. But most significantly, while at Infusion, you’ll always be learning.
For a one man shop, you don’t have all this yet. Expect to go through a few different first hires before you find one that sticks. Also, be prepared for every spur and dark thought you directed at any of your bosses to revisit you (now that YOU are the boss) one thousand-fold! You will be astounded at the things you find out your employees believe about you, your company, the way you do business, you name it.
I would recommend you look to find a business partner or two to start the company with you. That way, one partner can bill to pay the salaries of, say, one employee and the other partner, who can then sell, recruit, etc.
In conclusion, whatever path you take, the main skill you need to develop is the ability to gauge and motivate other people. To divine their motivations, reliability, ability…and to be able to motivate them and align them with your vision. That is, you need to become a leader. In my experience, leadership has an innate component to it, you either have the seed or you don’t. Some people are great executers but need to be directed. Nothing wrong with that…executers/lieutenants are the ones that actually get things done. First thing is to figure out whether you are a leader or not. Don’t be sure you know. See what success you have in managing other people and whether you are successful at it. If you don’t enjoy it and/or are not able to make it work, you might be a “behind the scenes” person…which is fine, but if that’s the case you’d better be honest with yourself and find another, more outward-facing partner to supplement you.
But if you are a leader, understand also that a good deal of leadership is learned from experience; prepare to make a number of mistakes for a number of years. It is also good to keep contact and seek the advice of people who you respect as leaders themselves. And my final suggestion is to read, read every decently rated book on leadership and business that you can. For most of my twenties, there was never a time I wasn’t actively reading a business book. Everything ranging from biographies of companies, to business leaders, to history. I could fill a small library with the number of titles I read. And I still have a few and reread from time to time.
So, I recommend that you *do* hire. But understand that this first employee will teach you far more than you will teach him or her. Good luck.
I have been working with SQL Server 2005 a bunch, and recently found a few tools that I'd like to share. In our, like many projects, we need to save sample data and have ability to reload it for testing, for constant information, etc.
I found two tools that do this:
- http://vyaskn.tripod.com/code.htm#inserts has a procedure called sp_generate_inserts that after running on your server, will allow you to generate insert statements for any table you point it to.
- http://www.codeproject.com/useritems/enisey.asp - Enisey MS Sql Studio 2005 - add-on. Nice in that it integrates into Sql Management Studio, but it does not automatically turn off identity columns, like sp_generate_inserts does, so you have to do that manually.
In general, SQL Server Management Studio is a pretty sweet tool, although Visual Studio now has some capabilities to do some of the same things that you can in SQL Management Studio. Here is one good article describing some of the niceties of the new tool. http://www.developer.com/net/article.php/3587206
A cool tool is Prompt SQL, which allows you to add intellisense to your SQL coding - http://www.promptsql.com/. I just installed it, and am trying to figure out how to get it to connect to the SQL server.
Some of the features I've been playing with are templates, which are predefined pieces of code for common tasks, such as creating views, etc. I also looked at projects, which I don't find useful (at least not yet), it seems to be simply a way to group your scripts, without any automatic script generation like you have in Visual Studio, when you for example drag a table definition to the database project and it generates the create script for that table automatically. I would like to have seen the two projects to be identical, so you can use them both in VS2005 and SQL Server Management Studio. Another feature that i like is ability to connect to all kinds of SQL Servers, including Reporting Services, Analysis, and Integration, all from one console.
Also, I was playing with Common Table Expressions in T-SQL recently, pretty cool stuff - allows you to recursively go through a table when you have things like hierarchies (i.e. parent and children). In our project we have an organizational hierarchy that is described in one table, and we are using CTEs to create one table that shows you all the users and their parents.
(thanks for the pic, Kurt)
You have worked on several projects, often at the same time, with each client requiring a different configuration, you like to experiment and possibly implode servers, and you like to "undo" your detonations, you like to keep your laptop tidy and store everything away in its nice virtual world, you like to test your deployment in a complicated scenario, and you can do it all in one laptop, they give you two boxes and you immediately find yourself with six IP addresses, in short: you love virtual machines.
However "virtualized hell" has plenty of hidden surprises: I am sure you have already encountered a total loss of virtual disk (check out this post), like me, but what about network connectivity?
One nice day after lunch you will start a virtual machine that was working perfectly fine in the morning and find out that you cannot connect to anywhere. The symptoms are as follows:
- You have set your VPC to use one of the NICs of the host.
- You get a "This connection has limited or no connectivity" message on the network connection in the VPC.
- When you open the network connection status window you see that you have sent several packets but received zero. Zip. Nada.
- Your host machine is connected to a corporate network.
- Your host machine works fine.
If all of the above is true, chances are that the network administrators just modified something on your switch port, either because they are implementing new policies or, more likely, because you have been flagged as a dangerous individual, and expect security to show up soon.
The reason for this is that network administrators generally don't like people who connect homemade bridges to their sacred corporate network, and they often implement port-level security on the switch.
This setting can be configured to the max, but often it translates into just one noticeable restriction: it allows only one MAC address per port.
For example, on a Cisco switch the following is the configuration of a typical non-secure port:
switchport access vlan 110
switchport mode access
storm-control broadcast level 10.00
And this is what you don’t want to have to deal with:
switchport access vlan 110
switchport mode access
switchport port-security aging time 1
switchport port-security violation restrict
switchport port-security aging type inactivity
storm-control broadcast level 10.00
Note that in my case the violation clause was set to restrict, meaning that the switch will ignore anything that is not coming from your one and only MAC on your ethernet segment. So your host can communicate with the switch, because that's the first MAC that the switch sees on the port, but the VPC is ignored. Other options are:
- switchport port-security violation protect - Just drops packets.
- switchport port-security violation restrict - Like protect but it increments the SecurityViolation counter. When you reach the maximum somebody is going to notice it.
- switchport port-security violation shutdown - Puts the port into the error-disabled state immediately and sends an SNMP trap notification. Somebody is going to notice immediately.
Port security can also be configured to allow only a specified MAC, in which case you are in even more trouble because VPC MACs tend to change frequently. Note that this applies to Microsoft Virtual PC and Virtual Server, all versions, and VMware as well, actually it applies to things that haven't been invented yet, because it doesn't matter which virtualization software you use, it is the dual MAC that creates the issue.
In short: if you are experiencing network connectivity issues from a VPC and you tried everything else, then
- If you are legit you can ask your network administrator to check and maybe remove the port-security setting on your port.
- If you are not legit then you should buy yourself a cheap router and happily NAT your way into virtualized hell. Unless, of course, you need not external access, and can do with the local NAT option of the VPC or a loopback, as described in the VPC guy's blog.
After much toiling, the MPAC Web site (http://go.mappoint.net/mappointmpac/) is being updated. In the past 2 weeks, the team at Infusion has:
- Updated 11 of the code samples
- Updated the entire Java SDK to 4.2
- Created new content surrounding digest authentication in Java with the new release of Axis and HTTP Commons.
All of the code samples and SDK are running against the latest version of MWS (4.2), Axis 1.4, HttpClient v.3.0, and Java v. 1.5. It's been a while since an update to the files, and we are not stopping with those three updates. Over the next few weeks, we'll have new content, including:
- A Java FAQ pulled together with the most common questions we've seen over the past 2 years.
- How to build a VE locator in Java
- New code samples for integrating with traffic datasources, drawing polygons, and line drive maps.
After we get the above complete, we'll chart a plan to update the site with more Java articles ported from MSDN, new PHP content, and new Perl content.
Not long ago, Microsoft made me privy to a new site, http://dev.live.com/ . Primarily, they showed me the site because of my connection with Virtual Earth (MVP status has to have some perks, right?). Needless to say, I'm more than impressed with what they've done with the concept of an SDK.
A while back, Microsoft began promoting their "Live" platform. Windows, Office, Mapping, Searching, MSN, and many other platforms became a member of the "Live" platform. In essence, Live is code word for a group of online services. For instance, Virtual Earth is not just VE, but Virtual Earth Live (although, you never see "Live" mentioned anywhere). Microsoft wants to put developers at the forefront with Live by empowering them to quickly create unique and powerful applications without having to learn a lot in the process. Just look at Virtual Earth. In less than five minutes, you can get a stock VE map displayed on a Web browser. The only factor preventing developers with interfacing into all of the Live services was the documentation - or lack thereof.
Enter Dev.Live.Com, or Windows Live Dev. Live Dev is a fully interactive SDK that provides developers with the documentation needed to interact with most of the Live services. "So what?" you're saying. "That's just MSDN in a different location." Actually, it's not even close to MSDN. If you go to the VE SDK - http://dev.live.com/virtualearth/sdk/ - you'll experience a whole new concept on learning a Microsoft technology. No longer do you just read, download, execute, and re-read to figure out what you did wrong. Instead, using AJAX, Microsoft is giving you a working example, source code, and explanation within the same screen. Trying to figure out how to zoom into a specific level, simply click "Zoom to level 15" and you get a street level hybrid map (that actually works - it's not a static image). Want the code? Click the "Source Code" tab, and Microsoft gives you code to copy into your application. Not sure what "setZoomLevel" does? Click the "Reference" tab, and Microsoft gives you the comments on the method for a full explanation.
Microsoft is setting a new concept in SDK references. No longer should you download large zip files and have to fiddle with outdated code to complete a simple task. If the "Show me" tab displays a functioning example, the "Source Code" tab has the code powering it. Very cool, and very worthwhile to check out.
Mobile workers need the right tool to do their job effectively. Finding the right device for any given scenario can be a challenge. Is the user working indoors or outdoors? Does their work require advanced UI interactions? What if they need to receive alerts and status messages while driving? Sometimes, one single device cannot do it all. Thanks to the power and reach of .NET, there is no need to compromise. Give your users the power of a rich Tablet PC application while extending this power with the real-time, mobility and convenience attributes of a handy Smartphone (or any Windows Mobile phone). Tablet PCs provide the power to fully enable mobile smart client applications using rich user interfaces, mobile pen-based input, massive local data storage, online and offline capabilities, field sketching, and more. Smartphones and pocket PC Phones on the other hand can extend mobile applications by providing simple digital photography, 24/7 alerts, status information, online access via Bluetooth, voice notes and more. This session, complete with insightful demonstrations, explores some of the techniques mobile .NET developers can leverage to bring powerful mobile applications to life using a combo of Tablet PC and Windows Mobile phone.
Join me today at 3:00 PM EST for an MSDN Webcast titled Tablet PCs and Smartphones: Working Hand-in-Hand to Enable Your Mobile Workforce. This is a repeat of a very well received session I did at the Microsoft MEDC 2006 at the Venetian in Las Vegas last May. You can register for this Webcast using the link here.
Here are a few notes regarding this session:
- The final slide deck from MEDC that I am using for this session, as well as the demo code, are already available here on my blog. You can download the PowerPoint presentation directly from here and the complete demo code projects here. The solution includes both the Windows Forms project for the Tablet PC and the .NET Compact Framework project for the Pocket PC. You will need a Tablet PC and a Pocket PC with Bluetooth adapters and the Microsoft stack to use these demo projects. Note that the NETCF UI was optimized to run on a Palm Treo 700w.
- If you have questions about this topic or others, you can ask them here in a comment, or you can also contact me through my blog here.
- You can use this blog post to start discussions on the topic.
- Finally, if you need help in your projects around mobile development and location technologies, feel free to contact me via my blog contact page to see how Infusion can help you with development, training or mentoring.
(This is the second post in a series on Forms Authentication in SharePoint 2007. I announced this series a little while ago over here and continued it here)
This is an error that until today signaled the end of using Forms Authentication for a web application. Every once in a while, after setting up an application to use Forms Auth, I would get "File Not Found" when I was redirected to the login.aspx page. Not a 404 mind you, but simply a web page that said "File Not Found" (just the text, no SharePoint chrome). Basically, whenever I tried logging in, I wouldn't even be given the chance - and since I needed to be logged in - it would effectively bar me from the site completely.
I didn't really have a good workaround for this until I really started digging through the SharePoint code to find out what was causing it. I am not sure how wide-spread this problem is, but I've had seen it so far on all of my installations, so I thought I would post this fix below. It's not supported by Microsoft and when I brought it to the internal SharePoint DL, they didn't really have a solution. (Take note: before implementing the solution below, you should make a back up copy of login.aspx and authenticate.aspx):
Basically, the error is caused because the Microsoft.SharePoint.ApplicationPages.dll assembly is not accessible by the login.aspx or authenticate.aspx. I noticed this by removing the following tag from login.aspx (under \program files\common files\microsoft shared\web server extensions\12\template\layouts): < %@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=220.127.116.11, Culture=neutral, PublicKeyToken=71e9bce111e9429c"% > (remove spaces between < and %). This caused me to get compliation error, but it actually loaded the file. So, throwing that tag back in, I just simply needed to make sure that the ApplicationPages assembly was available.
My solution was to toss the ApplicationPages assembly into the GAC (again, this is my work around hack - this "shouldn't have to be done" according to MS but they gave no reason as to why this file wouldn't be able to access the ApplicationPages dll in the first place). You'll find the ApplicationPages dll under \program files\common files\Microsoft Shared\web server extensions\12\CONFIG\BIN.
Next you should should be able to navigate to /_layouts/login.aspx and get your normal login page. However, when you click the "Sign In" link from SharePoint this will take you to /_layouts/authenticate.aspx which will now give a similar "File Not Found" but this time with the SharePoint chrome. Again, the ApplicationPages assembly tag is the culprit, so I replaced the stock < %@ Assembly Name="Microsoft.SharePoint.ApplicationPages" % > with the < %@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=18.104.22.168, Culture=neutral, PublicKeyToken=71e9bce111e9429c"% > from the login.aspx. After I did this, the problem worked fine.
Again, this is something that you'll have to do on each server that is affected by this horrible problem. It doesn't seem ideal, and yes it is probably a bug in SharePoint, but if you want to get Forms Authentication to work in Beta 2, this is the kind of hack you might have to do. After I made this change, I never ran into the dreaded "File Not Found" exception again.
Do me a favor and shoot me an email () if you have run into this problem. I'd like to see how many people actually come across this problem.
(This is the first post in a series on Forms Authentication in SharePoint 2007. I announced this series a little while ago over here)
One of the main problems I was having with SharePoint Forms Authentication was getting it to recognize and list users from my new authentication provider. Once you switch authentication providers, you have to manually add the first authenticated user to SharePoint from the Central Administration. The reason for this is quite simple: the normal administrator credentials you used before won't be recognized under the new provider - so you have no way to log into the site under the new provider.
But what I found was that after going to "Policy for Web Application" (the page where you manually add the first authenticated user), is that Central Administration can't list or recognize your new user names. Being new to using ASP.NET provider model, I assumed I simply had the database set up incorrectly - not so. I just missed one essential step: You must add the provider settings to BOTH the Web Application web.config and the Central Administration web.config. I can't stress this last part enoguh. If you don't add the provider settings to the central admin, you won't be able to access the new credentials store, and thus won't be able to add users.
Sounds pretty intuitive once you think about it (how else would Central Administration know about the new provider) and indeed SharePoint gives a warning about this (albeit a small one) on the left hand side when setting the provider on the Authentication Providers page:
The membership provider must be correctly configured in the web.config file for the IIS Web site that hosts SharePoint content on each Web server. It must also be added to the web.config file for IIS site that hosts Central Administration. [Emphasis mine]
But to first time users of Forms Authentication in SharePoint (which we all are), this is a little counter-intuitive. We kinda assume that adding the provider details for the individual Web Application is enough. And indeed, I think the central admin web.config will become bloated with providers from every site that it's managing. All in all, I think it's a poor choice to rely on the central admin web.config and not using the web.config of the individual sites, but I am sure there are specific reasons why MS chose this model.
I think I'll file this under "things you'll probably run into if you're doing SharePoint Forms Auth." Next up in this series, the infamous "File Not Found" exception you will probably run into if you do Forms Authentication enough.
I'm currently working on a Federal Disaster Recovery Collaboration demo that heavily leverages InfoPath and Forms Services from Microsoft Office SharePoint Server 2007. If you're not familiar, MOSS 2007 and Forms Services allows for InfoPath forms to be displayed directly in the browser. Normally, Forms Services works out of the box, but the other day I ran into a bit of an odd situation.
Heres the error that I got:
This form template is browser-compatible, but it cannot be browser-enabled on the selecte site. This may be caused by one of the following reasons:
- The server is not running InfoPath Forms Services
- The necessary features are not available on the site collection
- The policy setting on the server does not allow users to browse enable templates.
The solution seemed pretty straight forward: enable Forms Services on the Site. Looking at the suggestion from InfoPath, perhaps I didn't have the SharePoint feature that allows Forms Services on my site. So, I went to the SharePoint Features page under Site Settings and activated the Office SharePoint Server Enterprise feature. Rerunning the publishing Wizard, I expected this to fix my problem ... but it didn't.
This turned out to be a bit of a noodle scratcher until I realized that although I enabled this feature on my subsite that I was going to publish to, I didn't enable it on my Site Collection. So, the solution is enable Forms Services on the Site Collection (Site Settings -> Site Collection Settings -> Features). Since I was trying to publish initially to the site collection, it rejects the form (even though the subsite could publish).
Now why did this work out of the box before on my previous installations? My previous installations used the Corporate Intranet Publishing Site as a template for the site collection; the broken one used the Internet Presence template. The difference here is the the Intranet Publishing Site activates these features by default - Internet Presence does not.
So the lesson here is: if you're going to use Forms Services on an Internet Presence site, activate the Office SharePoint Server Enterprise on the Site Collection first.
SharePoint 2003 had alerting functionality, whereby a user could subscribe to a list and would get an email alert if anyone changed the list. Basically, it was useful if you had a document library and you wanted to know when someone posted to it. I personally found this feature to be annoying at best, but apparently everyone else found it to be a super useful.
Well, now alerts form the basis of Workflow tasks in SharePoint 2007. And if it's not abundantly clear, I absolutely *love* using workflow in SharePoint. I thought that Workflow would handle it's own emails, but it turns out that by default it uses two different types of emailing systems:
- Code emails: these emails are genrerated directly in the workflow. An example is an email the user get when a workflow is kicked off.
- Task alert emails: these emails are generated via the Alerting system. An example of this is the alert that user gets when a Task is waiting for him.
To my dismay, there was a distinct difference between these emails: code emails were fast, task emails were dead slow. Turns out the problem is not confined to Workflow. By default, alert emails in SharePoint are throttled to being sent every 5 minutes. For most people, this is apparently acceptable - but for real time demos it's a deal breaker. I can't wait 5 minutes for SharePoint to send me an alert.
Apparently, there's a way to change this. Originally, this help comes from David Mann () in the betanews workflow group. He clued me in that there's a setting in SharePoint that throttles the email. He didn't remember the command to fix it, but I found that tip here. Basically run this stsadm command:
stsadm.exe -o setproperty -pn job-immediate-notification -pv [minutes]
I haven't tried setting this lower than 1 minute, so I am not sure whether zero is a valid option, but 1 minute is fast enough for me. Now both types of email are pretty much instantaneous. Certainly, a worthwhile setting for anyone expecting SharePoint instantaneous alerts to be really instantaneous.