<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8690173</id><updated>2012-01-10T00:13:54.868+01:00</updated><category term='blackberry sync mac garbage'/><category term='MS Office 2007 crash Server 2008'/><category term='tools'/><category term='Performance'/><category term='MVC'/><category term='Powershell'/><category term='Deployment'/><category term='Publication'/><category term='Navigation'/><category term='Permissions'/><category term='Anonymous'/><category term='Internet Sites'/><category term='ASCX'/><category term='Geography'/><category term='Content Query Web Part'/><category term='Job'/><category term='XsltListViewWebPart'/><category term='Public facing sites'/><category term='Managed Metadata'/><category term='FieldRef'/><category term='MOSS'/><category term='Folder'/><category term='pc to mac'/><category term='Funny'/><category term='#FAIL'/><category term='Run as Administrator'/><category term='DIWUG'/><category term='Mac Mini'/><category term='motorcycle'/><category term='Code snippet'/><category term='Governance'/><category term='Web Part Deployment'/><category term='Hiding Panel'/><category term='UserControl'/><category term='Microsoft support'/><category term='SharePoint'/><category term='formatting'/><category term='Basics'/><category term='XComplica'/><category term='SSO'/><category term='SharePoint 2010'/><category term='blog'/><category term='Promo'/><category term='C#'/><category term='parallels'/><category term='WebPart'/><category term='Content Type'/><category term='SPSTC'/><category term='Document Library'/><category term='Linq'/><category term='html'/><category term='Custom Field'/><category term='EPiServer'/><category term='source code'/><category term='ViewState'/><category term='ImageVault'/><category term='Sandbox'/><category term='FBA'/><category term='Key cannot be null'/><category term='Authentication Provider'/><category term='Speaking'/><category term='Login'/><title type='text'>Joe unfiltered</title><subtitle type='html'>A mostly technical blog discussing any technology I happen to be wresting with at a particular time. Often this is SharePoint or ASP.NET.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default?start-index=101&amp;max-results=100'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>170</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8690173.post-2576594958559908250</id><published>2012-01-04T12:32:00.001+01:00</published><updated>2012-01-04T12:33:21.425+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Part Deployment'/><title type='text'>Same .webpart url in Web Part Gallery causes weirdness</title><content type='html'>I ran into an interesting issue today, and although I haven't fully tested this yet, I think I now get what is going on.&lt;br /&gt;&lt;br /&gt;I was working on refactoring a number of web parts for a customer, they had a less experienced SharePoint dev create a bit of a mess instead of a proper WSP, and so my first task was to create a proper SharePoint project in Visual Studio and include the necessary web parts. No issues, all worked on my clean test environment.&lt;br /&gt;&lt;br /&gt;I then proceed to deploy my shiny new WSP on the test server, and while most things work as expected, the web parts that I included are not available. The feature that they are part of is activated so I am stumped for a minute. Quickly I start to suspect that this has something to do with the old web parts, but my new ones are in a different assembly, different namespace etc etc. After some poking around in the xml, I realize that both my web parts and the old versions have the same name, and thus deploy to the same URL in the web part gallery. This can be seen in the elements.xml file for the web part.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;highlight: [4]"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot; &amp;gt;&lt;br /&gt;  &amp;lt;Module Name=&amp;quot;MyWebPart&amp;quot; List=&amp;quot;113&amp;quot; Url=&amp;quot;_catalogs/wp&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;File Path=MyWebPart\MyWebPart.webpart&amp;quot; Url=&amp;quot;MyWebPart.webpart&amp;quot; Type=&amp;quot;GhostableInLibrary&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;Property Name=&amp;quot;Group&amp;quot; Value=&amp;quot;JoeTest&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/File&amp;gt;&lt;br /&gt;  &amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A few quick tests on my local machine confirm that such URL collisions will cause problems, on my local machine it looked like web parts were being overwritten by the latest feature to deploy, but on the test server the old web parts persisted. This needs some more testing to fully understand what the intended behavior is, and whether it is something permissions related.&lt;br /&gt;&lt;br /&gt;Nevertheless, as soon as I updated my URL deployment location, I was able to deploy the new web parts to the test server and use them on pages.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml;highlight: [4]"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot; &amp;gt;&lt;br /&gt;  &amp;lt;Module Name=&amp;quot;MyWebPart&amp;quot; List=&amp;quot;113&amp;quot; Url=&amp;quot;_catalogs/wp&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;File Path=MyWebPart\MyWebPart.webpart&amp;quot; Url=&amp;quot;new_MyWebPart.webpart&amp;quot; Type=&amp;quot;GhostableInLibrary&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;Property Name=&amp;quot;Group&amp;quot; Value=&amp;quot;JoeTest&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/File&amp;gt;&lt;br /&gt;  &amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I realize that it probably isn't best practice to have web parts with the same name, etc. but trust me that I have a good reason for doing this. In any case, after some thought it makes perfect sense that SharePoint will not allow us to deploy two .webpart files to the same URL, and so a change to the URL is needed to work around this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2576594958559908250?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2576594958559908250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2576594958559908250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2576594958559908250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2576594958559908250'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2012/01/same-webpart-url-in-web-part-gallery.html' title='Same .webpart url in Web Part Gallery causes weirdness'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5117193002955262772</id><published>2011-11-04T14:33:00.001+01:00</published><updated>2011-11-04T16:55:23.203+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Governance'/><title type='text'>If you still don’t ‘get’ what Governance is</title><content type='html'>True story: About one year ago I went to Microsoft TechEd in Berlin and attended all types of sessions. I was there to learn about technology, and I somewhat accidentally attended a session on SharePoint governance. I didn’t really know what that was, and frankly I couldn’t have cared less. I am a techie, and this was some sort of new fad that the global companies were all raving about. Some sort of corporate mumbo jumbo that was useless when it came down to doing some real work. Not a single line of code in the entire talk, just a bunch of Visio.&lt;br /&gt;&lt;br /&gt;Does that sound familiar? Can you identify yourself in that story? If so, I will try to explain to you why this governance thing is being discussed so much, and why you actually do need to be aware of it, even as a hard core techie.&lt;br /&gt;&lt;br /&gt;Let’s talk about traffic. I don’t mean network traffic, I mean the kind most of you get into on a daily basis out in the streets. When you get into your car, or I on my bike, there is a lot that goes on between leaving home and getting to work. First, there are all the roads we need to navigate. Then there is the weather that can cause the road conditions to change. Lastly, there are all those other people out there on the road who are also trying to get from point A to point B. It is fair to say that the traffic on our roads today is a complex system, and no one really has a grasp of the ‘overall plan’ for the day. Somehow we all make it to where we need to go most of the time, and when something does go wrong, it usually degrades in a way that is acceptable. By this I mean that fatal accidents are fairly rare as opposed to fender benders, and fender benders are rarer yet when compared to being late due to congestion.&lt;br /&gt;&lt;br /&gt;So why am I on about traffic? Because I think this extremely complex system that is used by a huge number of human beings at the same time could not work if it weren’t for governance. There's that word again. Let’s see what I mean by governance in terms of traffic. Those of you who have driver’s licenses should know a good deal of traffic governance, by that I mean your local traffic laws. Every new driver is taught that red lights mean stop, what a yield sign looks like and what it means, and how fast a vehicle may travel on a given road. These rules are what ensures that we all behave in a given way on the road, and thus don’t run into each other very often. Being human means we don’t always get it right, but that’s another story.&lt;br /&gt;&lt;br /&gt;There are other rules that the average driver doesn’t know that are just as vital to the success of our daily drive. What type of road surface is used? What is the minimum radius of a turn on the expressway? These are rules the road engineers need to be aware of.&lt;br /&gt;&lt;br /&gt;There are also specific situations that warrant their own set of rules and&amp;nbsp;behaviors. When something does go wrong, the emergency response teams have a very well defined protocol to handle that event, ensuring the best possible outcome for those impacted and the quickest possible return to normal conditions.&lt;br /&gt;Lastly, I want to mention the massive differences in how traffic operates in different locations. Compare rush hour in Bangalore&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=0cdUPOvSXOo" target="_blank"&gt;http://www.youtube.com/watch?v=0cdUPOvSXOo&lt;/a&gt; with rush hour in Berlin &lt;a href="http://www.youtube.com/watch?v=6jUc6dHcbCo" target="_blank"&gt;http://www.youtube.com/watch?v=6jUc6dHcbCo&lt;/a&gt; and rush hour in Utrecht &lt;a href="http://www.youtube.com/watch?v=UlQYP4WN-5w" target="_blank"&gt;http://www.youtube.com/watch?v=UlQYP4WN-5w&lt;/a&gt;.&amp;nbsp;You immediately see there are some localized differences. Some places drive on the right side of the road, some on the left, and some have dedicated lanes for bike traffic. Some places have a visible order and structure to the driver's&amp;nbsp;behavior&amp;nbsp;while others exhibit what looks like chaos to the outside observer. Nevertheless, each is designed with a single purpose to get everyone from point A to point B as safely and quickly as possible. &lt;br /&gt;&lt;br /&gt;So what does all this have to do with SharePoint, and specifically SharePoint governance? As mentioned, the traffic system is very complex. What makes it complex however are not the roads or vehicles but all the individual people that interact with it at any given point in time. Each with a different goal in mind, and each not aware of the needs of the others in the system. What makes it work, is the adherence to the rules and guidelines that belong to that system. &lt;br /&gt;&lt;br /&gt;If we compare the road system to SharePoint, we can see that there are many similarities. I would argue that the bits provided by Microsoft on the SharePoint DVD are the equivalent of concrete, asphalt, vehicles and traffic lights. They represent a possibility, or opportunity to create a useful (and complex) system. When we start a new SharePoint project, it is vital that we decide on rules and guidelines with which we will use all the components available to us. We may not even want or need all the components at all places. Just because there are thousands of road signs available to a road designer, doesn’t mean it is useful to use each and every one. How helpful is this scenario?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://eightsolid.com/wp-content/uploads/2007/10/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://eightsolid.com/wp-content/uploads/2007/10/8.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The first step we need to decide is why we are building our SharePoint system to start with. A road crew generally needs to build a road to connect two places, to improve traffic flow in a congested area, or to upgrade a broken down old road. Our SharePoint project needs to be just as clear in purpose. Replacing an old intranet that doesn’t work anymore, connecting two remote offices so they can share information. Those are very clear and simple reasons that make it easy to understand why we are starting a new project. Saying that we need to “improve collaboration in the enterprise” is simply too vague and would be the equivalent of saying that we need to build a road to “enhance the citizens driving experience”. I’d like to see a city allocate budget to that project. &lt;br /&gt;&lt;br /&gt;Once we have a purpose, we need to decide on the rules and guidelines that we will follow so that we can achieve our purpose. There will be different types of rules for different scenarios. Some will be very hard and some quite flexible. Road crews can choose which end of the road to start at, or even which sections to work on at what time. They can't however just decide to route the road through a nature reserve because it makes it easier.&lt;br /&gt;&lt;br /&gt;The rules will also not be the same for all organizations. We may have a different set of goals and a different culture. In road terms, the Netherlands sets speed limits that are quite absolute. There are many speed cameras and getting caught gong just a few km/h over will result in a fine. In the Toronto area, going 20 km/h over the limit on the expressway will generally not raise any interest from the police. As a matter of fact, I remember it being somewhat rude to go any slower. Culture has a huge impact on the rules we follow and how. &lt;br /&gt;&lt;br /&gt;In SharePoint projects, we will have to determine the rules that work for our organization. Some hard rules will need to be set, such as access rights for instance. More flexible rules may include good practices with respect to metadata use and version control. We also need to determine the rules and guidelines for different target groups and different scenarios. Our end users will not be interested in the rules regarding database maintenance, but our IT department will need to be very aware of these. We also need to consider special cases such as system failures, and the procedures that need to be followed in order to respond to these. In the traffic scenario we can think of the highly organized Emergency Response Teams. In SharePoint we can think of disaster recovery plans. How often do you think the EMTs practice their routine, and how often does your project practice their disaster recovery?&lt;br /&gt;&lt;br /&gt;Having determined these rules, we should have a good place to plan our project in terms of specifics. How will we build what is needed and who will be involved. This activity happens on most projects today, but it’s critical to know that this plan should be a derivative of understanding why we are building something, and what the desired behavior with that something is. In road terms, we can plan the best roundabout out there, but we need to know that it’s purpose is to slow down driver’s top speed but at the same time not forcing them to stop completely. If our goal was to purely increase traffic flow, an underpass may have been a better solution. &lt;br /&gt;&lt;br /&gt;Once we have a good idea of the rules we think we should be following, we need to create a strategy that will ensure all the people interacting with the system will understand these rules and guidelines. Think how much effort is spent training new drivers. We may find this annoying when we go through it, but ask the average driver if they would prefer that people ‘learn by getting out on the road’ and I think most would think this a terrible idea. There is a reason we have drivers licenses. In the SharePoint project this translates to training. We need to ensure that our users are shown what hey should and shouldn’t do. This includes explaining our general purpose for the existence of the system as well as the specifics of how to perform certain actions. If you only know how to drive the car, you are not yet ready to get out on the road.&lt;br /&gt;&lt;br /&gt;Lastly, we need to know how well our system is doing. One of the most famous and successful traffic solutions on the planet are the German motorways, known throughout the world as ‘the Autobahn’. A key ingredient to this complex system is monitoring. There is an entire team constantly monitoring the situation of all the roads in real-time and adjusting the speed conditions etc. to ensure most optimal operation. Our SharePoint projects will generally not have the luxury of such monitoring, but that doesn’t mean we can forget it all together. We need to define measures of success, and keep an eye on our SharePoint solution to see how it is performing. This includes measuring technical data such as bits and bytes but also more human data such as user satisfaction.  We can then react to our measurements and tweak the system or the rules and guidelines around the system to improve the overall performance.&lt;br /&gt;&lt;br /&gt;So what about Governance? We’ve somehow lost that word in the last few paragraphs. Governance is a collection all the rules and guidelines that get our project from the initial vision to a operating and continuously adapting solution. Governance is everything from the hard rules of how often we perform a backup to the soft guidelines that let our users know which content type they might want to use for a given document. It also includes the rules of the project itself, such as what type of user training do we perform, and how do we measure success. There are many facets to Governance in a SharePoint project and each of them is crucial to the overall success. &lt;br /&gt;&lt;br /&gt;I hope you now have some&amp;nbsp;understanding&amp;nbsp;of what this Governance thing is, and why you should care about it regardless of what your role on the SharePoint team.&amp;nbsp;It comes down to you and your team, do you want to build the autobahn, or are you ok with spending a lot of time, money and effort on this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://erikvanslyke.files.wordpress.com/2010/09/russian-road-25a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://erikvanslyke.files.wordpress.com/2010/09/russian-road-25a.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;PLUG: I have to give credit to the &lt;a href="http://www.spgovia.com/"&gt;SharePoint Information Architecture and Governance Master&lt;/a&gt; class since the idea for this blog post originates from discussions during that class and I would not have written this if it wasn’t for that fantastic course. If you want to know more about this topic, I highly recommend attending.&lt;br /&gt;&lt;br /&gt;Also thanks to &lt;a href="http://www.21apps.com/"&gt;21 Apps&lt;/a&gt; and the &lt;a href="http://www.21apps.com/governance/sharepoint-governance-3-0/"&gt;work they are doing on Governance in the SharePoint space&lt;/a&gt;, awesome work guys, keep it up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5117193002955262772?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5117193002955262772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5117193002955262772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5117193002955262772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5117193002955262772'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/11/if-you-still-dont-get-what-governance.html' title='If you still don’t ‘get’ what Governance is'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6266231820631412552</id><published>2011-11-01T13:47:00.017+01:00</published><updated>2011-11-01T14:13:00.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Navigation'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Public facing sites'/><title type='text'>Navigation on Public Facing SharePoint Sites</title><content type='html'>&lt;div&gt;One thing that all sites (SharePoint or not) need is some form of navigation. This is true for all sites, not just public sites. There are plenty of types of navigation elements, but if we stick to public sites, there tend to be the following few types:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Main navigation.&lt;/b&gt; This is almost always a horizontal list of links across the top of the page. These links do not change regardless of where on the site the user is. Sometimes each link will have a sub-navigation that is shown using JavaScript when the user hovers over a link.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Contextual navigation.&lt;/b&gt; This navigation can manifest itself in many ways, sometimes as a tree view, sometimes as a flat list. In any case, the content of this navigation is usually different per page, or at least per section of the site.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reverse Navigation (Bread crumb).&lt;/b&gt; This is some type of path allowing the user to see where in the site they are, and to navigate back the way they came from.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In SharePoint, we have out of the box elements that provide all three types of navigation mentioned. They may not work exactly how we need them, but they are there for the most part. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZmbdHllWqGY/Tq_oO4hVtkI/AAAAAAAAAno/9C-POScxX2A/s1600/nav.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://3.bp.blogspot.com/-ZmbdHllWqGY/Tq_oO4hVtkI/AAAAAAAAAno/9C-POScxX2A/s320/nav.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;On projects I was involved in, we never ended up using any of the built in navigation controls. Even thought they have been improved for SharePoint 2010, they still render html that never happened to fit the html we needed for the site. So how did we solve our navigation needs? There are a few options that I have used, I’m sure there are others out there:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Static, hard coded links. This scares the crap out of some people, but I argue there are still plenty of scenarios where hard coded navigation is perfectly acceptable. As an example, take the apple.com website. How often do those links across the top change? Almost never. And when they do change, it is likely due to a very rigorous change management process. This is a case where I would advocate a hard coded solution. On the rare occasion the links change, update the master page.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantage&lt;/b&gt;: Best performance, Easy&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disadvantage&lt;/b&gt;: Potential for dead links&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Custom navigation controls based on SharePoint navigation providers. Just because the web controls that SharePoint delivers may not suit your needs, the navigation information they contain may be just what you want. In this case, use one of the providers that SharePoint offers. See MSDN on how to get started. &lt;a href="http://msdn.microsoft.com/en-us/library/bb897657.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb897657.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantage&lt;/b&gt;: Dynamic, Flexible&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disadvantage&lt;/b&gt;: Can be hard to get right, Usually lots of work&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Navigation that has nothing to do with navigation. What do I mean? Show a list of the published pages from the pages library of the current site. That has served us as a viable navigation strategy on a number of sites. Usually best suited for the contextual navigation category. There is a strong potential downside of using this approach. It is very simplistic and doesn’t implement any performance optimizations or security trimming. So if used in an incorrect scenario, it can have nasty side effects. For me this method has generally been useful when there are a number of content pages that need to be shown for a certain category, etc, and if a page was published, it should be visible for everyone.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantage&lt;/b&gt;: Relatively easy to build, Dynamic&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disadvantage&lt;/b&gt;: Only suitable for simple cases&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Search. Yes, you can use search as a viable navigation method. There are ways that you can prepopulate a search result set and display this as navigation. We used this on a project for a “Related Items” type of navigation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantage&lt;/b&gt;: Very dynamic&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disadvantage&lt;/b&gt;: Depends on good search results, Can’t always know what will be in there&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;So as usual with SharePoint the right answer for whatever you are doing is “it depends”. I would however stress that whatever your choice of navigation solution for a public site, don’t forget that you are building for the end user and make sure you are sending friendly HTML, etc to the client.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6266231820631412552?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6266231820631412552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6266231820631412552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6266231820631412552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6266231820631412552'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/11/navigation-on-public-facing-sharepoint.html' title='Navigation on Public Facing SharePoint Sites'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ZmbdHllWqGY/Tq_oO4hVtkI/AAAAAAAAAno/9C-POScxX2A/s72-c/nav.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2162528291161321325</id><published>2011-10-20T12:56:00.002+02:00</published><updated>2011-10-20T13:05:49.806+02:00</updated><title type='text'>Build for the end user</title><content type='html'>I attended a session at the European SharePoint conference today about building public facing websites using SharePoint. I respect the effort that the speakers put into their session and I agree that they had a nice looking web site created. However I strongly disagree with the methods they demonstrated and was disappointed to see these methods demonstrated as good practices.&lt;br /&gt;&lt;br /&gt;There were two specific methods that I strongly disagree with demonstrated at the session:  &lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;br /&gt;Hiding the ribbon for anonymous users with CSS. &lt;/li&gt;&lt;li&gt;&lt;br /&gt;Using web part zones and web parts like the Content Query Web Part on public facing page layouts. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Both of these techniques are a symptom of what I call building for the editor. As developers we often work very closely with the editors when developing the site, and we thus tend to focus on making the site in such a way that the editor has a very easy life. This is not necessarily bad, but it comes at a cost. If we look at the big picture, the ultimate reason for the website being built is to be consumed by the end users. Editors are an important part of the picture, but we should be building the site for the end users. So why would that be different than building for  editors? Simple answer: page weight. &lt;br /&gt;&lt;br /&gt;Why care about page weight? The days of large bandwidth and low latency are over (if they were ever here). Many users these days are accessing your site via networks that are not gigabit LAN, but instead are  3G networks or something similar and will notice when your home page is 300kb and sends another 300kb of JavaScript and CSS along. There are real costs attached to this in money, battery life and time spent waiting.  &lt;br /&gt;&lt;br /&gt;The good news is that there is a solution. In a previous blog post &lt;a href="http://jcapka.blogspot.com/2011/08/public-facing-sites-using-sharepoint.html"&gt;http://jcapka.blogspot.com/2011/08/public-facing-sites-using-sharepoint.html&lt;/a&gt; I introduce a webtemplate that includes a very lean masterpage and serves as a good starting point for building public SharePoint sites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2162528291161321325?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2162528291161321325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2162528291161321325' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2162528291161321325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2162528291161321325'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/10/build-for-end-user.html' title='Build for the end user'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3425977512016664412</id><published>2011-08-26T15:00:00.000+02:00</published><updated>2011-08-26T15:00:17.886+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Basics'/><title type='text'>There are comments and then there are comments</title><content type='html'>The title may be somewhat vague, but in this post I want to alert you to the different type of comments you can use when working with ASP.NET. I have seen too many developers not understand the difference between&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;!-- Comment--&amp;gt;&lt;br /&gt;&lt;/pre&gt;and&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;%-- Comment --%&amp;gt;&lt;br /&gt;&lt;/pre&gt;The first type is an HTML comment which instructs the &lt;b&gt;browser&lt;/b&gt;&amp;nbsp;to ignore the contents. The second type is &amp;nbsp;an ASP.NET comment which instructs the ASP.NET &lt;b&gt;parser&lt;/b&gt;&amp;nbsp;to ignore the contents.&lt;br /&gt;&lt;br /&gt;This is a very important distinction. The first type of comment means nothing to the ASP.NET parser, and is handled just like any other HTML in the page. That means that if I put something along the lines of:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;!-- &amp;lt;asp:Literal runat="server" Text="joe was here"/&amp;gt; --&amp;gt;&lt;br /&gt;&lt;/pre&gt;into my web page, the ASP.NET parser will stil parse this and execute the code in that literal. So my HTML will look something like&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;!-- joe was here --&amp;gt;&lt;br /&gt;&lt;/pre&gt;When this becomes very important is at times where a developer thinks they have commented out some controls, but they haven't really, it's just that the output of that control isn't being displayed by the browser.&lt;br /&gt;&lt;br /&gt;Imagine a line like:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;!-- &amp;lt;myControls:SomeVerySlowThing runat="server"/&amp;gt; --&amp;gt;&lt;br /&gt;&lt;/pre&gt;A novice developer may be under the impression that 'SomeVerySlowThing' has been commented out, but in reality, the code for that control is still being run.&lt;br /&gt;&lt;br /&gt;Another time this is important is when trying to create lean and efficient HTML. Adding comments to HTML is handy, it is however still content being sent down the wire. If you are trying to make your HTML as lean as possible, use the ASP.NET comments and they will not show up in the end result HTML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3425977512016664412?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3425977512016664412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3425977512016664412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3425977512016664412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3425977512016664412'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/08/there-are-comments-and-then-there-are.html' title='There are comments and then there are comments'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-92405922701438493</id><published>2011-08-24T13:41:00.000+02:00</published><updated>2011-08-24T13:41:45.335+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Promo'/><category scheme='http://www.blogger.com/atom/ns#' term='XComplica'/><title type='text'>Free Brainstorming Session</title><content type='html'>Are you interested in what SharePoint is and what it could do for your business? XComplica is currently offering a free&amp;nbsp;brainstorming&amp;nbsp;session to help you answer these questions!&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://www.xcomplica.com/Promo" target="_blank"&gt;www.xcomplica.com/Promo&lt;/a&gt; for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-92405922701438493?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/92405922701438493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=92405922701438493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/92405922701438493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/92405922701438493'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/08/free-brainstorming-session.html' title='Free Brainstorming Session'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4073738442393690195</id><published>2011-08-23T19:17:00.001+02:00</published><updated>2011-08-23T19:24:06.796+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Public facing sites'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Sites'/><title type='text'>Public facing sites using SharePoint 2010</title><content type='html'>This post is the first in a series that will walk you through building public facing sites in SharePoint 2010. I will discuss a method that I use for this process, whether or not it is the best method I leave up to you to decide.&lt;br /&gt;In the past I used site definitions, but I recently decided to switch to the new web template method. In order to save myself and others time in the future, I have created a starter web template for public sites. You can download this at Codeplex: &lt;a href="http://xcomplicaps.codeplex.com/" target="_blank"&gt;http://xcomplicaps.codeplex.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have to thank Mirjam van Olst and Vesa “vesku” Juvonen for their blog posts that were extremely helpful in putting this web template together.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sharepointchick.com/archive/2011/02/10/using-web-templates-to-create-site-collections.aspx" target="_blank"&gt;http://www.sharepointchick.com/archive/2011/02/10/using-web-templates-to-create-site-collections.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/vesku/archive/2010/10/14/sharepoint-2010-and-web-templates.aspx" target="_blank"&gt;http://blogs.msdn.com/b/vesku/archive/2010/10/14/sharepoint-2010-and-web-templates.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this post, I will walk through the components in this web template, and how you can get started using it. Later posts will build on this one.&lt;br /&gt;&lt;br /&gt;If you haven’t already, you may want to download the solution from Codeplex, and open it in Visual Studio. &lt;br /&gt;&lt;span style="color: #666666;"&gt;Disclaimer: The solution is meant to be used on a development machine running SharePoint 2010. I also have the &lt;/span&gt;&lt;a href="http://cksdev.codeplex.com/" target="_blank"&gt;CKS Development tools&lt;/a&gt;&lt;span style="color: #666666;"&gt; installed and urge you to do the same.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;You will see that it is a relatively small and simple solution containing one project. The project consists of a number of components, and we will go through each one.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PojaCkwkaR4/TlPZiv87fxI/AAAAAAAAAnE/VX6cP10Tf5s/s1600/project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PojaCkwkaR4/TlPZiv87fxI/AAAAAAAAAnE/VX6cP10Tf5s/s1600/project.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Web Template (XComplicaPublicStarter)&lt;/span&gt;&lt;br /&gt;There are two files that define the web template. There is the onet.xml file and the Elements.xml file. The Elements.xml file tells SharePoint about the web template and the onet.xml file defines the components of the web template. This means that any changes to the information &lt;strong&gt;about&lt;/strong&gt; the web template, such as its name, description and display category should be changed in the element.xml file. This is similar to the webtemp_zzz.xml file for site definitions. The onet.xml file is a very stripped down version of the onet.xml used by the Publishing Portal site definition (BLANKINTERNET#53). Everything has been removed except for one configuration, and this configuration contains nothing except site level features and web level features. The features are the same as for the Publishing Portal, except there is one extra added at site scope and web scope, and these add the custom components we will be discussing later in the article. Two changes have been made to the web scoped publishing feature. The master page has been changed to a custom master page, and simple publishing has been turned on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Three Features&lt;/span&gt;&lt;br /&gt;There are three features as part of this project, one for farm scope, one for site scope and one for web scope. &lt;br /&gt;&lt;br /&gt;The farm scoped feature has only one component, and that is the web template just discussed. It ensures that you can create a site collection based on this web template.&lt;br /&gt;&lt;br /&gt;The site scoped feature contains elements that are global to the site collection as listed below. These will each be discussed in detail later:&lt;br /&gt;&lt;br /&gt;•	Master pages&lt;br /&gt;•	Page layouts&lt;br /&gt;•	Site columns&lt;br /&gt;•	Content types&lt;br /&gt;•	Global branding files&lt;br /&gt;&lt;br /&gt;The web scoped feature contains elements that apply to the web itself and these will also be discussed in detail later:&lt;br /&gt;&lt;br /&gt;•	Content type binding&lt;br /&gt;•	Home Page&lt;br /&gt;•	Property Bag Setter&lt;br /&gt;&lt;br /&gt;The web scoped feature also includes an event receiver. This event receiver enables anonymous access to the web. Since this is a public facing site, it is handy to have anonymous access automatically enabled on deployment. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Master pages&lt;/span&gt;&lt;br /&gt;In the modules section, you will find a module called master pages. There are two master pages here, one is the very well known starter master page by Randy Drisgill, _starter_publishing.master. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.drisgill.com/2010/02/microsofts-sharepoint-2010-starter.html" target="_blank"&gt;http://blog.drisgill.com/2010/02/microsofts-sharepoint-2010-starter.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The other master page, xcps_blank.master, is a stripped down version of Randy’s master page. This master page is what I use as a starter master page, and it has very little visible content. In this page I have commented out or removed as much of the html as possible, and I placed those placeholders that I could not remove into hidden panels. This technique is nothing new, I just took it further than others. There are only two content placeholders that are left in the visible portion of the page, the PlaceHolderMain and the PlaceHolderPageTitle. I assume these will be used on most if not all public facing sites. &lt;br /&gt;&lt;br /&gt;I have also added a few links to content in the head section of the master page, since I assume every site these days will include at least one css file, one javascript and likely a favicon. These three branding files are located in the branding module and are meant to be changed when creating a new site.&lt;br /&gt;&lt;br /&gt;I also add a reference to jQuery, but note that this is a reference to the CDN version of jQuery. There is no need to host this file locally.&lt;br /&gt;&lt;br /&gt;As you develop your site, you will likely want to use one of the other placeholders or other components that are currently hidden. This is perfectly fine, just cut and paste them from the hidden  panels into the appropriate location.&lt;br /&gt;&lt;br /&gt;Note that I have also removed the ASP.NET form tag. I don’t see a need for it in a clean public facing site, but if you do find yourself needing it, feel free to add it back. There is a great article on how to make web parts work without the form tag on Waldek’s blog.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.mastykarz.nl/web-parts-in-content-with-master-pages-without-the-form-tag-no-problem/" target="_blank"&gt;http://blog.mastykarz.nl/web-parts-in-content-with-master-pages-without-the-form-tag-no-problem/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Page Layouts&lt;/span&gt;&lt;br /&gt;There is currently only one page layout in the project, and that is for the home page. It is very simple since this layout will differ for every site. I have added some very basic components in the PlaceHolderMain just to demonstrate how content can be rendered. There is a standard SharePoint Webcontrol for rendering html and there is a custom control that I developed for rendering Publishing Images. SharePoint provides a control called RichImageField &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.richimagefield.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.richimagefield.aspx&lt;/a&gt;&amp;nbsp;that is meant for this, but I find it renders too much extra html around the image. I therefore created a simple server side control that renders just the img tag and some core attributes. You can see (and change) the code for this in the ServerControls folder of the project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Site Columns (Fields)&lt;/span&gt;&lt;br /&gt;Most public facing sites will contain at least a few different types of pages. These different types of pages should be represented by a number of content types, and content types are composed of fields. The StarterFields element contains one file which defines three site columns. One is a simple numeric site column used for ordering pages and the other two are Publishing site columns used to hold the html and image that the home page renders. You will add fields to this file, or create a separate element for your fields as you need them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Content Types&lt;/span&gt;&lt;br /&gt;Two content types are defined in the project. The generic content type is meant as a base type for all pages. It inherits from the built-in Page content type and it contains any fields that are common to all pages in the site. As it is, it contains one field which is the Sort Order. I find that a common request from authors somewhere down the line is to be able to order pages in some custom order, and so I always ensure this field is in all page content types.&lt;br /&gt;&lt;br /&gt;The other content type is for the home page. It inherits from the generic content type and contains two fields as a sample. These are the Main Image and Body Text fields. Any site you build from this template will likely have different needs, so this will change. Note that I strongly advise using a separate content type and page layout for the home page and not share these with other pages. The home page of any site tends to be a very special page that evolves and changes in a different fashion from the rest of the site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Global branding files&lt;/span&gt;&lt;br /&gt;Every public facing site will need some custom CSS, JavaScript and probably a favicon. I have created a module to contain these files, and they are deployed into the Style Library. There are a number of discussions out there regarding the use of the Style Library, read Andrew Connell’s article for a good introduction. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd221375.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/dd221375.aspx&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Note that I have referenced the CSS, JavaScript and favicon files in the master page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Content Type binding&lt;/span&gt;&lt;br /&gt;Every web that has the publishing features enabled has a Pages library. If we want to be able to create pages based on the content types we define, we need to bind these content types to that Pages library. There is an element file in the Content Types folder that takes care of this, just remember to add a reference in that file to any new content types that you create.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Home Page&lt;/span&gt;&lt;br /&gt;The home page is an instantiation of the home page layout, the home page content type and some actual content. The home page module is where this is all put together. The aspx page itself just has a reference telling SharePoint to use a page layout, this is the same for every instance of a publishing page. The interesting stuff is in the elements file, which defines the properties of the page, as well as the location (Pages List) that the page should be deployed to. Notice that the properties include the page layout, the content type, but also properties like Title, Body Text, etc. Also note that the MainImage property has&amp;nbsp;been specified and contains a link to an image from teh style library. That image is provisioned as part of the branding module. In a different post I will show how to provision&amp;nbsp;actual content into image libraries.&amp;nbsp;For most pages we would allow authors to add the content, but for some pages as well as for test purposes it can be useful to prefill some content in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Property Bag Setter&lt;/span&gt;&lt;br /&gt;Due to the way web templates work, there is no way to know what web template was applied once the provisioning of the site is finished. It is therefore best practice to add a property in the web’s property bag in order to store this information. See the links above&amp;nbsp;about web templates for more info on this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Getting it all working&lt;/span&gt;&lt;br /&gt;Now that you’ve had a full tour of the project, you should be able to create a site based on this template. You first need to specify a Site URL in the project properties so that it points to a valid SharePoint URL. What is somewhat annoying here is that we will be creating a new site collection based on this web template, but there already needs to be a site collection at the Site URL you specify. I often just start by creating a blank site at that URL, since I know I will be deleting it right after deployment. There are some PowerShell shortcuts you can also take, but I’ll leave those for another time. &lt;br /&gt;&lt;br /&gt;Once your project has deployed, go to central administration and open up the page for creating site collections. You should see a new tab, and in that tab the Public Starter template.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PCmEFmP_GNM/TlPZaectjqI/AAAAAAAAAnA/fIXXbWK5ong/s1600/template_tabs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-PCmEFmP_GNM/TlPZaectjqI/AAAAAAAAAnA/fIXXbWK5ong/s1600/template_tabs.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Before you create a new site collection, I suggest you delete the blank site that you needed to deploy the project. This is up to you, but if you do so, you can create your new site collection at the root URL.&lt;br /&gt;From this point, it is the same as creating any out-of-the box site collection. Once the process completes, you should be greeted with a new site based on the components discussed.  Just for fun, look at the source and the page weight of your new site, and compare this to the regular SharePoint publishing template.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;In this article I walked through the different pieces that make up the XComplica Public Starter web template. The purpose of the template is to create a clean starting point for creating lean and clean HTML sites using SharePoint. In future articles I will expand on how to create different types of pages, how to implement custom html into this template and other topics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4073738442393690195?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4073738442393690195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4073738442393690195' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4073738442393690195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4073738442393690195'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/08/public-facing-sites-using-sharepoint.html' title='Public facing sites using SharePoint 2010'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PojaCkwkaR4/TlPZiv87fxI/AAAAAAAAAnE/VX6cP10Tf5s/s72-c/project.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-907603678756492832</id><published>2011-08-16T16:53:00.000+02:00</published><updated>2011-08-16T16:53:21.431+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPSTC'/><category scheme='http://www.blogger.com/atom/ns#' term='Speaking'/><title type='text'>SPSTC Slides</title><content type='html'>I spoke at SharePoint Saturday The Conference and as promised, here are the slides for both sessions and the transcript of the powershell presentation.&lt;br /&gt;&lt;br /&gt;I also promised the code for the branded site, I will clean this up and post on codeplex in the near future. I will also write some articles on the process of creating such a site, so keep an eye on this blog.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xcomplica.com/downloads/PublicInternetSite.pptx"&gt;Slides of Branded Site talk&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xcomplica.com/downloads/PowershellForSharePoint.pptx"&gt;Slides of Powershell talk&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xcomplica.com/downloads/transcript.txt"&gt;Transcript of Powershell talk&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-907603678756492832?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/907603678756492832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=907603678756492832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/907603678756492832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/907603678756492832'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/08/spstc-slides.html' title='SPSTC Slides'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8420602090660398159</id><published>2011-07-06T10:33:00.002+02:00</published><updated>2011-07-06T10:35:39.981+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Speaking'/><title type='text'>Speaking at SharePoint Saturday the Conference</title><content type='html'>I am excited to say that I'll be speaking at the &lt;a href="http://www.spstc.org/" target=_blank"&gt;SharePoint Saturday Conference&lt;/a&gt; in DC August 11-13 2011. I will be presenting two sessions, both very hands on and demo oriented.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.spstc.org/SitePages/Sessions.aspx?SessionID=184" target=_blank"&gt;Building a Fully Branded SharePoint Website&lt;/a&gt; will focus on how a SharePoint developer implements a public facing website from HTML delivered by a design agency. This is a scenario I have done many times and have learned a lot of lessons the hard way doing this. I want to share the process as well as many of the pitfalls and best practices I have learned over the years. I'm going to try and build the site from scratch in the session, a bit of a challenge. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.spstc.org/SitePages/Sessions.aspx?SessionID=183" target=_blank"&gt;Practical Powershell for SharePoint&lt;/a&gt; is a session I delivered once for our DIWUG user group and got great feedback on, so I thought I'd share it with some more people. The session assumes the audience to have some Powershell experience and quickly dives into a number of scenarios that demonstrate some useful and clever ways of making your life easier by using Powershell. Those who have had the &lt;i&gt;&lt;fill adjective="" in="" own=""&gt;&lt;/fill&gt;&lt;/i&gt; of working with me will know that "Use Powershell" has been one of my favorite answers to many problems over the years. Powershell has only been on the SharePoint main stage since the release of 2010 but I've been using it for years now, and I want to share some of the more unusual and inspring ways I have found of leveraging the tool.&lt;br /&gt;&lt;br /&gt;Hope to see you at the conference!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8420602090660398159?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8420602090660398159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8420602090660398159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8420602090660398159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8420602090660398159'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/07/speaking-at-sharepoint-saturday.html' title='Speaking at SharePoint Saturday the Conference'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-103922089494553308</id><published>2011-05-20T14:30:00.001+02:00</published><updated>2011-07-06T10:05:14.571+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sandbox'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Document Library'/><title type='text'>Deploying a Document Library including content using a Feature</title><content type='html'>Recently I needed to deploy a SharePoint document library as a feature, but with some documents already in it. In my case it was because of demo content, the customer wanted to do some training and needed a pre-filled document library. I can see this useful in other times however, such as including templates for documents, etc.&lt;br /&gt;&lt;br /&gt;The solution for this is not difficult, but since I could not find any instructions online for this I thought I'd write a post.&lt;br /&gt;&lt;br /&gt;In short, you need to create a feature that includes two components. A list instance based on a document library and then a module with the documents that you want to add to your library. The module has to point to your newly created library and all is well.&lt;br /&gt;&lt;br /&gt;Let's walk through this. Start up Visual Studio and create a new empty SharePoint project.&amp;nbsp;You can choose to use a sandbox solution, this code works just fine in both sandbox and farm modes.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gJwjv5HWJ3s/TdYd9TXa5wI/AAAAAAAAAkY/zaeXutVoE8w/s1600/Screen+shot+2011-05-20+at+9.52.59+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-gJwjv5HWJ3s/TdYd9TXa5wI/AAAAAAAAAkY/zaeXutVoE8w/s1600/Screen+shot+2011-05-20+at+9.52.59+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next add a new item, of type list instance.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JLyYpU2sOE4/TdYeLIMFyYI/AAAAAAAAAkc/D3xrf4vU94A/s1600/Screen+shot+2011-05-20+at+9.42.58+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JLyYpU2sOE4/TdYeLIMFyYI/AAAAAAAAAkc/D3xrf4vU94A/s1600/Screen+shot+2011-05-20+at+9.42.58+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Choose 'Document Library' as the base type, and make sure to clean up the display name and URL. I personally hate the defaults that Visual Studio creates for these.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Z32H11PhmZI/TdYeXrUHgSI/AAAAAAAAAkg/zxPxdDlpy_E/s1600/Screen+shot+2011-05-20+at+9.45.17+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Z32H11PhmZI/TdYeXrUHgSI/AAAAAAAAAkg/zxPxdDlpy_E/s1600/Screen+shot+2011-05-20+at+9.45.17+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next add another new item to your project, this time of type module.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rmEqSsrE9IQ/TdYezfWaF4I/AAAAAAAAAkk/0GiAncbZZJU/s1600/Screen+shot+2011-05-20+at+9.56.37+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-rmEqSsrE9IQ/TdYezfWaF4I/AAAAAAAAAkk/0GiAncbZZJU/s1600/Screen+shot+2011-05-20+at+9.56.37+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Delete the sample file from the module, and add the documents that you want to automatically be part of the feature rollout. I copy the files using windows explorer to the appropriate place and the use the "show all documents"button in Visual Studio to include them in the project&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XQCILzUdST4/TdYgOU4XlRI/AAAAAAAAAko/8yN-ivFeLQo/s1600/Screen+shot+2011-05-20+at+9.47.54+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-XQCILzUdST4/TdYgOU4XlRI/AAAAAAAAAko/8yN-ivFeLQo/s1600/Screen+shot+2011-05-20+at+9.47.54+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once you have added all the required files and removed the sample file from your module, the elements.xml file of the module should look something like:&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;Module Name=&amp;quot;DemoDocumentContent&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;File Path=&amp;quot;DemoDocumentContent\demo1.docx&amp;quot; Url=&amp;quot;DemoDocumentContent/demo1.docx&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This needs to be modified so that the documents end up in the new library you are creating. First open up the elements.xml file of the list instance you created, and copy the Url attribute.&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;ListInstance Title=&amp;quot;Demo Documents&amp;quot;&lt;br /&gt;                OnQuickLaunch=&amp;quot;TRUE&amp;quot;&lt;br /&gt;                TemplateType=&amp;quot;101&amp;quot;&lt;br /&gt;                FeatureId=&amp;quot;00bfea71-e717-4e80-aa17-d0c71b360101&amp;quot;&lt;br /&gt;                Url=&amp;quot;Lists/DemoDocuments&amp;quot;&lt;br /&gt;                Description=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;/ListInstance&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now paste that Url attribute in the Module element of the elements.xml file for the module. Then remove all but the filename form any Url attributes of individual file elements in that file.&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;Module Name=&amp;quot;DemoDocumentContent&amp;quot; Url=&amp;quot;Lists/DemoDocuments&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;File Path=&amp;quot;DemoDocumentContent\demo1.docx&amp;quot; Url=&amp;quot;demo1.docx&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The next step is to add the Type="GhostableInLibrary" attribute, otherwise your files will not be visible in the browser.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Elements xmlns=&amp;quot;http://schemas.microsoft.com/sharepoint/&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;Module Name=&amp;quot;DemoDocumentContent&amp;quot; Url=&amp;quot;Lists/DemoDocuments&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;File Path=&amp;quot;DemoDocumentContent\demo1.docx&amp;quot; Url=&amp;quot;demo1.docx&amp;quot; Type=&amp;quot;GhostableInLibrary&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lastly you should rename the feature that Visual Studio created for you by default, fill in a Display name and optionally a description and ensure that the List instance and Module elements are included in the feature.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_Iovnzu3unU/TdYjn9SlAbI/AAAAAAAAAk4/-Yp_-mKwCgk/s1600/Screen+shot+2011-05-20+at+10.15.25+AM.png" imageanchor="1" sstyle="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-_Iovnzu3unU/TdYjn9SlAbI/AAAAAAAAAk4/-Yp_-mKwCgk/s1600/Screen+shot+2011-05-20+at+10.15.25+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When you deploy this solution to a SharePoint site, it will create a document library with the documents in it, as desired. &lt;br /&gt;&lt;br /&gt;In case you are working on a similar situation as I was and are creating this for demo purposes, there is one last very useful piece. That is cleanup. I have added a feature event receiver to my solution that deletes the document library when the feature is deactivated. This ensures that  the person delivering the training can very quickly recreate the document library with the initial content by deactivating and reactivating the feature. The code needed for this is:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public override void FeatureDeactivating(SPFeatureReceiverProperties properties)&lt;br /&gt;        {&lt;br /&gt;            //Delete the demo list with all content&lt;br /&gt;            if (properties.Feature.Parent is SPWeb)&lt;br /&gt;            {&lt;br /&gt;                SPWeb web = (SPWeb)properties.Feature.Parent;&lt;br /&gt;                SPList list = web.GetList("/Lists/DemoDocuments");&lt;br /&gt;                web.Lists.Delete(list.ID);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So to summarize, it is very easy to build a feature (which can run in the sandbox) that creates a document library including some default documents already in the library. The feature should be web scoped, include a list instance element and a module element with all the necessary content files. By changing the url parameter in the module we can ensure that the documents are placed in the new document library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-103922089494553308?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/103922089494553308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=103922089494553308' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/103922089494553308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/103922089494553308'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/05/deploying-document-library-including.html' title='Deploying a Document Library including content using a Feature'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gJwjv5HWJ3s/TdYd9TXa5wI/AAAAAAAAAkY/zaeXutVoE8w/s72-c/Screen+shot+2011-05-20+at+9.52.59+AM.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6298825119274531896</id><published>2011-05-08T20:46:00.001+02:00</published><updated>2011-05-08T20:48:10.548+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='motorcycle'/><title type='text'>Great Motorcycle Ride</title><content type='html'>Disclaimer: Not a SharePoint post&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mel and I took a fantastic ride on the motorbike today. For anyone in the Amsterdam area who rides motorcycles, here is a great trip:&lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Rijnstraat%2FVan+Woustraat&amp;amp;daddr=52.41734,4.82655+to:52.43252,4.75072+to:52.452073,4.7037861+to:52.494768,4.721006+to:52.524859,4.848406+to:52.50714,4.92979+to:52.4762152,4.9215885+to:Rijnstraat%2FVan+Woustraat&amp;amp;geocode=FVbJHgMduNRKAA%3BFTzTHwMdtqVJACmzsUQs3-LFRzHHz13xjfbHJg%3BFYgOIAMdgH1IACltiaVBtOTFRzGE-Thoc0_Ftg%3BFelaIAMdKsZHAClrPROFxfrFRzE7XvQYT1S53g%3BFbABIQMdbglIACnjaC0MT_rFRzEPMVElUpcVUw%3BFTt3IQMdFvtJACklzi29ZP7FRzGdLAsVdmD_yA%3BFQQyIQMd_jhLACkB16KpMQfGRzG0WXMR7Z_OaA%3BFTe5IAMd9BhLACmv6mYpCgfGRzFaherqGjgLSw%3BFWrJHgMdEtVKAA&amp;amp;hl=en&amp;amp;mra=dme&amp;amp;mrsp=8&amp;amp;sz=13&amp;amp;via=1,2,3,4,5,6,7&amp;amp;sll=52.370988,4.903851&amp;amp;sspn=0.08699,0.211315&amp;amp;ie=UTF8&amp;amp;ll=52.437595,4.853897&amp;amp;spn=0.200926,0.439453&amp;amp;z=11&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=d&amp;amp;source=embed&amp;amp;saddr=Rijnstraat%2FVan+Woustraat&amp;amp;daddr=52.41734,4.82655+to:52.43252,4.75072+to:52.452073,4.7037861+to:52.494768,4.721006+to:52.524859,4.848406+to:52.50714,4.92979+to:52.4762152,4.9215885+to:Rijnstraat%2FVan+Woustraat&amp;amp;geocode=FVbJHgMduNRKAA%3BFTzTHwMdtqVJACmzsUQs3-LFRzHHz13xjfbHJg%3BFYgOIAMdgH1IACltiaVBtOTFRzGE-Thoc0_Ftg%3BFelaIAMdKsZHAClrPROFxfrFRzE7XvQYT1S53g%3BFbABIQMdbglIACnjaC0MT_rFRzEPMVElUpcVUw%3BFTt3IQMdFvtJACklzi29ZP7FRzGdLAsVdmD_yA%3BFQQyIQMd_jhLACkB16KpMQfGRzG0WXMR7Z_OaA%3BFTe5IAMd9BhLACmv6mYpCgfGRzFaherqGjgLSw%3BFWrJHgMdEtVKAA&amp;amp;hl=en&amp;amp;mra=dme&amp;amp;mrsp=8&amp;amp;sz=13&amp;amp;via=1,2,3,4,5,6,7&amp;amp;sll=52.370988,4.903851&amp;amp;sspn=0.08699,0.211315&amp;amp;ie=UTF8&amp;amp;ll=52.437595,4.853897&amp;amp;spn=0.200926,0.439453&amp;amp;z=11" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6298825119274531896?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6298825119274531896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6298825119274531896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6298825119274531896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6298825119274531896'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/05/great-motorcycle-ride.html' title='Great Motorcycle Ride'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8218276910739647675</id><published>2011-04-28T19:38:00.001+02:00</published><updated>2011-05-11T13:05:01.791+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>XComplica SharePoint 2010 Usage File Analyzer</title><content type='html'>At my last &lt;a href="http://www.diwug.nl/"&gt;DIWUG&lt;/a&gt; talk I mentioned that the Web Analytics functionality in SharePoint 2010 begins with the WssTracing service creating .usage files in the 14\LOGS folder. These files are in some nice binary format and it would sometimes be nice if we could open these up for debugging purposes.&lt;br /&gt;&lt;br /&gt;So I cracked open reflector today and had a look at the code MS uses to import these files. A day later, and I created a little tool that reads these files and lets you have a look into them.&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://www.xcomplica.com/Downloads/UsageFileReader.zip"&gt;download&lt;/a&gt; the XComplica SharePoint 2010 Usage File Analyzer for free, and I am willing to share the (messy) source code if anyone wants. All at your own risk of course, this is just something I threw together in one day.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;UPDATE: The code is now on &lt;a href="http://xcusageanalyzer.codeplex.com/"&gt;Codeplex&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's quite self explanatory, grab a copy of the .usage file you are interested in, open it with the tool and you will see all the entries is a nice table. The fist column is clickable and shows the details of each row, since there are seven types of usage entries that the files contain. Simple but effective&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8218276910739647675?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8218276910739647675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8218276910739647675' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8218276910739647675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8218276910739647675'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/04/xcomplica-sharepoint-2010-usage-file.html' title='XComplica SharePoint 2010 Usage File Analyzer'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-976763132832836183</id><published>2011-04-28T11:04:00.001+02:00</published><updated>2011-04-28T11:10:12.774+02:00</updated><title type='text'>Nice surprise in my mailbox</title><content type='html'>I was awarded the Microsoft Community Contributor Award yesterday for the time I have spent in the forums. Thanks MS and whoever else may be responsible. I like new flair for my blog. Not quite at 37 pieces but working on it. :)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VOg3k3l0Xik/Tbku0nVQraI/AAAAAAAAAkU/dxnziJ9gJ8E/s1600/MCC11_Logo_Vertical_Full-color.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://3.bp.blogspot.com/-VOg3k3l0Xik/Tbku0nVQraI/AAAAAAAAAkU/dxnziJ9gJ8E/s320/MCC11_Logo_Vertical_Full-color.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-976763132832836183?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/976763132832836183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=976763132832836183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/976763132832836183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/976763132832836183'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/04/nice-surprise-in-my-mailbox.html' title='Nice surprise in my mailbox'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-VOg3k3l0Xik/Tbku0nVQraI/AAAAAAAAAkU/dxnziJ9gJ8E/s72-c/MCC11_Logo_Vertical_Full-color.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-567916028055299691</id><published>2011-04-14T19:31:00.000+02:00</published><updated>2011-04-14T19:31:05.564+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Speaking'/><title type='text'>Speaking at DIWUG</title><content type='html'>I will be speaking at our local user group (&lt;a href="http://www.diwug.nl"&gt;DIWUG&lt;/a&gt;) on the 26th of April. I will be talking about the built in Web Analytics in SharePoint 2010. For more info see the &lt;a href="http://www.diwug.nl/Pages/agenda.aspx"&gt;agenda&lt;/a&gt;. Should be a fun talk, I'll do my best to make it entertaining. &lt;br /&gt;&lt;br /&gt;If there is anything specific you want to see/hear, leave a comment or get me on twitter @jcapka&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-567916028055299691?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/567916028055299691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=567916028055299691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/567916028055299691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/567916028055299691'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/04/speaking-at-diwug.html' title='Speaking at DIWUG'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8345917917863624549</id><published>2011-03-16T18:06:00.000+01:00</published><updated>2011-03-16T18:06:08.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managed Metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>Copying Managed Metadata between site collections with code</title><content type='html'>I was recently writing an event handler on a list that was suposed to copy the contents of a list item form one site collection to another. The code was fairly simple except that the Managed Metadata columns would not copy.&lt;br /&gt;&lt;br /&gt;My first attempt was to simply copy the value of the taxonomy field from one list item to another, this worked for all the other fields in question, so why not?&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;//targetItem and sourceItem are SPListItem type&lt;br /&gt;targetItem["metaColumn"] = sourceItem["metaColumn"];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This didn't work. I then did a quick search and found (somewhere that I can't find now to give credit) that I had to use the SetFieldValue method of the TaxonomyField class to assign the value. Ok, so my next attempt was:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;TaxonomyFieldValue value = (TaxonomyFieldValue)sourceItem["metaColumn"];&lt;br /&gt;TaxonomyField taxTargetField = (TaxonomyField)targetItem.Fields.GetFieldByInternalName("metaColumn");&lt;br /&gt;taxTargetField.SetFieldValue(targetItem, value);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This didn't work either. I suspect this would have worked if the two list items were in the same site collection. &lt;br /&gt;&lt;br /&gt;The next attempt actually worked, and it went like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt; TaxonomyField taxTargetField = (TaxonomyField)targetItem.Fields.GetFieldByInternalName("metaColumn");&lt;br /&gt;&lt;br /&gt;TaxonomySession taxonomySession = new TaxonomySession(targetItem.Web.Site);&lt;br /&gt;TermStore termStore = taxonomySession.TermStores["ManagedMetadataService"];&lt;br /&gt;&lt;br /&gt;taxTargetField.SetFieldValue(targetItem, termStore.GetTerm(new Guid((sourceItem["metaColumn"] as TaxonomyFieldValue).TermGuid)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The main point to notice here is that I had to create a new reference to the term, using the context of the target site. So it seems that setting the value of a taxonomy field requires using a Term or TaxonomyFieldValue that is fetched out of a TaxonomySession from the same site as the field itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8345917917863624549?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8345917917863624549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8345917917863624549' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8345917917863624549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8345917917863624549'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/03/copying-managed-metadata-between-site.html' title='Copying Managed Metadata between site collections with code'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5921846855071366238</id><published>2011-03-10T19:31:00.000+01:00</published><updated>2011-03-10T19:31:58.499+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ViewState'/><title type='text'>Why I think ViewState is EVIL</title><content type='html'>The infamous ASP.NET ViewState has been with us for a long time now, and yet I often get the feeling that most developers have no idea how it really works. Over the years, I have told the following story to a number of developers, and while there are a number of articles on the web about this, I still keep seeing code that makes me cringe too often. Perhaps my post can add to the various articles and cause a critical mass that will once and for all put an end to ViewState. Or perhaps not. :)&lt;br /&gt;&lt;br /&gt;Enough rant, let's dive into the tech stuff. Take the code below, seems fairly common right? It should, I copied this from &lt;a href="http://msdn.microsoft.com/en-us/library/aa984258(v=vs.71).aspx"&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;private void Page_Load(object sender, System.EventArgs e)&lt;br /&gt;{&lt;br /&gt;   if (!Page.IsPostBack) &lt;br /&gt;   {&lt;br /&gt;      // Put user code here to initialize the data source &lt;br /&gt;      // (such as filling a dataset)&lt;br /&gt;      DataGrid1.DataBind();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's look at this code in detail. This is the page load event, it fires fairly early in the ASP.NET page life cycle, and it fires every time the page is loaded. This event includes a comment that suggests we need to add some code here to initialize data, but since that code can be expensive to run, it is cleverly wrapped in a condition that ensures it is only run the first time that page is loaded. The idea is sound, why go to the database for the same data over and over again right?&lt;br /&gt;&lt;br /&gt;Let's think about this a little more. When the page is loaded after a post back, the data needed for the datagrid is not fetched from the database, and the databind event is not called. (It can be called from an event handler, but not necessarily). So where does the data for the datagrid come from? In most solutions that use this type of code, that place is the ViewState. It is the most 'out-of-box' way to get a datagrid to work, and thus this code is quite prominent.&lt;br /&gt;&lt;br /&gt;Ok, so is there a problem? Yes, and a large one. First off, what is the ViewState really? Despite what many developers believe, it is not a magical property bag that makes your life easier, it is just a hidden input field in the html rendered to the client. Do a view-source on any asp.net web forms site and you'll find something like the following, except I cut out a lot of the VALUE:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;input id="__VIEWSTATE" name="__VIEWSTATE" type="hidden" value="/wEPD....2Lk=" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The VALUE that I cut, is actually an encoded version of all the data needed for the various controls that are set to use the ViewState.&lt;br /&gt;&lt;br /&gt;Let me repeat something at this point. The ViewState is a hidden input field in the html &lt;b&gt;rendered to the client&lt;/b&gt;. For those who think about performance, you should be realizing a problem. For all the rest of us, I present a picture:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-JJREUa-S9Xo/TXkVkRoeJaI/AAAAAAAAAjA/vjbgpLRN3Vs/s1600/viewstate_blog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="354" src="https://lh5.googleusercontent.com/-JJREUa-S9Xo/TXkVkRoeJaI/AAAAAAAAAjA/vjbgpLRN3Vs/s640/viewstate_blog.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this crude diagram you see the web server, the database server and the client which for illustration purposes I made a smart phone accessing your website. The connection between the web server and the database is drawn to be a fat pipe of wire, since they typically sit in the same data center that you have influence over. The connection between the web server and the phone is a 3G connection.&lt;br /&gt;&lt;br /&gt;What the code that we see at the beginning of this article does is as follows. The first time the phone request our site, the web server gets the data for the datagrid from the database server over the big fat pipe, generates the HTML including the ViewState and sends it down to the phone. That means that the data for the datagrid is not being sent to the client just once, but twice since once copy is in plaintext and the other copy is encoded in the ViewState. Worse yet, when the client decides to post back to the page for some reason, the web server needs the client to post the ViewState data back so that it can render the new HTML. This is really important to understand. Instead of getting the data for the datagrid from the database using a big fat pipe of a connection, we are getting it off a phone over a 3G connection. This is the worst place I can think of to be caching data. Again, instead of using a fast wired local connection to a fast database, we are fetching that data over a 3G connection from a slow smartphone.&lt;br /&gt;&lt;br /&gt;Now that you understand what is going on, here are some other not so small issues to consider.&lt;br /&gt;&lt;br /&gt;1) The ViewState is encoded. This means that every time the page is sent and received, it has to encode and decode the ViewState. It may not seem like much but I have seen this bring a server down at a large financial institution.&lt;br /&gt;&lt;br /&gt;2) In the current world of mobile internet, users do not appreciate when we send them large pages because we are using their phone or tablel as a data caching solution. First of all the pages are slow, and second, not everyone has an unlimited internet contract so extra kbs count!&lt;br /&gt;&lt;br /&gt;So what can you do? Turn off the ViewState. Guess what, you can get most of your website to work without it. There are some features of some ASP.NET controls that do need the ViewState but not that many. Personally I don't use those features and find alternatives. Still, most of ASP.NET works just fine without ViewState, but you do need to put a little extra work into it.&lt;br /&gt;&lt;br /&gt;Start by reading an&amp;nbsp;article&amp;nbsp;like this one detailing how ViewState works, and always question where your data comes from.&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic8"&gt;http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic8&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5921846855071366238?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5921846855071366238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5921846855071366238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5921846855071366238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5921846855071366238'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/03/why-i-think-viewstate-is-evil.html' title='Why I think ViewState is EVIL'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-JJREUa-S9Xo/TXkVkRoeJaI/AAAAAAAAAjA/vjbgpLRN3Vs/s72-c/viewstate_blog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5413535346785420418</id><published>2011-02-10T14:32:00.000+01:00</published><updated>2011-02-10T14:32:13.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>ASP MVC and SharePoint 2010</title><content type='html'>Ever since ASP MVC came out, I have been a huge fan. I love how MVC embraces the web instead of abstracting it like web forms do. Being a SharePoint guy however, I am currently stuck with web forms. Now I have to admit that web forms work great for an intranet data oriented solution, and this is also where SharePoint has a lot of strength. I however tend to focus on internet facing web sites where MVC is far superior in my opinion.&lt;br /&gt;&lt;br /&gt;It should come as no surprise that I have been wondering how to use MVC in SharePoint, and have tried a few things. There are a number of people who have done the same:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sharepointmvc.codeplex.com/"&gt;http://sharepointmvc.codeplex.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vspug.com/mbailey/files/2010/04/Using-ASP.NET-MVC-2-with-Sharepoint-Publishing.pdf"&gt;http://vspug.com/mbailey/files/2010/04/Using-ASP.NET-MVC-2-with-Sharepoint-Publishing.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and all are good efforts.&lt;br /&gt;&lt;br /&gt;Still, the efforts above all seem like fitting a square peg in a round hole. Not exactly elegant at all times, at least that is my feeling.&lt;br /&gt;&lt;br /&gt;So I took another approach at this and think it works quite well. The key, the SharePoint client object model. Yeah, it's that simple. Let me walk you through it.&lt;br /&gt;&lt;br /&gt;First, let's fire up Visual Studio and create a new MVC 2 project and make sure to choose .NET 3.5 in the&amp;nbsp;framework&amp;nbsp;drop down. &lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;NOT MVC 3! This is because SharePoint runs on .NET 3.5 so we are currently stuck MVC 2 and no Razor :(&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fDXhMulyYZw/TVPdVy1qOVI/AAAAAAAAAig/4Bgm9fZW-to/s1600/Screen+shot+2011-02-10+at+1.39.26+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-fDXhMulyYZw/TVPdVy1qOVI/AAAAAAAAAig/4Bgm9fZW-to/s1600/Screen+shot+2011-02-10+at+1.39.26+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Go though the wizard, create your app with or without a test project (as you wish) and get your MVC app running. Nothing new here.&lt;br /&gt;&lt;br /&gt;Now open up the Index view of the home controller, and ensure that the MainContent placeholder content looks like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;h2&amp;gt;&amp;lt;%= Html.Encode(ViewData["Message"]) %&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        To learn more about ASP.NET MVC visit &amp;lt;a href="http://asp.net/mvc" title="ASP.NET MVC Website"&amp;gt;http://asp.net/mvc&amp;lt;/a&amp;gt;.&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;img src="&amp;lt;%=ViewData["image"] %&amp;gt;" alt="" /&amp;gt;&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All this does is add an image tag that we will populate from the ViewData. For the rest it is the same as was generated by default. &lt;br /&gt;&lt;br /&gt;Now open up the Home controller and go to the Index action. Here we will add code to talk to SharePoint with the Client object model, and pull out some data.&lt;br /&gt;&lt;br /&gt;The code (this code is purely for illustrating a point, it is NOT production quality):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public ActionResult Index()&lt;br /&gt;        {&lt;br /&gt;            // get the client context&lt;br /&gt;            ClientContext clientContext = new ClientContext("http://yoursharepointsite.local");&lt;br /&gt;&lt;br /&gt;            // get the web reference&lt;br /&gt;            Web site = clientContext.Web;&lt;br /&gt;            clientContext.Load(site);&lt;br /&gt;       &lt;br /&gt;            // get the pages list reference&lt;br /&gt;            List pages = site.Lists.GetByTitle("Pages");&lt;br /&gt;            clientContext.Load(pages);&lt;br /&gt; &lt;br /&gt;            // get the item with ID 1&lt;br /&gt;            ListItem page = pages.GetItemById(1);&lt;br /&gt;            clientContext.Load(page);&lt;br /&gt;            clientContext.ExecuteQuery();&lt;br /&gt;&lt;br /&gt;            // fish out the property PublishingPageImage&lt;br /&gt;            string image = (string)page["PublishingPageImage"];&lt;br /&gt;            &lt;br /&gt;            // do some string magic to get the URL out of the property value&lt;br /&gt;            int start = image.IndexOf("src=\"")+5;&lt;br /&gt;            string imageUrl = image.Substring(start);&lt;br /&gt;            int end = imageUrl.IndexOf("\"");&lt;br /&gt;            imageUrl = imageUrl.Substring(0, end);&lt;br /&gt;            imageUrl = string.Format("{0}{1}", sourceSite, imageUrl);&lt;br /&gt;&lt;br /&gt;            // set the viewdata properties from the page item values&lt;br /&gt;            ViewData["Message"] = string.Format("Title: {0}", site.Title);&lt;br /&gt;            ViewData["Image"] = imageUrl;&lt;br /&gt;&lt;br /&gt;            return View();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's walk through it:&lt;br /&gt;&lt;br /&gt;First we create a client context from a sharepoint site. This particular code is going to a stie at http://yoursharepointsite.local, you need to change this. I should also point out that the SharePoint site at that URL is a standard SharePoint Publishing Portal.&lt;br /&gt;&lt;br /&gt;Next we get a reference to the root web, and then to a list called 'Pages' which should be familiar to anyone using SharePoint.&lt;br /&gt;&lt;br /&gt;Then we get the first item in that list, just using the ID.&lt;br /&gt;&lt;br /&gt;Since this is a standard Publishing Portal, we know that the content type this page uses has a field named 'PublishingPageImage' so we get the string value in this field. This value is the entire img tag which we don't necessarily want so we use a but of string magic to get just the value of the src element.&lt;br /&gt;&lt;br /&gt;Lastly we populate some ViewData properties with values we got from the list item.&lt;br /&gt;&lt;br /&gt;The magic happens when we run the MVC application. And I mean just run with F5 form Visual Studio. If all is well, you will see the following:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-a_Dm5PuJ5jQ/TVPmgiwE7QI/AAAAAAAAAik/2IrQPVPXGnM/s1600/Screen+shot+2011-02-10+at+2.09.20+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-a_Dm5PuJ5jQ/TVPmgiwE7QI/AAAAAAAAAik/2IrQPVPXGnM/s1600/Screen+shot+2011-02-10+at+2.09.20+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Recognize that image? And the title of my SharePoint site is 'Demo'. That you will have to believe. :)&lt;br /&gt;&lt;br /&gt;Now let me point out something. Note the URL in the browser. This site is not running as part of SharePoint, it is not even on the same server! It is running on the built in Visual Studio web server, so it could run pretty much anywhere. As long as the user who is running this code has access to the items on the SharePoint site, this MVC site can run wherever. So in case of an internet site, Just make sure you have your SharePoint site set up for anonymous access, and your MVC site will work just fine.&lt;br /&gt;&lt;br /&gt;This is an extremely simple demo example, just to get you started. Having thought about this for a bit, I think I would NOT enable anonymous access on my SharePoint site, and use a nice model in MVC to access SP as a specific user that is meant just for this purpose. This would involve some type of image handler so that images could be accessed by anonymous users, but that is not too hard to create. This approach combined with good caching could allow me to have an MVC site with content coming from SharePoint, but without the end user ever coming in contact with SharePoint. Another blog post perhaps....&lt;br /&gt;&lt;br /&gt;Hope this gets your imagination going on how we can get lean and clean HTML and still use SharePoint as a place to store and manage all the content which it is great for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5413535346785420418?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5413535346785420418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5413535346785420418' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5413535346785420418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5413535346785420418'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2011/02/asp-mvc-and-sharepoint-2010.html' title='ASP MVC and SharePoint 2010'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-fDXhMulyYZw/TVPdVy1qOVI/AAAAAAAAAig/4Bgm9fZW-to/s72-c/Screen+shot+2011-02-10+at+1.39.26+PM.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8512479858388557173</id><published>2010-12-15T15:41:00.000+01:00</published><updated>2010-12-15T15:41:52.993+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Powershell and ONET.XML gotchya</title><content type='html'>I have been suspecting this for some time now, but as of today I am sure that there is some funny caching going on in the PowerShell New-SPSite cmdlet. &lt;br /&gt;&lt;br /&gt;I was working on a custom site definition for SharePoint 2010, specifically I was messing around in the ONET.XML with web part placement. I had changed the layout of a page and needed to move my web parts to different zones. So I changed the WebPartZoneID attribute as usual, but I could not get it to work. My web parts were being inserted into the same old zone as before. I gave up eventually and thought I'd solve it another day. &lt;br /&gt;&lt;br /&gt;Today after a fresh boot, I redeployed my site again and all was working as expected. Huh?&lt;br /&gt;&lt;br /&gt;The way I was working the other day was that I had a PowerShell command line session open and I was simply issuing two commands to delete and create a new site based on my definition. Sometimes I would use the quick deploy method from CKSDEV and sometimes I would do a full deployement between these commands:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:powershell"&gt;Remove-SPSite http://myintranet&lt;br /&gt;&lt;br /&gt;New-SPSite http://myintranet -OwnerAlias XCOMPLICA\Joe -Template XCOMPLICA#0 &lt;br /&gt;&lt;/pre&gt;Regardless of what I did however, the New-SPSite command never picked up any changes I made to the ONET.XML file. I have now confirmed with a few more tests that I need to start up a new Powershell console for this to happen. I even tried iisreset and resetting all the app pools of SharePoint - no difference. It's cached somewhere in the cmdlet.&lt;br /&gt;&lt;br /&gt;I guess I am putting my commands in a script I can call from a batch file, or maybe I'll try doing something with Powershell scopes to resolve this.&lt;br /&gt;&lt;br /&gt;In any case beware of this caching, it cost me half a day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8512479858388557173?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8512479858388557173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8512479858388557173' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8512479858388557173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8512479858388557173'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/12/powershell-and-onetxml-gotchya.html' title='Powershell and ONET.XML gotchya'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-732829862996676694</id><published>2010-12-07T19:54:00.000+01:00</published><updated>2010-12-07T19:54:26.825+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Login'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='FBA'/><title type='text'>Nicer Claims Login Page SharePoint 2010</title><content type='html'>I have been working on a Forms Based Authentication (FBA) solution for an internet site and one of the requirements was the creation of a custom login page, one that will be somewhat more user friendly than the drop down page that SharePoint 2010 uses.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_IG48Kz86g3k/TP5ys-L045I/AAAAAAAAAiE/CwGSe_qrec4/s1600/oob_login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_IG48Kz86g3k/TP5ys-L045I/AAAAAAAAAiE/CwGSe_qrec4/s1600/oob_login.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Most internet users will have no clue what to do with the "choose your claims provider" drop down so we wanted to show a page with a username and password box where most users will enter their credentials. These will be authenticated against the SQL database backed FBA, exactly what needs to happen for internet users. However we also want to show a small link that will automatically log in our internal users with Windows authentication. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_IG48Kz86g3k/TP5xOi7MsMI/AAAAAAAAAiA/wh7nU7kgIx0/s1600/friendly_login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_IG48Kz86g3k/TP5xOi7MsMI/AAAAAAAAAiA/wh7nU7kgIx0/s1600/friendly_login.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is not too difficult but I can see myself needing this again thus the blog post.&lt;br /&gt;&lt;br /&gt;I started with following this blog post on &lt;a href="http://blogs.msdn.com/b/kaevans/archive/2010/07/09/creating-a-custom-login-page-for-sharepoint-2010.aspx"&gt;Creating a Custom Login Page for SharePoint 2010&lt;/a&gt; by Kirk Evans, which worked great. Following his instructions gets you to the point of having a login page for your FBA users. All you need now is that link for your internal users.&lt;br /&gt;&lt;br /&gt;First I modified the login control to make sure it goes against the correct Membership Provider, by adding the MembershipProvider attribute like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;asp:Login ID="signInControl" FailureText="&amp;lt;%$Resources:wss,login_pageFailureText%&amp;gt;" MembershipProvider="FBAMembershipProvider"&lt;br /&gt;        runat="server" Width="100%" DisplayRememberMe="false" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To be honest I'm not sure if that is needed, it just seemed logical to me.&lt;br /&gt;&lt;br /&gt;Next I added a LinkButton right under the login control so I had markup like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Login ID="signInControl" FailureText="&amp;lt;%$Resources:wss,login_pageFailureText%&amp;gt;" MembershipProvider="FBAMembershipProvider"&lt;br /&gt;        runat="server" Width="100%" DisplayRememberMe="false" /&amp;gt;&lt;br /&gt;&amp;lt;asp:LinkButton ID="hlInternalUsers" Text="Internal Login" runat="server" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;Lastly I added some simple code to the code beside file: (explanation below)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;        protected override void OnInit(EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnInit(e);&lt;br /&gt;            hlInternalUsers.Click += new EventHandler(hlInternalUsers_Click);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void hlInternalUsers_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            if (null != SPContext.Current &amp;&amp; null != SPContext.Current.Site)&lt;br /&gt;            {&lt;br /&gt;                SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];&lt;br /&gt;                if (null != iisSettings &amp;&amp; iisSettings.UseWindowsClaimsAuthenticationProvider)&lt;br /&gt;                {&lt;br /&gt;                    SPAuthenticationProvider provider = iisSettings.WindowsClaimsAuthenticationProvider;&lt;br /&gt;                    RedirectToLoginPage(provider);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        //borrowed from Microsoft.SharePoint.IdentityModel.LogonSelector&lt;br /&gt;        private void RedirectToLoginPage(SPAuthenticationProvider provider)&lt;br /&gt;        {&lt;br /&gt;            string components = HttpContext.Current.Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);&lt;br /&gt;            string url = provider.AuthenticationRedirectionUrl.ToString();&lt;br /&gt;            if (provider is SPWindowsAuthenticationProvider)&lt;br /&gt;            {&lt;br /&gt;                components = EnsureUrlSkipsFormsAuthModuleRedirection(components, true);&lt;br /&gt;            }&lt;br /&gt;            SPUtility.Redirect(url, SPRedirectFlags.Default, this.Context, components);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        //borrowed from Microsoft.SharePoint.Utilities.SPUtility&lt;br /&gt;        private string EnsureUrlSkipsFormsAuthModuleRedirection(string url, bool urlIsQueryStringOnly)&lt;br /&gt;        {&lt;br /&gt;            if (!url.Contains("ReturnUrl="))&lt;br /&gt;            {&lt;br /&gt;                if (urlIsQueryStringOnly)&lt;br /&gt;                {&lt;br /&gt;                    url = url + (string.IsNullOrEmpty(url) ? "" : "&amp;");&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    url = url + ((url.IndexOf('?') == -1) ? "?" : "&amp;");&lt;br /&gt;                }&lt;br /&gt;                url = url + "ReturnUrl=";&lt;br /&gt;            }&lt;br /&gt;            return url;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The link button has an event handler attached to its Click event. The event handler makes sure there is an SPContext to work with and then gets an SPIisSettings object for the Default Zone of the current site. You can change the zone here if needed. If the SPIisSettings object is succesfully retrieved, we can check if Windows Authenticatoin is being used by this zone. If not, our link makes no sense! Next we get the Windows Authentication provider and call a helper method that will redirect the user to the right place.&lt;br /&gt;&lt;br /&gt;The RedirectToLoginPage method is actually borrowed from the Microsoft.SharePoint.IdentityModel.LogonSelector class that is the control responsible for the drop down on the Out-of-box Claims logon page. As far as I can tell it plays with the urls so that the user is redirected to the correct login page (depending on the provider). Notice that this method uses yet another helper method, the EnsureUrlSkipsFormsAuthModuleRedirection method. This is a method borrowed from the SPUtility class, sadly it is internal so I just copied it out of reflector. You can use reflection if you want but I didn't want the performance hit. It just helps with some url magic.&lt;br /&gt;&lt;br /&gt;So with a few lines of our own code and a few borrowed thanks to reflector, we have a login page that is very simple for our internet FBA users but still allows our internal users to log in with Windows Auth by clicking a simple link.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-732829862996676694?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/732829862996676694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=732829862996676694' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/732829862996676694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/732829862996676694'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/12/nicer-claims-login-page-sharepoint-2010.html' title='Nicer Claims Login Page SharePoint 2010'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IG48Kz86g3k/TP5ys-L045I/AAAAAAAAAiE/CwGSe_qrec4/s72-c/oob_login.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1970572891200007252</id><published>2010-12-03T12:51:00.000+01:00</published><updated>2010-12-03T12:51:41.154+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parallels'/><category scheme='http://www.blogger.com/atom/ns#' term='#FAIL'/><title type='text'>Beware Parallels 6</title><content type='html'>I have been using Parallels virtualization for almost two years now, and I was completely happy with version 4 and 5. &amp;nbsp;VMs were stable and fast, no issues. Recently version 6 came out, and it has been a total piece of sh*t. &amp;nbsp;It has managed to destroy a number of VMs at this point from corrupting SharePoint dlls to making windows think it is no longer a genuine copy. I thought maybe I'd just create a clean install of W2K8 based on version 6 since sometimes VMs that are upgraded can have issues right? &amp;nbsp;Well I can't even install a fresh copy of W2K8 x64 with this version of Parallels! I get this lovely screen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_IG48Kz86g3k/TPjZqYzwv0I/AAAAAAAAAh8/9RSaJ5YwhpE/s1600/windows+install+p6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="522" src="http://2.bp.blogspot.com/_IG48Kz86g3k/TPjZqYzwv0I/AAAAAAAAAh8/9RSaJ5YwhpE/s640/windows+install+p6.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Completely useless to me now. I'm soooo glad I spent the €49.95 on it. If you have Parallels 5, DO NOT UPGRADE!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1970572891200007252?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1970572891200007252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1970572891200007252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1970572891200007252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1970572891200007252'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/12/beware-parallels-6.html' title='Beware Parallels 6'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IG48Kz86g3k/TPjZqYzwv0I/AAAAAAAAAh8/9RSaJ5YwhpE/s72-c/windows+install+p6.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8243950785540701381</id><published>2010-11-19T13:48:00.000+01:00</published><updated>2010-11-19T13:48:05.366+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XComplica'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><title type='text'>XComplica is hiring</title><content type='html'>I have had plans for a long time to grow my business, and the time to start hiring some help has come. See &lt;a href="http://www.xcomplica.com/careers"&gt;www.xcomplica.com/careers&lt;/a&gt; for more details. Spreading the word is appreciated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8243950785540701381?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8243950785540701381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8243950785540701381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8243950785540701381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8243950785540701381'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/11/xcomplica-is-hiring.html' title='XComplica is hiring'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3153916188881725158</id><published>2010-11-19T13:44:00.000+01:00</published><updated>2010-11-19T13:44:57.496+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='DIWUG'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>DIWUG Slides etc.</title><content type='html'>Yesterday I did a talk at the &lt;a href="http://www.diwug.nl/"&gt;Dutch Information Worker User Group (DIWUG)&lt;/a&gt;&amp;nbsp;about Practical Powershell for the SharePoint professional. As promised I am posting my slide deck as well as the scripts used.&lt;br /&gt;&lt;br /&gt;I've put all the material in a &lt;a href="http://www.xcomplica.com/Downloads/Powershell_DIWUG.zip"&gt;zip file&lt;/a&gt; that you can download. I've added all the files that I used for the demo yesterday plus a few scripts that I didn't get a chance to run but were mentioned in the slides. Note that these are very 'demo' scripts and have lots of stuff hardcoded, no error handling, etc. &amp;nbsp;The slide deck includes notes that should give you an idea of which commands I was running.&lt;br /&gt;&lt;br /&gt;Hope this helps someone out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3153916188881725158?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3153916188881725158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3153916188881725158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3153916188881725158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3153916188881725158'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/11/diwug-slides-etc.html' title='DIWUG Slides etc.'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7236849912384434722</id><published>2010-10-29T14:45:00.000+02:00</published><updated>2010-10-29T14:45:11.896+02:00</updated><title type='text'>Handy powershell script for "Data is Null" error</title><content type='html'>Earlier I blogged about a "Data is Null" error breaking the search in SharePoint 2010.&amp;nbsp;&lt;a href="http://jcapka.blogspot.com/2010/08/nasty-data-is-null-error-in-sharepoint.html"&gt;http://jcapka.blogspot.com/2010/08/nasty-data-is-null-error-in-sharepoint.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Seems that while we were on the right path, the cause of the problem was just a little off. &amp;nbsp;When creating a new site group through code, the parameter that was causing the problem is not the "default user" parameter but rather the "description" parameter. When the description is null, the search breaks.&lt;br /&gt;&lt;br /&gt;Microsoft has a fix (&lt;a href="http://support.microsoft.com/kb/2323206"&gt;http://support.microsoft.com/kb/2323206&lt;/a&gt;) on their website for updating the null description values and while the fix is perfectly valid, it is code and you may not be allowed to run this code in all cases. (Try getting approval to run a console app on a production machine). &amp;nbsp;So here is a small powershell script to help you fix the NULL descriptions.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ps"&gt;Function UpdateEmptyDescriptions($siteUrl)&lt;br /&gt;{&lt;br /&gt;        $site =  Get-SPSite $siteUrl&lt;br /&gt;        &lt;br /&gt;        $needupdate = $site.RootWeb.SiteGroups  | Where-Object {$_.Description -eq $NULL} &lt;br /&gt;        &lt;br /&gt;        If($needupdate)&lt;br /&gt;        {&lt;br /&gt;            Write-Host "Site Groups that are being updated"&lt;br /&gt;            Write-Output $needupdate | Format-Table Name&lt;br /&gt;            $needupdate | ForEach-Object{$_.Description = $_.Name}&lt;br /&gt;            $site.RootWeb.SiteGroups | % {$_.Update()}&lt;br /&gt;        }&lt;br /&gt;        Else&lt;br /&gt;        {&lt;br /&gt;            Write-Host "No Update Needed"&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;UpdateEmptyDescriptions("http://mysite.local")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7236849912384434722?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7236849912384434722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7236849912384434722' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7236849912384434722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7236849912384434722'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/10/handy-powershell-script-for-data-is.html' title='Handy powershell script for &quot;Data is Null&quot; error'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1569005312738031635</id><published>2010-10-29T11:51:00.000+02:00</published><updated>2010-10-29T11:51:27.579+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Funny'/><title type='text'>A moment of clarity</title><content type='html'>Today I had a moment of clarity when typing the name of a SharePoint assembly. I was getting Powershell ready to use with SharePoint and typed:&lt;br /&gt;&lt;br /&gt;Add-PSSnapin Microsoft.SharePoint.PowersHell&lt;br /&gt;&lt;br /&gt;Something caused me to hit the shift key at just the right moment, and I realized how wide SharePoint adoption is. &amp;nbsp; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1569005312738031635?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1569005312738031635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1569005312738031635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1569005312738031635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1569005312738031635'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/10/moment-of-clarity.html' title='A moment of clarity'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8731334262372303920</id><published>2010-10-15T13:34:00.000+02:00</published><updated>2010-10-15T13:34:18.124+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Publication'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Article on LINQ to SharePoint</title><content type='html'>I recently had an article published in the DIWUG SharePoint eMagazine, introducing LINQ to SharePoint. The magazine is a free download and has some great content so get yourself a copy at&amp;nbsp;&lt;a href="http://www.diwug.nl/Pages/downloads.aspx"&gt;http://www.diwug.nl/Pages/downloads.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8731334262372303920?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8731334262372303920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8731334262372303920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8731334262372303920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8731334262372303920'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/10/article-on-linq-to-sharepoint.html' title='Article on LINQ to SharePoint'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-335423263564207396</id><published>2010-09-22T16:31:00.000+02:00</published><updated>2010-09-22T16:31:43.663+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Run as Administrator'/><category scheme='http://www.blogger.com/atom/ns#' term='Permissions'/><title type='text'>Security Trap</title><content type='html'>I was working on a staging server today and wanted to create a new User Profile Service Application when I got stumped by a silly security issue. &amp;nbsp;I didn't have permissions to create any new Service Applications. Strangely though, I am a SharePoint farm administrator as well as a local admin on the web server I was using. So why did I see this?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_IG48Kz86g3k/TJoSNRuLsPI/AAAAAAAAAhw/RzEd1Tw7g3U/s1600/access+denied.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://1.bp.blogspot.com/_IG48Kz86g3k/TJoSNRuLsPI/AAAAAAAAAhw/RzEd1Tw7g3U/s640/access+denied.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It took me a few minutes to realize that I had opened the browser and entered the url of the central admin by hand, instead of using the shortcut to Central Admin in the start menu. This is not a problem, except that I had not chosen to run IE as an administrator, and so I didn't have the necessary rights to create the Service Application. Once I opened up another instance of IE using the 'Run As Administrator' option, all was well again. So if you are in the habit of not using the start menu shortcut to Central Admin, remember that running IE as a regular user will not work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-335423263564207396?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/335423263564207396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=335423263564207396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/335423263564207396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/335423263564207396'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/09/security-trap.html' title='Security Trap'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IG48Kz86g3k/TJoSNRuLsPI/AAAAAAAAAhw/RzEd1Tw7g3U/s72-c/access+denied.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8742346458014207189</id><published>2010-09-21T18:10:00.000+02:00</published><updated>2010-09-21T18:10:59.463+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Custom Field'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Metadata Filtered Lookup Field</title><content type='html'>SharePoint lookup fields are not the most friendly when working with a large list of data. What I mean is, if you have a list of 1000 items that you need to choose from using a lookup, you get a not so fun experience as seen below.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_IG48Kz86g3k/TJjX2Ywf7uI/AAAAAAAAAho/GU6lIUj4i_8/s1600/RegularLookup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_IG48Kz86g3k/TJjX2Ywf7uI/AAAAAAAAAho/GU6lIUj4i_8/s1600/RegularLookup.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Trying to find the right item here can be a real pain. This is not a new pain however, and people have worked around this. A great example can be found here:&amp;nbsp;&lt;a href="http://ilovesharepoint.codeplex.com/"&gt;http://ilovesharepoint.codeplex.com/&lt;/a&gt;&amp;nbsp;These folks have created a lookup field that allows searching and filtering of the lookup data.&lt;br /&gt;&lt;br /&gt;My needs were somewhat different, and so I set out to create a custom field. Specifically, I needed a field that would let the end user filter the lookup items based on metadata tags applied to the lookup items.&lt;br /&gt;&lt;br /&gt;Let's use an imaginary scenario: We are a special breed of tourist, we travel the world looking for ice cream. We document our travels using SharePoint. Every trip we take, we document by adding an item to a list of trips. One of the fields in this list is a lookup for an ice cream vendor. This lookup points to&amp;nbsp;a list of ice cream vendors from around the world, and that list has grown to be quite large. We do however have metadata on those ice cream vendors, and you would like to only see relevant ice cream vendors based on the country they are located in and the flavor of ice cream they sell.&lt;br /&gt;&lt;br /&gt;Introducing the Metadata Filtered Lookup Field. This field inherits from a regular lookup field, but presents a different user interface. It lets the user enter a few tags which then filter the list of options to choose from. The field looks at the target list, figures out what metadata is being used to tag the items and presents the user with a tag select box for each term set that is in use. In our example, this means that choosing an ice cream vendor will let us enter countries and flavors as filter criteria. See below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_IG48Kz86g3k/TJjQWLbPARI/AAAAAAAAAgo/txojneTvhug/s1600/mff1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="633" src="http://2.bp.blogspot.com/_IG48Kz86g3k/TJjQWLbPARI/AAAAAAAAAgo/txojneTvhug/s640/mff1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We now enter a term, click refresh, and we see the options that have been tagged with this term. So we see three ice cream vendors that sell banana ice cream.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_IG48Kz86g3k/TJjQwNV691I/AAAAAAAAAgw/je-yOGD64Sw/s1600/mff2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="630" src="http://1.bp.blogspot.com/_IG48Kz86g3k/TJjQwNV691I/AAAAAAAAAgw/je-yOGD64Sw/s640/mff2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We can add some more terms, click refresh and see that more options are showing up. So we see that there are six vendors selling banana or chocolate ice cream or are in Germany. This is important, the tags are ORed together, so the result set grows as more tags are added.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_IG48Kz86g3k/TJjR0b0bLDI/AAAAAAAAAhA/WloUhFcX1WM/s1600/mff3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="634" src="http://3.bp.blogspot.com/_IG48Kz86g3k/TJjR0b0bLDI/AAAAAAAAAhA/WloUhFcX1WM/s640/mff3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next we select a few items (in a singe select lookup, only one is selectable at a time) and click save.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_IG48Kz86g3k/TJjTU3CXuxI/AAAAAAAAAhI/5rfJ45Q5YIc/s1600/mff4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="590" src="http://1.bp.blogspot.com/_IG48Kz86g3k/TJjTU3CXuxI/AAAAAAAAAhI/5rfJ45Q5YIc/s640/mff4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Looking at the list item, we can now see that we had selected "Ice Cream Heaven", "The Parlour" and "Das Cream".&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_IG48Kz86g3k/TJjTu5SCpPI/AAAAAAAAAhQ/yX5hYOVeDno/s1600/mff5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://4.bp.blogspot.com/_IG48Kz86g3k/TJjTu5SCpPI/AAAAAAAAAhQ/yX5hYOVeDno/s640/mff5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Cool no? &amp;nbsp;Let's look at one more thing: What happens when we edit this item?&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_IG48Kz86g3k/TJjVpQoAcoI/AAAAAAAAAhg/oCtyndYeOQg/s1600/mff6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="588" src="http://4.bp.blogspot.com/_IG48Kz86g3k/TJjVpQoAcoI/AAAAAAAAAhg/oCtyndYeOQg/s640/mff6.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we open up the same item, we will notice that a bunch of tags have been pre-populated, along with some checked and not checked items. What is up here? The design decision I made was that an editor should always be able to see the already selected items. Otherwise it would be very difficult to un-select items. So what happens here is that the all the tags of the selected items are used to pre-populate the metadata selection boxes. Since these tags can also be used with other items, the result set that we see also includes some unselected items. This may seem strange at first, but it is actually a useful feature since the unselected items are likely to be related to the selected items, and thus likely items the user is looking for!&lt;br /&gt;&lt;br /&gt;I have packaged this field up as a wsp solution that is available at Codeplex: &lt;a href="http://metafilteredfield.codeplex.com/"&gt;http://metafilteredfield.codeplex.com/&lt;/a&gt;&amp;nbsp;The source is also available and if someone wants to work on this I will be happy to give you access to the repository.&lt;br /&gt;&lt;br /&gt;There is one limitation to the field that I have noticed. The out of box lookups allow you to specify 'additional fields' that are created in the list. This field also has that option, but it doesn't work at the moment.&lt;br /&gt;&lt;br /&gt;Lastly, I have tested this to a certain degree, but make sure to do your own tests, especially performance tests before you deploy this into production.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8742346458014207189?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8742346458014207189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8742346458014207189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8742346458014207189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8742346458014207189'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/09/metadata-filtered-lookup-field.html' title='Metadata Filtered Lookup Field'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IG48Kz86g3k/TJjX2Ywf7uI/AAAAAAAAAho/GU6lIUj4i_8/s72-c/RegularLookup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5268300657800105909</id><published>2010-08-23T18:22:00.003+02:00</published><updated>2010-10-29T14:33:08.851+02:00</updated><title type='text'>Nasty "Data is Null" error in SharePoint 2010 Search</title><content type='html'>For the last few weeks my team has been struggling with a nasty error that showed up after we performed a search crawl on our SharePoint site. The site has a number of customizations and along the way we managed to do something that resulted in the following error showing up in the crawl log:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;The SharePoint item being crawled returned an error when requesting data from the web service. ( Error from SharePoint site: Data is Null. This method or property cannot be called on Null values. )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Almost as useless as the "Unknown error" message. We got talking to Microsoft PSS, they were stumped too, and are currently poring over our log files and trace dumps. In the meantime I think I have found the code that was causing this error.&lt;br /&gt;&lt;br /&gt;In one of our features, we use an event receiver to create a number of security groups. The following line was in there:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;Web.SiteGroups.Add(groupName, owner, null, null);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Web is an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SPWeb&lt;/span&gt;, groupName is a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;string&lt;/span&gt; and owner is an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SPPrincipal&lt;/span&gt;. These are not relevant here. The third parameter in the Add method is the "default user". It was not very clear to me what this was, and since we just wanted empty security groups that the client can fill when we deliver the product, I thought it would be fine to leave that parameter as null. While the code compiles, runs and as far as I can tell creates the security groups just fine, it is what causes that nasty error in the crawl log. I should mention that the error actually causes the crawl to fail and thus breaks search altogether, so it's a big one.&lt;br /&gt;&lt;br /&gt;Once I changed the third parameter to a valid SPUser, all was well again. &lt;br /&gt;&lt;br /&gt;If you get this error message, I strongly advise you to check what SharePoint API calls you are making that are passing null as a parameter, and then try to eliminate them one by one.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;UPDATE:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;It seems that the "default user" parameter is not the culprit here after all, but the fourth parameter is the one that actually causes this error. This is a description parameter, and even an empty string is OK. See this Microsoft Support article&lt;/span&gt;&amp;nbsp;&lt;a href="http://support.microsoft.com/kb/2323206"&gt;http://support.microsoft.com/kb/2323206&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5268300657800105909?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5268300657800105909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5268300657800105909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5268300657800105909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5268300657800105909'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/08/nasty-data-is-null-error-in-sharepoint.html' title='Nasty &quot;Data is Null&quot; error in SharePoint 2010 Search'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7209741738113770524</id><published>2010-08-19T13:34:00.001+02:00</published><updated>2010-08-19T13:35:16.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managed Metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Geography'/><title type='text'>Managed Metadata Countries</title><content type='html'>I spent some time on this the other day and thought others might find this useful. I needed a list of all the countries in the world as SharePoint Managed Metadata. So I grabbed the list of countries from &lt;a href="http://en.wikipedia.org/wiki/List_of_countries_and_territories_by_continent"&gt;Wikipedia&lt;/a&gt; and cleaned it up in Excel so that it can be imported into the Managed Metadata Service Application in SharePoint 2010. You can download it &lt;a href="http://www.xcomplica.com/downloads/geography.csv"&gt;here&lt;/a&gt;. Enjoy!&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7209741738113770524?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7209741738113770524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7209741738113770524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7209741738113770524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7209741738113770524'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/08/managed-metadata-countries.html' title='Managed Metadata Countries'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4472061325918887074</id><published>2010-06-30T12:40:00.001+02:00</published><updated>2011-04-20T17:43:01.718+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Strange SPANs in SharePoint 2010 Team Site</title><content type='html'>My colleague and I came across something quite strange yesterday and I think it's worth sharing. We were inspecting the HTML source of a SharePoint 2010 Out-Of-Box Team Site and found this at the end of the file:&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/pre&gt;For those who are not HMTL savvy, this is not valid HTML. &lt;br /&gt;&lt;br /&gt;We are trying to look into what the cause of this could be, but so far no luck. If anyone has any idea as to what these spans are for or where they come from, I am very interested!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Update&lt;/span&gt;:&amp;nbsp;There is now a fix for this from Wictor Wilén, see his &lt;a href="http://www.wictorwilen.se/Post/Get-rid-of-the-annoying-SPAN-tags-in-SharePoint-2010-pages.aspx"&gt;blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4472061325918887074?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4472061325918887074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4472061325918887074' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4472061325918887074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4472061325918887074'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/06/strange-spans-in-sharepoint-2010-team.html' title='Strange SPANs in SharePoint 2010 Team Site'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6965482204466402053</id><published>2010-06-06T16:34:00.003+02:00</published><updated>2010-06-06T16:44:47.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XsltListViewWebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Connecting XsltListViewWebParts together in code</title><content type='html'>Last week a client ran into some trouble trying to connect two XsltListViewWebParts (XLV) together using a feature receiver. Google yielded little so I thought I'd blog about it.&lt;br /&gt;&lt;br /&gt;Assume that we have two lists. One list is called Categories and the other list is called Items. The Items list has a lookup field to the Categories list Title field, and the name of the lookup field is Category.&lt;br /&gt;&lt;br /&gt;First, the two web parts need to be added to a web part page, in our case inside a module.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;Elements xmlns="http://schemas.microsoft.com/sharepoint/"&amp;gt;&lt;br /&gt;  &amp;lt;Module Name="WebPartModule"&amp;gt;&lt;br /&gt;    &amp;lt;File Path="WebPartModule\default.aspx" Url="default.aspx" &amp;gt;&lt;br /&gt;      &amp;lt;View List="$Resources:core,lists_Folder;/Categories" Url="" BaseViewID="0" WebPartZoneID="_RightColumn" WebPartOrder="3" ID="wpCategories" &amp;gt;&lt;br /&gt;        &amp;lt;![CDATA[&lt;br /&gt;              &amp;lt;webParts&amp;gt;&lt;br /&gt;                  &amp;lt;webPart xmlns="http://schemas.microsoft.com/WebPart/v3"&amp;gt;&lt;br /&gt;                      &amp;lt;metaData&amp;gt;&lt;br /&gt;                          &amp;lt;type name="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" /&amp;gt;&lt;br /&gt;                          &amp;lt;importErrorMessage&amp;gt;Cannot import this Web Part.&amp;lt;/importErrorMessage&amp;gt;&lt;br /&gt;                      &amp;lt;/metaData&amp;gt;&lt;br /&gt;                      &amp;lt;data&amp;gt;&lt;br /&gt;                          &amp;lt;properties&amp;gt;&lt;br /&gt;                              &amp;lt;property name="AllowConnect" type="bool"&amp;gt;True&amp;lt;/property&amp;gt;&lt;br /&gt;                              &amp;lt;property name="ChromeType" type="chrometype"&amp;gt;Default&amp;lt;/property&amp;gt;&lt;br /&gt;                              &amp;lt;property name="AllowClose" type="bool"&amp;gt;False&amp;lt;/property&amp;gt;&lt;br /&gt;                          &amp;lt;/properties&amp;gt;&lt;br /&gt;                      &amp;lt;/data&amp;gt;&lt;br /&gt;                  &amp;lt;/webPart&amp;gt;&lt;br /&gt;              &amp;lt;/webParts&amp;gt;&lt;br /&gt;          ]]&amp;gt;&lt;br /&gt;      &amp;lt;/View&amp;gt;&lt;br /&gt;      &amp;lt;View List="$Resources:core,lists_Folder;/Items" Url="" BaseViewID="0" WebPartZoneID="_LeftColumn" WebPartOrder="1" ID="wpItems"&amp;gt;&lt;br /&gt;        &amp;lt;![CDATA[&lt;br /&gt;              &amp;lt;webParts&amp;gt;&lt;br /&gt;                  &amp;lt;webPart xmlns="http://schemas.microsoft.com/WebPart/v3"&amp;gt;&lt;br /&gt;                      &amp;lt;metaData&amp;gt;&lt;br /&gt;                          &amp;lt;type name="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" /&amp;gt;&lt;br /&gt;                          &amp;lt;importErrorMessage&amp;gt;Cannot import this Web Part.&amp;lt;/importErrorMessage&amp;gt;&lt;br /&gt;                      &amp;lt;/metaData&amp;gt;&lt;br /&gt;                      &amp;lt;data&amp;gt;&lt;br /&gt;                          &amp;lt;properties&amp;gt;&lt;br /&gt;                              &amp;lt;property name="AllowConnect" type="bool"&amp;gt;True&amp;lt;/property&amp;gt;&lt;br /&gt;                              &amp;lt;property name="ChromeType" type="chrometype"&amp;gt;Default&amp;lt;/property&amp;gt;&lt;br /&gt;                              &amp;lt;property name="AllowClose" type="bool"&amp;gt;False&amp;lt;/property&amp;gt;&lt;br /&gt;                          &amp;lt;/properties&amp;gt;&lt;br /&gt;                      &amp;lt;/data&amp;gt;&lt;br /&gt;                  &amp;lt;/webPart&amp;gt;&lt;br /&gt;              &amp;lt;/webParts&amp;gt;&lt;br /&gt;          ]]&amp;gt;&lt;br /&gt;      &amp;lt;/View&amp;gt;&lt;br /&gt;    &amp;lt;/File&amp;gt;&lt;br /&gt;  &amp;lt;/Module&amp;gt;&lt;br /&gt;&amp;lt;/Elements&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As configured here, there would be two XLV web parts places on the default.aspx file. What is important to notice here is that the View elements have an ID attribute which we are setting to something recognizable. This will be important later.&lt;br /&gt;&lt;br /&gt;The next step in the puzzle is to create the connection between the web parts. I have seen samples that do this in XML, but I am not sure how that can be done for the XLV and we chose to write code in the feature receiver that accomplished this.&lt;br /&gt;&lt;br /&gt;First we get an instance of the limited web part manager class for the page that we added these web parts to. In our case it is the default.aspx page. We then use the IDs form the XML as noted above to retrieve the web parts themselves.  Without this ID, we don't have a robust way of fetching the web parts out of the collection.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;// Get the web object form the feature properties&lt;br /&gt;SPWeb web = (SPWeb)properties.Feature.Parent;&lt;br /&gt;&lt;br /&gt;// Get the webpart manager&lt;br /&gt;SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared);&lt;br /&gt;&lt;br /&gt;// Get the webpart by id&lt;br /&gt;System.Web.UI.WebControls.WebParts.WebPart providerWebPart = webPartManager.WebParts["wpCategories"];&lt;br /&gt;System.Web.UI.WebControls.WebParts.WebPart consumerWebPart = webPartManager.WebParts["wpItems"];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next we need to get the connection points of the web parts. This is where things start to get interesting. The XLV exposes two consumer connection points and two provider connection points. I used powershell to have a look at the connection points, and the result is the following:&lt;br /&gt;&lt;br /&gt;Provider:&lt;br /&gt;&lt;br /&gt;AllowsMultipleConnections : True&lt;br /&gt;ControlType               : Microsoft.SharePoint.WebPartPages.XsltListViewWebPart&lt;br /&gt;InterfaceType             : System.Web.UI.WebControls.WebParts.IWebPartTable&lt;br /&gt;ID                        : TableProvider&lt;br /&gt;DisplayName               : Table&lt;br /&gt;&lt;br /&gt;AllowsMultipleConnections : True&lt;br /&gt;ControlType               : Microsoft.SharePoint.WebPartPages.XsltListViewWebPart&lt;br /&gt;InterfaceType             : System.Web.UI.WebControls.WebParts.IWebPartRow&lt;br /&gt;ID                        : DFWP Row Provider ID&lt;br /&gt;DisplayName               : Row of Data&lt;br /&gt;&lt;br /&gt;Consumer:&lt;br /&gt;&lt;br /&gt;AllowsMultipleConnections : True&lt;br /&gt;ControlType               : Microsoft.SharePoint.WebPartPages.XsltListViewWebPart&lt;br /&gt;InterfaceType             : System.Web.UI.WebControls.WebParts.IWebPartParameters&lt;br /&gt;ID                        : DFWP Parameter Consumer ID&lt;br /&gt;DisplayName               : Parameters&lt;br /&gt;&lt;br /&gt;AllowsMultipleConnections : True&lt;br /&gt;ControlType               : Microsoft.SharePoint.WebPartPages.XsltListViewWebPart&lt;br /&gt;InterfaceType             : System.Web.UI.WebControls.WebParts.IWebPartParameters&lt;br /&gt;ID                        : DFWP Filter Consumer ID&lt;br /&gt;DisplayName               : Filter Values&lt;br /&gt;&lt;br /&gt;I will be honest and admit that I don't know what all of them are intended to do. However when we connected the web parts by hand in the UI, I noticed that we were using the 'Filter Values' connection point and the 'Row of Data' connection point. Thus I know we need to use these in the code.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;// Get the connection point for the consumer.&lt;br /&gt;System.Web.UI.WebControls.WebParts.ConsumerConnectionPointCollection consumerConnections =&lt;br /&gt; webPartManager.GetConsumerConnectionPoints(consumerWebPart);&lt;br /&gt;ConsumerConnectionPoint consumerConnection = consumerConnections["DFWP Filter Consumer ID"];&lt;br /&gt;&lt;br /&gt;// Get the connection point for the provider.&lt;br /&gt;System.Web.UI.WebControls.WebParts.ProviderConnectionPointCollection providerConnections =&lt;br /&gt; webPartManager.GetProviderConnectionPoints(providerWebPart);&lt;br /&gt;ProviderConnectionPoint providerConnection = providerConnections["DFWP Row Provider ID"];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that we have the connection points, we want to use the LimitedWebPartManager to create a connection and save it to the collection of connections. This will not work without one extra step however, since the provider and consumer interfaces are not compatible. The exact error that you will see is:&lt;br /&gt;&lt;br /&gt;The provider connection point "Row of Data" on "wpCategories" and the consumer connection point "Filter Values" on "wpItems" do not use the same connection interface.&lt;br /&gt;&lt;br /&gt;In order to make this work, we need to create an instance of a RowToParametersTransformer, and pass it the field names that we want to map. If you remember, we had a lookup field named Category in the items list, and it pointed to the Title field in the Categories list. So we want to map these field in the connection.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;// Get a new  RowToParametersTransformer object.&lt;br /&gt;RowToParametersTransformer trans = new RowToParametersTransformer();&lt;br /&gt;trans.ConsumerFieldNames = new string[] {"Category"};&lt;br /&gt;trans.ProviderFieldNames = new string[] {"Title"};&lt;br /&gt;&lt;br /&gt;// Get a new connection using the 2 connection points.&lt;br /&gt;Microsoft.SharePoint.WebPartPages.SPWebPartConnection newConnection =&lt;br /&gt; webPartManager.SPConnectWebParts(&lt;br /&gt;  providerWebPart, providerConnection,&lt;br /&gt;  consumerWebPart, consumerConnection, trans);&lt;br /&gt;&lt;br /&gt;// Add the new connection&lt;br /&gt;webPartManager.SPWebPartConnections.Add(newConnection);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It took us a while to figure this one out, the RowToParametersTransformer threw us for a loop. Hope it helps someone out there.&lt;br /&gt;&lt;br /&gt;The complete code for easier reading:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;// Get the web object form the feature properties&lt;br /&gt;SPWeb web = (SPWeb)properties.Feature.Parent;&lt;br /&gt;&lt;br /&gt;// Get the webpart manager&lt;br /&gt;SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared);&lt;br /&gt;&lt;br /&gt;// Get the webpart by id&lt;br /&gt;System.Web.UI.WebControls.WebParts.WebPart providerWebPart = webPartManager.WebParts["wpCategories"];&lt;br /&gt;System.Web.UI.WebControls.WebParts.WebPart consumerWebPart = webPartManager.WebParts["wpItems"];&lt;br /&gt;&lt;br /&gt;// Get the connection point for the consumer.&lt;br /&gt;System.Web.UI.WebControls.WebParts.ConsumerConnectionPointCollection consumerConnections =&lt;br /&gt; webPartManager.GetConsumerConnectionPoints(consumerWebPart);&lt;br /&gt;ConsumerConnectionPoint consumerConnection = consumerConnections["DFWP Filter Consumer ID"];&lt;br /&gt;&lt;br /&gt;// Get the connection point for the provider.&lt;br /&gt;System.Web.UI.WebControls.WebParts.ProviderConnectionPointCollection providerConnections =&lt;br /&gt; webPartManager.GetProviderConnectionPoints(providerWebPart);&lt;br /&gt;ProviderConnectionPoint providerConnection = providerConnections["DFWP Row Provider ID"];&lt;br /&gt;&lt;br /&gt;// Get a new  RowToParametersTransformer object.&lt;br /&gt;RowToParametersTransformer trans = new RowToParametersTransformer();&lt;br /&gt;trans.ConsumerFieldNames = new string[] {"Category"};&lt;br /&gt;trans.ProviderFieldNames = new string[] {"Title"};&lt;br /&gt;&lt;br /&gt;// Get a new connection using the 2 connection points.&lt;br /&gt;Microsoft.SharePoint.WebPartPages.SPWebPartConnection newConnection =&lt;br /&gt; webPartManager.SPConnectWebParts(&lt;br /&gt;  providerWebPart, providerConnection,&lt;br /&gt;  consumerWebPart, consumerConnection, trans);&lt;br /&gt;&lt;br /&gt;// Add the new connection&lt;br /&gt;webPartManager.SPWebPartConnections.Add(newConnection);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6965482204466402053?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6965482204466402053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6965482204466402053' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6965482204466402053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6965482204466402053'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/06/connecting-xsltlistviewwebparts.html' title='Connecting XsltListViewWebParts together in code'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1702445071617639474</id><published>2010-05-30T21:39:00.004+02:00</published><updated>2010-06-04T14:18:39.829+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Linq to SharePoint for Anonymous users performance Part 2</title><content type='html'>Recently I posted about the bad performance of LINQ to SharePoint when using my anonymous users hack.  Well I did some more testing and it turns out that my first test was much too premature. It seems that the statistics I was seeing were due to something entirely different, I am guessing the internal implementation of Linq to SharePoint vs CAML queries, but that is pure speculation. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First I will introduce 2 acronyms because I am a lazy typist:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L2SP - Linq to SharePoint&lt;/div&gt;&lt;div&gt;AL2SP - Anonymous Linq to SharePoint (Uses the workaround I suggested previously)&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My recent testing was a bit more structured and thought out, and it showed that there is actually virtually no difference in using L2SP and my AL2SP work-around.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I set up two tests, one was reading all the items from a small list of 20 items 100 times consecutively, an attempt at simulating many web requests of a small list. The second test involved a large list of 5000 items, where each item was named with a random string. The query here was to pull out the top 100 items when ordered by name, thus simulating a random read of items from a large list.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In each test, the Title property of the first list item would be accessed in order to ensure that the retrieved items would be used by the test code and the query would have to run.  I noticed that running a CAML query was much too fast before I added this, I suspect there is some clever optimization that skips the query if the results don't get used.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I ran these tests for a signed in user, in which case the code uses L2SP and old school CAML query.  I then repeated the tests for an anonymous user which then uses AL2SP and old school CAML query.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are the results: The user using IE is logged in and the Chrome user is anonymous.&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_IG48Kz86g3k/TALCTWO-zZI/AAAAAAAAAfg/SlR_c35HLco/s1600/Screen+shot+2010-05-29+at+11.01.37+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5477153734477663634" src="http://4.bp.blogspot.com/_IG48Kz86g3k/TALCTWO-zZI/AAAAAAAAAfg/SlR_c35HLco/s400/Screen+shot+2010-05-29+at+11.01.37+PM.png" style="cursor: hand; cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 352px;" /&gt;&lt;/a&gt;It is interesting to note that the CAML query does a better job in the 100 times operation, I suspect that there is some cost to setting up the Linq data context and translating the Linq query.  However Linq does a much better job in the large list test. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most important however is that the test results are pretty much the same for AL2SP and L2SP. This means that performance is NOT a problem when using AL2SP. I am curious if any other issues come up with this technique but it looks like it is back in my bag of tricks!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to run the tests I created yourself, I have put the &lt;a href="http://www.xcomplica.com/Content/Downloads/linq2spperformance.zip"&gt;source code here&lt;/a&gt;. If you deploy the solution, you get the two lists created and you just need to place the test web part somewhere in the same site.  Note that the code was meant just for this test, so it can easily fail if used otherwise. Also note that the feature activation takes a while since it created a list with 5000 items.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1702445071617639474?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1702445071617639474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1702445071617639474' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1702445071617639474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1702445071617639474'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/05/linq-to-sharepoint-for-anonymous-users_30.html' title='Linq to SharePoint for Anonymous users performance Part 2'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IG48Kz86g3k/TALCTWO-zZI/AAAAAAAAAfg/SlR_c35HLco/s72-c/Screen+shot+2010-05-29+at+11.01.37+PM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2839898576605001053</id><published>2010-05-26T18:51:00.004+02:00</published><updated>2010-05-29T22:48:10.505+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Linq to SharePoint for Anonymous users performance</title><content type='html'>&lt;span style="color:red;"&gt;UPDATE: I have been doing some more testing and I am coming to some results that are very different from my initial quick test here. I will have a post about it soon, but for now I'll say that the performance seems to be more than acceptable.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Not that long ago, I was happy to post that I figured out a way to run Linq to SharePoint for an anonymous user. I have some bad news for those who want to use it. I had a quick chat with &lt;a href="http://blog.mastykarz.nl/"&gt;Waldek Mastykarz&lt;/a&gt; the other day at a &lt;a href="http://www.diwug.nl/"&gt;DIWUG&lt;/a&gt; event and I realized why he wasn't quite as excited about my solution as I was. There is quite a performance hit incurred when switching to a secure context, and my solution requires that this is done for all operations, including read operations. With the old CAML query approach, reads can be done without the context switch.&lt;br /&gt;&lt;br /&gt;Today I wanted to get an idea of how much this performance hit really would be. So I put together a very quick (and probably not perfect) test. I won't post the code here just yet, but suffice to say that one section of the code ran the Linq query with my "solution" and the other just ran a CAML query the old fashioned way. Each section ran 100 times and used a stopwatch to measure execution time.&lt;br /&gt;&lt;br /&gt;The results:&lt;br /&gt;&lt;br /&gt;First page load - so JIT stuff has to happen here - so perhaps not fair&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;[4600] 0009: 2010-05-26 18:49:27.466 [CBI] 100 Linq Queries took 6000 milliseconds&lt;br /&gt;[4600] 0009: 2010-05-26 18:49:27.472 [CBI] 100 CAML Queries took 2 milliseconds &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Subsequent page refreshes&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;[4600] 0009: 2010-05-26 18:49:49.303 [CBI] 100 Linq Queries took 4271 milliseconds&lt;br /&gt;[4600] 0009: 2010-05-26 18:49:49.307 [CBI] 100 CAML Queries took 3 milliseconds&lt;br /&gt;&lt;br /&gt;[4600] 0009: 2010-05-26 18:50:03.791 [CBI] 100 Linq Queries took 4973 milliseconds&lt;br /&gt;[4600] 0009: 2010-05-26 18:50:03.796 [CBI] 100 CAML Queries took 3 milliseconds&lt;br /&gt;&lt;br /&gt;[4600] 0013: 2010-05-26 18:51:03.388 [CBI] 100 Linq Queries took 4445 milliseconds&lt;br /&gt;[4600] 0013: 2010-05-26 18:51:03.392 [CBI] 100 CAML Queries took 3 milliseconds &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From this I would say that there is a &amp;lt;cough&amp;gt;significant&amp;lt;/cough&amp;gt; performance issue with the approach I hacked up. I would say that you forget about using it unless someone can come up with some way to cache the datacontext (I tried this and failed so far) or some other clever solution.&lt;br /&gt;&lt;br /&gt;The reason I did not post the code here is that it's a quick hack of code that is part of a client web site that I am working on, and I don't want to breach any contract, etc.  I also think that a blog post is coming soon about Linq performance in SharePoint in general, where I will do some more rigorous testing.&lt;br /&gt;&lt;br /&gt;Sorry for the bad news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2839898576605001053?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2839898576605001053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2839898576605001053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2839898576605001053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2839898576605001053'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/05/linq-to-sharepoint-for-anonymous-users.html' title='Linq to SharePoint for Anonymous users performance'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7750186588804875773</id><published>2010-05-11T20:06:00.006+02:00</published><updated>2010-05-12T14:44:30.158+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='Folder'/><title type='text'>Insert item into a (sub) folder using Linq to Sharepoint</title><content type='html'>Someone had a question on how to insert items into a sub folder of a list in SharePoint 2010 when using Linq. Not obvious at first, I thought I'd blog the answer:&lt;br /&gt;&lt;br /&gt;Let's say that you Create someObject based on a class generated by SPMetal. Let's also say that this object is suitable for passing to the InsertOnSubmmit method of the data context. Then you call the following to insert the item into the root of the list:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;dataContext.SomeList.InsertOnSubmit(someObject);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now you want to insert that item into a folder in the list, called Folder1. What you need to do is use the Path property on the someObject. This property is present if you use SPMetal to generate the Linq classes. &lt;br /&gt;&lt;br /&gt;I created a folder in my SomeList called Folder1, and then I set the Path property like so:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;mynewObject.Path = "/Lists/MyList/Folder1";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then call the InsertOnSubmit method as usual and your item will be in the right folder! I am not yet sure how to create the folder through linq, and do note that exceptions are thrown if the folder is not there. I'll try to solve that one in a later post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7750186588804875773?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7750186588804875773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7750186588804875773' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7750186588804875773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7750186588804875773'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/05/insert-item-into-sub-folder-using-linq.html' title='Insert item into a (sub) folder using Linq to Sharepoint'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4152509082650284632</id><published>2010-05-11T17:53:00.011+02:00</published><updated>2010-05-11T19:23:33.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Anonymous'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Making Linq to SharePoint work for Anonymous users</title><content type='html'>Earlier today I ran into the issue of Linq to SharePoint not working for anonymous users. The issue is discussed at a number of places: &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://blog.mastykarz.nl/sharepoint-2010-linq-doesnt-support-anonymous-users/"&gt;http://blog.mastykarz.nl/sharepoint-2010-linq-doesnt-support-anonymous-users/&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/9b59abcb-6bce-42f1-9eae-ad9561753044"&gt;http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/9b59abcb-6bce-42f1-9eae-ad9561753044&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Seeing as 95% of the SharePoint work I do is on public facing web sites, this was a real disappoinment for me. SharePoint 2010 is supposed to be much more useable internet sites - so this was a bit of a shock. Linq to SharePoint was one of those features we all looked forward to!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Before going back to CAML queries, I thought I would have a look at what potential workarounds or even hacks I could come up with to get this working. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;My first try was to just wrap my code in the usual SPSecurity.RunWithElevatedPrivileges method. That didn't work. A number of experiments later (and then finding this &lt;a href="http://blogs.msdn.com/chunliu/archive/2010/04/17/linq-to-sharepoint-query-across-site-collections.aspx"&gt;post&lt;/a&gt;), I arrived at this picture form Reflector:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IG48Kz86g3k/S-mAmjznsaI/AAAAAAAAAe8/SQa0y6agZQQ/s1600/ResharperLinqSharePoint.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 298px;" src="http://1.bp.blogspot.com/_IG48Kz86g3k/S-mAmjznsaI/AAAAAAAAAe8/SQa0y6agZQQ/s400/ResharperLinqSharePoint.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5470044622353314210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The class we are looking at here is responsible for creating the data connection for the Microsoft.SharePoint.Linq.DataContext class.  The important thing to notice here is the highlighted line. If the SPContext.Current is not null, the code uses the SPSite object from the current SPContext. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;As documented all over the web, the RunWithElevatedPrivileges method will be of no help if you do not create new SP* objects.  See &lt;a href="http://msdn.microsoft.com/en-us/library/bb466220.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb466220.aspx&lt;/a&gt; "...You cannot use the objects available through the Microsoft.SharePoint.SPContext.Current property. That is because those objects were created in the security context of the current user..."&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;So since the code shown in reflector does exactly what the above mentioned article warns against, browsing your site as an anonymous user eventually causes a login prompt on your site since the current SPContext represents that anonymous user who rightly should NOT be able to run Linq queries against your database. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Next I was inspired by this &lt;a href="http://social.technet.microsoft.com/Forums/sv-SE/sharepoint2010programming/thread/715ddcbb-619d-4688-8d99-d7a6aa078307"&gt;post&lt;/a&gt; and thought: What if I can somehow mess with the SPContext.Current object? If I could get it to be null, I could force that code in the SPServerDataConnection class to create a new SPSite object!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;The SPContext.Current object is read only. However, it derives in one way or another from the HttpContext.Current, and that is writeable. So my next attempt was to check if my user was an anonymous user, and if so, set the HttpContext to null. Short story - it worked!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;After some cleanup, I created the following helper method: &lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public static class AnonymousContextSwitch&lt;br /&gt;    {  &lt;br /&gt;        public static void RunWithElevatedPrivelligesAndContextSwitch(SPSecurity.CodeToRunElevated secureCode)&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                //If there is a SPContext.Current object and there is no known user, we need to take action&lt;br /&gt;                bool nullUser = (SPContext.Current != null &amp;amp;&amp;amp; SPContext.Current.Web.CurrentUser == null);&lt;br /&gt;&lt;br /&gt;                HttpContext backupCtx = HttpContext.Current;&lt;br /&gt;                if (nullUser)&lt;br /&gt;                    HttpContext.Current = null;&lt;br /&gt;&lt;br /&gt;                SPSecurity.RunWithElevatedPrivileges(secureCode);&lt;br /&gt;               &lt;br /&gt;                if (nullUser)&lt;br /&gt;                    HttpContext.Current = backupCtx;&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                string errorMessage = &amp;quot;Error running code in null http context&amp;quot;;&lt;br /&gt;                //Use your favourite form of logging to log the error message and exception ....&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The logic is as follows:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Check if the situation requires action: Is the user anonymous?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Backup the current HttpContext&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set the current HttpContext to null - thus forcing the creation of new SP* objects&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use The RunWithElevatedPrivileges method to execute code specified by the caller. Note that I reuse the SPSecurity.CodeToRunElevated delegate to mimic the RunWithElevatedPrivileges method.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set the current HttpContext to the backed up object&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Calling this function is identical to the way RunWithElevatedPrivileges is called:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;string currentWebUrl = SPContext.Current.Web.Url;&lt;br /&gt;AnonymousContextSwitch.RunWithElevatedPrivelligesAndContextSwitch(&lt;br /&gt;    delegate&lt;br /&gt;    {&lt;br /&gt;        MyDataContext dctx = new MyDataContext(currentWebUrl);&lt;br /&gt;        //... your code...&lt;br /&gt;    });&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Just remember that the SPContext.Current object should NOT be referenced inside the delegate code. This will throw all sorts of Null Reference exceptions. If you need data such as the current web url, throw it in a string variable before you switch the context. See the example above.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;I have tested this code for retrieving as well as updating data in a list and it worked great. I have also tested this for a logged in as well as an anonymous user and it seems to work for both.  &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Lastly, I need to say that I just figured this out today and I have NO idea what the long term impact of this will be, or if it will work as expected in all cases. Use at your own risk and all that. Happy coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4152509082650284632?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4152509082650284632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4152509082650284632' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4152509082650284632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4152509082650284632'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/05/making-linq-to-sharepoint-work-for.html' title='Making Linq to SharePoint work for Anonymous users'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IG48Kz86g3k/S-mAmjznsaI/AAAAAAAAAe8/SQa0y6agZQQ/s72-c/ResharperLinqSharePoint.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6567665803335762253</id><published>2010-05-06T16:52:00.008+02:00</published><updated>2010-05-06T17:08:19.289+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Content Type'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='FieldRef'/><title type='text'>FieldRef element not working with custom content type</title><content type='html'>I have been working on SharePoint 2010 for the last few weeks and have found the new development tools quite useful.  So far I have been able to avoid any CAML issues like typos that plagued MOSS 2007 projects.  Today I ran into something interesting however.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was creating a custom content type with some custom site columns, but after activating all the necessary features, my content type only had site columns in it that were from the parent content type.  None of the site columns defined in the FieldRefs section were included in the new content type.  The logs showed no errors, and I was quite stuck.  I spent a few hours experimenting and finally found the solution.  Comments in the XML.  Yeah, don't get me started, comments should not influence functionality but in this case they do.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So basically, this content type definition doesn't include any of the fields added in the FieldRef section:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;  &amp;lt;ContentType ID="0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390058d217b15a4549e79a7dfacfb6577993"&lt;br /&gt;              Name="Generic Page"&lt;br /&gt;              Description="Generic Page"&lt;br /&gt;              Group="My Content Types"&lt;br /&gt;              Sealed="FALSE"&lt;br /&gt;              Inherits="TRUE"&lt;br /&gt;              Version="0"&amp;gt;&lt;br /&gt;   &amp;lt;FieldRefs&amp;gt;&lt;br /&gt;     &lt;span style="background: yellow; color: black;"&gt;&amp;lt;!-- Comment --&amp;gt;&lt;/span&gt;&lt;br /&gt;     &amp;lt;FieldRef ID="{4B9D42FA-8081-49AB-9F89-72FAB3C6609C}"/&amp;gt;&lt;br /&gt;   &amp;lt;/FieldRefs&amp;gt;&lt;br /&gt; &amp;lt;/ContentType&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But this one does.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt; &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;  &amp;lt;ContentType ID=&amp;quot;0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390058d217b15a4549e79a7dfacfb6577993&amp;quot;&lt;br /&gt;               Name=&amp;quot;Generic Page&amp;quot;&lt;br /&gt;               Description=&amp;quot;Generic Page&amp;quot;&lt;br /&gt;               Group=&amp;quot;My Content Types&amp;quot;&lt;br /&gt;               Sealed=&amp;quot;FALSE&amp;quot;&lt;br /&gt;               Inherits=&amp;quot;TRUE&amp;quot;&lt;br /&gt;               Version=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;FieldRefs&amp;gt;&lt;br /&gt;      &amp;lt;FieldRef ID=&amp;quot;{4B9D42FA-8081-49AB-9F89-72FAB3C6609C}&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/FieldRefs&amp;gt;&lt;br /&gt;  &amp;lt;/ContentType&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only difference is the comment.  Good job and gold star to the guy who wrote the XML parser for this. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6567665803335762253?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6567665803335762253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6567665803335762253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6567665803335762253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6567665803335762253'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/05/fieldref-element-not-working-with.html' title='FieldRef element not working with custom content type'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8117833761310223488</id><published>2010-04-28T18:07:00.003+02:00</published><updated>2010-04-28T18:15:56.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac Mini'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>My New SharePoint Server</title><content type='html'>I started working on a SharePoint 2010 project this week, and I needed something to run it on.  My MacBook Pro would cut it if I ran it native and not via Parallels, but I would then have to deal with dual booting, etc.  More importantly, my MBP is in the shop cause I fried the keyboard when I spilled beer on it.  :)  Back on the trusty T43p until the MBP is fixed.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I needed some way to run SharePoint 2010, and I didn't feel like buying another laptop.  My solution: Mac Mini.  Purists out there may be groaning, but hey, it's a fantastic little 64 bit machine with plenty of hardware resources to run SharePoint 2010.  It is totally portable, and I can either use a screen at work to plug directly into it, or RDP from my laptop.  For €750 it was the best solution I could come up with.  Now if I could just get a speaking gig at a MS conference so I can pull this out in front of MS Developers..... &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8117833761310223488?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8117833761310223488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8117833761310223488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8117833761310223488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8117833761310223488'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/04/my-new-sharepoint-server.html' title='My New SharePoint Server'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6821497113813881030</id><published>2010-04-28T18:03:00.002+02:00</published><updated>2010-04-28T18:07:29.469+02:00</updated><title type='text'>Microsoft Exam Done</title><content type='html'>A few weeks ago I decided it would be good for my business if I had some Microsoft Exams under my belt.  I wrote the 70-536 exam today and got a nice high passing score. It's not a hard exam, but you do have to study quite a bit.  There are questions from all parts of the .NET framework so you can come in contact with many new things.  Two more for MCPD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6821497113813881030?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6821497113813881030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6821497113813881030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6821497113813881030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6821497113813881030'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/04/microsoft-exam-done.html' title='Microsoft Exam Done'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4286120918319069897</id><published>2010-04-09T16:48:00.002+02:00</published><updated>2010-04-09T16:52:55.732+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Office 2007 crash Server 2008'/><title type='text'>Office 2007 Crashes on Server 2008 R2</title><content type='html'>A few days ago after one or another update of my Server 2008 R2 machine, all my MS Office 2007 apps would crash immediately when started, and the only thing in the event log was something like:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Faulting application EXCEL.EXE, version 12.0.6524.5003, time stamp 0x4b4fba46, faulting module unknown, version 0.0.0.0, time stamp 0x00000000, exception code 0xc0000005, fault offset 0x00000000, process id 0xa10, application start time 0x01cad7f1dc0ebffb.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It took me a while to hunt down the fix so I'll post this for googlers with similar issues: &lt;a href="http://blogs.technet.com/office_sustained_engineering/archive/2010/03/11/issues-with-office-after-installing-kb977724.aspx"&gt;http://blogs.technet.com/office_sustained_engineering/archive/2010/03/11/issues-with-office-after-installing-kb977724.aspx&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4286120918319069897?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4286120918319069897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4286120918319069897' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4286120918319069897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4286120918319069897'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/04/office-2007-crashes-on-server-2008-r2.html' title='Office 2007 Crashes on Server 2008 R2'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2012899893401254527</id><published>2010-03-14T13:23:00.003+01:00</published><updated>2010-03-20T15:53:38.631+01:00</updated><title type='text'>Free ticket to DevDays 2010 - now gone</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;UPDATE:  Ticket has been given away - Sorry :(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I happen to have a free ticket to DevDays 2010 in the Hague this year and can't go because I am out of the country.  I am willing to give my ticket away to someone who can make good use of it, and preferably to someone who doesn't work for a large company that should buy their ticket for them.  So if you are a a freelancer or a small company that works in Microsoft technology and want to go to DevDays 2010, let me know and I may have your free ticket. It is NOT meant for resale.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2012899893401254527?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2012899893401254527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2012899893401254527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2012899893401254527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2012899893401254527'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/03/free-ticket-to-devdays-2010.html' title='Free ticket to DevDays 2010 - now gone'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7904362880060466624</id><published>2010-03-09T17:19:00.002+01:00</published><updated>2010-03-09T17:24:17.869+01:00</updated><title type='text'>USA &gt;= World</title><content type='html'>I love how some American companies feel that the world is no bigger than their country.  Today I received the following email from a company called Software Wholesale Intl.  (I assumed the Intl meant international):&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;We unfortunately cannot sell outside of the US. Sorry about that and good luck. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;Jess&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think they are trying to look a bit more professional than they really are.  :)  Website: &lt;a href="http://www.software-intl.com/"&gt;www.software-intl.com&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7904362880060466624?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7904362880060466624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7904362880060466624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7904362880060466624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7904362880060466624'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/03/usa-world.html' title='USA &gt;= World'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5491674518689027706</id><published>2010-03-08T18:47:00.003+01:00</published><updated>2010-03-08T18:58:04.458+01:00</updated><title type='text'>Good customer service for a change</title><content type='html'>&lt;div&gt;I am not one to praise a corporation lightly, but I feel I need to in this one instance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Over the past year I have done some work for American Express and was thus exposed to the various benefits their card holders enjoy.  Then a few months ago my credit card form ING was prematurely terminated due to the merger between ING and PostBank and let's just say that switching the ING Visa to an ING Mastercard was a 4 month ordeal that resulted in me saying goodbye to ING credit card services.  I couldn't manage to get approved for the new card and no one at ING could tell me why since I was a loyal customer with a platinum card before...  A total mess.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I decided to give Amex a try.  I figured they are accepted at 95% of the places I use a credit card (big stores in the US or online) and after all, they are a client. I have had to call them a few times durring the last few weeks with regards to setting up some things and was blown away every time at their flexibility, availability and just over all quality of customer service.  I know they are a more expensive card for the retailers to accept, but wow do they take care of their clients.  As someone living in Europe where customer service is generally awful, I am glad to see that some companies still value being excellent to their customers.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For any North American expats in the Netherlands, if you miss customer service form home you may want to get yourself an Amex card. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5491674518689027706?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5491674518689027706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5491674518689027706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5491674518689027706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5491674518689027706'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/03/good-customer-service-for-change.html' title='Good customer service for a change'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7754247466180738681</id><published>2010-03-05T12:41:00.003+01:00</published><updated>2010-03-05T12:58:58.434+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPiServer'/><category scheme='http://www.blogger.com/atom/ns#' term='ImageVault'/><title type='text'>EPiServer and Image Vault</title><content type='html'>I have spent the last month working as a developer on an EPiServer project and I have mixed feelings about the product.  EPiServer certainly has a lot of good stuff to offer and is fairly easy to get working.  It feels a little rough around the edges though and coming form a SharePoint or ASP MVC environment it can feel a bit "open sourcey".  I was not impressed by the lack of page type inheritance and by not having strongly typed properties but there is the Page Type Builder project that seems to address a lot of this nicely. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We also used an image management solution on this project that EPiServer recommends, and this was not much fun to work with.  The product in question is called ImageVault and it is not even close to production quality software.  We have had so many problems with this that it would have been easier to just build something like it form scratch.  As an example, here is what I fixed today:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ImageVault has a UrlBuilder class that helps get the url of the image from storage.  This helper allows us to specify an aspect ratio amongst other things and that is done by setting a decimal property.  So I would for instance set the aspect ratio to 1.5.  The url would then come back with something like :    ...&amp;amp;aspect=1.5&amp;amp;.... in the query string.  Now the fun comes when the site is running in a language such as Dutch where the decimal separator is a comma.  In that case, the url that comes back is  ...&amp;amp;aspect=1%2c5&amp;amp;...   Basically the developers never tested this in such an environment and inside their UrlBuilder class they simply do a ToString without setting an invariant culture.  The result is then that the URL that points to THEIR web service doesn't produce an image since the aspect ratio is incorrect. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is not a difficult bug to fix, but a product that is supposed to be at version 3.3 should NOT have bugs like this.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope the ImageVault guys get their product polished up since it has potential and they have a good opportunity to be the solution of choice for image management within EPiServer.  They will need to do this quickly though because they can truly lose a lot of business with the way their product works right now. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7754247466180738681?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7754247466180738681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7754247466180738681' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7754247466180738681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7754247466180738681'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/03/episerver-and-image-vault.html' title='EPiServer and Image Vault'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5555405309448445688</id><published>2010-02-10T13:53:00.007+01:00</published><updated>2010-02-10T14:08:11.236+01:00</updated><title type='text'>Dumb mistake</title><content type='html'>So I made a rookie mistale today and it took me a while to figure it out.  I copied a code snippet form one ASP.NET page to another and got myself into trouble.  I should know better than to copy and paste code.  :)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I had the following code in my page, and I couldn't figure out why I was getting a stack overflow problem.  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt; base.OnLoad(e);&lt;br /&gt; //Other code&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;for those who don't quite see the error, the call to the base class causes another call to the Page_Load method in this class and recursion that never ends is ensured.  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;What I meant to have is:&lt;/div&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;protected override void OnLoad(EventArgs e)&lt;br /&gt;{&lt;br /&gt; base.OnLoad(e);&lt;br /&gt; //Other code&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;It's good to make a dumb mistake once in a while, keeps me from thinking too much of myself.  :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5555405309448445688?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5555405309448445688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5555405309448445688' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5555405309448445688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5555405309448445688'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/02/dumb-mistake.html' title='Dumb mistake'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3405511676698922383</id><published>2010-02-05T13:43:00.004+01:00</published><updated>2010-02-05T14:03:15.385+01:00</updated><title type='text'>Autotune yourself</title><content type='html'>A site went live not that long ago that I helped create, and while it is a silly site I am quite proud of the technological achievement it is.  Let's just say that I really came trough for my client on this one.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The site is to be found at &lt;a href="http://www.u-tune.nl"&gt;www.u-tune.nl&lt;/a&gt; and allows people to karaoke sing.  The achievement here is that the vocals are then transformed using Autotune and after being merged with the music are played back to the user.  As far as I know this is the first instance of Autotune being used on the web, it is intended to be a studio tool with a human configuring it.  We really took the AUTO part of it seriously.  :)   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The project was one of the most challenging but also one of the most fun projects I have done lately.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3405511676698922383?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3405511676698922383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3405511676698922383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3405511676698922383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3405511676698922383'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/02/autotune-yourself.html' title='Autotune yourself'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-227841729191905692</id><published>2010-01-08T10:18:00.002+01:00</published><updated>2010-01-08T10:24:28.789+01:00</updated><title type='text'>New Office</title><content type='html'>After  few months of searching, negotiating mortgages and waiting for the bank, I finally got the keys to my new office yesterday.  I will need to do some maintenance but after some new paint and some cleaning, XComplica will have a new home.  This is the first step in the expansion planned this year.  Registering as an Ltd is next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-227841729191905692?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/227841729191905692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=227841729191905692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/227841729191905692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/227841729191905692'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2010/01/new-office.html' title='New Office'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-854516061895269789</id><published>2009-12-15T15:09:00.002+01:00</published><updated>2009-12-15T15:16:40.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blackberry sync mac garbage'/><title type='text'>Blackberry sync on Mac - thank god for gmail contacts</title><content type='html'>I tried to sync my blackberry contacts with my Mac address book contacts today using the not so long ago released software for this, and I have to say that RIM has some work to do here yet.  Thankfully I have my contacts stored in my gmail account cause the sync made a mess and a half of my blackberry AND my mac address book.  I can understand that this isn't the easiest thing to get right, but when my email fields say SMTP instead of the actual email address for many contacts, I think the software is unusable. Data loss in this type of application is not acceptable. I'm sure there is some perfectly logical explanation of how this happened, but sorry guys, I am just an end user and I was just running your software. Let's just say that this is a great way to motivate Mac users to buy an iPhone instead of a Blackberry when the next upgrade moment comes.  Hope you can fix it before then.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now back to fixing my address book, I am at 'J' and have been at it for a while now.........&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-854516061895269789?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/854516061895269789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=854516061895269789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/854516061895269789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/854516061895269789'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/12/blackberry-sync-on-mac-thank-god-for.html' title='Blackberry sync on Mac - thank god for gmail contacts'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5772274275887181869</id><published>2009-11-05T12:25:00.004+01:00</published><updated>2010-03-08T19:05:57.692+01:00</updated><title type='text'>new xcomplica.com</title><content type='html'>A few days ago I launched a new version of &lt;a href="http://www.xcomplica.com/"&gt;xcomplica.com&lt;/a&gt; .  My friend Alex at &lt;a href="http://www.warsvanpoeha.nl/"&gt;Wars van Peoha&lt;/a&gt; (Alex now has a new company - &lt;a href="http://www.greencreatives.nl"&gt;Green Creatives&lt;/a&gt; )made a great design for me to start from and I am proud to say that I did the rest myself. The html, css and jQuery bits took me the longest since I am no expert in these while the ASP.NET MVC back end was a breeze. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the first step in my plan to grow XComplica past the one man show that it now is. Other steps are underway, stay tuned. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5772274275887181869?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5772274275887181869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5772274275887181869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5772274275887181869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5772274275887181869'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/11/new-xcomplicacom.html' title='new xcomplica.com'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3914446128959476529</id><published>2009-10-29T10:28:00.002+01:00</published><updated>2009-10-29T10:43:02.634+01:00</updated><title type='text'>Don't be evil, right?</title><content type='html'>Yesterday and today I felt first hand how giant Google has become and the negative effects it has on the world. I now see that while the stuff coming out of the Googleplex is often very cool, Google is in some ways becoming the Wallmart of the internet.  As soon as they show up, everyone else is expected to go broke. What do I mean by that?  Well online there aren't physical locations that companies compete in, but there are product spaces. And as soon as Google enters a product space, any companies active therein are suddenly second class citizens expected to be overtaken by the giant Google.  So while the Google product may even be inferior, just the Google brand gives it the edge.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How did I see this?  I own shares in a Dutch company called Tom Tom that is one of the market leaders in navigation systems.  Yesterday Google announced their entry into this market, and shares of Tom Tom as well as others in the market plummeted.  I am of course not happy about the financial outcome for me.  More importantly however, I am starting to see that the sheer size and reputation of Google is going to make it impossible for them to stand by their "Don't be evil" philosophy.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3914446128959476529?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3914446128959476529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3914446128959476529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3914446128959476529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3914446128959476529'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/10/dont-be-evil-right.html' title='Don&apos;t be evil, right?'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8523180422738300654</id><published>2009-09-16T10:38:00.003+02:00</published><updated>2009-09-17T15:32:58.689+02:00</updated><title type='text'>Working on MAC</title><content type='html'>I have been working on my Macbook Pro for a few weeks now and have to say I have been quite happy with it.  The hardware is great and I have found OS X to have everything I need for my daily tasks. I do miss having Visual Studio and MS Office on my local machine, but I have a virtual machine using Parallels that I use for this software.  Parallels has been working quite well, I just can't get the automatic snapshot thing to work.  It took an automatic snapshot once, and since then has been ignoring the schedule I gave it. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only downside that I have found on the Mac compared to my Thinkpad is that the Macbook is not as tough.  I have unintentionally put both of them through the same drop test and the Thinkpad fared much better.  Both times I dropped the machine in question a half meter onto the floor.  The Thinkpad had a little cosmetic damage on the battery, which can be replaced quite inexpensively.  The Macbook has a nasty dent on the bottom right corner, and I don't think I will be trying to hammer it out anytime soon.  I have yet to talk to Apple to see what the repair would cost but I have a feeling replacing the unibody will not be so cheap.  Luckily both machines work just fine, which is more than I would expect from many other notebooks if I put them through this test.  I guess I have now "personalized" my Macbook and will have to live with the dent.  I do feel like a tool for doing this to my computer right after I bought it. I just hope my warranty will still be valid.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8523180422738300654?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8523180422738300654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8523180422738300654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8523180422738300654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8523180422738300654'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/09/working-on-mac.html' title='Working on MAC'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7090274796132115048</id><published>2009-09-02T14:43:00.004+02:00</published><updated>2009-09-02T15:01:22.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Code snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>Code snippet for Visual Studio for creating site columns</title><content type='html'>I have created a code snippet file which I use to create site columns in CAML.  It is by no means perfect or complete but I find it useful so someone else might too.  How to use code snippets is explained in many places so I won't regurgitate that here.  I will mention that you need to type the open angle bracket, hit ESC to disable intellisense and then type the site column shortcut followed by TAB.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Get the snippet file here &lt;a href="http://www.xcomplica.com/downloads/sitecolumns.snippet.txt"&gt;http://www.xcomplica.com/downloads/sitecolumns.snippet.txt&lt;/a&gt; and remember to remove the txt extension.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7090274796132115048?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7090274796132115048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7090274796132115048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7090274796132115048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7090274796132115048'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/09/code-snippet-for-visual-studio-for.html' title='Code snippet for Visual Studio for creating site columns'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1262661230095377005</id><published>2009-08-21T15:35:00.001+02:00</published><updated>2009-09-02T14:43:14.661+02:00</updated><title type='text'>Screwed by sky europe</title><content type='html'>Gotta love the 5 hour delay on a 2 hour flight, and the sudden change of destination.  Thanks sky europe, never flying you again.  I guess I'm not alone though seeing as you're going bankrupt.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UPDATE:  Screwed a second time when they really did go bankrupt and I had to buy a new flight home from vacation.&lt;br /&gt;---&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1262661230095377005?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1262661230095377005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1262661230095377005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1262661230095377005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1262661230095377005'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/08/screwed-by-sky-europe.html' title='Screwed by sky europe'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1721436983725594082</id><published>2009-08-14T15:55:00.002+02:00</published><updated>2009-08-14T15:59:06.980+02:00</updated><title type='text'>New Site</title><content type='html'>Not too long ago I finished working on a new site and forgot to blog about it.  The site is &lt;a href="http://www.americanexpressavenue.nl"&gt;American Express Avenue&lt;/a&gt; and was created in ASP.NET MVC 1.o.  I had a great time learning MVC, LINQ to SQL and a few other things and am hoping this stuff will show up in the next version of MOSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1721436983725594082?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1721436983725594082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1721436983725594082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1721436983725594082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1721436983725594082'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/08/new-site.html' title='New Site'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3544030767418389369</id><published>2009-08-14T15:38:00.003+02:00</published><updated>2009-08-14T15:47:41.517+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pc to mac'/><title type='text'>I am a Mac</title><content type='html'>The last few months have seen my trusty T43p Thinkpad slow down and demand retirement.  I have to say it was by far the best machine I have ever owned and it was my only computer for the first three years of my business.  Sincere thanks to IBM.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I thus decided to buy a replacement, and after much deliberation (ask people who I worked with recently) I decided to buy a MacBook Pro.  I bought the flagship 17 inch with almost all the upgrades (didn't shell out the extra grand for 8GB of RAM).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far I am quite pleased with it.  I am sticking with the pre-installed OS since it seems to be working quite well on the machine, and have managed to switch to the Mac world without too many issues.  The only big one was that VMWare Fusion froze twice on me and killed two VPCs in the process. Two days of work gone == I am now using parallels.  I am just about to embark on a new MOSS project and am curious how well this new setup will work.  More in a few months.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3544030767418389369?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3544030767418389369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3544030767418389369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3544030767418389369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3544030767418389369'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/08/i-am-mac.html' title='I am a Mac'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-9173284276359764336</id><published>2009-05-13T11:00:00.002+02:00</published><updated>2009-05-13T11:04:51.894+02:00</updated><title type='text'>Is blogging not cool anymore?</title><content type='html'>A few years ago, blogging became the latest rage.  Everyone and their grandmother had a blog and was contributing dutifully to spewing random brain trash onto the internet.  I recenlty noticed how many of these blogs have died out or whithered away.  It would be interesting to see the number of unique blog posts worldwide per month, to see if my personal experience actually matches reality.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is still plenty of trash being spewed out onto the internet, but it has moved on to other services.  Thanks twitter. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-9173284276359764336?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/9173284276359764336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=9173284276359764336' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/9173284276359764336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/9173284276359764336'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/05/is-blogging-not-cool-anymore.html' title='Is blogging not cool anymore?'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1548516446482964911</id><published>2009-05-08T17:21:00.004+02:00</published><updated>2009-05-09T12:11:54.807+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft support'/><title type='text'>Does this link work for you?</title><content type='html'>Today I was trying to activate support incidents for a client's MSDN subscription.  I called Microsoft as their web page on MSDN suggested, and they told me I need to fill out a form, and email it back to them.  Ok, no problem.  They then told me the url where I could get the form.  I typed it in and got an error.  Weird, perhaps I can't type.  So after a few attmepts at spelling it out on the phone, the MS guy emailed me the link.  Still no go.  At this point I was transfered to another department who told me to go to the same link.  They tried to tell me that I may be using the wrong version of IE (I have IE7) or that my proxy server may be messing things up (no proxy server).  In any case, I must be the moron because I got the "It works over here" response from them.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point, I want to know if anyone can actually see this link. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[UPDATE: I just tried this from home, still no go.]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;[UPDATE 2: It works now.  The trick as pointed out by Syd was that I had my country settings set to US.  I do this so that I don't have to read all the MS pages in Dutch.  Well it turns out that once I changed my country settins to the Netherlands, the url works.  Thanks Syd.]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As emailed from MS:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;p class="MsoNormal"&gt;Dear Joe,&lt;/p&gt;  &lt;p class="MsoNormal"&gt; As promised I send you the URL to activate the support for your MSDN subscription:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://support.microsoft.com/activatesupport"&gt;http://support.microsoft.com/activatesupport&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; Kind regards&lt;span lang="EN-GB"   style="mso-fareast-Times New Roman&amp;quot;;mso-ansi-language:EN-GB;mso-bidi-font-style:italicfont-family:&amp;quot;;color:black;"&gt;,&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-GB"   style="mso-fareast-Times New Roman&amp;quot;; mso-ansi-language:EN-GB;mso-bidi-font-style:italicfont-family:&amp;quot;;color:black;"&gt;Microsoft B.V.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1548516446482964911?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1548516446482964911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1548516446482964911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1548516446482964911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1548516446482964911'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/05/does-this-link-work-for-you.html' title='Does this link work for you?'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6367292332349027340</id><published>2009-04-14T16:58:00.003+02:00</published><updated>2009-04-14T17:01:58.784+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='motorcycle'/><title type='text'>A new experience</title><content type='html'>I had a new experience today, a not so pleasant one.  I got rear-ended by a taxi while on my motorcycle. Legally it was all his fault, but I am still pissed at myself for not seeing it.  I'll have to be more critical of myself in the future about road position, etc.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luckily I was not hurt, and the bike only had some cosmetic damage.  I was able to ride it to the dealer and it should be back on the road in a day or two.  In the meantime I am on a Suzuki V-Storm, not a bad bike from my impression so far.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6367292332349027340?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6367292332349027340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6367292332349027340' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6367292332349027340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6367292332349027340'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/04/new-experience.html' title='A new experience'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-290774515733352136</id><published>2009-04-08T17:51:00.002+02:00</published><updated>2009-04-08T17:57:42.656+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>A great tool</title><content type='html'>A quick note about a great free tool that I used on my last project to figure out what was really going on with my http traffic.  The tool can do a lot more than that too:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-290774515733352136?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/290774515733352136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=290774515733352136' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/290774515733352136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/290774515733352136'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/04/great-tool.html' title='A great tool'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6200938098019608355</id><published>2009-04-08T17:02:00.005+02:00</published><updated>2009-04-08T17:41:34.240+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Authentication Provider'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>Multiple authentication providers and SSO into MOSS</title><content type='html'>Recently I faced a problem where I had to enable a MOSS site to be accessible using three different methods.  One was the standard windows authentication, the second was Forms authentication and the third was a SSO method where a user identification token came in the querysting.&lt;br /&gt;&lt;br /&gt;Getting the first two up and running is documented in many places so I will not repeat that here.  See these links for instance:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/sharepoint/archive/2006/08/16/configuring-multiple-authentication-providers-for-sharepoint-2007.aspx"&gt;http://blogs.msdn.com/sharepoint/archive/2006/08/16/configuring-multiple-authentication-providers-for-sharepoint-2007.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.andrewconnell.com/blog/articles/HowToConfigPublishingSiteWithDualAuthProvidersAndAnonAccess.aspx"&gt;http://www.andrewconnell.com/blog/articles/HowToConfigPublishingSiteWithDualAuthProvidersAndAnonAccess.aspx&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;What was new for me was the third requirement. The specifics were that the querystring would contain a user token which could then be used to call a web service to authenticate the user.  The user would not notice any of this and be logged in automatically.  This method was used so that users coming from another portal could enjoy a Single Sign On experience when going to the MOSS site.&lt;br /&gt;&lt;br /&gt;I solved this as follows:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I extended the web site to yet another URL.&lt;/li&gt;&lt;li&gt;I changed the login page (in the web.config of the newly extended web app) to a custom login page.  * More on this later&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I added another membership provider line in the web.config of all the web applications corresponding to this site (Windows Integrated, Forms, SSO) which was the same as my forms membership provider except for two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The name of the provider has to be different&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The applicationName is different&lt;/li&gt;&lt;/ul&gt;This ensures that any users created to work with the SSO site will not be available for the forms site, while I can still use the database created for the Forms authentication provider. &lt;/li&gt;&lt;li&gt;I added a new role provider that is again the same as the role provider for Forms, just with a different name.  (This I did since MOSS does not allow you to use the same membership or role provider for different zones)&lt;/li&gt;&lt;li&gt;I then went to central admin and changed the authentication type of the zone corresponding to the SSO web app to forms.  I specified the new authentication and role providers.  Even though the authentication type is forms, the user never gets a chance to enter a username or password due to the code in the login page. &lt;/li&gt;&lt;/ol&gt;&lt;div&gt;* This login page has logic in it to call a web service which accepts the token and returns the user name (if token is valid).  It then uses the standard memership methods to authenticate the user based on the returned username and a static password that is the same for each user.  These users are stored in the same database as the Forms users but with a different application name so that they can only be used from the SSO site. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;I had also created some tools for user management that I then updated to be aware of multiple membership providers.  For example, my web part that created a new users has a radio button choice in it that forces the choice of a Forms user or an SSO user.  This drives which provider is used to create the user.  Similar logic is used in user editing, listing, etc.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a number of alternatives to this solution such as creating a new user database for the SSO membership provider or even creating a new membership provider, however I found this technique to be the least amount of work and quite effective. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6200938098019608355?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6200938098019608355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6200938098019608355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6200938098019608355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6200938098019608355'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/04/multiple-authentication-providers-and.html' title='Multiple authentication providers and SSO into MOSS'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2861818569948008356</id><published>2009-02-09T17:39:00.007+01:00</published><updated>2009-04-08T16:57:12.588+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hiding Panel'/><category scheme='http://www.blogger.com/atom/ns#' term='UserControl'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Handy Hiding Panel</title><content type='html'>Often in SharePoint (Although this could be used elsewhere) I have a need to hide something from some users or in case of some situation.  For instance I may want to hide a set of controls if the MOSS site is accessed from a specific URL (like the internet facing site).  &lt;br /&gt;&lt;br /&gt;In these cases I use a control I call the hiding panel.  It is quite simple but so handy that I find it useful to blog about.  The code first:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;&lt;br /&gt;namespace JoeDemo&lt;br /&gt;{&lt;br /&gt;    public abstract class HidingPanel : Panel&lt;br /&gt;    {&lt;br /&gt;        protected override void Render(System.Web.UI.HtmlTextWriter writer)&lt;br /&gt;        {&lt;br /&gt;            if (GetCondition())&lt;br /&gt;            {&lt;br /&gt;                base.Render(writer);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected abstract bool GetCondition();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [ToolboxData(&amp;quot;&amp;lt;{0}: PublicUrlPanel runat=\&amp;quot;server\&amp;quot;&amp;gt;&amp;lt;/{0}: PublicUrlPanel&amp;gt;&amp;quot;)]&lt;br /&gt;    public class PublicUrlPanel: HidingPanel&lt;br /&gt;    {&lt;br /&gt;        protected override bool GetCondition()&lt;br /&gt;        {&lt;br /&gt;            return HttpContext.Current.Request.Url.Host.ToLower() == "public";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I define an abstract class that is the generic hiding panel - it only renders when the condition is true.  I then can have many classes that inherit from the Hiding panel, each implementing their own version of the GetCondition method. &lt;br /&gt;&lt;br /&gt;The example here has the Public url panel which only displays if the host portion of the url is 'public'.  Mind you this is not the best production code, the string shoudl not be baked in here but that's not the point here. &lt;br /&gt;&lt;br /&gt;To use this, you simply add the panel to your page layout (or ASPX page if not in MOSS) and use the same way as a panel:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;myControls:PublicUrlPanel id=&amp;quot;myPanel&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;asp:Literal id=&amp;quot;testLit&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Accessed from public url&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/myControls:PublicUrlPanel&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that in SharePoint designer you should just be able to drag and drop this panel from the Server Controls list in the toolbox.  If you are adding the code manually, you also need to register your assembly somewhere on the page with a register directive like &lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;%@ Register TagPrefix=&amp;quot;myControls&amp;quot; Namespace=&amp;quot;JoeDemo&amp;quot; Assembly=&amp;quot;JoeDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=aaaaaaaaaa&amp;quot;%&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: Today I was working with this code and realized that when the Panel renders, it can throw off the look of your web page due to its rendering of a DIV tag.  To get around this, I simply stopped using a Panel control and switched to a PlaceHolder control.  Cleaner rendering and no loss in functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2861818569948008356?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2861818569948008356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2861818569948008356' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2861818569948008356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2861818569948008356'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/02/handy-hiding-panel.html' title='Handy Hiding Panel'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7667956465467669700</id><published>2009-01-29T13:22:00.002+01:00</published><updated>2009-01-29T13:25:06.259+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='formatting'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><title type='text'>Nice tool for blogging source code</title><content type='html'>I was struggling with formatting the source code for my blog today and found this handy tool &lt;a href="http://formatmysourcecode.blogspot.com/"&gt;FORMAT MY SOURCE CODE FOR BLOGGING&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Thanks Greg!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7667956465467669700?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7667956465467669700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7667956465467669700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7667956465467669700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7667956465467669700'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/01/nice-tool-for-blogging-source-code.html' title='Nice tool for blogging source code'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5812203922907602391</id><published>2009-01-29T12:40:00.015+01:00</published><updated>2009-01-29T13:20:04.117+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UserControl'/><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='ASCX'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>Using ASCX in WebParts and UserControls in SharePoint</title><content type='html'>I was explaining my technique of using User Controls in MOSS to someone today and they said I should blog about it.  I figured there would be many people who have but a quick Google search didn't reveal as many results as I thought.  So here goes:&lt;br /&gt;&lt;br /&gt;In order to get around the issue of not being able to have pages with code behind in them, I have been using User Controls.  Over the years I have adopted one way of developing web parts and user controls for which the code lives in DLLs but the layout still exists in ascx files.  This may not be the only or best way to accomplish this but it is a way that has always worked for me.&lt;br /&gt;&lt;br /&gt;On many of my assignments I receive HTML from a web designer and my job is to implement the functionality.  I like working this way. As long as I ensure that the HTML my code ends up rendering is the same as the HTML the designer delivered in her static page, I know the page will look great. This means I usually start by taking the HTML and translating it into ASP controls.&lt;br /&gt;&lt;br /&gt;So for example I may receive the following snippet from the designer:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: black; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;Item 1&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;Item 2&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I know that item 1 and item 2 are just an example, and the values here will need to dynamically come from a SharePoint list for instance.  So I translate this to a repeater (my favourite ASP.NET cotnrol):&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: black; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;asp:Repeater ID=&amp;quot;MyRepeater&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;HeaderTemplate&amp;gt;&lt;br /&gt;        &amp;lt;ul&amp;gt;&lt;br /&gt;    &amp;lt;/HeaderTemplate&amp;gt;&lt;br /&gt;    &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;li&amp;gt;&amp;lt;asp:Literal ID=&amp;quot;litItemValue&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:Literal&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;    &amp;lt;FooterTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/ul&amp;gt;&lt;br /&gt;    &amp;lt;/FooterTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This way I know that the rendered HTML will be exactly what the designer intended and thus the page rendering will not be broken.&lt;br /&gt;&lt;br /&gt;Now that I have the ascx ready, I want to use it in a user control or a web part.  My next step then is to create a class in a Class library and have this class dynamically load the ascx into a user control object.  I do this by calling the Page.LoadControl() method as seen in this code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: black; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class MyWebPart : WebPart&lt;br /&gt;    {&lt;br /&gt;        private const string ControlPath = &amp;quot;/_controltemplates/MyApplication/&amp;quot;;&lt;br /&gt;&lt;br /&gt;        private UserControl myControl;&lt;br /&gt;        private Repeater myRepeater;&lt;br /&gt;&lt;br /&gt;        protected override void CreateChildControls()&lt;br /&gt;        {&lt;br /&gt;            base.CreateChildControls();&lt;br /&gt;&lt;br /&gt;            &lt;span style="background: yellow; color: black;"&gt;myControl = (UserControl)Page.LoadControl(ControlPath + &amp;quot;MyControl.ascx&amp;quot;);&lt;/span&gt;&lt;br /&gt;            Controls.Add(myControl);&lt;br /&gt;&lt;br /&gt;            myRepeater = (Repeater)myControl.FindControl(&amp;quot;MyRepeater&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected override void OnLoad(EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnLoad(e);&lt;br /&gt;            EnsureChildControls();&lt;br /&gt;&lt;br /&gt;            myRepeater.ItemDataBound += new RepeaterItemEventHandler(myRepeater_ItemDataBound);&lt;br /&gt;            myRepeater.DataSource = GetData();&lt;br /&gt;            myRepeater.DataBind();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private object GetData()&lt;br /&gt;        {&lt;br /&gt;            // create a proper data source here&lt;br /&gt;            object myReturnValue = new object();&lt;br /&gt;            return myReturnValue;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            // do your stuff here&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Page.LoadControl is the crucial part, but there are a few other bits that I'd like to explain here.  &lt;br /&gt;&lt;br /&gt;First there is the issue of the path that the control is being loaded from. This path is a virtual directory path, and I like to use the already existing virtual directory created by MOSS called _controltemplates.  Seems like the right place to put control templates. Just to keep things neat I like to have a folder here for each application.  Note that this virtual directory corresponds to the physical directory {Location of 12 Hive}\TEMPLATE\CONTROLTEMPLATES on your MOSS server(s) so if you place you controls here, things will work.  I like to deploy my control templates using MOSS solution files but that's another post.&lt;br /&gt;&lt;br /&gt;The second thing to note is that you have to add the UserControl object to the this.Controls collection.  If you forget this, your web part will not render anything and you may get null reference exceptions.&lt;br /&gt;&lt;br /&gt;Third, make sure you get the ID correct when using the FindControl method. Doing the lookup based on a string ID works fine, but if you have the wrong ID in here you will not know until you get a nasty null reference exception at runtime. &lt;br /&gt;&lt;br /&gt;Last, remember to call the EnsureChildControls() before you start using any of the controls in your template.  Otherwise you may get yet another null reference exception.&lt;br /&gt;&lt;br /&gt;To get this all finally working, build your class library, register is as safe in the web.config file and add it to the bin folder of the MOSS application or the GAC.  You should then be able to use your web part or user control.&lt;br /&gt;&lt;br /&gt;Good luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5812203922907602391?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5812203922907602391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5812203922907602391' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5812203922907602391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5812203922907602391'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2009/01/i-was-explaining-my-technique-of-using.html' title='Using ASCX in WebParts and UserControls in SharePoint'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3913902724889828940</id><published>2008-12-16T14:49:00.005+01:00</published><updated>2008-12-16T17:47:04.246+01:00</updated><title type='text'>Reviving the blog</title><content type='html'>Thanks for those few who mentioned lately that they do check my blog every now and then, I thought no one was reading this anymore and so stopped blogging. I had been meaning to revive the blog in the last few weeks and got the perfect topic today.&lt;br /&gt;&lt;br /&gt;I have a public service announcement to those who fear about the state of things here in Amsterdam. Contrary to &lt;a href="http://www.dumpert.nl/mediabase/330471/7e3dccdb/foxnews_over_onze_coffeeshops.html"&gt;recent news reports&lt;/a&gt;, things here are just fine. The supposed anarchy has not struck and the hookers and drugs are still legal and controlled.&lt;br /&gt;&lt;br /&gt;I will blog more in the near future, over and out for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3913902724889828940?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3913902724889828940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3913902724889828940' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3913902724889828940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3913902724889828940'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/12/reviving-blog.html' title='Reviving the blog'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8839092526256839813</id><published>2008-06-30T10:55:00.002+02:00</published><updated>2008-06-30T10:59:57.711+02:00</updated><title type='text'>First speeding ticket</title><content type='html'>I got my first speeding ticket on the motorcycle the other day. In Holland you don't get pulled over, they just send you the ticket by mail a few weeks after they catch you. What is interesting is that I would never expect to be ticketed for doing 108 on a highway that has a 100 limit.  That's right folks, I got a ticket for doing 8km/h over the speed limit.  The ticket amounts to 16 Euro which is not that bad. Good lesson though, even a little bit of speeding will result in a not so nice piece of mail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8839092526256839813?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8839092526256839813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8839092526256839813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8839092526256839813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8839092526256839813'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/06/first-speeding-ticket.html' title='First speeding ticket'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4019162841919899616</id><published>2008-06-26T15:54:00.003+02:00</published><updated>2008-06-26T16:20:03.772+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Key cannot be null'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Content Query Web Part'/><title type='text'>Content Query Web Part Crashes</title><content type='html'>I had an interesting error thrown by the Content Query Web Part in MOSS 2007 today.  I added the web part to the page, all seemed fine until I clicked 'Modify Shared Web Part'.  At this point I get an ugly ASP.NET exception (I have custom errors turned off on my dev box) that says:&lt;br /&gt;&lt;br /&gt;Key cannot be null.&lt;br /&gt;Parameter name: key&lt;br /&gt;&lt;br /&gt;After a few hours of hunting and digging, this was what I found:&lt;br /&gt;&lt;br /&gt;Using Reflector I dug into what the web part was trying to do and realized it was iterating through the SPFields of the current web and using the Title property of each to index into an array.  Since the exception was complaining that the key is null, I assumed one of the Title fields was null.&lt;br /&gt;&lt;br /&gt;I then used powershell to see what my fields looked like and voila, one had a null title.&lt;br /&gt;&lt;br /&gt;The last step was to go to the feature where our team is putting the site columns we are using and finding the guilty field.  I noticed that the field had no DisplayName property and so I added this.&lt;br /&gt;&lt;br /&gt;After a new deployent all was well again.&lt;br /&gt;&lt;br /&gt;The powershell script I used:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-size:85%;font-family:courier new;" &gt;# Script to find fields with a null Title&lt;br /&gt;&lt;br /&gt;Function Find([string]$sitename){&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;$site = [Microsoft.SharePoint.SPSite]($sitename)&lt;br /&gt;&amp;nbsp;&amp;nbsp;$web = $site.RootWeb&lt;br /&gt;&amp;nbsp;&amp;nbsp;$fields = $web.AvailableFields&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Write-Host " "&lt;br /&gt;&amp;nbsp;&amp;nbsp;Write-Host "Finding fields"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for($i=0; $i -le ($fields.Count-1); $i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($fields[$i].Title  -eq $null){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Write-Host ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Write-Host "Found error in field:"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Write-Host&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Write-Host "FieldName  : ", $fields[$i].InternalName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Write-Host "Collection index : ", $i.ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[System.Reflection.Assembly]::Load(”Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”)&lt;br /&gt;[System.Reflection.Assembly]::Load(”Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”) &lt;br /&gt;set-executionpolicy RemoteSigned&lt;br /&gt;&lt;br /&gt;Find($args[0])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The stack trace (for googlers):&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[ArgumentNullException: Key cannot be null.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Parameter name: key]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Collections.SortedList.IndexOfKey(Object key) +2422464&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Collections.SortedList.get_Item(Object key) +12&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   Microsoft.SharePoint.Publishing.WebControls.ContentByQueryToolPart.getFieldKey(SPField field) +59&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   Microsoft.SharePoint.Publishing.WebControls.ContentByQueryToolPart.populateData() +1720&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   Microsoft.SharePoint.Publishing.WebControls.ContentByQueryToolPart.populateCBQControls() +24&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   Microsoft.SharePoint.Publishing.WebControls.ContentByQueryToolPart.CreateChildControls() +62&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.EnsureChildControls() +87&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +50&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +170&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +170&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +170&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +170&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Control.PreRenderRecursiveInternal() +170&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2041&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4019162841919899616?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4019162841919899616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4019162841919899616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4019162841919899616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4019162841919899616'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/06/content-query-web-part-crashes.html' title='Content Query Web Part Crashes'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5746359364054716086</id><published>2008-05-14T12:32:00.002+02:00</published><updated>2008-05-14T12:37:44.097+02:00</updated><title type='text'>Some trips</title><content type='html'>On Friday Mel and I are going to fly out to Canada for the May 2-4 weekend and then head down to the US for memorial long weekend there.  I guess we are doing a long weekend tour since we just got back from a long weekend in Belgium.  We went to the Ardenes and had a great sunny weekend full of outdoors fun.  I even got attacked by a swan that we drifted by when kayaking.  Those things are fierce.  I am looking forward to this trip but I realized that I won't be able to ride my motorcycle for 10+ days.  That is a bum deal since I have very quickly gotten used to having the bike around.  Mel has some pics of me riding, I'll put them up soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5746359364054716086?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5746359364054716086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5746359364054716086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5746359364054716086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5746359364054716086'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/05/some-trips.html' title='Some trips'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3592444094495186603</id><published>2008-04-08T21:29:00.003+02:00</published><updated>2008-04-08T21:47:34.695+02:00</updated><title type='text'>Fazer wins hands down</title><content type='html'>After a day of testriding motorcycles, I am happy to report I love the Yamaha Fazer.  It was the last bike I rode today and just pulling out of the parking lot felt a lot better than any other bike.  The CBF is a nice bike, I rode on it for an hour or so and had a good ride.  The Transalp I didn't like that much, mainly because of the long and soft front shock absorber which takes some getting used to when doing a fast stop, and the two cylinder engine is a lot rougher than the 4 cylinder ones.  Think direction Harley although nowhere near that.  The Yamaha simply works for me.  I rode it for about 20 minutes before returning to the store and renting it for two days.  I spent the rest of the day riding around and plan to do the same till it has to go back.  Need to be sure I love it right?  Unless something changes my mind about the bike I will be buying one shortly (think this week).  I don't want to have too much of a break riding so that I can keep improving my skills. Now to decide which color I want it in.......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3592444094495186603?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3592444094495186603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3592444094495186603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3592444094495186603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3592444094495186603'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/04/fazer-wins-hands-down.html' title='Fazer wins hands down'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1307145058101883582</id><published>2008-04-07T20:49:00.002+02:00</published><updated>2008-04-07T20:55:06.458+02:00</updated><title type='text'>First guest of the season</title><content type='html'>So the tourist season is officially starting this year in mid April when Melissa's brother will be staying with us for a week.  He has booked the best week of the year to experience Amsterdam as he is coming during Queensday.  Those who have experienced it will know what it feels like when the whole country decides to go out and party for a whole day.   This year should be extra nuts since most people have the next day off due to a church related holiday.  Im curious to see how many visitors I get this year, I think last year I had 5 different groups/individuals here. Book fast before the place fills up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1307145058101883582?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1307145058101883582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1307145058101883582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1307145058101883582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1307145058101883582'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/04/first-guest-of-season.html' title='First guest of the season'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1074443152642585106</id><published>2008-04-06T15:06:00.000+02:00</published><updated>2008-04-06T15:07:07.966+02:00</updated><title type='text'>Funny quote sent to me by my cousin Boris</title><content type='html'>&lt;span style="font-size:100%;"&gt;It is ridiculous to claim that video games influence children. For instance,&lt;br /&gt;if PacMan affected kids born in the eighties, we should by now have a&lt;br /&gt;bunch of teenagers who run around in darkened rooms eating pills while&lt;br /&gt;listening to monotonous electronic music. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1074443152642585106?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1074443152642585106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1074443152642585106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1074443152642585106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1074443152642585106'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/04/funny-quote-sent-to-me-by-my-cousin.html' title='Funny quote sent to me by my cousin Boris'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2969143152357344983</id><published>2008-04-06T14:12:00.002+02:00</published><updated>2008-04-06T14:46:40.166+02:00</updated><title type='text'>Been lazy but here's an update</title><content type='html'>Yes i haven't blogged about anything in a long time, no reason for that other than laziness.  I decided it was time for an update.&lt;br /&gt;&lt;br /&gt;I passed my final exam for the motorcycle license!  I pick up the license next week and I can go buy a motorbike.  I don't know which one yet since I have to go test ride them, but I have a few in mind.  I like the &lt;a href="http://www.yamaha-motor.nl/products/motorcycles/fz_series/fz6a-s2_fazer.jsp"&gt;Yamaha Fazer&lt;/a&gt;, the &lt;a href="http://www.honda.nl/specials/360degree/cbf600/nl/start.htm"&gt;Honda CBF600&lt;/a&gt; and the new &lt;a href="http://www.honda.nl/content/motorfietsen/modellen_xl700v_transalp.html"&gt;Honda Trans Alp&lt;/a&gt;.  These choices are based purely on looks/price/reviews so they are likely to change once I ride them.  The CBF is very close to the motorbike I did my lessons on so I know what that rides like.&lt;br /&gt;&lt;br /&gt;As of a few weeks ago, Melissa has officially moved in with me.  I say officially since she has been living here more than at her old place for quite some time now.  I just convinced her that it would save both of us travel time if she brought her stuff.  :)  So far so good. &lt;br /&gt;&lt;br /&gt;I still don't have the damn couch I ordered, I am going to pseudo-court with the company sometime soon.  It's going to be great fun. &lt;br /&gt;&lt;br /&gt;I haven't worked (for money that is) since the end of January so it was time to get back to that.  I had some work to do in the apartment still which is done now so I can return to making money.  I had a very sweet offer from a bank in Amsterdam but they contacted me a few days after the offer and canceled it due to budget freezes from upper management. Kind of a dumb move on their part from what I can see, but I don't know the whole story.  Let's just say I have &lt;span style="font-weight: bold;"&gt;exactly&lt;/span&gt; the experience they need and I will be very surprised if they find someone else in Holland who has done this work before.  I'm guessing they wake up 3 months before the project has to be done and I'll get a phone call.  I can't wait that long though so I took another offer that is close to the Hague.  It's a bit of travel but I don't mind since I usually wake up with Mel anyway.  We'll be on the same train in the morning as a matter of fact, I just go a few stops farther.  The work should be interesting, it's a MOSS developer job and I am kind of looking forward to writing some code again.  I have been doing a lot of coaching and mentoring in my last job and I only wrote a few small (but damn cool) bits of functionality.&lt;br /&gt;&lt;br /&gt;I am seriously considering doing an MBA.  I went to an information night regarding the MBA offered by the Amsterdam Business school and I think it would be a good thing to add to the resume.  I am happy doing the work I do now, but I don't think I'll be able to keep up with the technology for that much longer.  I know myself and my interests don't lie in reading documentation about the new stuff coming out of Redmond.  I do like the coaching / mentoring that I do on a project and I also like being the decision maker on a project.  I think an MBA would let me get the formal education I need so that I can keep consulting but on a different level.  I always thought the MBA was only good for corporate culture but I think I was wrong there.  I can still keep my freedom and make use of the MBA.  It seems that companies are not adverse to having external managers come in for a project.  Most of all though - I need to spend some money in a way that can be written off.  I hate paying taxes.  :) &lt;br /&gt;&lt;br /&gt;For those who read this but don't know yet, I'll be in the Toronto are for May long weekend.  I'm going to a wedding in Michigan with Mel and flying in/out of Toronto turned out to be better than Detroit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2969143152357344983?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2969143152357344983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2969143152357344983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2969143152357344983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2969143152357344983'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/04/been-lazy-but-heres-update.html' title='Been lazy but here&apos;s an update'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5642962235221899684</id><published>2008-02-04T19:49:00.000+01:00</published><updated>2008-02-04T19:55:18.256+01:00</updated><title type='text'>Motorbike exam 2 done</title><content type='html'>Last Friday I successfully took my second motorbike exam.  This one was a practical in a parking lot and consisted of a number of 'special maneuvers'.  I didn't do perfect but I passed with no problem.  One more exam and I have my license.  The best part is that my lessons don't have any more boring parking lot exercises, it's all riding now.  Today I had the motorbike up to 140km on the highway in a really strong headwind.  I can't imagine what 220 must feel like on a bike without a wind screen.  I also started to seriously look into what motorbike I want to buy, and so far I like the Yamaha Fazer.  Not that I can make any serious decisions before taking it out for a test ride, but the specs are good for a beginner bike and I think it looks great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5642962235221899684?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5642962235221899684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5642962235221899684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5642962235221899684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5642962235221899684'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2008/02/motorbike-exam-2-done.html' title='Motorbike exam 2 done'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1032308908785165974</id><published>2007-12-18T14:09:00.000+01:00</published><updated>2007-12-18T14:32:56.651+01:00</updated><title type='text'>European Customer Service (or Why I still don't have a couch)</title><content type='html'>I often say how much I am glad I came back to Europe and how the lifestyle here is more to my liking.  While this is still the case, there are moments where I dearly miss Canada.  Most of these relate to the outdoors, the Dutch nature in particular is quite lame compared to Canada's.   However there are other moments too. &lt;br /&gt;&lt;br /&gt;One of these moments arose after I spoke with customer service of the place I bought my couch, Sanders http://www.sanders-meubelstad.nl/ (I hope they rot in hell).  I had been waiting a good 5 months for the couch as this is how long it normally takes to get a couch in Holland.  I guess they have to wait for the cows to grow before they can shoot them for the leather....  I finally got a phone call recently saying the delivery guys would show up with my couch.  I was rather looking forward to getting this thing, so I took the morning off work and waited.  They showed up, did some head-shaking, some measuring and told me there was no way they could get the couch into my apartment through the front door or through the balcony (using the dutch rope moving system).  So they apologized and left. I have a standard size door btw, those who have visited my place can vouch for this.  Back to the store I went since I had already paid them €300 as a deposit.  The store told me to go to hell in words a bit more polite than that.  I got a phone number for customer service.  I called these folks three times and they never really knew what could be done and promised that a supervisor would call me back - guess how that turned out.  So today I call back one final time and am told (after much fruitless arguing) that my options are as follows:&lt;br /&gt;&lt;br /&gt;    1) Schedule another appointment where the delivery guys will do their best to 'shove' the couch into my apartment.  If any damage occurs this will be my problem.  Lovely&lt;br /&gt;    2) Pay &lt;span style="font-weight: bold;"&gt;only&lt;/span&gt; half the price of the couch as a restocking fee.  WTF?? €600 restocking fee?&lt;br /&gt;&lt;br /&gt;Safe to say this is not over yet.  All I know is that they are not seeing another penny from me.  Time to seek out the BBB equivalent here in the Netherlands and see what can be done.   If I do end up not getting my money back, I will start a business selling people false promises and see how far I can get.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1032308908785165974?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1032308908785165974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1032308908785165974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1032308908785165974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1032308908785165974'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/12/european-customer-service-or-why-i.html' title='European Customer Service (or Why I still don&apos;t have a couch)'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-390401213537228428</id><published>2007-12-10T13:23:00.000+01:00</published><updated>2007-12-10T13:28:16.379+01:00</updated><title type='text'>Motorbike exam 1</title><content type='html'>I took my first exam for having a motorbike license and I passed.  This one was the theory exam so I didn't get to show off my (lack of) riding skills yet, but I am quite pleased that I passed it in one go.  The questions on the theory exams here are hard and to top that off the exam was in Dutch.  Next exam - special maneuvers in the parking lot.  In some way I think this one will be the hardest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-390401213537228428?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/390401213537228428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=390401213537228428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/390401213537228428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/390401213537228428'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/12/motorbike-exam-1.html' title='Motorbike exam 1'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1633438378473017557</id><published>2007-12-03T11:21:00.000+01:00</published><updated>2007-12-03T11:25:13.507+01:00</updated><title type='text'>Another one done</title><content type='html'>Another cool website that I helped to bring into existence has come online today.  Check out &lt;a href="http://www.de.nl"&gt;www.de.nl&lt;/a&gt; .  This is the first version of the site and we still have some features to add, etc.  It has been an interesting project, lots of hard work and lots of dedication from talented people. Kind of neat to be able to show off the work I did to the whole world.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1633438378473017557?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1633438378473017557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1633438378473017557' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1633438378473017557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1633438378473017557'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/12/another-one-done.html' title='Another one done'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8825183181303382478</id><published>2007-11-29T20:28:00.001+01:00</published><updated>2007-11-29T20:28:43.902+01:00</updated><title type='text'>Unacceptable</title><content type='html'>Way too long since I have posted anything and I have no excuse for it. My life has been following a routine for the last few months, not a bad one but it&amp;#39;s time for a change.  I&amp;#39;ve been working quite a bit lately, we are almost ready to release a new version of a website for a big Dutch company.  Maybe as soon as tomorrow, I&amp;#39;ll post about that.  We built it using MOSS 2k7.  The Web Content Management portion of MOSS still has a way to go before it is a breeze to get a professional site up using it, but it can be done and there are some cool features to the product.  Some headaches too. :)  I am hoping my client lets me post a case-study like document since I think there are a few things we did that can really help others out. &lt;br&gt;&lt;br&gt;My weekends have been pleasantly spent with Melissa. We had said we wouldn&amp;#39;t be one of those couples that does everything together.  Nice theory but we don&amp;#39;t like being apart for any longer than necessary.  It works for us so why fight it?  &lt;br&gt;&lt;br&gt;I am still doing well with having quit smoking and although there are moments I feel like having a cigarette, I have learned to ignore them and I barely notice them anymore.  Having a non-smoker gf is great motivation. &lt;br&gt;&lt;br&gt;I am super pumped about a ski &amp;#39;n snowboard trip I am planning with Mel, Syd and Astrid.  Looks like we will be going to Soelden in Austria at the end of February. Two words: freeride, powder.  Yeah baby!  &lt;br&gt;&lt;br&gt;I&amp;#39;m still learning how to (properly) ride a motorbike.  I feel relativelly comfortable riding around Amsterdam at this point, it&amp;#39;s the special manoevers that are tough.  Doing a slalom at walking speed through cones 3m apart is tough on a 600cc honda.  I am not a natural on the bike but I am making good progress and I am having fun so I don&amp;#39;t really care if it takes a while before I have my license. &lt;br&gt;&lt;br&gt;That&amp;#39;s a brief excerpt of my life at the moment, I&amp;#39;ll try to post more often.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8825183181303382478?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8825183181303382478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8825183181303382478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8825183181303382478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8825183181303382478'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/11/unacceptable.html' title='Unacceptable'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1838363107282046018</id><published>2007-10-01T14:21:00.000+02:00</published><updated>2007-10-01T14:24:04.469+02:00</updated><title type='text'>Canada Trip</title><content type='html'>Going to be in the Toronto area (perhaps Ottawa and Windsor too) in the next two weeks.  Fly into TO Wednesday 3rd Oct and fly out of TO Sunday 14th Oct.  Want to catch up?  Drop me an email or leave a comment here (email is better).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1838363107282046018?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1838363107282046018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1838363107282046018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1838363107282046018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1838363107282046018'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/10/canada-trip.html' title='Canada Trip'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3880549672708749091</id><published>2007-09-28T11:25:00.000+02:00</published><updated>2007-10-01T14:21:35.718+02:00</updated><title type='text'>Update</title><content type='html'>The last few weeks have flown by at warp speed. I have neglected this blog and think it's time for a short update.&lt;br /&gt;&lt;br /&gt;It was a good summer even though I didn't get to go on vacation anywhere.  Amsterdam can be a fun place in the summer, lots to do and many friends to entertain.  I think the visiting season is over for now and I will have a bit more time for myself.&lt;br /&gt;&lt;br /&gt;Mostly I've been keeping busy with work, motorbike lessons and various guests.  I've also met a really great girl when out skating one night (thanks &lt;a href="http://www.fridaynightskate.com/"&gt;Friday night skate&lt;/a&gt;), and for the last month we've happily been monopolizing each other's time.  Funny thing is that I move to Holland and end up having an American girlfriend.&lt;br /&gt;&lt;br /&gt;I'm off to Canada for 10 days on Wednesday to see Stack get married and to check out Oktoberfest. Looking forward to seeing old friends.&lt;br /&gt;&lt;br /&gt;That's all from A'dam today, till next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3880549672708749091?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3880549672708749091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3880549672708749091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3880549672708749091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3880549672708749091'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/09/update.html' title='Update'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4894855808711648877</id><published>2007-09-13T18:01:00.001+02:00</published><updated>2007-09-13T18:01:34.263+02:00</updated><title type='text'>Thanks XP</title><content type='html'>Windows can really piss me off sometimes.  I was about to leave work today and made the mistake of clicking the &amp;#39;install updates and shut down&amp;#39; button.  15 minutes late my laptop finally turned off.  Thanks....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4894855808711648877?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4894855808711648877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4894855808711648877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4894855808711648877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4894855808711648877'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/09/thanks-xp.html' title='Thanks XP'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1836280095664177701</id><published>2007-08-31T10:30:00.000+02:00</published><updated>2007-08-31T10:54:28.823+02:00</updated><title type='text'>Mmm Valium</title><content type='html'>Last Wednesday I experienced an hour of pure adrenaline.  I went to my motorbike lesson only to find out it was time to leave the parking lot and head out onto the streets.  I was given 20 minutes of on-paper instruction on how not to get killed and then got the keys to a bike.  It was pretty intense suddenly being in the middle of Amsterdam and having to take traffic into account.  I made plenty of small mistakes (forgetting to check mirrors, forgetting to signal) but those I could live with.  I made one big mistake and that was using my front brake in a turn.  I wasn't going fast at all but I felt I couldn't make the turn and did the dumbest thing one can do - pull the front brake.  The bike got sucked down to the pavement and me with it.  I walked away with a slightly sprained ankle and had no problems finishing the ride.&lt;br /&gt;&lt;br /&gt;Later that evening I realized my back was stiff as hell and getting quite painful, while the adrenaline had worn off so I was feeling the ankle.  After a relatively sleepless night I went to the doctor in the morning.  I told him of my adventures so he gave me some painkillers as well as something to relax my muscles the next night.  I'm not too well versed in drugs so I looked them up before I took them, and the muscle relaxant happened to be diazepam which I figured out was actually Valium.  That took me a bit by surprise, I didn't realize Valium could be used for this type of thing.  Well I tried one last night and it worked.  At this point I can sleep without it though, so I have a few spare ones.  I wonder if I can feed them to the birds outside my window, maybe they'll shut up before 10 am.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1836280095664177701?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1836280095664177701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1836280095664177701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1836280095664177701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1836280095664177701'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/mmm-valium.html' title='Mmm Valium'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7509831786373593674</id><published>2007-08-27T12:31:00.000+02:00</published><updated>2007-08-27T12:33:27.852+02:00</updated><title type='text'>The funniest TechNet article</title><content type='html'>I can't believe that TechNet posted this.  It is by far the funniest TechNet article I have ever read and I am glad to see that MS has a sense of humor. &lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/technet/scriptcenter/tools/admatic.mspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7509831786373593674?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7509831786373593674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7509831786373593674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7509831786373593674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7509831786373593674'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/funniest-technet-article.html' title='The funniest TechNet article'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6764569163589549261</id><published>2007-08-15T10:20:00.000+02:00</published><updated>2007-08-15T10:26:47.320+02:00</updated><title type='text'>Motorbike lesson #2</title><content type='html'>My second motorcycle lesson can be summed up in two words: Much better. It's good to know that I am not motorcycle-challenged and that I am making progress.  Next lesson will involve some speed, so that should be fun.&lt;br /&gt;&lt;br /&gt;In other news, Ryan and Alex arrived yesterday.  Due to the courtesy of BA, they showed up sans luggage so we sat at my place chillin and waiting for Ryan's bag to show up most of last night. When it did show at 00:30 we decided to try and catch one last beer at the bar but found that the only place open was comparable to a sardine can.  Not fun.  So tame night overall.  I have a feeling that might not be the case tonight or tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6764569163589549261?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6764569163589549261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6764569163589549261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6764569163589549261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6764569163589549261'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/motorbike-lesson-2.html' title='Motorbike lesson #2'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4087221594548905257</id><published>2007-08-10T12:12:00.000+02:00</published><updated>2007-08-10T12:30:14.704+02:00</updated><title type='text'>moss forms auth with commerce server provider error</title><content type='html'>I have been struggling with getting MOSS to use Commerce Server 2007 as the authentication provider and just finally made it work today.  The last hurdle I had to get over was one that I solved by luck as much as anything else. &lt;br /&gt;&lt;br /&gt;If you follow the Microsoft white paper at &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=2AEB1A5E-43B8-483B-8CB2-86C0E82BF0AB&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=2AEB1A5E-43B8-483B-8CB2-86C0E82BF0AB&amp;amp;displaylang=en&lt;/a&gt; it explains how to get this integration done. For the most part it is a good guide except that it uses the typical developer security simplifications where many security accounts are grouped into a few uber-accounts.  This can create some security headaches if you actually create all the accounts that are recommended in the official MS installation docs for MOSS and CS.&lt;br /&gt;&lt;br /&gt;Once I got all these issues figured out though, I managed to get my portal to show me a login screen.  When I logged in with a bad password, I got the expected behavior - a nice error message.  When I logged in with a correct user/password combo I got something strange.  The page just posted back to itself with no message.  Fiddler and the IIS logs were showing that the browser tried to go to the homepage but the server returned a 302.  Weird. &lt;br /&gt;&lt;br /&gt;After some blind stumbling I fond the solution.  The white paper comes with a number of handy snippets for the web.config file that you need to create.  One of these snippets is for forms authentication, replacing the windows authentication your portal likely uses.  Very handy.  The problem lies in the line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;forms loginUrl="/_layouts/login.aspx" domain="&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-family: courier new;"&gt;hwdom.net&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;" name=".ASPXFORMSAUTH" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notice the domain attribute?  That is the domain that is stuck into the cookie your server sends out.  So unless you change this, the user authenticates against some other domain and is not seen as authenticated against your domain.  Nice huh?  Once I changed this to my test domain, my portal worked again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4087221594548905257?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4087221594548905257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4087221594548905257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4087221594548905257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4087221594548905257'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/moss-forms-auth-with-commerce-server.html' title='moss forms auth with commerce server provider error'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5798775277893555487</id><published>2007-08-10T10:21:00.000+02:00</published><updated>2007-08-10T10:29:09.022+02:00</updated><title type='text'>Motorbike lesson #1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.flickr.com/30/68007279_fc4c52c3cf.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px;" src="http://static.flickr.com/30/68007279_fc4c52c3cf.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I went for my first motorcycle riding lesson.  It was fun and ended well, but due to some miscommunication on how I should be riding I did wipe out three times.  I took what the instructor said too literally.  I was supposed to be making slow narrow turns and he said "just use your hips and lean the bike".  OK.  Dumbass me at that point says "So I can't turn the handlebars?"  He told me no, and so I proceeded to attempt slow and narrow turns with the handlebars completely straight.  Almost-wipeout, wipeout, almost-wipeout, wipeout, etc.  You get the picture.  He kept trying to explain to me what he thought I was doing wrong, but only after he put me on the back of the bike and showed me did I understand my mistake.  I told him he WAS using the handlebars to turn where he said it wasn't him, the bike causes them to turn that way.  Duh.  I felt like a retard for a bit but after that small fiasco I was driving circles around the guy (literally).   Looking forward to the next lesson.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5798775277893555487?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5798775277893555487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5798775277893555487' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5798775277893555487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5798775277893555487'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/motorbike-lesson-1.html' title='Motorbike lesson #1'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8879474380589149784</id><published>2007-08-09T12:33:00.000+02:00</published><updated>2007-08-09T12:40:47.506+02:00</updated><title type='text'>MOSS Debugging Tip</title><content type='html'>&lt;p class="MsoNormal"&gt;I found a very useful change in the web.config file of SharePoint when you need to debug something.  If an exception occurs in your code, SharePoint will normally display a nice page with a generic “An error occurred” message.  This is fine for end users but awful for debugging.  To turn this off, change:&lt;/p&gt;    &lt;p class="MsoNormal"&gt;    &amp;lt;&lt;span style="font-family:courier new;"&gt;safemode maxcontrols="200" callstack="&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;false&lt;/span&gt;" DirectFileDependencies="10" TotalFileDependencies="50" AllowPageLevelTrace="false"&lt;/span&gt;&amp;gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;To&lt;/p&gt;    &lt;p class="MsoNormal"&gt;    &amp;lt;&lt;span style="font-family:courier new;"&gt;safemode maxcontrols="200" callstack="&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;true&lt;/span&gt;" DirectFileDependencies="10" TotalFileDependencies="50" AllowPageLevelTrace="false"&lt;/span&gt;&amp;gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;You will then get the typical ASP.NET error page with the exception and call stack.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8879474380589149784?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8879474380589149784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8879474380589149784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8879474380589149784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8879474380589149784'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/08/moss-debugging-tip.html' title='MOSS Debugging Tip'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6104899890251330979</id><published>2007-07-26T10:40:00.000+02:00</published><updated>2007-07-26T11:31:40.885+02:00</updated><title type='text'>Hotel Joe Grand Opening</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://web.abqtrib.com/art/news06/022106_66jump3.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://web.abqtrib.com/art/news06/022106_66jump3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today will be the first time Hotel Joe is in operation.  My cousin and 4 or 5 (I don't remember) of his friends are coming to Amsterdam for a few days and will be the first guests at the hotel.  It should be good fun.  Next week the hotel is closed since the owner is going to &lt;a href="http://www.wacken.com/"&gt;WOA&lt;/a&gt; but the week after that it reopens to welcome Tim who will be making a pit stop here on his way to the old country.  There is a bit of vacancy after that, but not too many days pass between Tim's departure and the arrival of Ryan and Alex.  For now that seems to be the extent of reservations at the hotel, but Boris has ensured me that he will be making an appearance sometime this summer.  The fall may see the arrival of Syd plus a few. As you can see the place gets booked rather quickly so make your reservations now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6104899890251330979?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6104899890251330979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6104899890251330979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6104899890251330979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6104899890251330979'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/07/hotel-joe-grand-opening.html' title='Hotel Joe Grand Opening'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-892614971028659583</id><published>2007-07-24T10:20:00.000+02:00</published><updated>2007-07-25T15:00:04.378+02:00</updated><title type='text'>Creating an empty page in MOSS 2007</title><content type='html'>&lt;p class="MsoNormal"&gt;A few days ago as part of a new project building a publishing web site in MOSS 2007, I struggled to create a page that renders as empty as possible.&lt;span style=""&gt;  &lt;/span&gt;This means I didn’t want any of the sharepoint-ness to be seen on the page.&lt;span style=""&gt;   &lt;/span&gt;One suggestion I got was to place an empty aspx in the _layouts directory, but this wasn’t satisfactory since I wasn’t looking for an empty page just for the sake of being empty, I was rather looking for a minimal set of features on a page still enabled with MOSS functionality.&lt;span style=""&gt;  &lt;/span&gt;I could then add features as needed, but wouldn’t have to worry about residual MOSS junk on the page.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;There are a number of resources on the web that helped me to ultimately achieve this, but I couldn’t find any step-by-step walkthrough so here is my attempt at such a thing.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Start with a master page. There are two ways to go creating a master page in MOSS.&lt;span style=""&gt;  &lt;/span&gt;One is to create the master page from scratch and trying to ensure the minimal set of MOSS controls is on it.&lt;span style=""&gt;  &lt;/span&gt;The other method is to hack up one of the master pages that you get with MOSS.&lt;span style=""&gt;  &lt;/span&gt;Neither of these methods is simple or fun, so I did some digging to see if someone had been kind enough to do this work already and share.&lt;span style=""&gt;  &lt;/span&gt;I found that MSDN has a minimal master page &lt;a href="http://ablog.apress.com/?p=1248"&gt;http://msdn2.microsoft.com/en-us/library/aa660698.aspx&lt;/a&gt; that seemed to be exactly what I was looking for.&lt;span style=""&gt;  &lt;/span&gt;After some reading though it seemed that this master page didn’t work for everyone and there were hints that Heather Solomon’s was better. &lt;a href="http://www.heathersolomon.com/blog/archive/2007/01/26/6153.aspx"&gt;http://www.heathersolomon.com/blog/archive/2007/01/26/6153.aspx&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;I ended up trying both and both seem to work.&lt;span style=""&gt;  &lt;/span&gt;I ended up using Heather’s for no particular reason I can remember.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Once you pick a master page to use, how do you get it into MOSS?&lt;span style=""&gt;  &lt;/span&gt;Fire up SharePoint Designer, point it at your site, and go to the _catalogs/masterpage folder.&lt;span style=""&gt;  &lt;/span&gt;Use &lt;i style=""&gt;File&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;New&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;SharePoint Content&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;Page Tab&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;Master Page&lt;/i&gt; to create a new master page.&lt;span style=""&gt;  &lt;/span&gt;Delete the contents and paste in the master page code of choice.&lt;span style=""&gt;  &lt;/span&gt;Save it, and set it as the default master page for the site by right clicking on it and choosing &lt;b style=""&gt;Set as Custom Master Page&lt;/b&gt;. Do NOT pick &lt;b style=""&gt;Set as Default Master Page&lt;/b&gt;.&lt;span style=""&gt;  &lt;/span&gt;The reason for this is that the custom master page is used for any pages you create in the site.&lt;span style=""&gt;  &lt;/span&gt;The default master page is used for any SharePoint specific pages in your site, like the site settings page.&lt;span style=""&gt;  &lt;/span&gt;Perhaps there is a good reason to mess with this but it’s not in the scope of this document. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;You should now be able to open up a page in your site and see the effects of changing the master page.&lt;span style=""&gt;  &lt;/span&gt;Most likely the effect will be that a bunch of the MOSS features are still on the page, but they are ugly since the styling has been ripped out.&lt;span style=""&gt;  &lt;/span&gt;They are ‘bare’ so to speak.&lt;span style=""&gt;  &lt;/span&gt;No fear, you are on the right path. &lt;span style=""&gt; &lt;/span&gt;The next step is to move all the MOSS controls to a hidden panel.&lt;span style=""&gt;  &lt;/span&gt;Heather Solomon’s page includes a panel with visible=false set on it just for this purpose, so after some experimenting I realized you want to take everything out of the form tag except the web part manager and the asp content placeholder for main content, and move it to the hidden panel.&lt;span style=""&gt;   &lt;/span&gt;Save the master page like this and see what a page looks like.&lt;span style=""&gt;  &lt;/span&gt;It should have lost a LOT of the MOSS stuff.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now it is time to create a new page layout that also doesn’t have any MOSS junk on it, so that combining this with the new master page will result in the empty page we are striving for.&lt;span style=""&gt;  &lt;/span&gt;I struggled for quite some time with this part, only to find out that you need to publish page layouts before they work.&lt;span style=""&gt;  &lt;/span&gt;If you do not publish a page layout, you get strange behavior when you try to look at the page as an anonymous user.&lt;span style=""&gt;  &lt;/span&gt;If you are using IE7, somehow it remembers who you are (even when I pushed all the buttons to forget passwords and any other history) and it logs you in.&lt;span style=""&gt;  &lt;/span&gt;Not cool, since a public user will not have a username / password cashed.&lt;span style=""&gt;  &lt;/span&gt;Firefox pops up a login box.&lt;span style=""&gt;  &lt;/span&gt;More acceptable but still uncool since we want the page to just show up.&lt;span style=""&gt;  &lt;/span&gt;If you check the IIS logs, you’ll see that you are getting a 401.5 HTTP error.&lt;span style=""&gt;  &lt;/span&gt;Bottom line – publish the thing.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;For sake of completeness I will briefly list the steps you need to do in order to create a page layout, the resources that helped me get there was a blog posting by Scot Hillier &lt;a href="http://ablog.apress.com/?p=1248"&gt;http://ablog.apress.com/?p=1248&lt;/a&gt;.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Define any site columns and then the content type that you will need.&lt;span style=""&gt;  &lt;/span&gt;This is done using the web interface of MOSS.&lt;span style=""&gt;   &lt;/span&gt;Next use SharePoint designer to create a page layout in the _catalogs/masterpage folder of the &lt;b style=""&gt;root site of the site collection&lt;/b&gt;.&lt;span style=""&gt;   &lt;/span&gt;Use &lt;i style=""&gt;File&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;New&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;SharePoint content&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;SharePoint Content Tab&lt;/i&gt;&lt;i style=""&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&gt;&lt;/span&gt;&lt;/span&gt;Page Layout&lt;/i&gt; and if all is well you should be able to pick the content type you created in the dropdown in this dialog. &lt;span style=""&gt;  &lt;/span&gt;At this point you can add whatever controls you want to the page layout, if you are going for a minimal (empty) page though, you should have a asp:content placeholder for the page title and another for the main content – and that’s it.&lt;span style=""&gt;  &lt;/span&gt;If you now save the page layout, right click it and choose publish, you should be able to get the page layout published and approved.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;You are now ready to create a new page using the standard MOSS web interface based on your new page layout and new master page.&lt;span style=""&gt;   &lt;/span&gt;This page will render as an empty page, so do remember that you will not be able to run the WCM functionality from it and will therefore need to approve it using the ‘show all site content’ page in your site.&lt;span style=""&gt;  &lt;/span&gt;If you do want the editing console, take it out of the hidden panel in the master page and move it back into the form.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-892614971028659583?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/892614971028659583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=892614971028659583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/892614971028659583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/892614971028659583'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/07/few-days-ago-as-part-of-new-project.html' title='Creating an empty page in MOSS 2007'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2995549795730552961</id><published>2007-07-16T11:47:00.000+02:00</published><updated>2007-07-16T11:57:05.010+02:00</updated><title type='text'>MS Commerce Server 2007 SP1 error</title><content type='html'>I've been building a VPC which includes MS Commerce Server 2007 as one of the components, and I ran into a bit of an issue today.  I tried to install the Business User applications and got the following error: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Microsoft Commerce Server 2007 Business User Applications requires version 6.0.3724.0 of Microsoft Commerce Server 2007 Client Tools. Please uninstall any other version of the Client Tools and retry.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It didn't take me too long to figure out that this was because I had already installed SP1, and SP1 upgrades the client tools component.  Lesson to learn here: Don't install SP1 until AFTER you've installed the Business User apps.&lt;br /&gt;&lt;br /&gt;It seems that uninstalling SP1, installing the BU apps and re-installing SP1 seems to fix my issue for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2995549795730552961?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2995549795730552961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2995549795730552961' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2995549795730552961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2995549795730552961'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/07/ms-commerce-server-2007-sp1-error.html' title='MS Commerce Server 2007 SP1 error'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-6510333946219806977</id><published>2007-07-10T20:59:00.000+02:00</published><updated>2007-07-10T21:17:24.633+02:00</updated><title type='text'>Canadian beer commercials</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beiaardgroep.nl/bierinfo/pics/allegrolsch.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://www.beiaardgroep.nl/bierinfo/pics/allegrolsch.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I finally got my apartment online today and so I thought I'd take advantage of my new broadband connection while I made dinner.  I used to enjoy Toronto's Q107 radio so I put it on while making dinner.  I have to say that Canadian radio is still much better than anything here in Holland by FAR.&lt;br /&gt;&lt;br /&gt;So there I am enjoying listening to the Q when a beer commercial comes on.  I realize a few things as the commercial progresses.  You can advertise the shit out of Bud light and it will never touch the likes of any dutch beer. And, $20.99 or whatever the case of 18 beers is going for is soooo much more than the €8 case of 24 Grolsch or Heineken.&lt;br /&gt;&lt;br /&gt;I'd say this moment summed up how I feel when someone asks 'Where do you like it better?'.  Everywhere has it's upside and downside.  Today I feel like I am cheating though since I am listening to Toronto radio AND having a cold Grolsch for dirt cheap.&lt;br /&gt;&lt;br /&gt;Groetjes uit Amsterdam!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-6510333946219806977?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/6510333946219806977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=6510333946219806977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6510333946219806977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/6510333946219806977'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/07/canadian-beer-commercials.html' title='Canadian beer commercials'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1247622205433859306</id><published>2007-06-30T00:21:00.000+02:00</published><updated>2007-06-30T00:27:33.177+02:00</updated><title type='text'>I love the internet</title><content type='html'>I found a site the other day that I am quite intrigued by.  It's a money lending site (wait there's more) where P2P loans are agreed upon.  Basically it's a marketplace where individuals can borrow and lend money.  Borrowers create a loan request and lenders can fulfill parts of the request if they like the conditions (interest rate and borrower's credit rating).  The dutch site is only a few months old and has already seen 1 Million Euro go through it.  It seems like a relatively low risk investment and the average return is over 10%.  I think I may have to try it.  www.boober.nl is the dutch one, I forget what the one in England is called.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1247622205433859306?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1247622205433859306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1247622205433859306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1247622205433859306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1247622205433859306'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/06/i-love-internet.html' title='I love the internet'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2496804526689369283</id><published>2007-06-28T13:36:00.000+02:00</published><updated>2007-06-28T13:39:23.585+02:00</updated><title type='text'>The Hip are coming back</title><content type='html'>I have a feeling The Tragically Hip like the Netherlands.  They are coming back again this year and this time I got tickets for a show in Amsterdam.  It's one of the best concert venues in the country so I'm looking forward to this.  In case you are bored September 26 and happen to be in Amsterdam, feel free to join me at &lt;a href="http://www.paradiso.nl"&gt;Paradiso&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2496804526689369283?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2496804526689369283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2496804526689369283' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2496804526689369283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2496804526689369283'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/06/hip-are-coming-back.html' title='The Hip are coming back'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-5076479868557706630</id><published>2007-06-25T15:16:00.001+02:00</published><updated>2007-06-25T15:17:45.677+02:00</updated><title type='text'>Drivers Licence</title><content type='html'>Today I had my driving exam and passed.  I can drive again!  Another one of those pain in the ass things checked off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-5076479868557706630?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/5076479868557706630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=5076479868557706630' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5076479868557706630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/5076479868557706630'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/06/drivers-licence.html' title='Drivers Licence'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-2356379211808518937</id><published>2007-06-16T12:32:00.000+02:00</published><updated>2007-06-16T12:53:14.356+02:00</updated><title type='text'>Update</title><content type='html'>I've been neglecting this blog quite a bit lately so I thought it was time for a general update. My time lately has been split between finishing a project for a client and working on my apartment. My current contract is coming to an end, the project is almost done and turned out to be quite successful. What can I say, I do my job well. :)&lt;br /&gt;&lt;br /&gt;My apartment is moving forward, but it is a lot of work and I'm starting to get fed up. I've got a few more weekends before my new floor gets installed and I need to be done painting before then. So far I've got my living room painted with a base white and my bedroom is almost ready to get its first coat. Fixing the walls has been a major pain in the ass. It will all be worth it in the end, I just can't wait to get there.  I am very grateful for all the help I've received.  I've had a few friends come over and do a few things, and my brother really put in some effort a few weekends ago.&lt;br /&gt;&lt;br /&gt;Here are a few pics of the apartment at various stages:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IG48Kz86g3k/RnO_T1Up9pI/AAAAAAAAAAM/5vL9xAwObyo/s1600-h/wallpaper+sea.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_IG48Kz86g3k/RnO_T1Up9pI/AAAAAAAAAAM/5vL9xAwObyo/s400/wallpaper+sea.jpg" alt="" id="BLOGGER_PHOTO_ID_5076611552428816018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wallpaper nightmare&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IG48Kz86g3k/RnO_pVUp9rI/AAAAAAAAAAc/2Gp4xinK40s/s1600-h/ceiling.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_IG48Kz86g3k/RnO_pVUp9rI/AAAAAAAAAAc/2Gp4xinK40s/s400/ceiling.jpg" alt="" id="BLOGGER_PHOTO_ID_5076611921796003506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That ceiling was filthy&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IG48Kz86g3k/RnO_ilUp9qI/AAAAAAAAAAU/l8nO1hQu5aY/s1600-h/master+painter.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_IG48Kz86g3k/RnO_ilUp9qI/AAAAAAAAAAU/l8nO1hQu5aY/s400/master+painter.jpg" alt="" id="BLOGGER_PHOTO_ID_5076611805831886498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I'm not sure if Miro is painting or playing air guitar...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-2356379211808518937?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/2356379211808518937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=2356379211808518937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2356379211808518937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/2356379211808518937'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/06/update.html' title='Update'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IG48Kz86g3k/RnO_T1Up9pI/AAAAAAAAAAM/5vL9xAwObyo/s72-c/wallpaper+sea.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-369967374753256784</id><published>2007-06-15T10:51:00.001+02:00</published><updated>2007-06-15T11:26:03.194+02:00</updated><title type='text'>A4SWIFT ACK NAK schema has an error</title><content type='html'>It's been a while since a purely technical post but having gone to a Microsoft conference put me in the mood.&lt;br /&gt;&lt;br /&gt;I've been working with the A4SWIFT accelerator for BizTalk 2006 a lot lately and ran across a few challenges.  One that I didn't find any documentation for was that the ACK and NAK messages that come back from SWIFT do not validate against the schema provided in the accelerator or in the new 2006 message pack.  The error you get when running &lt;span style="font-style: italic;"&gt;Validate Instance&lt;/span&gt; in VS2005 is one like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;error BEC2004: Unexpected data found while looking for:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;'}'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;The current definition being parsed is AllianceTrailerBlocks. The stream offset where the error occured is 65. The line number where the error occured is 1. The column where the error occured is 65.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I looked at the message produced when I use the &lt;span style="font-style: italic;"&gt;Generate Instance&lt;/span&gt; option on the schema, and noticed that there is an imbalance in brackets.  There is one too many of these } present.   The generated instance looks like the following (I've added whitespace to make reading easier):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{1:ASeLTAddressSessSequen}&lt;br /&gt;{4:{177:DateTime}{451:AcceptReject}{405:ErrLin}{108:MessageUserReference}}&lt;br /&gt;{5:&lt;br /&gt;  {MAC:AuthenticationResult}&lt;br /&gt;  {PAC:AuthenticationResult}&lt;br /&gt;  {CHK:Checksum}&lt;br /&gt;  {SYS:TimeAndInputReference}&lt;br /&gt;  {TNG:}Training&lt;br /&gt;  {PDE:TimeAndInputReference}&lt;br /&gt;  {DLM:}DelayedMessage&lt;br /&gt;}&lt;br /&gt;{S:{AllianceTrailerData&lt;span style="color: rgb(255, 0, 0);"&gt;}&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/pre&gt;Notice the bracket that is in red, it turns out to be the one that is extra.  To get rid of it, go to the Swift Trailer, Alliance Trailer Blocks, Repeating Trailers Alliance Trailer Data and set the child delimiter type to 'None'.  This fixes the schema so that actual SWIFT ACK and NAK messages are validated.  The exact location of the node is&lt;br /&gt;&lt;br /&gt;/*[local-name()='SWIFT_CATEGORYS_MTS21_FIN_ACKNAK_Interchange' and namespace-uri()='http://schemas.microsoft.com/BizTalk/Solutions/FinancialServices&lt;br /&gt;/SWIFT/CategoryS/MTS21_FIN_ACKNAK']/*[local-name()='SWIFTTrailer' and namespace-uri()='']/*[local-name()='AllianceTrailerBlocks' and namespace-uri()='']/*[local-name()='RepeatingTrailers' and namespace-uri()='']/*[local-name()='AllianceTrailerDataRecord' and namespace-uri()='']&lt;br /&gt;&lt;br /&gt;Once the fix is in place, the generated instance looks like :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{1:ASeLTAddressSessSequen}&lt;br /&gt;{4:{177:DateTime}&lt;br /&gt; {451:AcceptReject}&lt;br /&gt; {405:ErrLin}&lt;br /&gt; {108:MessageUserReference}&lt;br /&gt;}&lt;br /&gt;{5:{MAC:AuthenticationResult}&lt;br /&gt; {PAC:AuthenticationResult}&lt;br /&gt; {CHK:Checksum}&lt;br /&gt; {SYS:TimeAndInputReference}&lt;br /&gt; {TNG:}Training&lt;br /&gt; {PDE:TimeAndInputReference}&lt;br /&gt; {DLM:}DelayedMessage&lt;br /&gt;}&lt;br /&gt;{S:{AllianceTrailerData}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;I was surprised to see that this hasn't been blogged about before since I can't see how anyone would get the ACK and NAKs to work with the existing schema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-369967374753256784?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/369967374753256784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=369967374753256784' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/369967374753256784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/369967374753256784'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/06/a4swift-ack-nak-schema-has-error.html' title='A4SWIFT ACK NAK schema has an error'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-7529038978460946961</id><published>2007-05-02T19:16:00.001+02:00</published><updated>2007-05-02T19:16:37.553+02:00</updated><title type='text'>Who approves this crap</title><content type='html'>Recently I had a real world run-in with a horribly coded application.  &lt;br&gt;&lt;br&gt;Public transport in the netherlands is slowly switching to a new form of payment, namely cards with what seems like RFID chips in them.  You have a balance on your card and as you scan in and out when using public transport, your balance is decreased.  Fine thus far.  I wanted to try it out in the Amsterdam subway and so I went to load 5€ onto my card.  This is done at a machine.  I followed through the menus, paid 5€ and assumed all went well.  After all, I got no error message and I did get a receipt. Just to be sure though, I put my card next to the reader again and checked my balance. Zero. WTF? I was confused and pissed that it ate 5 bucks.  Later in the office I went to the FAQ on the website for the new system, and I found this was a common problem.  The cause?  I aparently took my card away from the RFID reader too early.  Huh?  How can that be, it deducted money from my bank account, right?  Aren&amp;#39;t these things using basic principles of transactional processing?  I mean, it&amp;#39;s not hard to verify that the card has the money on it and only THEN take it off my account, right?&lt;br&gt; &lt;br&gt;Perhaps they are worried that people will pull the card away at just the right moment between having the money loaded on and the verification check, and thus getting free money.  I&amp;#39;m sure some sort of logic can be applied to prevent this, but even if not,  then at least put some sort of a &amp;#39;please wait&amp;#39; message on the screen until the verification can be done.&lt;br&gt; &lt;br&gt;Seeing systems like this makes me cringe.  How the hell is it possible that someone approved this design? I think it&amp;#39;s time the computer science industry implemented something similar to the PEng concept that engineers have.  Computers are running all sorts of complex and vital systems these days, and the only guarantee of quality we have is the hope that the people who developed the system had the brains/resources to get it right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-7529038978460946961?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/7529038978460946961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=7529038978460946961' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7529038978460946961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/7529038978460946961'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/05/who-approves-this-crap.html' title='Who approves this crap'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-1067558646726651793</id><published>2007-04-28T20:45:00.001+02:00</published><updated>2007-04-28T20:45:25.819+02:00</updated><title type='text'>First Night</title><content type='html'>Last night was the first time I slept in my new apartment. I am living like a junkie.  I have a matrass on the ground and pretty much no other furniture.  I spent the whole day today taking down the old wallpaper that is on most of the walls.  What a pain in the ass.  I&amp;#39;ve got about a third of the livingroom done.  There is a LOT of work to do still.  I have a feeling it will be a while before the place is set up the way I want it.  I hate wallpaper.  I think it should be illegal.  I think the person that invented wallpaper should be punished by spending eternity taking down wallpaper...  I think it may be in my best interest to stop working for the day.  Last thing I want is to hate my apartment before I am really living in it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-1067558646726651793?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/1067558646726651793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=1067558646726651793' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1067558646726651793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/1067558646726651793'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/04/first-night.html' title='First Night'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-8120316470581959562</id><published>2007-04-25T10:22:00.000+02:00</published><updated>2007-04-25T10:36:39.525+02:00</updated><title type='text'>Restart at HH:MM and then run this script</title><content type='html'>Every morning I come to work I have to turn my machine on and spend at least 15 minutes starting up the various apps I use to get productive.  (There is some issue with the BizTalk schema designer combined with Source Safe that causes Visual Studio to use 100% CPU power for 5 minutes per each schema I open.)  I've learned to live with this, but I realized today that it would be really cool if I could do the following:&lt;br /&gt;&lt;br /&gt;Create a script, macro or something of the sort that specifies the apps I want to run when I start my machine.  Instead of shutting down my machine, specify that I want to do a delayed reboot.  Here I should be able to specify how long the delay should be, or what time the machine should come back up.  I should also be able to specify my script/macro that would be run when the machine comes back up.&lt;br /&gt;&lt;br /&gt;This way I would come in and my computer would be ready to go after a nice clean reboot.   Kind of like a coffee pot with a timer.  :-) &lt;br /&gt;&lt;br /&gt;I know I can somewhat achieve this by hibernating my machine, but I have 2GB of RAM and hibernation rarely works for me.   I also like to start the day with a freshly rebooted box.&lt;br /&gt;&lt;br /&gt;Any ideas on how this could be done?  Would hardware support be necessary or can this be done with software only?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-8120316470581959562?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/8120316470581959562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=8120316470581959562' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8120316470581959562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/8120316470581959562'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/04/restart-at-hhmm-and-then-run-this.html' title='Restart at HH:MM and then run this script'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3604553655898614686</id><published>2007-04-22T20:02:00.000+02:00</published><updated>2007-04-22T20:04:39.213+02:00</updated><title type='text'>Trip to Canada</title><content type='html'>I've been meaning to post this for a while and keep forgetting.  I've bought a flight to Toronto for the fall.  A wedding and then Oktoberfest?  Why not.&lt;br /&gt;&lt;br /&gt;I leave Amsterdam Oct 3rd and fly back Oct 14th.   See you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3604553655898614686?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3604553655898614686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3604553655898614686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3604553655898614686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3604553655898614686'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/04/trip-to-canada.html' title='Trip to Canada'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4584833106802663601</id><published>2007-04-20T19:52:00.001+02:00</published><updated>2007-04-20T19:52:20.533+02:00</updated><title type='text'>Weird feeling</title><content type='html'>I was looking through the contacts in my phone today, seeing whom I&amp;#39;ve not talked to in a while.  I do this every now and then to make sure I someewhat keep in touch with people I know.  This time was a bit different though.  I came across a phone number of a colleague who died last winter.  The logical thing to do is to delete his phone nr, but it feels weird.  I&amp;#39;m not sure why, and I&amp;#39;m sure a psychologist could explain it, but it just feels weird.  I didn&amp;#39;t even know the guy that well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4584833106802663601?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4584833106802663601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4584833106802663601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4584833106802663601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4584833106802663601'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/04/weird-feeling.html' title='Weird feeling'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-3605496054225369112</id><published>2007-04-16T15:56:00.000+02:00</published><updated>2007-04-16T16:13:05.787+02:00</updated><title type='text'>A few close calls</title><content type='html'>The last few weeks have been stupidly stressful.  Both the banks I had gone to for mortgages suddenly decided my company was too new and that I was too much of a risk to lend money to.  The contract I had signed regarding my apartment could be dissolved on the basis of two such rejections but that wasn't exactly the plan.  I like the apartment and didn't want to lose it.  So I spent a week and a half on the phone trying to figure out some alternative options for borrowing money (not the mob but it did cross my mind) and didn't have much luck.  Finally my dad got pissed off at his bank for jerking me around and went there with a threat to take all his business elsewhere if they didn't commit to their promises from a few months ago.  Guess where I got my mortgage from.  :)  They still didn't give me a mortgage for the entire sum, just the execution value of the place.  This means I am house poor.  I've got just enough money to pay income tax for last year and the difference on the apartment cost vs the mortgage.  I think I'll be down to a few hundred bucks very soon.  Oh well, I'm working and I should get paid within a month on a few invoices.  In any case, it was a close call as I thought I would have to back out of the contract just because banks decided to change their minds and royally fuck me.  It goes without saying that my current bank will not be seeing my business for much longer. &lt;br /&gt;&lt;br /&gt;Another close call was my driving theory exam.  I studied for it most of the weekend and managed to get 45 out of 50.  43 is a fail so I had a buffer of one question.  The test here is a LOT harder than the Canadian one, and most people taking it failed.  I heard some people saying it was their 4th or 5th time.  Ouch.&lt;br /&gt;&lt;br /&gt;I should be doing work but it's so hard these days.  25 Celcius and a nice breeze.  Best time of year in this country.  Patio beer is so good......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-3605496054225369112?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/3605496054225369112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=3605496054225369112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3605496054225369112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/3605496054225369112'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/04/few-close-calls.html' title='A few close calls'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690173.post-4039338661416567808</id><published>2007-03-29T11:41:00.000+02:00</published><updated>2007-03-29T14:56:37.282+02:00</updated><title type='text'>The worst Martini I ever had</title><content type='html'>Last weekend I went to the Casino in Nijmegen (town in Holland) with a few friends.  We threw some money on the roulette table, watched it get taken away and walked away with the same sense of satisfaction as you get when you throw $20 off a bridge.  That's what a casino is however, so no complaints there.&lt;br /&gt;&lt;br /&gt;After flushing money down the roulette table, I decided I'd like a vodka martini.  I was drinking beer before and felt like a change.  So I go to the bar and the following conversation (or close to it) unfolds:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bar Chick: &lt;/span&gt;"What can I get you?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe:&lt;/span&gt; "Vodka Martini."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BC:&lt;/span&gt; "Vodka with Martini?"&lt;br /&gt;  At this point a red flag goes up but I decide to commit and see this through.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe:&lt;/span&gt; "No, a Vodka-Martini"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BC:&lt;/span&gt; "OK...."&lt;br /&gt;She grabs a glass usually reserved for soft drinks or rum-cokes and proceeds to pour a shot and a half of vodka in it.  Then she grabs a bottle of Vermouth and starts pouring with the intent of filling up the glass.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe:&lt;/span&gt; " Woa - Stop!"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BC:&lt;/span&gt; "What?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe: "&lt;/span&gt;That's quite enough... A Martini is three parts Vodka, one part Vermouth"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BC:&lt;/span&gt; "More Vodka?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe:&lt;/span&gt; "That's ok, I'll just take it as is".&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BC: &lt;/span&gt;"Want an ice cube in it?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joe: &lt;/span&gt;"No thanks."&lt;br /&gt;&lt;br /&gt;I had a feeling it wouldn't taste too good regardless of what she did to it, so I opted for a smaller volume of gross rather than letting her add more vodka.  It was fucking gross.  One of the worst drinks I ever had.  I drank it quick to get a buzz and then chased it with a beer.&lt;br /&gt;&lt;br /&gt;The moral of this story:  Forget about Vodka Martinis unless at a very quality place.  I would have thought the casino hires skilled bar staff but how wrong I was.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690173-4039338661416567808?l=jcapka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcapka.blogspot.com/feeds/4039338661416567808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8690173&amp;postID=4039338661416567808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4039338661416567808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690173/posts/default/4039338661416567808'/><link rel='alternate' type='text/html' href='http://jcapka.blogspot.com/2007/03/worst-martini-i-ever-had.html' title='The worst Martini I ever had'/><author><name>Joe</name><uri>http://www.blogger.com/profile/14064572198485536005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_IG48Kz86g3k/TALQPOrbEeI/AAAAAAAAAfo/dRtp510L7fs/s1600-R/253dcc681783a65b64373141bb0901bc.png'/></author><thr:total>0</thr:total></entry></feed>
