<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0YCRHszeSp7ImA9WxBbF0o.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734</id><updated>2010-03-16T14:32:45.581-07:00</updated><title>System.What?</title><subtitle type="html">Technical problems brought out into the light. &lt;br&gt;
Twice a week every week, for the good of mankind.
&lt;br&gt;
&lt;a href="http://blog.tylerholmes.com/feeds/posts/default" rel="alternate" title="Subscribe Now!"&gt;&lt;img src="http://homertbush.googlepages.com/feed-icon-128x128.gif" alt="Subscribe Now"&gt;&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.tylerholmes.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>107</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ItsInSystemDotWhat" /><feedburner:info uri="itsinsystemdotwhat" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>ItsInSystemDotWhat</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CE8GRHo-eyp7ImA9WxJXFU4.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-5308327162098234834</id><published>2009-06-09T00:33:00.001-07:00</published><updated>2009-06-09T00:33:45.453-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T00:33:45.453-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>Free Last Modified By/Date From SharePoint</title><content type="html">&lt;h4&gt;Who Responsible For This Edit!?&lt;/h4&gt;  &lt;p&gt;With the exception of politicians, most people are in favor of accountability. When it comes to web content management, I'd be the first to agree.&lt;/p&gt;  &lt;p&gt;In this post we're going to go over how to get free &lt;strong&gt;Last Modified By&lt;/strong&gt; and &lt;strong&gt;Last Modified Date &lt;/strong&gt;fields on content pages by modifying either select page layouts or master pages. The end product will look like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/Si4QVUM7_hI/AAAAAAAAA7I/mai-vFjs8Z8/s1600-h/2009-06-08%2023.19.16%5B3%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="108" alt="Last Modified By/Last Modified Date from SharePoint" src="http://lh6.ggpht.com/_x_KlQTLtnfI/Si4QVpNFi0I/AAAAAAAAA7M/bRJsriovFYI/2009-06-08%2023.19.16_thumb%5B1%5D.gif?imgmax=800" width="378" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;What We're Using&lt;/h4&gt;  &lt;p&gt;We'll be keying off two base fields (Modified, and Modified By) that you can expect to find on pretty much any list you'll ever work with. To prove to you I'm not making things up, feel free to look up the fields yourself (and a tonne of other useful fields) by using &lt;a href="http://blog.mondosoft.com/ontolica/archive/2007/02/15/SharePoint-Explorer-for-WSS3.aspx"&gt;SharePoint Explorer for WSS v3&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/Si4QV2zISwI/AAAAAAAAA7Q/Pi4B193ilt8/s1600-h/2009-06-08%2023.54.08%5B10%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="232" alt="Modified and Modified By fields displayed in SharePoint Explorer." src="http://lh4.ggpht.com/_x_KlQTLtnfI/Si4QWHFBSKI/AAAAAAAAA7U/E5MUr9_EYNg/2009-06-08%2023.54.08_thumb%5B6%5D.gif?imgmax=800" width="528" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Easy Win&lt;/h4&gt;  &lt;p&gt;Once you find out the names of the fields and their type, the markup to get at these fields is pretty straight forward. We use out of the box SharePoint SPField controls to pull and format the field values. It's of note that we put the ControlMode property to &amp;quot;Display&amp;quot; since we never want these fields to be editable.&lt;/p&gt;  &lt;div class="code"&gt;Last modified at:    &lt;br /&gt;&amp;lt;%@ Register Tagprefix=&amp;quot;SharePointWebControls&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.WebControls&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;     &lt;br /&gt;...     &lt;br /&gt;&amp;lt;SharePointWebControls:DateTimeField FieldName=&amp;quot;Modified&amp;quot; runat=&amp;quot;server&amp;quot; ControlMode=&amp;quot;Display&amp;quot;/&amp;gt;by     &lt;br /&gt;&amp;lt;SharePointWebControls:UserField FieldName=&amp;quot;Modified By&amp;quot; runat=&amp;quot;server&amp;quot; ControlMode=&amp;quot;Display&amp;quot; /&amp;gt;&lt;/div&gt;  &lt;p&gt;That's pretty much it, throw the above markup into any page layout or master page and you're pretty much done.&lt;/p&gt;  &lt;h4&gt;But Wait There's More&lt;/h4&gt;  &lt;p&gt;I'd hate it if you left this post thinking all you'd learned about were two lousy fields and how to display them on a page. There's a tonne of fields that are worth exploring and could potentially add value to your next SharePoint related application. &lt;/p&gt;  &lt;p&gt;Example 1: ETL developers could make use of the &lt;strong&gt;Created/Created By/Modified/Modified By&lt;/strong&gt; fields to perform &lt;a href="http://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;incremental loads&lt;/a&gt; when pulling data from the SharePoint object model.&lt;/p&gt;  &lt;p&gt;Example 2: UI Developers could use the &lt;strong&gt;Comments &lt;/strong&gt;and &lt;strong&gt;Version&lt;/strong&gt; fields to display the current version and any comments associated with the current version.&lt;/p&gt;  &lt;p&gt;The point is that there is yet another lever here to help you get the most functionality out of your next SharePoint related application. Best of all, it's dead simple and doesn't involve a single line of code.&lt;/p&gt;  &lt;p&gt;Best,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-5308327162098234834?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=29nu0ukmXA0:Zmz_e56BZ9c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=29nu0ukmXA0:Zmz_e56BZ9c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=29nu0ukmXA0:Zmz_e56BZ9c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=29nu0ukmXA0:Zmz_e56BZ9c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=29nu0ukmXA0:Zmz_e56BZ9c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=29nu0ukmXA0:Zmz_e56BZ9c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=29nu0ukmXA0:Zmz_e56BZ9c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=29nu0ukmXA0:Zmz_e56BZ9c:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/29nu0ukmXA0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/5308327162098234834/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=5308327162098234834" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/5308327162098234834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/5308327162098234834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/29nu0ukmXA0/free-last-modified-bydate-from.html" title="Free Last Modified By/Date From SharePoint" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/06/free-last-modified-bydate-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMNQ3s7eyp7ImA9WxVaGU8.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-4618077391504636643</id><published>2009-04-10T19:52:00.001-07:00</published><updated>2009-04-16T15:54:52.503-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T15:54:52.503-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><title>CSS Selector Collisions</title><content type="html">&lt;h4&gt;Thick Competition&lt;/h4&gt;&lt;p&gt;For those brave souls who actively try to make stock SharePoint UIs look user friendly, there's a gauntlet that first needs to be run. The challenge has to do with competing CSS rules and styles. Stock SharePoint will emit many style sheets who will often also be trying to style the same element that you are.&lt;/p&gt;&lt;p&gt;When it comes to deciding which rule wins, you should keep the following rules in mind. They'll very likely help you troubleshoot, especially when combined with tools like the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;amp;displaylang=en"&gt;IE Developer Toolbar&lt;/a&gt; or the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Firefox Web Developer Tools&lt;/a&gt; extension.&lt;/p&gt;&lt;h4&gt;Specificity&lt;/h4&gt;&lt;p&gt;In general more &lt;em&gt;specific&lt;/em&gt; rules tend to win. Remember that CSS styles can come from four different places. Rules that are increasingly specific will trump those who come from more generalized sources. Below we list (from most general to most specific) the four most common sources of CSS for a given html document.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The browser's default styles. Believe it or not each browser has a stock set of styles that get applied to elements whether you've chosen to style them or not. You'll have to compete with these even if they're the easiest to best. &lt;/li&gt;&lt;li&gt;An external style sheet (referenced from within the &amp;lt;head&amp;gt; tag [below]). &lt;div class="code"&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="mystyle.css" /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Internal style sheet (rules described in &amp;lt;style&amp;gt; tags within the HTML document itself). &lt;div class="code"&gt;&amp;lt;HEAD&amp;gt;&lt;br /&gt;&amp;lt;STYLE type="text/css"&amp;gt;&lt;br /&gt;H1 {border-width: 1;}&lt;br /&gt;&amp;lt;/STYLE&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Inline styles (styles placed on individual elements themselves). &lt;div class="code"&gt;&amp;lt;P style="font-size: 12pt; color: fuchsia"&amp;gt;Some Text&amp;lt;/P&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;More specific rules (those further down the list) will win out over more general ones.&lt;/p&gt;&lt;h4&gt;Weight&lt;/h4&gt;&lt;p&gt;Certain selectors are a little stronger than others. More specifically, ID has more weight than Class which has more weight than Tag name.&lt;/p&gt;&lt;p&gt;In fact &lt;em&gt;weight &lt;/em&gt;of a selector is determined by taking the sum of (100 * [# IDs used] + 10 * [# Classes used] + [# Tags Used].&lt;/p&gt;&lt;p&gt;Here's an example:&lt;/p&gt;&lt;p class="code"&gt;#navigation div.container span a.footerLink&lt;/p&gt;&lt;p&gt;Has a weight of (123 since it has 1 ID, 2 classes, and 3 tags. It would be trumped by:&lt;/p&gt;&lt;p class="code"&gt;div#navigation div.container span.wrapper a.footerLink&lt;/p&gt;&lt;p&gt;Since the above has a weight of 134 (1 ID, 3 classes and 4 tags).&lt;/p&gt;&lt;h4&gt;Order&lt;/h4&gt;&lt;p&gt;If specificity and weight are the same then it comes down to who was emitted last. In general rules that were emitted later on in the document will win.&lt;/p&gt;&lt;h4&gt;The Ace In The Hole&lt;/h4&gt;&lt;p&gt;If you're too lazy to figure out the rest you can simply use the !important flag. &lt;p class="code"&gt;div&lt;br /&gt;{&lt;br /&gt;  color:red !important;&lt;br /&gt;}&lt;/p&gt;This should trump all other rules but is considered to be pretty poor form and may get you dirty looks around the water cooler. &lt;p&gt;&lt;/p&gt;&lt;p&gt;Hope that helps.&lt;/p&gt;&lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-4618077391504636643?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=OQoLXbjV5Bs:Ad1MaV0TLD4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=OQoLXbjV5Bs:Ad1MaV0TLD4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=OQoLXbjV5Bs:Ad1MaV0TLD4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=OQoLXbjV5Bs:Ad1MaV0TLD4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=OQoLXbjV5Bs:Ad1MaV0TLD4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=OQoLXbjV5Bs:Ad1MaV0TLD4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=OQoLXbjV5Bs:Ad1MaV0TLD4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/OQoLXbjV5Bs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/4618077391504636643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=4618077391504636643" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4618077391504636643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4618077391504636643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/OQoLXbjV5Bs/css-selector-collisions.html" title="CSS Selector Collisions" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/04/css-selector-collisions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGRXs9eSp7ImA9WxVVFUU.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-7599197588159452631</id><published>2009-03-05T18:43:00.001-08:00</published><updated>2009-03-08T23:52:04.561-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-08T23:52:04.561-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SSIS" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows 2003" /><title>Is It Really My Job To Fix That!?</title><content type="html">&lt;h4&gt;That's Not On My Resume&lt;/h4&gt;  &lt;p&gt;I have to tell you that working in a software services firm isn't always a picnic.  Being a vendor (read outsider), and responsible for delivering working solutions on other peoples infrastructure, in a foreign LAN is nothing but a brazen undertaking. It's akin to trying to construct a building in a war torn, 3rd world country that happens to be in the middle of ongoing natural disasters. The drama sometimes matches that of most reality TV series, and while it's rarely dull in some regards, there's easier ways in life to get a win.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SbCN5jvO2KI/AAAAAAAAA7A/UCN3BcjIA5Y/s1600-h/problems%5B6%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 45px; border-right-width: 0px" height="341" alt="problems" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SbCN6Q4xtaI/AAAAAAAAA7E/738WxiKNneI/problems_thumb%5B4%5D.jpg?imgmax=800" width="406" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When the hardware isn't changing and internal IT isn't ignoring you, it's most likely that you'll get bad OS builds, under powered VMs or fail to take note of the hidden agendas in a politically charged atmosphere. This is all in addition to regular project management woes. I'm just talking about delivery here, requirements and software lifecycle are another boat in entier.&lt;/p&gt;  &lt;p&gt;You need to be &lt;em&gt;really sharp&lt;/em&gt; to see all the possible ways you could fail, and even then it'll probably be something small that never even crossed your worried mind that will end threatening you and your project. Game on.&lt;/p&gt;  &lt;h4&gt;An Instance of Success&lt;/h4&gt;  &lt;p&gt;Today we came up with this interesting problem when installing some ETL on a BI server. The machine was running SSIS RTM on a Win2k3 x86 Service Pack 1. The ETL was taking a bunch of records from some source SQL Server database (SP2) and migrating them to another destination SQL Server database (SP2). The ETL would run for about 20ish minutes before consistently throwing the following exceptions:&lt;/p&gt;  &lt;p class="code"&gt;An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "Protocol error in TDS stream".   &lt;br /&gt;  &lt;br /&gt;An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "Communication link failure".    &lt;br /&gt;  &lt;br /&gt;An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "TCP Provider: An existing connection was forcibly closed by the remote host. ".&lt;/p&gt;  &lt;p&gt;Hmm...what to do. The ETL worked great in stage and in our own QA environment. After an exhaustive troubleshoot (on our client's machine) the fix ended up being...&lt;a href="http://support.microsoft.com/kb/945977" target="_blank"&gt;disabling TCP Chimney offloading&lt;/a&gt;. Not even on our BI server but on the destination SQL Server!&lt;/p&gt;  &lt;p&gt;What!? You say? Your problems with delivery weren't even vaguely related to the technologies you were developing!? Exactly, something not even vaguely related to ETL became a huge friction point between us and a client. The worse part is that there's &lt;em&gt;always&lt;/em&gt; a risk of this&lt;em&gt;.&lt;/em&gt; Vendors come in and constantly take it on the chin (or sometime just look incompetent) because a dependency they depend on isn't working. &lt;/p&gt;  &lt;p&gt;What makes it worse is you may have never even seen that machine in your life, and it's the one that just might bury you. Half the time you don't even have the necessary rights on the given machines to fix it let alone conduct a decent troubleshoot. All of this just might want to make a man take up farming.&lt;/p&gt;  &lt;p&gt;This time we did have the necessary rights on the machine. We got &lt;em&gt;lucky&lt;/em&gt; and there's even a chance that we might actually get paid for the troubleshoot...this time. Who knows what kind of circus fixes we'll be trying to pull off tomorrow. The good news is that after a while some partners actually start to trust you.&lt;/p&gt;  &lt;p&gt;Hope that fix helps some vendor somewhere, we sure could have used it.&lt;/p&gt;  &lt;p&gt;My Best,  &lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-7599197588159452631?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=1tvtM4v_VrY:8Fn289KxiHA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=1tvtM4v_VrY:8Fn289KxiHA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=1tvtM4v_VrY:8Fn289KxiHA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=1tvtM4v_VrY:8Fn289KxiHA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=1tvtM4v_VrY:8Fn289KxiHA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?a=1tvtM4v_VrY:8Fn289KxiHA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsInSystemDotWhat?i=1tvtM4v_VrY:8Fn289KxiHA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/1tvtM4v_VrY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/7599197588159452631/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=7599197588159452631" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/7599197588159452631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/7599197588159452631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/1tvtM4v_VrY/is-it-really-my-job-to-fix-that.html" title="Is It Really My Job To Fix That!?" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/03/is-it-really-my-job-to-fix-that.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08CQnk9cCp7ImA9WxVWEE0.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-4637345126554012052</id><published>2009-02-18T17:11:00.001-08:00</published><updated>2009-02-18T17:11:03.768-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-18T17:11:03.768-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>STSADM Properties</title><content type="html">&lt;h4&gt;Wait...There's Another Flag&lt;/h4&gt;  &lt;p&gt;If you've ever felt like the&lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/SZyxppYQ_mI/AAAAAAAAA6o/Nx7okHWY5uI/s1600-h/NewTask%5B10%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="88" alt="NewTask" src="http://lh6.ggpht.com/_x_KlQTLtnfI/SZyxp_I-GcI/AAAAAAAAA6s/-vvRORD215c/NewTask_thumb%5B8%5D.gif?imgmax=800" width="342" align="right" border="0" /&gt;&lt;/a&gt; STSADM utility is taxed with doing more than &lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;Emacs&lt;/a&gt;, there's a good chance you're in the majority. I was recently trying to figure out what SharePoint settings affect the &amp;quot;New&amp;quot; icon when I stumbled upon the stsadm's getproperty and setproperty flags.&lt;/p&gt;  &lt;p&gt;Essentially there's a &lt;a href="http://technet.microsoft.com/en-us/library/cc263358.aspx"&gt;bunch of SharePoint settings&lt;/a&gt; (some of which there's no admin UI screen for) that can be manipulated using this utility. The new icon is one such property.&lt;/p&gt;  &lt;p&gt;It might be worth looking at some of these, they include both &lt;strong&gt;server &lt;/strong&gt;and &lt;strong&gt;web application&lt;/strong&gt; level properties.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Server Properties&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc261683.aspx" target="_blank"&gt;Antivirus properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc261905.aspx" target="_blank"&gt;Data Retrieval Services properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc261756.aspx" target="_blank"&gt;Information Rights Management properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263074.aspx" target="_blank"&gt;Site use confirmation and automatic deletion properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc424966.aspx" target="_blank"&gt;Timer job properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263478.aspx" target="_blank"&gt;Usage analysis properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262633.aspx" target="_blank"&gt;Workflow management properties&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Web Application Properties&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262629.aspx" target="_blank"&gt;Alerts properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc261905.aspx" target="_blank"&gt;Data Retrieval Services properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc262958.aspx" target="_blank"&gt;General properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263074.aspx" target="_blank"&gt;Site use confirmation and automatic deletion properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263509.aspx" target="_blank"&gt;Recycle Bin properties&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc263318.aspx" target="_blank"&gt;People Picker properties&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As it turns out the default value for &lt;a href="http://technet.microsoft.com/en-us/library/cc262903.aspx" target="_blank"&gt;the new icon&lt;/a&gt; is 2 days. You can show and change this property by using the following commands:&lt;/p&gt;  &lt;p class="code"&gt;stsadm -o setproperty -pn days-to-show-new-icon -pv 2 -url [WebAppUrl]&lt;/p&gt;  &lt;p class="code"&gt;stsadm -o getproperty -pn days-to-show-new-icon -url [WebAppUrl]&lt;/p&gt;  &lt;p&gt;This probably wont interest you in the least until you start to think about scripting and how this might help you ensure certain settings have been set when it comes time to deployment. &lt;/p&gt;  &lt;p&gt;While many of these settings might be alterable using the SharePoint API, there are still many types of changes that deserve to be versioned in some kind of script rather than C#.&lt;/p&gt;  &lt;p&gt;Best,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-4637345126554012052?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=btPE4Zr6"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=Gw1XyyEe"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=Gw1XyyEe" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=S2hKG1uz"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=S2hKG1uz" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=x6fBQMwv"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=x6fBQMwv" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/vV5Siw2BtMo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/4637345126554012052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=4637345126554012052" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4637345126554012052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4637345126554012052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/vV5Siw2BtMo/stsadm-properties.html" title="STSADM Properties" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/02/stsadm-properties.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYHRXo4cSp7ImA9WxVXF0s.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-6374362773931300709</id><published>2009-02-15T23:08:00.001-08:00</published><updated>2009-02-15T23:08:54.439-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-15T23:08:54.439-08:00</app:edited><title>Start Your April Fools Jokes Early</title><content type="html">&lt;h4&gt;Time Waits For No One&lt;/h4&gt;  &lt;p&gt;For some reason Valentines Day always reminds me that &lt;a href="http://en.wikipedia.org/wiki/April_Fools'_Day"&gt;April Fools&lt;/a&gt; is coming up. This most likely draws from the fact that I'm the youngest of two siblings, and it's become a personality trait to express my affection by irritating the crap out of an individual.&lt;/p&gt;  &lt;p&gt;Needless to say I have very few close friends.&lt;/p&gt;  &lt;p&gt;Since nothing says &amp;quot;I care about you&amp;quot; like a good practical joke, I'd like to take the time to &lt;strong&gt;remind you that April Fools day is a very short 32 business days away&lt;/strong&gt;, and depending on how deep your pranks run, you may need to get some infrastructure in place.&lt;/p&gt;  &lt;h4&gt;The Right Joke For The Right Bloke&lt;/h4&gt;  &lt;p&gt;A good practical joke is tailored to the&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SZkRBMuzm5I/AAAAAAAAA6g/GfHAN5wLyLI/s1600-h/april-fool%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="260" alt="april-fool" src="http://lh4.ggpht.com/_x_KlQTLtnfI/SZkRBUhhrGI/AAAAAAAAA6k/f9ZMD6MBjxM/april-fool_thumb%5B2%5D.jpg?imgmax=800" width="223" align="right" border="0" /&gt;&lt;/a&gt; individual. Knowledge of their technical depth, their patience, any history of violence, and past convictions are key to finding just the right level of crazy.&lt;/p&gt;  &lt;p&gt;If you'd like to go shopping for ideas, I'd suggest &lt;a href="http://stackoverflow.com/questions/65116/whats-your-favorite-harmless-computer-practical-joke"&gt;starting here&lt;/a&gt;. My only advise is to be prepared for retaliation. Most pranks usually deserve another, and the minute your cover gets blow, it'll already be too late to start wearing a helmet.&lt;/p&gt;  &lt;h4&gt;Get Going&lt;/h4&gt;  &lt;p&gt;So get on it. Usually most April Fools jokes fall apart because people leave them to the last minute. DNS records may need to get updated, proxies may need to get provisioned, machines may need to get hacked. Don't risk leaving it to the last minute, start being devious and subversive today!&lt;/p&gt;  &lt;p&gt;I'll share this years war story on April 2nd.&lt;/p&gt;  &lt;p&gt;Best,    &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-6374362773931300709?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=A8Rxzf6K"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=8r8zR0zh"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=8r8zR0zh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=iPFtvq1X"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=iPFtvq1X" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=fOIZhlpQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=fOIZhlpQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/t9xusmuDwIo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/6374362773931300709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=6374362773931300709" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6374362773931300709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6374362773931300709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/t9xusmuDwIo/start-your-april-fools-jokes-early.html" title="Start Your April Fools Jokes Early" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/02/start-your-april-fools-jokes-early.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYEQ3w-fSp7ImA9WxVXEUs.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-1870733531788329717</id><published>2009-02-09T00:02:00.001-08:00</published><updated>2009-02-09T00:28:22.255-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-09T00:28:22.255-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>How SharePoint Found Its Content Database</title><content type="html">&lt;h4&gt;Good Question&lt;/h4&gt;  &lt;p&gt;I was talking a client through a SharePoint web.config change a couple of weeks ago and he ended up asking a dynamite question.&lt;/p&gt;  &lt;p class="code"&gt;How does the web application know where its content database is at?&lt;/p&gt;  &lt;p&gt;You might say something like "it gets it from the config database", but that would beg another question, "how does it know where the config database is?". In reality, we're curious about how a web application orients itself to its environment when it comes time to respond to a request. &lt;/p&gt;  &lt;p&gt;You'll notice that SharePoint web.configs don't have any connectionString elements in them that point to a particular content or configuration database, and SharePoint installs don't make any changes to parent web.configs or machine.configs. So how does this web application orient itself at runtime?&lt;/p&gt;  &lt;h4&gt;Lets Reflect, Literally&lt;/h4&gt;  &lt;p&gt;If you think about it, there's a few clues to where this code "ought to be". Pretend for a minute that you were tasked with authoring some piece of functionality that let a web application figure out where its database was at runtime. There's some typical places you'd hook in (besides the web.config). You'd know that this piece of functionality would need to be populated in time to serve requests who would need to know where the content db is at. &lt;/p&gt;  &lt;p&gt;You might think about putting it in global.asax &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest%28VS.71%29.aspx"&gt;Application_OnStart&lt;/a&gt; or some http module event that's relatively early in the ASP.NET pipeline. &lt;/p&gt;  &lt;p&gt;Lets look at how a typical SharePoint request gets resolved and see if we can't flush out some details. This is the path I took to piece this answer together.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A request comes in and gets handled by IIS. The request matches either a port number or a host header on a web site in the web server. &lt;/li&gt;    &lt;li&gt;The matching SharePoint web site has &lt;em&gt;wild card ISAPI mappings&lt;/em&gt; that pass &lt;em&gt;all&lt;/em&gt; &lt;em&gt;request &lt;/em&gt;to ASP.NET. Remember that in a typical ASP.NET web site there mappings for known ASP.NET file extensions (.aspx, .asmx, .ascx, etc...) to the ASP.NET ISAPI filter. When IIS gets a request that ends with the given file extension, it knows that this is an ASP.NET request and hands it off to the aspnet_isapi.dll ISAPI. In a SharePoint IIS web site, we pass &lt;em&gt;everything&lt;/em&gt; to ASP.NET. This includes .gifs, .jpegs, .PSDs etc... SharePoint gets a chance to fulfill every requests that gets picked up by the site. Below is a screen cap the wild card mapping present in all SharePoint sites. This is created for you automatically when you provision a new web application. If you were to remove it, your SharePoint instance would no longer be able to serve non ASP.NET files out of the content database.  &lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SY_i_fkD2lI/AAAAAAAAA6Q/ktE7X0jfLZU/s1600-h/2009020821.26.304.gif"&gt;&lt;img style="border-width: 0px;" alt="Wildcard mapping that sends ALL requests to the .NET frameowrk and eventually to our SharePoint web application." src="http://lh4.ggpht.com/_x_KlQTLtnfI/SY_i_5VN4uI/AAAAAAAAA6U/CsA5LPH9e7Y/2009020821.26.30_thumb2.gif?imgmax=800" width="428" border="0" height="468" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Once the request gets handed to ASP.NET, its fair game for the web application to start doing some magic. In fact, it had better figure it out soon cause odds are this request is going to want something from the content database before the page life cycle hits. Because we're talking about the &lt;a href="http://msdn.microsoft.com/en-us/library/aa302376.aspx#secnetap04_topic2"&gt;ASP.NET request pipeline&lt;/a&gt; (and &lt;em&gt;early in it&lt;/em&gt;), it's a reasonable guess to assume an http module could be in play. If we look in the web.config under the &amp;lt;httpModules&amp;gt; section we find that SharePoint has registered an HttpModule named "SPRequest", it's fulfilled by code found in the Microsoft.SharePoint.ApplicationRuntime namespace by a class called SPRequestModule.&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SY_jAAWx-ZI/AAAAAAAAA6Y/oW0mn1VIynY/s1600-h/2009-02-08%2023.27.50%5B4%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="The SPRequest HttpModule." src="http://lh3.ggpht.com/_x_KlQTLtnfI/SY_jAOpvWdI/AAAAAAAAA6c/5bHdaLFO7js/2009-02-08%2023.27.50_thumb%5B2%5D.gif?imgmax=800" width="495" border="0" height="86" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;If you reflect on SPRequestModule and look into BeginRequestHandler (one of the earlier events in the ASP.NET pipeline), it's obfuscated, but you can &lt;a href="http://blog.tylerholmes.com/2009/02/when-reflector-tells-you-to-hit-road.html"&gt;read it anyway&lt;/a&gt;. BeginRequestHandler makes a call to SPFarm.Local which ends up calling SPFarm.FindLocal in an effort to find the farm that this machine belongs to. &lt;/li&gt;    &lt;li&gt;SPFindLocal finally calls into SPConfigurationDatabase.Local &lt;em&gt;which runs to the registry&lt;/em&gt; looking for &lt;strong&gt;HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\ConfigDB&lt;/strong&gt;. This is where your "connection string" for the current farm lives. &lt;/li&gt;    &lt;li&gt;This is also how SharePoint finds the config database, from there it simply takes the current request and uses it to find the content database (if any) associated with the given request. After all this has been figured out, a lot of it gets cached. &lt;/li&gt;    &lt;li&gt;Finally BeginRequestHandler starts through the complex task of mapping your request to a bunch of content in the web applications content database. The regular &lt;a href="http://msdn.microsoft.com/en-us/library/ms178472.aspx"&gt;Page Life Cycle&lt;/a&gt; kicks off and at the end of the day we end up with an HttpResponse built up by SharePoint. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Thought that someone else might enjoy the answer. This is kind of a neat piece of functionality too, it allows the psconfig tool to move this machine from farm to farm without changing any web.config files, so long as you can tell it where it should remap the registry key to. And with that, there's a little less magic in the world.&lt;/p&gt;  &lt;p&gt;Best,  &lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-1870733531788329717?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=akh89AUq"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=v4LpRVT1"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=v4LpRVT1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=cJksb32w"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=cJksb32w" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=XF3ZUv2W"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=XF3ZUv2W" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/FfXy7gvnskY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/1870733531788329717/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=1870733531788329717" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1870733531788329717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1870733531788329717?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/FfXy7gvnskY/how-sharepoint-found-its-content.html" title="How SharePoint Found Its Content Database" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/02/how-sharepoint-found-its-content.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08NQXg_cSp7ImA9WxVQGUw.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-6804233059308020053</id><published>2009-02-06T01:18:00.001-08:00</published><updated>2009-02-06T01:18:10.649-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T01:18:10.649-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><title>When the Reflector Tells You To Hit The Road</title><content type="html">&lt;h4&gt;Seeing Obfuscated Code&lt;/h4&gt;  &lt;p&gt;Like every other .NET developer out here, I'm a big fan of the &lt;a href="http://www.red-gate.com/products/reflector/"&gt;.NET Reflector&lt;/a&gt;. It was originally written by Lutz Roeder but is now maintained by the kind gentleman at Red Gate. One of the elements that make the tool stand out (in addition to the ease at which it lets you navigate/disassembling code), is the ton of &lt;a href="http://www.codeplex.com/reflectoraddins"&gt;add ins on CodePlex&lt;/a&gt; that extend the base functionality. If you haven't already, you should explore them some time.&lt;/p&gt;  &lt;p&gt;I mostly use the .NET Reflector when it comes to things that I don't quite understand and I can't seem to find an adequate answer on the web. Ninety percent of the time, this tool will usually make it easy for you to look underneath the hood and you can find your own answers.&lt;/p&gt;  &lt;p&gt;Every now and then when you're reflecting on code that someone doesn't thing you should see, you'll get the following message from the tool.&lt;/p&gt;  &lt;p class="code"&gt;This item is obfuscated and can not be translated. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SYwATlXGZDI/AAAAAAAAA54/0pdNQSgcWTw/s1600-h/2009-02-06%2000.52.32%5B4%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="83" alt="This item is obfuscated and can not be translated." src="http://lh4.ggpht.com/_x_KlQTLtnfI/SYwATkuVpmI/AAAAAAAAA58/glqlCvSDiCg/2009-02-06%2000.52.32_thumb%5B2%5D.gif?imgmax=800" width="362" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If your stubborn like most rural mules or have never heard of &amp;quot;no means no&amp;quot;, you can carry onward by going to &lt;strong&gt;View&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Options&lt;/strong&gt;-&amp;gt;Click &lt;strong&gt;Dissassembler &lt;/strong&gt;and set the language to IL.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SYwAT1q4fOI/AAAAAAAAA6A/R8DjaKpMwH0/s1600-h/2009-02-06%2000.59.14%5B3%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="Changing the language to IL in reflector will let you see obfuscated code." src="http://lh5.ggpht.com/_x_KlQTLtnfI/SYwAUGIAeiI/AAAAAAAAA6E/p4QQflO7jPo/2009-02-06%2000.59.14_thumb%5B1%5D.gif?imgmax=800" width="411" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you're simply asking for the IL, Reflector will gladly show you the contents of the function (if you can make any sense out of it). Intermediate Language is even harder to read than disassembled MISL that's mapped to C# or VB.NET (which unreadable for another variety of reasons).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SYwAUR6Ol9I/AAAAAAAAA6I/pKM4_VSj0a4/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="222" alt="Code that was previously obfuscated." src="http://lh6.ggpht.com/_x_KlQTLtnfI/SYwAUVmQb5I/AAAAAAAAA6M/xJvBxVdJU7k/image_thumb%5B3%5D.png?imgmax=800" width="540" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In fact if you're just going to be looking at IL, you can actually skip the .NET Reflector in the first place and use the MSIL Disassembler (ildasm.exe) that comes with the .NET framework. May not look as pretty, but you're guaranteed to have it on any machine which as the .NET SDK.&lt;/p&gt;  &lt;p&gt;Here's a disclaimer.&lt;/p&gt;  &lt;p&gt;It's also worth mentioning that by reverse engineering code you could be violating an EULA, and I'm hear to tell you that you should never do that. In fact, if you're ever given a piece of code that doesn't function correctly, you should never try to fix it or do anything to further your understand what's going wrong. Often the most legally sound action, is to turn off the computer and go home.&lt;/p&gt;  &lt;p&gt;Hope that helps someone find an answer.&lt;/p&gt;  &lt;p&gt;Best,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-6804233059308020053?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=WkVnSIHI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=t8rVHQBS"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=t8rVHQBS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=RQFCY8XY"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=RQFCY8XY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=ucgtaBm5"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=ucgtaBm5" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/sAruGkp8llc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/6804233059308020053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=6804233059308020053" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6804233059308020053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6804233059308020053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/sAruGkp8llc/when-reflector-tells-you-to-hit-road.html" title="When the Reflector Tells You To Hit The Road" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/02/when-reflector-tells-you-to-hit-road.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUINRn0zeip7ImA9WxVQE00.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-6247322107870773471</id><published>2009-01-30T00:14:00.001-08:00</published><updated>2009-01-30T00:19:57.382-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T00:19:57.382-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Stong Name" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><title>Quick Deploys And Assembly Resolution</title><content type="html">&lt;h4&gt;The Error&lt;/h4&gt;  &lt;p&gt;We recently ran into the most bizarre error on a clients machine that hosts the central administration web site. Every 15 minutes on the dot we'd get the following error for many different assemblies. The error looked a lot like:&lt;/p&gt;  &lt;p class="code"&gt;Event Type:    Error  &lt;br /&gt;Event Source:    Windows SharePoint Services 3   &lt;br /&gt;Event Category:    Runtime   &lt;br /&gt;Event ID:    6611   &lt;br /&gt;Date:        1/15/2009   &lt;br /&gt;Time:        1:11:26 PM   &lt;br /&gt;User:        N/A   &lt;br /&gt;Computer:    [MACHINE NAME]&lt;br /&gt;Description:   &lt;br /&gt;Error: Failure in loading assembly: [AssemblyName], Version=1.0.0.0, Culture=neutral, PublicKeyToken=e376b6bc65267f90 &lt;/p&gt;  &lt;p&gt;It's worth mentioning that these errors mentioned the names of assemblies that were used in multiple sites (even though they were deployed into bin folders). The sites that used these assemblies were customized, and their Master Pages and Page Layouts referenced the assemblies that supposedly couldn't be loaded (as far as the error was concerned. Some of these dependencies were strong named and others were not. None of them lived in the GAC (all bin folder deployed).&lt;/p&gt;  &lt;h4&gt;The Solution&lt;/h4&gt;  &lt;p&gt;We used the fact that the errors occurred every 15 minutes to link them to Quick Deploy jobs. When we changed the quick deployments to every 10 minutes, the errors followed suit reoccurring at the same interval.&lt;/p&gt;  &lt;p&gt;At this point we were convinced that the SharePoint Timer (OWSTimer.exe) was trying to load these assemblies but&lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/SYK2zRS203I/AAAAAAAAA5o/Nvi_2TtHXC4/s1600-h/Essential.NET3.jpg"&gt;&lt;img style="border-width: 0px;" alt="Essential .NET Volume 1" src="http://lh5.ggpht.com/_x_KlQTLtnfI/SYK2zm70fMI/AAAAAAAAA5s/6tyfxk2FUU4/Essential.NET_thumb1.jpg?imgmax=800" align="right" border="0" height="164" width="132" /&gt;&lt;/a&gt; couldn't find them. So how does assembly resolution happen in the .NET framework? We were saved by an an excerpt from &lt;a href="http://www.amazon.com/gp/product/0201734117?ie=UTF8&amp;amp;tag=itsinsywh-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0201734117"&gt;Essential .NET, Volume 1: The Common Language Runtime&lt;/a&gt;, a book by Don Box and Chris Sells. Essentially it works like this. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When the assembly loader goes to load an assembly, it first looks to whether the assembly is strong named. If it IS, then the loader first looks in the GAC (not the bin folder). &lt;/li&gt;    &lt;li&gt;If it can't find the assembly in the GAC, the loader will then look for &lt;a href="http://msdn.microsoft.com/en-us/library/efs781xb%28VS.71%29.aspx"&gt;&amp;lt;codeBase&amp;gt;&lt;/a&gt; hints in the applications configuration file. Remember that these settings inherit down from machine.config to app.config/web.config. &lt;/li&gt;    &lt;li&gt;If there's no &amp;lt;codeBase&amp;gt; hints then the loader will resort to probing as a last ditch effort to find the assembly. This includes bin folders and any other location dictated by &amp;lt;probing&amp;gt; elements. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If the above seems confusing, consider the following flow chart.&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SYK20DvaQjI/AAAAAAAAA5w/uwbd5eL0A0U/s1600-h/AssemblyResolution4.gif"&gt;&lt;img style="border-width: 0px;" alt="Flow chart speaking to assembly resolution." src="http://lh6.ggpht.com/_x_KlQTLtnfI/SYK20urRUvI/AAAAAAAAA50/ST7vZYeZpeU/AssemblyResolution_thumb2.gif?imgmax=800" border="0" height="602" width="475" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We first tried putting hints in the local web.configs, but because the OWSTimer has nothing to do with the our applications, the settings were being ignored. We finally helped the timer out by making the following modifications to the machine.config. To ensure that we didn't remap ALL lookups for the given assembly to the specific location, we had any other application who used the same assembly name override these settings below with a similar one in their own web.config. The overridden setting listed a location that made more sense for the particular web application (ie. web applications should go hunting for .dll's in their own bin folder, not some other applications). &lt;/p&gt;  &lt;p&gt;The machine.config was changed to read:&lt;/p&gt;  &lt;pre class="prettyprint" style="overflow: auto;"&gt;&amp;lt;runtime&amp;gt;  &lt;br /&gt; &amp;lt;assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"&amp;gt;   &lt;br /&gt;   &amp;lt;dependentAssembly&amp;gt;   &lt;br /&gt;     &amp;lt;assemblyIdentity name="[NameOfAssembly]" publicKeyToken="9871993fa258bc6" culture="neutral" /&amp;gt;   &lt;br /&gt;     &amp;lt;codeBase version="1.0.0.0" href="file://C:/folder/directory/bin/[NameOfAssembly].dll" /&amp;gt;   &lt;br /&gt;   &amp;lt;/dependentAssembly&amp;gt;   &lt;br /&gt; &amp;lt;/assemblyBinding&amp;gt;   &lt;br /&gt;&amp;lt;/runtime&amp;gt;&lt;/pre&gt;  &lt;p&gt;The web.config was changed to read:&lt;/p&gt;  &lt;pre class="prettyprint" style="overflow: auto;"&gt;&amp;lt;runtime&amp;gt;  &lt;br /&gt; &amp;lt;assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"&amp;gt;   &lt;br /&gt;   &amp;lt;dependentAssembly&amp;gt;   &lt;br /&gt;     &amp;lt;assemblyIdentity name="[NameOfAssembly]" publicKeyToken="9871993fa258bc6" culture="neutral" /&amp;gt;   &lt;br /&gt;     &amp;lt;codeBase version="1.0.0.0" href="file://C:/webapplicationLocation/bin/[NameOfAssembly].dll" /&amp;gt;   &lt;br /&gt;   &amp;lt;/dependentAssembly&amp;gt;   &lt;br /&gt; &amp;lt;/assemblyBinding&amp;gt;   &lt;br /&gt;&amp;lt;/runtime&amp;gt;&lt;/pre&gt;  &lt;p&gt;You can also provide &amp;lt;codeBase&amp;gt; hints for assemblies that aren't strongly named, you just need to omit the the optional publicKeyToken and culture attributes. Another tip is that you can also use the &lt;a href="http://msdn.microsoft.com/en-us/library/823z9h8w.aspx"&gt;&amp;lt;probing&amp;gt;&lt;/a&gt; element if you want to probe folders other than the bin folder.&lt;/p&gt;  &lt;p&gt;We then restarted IIS, followed by the timer service. Low and behold, our random error went away. This toast goes out to the highly configurable .NET framework, and the expressiveness of app/web/machine.config files.&lt;/p&gt;  &lt;p&gt;Best,  &lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-6247322107870773471?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=7qXx8QKV"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=SDkNqkVa"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=SDkNqkVa" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=L0Zl9ebL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=L0Zl9ebL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=W30adEpM"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=W30adEpM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/MRMEb3mpA8I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/6247322107870773471/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=6247322107870773471" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6247322107870773471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6247322107870773471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/MRMEb3mpA8I/quick-deploys-and-assembly-resolution.html" title="Quick Deploys And Assembly Resolution" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/quick-deploys-and-assembly-resolution.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHQXs4fip7ImA9WxVQE00.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-507054270537908192</id><published>2009-01-27T21:03:00.000-08:00</published><updated>2009-01-30T00:18:50.536-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T00:18:50.536-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>TroubleShooting The JQuery Accordion</title><content type="html">&lt;h4&gt;JQuery and the Accordion&lt;/h4&gt;  &lt;p&gt;I've been getting more and more into &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; recently. It's light, free (as in freedom), and has a vibrant community. Sweetening the deal is the ever growing list of &lt;a href="http://plugins.jquery.com/"&gt;animated controls&lt;/a&gt; that effortlessly plug into the framework.&lt;/p&gt;  &lt;p&gt;We've been using JQuery for quite a few of our clients who have expressed a desire for more interactive SharePoint sites. I've been so impressed with the framework of late that I've started to &lt;a href="http://blog.tylerholmes.com/2008/12/put-down-that-ajax-control-toolkit.html"&gt;advocate it over heavier tools&lt;/a&gt; that try to achieve similar results.&lt;/p&gt;  &lt;h4&gt;The Problem&lt;/h4&gt;  &lt;p&gt;Just today I ran into a pretty interesting problem with the &lt;a href="http://plugins.jquery.com/project/accordion"&gt;JQuery Accordion&lt;/a&gt;. I'm throwing up this fix because I couldn't find a solution on the web. We had the accordion binding off of a SiteMapDataSource in a SharePoint master page, everything looked great in Chrome, FireFox, and Safari...but IE 6 and 7 were giving us a really hard time.&lt;/p&gt;  &lt;p&gt;What made this even more frustrating is that it worked fine in at least three other SharePoint sites with exceedingly similar master pages.&lt;/p&gt;  &lt;p&gt;The accordion would flicker at the end of the animation every time the user would expand or collapse a sub menu. We tried removing all the CSS, but the page still yielded the same behavior. The menu would briefly flash the entire contents of a sub menu whenever a a new section was collapsed/expanded. The only way we could stop this was by turning the animation off in entire.&lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;The Troubleshoot&lt;/h4&gt;  &lt;p&gt;At first I tried &lt;a href="http://blog.tylerholmes.com/2008/09/debug-any-javascript-in-your-browser.html"&gt;debugging the JavaScript&lt;/a&gt; for JQuery and the accordion, but the source quickly became difficult to follow. The guys who wrote this stuff have mad JavaScript skills, they're head over heels better JavaScript developers than I am.&lt;/p&gt;  &lt;p&gt;So I ended up doing what I normally do when I don't understand what's going on. I started to make things simpler. I opened up SharePoint Designer and started removing sizeable sections of the page, block by block, seeing if I could get the problem to go away. I ended up with a ridiculously small html document that basically had the the accordion menu markup and a couple of other html tags.&lt;/p&gt;  &lt;p&gt;It was only when the document was about forty lines long that the problem became apparent.&lt;/p&gt;  &lt;p&gt;There was &lt;strong&gt;no doc type on the html document&lt;/strong&gt;. I've written about &lt;a href="http://blog.tylerholmes.com/2008/08/quirks-mode-strikes-again.html"&gt;Quirks Mode&lt;/a&gt; before, so I was a little embarrassed that I hadn't noticed it earlier. If you're not familiar, or are too lazy to click on the link above, in a nutshell quirks mode is a special rending mode that browsers go to when you either don't specify the doc type or use html that deviates from the declared &lt;a href="http://www.alistapart.com/stories/doctype/"&gt;doc type&lt;/a&gt;. The rules for what justifies quirks mode rendering changes from browser to browser. For IE, not declaring a doc type will cause it to render the page in quirks mode.&lt;/p&gt;  &lt;p&gt;Quirks mode changes the way that the browser handles CSS rules. When we failed to declare a doc type, IE started rendering the menu in quirks mode. This changed the way that the browser handled the in line CSS that the JQuery accordion was tacking onto menu list markup. Hence the odd behavior.&lt;/p&gt;  &lt;p&gt;I added my favorite and most relaxed doc type:&lt;/p&gt;  &lt;div class="code" style="overflow: auto;"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;/div&gt;  &lt;p&gt;Low and behold, the animation issue went away. Quirks mode strikes again. I guess the lesson here is that before you get to involved in a markup troubleshoot, &lt;strong&gt;ensure the document isn't being rendered in quirks mode!&lt;/strong&gt; You can figure out how to detect quirks mode by &lt;a href="http://blog.tylerholmes.com/2008/08/quirks-mode-strikes-again.html"&gt;reading this&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Fool Me Twice,   &lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-507054270537908192?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=Oq0VAMuE"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=0HFrQ7yF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=0HFrQ7yF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=AJlgBPyd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=AJlgBPyd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=BF1FFt34"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=BF1FFt34" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/Bu3zrITopR4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/507054270537908192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=507054270537908192" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/507054270537908192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/507054270537908192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/Bu3zrITopR4/troubleshooting-jquery-accordion.html" title="TroubleShooting The JQuery Accordion" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/troubleshooting-jquery-accordion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8MQHc9eip7ImA9WxVRFkw.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-9214439059516903461</id><published>2009-01-22T01:01:00.001-08:00</published><updated>2009-01-22T01:01:21.962-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T01:01:21.962-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>SharePoint: Searching With Managed Properties</title><content type="html">&lt;h4&gt;Crawled and Managed Properties&lt;/h4&gt;  &lt;p&gt;When the SharePoint 2007 crawler indexes a piece of content, it finds a not only a bunch of text to index, but also a tonne of metadata about the document. These pieces of metadata are referred to as &lt;em&gt;&lt;strong&gt;crawled properties&lt;/strong&gt;&lt;/em&gt;. Consider an Office 2007 Word document (.docx). When the crawler opens up the document, it finds a plethora of information about the file; the file extension, who authored it, when it was created, and the actual text in the document itself. These are just some the many crawled properties captured about any given piece of content. What fields actually get captured are a function of the content and the IFilter that helped the crawler dissect the document.&lt;/p&gt;  &lt;p&gt;Here's a reduced screen cap of some of the crawled properties captured for Office Documents. &lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/SXg13ceJFtI/AAAAAAAAA5Y/7BRx8rV4QAc/s1600-h/2009.01.2112.52.155.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="279" alt="Crawled properties (for Office documents) captured by the SharePoint Crawler" src="http://lh6.ggpht.com/_x_KlQTLtnfI/SXg13sNzIYI/AAAAAAAAA5c/RevjJWgxVsQ/2009.01.2112.52.15_thumb3.gif?imgmax=800" width="343" align="right" border="0" /&gt;&lt;/a&gt;You can sift through all the properties that are being captured by your crawler by going to the Shared Service Provider, then clicking on &lt;strong&gt;Search Settings&lt;/strong&gt;, &lt;strong&gt;Metadata property mappings&lt;/strong&gt; and then on &lt;strong&gt;Crawled Properties&lt;/strong&gt;. If you click on the Office category you'll end up getting a list that's much longer than the abridged one on the right. Whenever the crawler discovers a new property, it adds the new crawled property to a list maintained in the Shared Service provider. If the property discovered is of type text, then it is automatically added to the search index. &lt;/p&gt;  &lt;p&gt;It's important to note that a Crawled Property can be reused in many Managed Properties, and Managed Properties can have mappings from many Crawled Properties (many to many). In fact this is how we harvest value from the Crawled/Managed property marriage. By using them together we can construct extremely powerful and expressive search queries.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Managed Properties&lt;/em&gt;&lt;/strong&gt; are user created labels, that map one or more crawled properties to a searchable term. They are available for basic search, advanced search and for defining scopes. An example of a search expression using a managed property might be the search:&lt;/p&gt;  &lt;p class="code"&gt;Title:&amp;quot;Tyler&amp;quot;&lt;/p&gt;  &lt;p&gt;When I search &lt;strong&gt;Title&lt;/strong&gt;:&lt;strong&gt;&amp;quot;Tyler&amp;quot;&lt;/strong&gt; (read [ManagedProperty]:&amp;quot;[SearchTerm]&amp;quot;), I'm really searching all the crawled properties that are mapped to the managed property &lt;strong&gt;Title&lt;/strong&gt;, for the text &amp;quot;Tyler&amp;quot;. &lt;/p&gt;  &lt;p&gt;That is, the search expression Title:&amp;quot;Tyler&amp;quot; will bring back all the search results that have the text &amp;quot;Tyler&amp;quot; in at least one of the following crawled properties [Mail:5(Text), People:PreferredName(Text), Basic:displaytitle(Text), ows_Title(Text)]. In fact if you feel that the crawled properties attached to Title aren't sufficient, you can make any changes you want. Managed properties are there for you to explore and tweak.&lt;/p&gt;  &lt;h4&gt;Creating a Managed Property&lt;/h4&gt;  &lt;p&gt;You don't really have a lot of control over crawled properties (you simply get what the indexer picks up). You do however get a fair bit of hand over what managed properties exist, and what crawled properties are mapped to them. It's worth mentioning that you don't always need to install a new IFilter to get more crawled properties to show up. The indexer will also pick up custom site columns that you add to your lists/libraries every time it does a full crawl. If this site column has never been seen before (ie. you just created it), a new entry will be added to the crawled properties list.&lt;/p&gt;  &lt;p&gt;A good example of this would be if you were to create a new site column (say MyCustomeField) on some list. The next&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SXg13x2hgwI/AAAAAAAAA5g/VGyuyDFgSok/s1600-h/2009.01.22%2000.23.05%5B5%5D.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="322" alt="Creating a Managed Property using a crawled property discoverd from a custom data type." src="http://lh4.ggpht.com/_x_KlQTLtnfI/SXg14UYWxnI/AAAAAAAAA5k/aMs0JtBCrGw/2009.01.22%2000.23.05_thumb%5B3%5D.gif?imgmax=800" width="301" align="right" border="0" /&gt;&lt;/a&gt; time the indexer does a full crawl, the new crawled property will show up (named ows_MyCustomeField). You can then open up &lt;strong&gt;Metadata Property Mappings&lt;/strong&gt; (from the Shared Service Provider &lt;strong&gt;Search Settings&lt;/strong&gt;) and create a new managed property (say TylersCustomField) that users can use to search exactly that site column. They could, for exaple search for TylersCustomeField:&amp;quot;SomeValue&amp;quot;. You can even use that managed property to limit or grow the search results that are governed by any search scope.&lt;/p&gt;  &lt;p&gt;When you start to digest the utility of Managed/Crawled properties, it becomes apparent they they're responsible for a huge part of the SharePoint search's expressiveness. They empower you to help users author some pretty functional searches. Not just the kind of searches that find all the documents with a certain file extension (fileextension:&amp;quot;doc&amp;quot;, but searches that look only at very custom properties within niche types of content. &lt;/p&gt;  &lt;p&gt;Consider the following out of the box managed properties that allow searching for people by their assistant's name (Assistant:&amp;quot;Mary&amp;quot;), by their Responsibilities (Responsibilities:&amp;quot;Sales&amp;quot;), or finding files by filename (filename:&amp;quot;my document&amp;quot;). Managed properties can also be grouped in searches (fileextension:&amp;quot;doc&amp;quot; filename:&amp;quot;my document&amp;quot;).&lt;/p&gt;  &lt;p&gt;Stop by the Managed Properties pages in the Shared Services Provider and you'll be impressed. Once you start to wrap your head around managed properties, you'll realize how easy it is to leverage this out of the box functionality for your customers. You'll may even start to feel like SharePoint is finally making your job easier.&lt;/p&gt;  &lt;p&gt;Best,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-9214439059516903461?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=nkiuzvss"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=MhRwJSPw"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=MhRwJSPw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=xUyS9d3u"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=xUyS9d3u" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=s4Y9xZJt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=s4Y9xZJt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/gSFk38PowuM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/9214439059516903461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=9214439059516903461" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/9214439059516903461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/9214439059516903461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/gSFk38PowuM/sharepoint-searching-with-managed.html" title="SharePoint: Searching With Managed Properties" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/sharepoint-searching-with-managed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYDRnYzcSp7ImA9WxVRE0k.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-263515786223011571</id><published>2009-01-18T22:15:00.000-08:00</published><updated>2009-01-18T22:22:57.889-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-18T22:22:57.889-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Rants" /><title>Turn On The Search Already!</title><content type="html">&lt;h4&gt;ROI Unleashed&lt;/h4&gt;  &lt;p&gt;When IT departments roll out SharePoint, search is usually the last thing on their minds. This is really a shame, because powerful enterprise search is one of the most underutilized features that comes out of the box with MOSS Standard or Enterprise. You get search with WSS too, but you can only search a given site collection.&lt;/p&gt;  &lt;p&gt;MOSS allows you to search across a whole enterprise unifying rogue document shares, reclusive business data, and your actual SharePoint content. People can also search for People and find internal resources that possess a particular skill set, or report to a given manager.&lt;/p&gt;  &lt;p&gt;Business units naturally tend to carve out their own space for storing tribal knowledge. This is usually irritating to system administrators and confusing to new hires (never mind existing employees). One of the easiest corrective actions is to tell SharePoint to go index all these pieces of hidden content and yield them when the appropriate search string is entered. &lt;/p&gt;  &lt;p&gt;Creating a search portal is one of the most obvious value adds that you can quickly provide your users. I can't think of any organization I've ever worked with that didn't have documents scattered across the enterprise. In a day and age when IT is constantly trying to justify it's ROI, turning the key on enterprise search is an easy home run.&lt;/p&gt;  &lt;p&gt;What's even better is that SharePoint Search will automatically security trim based on ACL (Access Control List) entries that are found on the content. &lt;a href="http://www.amazon.com/gp/product/0735622825?ie=UTF8&amp;amp;tag=itsinsywh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735622825"&gt;&lt;img style="border-width: 0px;" alt="Microsoft Office SharePoint 2007 Administrators Companion" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SXQbLF7OwOI/AAAAAAAAA5M/fBP9IwO2OVg/MOSS20074.png?imgmax=800" width="200" align="right" border="0" height="244" /&gt;&lt;/a&gt;This means that if you're indexing an NTFS share that only the DOMAIN\HR users can access, you don't have to worry about the search engine yielding those documents as search results when searches are done by the DOMAIN\Marketing folks. This holds true for SharePoint content which also exposes ACLs to the SharePoint indexer.&lt;/p&gt;  &lt;p&gt;If you're completely new to search, consider reading the search chapters in &lt;a href="http://www.amazon.com/gp/product/0735622825?ie=UTF8&amp;amp;tag=itsinsywh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735622825" target="_blank"&gt;Bill English's Microsoft Office SharePoint Server 2007 Administrator's Companion&lt;/a&gt;. While it's not specifically geared to search, it'll speak to search in general and all the topics directly related to search. It's probably the most complete SharePoint reference out there. I like to think of it as the MOSS Bible for all things general and out of the box. If you're looking for a more in depth title more specifically targeted to search, consider &lt;a target="_blank" href="http://www.amazon.com/gp/product/0735625352?ie=UTF8&amp;amp;tag=itsinsywh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735625352"&gt;Inside the Index and Search Engines: Microsoft Office SharePoint Server 2007 (PRO-Developer)&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Fire It Up&lt;/h4&gt;  &lt;p&gt;If you haven't done so already, consider creating a portal site for your enterprise. After that, create a Search Center somewhere off that root site.&lt;/p&gt;  &lt;p&gt;All that's left to do is open up the Shared Service Provider for your farm and start adding content sources. After you perform a full crawl, a myriad of documents that used to be extremely hard to find (or at least required Sherpa like navigation knowledge) will start to show up as search results for anyone who had access in the first place. Start small if you have a tonne of content to index and aren't currently in a large farm set up, but have a little faith in the product too. Even a stand alone installation can easily maintain an index for thousands of documents, and when you need to scale your farm out, rest assured that it's very possible. &lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SXQbLfjbDYI/AAAAAAAAA5Q/tLcMOMT0aHU/s1600-h/2009.01.18%2022.02.49%5B4%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="2009.01.18 22.02.49" src="http://lh6.ggpht.com/_x_KlQTLtnfI/SXQbLrabqvI/AAAAAAAAA5U/L0xUY02wuHM/2009.01.18%2022.02.49_thumb%5B2%5D.gif?imgmax=800" width="532" border="0" height="273" title="Many different content sources pulling together enterprise content" alt="Many different content sources pulling together enterprise content" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you're part of a huge organization then search becomes a more interesting topic in the sense that indexing millions of documents and setting up the security around all this content is a big job. But the point of this post is to make you more aware of SharePoint search and took at it as a relatively easy value add. Take comfort in the fact that this out of the box search feature (MOSS Standard/Enterprise) will do things that even $10,000 Google Mini's won't. You owe it to yourself to at least start playing with it.&lt;/p&gt;  &lt;p&gt;In future posts we'll get into Managed and Crawled Properties, search Scopes, Content Sources etc..., the purpose of this is simply to get you enthused about search. There's no replacement for good planning and a solid information taxonomy, but when information is already scattered to the winds nothing helps round up lost documents like a good search engine.&lt;/p&gt;  &lt;p&gt;Good Luck,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-263515786223011571?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=ZhLTwztk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=9EziuGif"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=9EziuGif" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=3pq5GBs3"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=3pq5GBs3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=gei7ok2J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=gei7ok2J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/QnuLMVJhZcY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/263515786223011571/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=263515786223011571" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/263515786223011571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/263515786223011571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/QnuLMVJhZcY/turn-on-search-already.html" title="Turn On The Search Already!" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/turn-on-search-already.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYMQXkycCp7ImA9WxVREEo.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-6908845004996251178</id><published>2009-01-15T17:43:00.000-08:00</published><updated>2009-01-15T17:43:00.798-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-15T17:43:00.798-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>STSADM Restore Errors With SQL SERVER Express</title><content type="html">&lt;h4&gt;But There's Tonnes of Disk Space!&lt;/h4&gt;  &lt;p&gt;The other day I was migrating a site collection from one machine to another. I had a copy of the source site collection and was ready to restore it on this new machine that another developer had prepped. I created a SharePoint web application at the destination and then proceeded to run the restore command:&lt;/p&gt;  &lt;div class="code"&gt;stsadm -o restore -url http://someurl -filename c:\file.bak -overwrite&lt;/div&gt;  &lt;p&gt;After a while I ended up getting some disgruntled feedback from the stsadm tool:&lt;/p&gt;  &lt;div class="code"&gt;The site collection could not be restored. If this problem persists, please make sure the content databases are available and have sufficient free space.&lt;/div&gt;  &lt;p&gt;Which was confusing, I made sure there was tonnes of disk space (20 GB free for the restore of a 3 GB site collection) and tried again...it died with the same error. After poking around I noticed something odd after running the following query in the Management Studio:&lt;/p&gt;  &lt;div class="code"&gt;SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')&lt;/div&gt;  &lt;p&gt;As it turns out, the database server I was trying to restore the site collection into was running &lt;strong&gt;SQL Server Express Edition which has a file size cap of 4 GB&lt;/strong&gt;. When this &amp;quot;farm&amp;quot; was set up, it was done so with a Basic install which by defaul installs SQL Express and inherits it's limitations. The site collection I was trying to restore was breaking the 4 GB limit and as a result the stsadm tool &lt;em&gt;thought there wasn't any disk space available, &lt;/em&gt;when really there was a bunch to be had..&lt;/p&gt;  &lt;h4&gt;Upgrading SQL Server Express to Developer/Standard/Workstation/Enterprise&lt;/h4&gt;  &lt;p&gt;As a result I had to upgrade the OFFICESERVERS instance of SQL Server running on that machine from Express to Developer (you can upgrade it to Developer/Standard/Workstation/Enterprise, whatever you have in terms of media/licensing).&lt;/p&gt;  &lt;p&gt;This ends up being pretty easy, you simply find the media/installer and run the setup.exe that you normally would but with an added argument of SKUUPGRADE=1.&lt;/p&gt;  &lt;div class="code"&gt;setup.exe SKUUPGRADE=1&lt;/div&gt;  &lt;p&gt;When the install wizard gives you get a chance, select the OfficeServers instance and upgrade the database engine. If you want a more detailed walkthrough, one is &lt;a href="http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=55" target="_blank"&gt;available here&lt;/a&gt;. When you're done, run the same SQL query above and the product edition should no longer be Express.&lt;/p&gt;  &lt;p&gt;After that small adventure, the restore worked like a charm.&lt;/p&gt;  &lt;p&gt;Hope that helps someone.&lt;/p&gt;  &lt;p&gt;Best,    &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-6908845004996251178?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=yhAMSwmc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=uayHSfDT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=uayHSfDT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=nzDGbk4n"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=nzDGbk4n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=SLk9jJHf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=SLk9jJHf" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/3GevvE5cDn8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/6908845004996251178/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=6908845004996251178" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6908845004996251178?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6908845004996251178?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/3GevvE5cDn8/stsadm-restore-errors-with-sql-server.html" title="STSADM Restore Errors With SQL SERVER Express" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/stsadm-restore-errors-with-sql-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cDQH06eip7ImA9WxVSGE4.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-547954960771608269</id><published>2009-01-13T00:24:00.001-08:00</published><updated>2009-01-13T00:24:31.312-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T00:24:31.312-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>Big Fat Content Deployment Jobs</title><content type="html">&lt;h4&gt;The Blessings and Woes of Content Deployment&lt;/h4&gt;  &lt;p&gt;If you've spent a lot of time dealing with Incremental Content Deployment Jobs, then you've most likely either developed the patience of a saint, or a taste for 80 proof liquor. &lt;/p&gt;  &lt;p&gt;This particular feature has worked, and then not worked over a series of SharePoint patches. For example, it didn't work under RTM for many sites, then a hot fix corrected the behavior. It was then broken again for most web applications under &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=4191A531-A2E9-45E4-B71E-5B0B17108BD2&amp;amp;displaylang=en" target="_blank"&gt;service pack one&lt;/a&gt;, which was followed by a fix in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=256CE3C3-6A42-4953-8E1B-E0BF27FD465B&amp;amp;displaylang=en" target="_blank"&gt;Infrastructure Update&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Because this particular feature has dealt the world so much hair loss, a lot of clients I've met with have resorted to using full content deployment jobs to get their content from one site collection to another. &lt;/p&gt;  &lt;p&gt;The key difference between the two is that an incremental deployment job will deploy only changes (new records, updates, and deletes). A full content deployment job will deploy &lt;em&gt;everything&lt;/em&gt; in the site/branch/site collection that you select (that is, it will deploy a copy of the current version, not the version history as well). If you select a site, you're about to get another copy of every asset in that site. If you select the entire site collection, there's even more content that's about to get duplicated.&lt;/p&gt;  &lt;h4&gt;Hold Off On That Full Content Deployment&lt;/h4&gt;  &lt;p&gt;The real problem with resorting to full content deployments is that if you're prone to using them too often your content database size can go through the roof. For those who normally deal with SharePoint capacity and planning, this can be a nightmare. The last thing you want is bloated a content database with duplicate copies of 40 MB PowerPoint presentations coupled with the HR departments prized PDF collection.&lt;/p&gt;  &lt;p&gt;A particular client we work with ended up using full content deployments for sub sites about 6 months ago because they couldn't get incremental content deployments to work. Before they knew it their destination site collection was &lt;em&gt;16 times the size of the source site collection&lt;/em&gt;. Luckily this particular content database was pretty lean (about 150 MB, and so the destination only ended up being ~2.5 GB). Imagine if they had a source site collection that was around 50 GB (which is very common for many intranet site collections), they'd be looking at a destination site collection which would be ~ 0.8 TB, a near unmanageable (or at least painful) amount of data for most small to medium IT shops.&lt;/p&gt;  &lt;p&gt;No one really wins when it comes to regular full content deployments. Even if there's quotas on the site collection the inherent duplication still steals space that users could otherwise use to store useful data. If patching it isn't something you feel you can easily do yourself consider contacting MS SharePoint Support, &lt;a href="http://blog.tylerholmes.com/2009/01/don-rule-out-ms-support-for-help.html" target="_blank"&gt;they're not half bad&lt;/a&gt;, and they're pretty cheap ($250 last time I checked).&lt;/p&gt;  &lt;p&gt;If you're not already convinced, here's a couple screen caps of data pulled from&amp;#160; &lt;a href="http://www.red-gate.com/products/sql_data_compare/index.htm" target="_blank"&gt;Red Gate SQL Data Compare&lt;/a&gt; detailing the differences on just a small site. The first cap is a before/after comparison of a sub site being deployed using an incremental job after a small change as taken place (content edit).&lt;/p&gt;  &lt;p&gt;The second screen cap is of the same site before/after a full content deployment job targeting the same sub site.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Record Difference Before and After an Incremental Content Deployment&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/SWxPvMk66II/AAAAAAAAA48/Ot_FaTNIyxA/s1600-h/SQLCompareIncremental%5B4%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="251" alt="SQLCompareIncremental" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SWxPvHh2QPI/AAAAAAAAA5A/0lcEbjlW7Xs/SQLCompareIncremental_thumb%5B2%5D.gif?imgmax=800" width="448" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Record Difference Before and After a Full Content Deployment&lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/SWxPvV0tpuI/AAAAAAAAA5E/L5VmIkPrb0Y/s1600-h/SQLCompareFull%5B4%5D.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="319" alt="SQLCompareFull" src="http://lh4.ggpht.com/_x_KlQTLtnfI/SWxPvjK1vFI/AAAAAAAAA5I/HNJ3pjydndY/SQLCompareFull_thumb%5B2%5D.gif?imgmax=800" width="430" border="0" /&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;These results will of course dramatically change with the site of your site collection and what you're doing a full content deployment on. The point is just to offer a reminder that the unnatural growth of the content database just may not be worth it in the long run. If you're currently wed to full content deployments I'd suggest either getting a divorce ASAP, or investing in some sizable disks to help manage the data explosion.&lt;/p&gt;  &lt;p&gt;Buying more disks,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-547954960771608269?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=TsUU5yVx"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=RWtYc1Qy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=RWtYc1Qy" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=ZQcZv3Jj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=ZQcZv3Jj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=JqWH2GAc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=JqWH2GAc" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/7xaAc3wN0j0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/547954960771608269/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=547954960771608269" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/547954960771608269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/547954960771608269?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/7xaAc3wN0j0/big-fat-content-deployment-jobs.html" title="Big Fat Content Deployment Jobs" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/big-fat-content-deployment-jobs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYNQnc7fip7ImA9WxVSE0Q.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-3966412835675852105</id><published>2009-01-07T21:39:00.001-08:00</published><updated>2009-01-07T21:39:53.906-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-07T21:39:53.906-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>Don't Rule Out MS Support For Help</title><content type="html">&lt;h4&gt;Someone Call Redmond&lt;/h4&gt;  &lt;p&gt;SharePoint 2007 has been out for over two years now. Even though I'm a fan of the product, I'd be the last one to tell you that there haven't been glaring bugs with some of the more prominent features. The good news is that over time, hot fix by hot fix, these are slowly getting resolved.&lt;/p&gt;  &lt;p&gt;Depending on what you've been using SharePoint for, your mileage may have varied significantly. Until a couple days ago, all of the solutions and workarounds I'd ever applied to the product had come from forums, blogs, white papers, and books. Last week we ran into a problem that we&amp;#8217;d flailed at for long enough and decided to enlist the help of Microsoft Support. This is a recount of that experience.&lt;/p&gt;  &lt;h4&gt;Issues with Content Deployment&lt;/h4&gt;  &lt;p&gt;We were running MOSS 2007 SP1 and were having problems with incremental content deployments. We were considering deploying the SharePoint Infrastructure Update which supposedly addresses the issue. We were reluctant to deploy the updated because of the related downtime our farm would incur (this particular farm is public facing and gets tens of thousands of visitors a day). If possible we wanted to find another way.&lt;/p&gt;  &lt;p&gt;So we decided we&amp;#8217;d push the problem onto The Soft and let MS Support deal with it. $250 later, a support ticket was opened. Contrary to the complaints I&amp;#8217;d found online there was little to no wait, and within a couple business days someone from MS Support was calling me every morning asking me when we could start working on the ticket. &lt;/p&gt;  &lt;p&gt;Although it was probably a different story when the product first launched, it doesn&amp;#8217;t seem like there are Black Friday style wait lists for support these days. We also read &lt;a href="http://blogs.msdn.com/erica/archive/2007/05/31/ten-tips-for-getting-the-most-out-of-microsoft-pss-support-for-sharepoint.aspx"&gt;this post by Eric&lt;/a&gt; to help us properly characterize the problem for MS Support. It&amp;#8217;s of note that even though we provided a fair amount of detail in the opening emails, I ended up repeating the details back to the support agent anyways.&lt;/p&gt;  &lt;p&gt;The troubleshoot went surprisingly well. The support engineer was attentive to our concerns and very thorough in her diagnosis. Although she had a very distinct accent, she was on our time zone (PST) and had exceptional product knowledge. What&amp;#8217;s even better is they were willing to work around my extremely varied schedule and were relatively high touch. Someone from the support team phoned and emailed me at least every day, even if I forgot to return their emails. At times I felt like they wanted to fix our issues more than we did. All in all I&amp;#8217;d give the experience an 8/10 and recommend it to anyone who feels like they&amp;#8217;re grasping at straws. &lt;/p&gt;  &lt;p&gt;The money ($250) is relatively cheap compared to your time, and you&amp;#8217;ll get a chance to ask a ton of product related questions. What&amp;#8217;s even better is that if your problem ends up being fixed by a patch (hot fix/update/service pack) or is related to a product deficiency (you use a work around to resolve it) there&amp;#8217;s a strong chance that you&amp;#8217;ll be refunded the $250. Ultimately the decision is supposed to be up to the support engineer&amp;#8217;s manager. All this is from the mouth of a support engineer, so give it the same credence as you would most hearsay.&lt;/p&gt;  &lt;p&gt;I guess the point of all this is to not rule out MS Support when it comes to SharePoint issues. By all means exhaust your regular avenues first, but don&amp;#8217;t be afraid to ask for help from Microsoft Support when you start to feel all alone. The process requires a lot of patience, but depending on the problem it may be the cheapest way to fix the problem. Ideally having good support is one of the reasons your company decided to go with a well known vendor in the first place.&lt;/p&gt;  &lt;p&gt;One Less Problem,   &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-3966412835675852105?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=k7IjvYUU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=aL0vTzCS"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=aL0vTzCS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=T2BOj72a"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=T2BOj72a" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=hAmfvCme"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=hAmfvCme" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/3GnWTXWBzdo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/3966412835675852105/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=3966412835675852105" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/3966412835675852105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/3966412835675852105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/3GnWTXWBzdo/don-rule-out-ms-support-for-help.html" title="Don&amp;#39;t Rule Out MS Support For Help" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2009/01/don-rule-out-ms-support-for-help.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUFSXo7fyp7ImA9WxVTF00.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-8719102429424295787</id><published>2008-12-30T21:10:00.001-08:00</published><updated>2008-12-30T21:10:18.407-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-30T21:10:18.407-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Rants" /><title>Passion is Always Recession Proof</title><content type="html">&lt;h4&gt;A Good Recession?&lt;/h4&gt;  &lt;p&gt;A couple of weeks ago, in the midst of more economy doom and gloom, our CEO gave a company address speaking to the benefits of a recession. He then went on to make the point that recessions can actually be good for some companies.&lt;/p&gt;  &lt;p&gt;In short, recessions reward good management. Companies who've had the discipline to not overextended themselves financially, stay within their circle of expertise, and are passionate about what they do, are excellently positioned to prosper in a recession.&lt;/p&gt;  &lt;p&gt;As the competition starts to thicken and there are fewer customers to go around, mediocre companies inevitably fall apart or shrink substantially. Meanwhile great companies relish the opportunity to compete against their counterparts.&lt;/p&gt;  &lt;p&gt;A recession separates the pretenders from the contenders. Firms who have built strong relationships with their clients and continue to deliver exceptional value, often have little to fear from a recession. &lt;/p&gt;  &lt;p&gt;If anything, a recession helps good companies by weeding out all the chaff polluting the business space. So if a recession can help great companies, how about great developers?&lt;/p&gt;  &lt;h4&gt;For The Love = For The Win&lt;/h4&gt;  &lt;p&gt;Let's face it, a lot of IT personal (including developers) aren't exactly passionate about what they do. Somehow somewhere, a lackluster wave of hires stumbled into the IT workplace.&lt;/p&gt;  &lt;p&gt;Maybe it was during the dot com days when insane salaries were lobbed at anyone who could work a keyboard. Maybe a career advisor or two read an aptitude test upside down. Either way I'm sure at some point you've bumped into a programmer who isn't passionate about programming.&lt;/p&gt;  &lt;p&gt;Not that being apathetic towards your job is a sin per se, but it if you're not passionate about something, you'll never be exceptional at it. And if the most you're destined for is average, then both you &lt;em&gt;and your team &lt;/em&gt;will be having perpetual dates with mediocrity.&lt;/p&gt;  &lt;p&gt;People who are passionate about programming, would be doing it whether they're getting paid to or not. They're a lot more likely to be reading technical blogs, show up at user groups, and help a team grow deeper technically. And get this, they'll actually &lt;em&gt;enjoy &lt;/em&gt;doing it!&lt;/p&gt;  &lt;p&gt;So here's the good news about recessions for developers.&lt;/p&gt;  &lt;h4&gt;The Cull&lt;/h4&gt;  &lt;p&gt;Don't get it twisted, a lot of good people get let go during recessions. Huge swaths get cut through IT groups, and a lot of great staff ends up on the wrong side of the red line.&lt;/p&gt;  &lt;p&gt;But just like great companies, great developers don't have a hard time finding work. Their managers are more than happy to write them glowing letters of reference and refer them on to other firms that can make use of their skills. The same passion that has kept them up to speed with industry changes will help them shine during the interview process.&lt;/p&gt;  &lt;p&gt;It's not just good staff that gets laid off, bad hires also get let go too, and this helps development teams tremendously. Managers who once had the luxury of keeping bad hires are finally forced to take a hard look at their staff. The end result is often a more proficient and passionate team of developers.&lt;/p&gt;  &lt;p&gt;Hiring is also a lot more productive during a recession, not only are there more great candidates to choose from, but bad hires are a lot more likely to occur when there's too much work available, as oppose to when there's too little. The net result is that teams tend to get more competent as only good developers get filtered back in.&lt;/p&gt;  &lt;p&gt;Lastly, people who are simply stumbling around an industry are encouraged to take a moment to take a hard look at their current career path and decide if it's aligned with their strengths and interests. This isn't just good for the industry, it's essential for individuals to find something that they're truly passionate about and that they can find lasting success in. Keeping distracted people in an industry when their strengths really lie elsewhere not only erodes the craft, it steals valuable time from them that they could use to find something that they're exceptional at. Time they could otherwise ply at a trade more closely coupled to their natural strengths. When a bad hire is made, it's not only unfair to the company, it's wasteful of the employee's time. Recessions help hit the reset button.&lt;/p&gt;  &lt;h4&gt;Another Take&lt;/h4&gt;  &lt;p&gt;So depending on how optimistic you're feeling you could say that recessions are pretty good for you the developer. They help people find better jobs, stop bad hires, move people to industries where they can find real success, and reward those who truly belong in a space. Ideally it'll help improve your team, your company and your industry. If you're lucky you just might hit the trifecta.&lt;/p&gt;  &lt;p&gt;Just a thought,    &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-8719102429424295787?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=zoFybflf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=qC50VcJZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=qC50VcJZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=dgdSrk0n"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=dgdSrk0n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=2D96enPI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=2D96enPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/CZotkSlXQGQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/8719102429424295787/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=8719102429424295787" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/8719102429424295787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/8719102429424295787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/CZotkSlXQGQ/passion-is-always-recession-proof.html" title="Passion is Always Recession Proof" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/passion-is-always-recession-proof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GRH06fSp7ImA9WxVTEEw.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-8746309549510295271</id><published>2008-12-22T21:58:00.001-08:00</published><updated>2008-12-22T21:58:45.315-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-22T21:58:45.315-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Rants" /><title>Put Down That Ajax Control Toolkit!</title><content type="html">&lt;h4&gt;Out with the Old&lt;/h4&gt;  &lt;p&gt;Don&amp;#8217;t get me wrong, I like old things. Constructs like the abacus, scythes, and slide rules will always be remembered by those &lt;s&gt;un&lt;/s&gt;fortunate enough to have used them. But to continue using dated tools in today&amp;#8217;s ever changing environment is like running cavalry against a line of tanks. As you continue to post mortem projects you should also be auditing your tool belt. This post is about me retiring not only a single tool, but an entire toolkit.&lt;/p&gt;  &lt;h4&gt;The AJAX Control Toolkit&lt;/h4&gt;  &lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/ASP.NET_AJAX"&gt;AJAX Control Toolkit&lt;/a&gt; was released under such a name in January 23&lt;sup&gt;rd&lt;/sup&gt;, 2007, prior this namesake it was known as ATLAS. This toolkit is built on top of the AJAX Extensions and includes a series of controls to help ASP.NET developers take their user experience to the next level. The toolkit boasts many controls like animation extenders, better validators, modal windows, and widgets like accordions and drag panels. A lot of developers (including me) jumped at these controls and were all too happy to include the dependencies in their projects in exchange for the near free functionality. I should know, I was one of them.&lt;/p&gt;  &lt;p&gt;The problem with these controls isn&amp;#8217;t that they suck; the problem is that they&amp;#8217;re not the best. While Microsoft was developing these controls, other client side efforts were underway. You&amp;#8217;ve probably heard of these other libraries, some of them being jQuery, prototype, and mootools. I&amp;#8217;m personally ditching the toolkit in exchange for jQuery.&lt;/p&gt;  &lt;h4&gt;jQuery&lt;/h4&gt;  &lt;p&gt;If you haven&amp;#8217;t heard of &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; by now, I&amp;#8217;d kindly suggest that you get out more often. I personally think of jQuery as the Firefox of JavaScript libraries. A lot of jQuery&amp;#8217;s strengths come from a litany of professional grade plug-ins that have been contributed and then vetted by the jQuery community. It&amp;#8217;s this same community, large in number and energized by a passion for better UIs that makes jQuery such an impressive offering. This is truly a technology that has a bright roadmap.&lt;/p&gt;  &lt;p&gt;I decided to ditch the ACT (Ajax Control Toolkit) for jQuery for the following reasons:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Dependencies&lt;/b&gt;: The ACT has server side dependencies (both the System.Web.Extensions.dll and AjaxControlToolKit.dll need to be present), jQuery has no server side dependencies besides the emitted JavaScript. This same JavaScript is also smaller than that emitted by the ACT.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Controls&lt;/b&gt;: Most likely, in the time that it took you to read this blog post, another jQuery plug-in was submitted to the community. There are a &lt;i&gt;lot&lt;/i&gt; of talented JavaScript developers that are using this framework to make some truly impressive plug-ins. I urge you to check out the &lt;a href="http://plugins.jquery.com/"&gt;plug-ins page&lt;/a&gt;, it more than dwarfs the &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/"&gt;ACT offering&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Collaboration&lt;/b&gt;: Developers may make it functional, but designers make it usable, and sadly the latter almost always trumps the former. Designers need to be able to mock out UIs and style these controls. The more they get involved the less you have to do when it comes to presentation. For designers to develop style sheets, they often need to get access to the control.&lt;/p&gt;  &lt;p&gt;For the ACT this often means they need to be running Windows (which designers seldom do), install Visual Studio, and upgrade to either .NET v2.0 + System.Web.Extensions, or .NET v3.0 (sound tedious yet)? &lt;/p&gt;  &lt;p&gt;Or they could just work with &lt;a href="http://ui.jquery.com/"&gt;jQuery UI&lt;/a&gt;, a site that helps designers familiarize themselves with the markup and JavaScript needed to produce some great interfaces.&lt;/p&gt;  &lt;p&gt;The ACT doesn't offer natural middle ground between developers and designers; it also doesn&amp;#8217;t make for a shared ownership of the UI. Designers should be involved all the way through the project pipeline, not simply handing off a style sheet to a developer.&lt;/p&gt;  &lt;p&gt;Passing the style sheet to a developer who didn't create the layout and isn't responsible for it, is likely to fast track your web application to ugly ville. &lt;/p&gt;  &lt;p&gt;Worse yet, it&amp;#8217;s likely the developer will change the style sheet if s/he can&amp;#8217;t get markup to be emitted exactly like the designer was planning for (such is common when working with the ACT). This makes it increasingly awkward for the designer to maintain the style sheet as it moves to QA and then production. The ACT just isn't very designer friendly.&lt;/p&gt;  &lt;h4&gt;Don't Take My Word For It&lt;/h4&gt;  &lt;p&gt;Learning jQuery not only gives you access to a tonne of great controls; it starts you down the process of learning a DOM manipulation framework that is truly platform independent. If you&amp;#8217;re concerned about support from a big company, &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx"&gt;Microsoft recently decided&lt;/a&gt; to include jQuery with Visual Studio as of September 2008. Consider using jQuery in SharePoint to spruce up a dull UI, or to make ASP.NET MVC more palatable. I think it&amp;#8217;s time to get on the bus, this is one that you don&amp;#8217;t want to miss.&lt;/p&gt;  &lt;p&gt;Best,    &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-8746309549510295271?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=gqw0Mdw2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=dLwV4YxO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=dLwV4YxO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=vbZQMgC2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=vbZQMgC2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=aIA2uU3f"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=aIA2uU3f" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/In4T4BNb3Ss" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/8746309549510295271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=8746309549510295271" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/8746309549510295271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/8746309549510295271?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/In4T4BNb3Ss/put-down-that-ajax-control-toolkit.html" title="Put Down That Ajax Control Toolkit!" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/put-down-that-ajax-control-toolkit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ACRnsyeyp7ImA9WxRaFko.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-9157411785345065869</id><published>2008-12-19T00:32:00.001-08:00</published><updated>2008-12-19T00:36:07.593-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-19T00:36:07.593-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>Advanced Basics: What Causes a JIT?</title><content type="html">&lt;h4&gt;Kind Of A Black Box&lt;/h4&gt;  &lt;p&gt;For the longest time ASP.NET Just In Time compiling has always been a pretty gray matter for me. Word on the street has it, that some things you'll do against a web site cause the site to be re-JIT'd. Other actions will simply cause the application to unload. But which actions precipitate which results?&lt;/p&gt;  &lt;h4&gt;Just In Time Compiling&lt;/h4&gt;  &lt;p&gt;As you're probably aware, the code that you put in an ASP.NET web site isn't the actual code that runs. All those assemblies, web pages, user controls etc... all need to be &lt;a href="http://en.wikipedia.org/wiki/Just-in-time_compilation" target="_blank"&gt;Just In Time Compiled&lt;/a&gt; before they can actually be used. Visual Studio creates MSIL (Microsoft Intermediate Language) a &lt;em&gt;bytecode&lt;/em&gt; that is highly portable. Before you can run it a .NET runtime, it needs to be compiled again into &lt;em&gt;native code&lt;/em&gt;. Native code is specifically targeted to the machine it's going to be running on and is a lot more efficient. You can do this yourself (assuming you don't want your code to Just In Time compiled) by using either the &lt;a href="http://msdn.microsoft.com/en-us/library/bb398860.aspx" target="_blank"&gt;ASP.NET Precompilation&lt;/a&gt; tool or &lt;a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx" target="_blank"&gt;Ngen.exe&lt;/a&gt; (Native Image Generator) another tool that comes with the .NET SDK.&lt;/p&gt;  &lt;p&gt;All that's required for MSIL to be JIT'd is that the destination machine have a compiler that's capable of optimizing your MSIL for the given environment. A common example of this is when a developer builds an application on a 32-bit machine and then goes and deploys that MSIL on to some 64-bit machine. At runtime the MSIL will get natively compiled into 64-bit assemblies by a compiler that's sensitive to the needs of the destination 64-bit machine. &lt;/p&gt;  &lt;p&gt;The native compiler may also do things like (from &lt;a href="http://en.wikipedia.org/wiki/Just-in-time_compilation" target="_blank"&gt;Wikipedia&lt;/a&gt;):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Optimize to the targeted CPU and the operating system model where the application runs. For example JIT can choose &lt;a href="http://en.wikipedia.org/wiki/SSE2"&gt;SSE2&lt;/a&gt; CPU instructions when it detects that the CPU supports them. With a static compiler one must write two versions of the code, possibly using inline assemblies. &lt;/li&gt;    &lt;li&gt;The system is able to collect statistics about how the program is actually running in the environment it is in, and it can rearrange and recompile for optimum performance. However, some static compilers can also take profile information as input. &lt;/li&gt;    &lt;li&gt;The system can do global code optimizations (e.g. inlining of library functions) without losing the advantages of dynamic linking and without the overheads inherent to static compilers and linkers. Specifically, when doing global inline substitutions, a static compiler must insert run-time checks and ensure that a virtual call would occur if the actual class of the object overrides the inlined method. &lt;/li&gt;    &lt;li&gt;Although this is possible with statically compiled garbage collected languages, a bytecode system can more easily rearrange memory for better cache utilization. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That's pretty much the just of it. Just In Time compiling adds a lot of &lt;em&gt;flexibility&lt;/em&gt; to .NET development. Even though you've built a very generic application (can run anywhere with a CLR), what really get's run is a highly optimized version of that code that is targeted to the destination machine's architecture, operating system, etc...&lt;/p&gt;  &lt;h4&gt;How Does This Happen (in ASP.NET)&lt;/h4&gt;  &lt;p&gt;When you first visit a web application it needs to at least JIT the important stuff. JIT'ing starts with what's called top-level items. The following items are compiled first (pulled &lt;a href="http://msdn.microsoft.com/en-us/library/ms178473.aspx" target="_blank"&gt;from here&lt;/a&gt;).&amp;#160; &lt;/p&gt;  &lt;p&gt;   &lt;table class="wikitable"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;th&gt;           &lt;p&gt;Item &lt;/p&gt;         &lt;/th&gt;          &lt;th&gt;           &lt;p&gt;Description &lt;/p&gt;         &lt;/th&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;App_GlobalResources &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;The application's global resources are compiled and a resource assembly is built. Any assemblies in the application's Bin folder are linked to the resource assembly. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;App_WebResources &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;Proxy types for Web services are created and compiled. The resulting Web references assembly is linked to the resource assembly if it exists. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;Profile properties defined in the Web.config file &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;If profile properties are defined in the application's Web.config file, an assembly is generated that contains a profile object. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;App_Code &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;Source code files are built and one or more assemblies are created. All code assemblies and the profile assembly are linked to the resources and Web references assemblies if any. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;Global.asax &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;The application object is compiled and linked to all of the previously generated assemblies. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;After the application's top level items have been compiled, ASP.NET compiles folders, pages, and other items as needed. The following table describes the order in which ASP.NET folders and items are compiled.&lt;/p&gt;  &lt;p&gt;   &lt;table class="wikitable"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;th&gt;           &lt;p&gt;Item &lt;/p&gt;         &lt;/th&gt;          &lt;th&gt;           &lt;p&gt;Description &lt;/p&gt;         &lt;/th&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;App_LocalResources &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;If the folder containing the requested item contains an App_LocalResources folder, the contents of the local resources folder are compiled and linked to the global resources assembly. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;Individual Web pages (.aspx files), user controls (.ascx files), HTTP handlers (.ashx files), and HTTP modules (.asmx files) &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;Compiled as needed and linked to the local resources assembly and the top-level assemblies. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;Themes, master pages, other source files &lt;/p&gt;         &lt;/td&gt;          &lt;td&gt;           &lt;p&gt;Skin files for individual themes, master pages, and other source code files referenced by pages are compiled when the referencing page is compiled. &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;h4&gt;Conditions&lt;/h4&gt;  &lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/ms178473.aspx" target="_blank"&gt;following conditions&lt;/a&gt; will cause your application to be re-JIT'd. If you modify any of the top level items, any assemblies that reference the top level items will be recompiled as well.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adding, modifying, or deleting assemblies from the &lt;em&gt;application's Bin folder&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting localization resources from the &lt;em&gt;App_GlobalResources&lt;/em&gt; or &lt;em&gt;App_LocalResources&lt;/em&gt; folders. &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting the application's &lt;em&gt;Global.asax&lt;/em&gt; file. &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting source code files in the &lt;em&gt;App_Code&lt;/em&gt; directory. &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting &lt;em&gt;Profile configuration&lt;/em&gt; (in the web.config). &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting Web service references in the &lt;em&gt;App_WebReferences&lt;/em&gt; directory. &lt;/li&gt;    &lt;li&gt;Adding, modifying, or deleting the application's &lt;em&gt;Web.config&lt;/em&gt; file. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Whenever one of the above conditions is met the old application domain is &amp;quot;drain stopped&amp;quot;, which means that new requests are allowed to finish executing and once they're finished the Application Domain hosting those assemblies unloads. As soon as the recompile is finished a new Application Domain starts up with the new code and starts to handle all new requests.&lt;/p&gt;  &lt;h4&gt;Exodus&lt;/h4&gt;  &lt;p&gt;Believe it or not, having this kind of knowledge somewhere on hand will actually help you when you need it the most...when you're troubleshooting. This kind of stuff doesn't need to be kept at the tip of your tongue, but it should be at least semi-salvageable from the recesses of memory. The worst kind of trouble is the kind that doesn't make any sense. Having sophisticated tools that do a lot of leg work for you can also put bullet holes in your feet if you haven't read the instruction manual.&lt;/p&gt;  &lt;p&gt;Hope that provided some value. I swear this stuff comes up more than you'd think.&lt;/p&gt;  &lt;p&gt;Best,    &lt;br /&gt;Tyler&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-9157411785345065869?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=tkOzpsU7"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=kkAUFY8M"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=kkAUFY8M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=9owQOuuK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=9owQOuuK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=unFdtNYZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=unFdtNYZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/vzGtFHh9YRI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/9157411785345065869/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=9157411785345065869" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/9157411785345065869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/9157411785345065869?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/vzGtFHh9YRI/advanced-basics-what-causes-jit.html" title="Advanced Basics: What Causes a JIT?" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/advanced-basics-what-causes-jit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMNRnY9eyp7ImA9WxRaE0o.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-6594916995554735985</id><published>2008-12-13T14:33:00.001-08:00</published><updated>2008-12-15T12:21:37.863-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-15T12:21:37.863-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>Application Domains Revisited</title><content type="html">&lt;h4&gt;I Should Know This&lt;/h4&gt; &lt;p&gt;There's a lot of things I've taken the time to learn formally (ie. go to school, take a cert) which escape me when they would actually come in handy. In fact it becomes even more frustrating when we end up figuring out what happened...and it's something I already (should) know.&lt;/p&gt;  &lt;p&gt;This once again became wildly apparent this week while I was troubleshooting some random web app. As it turns out, poor memory is the gift that keeps on giving, and my own memory is definitely feeling the festive nature of the holidays. In a very small nutshell, I forgot the following.&lt;/p&gt;  &lt;p&gt;Every application you set up in a web site (including the root application) ends up being in its own application domain. It'll have its own set of assemblies, get JIT'd independently, and of course be completely isolated from the the contents of other application domains (Session, Statics, Cache, etc... won't be shared.).&lt;/p&gt;  &lt;h4&gt;Refresher&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;Process&lt;/strong&gt;: Contains the code and data of a program. Also contains at least one thread. Represents a &lt;em&gt;boundary&lt;/em&gt; that stops it from wreaking havoc on other processes and requires special techniques to communicate across. Runs in a security context which dictates what it can and can't do. If it's running some .NET code then it contains one or more &lt;strong&gt;application domains&lt;/strong&gt;.&lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/SUQ4HJjhAgI/AAAAAAAAA38/Z7AZCG99EpY/s1600-h/Process%5B3%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="Process" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SUQ4H-WHOTI/AAAAAAAAA4A/GPTg7t1eA00/Process_thumb%5B1%5D.gif?imgmax=800" width="469" border="0" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;An example of a process might be &lt;strong&gt;notepad.exe,&lt;/strong&gt; or if we're talking about IIS &lt;strong&gt;aspnet_wp.exe&lt;/strong&gt; (Win XP, Win 2000) or &lt;strong&gt;w3wp.exe&lt;/strong&gt; (Windows 2003).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Application Domain&lt;/strong&gt;: &lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/SUQ4IKsBzkI/AAAAAAAAA4E/5fd2hsyYwbY/s1600-h/ApplicationDomains%5B3%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="ApplicationDomains" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SUQ4It-o5ZI/AAAAAAAAA4I/rQungR5ePK8/ApplicationDomains_thumb%5B1%5D.gif?imgmax=800" width="217" align="right" border="0" height="165" /&gt;&lt;/a&gt;Are more efficient than processes. One process can load the .NET framework once and host &lt;em&gt;many&lt;/em&gt; application domains. Each app domain might load its own assemblies (or even it's own child application domains), but will not have to reload the overhead of the .NET framework. Since each application domain runs within the .NET framework, it benefits from the features there of (things like Code Access Security, Managed Memory, JIT Compiling, etc...).&lt;/p&gt;  &lt;p&gt;Application Domains also represent a &lt;em&gt;boundary &lt;/em&gt;that you'll need special techniques to communicate across. Since more than one can be hosted in an process, it's common for the .NET Framework to load up and unload application domains at runtime. This is what happens when you recycle an &lt;strong&gt;IIS Application Pool&lt;/strong&gt;, the application domains within it are unloaded and new app domains are created to service new requests.&lt;/p&gt;  &lt;p&gt;In ASP.NET an Application Domain is created for every virtual directory that you configure and as application in IIS. Each can have it's own bin folder, web.config and &lt;strong&gt;IIS Application Pool&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;It's worth mentioning that even though there's Application Domain boundary separation between applications, they can still inherit web.config settings from each other (if one is in a parent folder).&lt;/p&gt;&lt;p&gt;A high level view of Processes, the .NET Runtime, Application Domains, and the assemblies they in turn load might look like the following picture.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x_KlQTLtnfI/SUa8HqdX_GI/AAAAAAAAA4c/NZBPBwSpoFw/s1600-h/ApplicationDomain.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 165px;" src="http://2.bp.blogspot.com/_x_KlQTLtnfI/SUa8HqdX_GI/AAAAAAAAA4c/NZBPBwSpoFw/s320/ApplicationDomain.png" alt="" id="BLOGGER_PHOTO_ID_5280114452981087330" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Application Pools (IIS 6 and above)&lt;/strong&gt;: &lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SUQ4Iy1gWxI/AAAAAAAAA4M/XOn4LaaGNn4/s1600-h/2008.12.13%2014.08.36%5B3%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="2008.12.13 14.08.36" src="http://lh6.ggpht.com/_x_KlQTLtnfI/SUQ4JDBh_7I/AAAAAAAAA4Q/-OJyVOjipj8/2008.12.13%2014.08.36_thumb%5B1%5D.gif?imgmax=800" width="211" align="right" border="0" height="133" /&gt;&lt;/a&gt; Host one or more &lt;em&gt;applications&lt;/em&gt; (&lt;strong&gt;Application Domains&lt;/strong&gt; if we're talking about .NET code). If an application pool is running in worker process isolation mode, it can also spread those applications over one or more &lt;strong&gt;processes&lt;/strong&gt; (&lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/659f2e2c-a58b-4770-833b-df96cabe569e.mspx?mfr=true" target="_blank"&gt;a web garden&lt;/a&gt;)! They allow you a great deal of flexibility when it comes to deciding how much isolation you want to give your applications. You can use application pools to provide process level isolation for each application (each application can have its own w3wp.exe [or more if you web garden]). Application Pools can also combine multiple applications in a single application pool (saves resources).&lt;/p&gt;  &lt;p&gt;Below, an application pool (".NET v2.0") spreading it's work over &lt;strong&gt;multiple processes&lt;/strong&gt;.&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SUQ4JMl7T_I/AAAAAAAAA4U/cOlrCz3GQxk/s1600-h/2008.12.13%2013.45.14%5B3%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="2008.12.13 13.45.14" src="http://lh3.ggpht.com/_x_KlQTLtnfI/SUQ4Jaq9irI/AAAAAAAAA4Y/gHK8I8lkI-M/2008.12.13%2013.45.14_thumb%5B1%5D.gif?imgmax=800" width="475" border="0" height="147" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;And We're Back&lt;/h4&gt;  &lt;p&gt;Every now and then I get a little scared of the complexity that will be in development environments 20 years from now. Yes, the stuff being written will be extremely cool, and the tools that get used will no doubt be just as impressive. That being said, there will be a &lt;em&gt;a lot&lt;/em&gt; of complexity in play in the future and a tonne to be aware of. &lt;/p&gt;  &lt;p&gt;With .NET v4.0 in the works, a lot of focus seems to be on parallel computing (ie. PLINQ) I can't imagine the computing world is about to get much simpler.&lt;/p&gt;  &lt;p&gt;Keep your seat belt on.&lt;/p&gt;  &lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-6594916995554735985?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=4S7vXL4P"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=thsVUjkF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=thsVUjkF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=z7Ou2Tsx"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=z7Ou2Tsx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=qRw59vRc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=qRw59vRc" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/cK7dKbfsvBE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/6594916995554735985/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=6594916995554735985" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6594916995554735985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/6594916995554735985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/cK7dKbfsvBE/application-domains-revisited.html" title="Application Domains Revisited" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_x_KlQTLtnfI/SUa8HqdX_GI/AAAAAAAAA4c/NZBPBwSpoFw/s72-c/ApplicationDomain.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/application-domains-revisited.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBSHc6fSp7ImA9WxJWEUw.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-1676675336825368979</id><published>2008-12-07T15:35:00.000-08:00</published><updated>2009-06-15T18:09:19.915-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T18:09:19.915-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Learning" /><title>The SharePoint Certification Gauntlet</title><content type="html">&lt;h4&gt;Finish Line&lt;/h4&gt;  &lt;p&gt;This week I finally finished the last of the SharePoint certifications. They include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MCTS: 70-542 (MOSS Application Development) &lt;/li&gt;    &lt;li&gt;MCTS: 70-541 (WSS Application Development) &lt;/li&gt;    &lt;li&gt;MCTS: 70-630 (MOSS Configuration) &lt;/li&gt;    &lt;li&gt;MCTS: 70-631 (WSS Configuration) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Doing all four in a single year was a little more time consuming than I thought it would be, and I'm glad it's finally over.&lt;/p&gt;  &lt;h4&gt;The Value&lt;/h4&gt;  &lt;p&gt;While certifications themselves don't really get you deep in a subject matter (at least not that I've noticed), they do give you a really good idea of the surface area. At that point you're in a good position to explore the topics on you own and get deep in a few.&lt;/p&gt;  &lt;p&gt;Here's a more concrete example. A cert in ASP.NET won't get you deep in HTTPModules, but it will tell you what they are, and what you might use them for. The next time you hit a problem that involves say URL Rewriting, you've still got some learning to do, but you're a lot less likely to leave the reservation completely and come up with something home brewed and semi exotic.&lt;/p&gt;  &lt;p&gt;To me that's one of the biggest values of certifications, they try to clearly define the scope of the technology. After a cert you should at least &lt;em&gt;know what you don't know&lt;/em&gt; about some tech stack. At that point you're a lot less likely to write a bunch of code to solve a problem that your tech stack is naturally geared towards solving.&lt;/p&gt;  &lt;h4&gt;Rounding The Edges&lt;/h4&gt;  &lt;p&gt;Of course each of the four SharePoint exams have a slightly different focus. It's also worth mentioning that two of them don't really have anything to do with writing code, they're all about &lt;em&gt;configuration&lt;/em&gt;. I thought these were important because of SharePoint's farm footprint. The platform is a lot more than a single web server/database. It's really a series of services working together on many different machines. When all these services act in concert, the resulting ballet provides a pretty decent platform for collaboration.&lt;/p&gt;  &lt;p&gt;Because there's so much in play (and so much complexity), it seemed just as important to me to learn the infrastructure nuts and bolts as it was to learn the various APIs.&lt;/p&gt;  &lt;p&gt;This sentiment was recently corroborated by the &lt;a href="http://andrewconnell.com/blog/archive/2008/11/20/Microsoft-Certification-Master-for-SharePoint--My-Involvement-in-Helping.aspx"&gt;SharePoint Master&lt;/a&gt; program. The program involves the same four certifications. I'm pretty sure the content authors of the program are on the same page, that you can't be a "SharePoint Master" unless you have a holistic knowledge of both infrastructure and application development.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Go For It&lt;/h4&gt;  &lt;p&gt;For those wondering how to go about getting a certification I would encourage them to do so. The experience alone will tell you if you feel it was worth its salt. The typical certification route looks like this.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Find a technology&lt;/strong&gt; that interests you and a certification path on the &lt;a href="http://www.microsoft.com/learning/mcp/default.mspx"&gt;Microsoft Learning web site&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Read the about the test requirements&lt;/strong&gt;. This may involve one or more exams that each have a preparation guide. Be sure to follow the preparation guide.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Study up&lt;/strong&gt;. This might involve some online learning, some books or just spending a lot of time on the MSDN.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Take a Practice Test&lt;/strong&gt;. Real exams cost $125 and a couple hours of your time. It's doubtful you'd want to want to write the real exam more than once. Most exams require at least 70% as a passing grade, I've written exams that required as much as 80% to pass. Make sure you're ready before you schedule an exam. You can often find free practice exams online, failing that just pay the $70 to a practice test provider (&lt;a href="http://www.measureup.com/"&gt;MeasureUp&lt;/a&gt;, &lt;a href="http://www.transcender.com/default.aspx"&gt;Transcender&lt;/a&gt;, &lt;a href="http://www.testking.com/"&gt;TestKing&lt;/a&gt;, etc...). The idea is to make sure you're ready before scheduling the real exam.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Schedule an exam&lt;/strong&gt;. For Microsoft exams you'll most likely end up going through &lt;a href="http://www.prometric.com/default.htm"&gt;Prometric&lt;/a&gt; or &lt;a href="http://www.vue.com/"&gt;Pearson Vue&lt;/a&gt;. Their web site will book you an appointment with a testing provider (most often some IT college or learning center). Exams cost $125 USD and usually need to be scheduled at least 48 hours prior to writing.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Show up and ace the exam&lt;/strong&gt;!&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Everyone learns at a different pace, but expect to spend at least fifteen hours going over material and practice exams for your first certification. After writing a couple exams you'll notice your preparation start to decrease as you start to streamline the process.&lt;/p&gt;  &lt;p&gt;After finishing a certification you'll be given an MCP ID (if you don't already have one), a welcome kit, a certificate, and use of a certification logo (below) for business cards and such. I don't personally make use of the last two, but they may help demonstrate to your boss that your passionate about technology, or convince women you're able to commit to something.&lt;/p&gt;  &lt;p&gt;Remember that certs are just a part of your learning continuum, supplement them where need be. They're nice to have, but by no means the finish line.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/STxd5HN8odI/AAAAAAAAA3c/bc1LprcwpRE/s1600-h/70542MOSSDev13.png"&gt;&lt;img style="border-width: 0px;" alt="70-542 (MOSS Dev)" src="http://lh5.ggpht.com/_x_KlQTLtnfI/STxd5QeX87I/AAAAAAAAA3g/yTpwY4zvTYA/70542MOSSDev_thumb5.png?imgmax=800" border="0" height="100" width="367" /&gt;&lt;/a&gt;  &lt;a href="http://lh3.ggpht.com/_x_KlQTLtnfI/STxd53KX8-I/AAAAAAAAA3k/gqidd7uPhSw/s1600-h/70630MOSSConfig16.png"&gt;&lt;img style="border-width: 0px;" alt="70-630 (MOSS Config)" src="http://lh5.ggpht.com/_x_KlQTLtnfI/STxd6EbgGZI/AAAAAAAAA3o/QCWkWRMAhOY/70630MOSSConfig_thumb8.png?imgmax=800" border="0" height="100" width="369" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/STxd6cAaYqI/AAAAAAAAA3s/fVob1p5imuE/s1600-h/70631WSSConfig13.png"&gt;&lt;img style="border-width: 0px;" alt="70-631 (WSS Config)" src="http://lh3.ggpht.com/_x_KlQTLtnfI/STxd6n9YbDI/AAAAAAAAA3w/la17VAwdTKw/70631WSSConfig_thumb5.png?imgmax=800" border="0" height="100" width="385" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/STxd7GJh20I/AAAAAAAAA30/MfY24jQud6Q/s1600-h/70541WSSAppDev13.png"&gt;&lt;img style="border-width: 0px;" alt="70-541 (WSS App Dev)" src="http://lh6.ggpht.com/_x_KlQTLtnfI/STxd7m7zJMI/AAAAAAAAA34/4NOKwWQvL7k/70541WSSAppDev_thumb5.png?imgmax=800" border="0" height="100" width="388" /&gt;&lt;/a&gt;  &lt;/p&gt;  &lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-1676675336825368979?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=deq9RlQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=vRXz3QHj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=vRXz3QHj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=kV1jFFNC"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=kV1jFFNC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=29RuOAKG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=29RuOAKG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/sSpFRROtPBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/1676675336825368979/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=1676675336825368979" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1676675336825368979?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1676675336825368979?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/sSpFRROtPBw/sharepoint-certification-gauntlet.html" title="The SharePoint Certification Gauntlet" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2007/12/sharepoint-certification-gauntlet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACRXk4cCp7ImA9WxRbEks.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-2877356155430266639</id><published>2008-12-02T17:41:00.000-08:00</published><updated>2008-12-02T17:46:04.738-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-02T17:46:04.738-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Utilities" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="Weird Errors" /><title>Windows XP Unzip Errors With SharpZipLib</title><content type="html">&lt;h4&gt;Great Utility&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://sharpdevelop.net/OpenSource/SharpZipLib/Default.aspx" target="_blank"&gt;SharpZipLib&lt;/a&gt; is a great little library that helps you programmatically compress/decompress zip archives. If your needs aren't too exotic (ie. you need to programmatically zip/unzip a series of files/folders) this could very well be your ticket.&lt;/p&gt;  &lt;p&gt;You've probably heard of it before (it's been around for quite a while), some sample usage might look like this (compresses a file).&lt;/p&gt;  &lt;pre class="prettyprint" style="overflow: auto;"&gt;using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipFilePath)))&lt;br /&gt;{&lt;br /&gt; //Compression level 0-9 (9 is highest)&lt;br /&gt; zipStream.SetLevel(GetCompressionLevel());&lt;br /&gt;&lt;br /&gt; //Add an entry to our zip file&lt;br /&gt; ZipEntry entry = new ZipEntry(Path.GetFileName(sourceFilePath));&lt;br /&gt; entry.DateTime = DateTime.Now;&lt;br /&gt; zipStream.PutNextEntry(entry);&lt;br /&gt;&lt;br /&gt; byte[] buffer = new byte[4096];&lt;br /&gt; int byteCount = 0;&lt;br /&gt;&lt;br /&gt; using (FileStream inputStream = File.OpenRead(sourceFilePath))&lt;br /&gt; {&lt;br /&gt;     byteCount = inputStream.Read(buffer, 0, buffer.Length);&lt;br /&gt;     while (byteCount &amp;gt; 0)&lt;br /&gt;     {&lt;br /&gt;         zipStream.Write(buffer, 0, byteCount);&lt;br /&gt;         byteCount = inputStream.Read(buffer, 0, buffer.Length);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;This is pretty normal usage. It adds a zip entry to an archive and creates said archive. What might confuse you though is the error you'll get if you try to to unpack the archive using a legacy unzip tool (ie. the stock Windows XP decompression tool).&lt;/p&gt;&lt;p&gt;The stock Windows XP extraction tool won't be able to unpack the archive and will complain about the archive being "invalid or corrupted" if you try to extract the archive contents.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/STXj5Tnlu-I/AAAAAAAAA3U/ahiDVjonY4g/s1600-h/2008.12.01%2017.25.52%5B5%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="The Compressed (zipped) Folder is invalid or corrupted." src="http://lh5.ggpht.com/_x_KlQTLtnfI/STXj57OUEOI/AAAAAAAAA3Y/rBsIzo7WY1o/2008.12.01%2017.25.52_thumb%5B3%5D.gif?imgmax=800" width="342" border="0" height="120" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;Zip64 Extensions&lt;/h4&gt;&lt;p&gt;What's happening here is that the utility is enabling Zip64 extensions for the archive, and some older utilities can't read Zip64 Extensions. You could simply turn off Zip64 Extensions, but this will cause problems when you start adding files larger than 4GB to your archive. &lt;/p&gt;&lt;p&gt;A better solution is to make a mild tweak to the way we add files to the archive. By specifying the size of the file we're adding, the ZipOutputStream can decide whether or not to use the Zip64 extensions. If we don't need them then they'll be turned off automatically. The mild tweak below fixes the error from the above code:&lt;/p&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;...&lt;br /&gt;ZipEntry entry = new ZipEntry(Path.GetFileName(sourceFilePath));&lt;br /&gt;entry.DateTime = DateTime.Now;&lt;br /&gt;/* By specifying a size, SharpZipLib will turn on/off UseZip64 based on the file sizes. If Zip64 is ON&lt;br /&gt;* some legacy zip utilities (ie. Windows XP) who can't read Zip64 will be unable to unpack the archive.&lt;br /&gt;* If Zip64 is OFF, zip archives will be unable to support files larger than 4GB. */&lt;br /&gt;&lt;strong&gt;entry.Size = new FileInfo(sourceFilePath).Length;&lt;/strong&gt;&lt;br /&gt;zipStream.PutNextEntry(entry);&lt;br /&gt;...&lt;/pre&gt;&lt;p&gt;Hope that helps someone. That error drove me crazy for a while and I didn't find much via Google.&lt;/p&gt;&lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-2877356155430266639?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=IVeIN1qF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=cDOATI57"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=cDOATI57" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=brFkgI1J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=brFkgI1J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=RCLw0Rl3"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=RCLw0Rl3" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/cATbcnq71ag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/2877356155430266639/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=2877356155430266639" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/2877356155430266639?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/2877356155430266639?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/cATbcnq71ag/windows-xp-unzip-errors-with.html" title="Windows XP Unzip Errors With SharpZipLib" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/windows-xp-unzip-errors-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MMQ3g5eCp7ImA9WxRbEUk.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-294500609400735560</id><published>2008-12-01T08:34:00.001-08:00</published><updated>2008-12-01T08:38:02.620-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-01T08:38:02.620-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Rants" /><title>Does SharePoint Lend To High Availability?</title><content type="html">&lt;style type="text/css"&gt;/* wikitable/prettytable class for skinning normal tables */table.wikitable,table.prettytable {    margin: 1em 1em 1em 0;    background: #f9f9f9;    border: 1px #aaa solid;    border-collapse: collapse;}.wikitable th, .wikitable td,.prettytable th, .prettytable td {    border: 1px #aaa solid;    padding: 0.2em;}.wikitable th,.prettytable th {    background: #f2f2f2;    text-align: center;}.wikitable caption,.prettytable caption {    margin-left: inherit;    margin-right: inherit;    font-weight: bold;}&lt;/style&gt;  &lt;h4&gt;All This Hardware And No Uptime&lt;/h4&gt;  &lt;p&gt;SharePoint is pretty heavy. I often think of it as an 800 pound gorilla who stopped exercising and let itself slide. To handle all the services that run within a farm and provide decent response time to users, a reasonable amount of hardware usually gets provisioned to pick up the slack.&lt;/p&gt;  &lt;p&gt;I'm talking about real iron here. Large farms featuring clustered SQL Servers, redundant application servers, and a series of web front ends balanced with either a &lt;a href="http://en.wikipedia.org/wiki/Load_balancing_%28computing%29"&gt;network load balancer&lt;/a&gt; or a &lt;a href="http://en.wikipedia.org/wiki/Network_Load_Balancing_Services"&gt;Microsoft NLB cluster&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;One might look at all this gear and think that as a result, the farm is almost guaranteed to enjoy some pretty high availability right? Well I guess that depends on what you call high availability.&lt;/p&gt;  &lt;h4&gt;A Desire for High Availability&lt;/h4&gt;  &lt;p&gt;   &lt;table class="wikitable" style="float: right;"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;th&gt;\&lt;/th&gt;          &lt;th colspan="3"&gt;Total downtime (HH:MM:SS)&lt;/th&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;th&gt;Availability&lt;/th&gt;          &lt;th&gt;per day&lt;/th&gt;          &lt;th&gt;per month&lt;/th&gt;          &lt;th&gt;per year&lt;/th&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;th&gt;99.999%&lt;/th&gt;          &lt;td&gt;00:00:00.4&lt;/td&gt;          &lt;td&gt;00:00:26&lt;/td&gt;          &lt;td&gt;00:05:15&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;th&gt;99.99%&lt;/th&gt;          &lt;td&gt;00:00:08&lt;/td&gt;          &lt;td&gt;00:04:22&lt;/td&gt;          &lt;td&gt;00:52:35&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;th&gt;99.9%&lt;/th&gt;          &lt;td&gt;00:01:26&lt;/td&gt;          &lt;td&gt;00:43:49&lt;/td&gt;          &lt;td&gt;08:45:56&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;th&gt;99%&lt;/th&gt;          &lt;td&gt;00:14:23&lt;/td&gt;          &lt;td&gt;07:18:17&lt;/td&gt;          &lt;td&gt;87:39:29&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; For clients that are running SharePoint internally, uptime is probably important but not a huge priority. Clients that use SharePoint for internet facing applications are another matter. These users are far more likely to use SharePoint to buttress e-commerce offerings or brand efforts. These businesses usually want high availability and may even ask for &lt;a href="http://en.wikipedia.org/wiki/Uptime"&gt;four to five nines&lt;/a&gt; of uptime (99.99%-99.999% uptime). Five nines (sometimes called the holy grail of uptime), equates to being down no more than 5 minutes 15 seconds a year. It's a bold proposition and requires a great deal of planning and forethought. Still, if it's doable, all this hardware should set you in the right direction right?&lt;/p&gt;  &lt;h4&gt;Heavy Patches, And Lots of Them&lt;/h4&gt;  &lt;p&gt;The biggest hurdle I've had with providing high availability to clients with SharePoint has come from the patching procedures issued from Microsoft. Normally when updating applications/machines it's possible to update one machine at a time, using your load balancer to shelter this machine from production. Once the machine has has been updated you can bring it back into production and start updating one of it's siblings. With SharePoint this process gets a little more complicated. Here are a couple of the reasons:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There's no uninstall/rollback for most SharePoint updates (your best bet for uninstall is a machine level backup). &lt;/li&gt;    &lt;li&gt;The &lt;a href="http://technet.microsoft.com/en-us/library/cc288269.aspx"&gt;recommended install procedure&lt;/a&gt; dictates that you stop all IIS instances for Web Front Ends. This makes it difficult to continue to provide service or at the very least hold up a stall/maintenance page. &lt;/li&gt;    &lt;li&gt;The &lt;a href="http://technet.microsoft.com/en-us/library/cc288269.aspx"&gt;recommended install procedure&lt;/a&gt; asks that you upgrade all machines on the farm at the same time. &lt;/li&gt;    &lt;li&gt;There's usually at least one machine in the farm that rejects the upgrade and needs to be troubleshot individually. For me these have often resulted in removing the machine from the farm, upgrading it, and then adding it back to the farm. This usually adds to server downtime, especially if the server was serving a key role (ie: SSP host or the machine that hosts the Central Administration web site). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Assuming you manage to make it through all the above without a lot of downtime, how many times a year do you think you might be able to do it and still maintain a reasonable &lt;a href="http://en.wikipedia.org/wiki/Service_level_agreement"&gt;downtime SLA&lt;/a&gt;? Before you answer that, consider all the updates that have come down the pipe for WSS since it's RTM (it's SharePoint &lt;strong&gt;&lt;em&gt;2007&lt;/em&gt;&lt;/strong&gt; remember). This is also just a list of updates for WSS, there's a whole other table for MOSS (although most of the dates and versions coincide).&lt;/p&gt;  &lt;table class="wikitable"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Update Name&lt;/th&gt;        &lt;th&gt;Version (owssrv.dll)&lt;/th&gt;        &lt;th&gt;Date&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Windows SharePoint Services v3.0&lt;/td&gt;        &lt;td&gt;12.0.4518.1016 (RTM)&lt;/td&gt;        &lt;td&gt;November 2006&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/10/09/important-security-hotfix-ms07-059.aspx"&gt;October public update (2007)&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6039.5000&lt;/td&gt;        &lt;td&gt;October 2007&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://support.microsoft.com/kb/936988"&gt;Service Pack 1&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6219.1000&lt;/td&gt;        &lt;td&gt;December 2007&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://support.microsoft.com/kb/941422"&gt;Post-Service Pack 1 rollup&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6300.5000&lt;/td&gt;        &lt;td&gt;March 2008&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://support.microsoft.com/kb/951695"&gt;Infrastructure Update&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6320.5000&lt;/td&gt;        &lt;td&gt;July 2008&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://support.microsoft.com/kb/956057"&gt;August Cumulative Update&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6327.5000&lt;/td&gt;        &lt;td&gt;August 2008&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a href="http://support.microsoft.com/kb/957691"&gt;October Cumulative Update&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;12.0.6331.5000&lt;/td&gt;        &lt;td&gt;October 2008&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Don't get me wrong, updates are good. In fact, I like it when Microsoft fixes things, especially when the clients who have purchased MOSS have already paid potentially millions in licensing fees. I just wished these updates which happen many times a year AND provide critical fixes to expected functionality had better upgrade strategies. &lt;/p&gt;  &lt;p&gt;Do SharePoint updates and the way in which SharePoint farms are upgraded make &lt;strong&gt;high availability a pipe dream?&lt;/strong&gt; Does all that hardware do nothing except help the farm scale out?&lt;/p&gt;  &lt;h4&gt;A Little Transparency&lt;/h4&gt;  &lt;p&gt;In fact all I'm really looking for from these updates is a little transparency. I'd be thrilled if I could get a little more detail as to what's going on underneath the hood and what to do when the error log starts filling up. &lt;/p&gt;  &lt;p&gt;I've yet to see a really good troubleshooting strategy or even deployment strategy that gives you good odds of limiting downtime when it comes time to roll out these upgrades. &lt;/p&gt;  &lt;p&gt;We have a ticket open with MS support to take up this issue. The wait for SharePoint related issues is still pretty long, but rest assured should I come up with one or find a good resource for these kinds of rollouts you'll know where you'll find it.&lt;/p&gt;  &lt;p&gt;Best,   &lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-294500609400735560?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=JA8KeuZ4"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=DKc4BD3F"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=DKc4BD3F" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=p4c5C5jP"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=p4c5C5jP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=bd4NdPKF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=bd4NdPKF" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/gTgA-vDhj5I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/294500609400735560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=294500609400735560" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/294500609400735560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/294500609400735560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/gTgA-vDhj5I/does-sharepoint-lend-to-high.html" title="Does SharePoint Lend To High Availability?" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/12/does-sharepoint-lend-to-high.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUACRXs9eSp7ImA9WxRUFkU.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-1943156682439351706</id><published>2008-11-25T23:07:00.001-08:00</published><updated>2008-11-25T23:16:04.561-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-25T23:16:04.561-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Virtualization" /><title>Effortless Hot Cloning with VMWare Converter</title><content type="html">&lt;h4&gt;Pulling Teeth&lt;/h4&gt;  &lt;p&gt;It's an exceedingly common scenario these days to want to make a virtual machine out of some physical machine. In fact when it comes to reproducing an environment I can't think of a more thorough way (especially when there's multiple machines involved).&lt;/p&gt;  &lt;p&gt;This often leaves someone tasked with finding a powerful, affordable, and flexible physical to virtual conversion utility. Now finding a P2V solution isn't really a challenging problem, but finding one that's easy to use is.&lt;/p&gt;  &lt;p&gt;I would encourage anyone who's ever been frustrated with the P2V tools on the .VHD (Microsoft Virtual Server, Virtual PC) side to consider making a .VMDX instead (VMWare Workstation, Server, Fusion).&lt;/p&gt;  &lt;h4&gt;Novocain &lt;/h4&gt;  &lt;p&gt;The &lt;a href="http://www.vmware.com/support/converter/doc/releasenotes_conv3.html"&gt;VMWare Converter&lt;/a&gt; is free, effortless to use, and makes hot clones (in addition to cold ones) with the same ease that &lt;a href="http://en.wikipedia.org/wiki/Johnnie_Cochran"&gt;Johnnie Cochran&lt;/a&gt; acquits his clients. With a  hot clone you don't even need to shut down the OS or stop any services! You can perform a P2V transformation and experience zero down time...all for free (if you call being bound to a VM Ware product free). This utility is so handy it just may be the help you need to help you make a better vendor choice when it comes to virtualization...&lt;/p&gt;  &lt;p&gt;Just walk through a wizard, click hit a few radio buttons, and you'll be creating a hot clone in no time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_x_KlQTLtnfI/SSz1m7YJSaI/AAAAAAAAA3M/tUT1pF58PQg/s1600-h/2008-11-25%2020.59.14%5B3%5D.gif"&gt;&lt;img style="border-width: 0px;" alt="Screenshot of the VMWare Converter Import Wizard" src="http://lh4.ggpht.com/_x_KlQTLtnfI/SSz1nWCqQhI/AAAAAAAAA3Q/h-TwinD1jCI/2008-11-25%2020.59.14_thumb%5B1%5D.gif?imgmax=800" border="0" height="243" width="490" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Details&lt;/h4&gt;  &lt;p&gt;The VMWare converter will run on the following OS's:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows XP Professional &lt;/li&gt;    &lt;li&gt;Windows 2003 Server &lt;/li&gt;    &lt;li&gt;Windows 2000 Professional &lt;/li&gt;    &lt;li&gt;Windows 2000 Server &lt;/li&gt;    &lt;li&gt;Windows NT SP4+ (IE5 or higher required) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You're likely to get a much smoother ride with Windows XP and Windows 2003 as they both make use of the &lt;a href="http://en.wikipedia.org/wiki/Shadow_Copy"&gt;Volume Shadow Copy&lt;/a&gt; service, but supposedly you can make hot clones with the other OS's as well (I've only made hot clones on Windows XP and Windows 2003).&lt;/p&gt;  &lt;p&gt;Like any task that could go horribly wrong, there's a couple of things &lt;a href="http://searchvmware.techtarget.com/tip/0,289483,sid179_gci1304484,00.html#"&gt;you should check&lt;/a&gt; before selling yourself on hot clones, or at least placing any bets.&lt;/p&gt;  &lt;p&gt;Don't just take my word for it, try the utility on some machine you don't like and create a clone (hot or cold). When you're done, just be sure post a YouTube video of you Office Space'ing the machine just like these guys did.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c12d73c7-22a3-45d8-92ab-d79ec5962688" style="margin: 0px; padding: 0px 0px 0px 30px; display: inline;"&gt;&lt;div&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gujp3PxkkNg&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/gujp3PxkkNg&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;The clones should be made hot, the revenge should be served cold.&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;Note: Some employers take offense to employees taking their hardware into fields and striking company assets repeatedly with with sports equipment, regardless of whether or not a hot clone has been made.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-1943156682439351706?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=qN043Ebd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=M2SfHFzf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=M2SfHFzf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=UHm7LobI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=UHm7LobI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=v9wjNAnX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=v9wjNAnX" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/6f5uuUE39Ls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/1943156682439351706/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=1943156682439351706" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1943156682439351706?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1943156682439351706?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/6f5uuUE39Ls/effortless-hot-cloning-with-vmware.html" title="Effortless Hot Cloning with VMWare Converter" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/11/effortless-hot-cloning-with-vmware.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4NR3YzeCp7ImA9WxRUE0Q.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-7790641292541403841</id><published>2008-11-22T02:09:00.001-08:00</published><updated>2008-11-22T15:03:16.880-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-22T15:03:16.880-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Rants" /><title>Sandboxes Grow Good Developers</title><content type="html">&lt;h4&gt;Uh, You're Testing That Where?&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_x_KlQTLtnfI/SSfaZXE3N6I/AAAAAAAAA3E/P0WQL1cZnEQ/s1600-h/ms961620.ebiz_depl_sdg_iwtopology%28en-us%2CMSDN.10%29%5B17%5D.gif"&gt;&lt;img style="border: 0px none ;" alt="A intimidating picture of a BizTalk rollout topology. It's really meant to intimidate you into thinking about IT environments as complex systems." src="http://lh3.ggpht.com/_x_KlQTLtnfI/SSfaaC1fUXI/AAAAAAAAA3I/_uJ3Owl_mjM/ms961620.ebiz_depl_sdg_iwtopology%28en-us%2CMSDN.10%29_thumb%5B15%5D.gif?imgmax=800" align="right" border="0" height="368" width="160" /&gt;&lt;/a&gt; A while back one of our data analysts and a network admin stubbed out a sheltered domain within our LAN. The idea was that we would set up a sandboxed class C network where developers could test code and not worry about breaking anything on our public network. &lt;/p&gt;  &lt;p&gt;While this might seem a little hardcore at first, remember that a lot of solutions these days are meant to be deployed to some reasonably complex IT environments (like this sample BizTalk topology on the right). As such these codes may be making calls to Active Directory, Exchange, sit underneath some type of proxy (ISA/Squid), and get deployed to some kind of web farm (think load balancer appliances, NLB clusters, etc...). &lt;/p&gt;  &lt;p&gt;Needless to say these kinds of environments are dramatically different from what you find on your workstation. Depending on the type of application you're delivering and where it's getting deployed, simply testing on Windows XP and IIS 5 might not qualify as a realistic environment.&lt;/p&gt;  &lt;h4&gt;The Right Kind of Cheap&lt;/h4&gt;  &lt;p&gt;The good news is that with &lt;a href="http://www.microsoft.com/windowsserversystem/virtualserver/"&gt;Virtual Server&lt;/a&gt;/&lt;a href="http://www.microsoft.com/downloadS/details.aspx?FamilyID=04d26402-3199-48a3-afa2-2dc0b40a73b6&amp;amp;displaylang=en"&gt;PC&lt;/a&gt; being free (give or take a windows license), virtualization has never been cheaper or easier. We ended up using a bunch of hardware kicking around the office to provision these machines. Our little test subnet already has a wide variety of virtual instances running around in it, hosting everything from Exchange to AD, and even a full blown MOSS farm.&lt;/p&gt;  &lt;p&gt;The bad news is that maintaining this virtual instance still costs time, and as you may have heard, time is money. This can be mitigated in part, by the ease of performing machine level backups on VMs, and other VM features like &lt;a href="http://technet.microsoft.com/en-us/library/cc720325.aspx"&gt;Undo Disks&lt;/a&gt;, &lt;a href="http://www.andrewconnell.com/blog/articles/UseVirtualPCsDifferencingDisksToYourAdvantage.aspx"&gt;Differencing Disks&lt;/a&gt; and saving state. Nevertheless it makes sense to budget some time to maintain this kind of environment, rarely does IT infrastructure maintain itself...&lt;/p&gt;  &lt;h4&gt;The Easy Value&lt;/h4&gt;  &lt;p&gt;Originally the thought was to set up some SharePoint farm and allow developers to stage their code in a &lt;em&gt;farm&lt;/em&gt; environment prior to deploying at the clients. You'd be surprised at just how many deployment issues crop up just by deploying to a farm instead of a single machine.&lt;/p&gt;  &lt;p&gt;The real value is that you give the solution a chance to break in the your farm first. I'd much rather start up a troubleshoot at my desk than in a client's server room.&lt;/p&gt;  &lt;p&gt;As far as I'm concerned the farm has already paid for itself. It's already stopped me from deploying a MOSS update that I'm positive would have trashed one of our clients SharePoint farms. As some of you may know, &lt;a href="http://support.microsoft.com/kb/903771"&gt;there is no uninstall&lt;/a&gt; for most SharePoint Service Packs and Updates, you often have no choice but to continue forward...even if it's off a cliff.&lt;/p&gt;  &lt;p&gt;By breaking things in our VM farm, not only do I have an easier time rolling back if I hit a wall, but I can also troubleshoot it with all the tools and brainpower that my fellow developers have to offer. The alternative is breaking it for the first time at some client location where I'm all alone and only have the tools I thought to bring with me. Some fights just shouldn't be fought alone (at least the first time around).&lt;/p&gt;  &lt;h4&gt;The Extra Value&lt;/h4&gt;  &lt;p&gt;This wasn't immediately apparent to me but a lot of developer benefit from this kind of sandbox for another reason. In addition to testing their code in a more complex environment, they actually get a chance to look under the hood and play with the many services that decorate typical IT environments. It's surprising how many of these services that your typical developer isn't familiar with (AD, DNS, ISA, IIS, MOM, etc...). Let me elaborate.&lt;/p&gt;  &lt;p&gt;A &lt;em&gt;ton&lt;/em&gt; of web developers have no idea how DNS works. This could also be said for HTTP, TCP and the web servers that host their applications. &lt;/p&gt;  &lt;p&gt;This akin to a cab driver that knows how to drive, but doesn't know &lt;em&gt;any traffic laws&lt;/em&gt; or anything about the car.&lt;/p&gt;  &lt;p&gt;This isn't meant to be a roast for developers who haven't had the benefit of IT fundamentals. Some of these topics just aren't covered in a Computer Science degree. This is about enabling developers. Empowering them to discover what hidden gems exist in typical IT environments and how these existing IT assets can help deliver better solutions. &lt;/p&gt;  &lt;p&gt;Trust me, there's a big difference between &lt;em&gt;telling&lt;/em&gt; a developer what DNS is and simply having the guy create and A record and see that light switch on in his eyes. What's even better is letting him discover for himself what IT assets can do for him in a clean and controlled environment where mistakes are easy to rollback.&lt;/p&gt;  &lt;h4&gt;Imagine This&lt;/h4&gt;  &lt;p&gt;Don't get me wrong, there's always going to be a percentage of developers that are clueless when it comes to all things IT (starting with their workstation). That's where your job security comes from. But if you educate just a couple more bodies you'll start to notice the difference pretty quickly. There's a night and day difference between a dev who simply lobs a program over the wall and one who has a holistic understanding of the landing zone. These kinds of investments don't take long before they start to yield noticeable returns. There might even be a day where IT staff come to trust developers to not completely mangle production environments.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Just talking out loud...&lt;/p&gt;  &lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-7790641292541403841?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=CvgSmgzf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=reKwZHY2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=reKwZHY2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=pBDlfW7L"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=pBDlfW7L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=fsoho3Jt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=fsoho3Jt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/L7fGUOckMmQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/7790641292541403841/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=7790641292541403841" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/7790641292541403841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/7790641292541403841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/L7fGUOckMmQ/sandboxes-make-good-developers.html" title="Sandboxes Grow Good Developers" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/11/sandboxes-make-good-developers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYHRHc-cSp7ImA9WxRVGEo.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-1900543564598099122</id><published>2008-11-16T14:41:00.001-08:00</published><updated>2008-11-16T14:55:35.959-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-16T14:55:35.959-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Stong Name" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>Creating a Custom CAS Policy File For SharePoint</title><content type="html">&lt;h4&gt;Some Reasons&lt;/h4&gt;  &lt;p&gt;Maybe you're tired of putting your SharePoint web application in full trust and running web applications with huge security surface areas. Or maybe you've become tired of GAC'ing assemblies just so that they can run in full trust. Heck, maybe you've even &lt;a href="http://blog.tylerholmes.com/2008/10/don-set-your-sharepoint-app-to-full.html" target="_blank"&gt;read this article&lt;/a&gt; and decided to finally start handling Code Access Security in a more elegant way.&lt;/p&gt;  &lt;p&gt;All of the above are good reasons to make a custom Code Access Security policy file, and in the following section we're going to do just that. If you're curious as to why you might be doing this in the first place, it might be a good idea to peruse common code access security issues &lt;a href="http://blog.tylerholmes.com/2008/10/don-set-your-sharepoint-app-to-full.html" target="_blank"&gt;described here&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Creating A Custom Policy File&lt;/h4&gt;  &lt;p&gt;The intent of the custom policy we're about to make is to allow &lt;em&gt;your&lt;/em&gt; &lt;em&gt;code&lt;/em&gt; and only your code to run in full trust regardless of where it is (doesn't have to be in the GAC). All other code in the application will be running as WSS_Minimal which means it will have a reduced set of privileges (&lt;a href="http://blog.tylerholmes.com/2008/10/don-set-your-sharepoint-app-to-full.html" target="_blank"&gt;see table&lt;/a&gt;). For example, codes running in WSS_Minimal can't access the SharePoint object model. &lt;em&gt;Your&lt;/em&gt; &lt;em&gt;code&lt;/em&gt; however will be running in full trust and will be able to do whatever it wants. &lt;/p&gt;  &lt;p&gt;This is often desirable since we have no idea what web parts information workers or administrators will lob into our SharePoint application. It's a little presumptuous to assume that they're all safe and won't do anything malicious. Granting them full trust allows them to do things like write to sensitive areas of the disk, access the registry, etc... Users with high privileges (ie. administrators) get duped in to running malicious code all the time, that's one of the reasons Code Access Security exists in the first place. If you're curious about what the difference between code running in full trust and code running in WSS_Minimal is, refer to the table in the link above. Onward.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;First make a copy of C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\CONFIG\WSS_Minimal.config and put it in your application folder, call it WSS_Custom.config. If you want to increase the privileges of &lt;em&gt;other code&lt;/em&gt; you can start with WSS_Medium, this will allow other code to access the SharePoint API without having security exceptions thrown. &lt;/li&gt;    &lt;li&gt;Strong name your assembly. We're not going to put in the GAC, but it still needs to be strong named so that it can be uniquely identified by the WSS_Custom.config policy file. &lt;/li&gt;    &lt;li&gt;Open up the Visual Studio Command Prompt (or go find sn.exe) and extract the public key from your .snk file into another file. (It's worth noting that the &lt;strong&gt;Public Key&lt;/strong&gt; is &lt;em&gt;not&lt;/em&gt; the same as the &lt;strong&gt;Public Key Token&lt;/strong&gt; that you might get from your assembly using Reflector).       &lt;div class="code"&gt;sn -p YourStongNameFile.snk PublicKeyOnly.snk&lt;/div&gt; You should see the output "&lt;em&gt;Public key written to PublicKeyOnly.snk&lt;/em&gt;". &lt;/li&gt;    &lt;li&gt;Now we print out that public key with the following command:      &lt;div class="code"&gt;sn -tp PublicKeyOnly.snk&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;Copy that insanely long stream of numbers (your assembly's public key). Add the following line to your WSS_Custom.config just below the &amp;lt;CodeGroup class="FirstMatchCodeGroup"...&amp;gt;'s &amp;lt;IMembershipCondition&amp;gt; element.      &lt;pre class="prettyprint" style="overflow: auto;"&gt;&amp;lt;CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="Nothing"&amp;gt;&lt;br /&gt;&amp;lt;IMembershipCondition class="AllMembershipCondition" version="1" /&amp;gt;&lt;br /&gt;&amp;lt;!--[Your Entry Here]--&amp;gt;&lt;br /&gt;&amp;lt;CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust"&amp;gt;&lt;br /&gt;&amp;lt;IMembershipCondition class="StrongNameMembershipCondition" version="1" PublicKeyBlob="[Your Public Key]"&amp;gt;&amp;lt;/IMembershipCondition&amp;gt;&lt;br /&gt;&amp;lt;/CodeGroup&amp;gt;&lt;br /&gt;&amp;lt;!--[End Addition]--&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/CodeGroup&amp;gt;&lt;/pre&gt;  &lt;/li&gt;  &lt;li&gt;Now ensure that you're web.config uses your custom policy file. Add the following line right under &amp;lt;SecurityPolicy&amp;gt;:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&amp;lt;trustLevel name="WSS_Custom" policyFile="[path to wss_custom.config]" /&amp;gt;&lt;/pre&gt;  &lt;/li&gt;  &lt;li&gt;Finally change your web applications trust level to use your custom policy file. Ensure that the &amp;lt;trust/&amp;gt; element looks like below:&lt;br /&gt;&lt;pre class="prettyprint" style=""&gt;&amp;lt;trust level="WSS_Custom" originUrl="" /&amp;gt;&lt;/pre&gt;  &lt;/li&gt;  &lt;li&gt;That's it, you're done! You may need to restart IIS if you get an "Assembly &amp;lt;assemblyName&amp;gt; security permission grant set is incompatible". &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I've posted a &lt;a href="http://homertbush.googlepages.com/wss_custom.config"&gt;sample WSS_Custom.config&lt;/a&gt; if the above was confusing.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you were getting security exceptions before they should be gone now, at least all those coming from your assembly. Other code will continue to run in WSS_Minimal (or WSS_Medium if you used that .config as a template) and may throw security exceptions should they try to access APIs that they don't have the privileges to do so.&lt;/p&gt;&lt;p&gt;This is a lot more preferable than two popular alternatives:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Having the entire web application run in full trust (which gives all assemblies full trust).&lt;/li&gt;  &lt;li&gt;Putting your assemblies in the GAC just so that they can run in full trust. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Hope that helps.&lt;/p&gt;&lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-1900543564598099122?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=axNLvTm5"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=Io2R9jZa"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=Io2R9jZa" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=LUb65llG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=LUb65llG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=BhUBjdZU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=BhUBjdZU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/uGb7I-E5bNA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/1900543564598099122/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=1900543564598099122" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1900543564598099122?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/1900543564598099122?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/uGb7I-E5bNA/creating-custom-cas-policy-file-for.html" title="Creating a Custom CAS Policy File For SharePoint" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">15</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/11/creating-custom-cas-policy-file-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYFQnc-cCp7ImA9WxRVFkw.&quot;"><id>tag:blogger.com,1999:blog-8451123064758809734.post-4608769577258136794</id><published>2008-11-13T14:49:00.001-08:00</published><updated>2008-11-13T14:58:33.958-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T14:58:33.958-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term="Weird Errors" /><title>Empty/Blank IIS Manager When SharePoint Timer Throws Error</title><content type="html">&lt;h4&gt;Ugly Error&lt;/h4&gt;&lt;p&gt;I've seen this error often enough that I think it deserves a brief entry. Essentially the symptoms are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;When you open up the Internet Information Services (IIS) Manager it takes a long time to load and when it finally does the console is blank. Running iisreset (Start-&amp;gt;Run-&amp;gt;iisreset) will temporarily fix the problem.&lt;a href="http://lh6.ggpht.com/_x_KlQTLtnfI/SRyu5yba5TI/AAAAAAAAA28/KaEyRRJje2w/s1600-h/2008.11.13%2011.37.11%5B3%5D.gif"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="245" alt="Empty/blank IIS manager from SharePoint Timer error." src="http://lh5.ggpht.com/_x_KlQTLtnfI/SRyu6Ge8eiI/AAAAAAAAA3A/bI5P-nHuAnA/2008.11.13%2011.37.11_thumb%5B1%5D.gif?imgmax=800" width="464" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;li&gt;In the event viewer under Application you see error codes for &lt;strong&gt;6398&lt;/strong&gt;, &lt;strong&gt;7076&lt;/strong&gt;, and &lt;strong&gt;6482&lt;/strong&gt;. Specifically they look like: &lt;/li&gt;&lt;/ol&gt;&lt;div class="code" style="overflow:hidden"&gt;Event Type: Error&lt;br /&gt;Event Source: Windows SharePoint Services 3&lt;br /&gt;Event Category: Timer&lt;br /&gt;Event ID: &lt;strong&gt;6398&lt;/strong&gt;&lt;br /&gt;Date: 11/13/2008&lt;br /&gt;Time: 1:34:47 PM&lt;br /&gt;User: N/A&lt;br /&gt;Computer: [COMPUTER NAME]&lt;br /&gt;Description:&lt;br /&gt;The Execute method of job definition Microsoft.Office.Server.Administration.ApplicationServerAdministrationServiceJob (ID [GUID]) threw an exception. More information is included below.&lt;br /&gt;Attempted to read or write protected memory. This is often an indication that other memory is corrupt.&lt;br /&gt;For more information, see Help and Support Center at &lt;a href="http://go.microsoft.com/fwlink/events.asp"&gt;http://go.microsoft.com/fwlink/events.asp&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="code" style="overflow:hidden"&gt;Event Type: Error&lt;br /&gt;Event Source: Office SharePoint Server&lt;br /&gt;Event Category: Office Server Shared Services&lt;br /&gt;Event ID: &lt;strong&gt;7076&lt;/strong&gt;&lt;br /&gt;Date: 11/13/2008&lt;br /&gt;Time: 1:34:47 PM&lt;br /&gt;User: N/A&lt;br /&gt;Computer: [COMPUTER NAME]&lt;br /&gt;Description:&lt;br /&gt;An exception occurred while executing the Application Server Administration job.&lt;br /&gt;Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.&lt;br /&gt;&lt;p&gt;Techinal Support Details:&lt;br /&gt;System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. &lt;/p&gt;&lt;p&gt;Server stack trace:&lt;br /&gt;at System.DirectoryServices.Interop.UnsafeNativeMethods.IAdsContainer.GetObject(String className, String relativeName)&lt;br /&gt;[...]&lt;/p&gt;&lt;br /&gt;For more information, see Help and Support Center at &lt;a href="http://go.microsoft.com/fwlink/events.asp"&gt;http://go.microsoft.com/fwlink/events.asp&lt;/a&gt;. &lt;/div&gt;&lt;br /&gt;&lt;div class="code" style="overflow:hidden"&gt;Event Type: Error&lt;br /&gt;Event Source: Office SharePoint Server&lt;br /&gt;Event Category: Office Server Shared Services&lt;br /&gt;Event ID: &lt;strong&gt;6482&lt;/strong&gt;&lt;br /&gt;Date: 11/13/2008&lt;br /&gt;Time: 1:34:47 PM&lt;br /&gt;User: N/A&lt;br /&gt;Computer: [COMPUTER NAME]&lt;br /&gt;Description:&lt;br /&gt;Application Server Administration job failed for service instance Microsoft.Office.Excel.Server.ExcelServerSharedWebServiceInstance ([GUID]). &lt;p&gt;&lt;/p&gt;&lt;p&gt;Reason: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. &lt;/p&gt;&lt;p&gt;Techinal Support Details:&lt;br /&gt;System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. &lt;/p&gt;&lt;p&gt;Server stack trace:&lt;br /&gt;at System.DirectoryServices.Interop.UnsafeNativeMethods.IAdsContainer.GetObject(String className, String relativeName)&lt;br /&gt;[...] &lt;/p&gt;&lt;p&gt;For more information, see Help and Support Center at &lt;a href="http://go.microsoft.com/fwlink/events.asp"&gt;http://go.microsoft.com/fwlink/events.asp&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;h4&gt;A Fix&lt;/h4&gt;&lt;p&gt;Supposedly this behavior takes place when the Windows SharePoint Services Timer (OWSTimer.exe) has two threads that try to access IIS at the same time. There's currently a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;946517" target="_blank"&gt;hot fix and description&lt;/a&gt; for this problem that patches IIS that. Ideally there'll be an IIS update that comes out in the future that isn't a hot fix. If you can bear it I would consider waiting.&lt;/p&gt;&lt;p&gt;Best,&lt;br /&gt;Tyler&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8451123064758809734-4608769577258136794?l=blog.tylerholmes.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=a4bFwAw2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=8JeIFu6L"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=8JeIFu6L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=WUZ1UdId"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=WUZ1UdId" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?a=u5tH5wvG"&gt;&lt;img src="http://feeds.feedburner.com/~f/ItsInSystemDotWhat?i=u5tH5wvG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsInSystemDotWhat/~4/8OjhW2joAYs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tylerholmes.com/feeds/4608769577258136794/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8451123064758809734&amp;postID=4608769577258136794" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4608769577258136794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8451123064758809734/posts/default/4608769577258136794?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ItsInSystemDotWhat/~3/8OjhW2joAYs/emptyblank-iis-manager-when-sharepoint.html" title="Empty/Blank IIS Manager When SharePoint Timer Throws Error" /><author><name>Tyler Holmes</name><uri>http://www.blogger.com/profile/16288716879251803370</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11798805583639130267" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.tylerholmes.com/2008/11/emptyblank-iis-manager-when-sharepoint.html</feedburner:origLink></entry></feed>
