Skip to content
Pro LINQ Object Relational Mapping with C# 2008

Book Review-Pro LINQ Object Relational Mapping with C# 2008

Over a year ago (I think) my buddy Vijay Mehta handed me a copy of his book Pro LINQ Object Relational Mapping with C# 2008 After he explained the title to me (no I’m not really kidding), I said thanks and put the book aside until I could think about it. Well that time was this weekend. (Yea, I’m slow.)

The problem that I was trying to solve this morning was to anchor my thoughts about LINQ and where it fits in. Yea, I know that I should have been spending more time understanding LINQ but I just haven’t had time. I learned enough to be able to read a LINQ query when I saw one in code but as far as really digging in – it just hadn’t happened for me yet. So I sat down to do a read of Vijay’s book.

The book really talks about LINQ as it relates to LINQ to SQL and LINQ to Entities (Entity Framework). Having had the pleasure of sitting across a table from Vijay I could hear his voice in the text. I quickly was able to hear him walk through the core concepts of mapping for LINQ to work both for SQL and for Entity Framework. My need wasn’t to understand how to do the mapping to create providers for SQL or Entities (yet) but I appreciated the coverage of the topics. It allowed me to see “behind the curtain” to understand what’s going on in the background when I’m writing a LINQ query.

If you’re trying to understand how LINQ fits in, how to handle your data mapping, or how to create mappings between your data and your classes – it’s a good book.

Technical Conferences at 2X Speed

I go to a few conferences each year. Most of them I’m speaking at which causes some interesting dynamics. The first dynamic is I invariably am preparing for the sessions before I deliver them. I’m not saying that I’m not prepared for my sessions – just that I always do a dry run within 24 hours of my session to make sure that all my demos work. (Presenters will tell you that updates love to break demos.)

Add to that I’m generally spending a ton of time in discussions with my fellow speakers, MVPs, notables, and just answering questions. The net effect is that I really don’t have much time to go to sessions while I’m at a conference. Yet, one of the common questions I get is “Have you seen any good sessions?” The problem is the truth is no… because I haven’t seen any sessions. I hesitate to stop at no lest someone get the wrong impression.

In all honesty, the other problem with going to sessions is that I have to be keenly interested in the topic. I’ve got so many things I’m trying to cram in my head I try not to put things in that I don’t have to know. Of course, this means that there are only a handful of sessions that may relate to the kinds of things I need to learn about today.

Sometimes, like now, I get something new appear on my radar that I really need to learn more about. I’ve got some WCF REST web service stuff that I need to know and some Silverlight stuff I need to know. So what did I do? I went back to the conference videos for conferences I’ve attended (like TechEd) and a few that I didn’t make it to, like Mix. Between the two I found tons of content that relates to these topics. ARG. How am I going to get through all of that? Well, I’ll just change the way that time flows – for the videos.

So I start the video up In Windows Media Player, right click then hit Enhancements and finally Play Speed Settings. I then slide the play speed to 2.0 and watch the session at 2X speed. I find I can keep up with the presenter (barely) at 2x. The end result is that I can make it through 2 sessions in the time it would take to watch on. I get a little bit of an advantage on my time.

If your version of Windows Media Player doesn’t have the enhancements menu, you can’t get to 2x play speed – you can, however, get to 1.4x play speed by pressing Ctrl-G after you’ve started playing the media. Still a pretty good investment on your time.

I find that this technique is even better than time shifting television with a DVR.

WARNING: Don’t try to do this for too long. You’ll come out talking to your family like an auctioneer.

Andrew Connell, Indianapolis, August 26th: Building High Performance Features and Solutions on Microsoft Office SharePoint Server 2007

I’m happy to announce that Andrew Connell of Critical Path Training has agreed to come to Indianapolis on August 26th (2009) to deliver his “world famous” session “Building High Performance Features and Solutions on Microsoft Office SharePoint Server 2007” to the SharePoint Users Group of Indiana (SPIN). If you’ve ever seen Andrew speak at a conference (Microsoft TechEd, SharePoint Connections, etc.) you know this will be a great presentation filled with tons of real world advice from the work Andrew has done with clients on large scale deployments of SharePoint. Andrew is perhaps best known for his Web Content Management expertise in the SharePoint platform but he’s also a powerful developer. Andrew and I worked together with Paul Andrew on http://www.mssharepointdeveloper.com/ where any ASP.NET developer can get 10 sessions on the basics of developing for SharePoint for free.

The abstract he provided for this session is:

“Performance should be one of the top areas of focus on everyone’s mind when embarking on a Internet facing Microsoft Office Server 2007 site. In this session we’ll look at the built-in caching capabilities in the SharePoint platform, including disk-based and page output caching. In addition we’ll take a look at various hot-button issues developers should be aware of when developing components for a public site built on MOSS 2007. Topics include object model techniques, how to properly manage memory in order to avoid the dreaded OutOfMemory exception, key sizing numbers to keep in mind when architecting your implementation and minimizing the page payload to speed up those page load times. After this session, you’ll be armed with the power to create high performance and scalable solutions in MOSS 2007!”

If you’re within three hours driving distance or so of Indianapolis I’d highly recommend you attend this meeting. The registration url is: http://spinaug.eventbrite.com/. The doors will open at 5:30 PM and the meeting will start at 6:00 PM. We’ve moved from our normal venue to accommodate a larger than normal attendance — however, we recommend that you sign up early to make sure that you get your seat at this special event.

MOSS 2007 Field Guids, Internal Names, Display Names, and Types

On a project I’m currently working on I needed to do some translations between Guids, Internal names, and display names for some of the out of the box fields so I generated a quick tool that would dump the fields out with their GUIDs so I could do the translation quickly. The output is below for those who might find it handy.

GUID Internal Name Display Name Type
246d0907-637c-46b7-9aa0-0bb914daa832 _Author Author Text
0fc9cace-c5c2-465d-ae88-b67f2964ca93 _Category Category Text
58014f77-5463-437b-ab67-eec79532da67 _CheckinComment Check In Comment Lookup
52578fc3-1f01-4f4d-b016-94ccbcf428cf _Comments Comments Note
370b7779-0344-4b9f-8f2d-dc1c62eae801 _Contributor Contributor Note
6b4e226d-3d88-4a36-808d-a129bf52bccf _CopySource Copy Source Text
3b1d59c0-26b1-4de6-abbd-3edb4e2c6eca _Coverage Coverage Text
9f8b4ee0-84b7-42c6-a094-5cbde2115eb9 _DCDateCreated Date Created DateTime
810dbd02-bbf5-4c67-b1ce-5ad7c5a512b2 _DCDateModified Date Modified DateTime
2ea78cef-1bf9-4019-960a-02c41636cb47 _EditMenuTableEnd Edit Menu Table End Computed
3c6303be-e21f-4366-80d7-d6d0a3b22c7a _EditMenuTableStart Edit Menu Table Start Computed
8a121252-85a9-443d-8217-a1b57020fadf _EndDate End Date DateTime
36111fdd-2c65-41ac-b7ef-48b9b8da4526 _Format Format Text
26d0756c-986a-48a7-af35-bf18ab85ff4a _HasCopyDestinations Has Copy Destinations Boolean
3c76805f-ad45-483a-9c85-7ac24506ce1a _Identifier Resource Identifier Text
c101c3e7-122d-4d4d-bc34-58e94a38c816 _IsCurrentVersion Is Current Version Boolean
b835f7c6-88a0-45d5-80c9-7ab4b2888b2b _LastPrinted Last Printed DateTime
43bdd51b-3c5b-4e78-90a8-fb2087f71e70 _Level Level Integer
34ad21eb-75bd-4544-8c73-0e08330291fe _ModerationComments Approver Comments Note
fdc3b2ed-5bf2-4835-a4bc-b885f3396a61 _ModerationStatus Approval Status ModStat
1020c8a0-837a-4f1b-baa1-e35aff6da169 _Photo Contact Photo URL
2eedd0ae-4281-4b77-99be-68f8b3ad8a7a _Publisher Publisher Text
75bed596-0661-4edd-9724-1d607ab8d3b5 _PublishingMigratedGuid Migrated GUID Guid
5e75c854-6e9d-405d-b6c1-f8725bae5822 _Relation Relation Note
edecec70-f6e2-4c3c-a4c7-f61a515dfaa9 _ResourceType Resource Type Text
16b4ab96-0ce5-4c82-a836-f3117e8996ff _Revision Revision Text
ada3f0cb-6f95-4588-bb08-d97cc0623522 _RightsManagement Rights Management Note
034998e9-bf1c-4288-bbbd-00eacfc64410 _SharedFileIndex Shared File Index Text
b0a3c1db-faf1-48f0-9be1-47d2fc8cb5d6 _Source Source Note
c63a459d-54ba-4ab7-933a-dcf1c6fadec2 _SourceUrl Source Url Text
1dab9b48-2d1a-47b3-878c-8e84f0d211ba _Status Status Choice
7841bf41-43d0-4434-9f50-a673baef7631 _UIVersion UI Version Integer
dce8262a-3ae9-45aa-aab4-83bd75fb738a _UIVersionString Version Text
78be84b9-d70c-447b-8275-8dcd768b6f92 _Version Version Text
b0b3407e-1c33-40ed-a37c-2430b7a5d081 ActualWork Actual Work Number
7b016ee5-70aa-4abb-8aa3-01795b4efe6f AdminTaskAction Action URL
93490584-b6a8-4996-aa00-ead5f59aae0d AdminTaskDescription Description Text
cf935cc2-a00c-4ad3-bca1-0865ab15afc1 AdminTaskOrder Order Number
9d76802c-13c4-484a-9872-d7f9641c4672 Anniversary Anniversary DateTime
d3429cc9-adc4-439b-84a8-5679070f84cb ArticleByLine Byline Text
71316cea-40a0-49f3-8659-f0cefdbdbd4f ArticleStartDate Article Date DateTime
53101f38-dd2e-458c-b245-0c236cc13d1a AssignedTo Assigned To User
f55de332-074e-4e71-a71a-b90abfad51ae AssistantNumber Assistant’s Phone Text
2aea194d-e399-4f05-95af-94f87b1f2687 AssistantsName Assistant’s Name Text
67df98f4-9dec-48ff-a553-29bece9c5bf4 Attachments Attachments Attachments
3329f39d-70ed-4858-b8c8-c5237634bf08 AttendeeStatus Response Choice
61cbb965-1e04-4273-b658-eedaa662f48d Audience Target Audiences TargetTo
1df5e554-ec7e-46a6-901d-d85a3881cb18 Author Created By User
e977ed93-da24-4fcc-b77d-ac34eea7288f AutomaticUpdate Automatic Update Boolean
96226eed-ec6f-4f0e-add5-9cfe66a441a0 AutoUpdate Auto Update Boolean
e9359d15-261b-48f6-a302-01419a68d4de BaseAssociationGuid Base Association Guid Text
7615464b-559e-4302-b8e2-8f440b913101 BaseName Name Computed
4f03f66b-fb1e-4ed2-ab8e-f6ed3fe14844 BillingInformation Billing Information Text
c4c7d925-bc1b-4f37-826d-ac49b4fb1bc1 Birthday Birthday DateTime
7662cd2c-f069-4dba-9e35-082cf976e170 Body Body Note
c7e9537e-bde4-4923-a100-adbd9e0a0a0d BodyAndMore Post Computed
af82aa75-3039-4573-84a8-73ffdfd22733 BodyWasExpanded Body Was Expanded Computed
6547d03a-76d3-4d74-9d34-f51b837c0879 Business2Number Business Phone 2 Text
344e9657-b17f-4344-a834-ff7c056bcc5e CallbackNumber Callback Number Text
92a011a9-fd1b-42e0-b6fa-afcfee1928fa CarNumber Car Phone Text
9ebcd900-9d05-46c8-8f4d-e46e87328844 Categories Categories Text
6df9bd52-550e-4a30-bc31-a4366832a87d Category Category Choice
2a464df1-44c1-4851-949d-fcd270f0ccf2 CellPhone Mobile Phone Text
3881510a-4e4a-4ee8-b102-8ee8e2d0dd4b CheckoutUser Checked out User User
6440b402-8ec5-4d7a-83f4-afccb556b5cc ChildrensNames Children’s Names Text
e52012a0-51eb-4c0c-8dfb-9b8a0ebedcb6 Combine Merge Computed
6df9bd52-550e-4a30-bc31-a4366832a87f Comment Description Note
9da97a8a-1da5-4a77-98d3-4bc10456e700 Comments Comments Note
038d1503-4629-40f6-adaf-b47d1ab2d4fe Company Company Text
27cb1283-bda2-4ae8-bcff-71725b674dbb CompanyNumber Company Main Phone Text
034aae88-6e9a-4e41-bc8a-09b6c15fcdf4 CompanyPhonetic Company Phonetic Text
35363960-d998-4aad-b7e8-058dfe2c669e Completed Completed Boolean
86a78395-c8ad-429e-abff-be09417b523e ComputerNetworkName Computer Network Name Text
939dfb93-3107-44c6-a98f-dd88dca3f8cf ConnectionType Connection Type Choice
3a4b7f98-8d14-4800-8bf5-9ad1dd6a82ee ContentCategory Content Category Choice
c042a256-787d-4a6f-8a8a-cf6ab767f12d ContentType Content Type Text
03e45e84-1992-4d42-9116-26f756012634 ContentTypeId Content Type ID ContentTypeId
b0204f69-2253-43d2-99ad-c0df00031b66 CorrectBodyToShow Correct Body To Show Computed
8c06beca-0777-48f7-91c7-6da68bc07b69 Created Created DateTime
4dd7e525-8d6b-4cb4-9d3e-44ee25f973eb Created_x0020_By Document Created By Text
998b5cff-4a35-47a7-92f3-3914aa6aa4a2 Created_x0020_Date Created Lookup
58eb8694-8bd6-4f98-8097-374bd97ffec4 CustomContentTypeId Content Type ID Text
81368791-7cbc-4230-981a-a7669ade9801 CustomerID Custom ID Number Text
38269294-165e-448a-a6b9-f0e09688f3f9 Data Data Note
a9ea6e2d-bc5c-4ccc-bad8-8ddfe519710f DataSource Data Source URL
24bfa3c2-e6a0-4651-80e9-3db44bf52147 DateCompleted Date Completed DateTime
ac3a1092-34ad-42b2-8d47-a79d01d9f516 DecisionStatus Status Choice
4ed6dfdf-86a8-4894-bd1b-4fa28042be53 Deleted Deleted Boolean
05fdf852-4b64-4096-9b2b-d2a62a86bc59 Department Department Text
9730102c-9470-4515-960e-6dfb2d89a68b DetailLink Detail Link URL
59956c56-30dd-4cb1-bf12-ef693b42679c DiscussionLastUpdated Last Updated DateTime
c5abfdc7-3435-4183-9207-3d1146895cf8 DiscussionTitle Discussion Subject Computed
f0218b98-d0d6-4fc1-b15b-aabeb89f32a9 DiscussionTitleLookup Discussion Title Lookup
dd83a5ed-83c5-47b7-823a-415c6ea1b8a3 DisplayFolder Display Folder Text
2fd53156-ff9d-4cc3-b0ac-fe8a7bc82283 DLC_Description Description Text
80289bac-fd36-4848-b67a-bc8b5b621ec2 DLC_Duration Duration Number
081c6e4c-5c14-4f20-b23e-1a71ceb6a67c DocIcon Type Computed
4d54445d-1c84-4a6d-b8db-a51ded4e1acc Duration Duration Integer
503f1caa-358e-4918-9094-4a2cdc4bc034 Edit Edit Computed
d31655d1-1d5b-4511-95a1-7a09e9b75bf2 Editor Modified By User
fce16b4c-fe53-4793-aaab-b4892e736d15 EMail E-Mail Text
e232d6c8-9f49-4be2-bb28-b90570bcf167 Email2 E-mail 2 Text
8bd27dbd-29a0-4ccd-bcb4-03fe70c538b1 Email3 E-mail 3 Text
8cbb9252-1035-4156-9c35-f54e9056c65a EmailBody Email Body Note
32f182ba-284e-4a87-93c3-936a6585af39 EmailCalendarDateStamp E-Mail Calendar Date Stamp DateTime
7a0cb12b-c70c-4f99-99f1-a232783a87d7 EmailCalendarSequence E-Mail Calendar Sequence Integer
f4e00567-8a9d-451b-82d4-a4447f9bd9a5 EmailCalendarUid E-Mail Calendar UID Note
a6af6df4-feb5-4dbf-bef6-d81230d4a071 EmailCc E-Mail Cc Note
e7cb6f60-f676-4b1d-89a3-975b6bc78cad EmailFrom E-Mail From Text
124527a9-fc10-48ff-8d44-960a7db405f8 EmailReferences References Note
4ce600fb-a927-4911-bfc1-11076b76b522 EmailSender E-Mail Sender Note
072e9bb6-a643-44ce-b6fb-8b574a792556 EmailSubject E-Mail Subject Text
caa2cb1e-a124-4068-9496-14feef1a901f EmailTo E-Mail To Note
b9e6f3ae-5632-4b13-b636-9d1a2bd67120 EncodedAbsThumbnailUrl Thumbnail URL Computed
7177cfc7-f399-4d4d-905d-37dd51bc90bf EncodedAbsUrl Encoded Absolute URL Computed
a1ca0063-779f-49f9-999c-a4a2e3645b07 EncodedAbsWebImgUrl Web Image URL Computed
2684f9f2-54be-429f-ba06-76754fc056bf EndDate End Time DateTime
20a1a5b1-fddf-4420-ac68-9701490e09af Event Event Type Integer
b8bbe503-bb22-4237-8d9e-0587756a2176 EventCanceled Event Canceled Boolean
5d1d4e76-091a-4e03-ae83-6a59847731c0 EventType Event Type Integer
6a09e75b-8d17-4698-94a8-371eda1af1ac Expires Expires DateTime
1c5518e2-1e99-49fe-bfc6-1a8de3ba16e2 ExtendedProperties Extended Properties Note
7d95d1f4-f5fd-4a70-90cd-b35abc9b5bc8 fAllDayEvent All Day Event AllDayEvent
8fca95c0-9b7d-456f-8dae-b41ee2728b85 File_x0020_Size File Size Lookup
39360f11-34cf-4356-9945-25c44e68dade File_x0020_Type File Type Text
56605df6-8fa1-47e4-a04c-5b384d59609f FileDirRef Path Lookup
8553196d-ec8d-4564-9861-3dbe931050c8 FileLeafRef Name File
94f89715-e097-4e8b-ba79-ea02aa8b7adb FileRef URL Path Lookup
78a07ba4-bda8-4357-9e0f-580d64487583 FileSizeDisplay File Size Computed
c53a03f3-f930-4ef2-b166-e0f2210c13c0 FileType File Type Computed
4a722dd4-d406-4356-93f9-2550b8f50dd0 FirstName First Name Text
ea8f7ca9-2a0e-4a89-b8bf-c51a6af62c73 FirstNamePhonetic First Name Phonetic Text
e9df93f4-7951-474b-8cc4-e240c2f5e600 FormattedGoal Formatted indicator goal Text
3366aae9-30a9-43f5-a2cb-1a6ee44e2ce4 FormattedValue Formatted indicator value Text
f53d350d-854e-4962-9318-89d56d30773a FormattedWarning Formatted indicator warning Text
65572d4d-445a-43f1-9c77-3358222a2c93 FormCategory Form Category Text
78eae64a-f5f2-49af-b416-3247b76f46a1 FormData Form Data Note
1fff255c-6c88-4a76-957b-ae24bf07b78c FormDescription Form Description Text
1a03fa74-8c63-40cc-bd06-73b580bd8744 FormId Form ID Text
96c27c9d-33f5-4f8e-893e-684014bc7090 FormLocale Form Locale Text
66b691cf-07a3-4ca6-ac6d-27fa969c8569 FormName Form Name Text
467e811f-0c12-4a93-bb04-42ff0c1c597c FormRelativeUrl Form Relative Url Text
17ca3a22-fdfe-46eb-99b5-9646baed3f16 FormURN Form_URN Text
94ad6f7c-09a1-42ca-974f-d24e080160c2 FormVersion Form Version Text
f2e63656-135e-4f1c-8fc2-ccbe74071901 fRecurrence Recurrence Recurrence
30bb605f-5bae-48fe-b4e3-1f81d9772af9 FSObjType Item Type Lookup
d733736e-4204-4812-9565-191567b27e33 FTPSite FTP Site URL
9c4be348-663a-4172-a38a-9714b2634c17 FullBody FullBody Computed
475c2610-c157-4b91-9e2d-6855031b3538 FullName Full Name Text
23550288-91b5-4e7f-81f9-1a92661c4838 Gender Gender Choice
6e4b3aad-350d-42fa-bd61-d1de715b45db Goal KPI Goal Threshold Number
4181b96a-3125-4f75-b823-3a4d675c6b19 GoalCell Goal Cell Text
20906227-d1c8-430c-989a-30a62e3e40b2 GoalFromWorkBook Goal from workbook Boolean
69ac2b6e-f626-49b4-b0cc-c2b9580e8719 GoalSheet Goal Sheet Text
da31d3c9-f9da-4c35-88d4-60aafa4c3f19 GovernmentIDNumber Government ID Number Text
c86a2f7f-7680-4a0b-8907-39c4f4855a35 Group Group Type Integer
ae069f25-3ac2-4256-b9c3-15dbc15da0e0 GUID GUID Guid
47f68c3b-8930-406f-bde2-4a8c669ee87c HasCustomEmailBody Has Custom Email Body Boolean
a932ec3f-94c1-48b1-b6dc-41aaa6eb7e54 HeaderStyleDefinitions Style Definitions HTML
203fa378-6eb8-4ed9-a4f9-221a4c1fbf46 Hobbies Hobbies Text
8c5a385d-2fff-42da-a4c5-f6a904f2e491 Home2Number Home Phone 2 Text
5aeabc56-57c6-4861-bc12-bd72c30fc6bd HomeAddressCity Home Address City Text
897ecfd7-4293-4782-b463-bd68440a5fed HomeAddressCountry Home Address Country Text
c0e4b4c6-6245-4846-8561-b8c6c01fefc1 HomeAddressPostalCode Home Address Postal Code Text
f5b36006-69b0-418c-bd4a-f25ca7e096bb HomeAddressStateOrProvince Home Address State Or Province Text
8c66e340-0985-4d68-af03-3050ece4862b HomeAddressStreet Home Address Street Text
c189a857-e6b0-488f-83a0-f4ee0a3ad01e HomeFaxNumber Home Fax Text
2ab923eb-9880-4b47-9965-ebf93ae15487 HomePhone Home Phone Text
0c5e0085-eb30-494b-9cdd-ece1d3c649a2 HTML_x0020_File_x0020_Type HTML File Type Text
1d22ea11-1e32-424e-89ab-9fedbadb6ce1 ID ID Counter
4cbd96f7-09c6-4b5e-ad42-1cbe123de63a IMAddress IM Address Text
a5d2f824-bc53-422e-87fd-765939d863a5 ImageCreateDate Date Picture Taken DateTime
1944c034-d61b-42af-aa84-647f2e74ca70 ImageHeight Picture Height Integer
922551b8-c7e0-46a6-b7e3-3cf02917f68a ImageSize Picture Size Computed
7e68a0f9-af76-404c-9613-6f82bc6dc28c ImageWidth Picture Width Integer
f6df49ec-807b-4d40-a7da-a17684121f92 IncludeHierarchy Include child indicators Boolean
26c4f53e-733a-4202-814b-377492b6c841 Indentation Indentation Computed
68227570-72dd-4816-b6b6-4b81ff99a393 IndentLevel Indentation Level Computed
7a282f86-69d9-40ff-ae1c-c746cf21256b Initials Initials Text
50a54da4-1528-4e67-954a-e2d24f1e9efb InstanceID Instance ID Integer
af5036db-36f4-46c8-bde7-a677bd0ef280 IsActive Is Active Boolean
a579062a-6c1d-4ad3-9d5e-035f9f2c1882 ISDNNumber ISDN Text
bd2216c1-a2f3-48c0-b21c-dc297d0cc658 IsRootPost Is Root Post Computed
9ba260b2-85a1-4a32-ad7a-63eaceffe6b4 IsSiteAdmin Is Site Admin Boolean
3f277a5c-c7ae-4bbe-9d44-0456fb548f94 IssueStatus Issue Status Choice
92b8e9d0-a11b-418f-bf1c-c44aaa73075d Item Primary Item ID Integer
b824e17e-a1b3-426e-aecf-f0184d900485 ItemChildCount Replies Lookup
c4e0f350-52cc-4ede-904c-dd71a3d11f7d JobTitle Job Title Text
b66e9b50-a28e-469b-b1a0-af0e45486874 Keywords Keywords Note
291aacda-4cfb-4d59-968b-5e2ea0c9eab7 KPI KPI Text
0121cb2b-4515-44f2-9d5a-0dcb3bf556aa KpiComments KPI Comments Note
249a1c1a-5a3e-4173-abad-779b01892510 KpiDescription KPI Description Note
3c497036-038f-41db-aec7-c9849649b135 KpiStatus KPI Status Number
d81529e8-384c-4ca6-9c43-c86a256e6a44 Language Language Choice
173f76c8-aebd-446a-9bc9-769a2bd2c18f Last_x0020_Modified Modified Lookup
fdc8216d-dabf-441d-8ac0-f6c626fbdc24 LastNamePhonetic Last Name Phonetic Text
fd3e3a59-bf10-4c99-b678-5dd7fcc6cb28 LastUpdated Most recent indicator data update DateTime
076193bd-865b-4de7-9633-1f12069a6fff LessLink Less Link Computed
61b97279-cbc0-4aa9-a362-f1ff249c1706 LimitedBody Limited Body Computed
46045bc4-283a-4826-b3dd-7a78d790b266 LinkDiscussionTitle Subject Computed
3ac9353f-613f-42bd-98e1-530e9fd1cbf6 LinkDiscussionTitleNoMenu Subject Computed
5cc6dc79-3710-4374-b433-61cb4a686c12 LinkFilename Name Computed
9d30f126-ba48-446b-b8f9-83745f322ebe LinkFilenameNoMenu Name Computed
03f89857-27c9-4b58-aaab-620647deda9b LinkIssueIDNoMenu Issue ID Computed
1a03fa74-8c63-40cc-bd06-73b580bd8743 LinkTemplateName Form Name Computed
82642ec8-ef9b-478f-acf9-31f7d45fbc31 LinkTitle Title Computed
bc91a437-52e7-49e1-8c4e-4698904b2b6d LinkTitleNoMenu Title Computed
f44e428b-61c8-4100-a911-a3a635f43bb5 List List ID Guid
288f5f32-8462-4175-8f09-dd7ba29359a9 Location Location Text
56747800-d36e-4625-abe3-b1bc74a7d5f8 LowerValuesAreBetter Lower values are better Boolean
ba934502-d68d-4960-a54b-51e15fef5fd3 ManagersName Manager’s Name Text
9b2bed84-7769-40e3-9b1d-7954a4053834 MasterSeriesItemID MasterSeriesItemID Integer
fbba993f-afee-4e00-b9be-36bc660dcdd1 MessageBody Body Computed
2ef29342-2f5f-4052-90d3-8192e0705e51 MessageId Message ID Text
687c7f94-686a-42d3-9b67-2782eac4b4f8 MetaInfo Property Bag Lookup
418c8d29-6f2e-44c3-8955-2cd7ec3e2151 MiddleName Middle Name Text
3126c2f1-063e-4892-828f-0696ec6e105f Mileage Mileage Text
28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f Modified Modified DateTime
822c78e3-1ea9-4943-b449-57863ad33ca9 Modified_x0020_By Document Modified By Text
fb6c2494-1b14-49b0-a7ca-0506d6e85a62 MoreLink More Link Computed
bfc6f32c-668c-43c4-a903-847cca2f9b3c Name Account Text
76d1cc87-56de-432c-8a2a-16e5ba5331b3 NameOrTitle Name Computed
6b0a2cd7-a7f9-41ca-b932-f3bebb603793 Nickname Nickname Text
e241f186-9b94-415c-9f66-255ce7f86235 Notes About Me Note
5602dc33-a60a-4dec-bd23-d18dfcef861d Occurred Date Occurred DateTime
26169ab2-4bd2-4870-b077-10f49c8a5822 Office Office Text
16b6952f-3ce6-45e0-8f4e-42dac6e12441 OffsiteParticipant External Participant Text
4a799ba5-f449-4796-b43e-aa5186c3c414 OffsiteParticipantReason External Participant Reason Text
c814b2cf-84c6-4f56-b4a4-c766938a97c5 ol_Department Department Text
493896da-0a4f-46ec-a68e-9cfd1a5fc19b ol_EventAddress Event Address Text
ca4addac-796f-4b23-b093-d2a3f65c0774 Order Order Number
0850ae15-19dd-431f-9c2f-3aff3ae292ce OrganizationalIDNumber Organizational ID Number Text
90fa9a8e-aac0-4828-9cb4-78f98416affa OtherAddressCity Other Address City Text
3c0e9e00-8fcc-479f-9d8d-3447cda34c5b OtherAddressCountry Other Address Country Text
0557c3f8-60c4-4dfb-b5ba-bf3c4e4386b1 OtherAddressPostalCode Other Address Postal Code Text
f45883bc-8733-4b77-ab5d-43613986aa12 OtherAddressStateOrProvince Other Address State Or Province Text
dff5dfc2-e2b7-4a19-bde7-76dabc90a3d2 OtherAddressStreet Other Address Street Text
aad15eb6-d7fd-47b8-abd4-adc0fe33a6ba OtherFaxNumber Other Fax Text
96e02495-f428-48bc-9f13-06d98ba58c34 OtherNumber Other Phone Text
dcde7b1f-918b-4ed5-819f-9798f8abac37 Outcome Outcome Text
d4e44a66-ee3a-4d02-88c9-4ec5ff3f4cd5 owshiddenversion owshiddenversion Integer
f79bf074-daf7-4c06-a314-15b287fdf4c9 PagerNumber Pager Text
a9ec25bf-5a22-4658-bd19-484e52efbe1a ParentFolderId Parent Folder Id Integer
1be428c8-2c2d-4e02-970b-6663eb1d7080 ParentId Parent ID Number
774eab3a-855f-4a34-99da-69dc21043bec ParentLeafName Source Name (Converted Document) Lookup
28081524-7c2f-4f08-9319-9c737b495bc1 ParentName Report Parent Name Text
bc1a8efb-0f4c-49f8-a38f-7fe22af3d3e0 ParentVersionString Source Version (Converted Document) Lookup
4d2444c2-0e97-476c-a2a3-e9e4a9c73009 PendingModTime Pending Modification Time DateTime
d2311440-1ed6-46ea-b46d-daa643dc3886 PercentComplete % Complete Number
d43e8a19-f4f3-4e6a-b8c1-02e972c3ed6f PercentExpression Percent Expression Boolean
ba3c27ee-4791-4867-8821-ff99000bac98 PermMask Effective Permissions Mask Computed
5aa071d9-3254-40fb-82df-5cedeff0c41e PersonalWebsite Personal Website URL
adfe65ee-74bb-4771-bec5-d691d9a6a14e PersonImage Posted By Computed
b4ab471e-0262-462a-8b3f-c1dfc9e2d5fd PersonViewMinimal Posted By Computed
d9339777-b964-489a-bf09-2ac3c3fe5f0d Picture Picture URL
38bea83b-350a-1a6e-f34a-93a6af31338b PostCategory Category Lookup
bd716b26-546d-43f2-b229-62699581fa9f Preview Web Preview Computed
8c0d0aac-9b76-4951-927a-2490abe13c0b PreviewOnForm Preview Computed
d69bcc0e-57c3-4f3b-bbc5-b090edf21f0f PrimaryNumber Primary Phone Text
a8eb573e-9e11-481a-a8c9-1104a54b2fbd Priority Priority Choice
f0753a13-44b1-4269-82af-5c34c57b0c67 Profession Profession Text
c5c4b81c-f1d9-4b43-a6a2-090df32ebb68 ProgId ProgId Lookup
b1b53d80-23d6-e31b-b235-3a286b9f10ea PublishedDate Published DateTime
b510aac1-bba3-4652-ab70-2d756c29540f PublishingAssociatedContentType Associated Content Type ContentTypeIdFieldType
d211d750-4fe6-4d92-90e8-eb16dff196c8 PublishingAssociatedVariations Variations LayoutVariationsField
0a90b5e8-185a-4dec-bf3c-e60aae08373f PublishingAuthenticatedUse Safe for Authenticated Use Boolean
18f165be-6285-4a57-b3ab-4e9f913d299f PublishingCacheability Cacheability Choice
773ed051-58db-4ff2-879b-08b21ab001e0 PublishingCacheAllowWriters Allow writers to view cached content Boolean
5b4d927c-d383-496b-bc79-1e61bd383019 PublishingCacheCheckForChanges Check for Changes Boolean
9550e77a-4d10-464f-bc0c-102d5b1aec42 PublishingCacheDisplayDescription Display Description Text
983f490b-fc53-4820-9354-e8de646b4b82 PublishingCacheDisplayName Display Name Text
bdd1b3c3-18db-4acf-a963-e70ef4227fbc PublishingCacheDuration Duration Number
d8f18167-7cff-4c4e-bdbe-e7b0f01678f3 PublishingCacheEnabled Enabled Boolean
db03cb99-cf1e-40b8-adc7-913f7181dac3 PublishingCachePerformACLCheck Perform ACL Check Boolean
aea1a4dd-0f19-417d-8721-95a1d28762ab PublishingContact Contact User
c79dba91-e60b-400e-973d-c6d06f192720 PublishingContactEmail Contact E-Mail Address Text
7546ad0d-6c33-4501-b470-fb3003ca14ba PublishingContactName Contact Name Text
dc47d55f-9bf9-494a-8d5b-e619214dd19a PublishingContactPicture Contact Picture URL
a990e64f-faa3-49c1-aafa-885fda79de62 PublishingExpirationDate Scheduling End Date PublishingScheduleEndDateFieldType
7581e709-5d87-42e7-9fe6-698ef5e86dd3 PublishingHidden Hidden Page Boolean
66f500e9-7955-49ab-abb1-663621727d10 PublishingImageCaption Image Caption HTML
f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8 PublishingPageContent Page Content HTML
3894ec3f-4674-4924-a440-8872bec40cf9 PublishingPageIcon Page Icon Image
3de94b06-4120-41a5-b907-88773e493458 PublishingPageImage Page Image Image
0f800910-b30d-4c8f-b011-8189b2297094 PublishingPageLayout Page Layout URL
188ce56c-61e0-4d2a-9d3e-7561390668f7 PublishingPreviewImage Preview Image URL
543bc2cf-1f30-488e-8f25-6fe3b689d9ac PublishingRollupImage Rollup Image Image
51d39414-03dc-4bd0-b777-d3e20cb350f7 PublishingStartDate Scheduling Start Date PublishingScheduleStartDateFieldType
914fdb80-7d4f-4500-bf4c-ce46ad7484a4 PublishingVariationGroupID Variation Group ID Text
766da693-38e5-4b1b-997f-e830b6dfcc7b PublishingVariationRelationshipLinkFieldID Variation Relationship Link URL
4689a812-320e-4623-aab9-10ad68941126 PublishingVaryByCustom Vary by Custom Parameter Text
89587dfd-b9ca-4fae-8eb9-ba779e917d48 PublishingVaryByHeader Vary by HTTP Header Text
b8abfc64-c2bd-4c88-8cef-b040c1b9d8c0 PublishingVaryByParam Vary by Query String Parameters Text
d4a6af1d-c6d7-4045-8def-cefa25b9ec30 PublishingVaryByRights Vary by User Rights Boolean
8ee23f39-e2d1-4b46-8945-42386b24829d Purpose UDC Purpose Choice
e393d344-2e8c-425b-a8c3-89ac3144c9a2 QuotedTextWasExpanded Quoted Text Was Expanded Computed
d1aede4f-1352-48d9-81e2-b10097c359c1 RadioNumber Radio Phone Text
d12572d0-0a1e-4438-89b5-4d0430be7603 RecurrenceData RecurrenceData Note
dfcc8fff-7c4c-45d6-94ed-14ce0719efef RecurrenceID Recurrence ID DateTime
ac57186e-e90b-4711-a038-b6c6a62a57dc RedirectURL Redirect URL URL
9b4cc5a9-1119-43e4-b2a8-412c4031f92b ReferredBy Referred By Text
875fab27-6e95-463b-a4a6-82544f1027fb RelatedIssues Related Issues LookupMulti
9161f6cb-a8e6-47b8-9d24-89415de691f7 RelevantMessages Email Messages Note
5d36727b-bcb2-47d2-a231-1f0bc63b7439 RepairDocument Relink Computed
87cda0e2-fc57-4eec-a696-b0de2f61f361 ReplyNoGif Reply Computed
d8921da7-c09b-4a06-b644-dffebf73c736 ReportCategory Report Category Choice
fef4b2e1-4b89-4929-981b-c1967e0b3178 ReportCreated Report Created DateTime
efca5f2b-de72-42a8-aefd-1257af8698a8 ReportCreatedBy Report Created By User
8caf7ffe-9d2c-406c-9743-7a252b5c8ae5 ReportCreatedByDisplay Report Created By Computed
a533d496-5aeb-4027-9542-ee6ba9a8c9e3 ReportCreatedDisplay Report Created Computed
2a16b911-b094-46e6-a7cd-227eea3effdb ReportDescription Report Description Note
27c603f5-4dbe-4522-894a-ae77715dc532 ReportHistoryLink History Computed
851c7906-3c95-46bc-a81e-30588602d910 ReportLink Link to Report Computed
b0bd6f6d-ed80-4ff8-8be0-ef9238a16835 ReportLinkFilename Name Computed
cc33f143-e697-42db-9c83-8db4e6928e9d ReportModified Report Modified DateTime
f70965c3-6ac6-4e9e-914c-3c1b4e219b6f ReportModifiedBy Report Modified By User
64016533-26ca-4ae6-8e1f-7cc34687e416 ReportModifiedByDisplay Report Modified By Computed
3892917d-92f2-4263-ae0c-22670474069d ReportModifiedDisplay Report Modified Computed
fc6862c4-6aac-4f08-b60e-3a8454f26040 ReportModifiedLink Report Modified Link Computed
db364cb0-8c0c-46e7-a996-684e1f2caeb2 ReportName Name Computed
2e8881da-0332-4ad9-a565-45b5b8b2702f ReportOwner Owner User
bf80df9c-32dc-4257-bcf9-08c2ee6ca1b1 ReportStatus Report Status Choice
de1baa4b-2117-473b-aa0c-4d824034142d RequiredField Required Field Computed
82dd22bf-433e-4260-b26e-5b8360dd9105 ReusableHtml Reusable HTML HTML
890e9d41-5a0e-4988-87bf-0fb9d80f60df ReusableText Reusable Text Note
eeaeaaf1-4110-465b-905e-df1073a7e0e6 Role Role Text
ad97fbac-70af-4860-a078-5ee704946f93 RulesUrl $Resources:RulesUrl Text
90884f35-d2a5-48dc-a39f-7bcbc9781cf6 SaveToReportHistory Save to report history Boolean
dddd2420-b270-4735-93b5-92b713d0944d ScopeId ScopeId Lookup
7ebf72ca-a307-4c18-9e5b-9d89e1dae74f SelectedFlag Selection Checkbox Computed
5f47e085-2150-41dc-b661-442f3027f552 SelectFilename Select Computed
b1f7969b-ea65-42e1-8b54-b588292635f2 SelectTitle Select Computed
cb2413f2-7de9-4afc-8587-1ca3f563f624 SendEmailNotification Send Email Notification Boolean
105f76ce-724a-4bba-aece-f81f2fce58f5 ServerUrl Server Relative URL Computed
48b4a73e-8853-44ac-83a8-3a4bd59ce9ec Service Associated Service Text
4753e73b-5b5d-4bbc-8e09-c9683b0d40a7 ShortestThreadIndex Shortest Thread-Index Note
2bec4782-695f-406d-9e50-f1d39a2b8eb6 ShortestThreadIndexId Shortest Thread-Index Id Text
8ffccefe-998b-4896-a6df-32d566f69141 ShortestThreadIndexIdLookup Shortest Thread-Index Id Lookup Lookup
086f2b30-460c-4251-b75a-da88a5b205c1 ShowCombineView Show Combine View Text
4ef69ca4-4179-4d27-9e6c-f9544d45dfdc ShowInCatalog Show in Catalog Boolean
11851948-b05e-41be-9d9f-bc3bf55d1de3 ShowRepairView Show Repair View Text
829c275d-8744-4d9b-a42f-53f53eb60559 SipAddress SIP Address Text
f590b1de-8e28-4c17-91bc-bf4096024b7e SpouseName Spouse Text
64cd368d-2f95-4bfc-a1f9-8d4324ecb007 StartDate Start Date DateTime
f90bce56-87dc-4d73-bfcb-03fcaf670500 StatusBar Posting Information Computed
76a81629-44d4-4ce1-8d4d-6d7ebcd885fc Subject Subject Text
d886eba3-d018-4103-a322-d5780127ef8a Suffix Suffix Text
b3525efe-59b5-4f0f-b1e4-6e26cb6ef6aa SummaryLinks Summary Links SummaryLinks
27761311-936a-40ba-80cd-ca5e7a540a36 SummaryLinks2 Summary Links 2 SummaryLinks
e6f528fb-2e22-483d-9c80-f2536acdc6de SurveyTitle Title Text
af0a3d4b-3ceb-449e-9bf4-51103f2032e3 SystemTask System Task Boolean
3914f98e-6d99-4218-9ba3-af7370b9e7bc TaskCompanies Related Company Text
cd21b4c2-6841-4f9e-a23a-738a65f99889 TaskDueDate Due Date DateTime
50d8f08c-8e99-4948-97bf-2be41fa34a0d TaskGroup Task Group User
c15b34c3-ce7d-490a-b133-3f4de8801b76 TaskStatus Task Status Choice
8d96aa48-9dff-46cf-8538-84c747ffa877 TaskType Task Type Integer
e7be7f3c-c436-481d-8865-669e5146f53c TelexNumber Telex Text
467e811f-0c12-4a93-bb04-42ff0c1c597b TemplateId Template Id Text
4b1bf6c6-4f39-45ac-acd5-16fe7a214e5e TemplateUrl Template Link Text
cef73bf1-edf6-4dd9-9098-a07d83984700 ThreadIndex Thread Index ThreadIndex
58ca6516-51cd-41fb-a908-dd2a4aeea8bc Threading Threading Computed
c55a4674-640b-4bae-8738-ce0439e6f6d4 ThreadingControls Threading Controls Computed
769b99d9-d361-4948-b687-f01332391629 ThreadTopic Thread Topic Text
ac7bb138-02dc-40eb-b07a-84c15575b6e9 Thumbnail Thumbnail Computed
6cc1c612-748a-48d8-88f2-944f477f301b TimeZone TimeZone Integer
fa564e0f-0c70-4ab9-b863-0177e6ddd247 Title Title Text
e451420d-4e62-43e3-af83-010d36e353a2 ToggleQuotedText Toggle Quoted Text Computed
f3c4a259-19a2-44b8-ab3d-e9145d07d538 TotalWork Total Work Number
11a86235-9d18-4134-b58c-fa7243f4cbba Trend Trend Number
6d0f8993-5050-41f3-be6c-18902d282357 TrimmedBody Trimmed Body Note
f54697f1-0357-4c5a-a711-0cb654bc73e4 TTYTDDNumber TTY-TDD Phone Text
63055d04-01b5-48f3-9e1e-e564e7c6b23b UID UID Guid
4b7403de-8d94-43e8-9f0f-137a3e298126 UniqueId Unique Id Lookup
e247cbb0-abb3-4759-b9f4-0128e37dd34a UpdateError Update Error Note
c29e077d-f466-4d8e-8bbe-72b66c5f205c URL URL URL
aeaf07ee-d2fb-448b-a7a3-cf7e062d6c2a URLNoMenu URL Computed
2a9ab6d3-268a-4c1c-9897-e5f018f87e64 URLwMenu URL Computed
5928ff1f-daa1-406c-b4a9-190485a448cb User User ID Integer
566656f5-17b3-4291-98a5-5074aadf77b3 UserField1 User Field 1 Text
182d1b9e-1718-4e11-b279-38f7ed0a20d6 UserField2 User Field 2 Text
a03eb53e-f123-4af9-9355-f92bd75c00b3 UserField3 User Field 3 Text
adefa4ca-14c3-4694-b531-f51b706efe9d UserField4 User Field 4 Text
6df9bd52-550e-4a30-bc31-a4366832a87e V3Comments Append-Only Comments Note
f0816223-fd98-41f9-aa57-b7f7db462faa Value KPI Value Number
3b32f47b-f1a1-45ff-b5ad-7b28b84c720a ValueCell Value Cell Text
93df9772-1e34-40c5-8c54-4bf3cdd56b34 ValueExpression Value Expression Note
d096d5f3-b399-462b-9a32-83f82d9237d4 ValueSheet Value Sheet Text
2c7db8af-02b0-4177-b77f-15c942c08427 ViewGuid View Guid Text
4a389cb9-54dd-4287-a71a-90ff362028bc VirusStatus Virus Status Lookup
e84a049e-230d-4751-8d5c-8f615e968df2 Warning KPI Warning Threshold Number
eeaabf1d-f6ae-4dc6-873f-7397a17c36f0 WarningCell Warning Cell Text
3c6188a0-2761-4e0a-9fc0-ee32d47e4d49 WarningFromWorkBook Warning from workbook Boolean
3e223474-75ff-466b-b53f-9b641ce74b6c WarningSheet Warning Sheet Text
a71affd2-dcc7-4529-81bc-2fe593154a5f WebPage Web Page URL
c33527b4-d920-4587-b791-45024d00068a WikiField Wiki Content Note
fc2e188e-ba91-48c9-9dd3-16431afddd50 WorkAddress Address Note
6ca7bd7f-b490-402e-af1b-2813cf087b1e WorkCity City Text
3f3a5c85-9d5a-4663-b925-8b68a678ea3a WorkCountry Country/Region Text
9d1cacc8-f452-4bc1-a751-050595ad96e1 WorkFax Fax Number Text
8d426880-8d96-459b-ae48-e8b3836d8b9d WorkflowAssociation Workflow Association ID Guid
de21c770-a12b-4f88-af4b-aeebd897c8c2 WorkflowInstance Workflow History Parent Instance Guid
de8beacf-5505-47cd-80a6-aa44e7ffe2f4 WorkflowInstanceID Workflow Instance ID Guid
8e234c69-02b0-42d9-8046-d5f49bf0174f WorkflowItemId Workflow Item ID Integer
58ddda52-c2a3-4650-9178-3bbc1f6e36da WorkflowLink Link URL
1bfee788-69b7-4765-b109-d4d9c31d1ac1 WorkflowListId Workflow List ID Guid
e506d6ca-c2da-4164-b858-306f1c41c9ec WorkflowName Workflow Name Text
18e1c6fa-ae37-4102-890a-cfb0974ef494 WorkflowOutcome Outcome Text
bfb1589e-2016-4b98-ae62-e91979c3224f WorkflowTemplate Workflow Template ID Guid
f1e020bc-ba26-443f-bf2f-b68715017bbc WorkflowVersion Workflow Version Integer
fd630629-c165-4513-b43c-fdb16b86a14d WorkPhone Business Phone Text
881eac4a-55a5-48b6-a28e-8329d7486120 Workspace WorkspaceUrl URL
08fc65f9-48eb-4e99-bd61-5946c439e691 WorkspaceLink Workspace CrossProjectLink
ceac61d3-dda9-468b-b276-f4a6bb93f14f WorkState State/Province Text
9a631556-3dac-49db-8d2f-fb033b0fdc24 WorkZip ZIP/Postal Code Text
cd1ecb9f-dd4e-4f29-ab9e-e9ff40048d64 xd_ProgID Html File Link Text
fbf29b2d-cae5-49aa-8e0a-29955b540122 xd_Signature Is Signed Boolean
c4b72ed6-45aa-4422-bff1-2b6750d30819 XMLTZone XMLTZone Note
566da236-762b-4a76-ad1f-b08b3c703fce XomlUrl $Resources:XomlUrl Text

What is a Best Practice?

Recently I’ve been being bumped into by things that are claiming to be best practices. In some cases they absolutely are, and in other cases it’s more questionable. As I’m preparing for a SharePoint Saturday event in Chicago this morning I’m wearing my speaker shirt from the SharePoint Best Practices Conference. (A conference where many best practices are indeed shared.) I’m skimming through blog posts and emails and I see a note from Eric Shupps about a “best practices” article (that isn’t). I’m reminded of a recent conversation about an article in MSDN magazine titled “10 Best Practices for Building SharePoint Solutions” – which has some summarily bad advice, some poorly communicated advice, and a few nuggets that are helpful.

The articles above sparked a lot of conversation about whether the articles were really best practices or whether they were bad advice. Because the answer was so clear that there were things in them that were bad advice we quickly left the conversation about best practices. So quickly in fact that we didn’t clearly articulate what best practices even are.

In the general software development improvement presentations I used to do I had a tendency to quote James Bach “There is no consensus about what practices are best, unless consensus means ‘people I respect also say they like it.'” (No Best Practices: How to Think About Methodology). I like this quote because it reflects what most people think of as a best practice and points out the slippery slope that we’re on when we’re talking about best practices.

Dictionary.com has this definition for a best practice “a practice which is most appropriate under the circumstances, esp. as considered acceptable or regulated in business; a technique or methodology that, through experience and research, has reliably led to a desired or optimum result.” That’s a fine definition but it’s not much help in the key problem – knowing whether something is a best practice or not. Before I go there, I have to pause and say one of the points that my buddy Ben Curry makes is that Best Practice may not be best for you – you should evaluate whether the “best practice” is really appropriate for your organization – that’s an important point. The standard disclaimers should apply to all “Best Practices”. (Your mileage may vary; past performance is no indication of future returns, etc.)

So how do you determine whether something is a best practice? You open it up to peer review. One of the great things about the way that the patterns & practices team is working on their guidance is that they solicit feedback from an advisory committee and anyone that wants to talk about a code drop that they make available. In my work with the SharePoint Guidance team I can say that the input from the advisors is critical to helping to determine what guidance is provided. They’re careful not to call their work best practices, but the process they’re going through in talking through various approaches and finding what seems to be the best is the right process.

From my perspective, what makes a Best Practice a best practice is that it has been vetted with industry experts and talked through. In the computer security industry it’s expected that new cryptographic algorithms will be open so that they can be examined and tested by the industry. The same process should apply to best practices throughout the computer industry. We should raise ideas as potential best practices to have others validate or reject our perspective on the approach.

The really sticky part about this is that you have to communicate an approach that you think may be a best practice before you can be sure it’s a best practice. In general this means that the person putting forward the idea should say something like “This is what I do because I think it’s best” and should follow that with “Does anyone here disagree?” However, many folks want to skip the validation step. (How many developers do testing?) They want to believe their approach is the best practice and put it forth as a postulate. Of course, life is rarely this simple.

This leaves us with a simple challenge for anyone claiming best practices (thanks James) – “Who says it’s a best practice, that I trust?” (or besides you). Thought of another way (thanks Ben) – “Who says this practice is best for my situation?” In either case, saying something is a best practice doesn’t make it so. (Unless you implicitly trust the author.)

I should now fully disclaim that no one has yet said that this article is a best practice. If you want to participate in making this article a best practice, feel free to comment below on why this is (or isn’t) a best practice for identifying best practices ;)

Central IL SharePoint Users Group

On Wednesday I had the pleasure of speaking at the inaugural Central Illinois SharePoint Users Group in Springfield. I did a topic called “Do You Know SharePoint.” The deck is built around the idea that there are tons of things about SharePoint that most folks don’t know. We talked about Content Types, Word, and QuickParts (get users to enter metadata without knowing it) and globally deployed site templates – and why they can be valuable sometimes.

With 35 people in attendance for an initial meeting the group is off to a great start. If you’re interested in sponsoring or participating contact Darrin Bishop for more details.

Windows 7, Windows Server 2008 R2, NAS, Samba, NTLMv2, 1326, and Why can’t I get in?

Sometimes my past comes back to haunt me. You see many moons ago in a land far away I wanted to learn about Linux. So I setup a server and ran it. I got to learn all about Samba and the ability to make Linux disks look like they were coming from a Windows file server. Back then I can loosely remember this problem with NTLM and NTLMv2. Windows in whatever flavor that it was didn’t want to talk to Samba unless you hacked the registry. This particular fact was something that I let get buried over by new facts about SharePoint. However, that came back and bit me.

What some folks know is that many of the Network Attached Storage (NAS) devices, particularly on the low to middle of the market, actually run Samba underneath. Such is the case with the Thecus 5200Pro that I have here. I recently installed Windows 7 RC and the Windows Server 2008 R2 RC. Everything was going relatively well and then I realized that neither of them could see my NAS. That’s bad. After some digging I started thinking about Samba because Thecus mentioned that their latest firmware upgrades the Samba version (to a well and truly out of date version of Samba). A bit of digging lead me to a message from Jim Pinkerton where he lays out the details of the issues related to connecting to Samba from Windows. If you want the cliff notes version, you need to set HKLM\System\CurrentControlSet\Services\Netlogon\Parameters DWORD RequireSignOrSeal = 0.

What was my NAS doing when I tried to connect? Bad username or password. (Logon error 1326) Why? Because it didn’t/doesn’t understand NTLMv2 – and Windows was requiring it.

Honestly, I’m going to be very interested to see where this goes. I’m quite curious to see if all of the vendors using Samba for their NAS devices will support Samba.org to get the extra code in it to support all of the things in Jim’s message – or if the project will slowly die because of a lack of support. In the mean time, I’m being a little less secure than I want to be.

Don’t use LocalHost when Developing for SharePoint

In a recent situation with a client I was called into look at some problems that they were having making some web service calls and through a discussion I realized that the URL for the web service was hard coded to use localhost. On the surface this doesn’t look like a problem. You know that localhost will resolve and it will point back to the same server. So what’s wrong?

Well, SharePoint, because of its centralized management of multiple servers in a farm, by default uses host headers to determine which web application that a request should be routed to. A typical SharePoint server farm will have a few web applications (at least the main web application, central administration and a shared services provider.) So what happens when you hardcode a reference to localhost?

Well, on a local development server where there’s really only one web site on port 80 and someone has gone in and manually added an entry into IIS to accept all requests on port 80 — without requiring a host header or requiring local host — everything works magically. However, when you get to a controlled environment which has multiple applications and the IIS entry hasn’t been changed bad things start to happen.

First, the request isn’t answered so someone adds allowing all requests without a matching host header entry to go to the web site. That makes the request physically go to the same server. However, doing this can make authentication information break.

So the second problem that’s seen is that when you try to use the default network credential cache it doesn’t work for the web service. This will either be the NTLM double hop issue or an issue with Kerberos and the application pool being trusted for delegation. Let’s deal with the first situation with NTLM. Essentially for security concerns the credentials supplied by the user on one server can’t be supplied by that server to a second server. I.e. we can’t get off the same box with the credentials. I know you’re saying that localhost isn’t leaving the same box. However, from the perspective of Windows — it might. You see localhost isn’t really that special. It just happens that it’s defined in the hosts file. Other than that it could be some other computer. (In fact you can map localhost to something other than the local computer if you want to — but I wouldn’t advise it.) What Windows sees is a request coming in on one URL (servera, for instance) and leaving on another. that’s a double hop and it’s blocked for NTLM traffic.

If you’re using Kerberos and you’re seeing problems it may be because the application pool account isn’t trusted for delegation (in other words, it’s not allowed to wrap credentials and send them on.) It’s easy enough to trust the account for delegation — but this creates a pretty large exposure area for that account and isn’t generally something that should be the first choice.

So what’s the answer? Simply, pick off the fully qualified host name off the current request and then manipulate the path to get to your web service. If you do this you stay on the same box (in the same application pool/application domain in most cases). This eliminates the double hop issue and substantially reduces the ways that Windows can get generally upset with your application from a security perspective.

So don’t reference your web services via localhost — if you want things to work.

[[ Note: I’ve framed this in the perspective of SharePoint, however, if you’re calling yourself in any application you should do it from the URL the user used when you can. ]]

Article: Creating Your SharePoint Governance Plan

It’s been a while since I’ve written an article but this one at IntranetJournal.com is designed to help people understand the process I go through to work with folks on developing and maintaining a governance plan. It begins:

“One of the most common questions that I get from prospects as I’m talking to them about the creation of a governance plan and process is what does it look like. In other words, there are materials available which describe what should be in a governance plan but there isn’t a ton of guidance on what the process of creating a governance plan and process are.

Unlike a few years ago you now have sample governance plans you can look at, there are articles describing the kinds of things that you need to make sure are in a governance document, and a governance resource center on TechNet.

The goal of this article is something slightly different. The other resources available describe what to create, in this article I’ll focus on the process for creating the plan based on the engagements I’ve been a part of. Rather than a specific step-by-step process, what appears here is a rough framework that you can and should tailor to your unique situation. In the following you’ll also find some insight as to the psychology of putting a plan together as well as the aspects of how we as humans learn and process information.”

The full text is available on our gifts page: Creating your SharePoint Governance Plan

InfoPath Pick Lists and Other

Recently I was trying to build an InfoPath form — with the help of a form designer – -and we stumbled across a pattern that might be obvious for some, but it involves using multiple controls connected to the same spot in the in the data source. For instance, let’s say that you have a city field but you want to help the users fill out the popular cities — but new cities and towns are popping up so you don’t want to have to have an up to date list. So you can do something like this:

You have a drop down list for the cities you know — if they start typing InfoPath will start to locate the city. If they don’t find what they want, they can select an entry from the list, OTHER (Specify). This (because of conditional formatting) will reveal the text box — which is connected to the same spot in the data source. So here’s what happens when they select OTHER (Specify). When they select it the secondary textbox shows up. When they type the value in and exit the field the property is copied into the data source and the conditional formatting for the text field will hide it again (since it doesn’t say OTHER (Specify) any longer). And the drop down list will show the new value.

There is a problem with this approach. It only works for drop down lists that are based on a secondary data source not those where the values have been entered directly into the control. However, worst case you can base the drop down list on an embedded resource.

Recent Posts

Public Speaking