<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Jake Opines</title><subtitle type="html" /><id>http://www.atalasoft.com/cs/blogs/jake/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.atalasoft.com/cs/blogs/jake/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-03-25T15:04:00Z</updated><entry><title>Beauty is only Skin-Deep: Skinning your WinForms Application</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx</id><published>2008-05-09T15:00:00Z</published><updated>2008-05-09T15:00:00Z</updated><content type="html">&lt;p&gt;We all want our Windows applications to stand out, and I think most people would like to believe that there are a few distinct approaches to achieving this. You can either have an app that does great things, one that does things great, or one that does things while looking great. The ideal approach is to combine all three and make great applications that do things very well while looking amazing. The first impression is everything, right? So this post is all about how to skin your application. While I can't turn you into Monet, I can show you what a paint brush looks like.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Eat Your Cake Without Having to Wait for Your Oven to Preheat&lt;br&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;There are toolkits out there that allow you to skin your apps very easily like &lt;a href="http://www.dotnetskin.net/" target="_blank"&gt;DotNetSkin&lt;/a&gt; or &lt;a href="http://www.sunisoft.com/" target="_blank"&gt;Sunisoft's IrisSkin&lt;/a&gt;, but most of them cost money and all you might want to do is change a few things without overhauling everything that is Windows UI.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Replacing Your Lamp Because Your Light Bulb Burnt Out&lt;/b&gt;&lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Alek Trebec - "Answer: All the things that make windows behave like windows."&lt;br&gt;&lt;/i&gt; &lt;/p&gt;

&lt;p&gt;&lt;i&gt;Contestant - "What are 'things I took for granted'?"&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class="MsoPlainText"&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/13960/original.aspx" align="left" height="298" hspace="10" width="301"&gt;Just a forewarning: you are opening somewhat of a can of
worms here; albeit a small one. When you skin an app, there will be many things
that you got for free before but will now have to do yourself. Window-close,
-minimize, and -maximize are gone but easy enough to correct.&lt;span&gt; &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoPlainText"&gt;Window dragging requires a little bit of finesse and
window resizing requires a bit more. I'll explain all that with sample code
below, but first, let's talk about getting rid of that awful XP-blue menu-bar.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Removing the Menu-Bar&lt;/b&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/13962/original.aspx" align="right" height="123" hspace="10" width="133"&gt;After you have your project set up and are looking at your form in design-time. Open the &lt;u&gt;Properties&lt;/u&gt; pane form the main form object. Here, you need to find the Appearance labeled "FormBorderStyle". Change it from "Sizable" to "None". You will notice that in the design, your top menu bar and the border of the window are now gone! Excellent, a clean slate.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Readding Basic Window Controls&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;You can add all or none of these, but I suggest (for the sake of your users) that you at least add a close button. Here's what you do. &lt;/p&gt;

&lt;p&gt;&lt;u&gt;Close&lt;/u&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;Create a button in the upper right hand corner of your form; the location is by convention, you can put it anywhere you'd like of course. Change the name of the button to closeButton and double-click it so that Visual Studio brings you to the code view and creates you a OnClick event handler. Add the following code to it:&lt;br&gt;&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;private void closeButton_Click(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; Application.Exit();&lt;br&gt;}&lt;br&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Very simple.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Minimize&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Create another button on your form and change its name to minButton. Double click it to open code view to its OnClick event handler. Add the following code to that one:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
private void minButton_Click(object sender, EventArgs e)
        {&lt;br&gt;&amp;nbsp;&amp;nbsp; WindowState = FormWindowState.Minimized;&lt;br&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Maximized / Normal&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;There are two ways to do a "Maximize" button because you either have to change the button after it is maximized to a "Normal" button or you have to make the button's label generic enough that the one button can be used for both tasks. To keep things simple, we will do the latter.&lt;/p&gt;

&lt;p&gt;Create a button and change its name to maxNormButton and double click it like the last two examples. Add the following code to your event handler:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
private void maxNormButton_Click(object sender, EventArgs e)
        {&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; if (WindowState == FormWindowState.Maximized)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowState = FormWindowState.Normal;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowState = FormWindowState.Maximized;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/code&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;I will leave creating that generic-enough label up to you because I can't really think of anything right now. How about a ~ (tilde). That's never used enough.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Moving that Window Around&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/13959/original.aspx" align="left" height="268" hspace="10" width="294"&gt;To move your window around, you will need to handle the mouse down event as well as the mouse move event. We'll have to do some simple math to determine the offset from where the mouse was clicked to where it is after it has moved. But before we can do anything with that, we need to add something to the form to grab on to.&lt;/p&gt;

&lt;p&gt;You can either add a PictureBox or a Panel to your form. If you're looking to put something other than a solid color in the area, you'll want to go with the PictureBox, otherwise just drop a simple Panel up there and change it's BackColor property to something other than Control-gray. I will be using the Panel in this example.&lt;/p&gt;

&lt;p&gt;Add a Panel to your form and stretch it the length of your form placing it along your top edge. You can even Dock it on the top if you'd like, but if you want to add rounded corners, you wont want to do that. Change the name of the panel windowbarPanel.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Right click on your form and choose View Code. We need to capture when the user mouses down on your menu bar. Add a MouseDown event handler to the constructor of your form.&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
windowbarPanel.MouseDown += new MouseEventHandler(CaptureMouseDown);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The function that will handle the event, &lt;code&gt;void CaptureMouseDown&lt;/code&gt;, needs to save the mouse's position relative to your form's upper left hand corner. And it should only do this if the left mouse button is pressed. Create a private member variable _OffsetPoint of type Point to store your mouse position in. In the end, it should look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;void CaptureMouseDown(object sender, MouseEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (e.Button == MouseButtons.Left)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _OffsetPoint = new Point(e.X, e.Y);&lt;br&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next we need to handle when the mouse is moved. Add a MouseMove event handler to the constructor of your form.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;windowbarPanel.MouseMove += new MouseEventHandler(MoveWindow);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The function that will be handling this event, &lt;code&gt;void MoveWindow&lt;/code&gt;, needs to offset the mouse's new position against it's MouseDown one and set the location of the window to that point. Again, only if the left mouse button is being pressed. Here it is:&lt;br&gt;&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
void MoveWindow(object sender, MouseEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (e.Button == MouseButtons.Left)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point mousePos = Control.MousePosition;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mousePos.Offset(-_OffsetPoint.X, -_OffsetPoint.Y);
                &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Location = mousePos;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;Save it and build it and you've got yourself a form that doesn't have traditional Windows form borders but behaves a lot like one! Now, if only we could resize this thing...&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Resizing It&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;In traditional WinForms, you can grab any edge of a window and resize it. That's more than I want to get into in this post, so I'll only go over resizing your form from the lower left hand corner of the screen.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;In design-view, create a Panel in the lower left making it the size of your desired click area. Mine is about the size of an eraser head. Name it resizePanel.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;In code-view, you need to capture the position of the mouse relative to the screen with a mouse down event handler and save the current size of the window. You'll have to create new member variables for the window's width and height (they're of type int) but we can reuse the _OffsetPoint from before since you can't resize and move a window at the same time. In the constructor of the form, add the following: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;resizePanel.MouseDown += new MouseEventHandler(CaptureMousePosition);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The CaptureMousePosition method should look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int _Width;&lt;br&gt;int _Height;&lt;br&gt;&lt;br&gt;
void CaptureMousePosition(object sender, MouseEventArgs e)
        &lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (e.Button == MouseButtons.Left)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Width = Width;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Height = Height;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _OffsetPoint = new Point(Control.MousePosition.X, Control.MousePosition.Y);&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next, we need to set the width and height of the window every time the MouseMove event is fired. Add the following line to your form's constructor:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
resizePanel.MouseMove += new MouseEventHandler(ResizeWindow);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The ResizeWindow method needs to figure out how far the mouse has moved and apply that to the width and height of the form. It should end up looking like this:&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
void ResizeWindow(object sender, MouseEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (e.Button == MouseButtons.Left)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point mousePos = new Point(Control.MousePosition.X, Control.MousePosition.Y);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mousePos.Offset(-_OffsetPoint.X, -_OffsetPoint.Y);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width = _Width + mousePos.X;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Height = _Height + mousePos.Y;&lt;br&gt;&amp;nbsp;&amp;nbsp; }
       &lt;br&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;That's about it. It could definitely use some work, but it's a great start.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Just to Recap&lt;/b&gt;&lt;/p&gt;&lt;p&gt;With the information above, you can now create applications that have custom border elements. We had to rewrite the most basic window functions, but that's OK. It wasn't &lt;i&gt;that &lt;/i&gt;painful. I hope to see better-looking WinForm applications from all of you. The only piece that's up to you is embedding beautiful Photoshopped graphics for all of your buttons and borders.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/13961/original.aspx" align="right" height="94" hspace="10" width="123"&gt;I've added some pictures that go along with the process. Also, here are a few notes about anchoring your new elements correctly. If you don't correctly anchor, your resizing will not work correctly.&lt;/p&gt;&lt;p&gt;Your close, minimize, and maximize buttons should be anchored to the upper right. Your windowBarPanel should be anchored to the left-top-right so it stretches accordingly. Lastly, your resizePanel should be anchored to the bottom right so that it moves with your mouse as you resize.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here's a sample project that does everything we've talked about in this blog:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/files/folders/13964/download.aspx" target="_blank"&gt;SkinFormsBlog.zip&lt;/a&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;;subject=Beauty+is+only+Skin-Deep%3a+Skinning+your+WinForms+Application" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;;title=Beauty+is+only+Skin-Deep%3a+Skinning+your+WinForms+Application" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;title=Beauty+is+only+Skin-Deep%3a+Skinning+your+WinForms+Application" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;;title=Beauty+is+only+Skin-Deep%3a+Skinning+your+WinForms+Application" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx&amp;amp;;title=Beauty+is+only+Skin-Deep%3a+Skinning+your+WinForms+Application&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/09/beauty-is-only-skin-deep-skinning-your-winforms-application.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13951" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="WinForms" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WinForms/default.aspx" /><category term="UI" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/UI/default.aspx" /></entry><entry><title>Writing Custom NAnt Tasks</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx</id><published>2008-05-07T17:23:00Z</published><updated>2008-05-07T17:23:00Z</updated><content type="html">&lt;p&gt;Working as a Build Engineer for about 9 months, I've had the opportunity to push NAnt build scripting to the limits. Our DotImage product is made up of both managed and unmanaged code, third party libraries with .NET wrappers, code that sometimes differs from .NET 1.1 to .NET 2.0 (both x86 and x64)&amp;nbsp; and a slew of other complications. In addition to that and the multiple systems it takes to put it all together, there comes a time where a custom solution might be the best way to do things. In the world of NAnt scripts, this can come in many forms, but personally I prefer to stay away from batch files and calls to the command-line. In my mind, the most elegant option is to write a NAnt task.&lt;/p&gt;

&lt;p&gt;For most things, NAnt tasks already exist and can be found at either &lt;a href="http://nant.sourceforge.net/" target="_blank"&gt;their official website&lt;/a&gt; or at the &lt;a href="http://nantcontrib.sourceforge.net/" target="_blank"&gt;NAntContrib&lt;/a&gt; sourceforge project, but it may surprise you that one of my first projects at Atalasoft was to create a NAnt task for integrating with Team Foundation Server.&lt;br&gt;&lt;br&gt;We had been using Visual Source Safe so the &lt;a href="http://nantcontrib.sourceforge.net/release/0.85-rc2/help/tasks/vssget.html" target="_blank"&gt;vssget&lt;/a&gt; task served us well for a long time. When we migrated to TFS, we were essentially left hanging          and had nothing to go on but settle for a few batch scripts that handled the task pretty well. Needless-to-say, five or so calls to tf.exe (the Team Foundation command-line utility) is not as easy to maintain as one task in a NAnt script.&lt;/p&gt;

&lt;p&gt;In this post, I will walk you through creating a custom NAnt task with some more "advanced" features, such as adding nested elements and setting a return value. Then, in the near future, I will post my code for the tasks that I've written including tfsGet, tfsCheckOut, tfsCheckIn, removeSourceControlBindings, and others. You'll then be able to add them to your build systems and get all of the same TFS goodness that we do. I might even add them to NAntContrib as well.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Design your Task&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Before I start writing a task, I like to have a good idea of what it will look like and how it will behave in a NAnt script. In the case of TFSGet, I decided to model it after the VSSGet task which is in NAntContrib.&lt;/p&gt;

&lt;p&gt;This is what the VSSGet task looks like:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
&amp;lt;vssget verbose="true"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; username="user"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password="pass"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localpath="."&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recursive="false"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replace="true"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writable="true"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbpath="\\path\to\srcsave.ini" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path="$/path/to/project/location" /&amp;gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;and this is what my TFSGet task looks like:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
&amp;lt;tfsget server="servername"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ssl="false"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; port="8080"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; projectPath="$/path/to/project/location"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localPath="."&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recursionType="None"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getOptions="Force"&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;source path="*" /&amp;gt;&lt;br&gt;&amp;lt;/tfsget&amp;gt;&amp;nbsp;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Since I wrote it last year, &lt;a href="http://www.atalasoft.com/blogs/dterrell/" target="_blank"&gt;Dave Terrell&lt;/a&gt;, our Build Engineer has made a few important additions such as non-default network credentials as well as the ability to return a changeset number back to the NAnt script. With these new changes, the task looks like this:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
&amp;lt;tfsget server="servername"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; username="user"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password="pass"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ssl="false"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; port="8080"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; projectPath="$/path/to/project/location"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localPath="."&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recursionType="None"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getOptions="Force"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; changeset="changeset"&amp;gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;source path="*" /&amp;gt;&lt;br&gt;&amp;lt;/tfsget&amp;gt;&lt;br&gt;&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Let's Get Started&lt;/b&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/13921/original.aspx" align="right" height="218" width="300"&gt;Open Visual Studio and create a new project. NAnt tasks start their lives as Class Libraries, so that's the template that we'll choose. For this example, I'm going to create a project called TFS since it will hold all the tasks related to TFS. I might want to add more tasks in the future that aren't related to TFS so my overarching solution will be called Tasks.&lt;/p&gt;

&lt;p&gt;After your project and solution appear in the Solution Explorer, we need to rename the Class1.cs file to TFSGet.cs. Visual Studio may ask you if&amp;nbsp; would like Visual studio to rename all references to Class1 in the project to TFSGet. Say Yes, otherwise do it manually.&lt;/p&gt;

&lt;p&gt;Before we get started writing any code, we need to reference &lt;code&gt;NAnt.Core.dll&lt;/code&gt;. That assembly is located in the directory structure of your NAnt install right next to NAnt.exe. Once you've done that, add the appropriate &lt;code&gt;using&lt;/code&gt; statements to the top of your TFSGet.cs file.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Five Steps to Success&lt;/b&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;To define a NAnt task, there are five things we need to do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the name of the task using the &lt;code&gt;TaskName&lt;/code&gt; class decorator.&lt;/li&gt;

&lt;li&gt;Extend &lt;code&gt;NAnt.Core.Task&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Create any attributes and label them with the &lt;code&gt;TaskAttribute&lt;/code&gt; property decorator.&lt;/li&gt;

&lt;li&gt;Override the &lt;code&gt;ExecuteTask&lt;/code&gt; method.&lt;/li&gt;

&lt;li&gt;Make sure you're output assembly ends in &lt;code&gt;Tasks.dll&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
&lt;b&gt;The Basic Layout&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Here's the skeleton for our TFSGet task:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
// using ...&lt;br&gt;using NAnt.Core;&lt;br&gt;using NAnt.Core.Attributes;&lt;br&gt;// ...&lt;br&gt;&lt;br&gt;namespace TFS&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; public class TFSGet : Task&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Task Attributes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _server;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TaskAttribute("server", Required = true)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StringValidator(AllowEmpty = false)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Server&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _server; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _server = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
      &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... other attributes ...
      &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion
      &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Execute
      &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void ExecuteTask()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The Leg Work&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
      &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With this basic model, you can write almost any task you can think of. There are two other important concepts that this particular task employs and you should know about them and how to use them. One is returning values and the other is nested attributes. I'll explain return values shortly, but nested attributes are a bit more complicated and deserve a dedicated post. I will leave that to Dave to explain further. He's written about &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx" target="_blank"&gt;writing NAnt tasks with nested types&lt;/a&gt; as well as &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx" target="_blank"&gt;extending NAnt with your own types&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Using "Project"&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;Project&lt;/code&gt; gives you access to the currently running NAnt script. This is essentially the parent of your NAnt task. With it, you can log events, warnings, or errors. You also have access to properties within the project allowing you to return values from your task to the outer build script.&lt;/p&gt;

&lt;p&gt;In the case of this example, it is incredibly useful for the build script to know the changeset of the code we got from TFS. In the script, we can then use that number to ... maybe set the version number of our assemblies for quick debugging if a customer has a question. If they give us that, we can instantly see the code that their running without having to think about it. Currently, our assembly version numbers at Atalasoft are:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;6.0.&amp;lt;randomish number bigger than the last build&amp;gt;.&amp;lt;randomish number&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For future versions of our product we are working toward version numbers like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x.0.&amp;lt;number representing the letter of the build&amp;gt;.&amp;lt;changeset number&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For example, if you called our office with a question about your 6.0.0001.38983 assemblies, we would instantly know that you are running 6.0a and we can get changeset 38983 from source control and read exactly what you've got.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Setting project properties is very simple. To set a property, you simply set the value of item indexed by the property you are setting. That was a mouthful... If you are trying to set the "changeset" property, this is what you would do:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Project.Properties["changeset"] = value;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it!&lt;/p&gt;
&lt;p&gt;Logging is just as easy. To log you simply call:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Project.Log(Level.Info, "Your logged message goes here");&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That message will now appear in the console if you're running your NAnt script via command line. It will also appear in your CruiseControl logs if you're using that to manage your Continuous Integration process.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Deploying a Custom Built NAnt Task&lt;/b&gt;&lt;/p&gt;&lt;p&gt;To deploy a custom NAnt task, you simply need to put it in the NAnt directory next to the nant.exe and NAnt.Core.dll that you will be running it from. The next time you call nant.exe, your newly built task will be loaded and available to be scripted against.&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;&lt;b&gt;The Code&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Here's the &lt;a href="http://www.atalasoft.com/cs/files/folders/13927/download.aspx" target="_blank"&gt;code for this task in full&lt;/a&gt; and here's a &lt;a href="http://www.atalasoft.com/cs/files/folders/13928/download.aspx" target="_blank"&gt;link to a prebuilt assembly&lt;/a&gt;. You will need to download and install NAnt and you may or may not have to download and install Visual Studio TeamFoundation Server SDK for access to the Microsoft.TeamFoundation namespace items.&lt;/p&gt;&lt;p&gt;Check back in the future for more NAnt tasks and be sure to read Dave's articles on &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx" target="_blank"&gt;using nested types&lt;/a&gt; as well as &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx" target="_blank"&gt;creating your own&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;;subject=Writing+Custom+NAnt+Tasks" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;;title=Writing+Custom+NAnt+Tasks" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;title=Writing+Custom+NAnt+Tasks" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;;title=Writing+Custom+NAnt+Tasks" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx&amp;amp;;title=Writing+Custom+NAnt+Tasks&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13576" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="VSS" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/VSS/default.aspx" /><category term="NAnt" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/NAnt/default.aspx" /><category term="Build Systems" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Build+Systems/default.aspx" /><category term="TFS" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/TFS/default.aspx" /><category term="Task" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Task/default.aspx" /></entry><entry><title>Presenting at the Western Mass.NET Users Group</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx</id><published>2008-05-05T12:59:00Z</published><updated>2008-05-05T12:59:00Z</updated><content type="html">&lt;p&gt;I will be doing a &lt;a href="http://wmassdotnet.org/blogs/events/archive/2008/04/29/tuesday-may-6th-introduction-to-build-automation-using-nant-and-cruisecontrol.aspx" target="_blank"&gt;presentation on build automation using CruiseControl and NAnt&lt;/a&gt; at the Western Mass .NET Users Group meeting on May 6th at 6pm.&lt;/p&gt;&lt;p&gt;The presentation will cover the basics of &lt;a href="http://cruisecontrol.sourceforge.net/" target="_blank"&gt;CruiseControl&lt;/a&gt; and &lt;a href="http://nant.sourceforge.net/" target="_blank"&gt;NAnt&lt;/a&gt; as well as developing custom tasks to stretch this already flexible framework even further.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;;subject=Presenting+at+the+Western+Mass.NET+Users+Group" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;;title=Presenting+at+the+Western+Mass.NET+Users+Group" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;title=Presenting+at+the+Western+Mass.NET+Users+Group" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;;title=Presenting+at+the+Western+Mass.NET+Users+Group" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx&amp;amp;;title=Presenting+at+the+Western+Mass.NET+Users+Group&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/05/presenting-at-the-western-mass-net-users-group.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13886" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="NAnt" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/NAnt/default.aspx" /><category term="Build Systems" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Build+Systems/default.aspx" /><category term="Presentations" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Presentations/default.aspx" /></entry><entry><title>Writing Custom Web Services for SharePoint Products and Technologies - Microsoft Typo...</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx</id><published>2008-04-26T17:22:00Z</published><updated>2008-04-26T17:22:00Z</updated><content type="html">&lt;p&gt;Writing a custom web service for SharePoint, I ran into these two great articles which walked me through the process, but it still wasn't enough to tame the beast. Check out &lt;a href="http://msdn2.microsoft.com/en-us/library/ms916810.aspx" target="_blank"&gt;Writing Custom Web Services for SharePoint Products and Services&lt;/a&gt; on MSDN and &lt;a href="http://blogs.ittoolbox.com/km/sharepoint/archives/creating-a-custom-web-service-for-sharepoint-13553" target="_blank"&gt;Creating a Custom Web Service for SharePoint&lt;/a&gt; on ITToolbox, but take heed; there are typos that will burn you. I'm contacting the authors of these articles and will post here again once they are fixed. For now, here is what I did to get past them. Join me in a journey of pain followed by triumph.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;I started off my webservice-writing extravaganza by modeling it directly after the example at MSDN. I was able to get pretty far. I had my disco, wsdl, dll, and asmx files, and placed them in the mapped _vti_bin directory like a good doobie. I registered the assembly as a safe control and added it to the spsdisco.aspx file as the tutorial said, but no luck. I kept getting the vanilla error page produced by SharePoint. I looked through my Error log to find nothing and went back to staring at the seemingly useless error page. Then, ah yes, look at the url. It ain't pretty, but the URL in the address bar had some useful information. What a convenient place to put that!&lt;/p&gt;

&lt;p&gt;This is what I had to go on: http://localhost/_layouts/error.aspx?ErrorText=File%20Not%20Found%2E&lt;/p&gt;

&lt;p&gt;I ran &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx" target="_blank"&gt;Procmon&lt;/a&gt; and found out that SharePoint wasn't looking for the assembly where I thought it would. To prove that right, I assumed... put it in the GAC. I know, not the best practice, but I wanted to get it working and then fix it for real later.&lt;/p&gt;

&lt;p&gt;I dragged my assembly into %WINDOWS%\assembly only to find out that my assembly was not signed. This is a necessary step to getting your stuff to work with SharePoint. So after signing it, I put it in the GAC, only to get the same error...&lt;/p&gt;

&lt;p&gt;I ran Procmon again and found out that SharePoint wasn't looking in the GAC either! Interesting... I then did some Googling and found the article on ITToolbox. It was basically a revamped version of the article on MSDN. This article gave a few options of where you could/should put the assembly and I settled on the bin of the virtual directory I was deploying to. The asmx file loaded in IE! I was in the clear! Right? ... Wrong.&lt;/p&gt;

&lt;p&gt;I opened the project that would be using the service, attempted to add it as a Web Reference and it errored out. I tried to load Service1wsdl.aspx up in IE and I got another URL based error saying, "the given assembly name or codebase was invalid exception from hresult 80131047 sharepoint web service". Ok, something with more substance at least. There must be something wrong in the wsdl file.&lt;/p&gt;

&lt;p&gt;The best thing I felt I could do in this situation is examine every line of the wsdl (there are only 4, heh). I compared it directly to one I knew was working; the Microsoft-provided Listswsdl.aspx file for the Lists web service.&lt;/p&gt;

&lt;p&gt;Here's the first line of my file:&lt;br&gt;&lt;br&gt;&lt;code&gt;&amp;lt;%@ Page Language="C#" Inherits="System.Web.UI.Page"
%&amp;gt; &amp;lt;%@ Assembly Name="Microsoft.SharePoint, Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt; &amp;lt;%@ Import Namespace="Microsoft.SharePoint.Utilities" %&amp;gt; &amp;lt;%@ Import Namespace="Microsoft.SharePoint" %&amp;gt;
&amp;lt;% Response.ContentType = "text/xml"; %&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And here's the first line of the Listswsdl.aspx file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;%@ Page Language="C#" Inherits="System.Web.UI.Page"
%&amp;gt; &amp;lt;%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt; &amp;lt;%@ Import Namespace="Microsoft.SharePoint.Utilities" %&amp;gt; &amp;lt;%@ Import Namespace="Microsoft.SharePoint" %&amp;gt;
&amp;lt;% Response.ContentType = "text/xml"; %&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There are two differences here. The version number in the first snippet is 11.0.0.0 while it is 12.0.0.0 in Microsoft's (this actually doesn't matter because there are version redirects in the SharePoint web.configs) and the assembly name incorrectly includes the namespace when it is already mentioned in the later Import statements.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;...Name="Microsoft.SharePoint, Microsoft.SharePoint, Version...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;
should read
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;...Name="Microsoft.SharePoint, Version...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Thanks Microsoft, that was your bad. Maybe that flew with Version 11.0.0.0, but 12.0.0.0 no likey.&lt;/p&gt;

&lt;p&gt;Excellent. The wsdl loaded! Before I got too excited, I opened the disco file in Notepad to make sure that Microsoft didn't burn me there too with the bad Assembly Name tag. They did, I fixed that and moved on.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;I tried to load the disco in IE and ugh, another error: httpresponse.output cannot be assigned to it is read only. With this new tidbit, I decided to look for all the references to response.output in the disco file and compare it to the same references in the Listsdisco.aspx file that Microsoft wrote.&lt;/p&gt;

&lt;p&gt;This was my disco file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;contactRef ref=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output=""); %&amp;gt; docRef=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %&amp;gt; xmlns="http://schemas.xmlsoap.org/disco/scl/" /&amp;gt;
 xmlns:q1="http://tempuri.org" binding="q1:FilesSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /&amp;gt;
 xmlns:q2="http://tempuri.org" binding="q2:FilesSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /&amp;gt; 
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and this is the fixed copy after comparing it to the Listsdisco.aspx&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;contactRef ref=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %&amp;gt; docRef=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %&amp;gt; xmlns="http://schemas.xmlsoap.org/disco/scl/" /&amp;gt;
 xmlns:q1="http://tempuri.org" binding="q1:FilesSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /&amp;gt;
 xmlns:q2="http://tempuri.org" binding="q2:FilesSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /&amp;gt; 
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Notice anything?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;...Response.Output=""...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;should read&lt;/p&gt;
&lt;p&gt;&lt;code&gt;...Response.Output...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; This was in the example provided by the ITToolbox site. I'm not sure when I decided to go with their example for that line, but I did... and got burned.&lt;/p&gt;&lt;p&gt;After that last fix, the disco loaded in IE without a problem and I was able to add the service to my project as a Web Reference without a problem.&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;;subject=Writing+Custom+Web+Services+for+SharePoint+Products+and+Technologies+-+Microsoft+Typo..." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;;title=Writing+Custom+Web+Services+for+SharePoint+Products+and+Technologies+-+Microsoft+Typo..." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;title=Writing+Custom+Web+Services+for+SharePoint+Products+and+Technologies+-+Microsoft+Typo..." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;;title=Writing+Custom+Web+Services+for+SharePoint+Products+and+Technologies+-+Microsoft+Typo..." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx&amp;amp;;title=Writing+Custom+Web+Services+for+SharePoint+Products+and+Technologies+-+Microsoft+Typo...&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/26/writing-custom-web-services-for-sharepoint-products-and-technologies-microsoft-typo.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13756" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="Deployment" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Deployment/default.aspx" /><category term="WebServices" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WebServices/default.aspx" /><category term="SharePoint" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/SharePoint/default.aspx" /></entry><entry><title>Code Camp 9: Thoughts and Impressions</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx</id><published>2008-04-07T12:25:00Z</published><updated>2008-04-07T12:25:00Z</updated><content type="html">&lt;p&gt;This weekend, along with 4 other Atalasoftians, I went attended Code Camp 9 at the Microsoft offices in Waltham, MA. The content was diverse and the presenters were very knowledgeable. The coolest part is that the idea of Code Camp is that all the presenters are regular people like you and me (albeit very good at what they do). For the most part, they aren't Microsoft employees loyally spewing their &lt;a href="http://en.wikipedia.org/wiki/Kool-Aid" target="_blank"&gt;Corporate Kool-Ade&lt;/a&gt;, not that that is always a bad thing. They are experts in their fields, showing what &lt;i&gt;they &lt;/i&gt;do with Microsoft's technology and other .NET-ish related techs.&lt;/p&gt;&lt;p&gt;Here's a list of all the sessions I attended with a brief summary of what they were about and what I took away from them:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Extending Powershell&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.atalasoft.com/blogs/loufranco/" target="_blank"&gt;Lou Franco&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Before this presentation, I can say I knew nothing about Powershell. Because of it, I'm in the process of downloading and installing it as I type this. It's pretty darn powerful. Here's &lt;a href="http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/04/06/my-notes-for-extending-powershell-to-do-image-processing.aspx" target="_blank"&gt;Lou's blog&lt;/a&gt; with notes from his presentation and all of the code that he used.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Real World httpModules and httpHandlers&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://professionalaspnet.com/" target="_blank"&gt;Chris Love&lt;/a&gt;&lt;/i&gt; &lt;/p&gt;&lt;p&gt;I have an unrealistic burning desire to personally make &lt;a href="http://en.wikipedia.org/wiki/Comet_%28programming%29" target="_blank"&gt;Comet&lt;/a&gt; &lt;a href="http://www.aaronlerch.com/blog/2007/07/08/creating-comet-applications-with-aspnet/" target="_blank"&gt;efficient in IIS&lt;/a&gt;, and I have an inkling that a custom httpModule will do the trick with maybe a Windows service running in the background as well... but isn't that something like rewriting IIS? Possibly, but that isn't what this presentation was about. Chris went over the basics of putting together custom httpModules and handlers to do things such as url rewriting and building and serving out vCards and PDFs on the fly. Very cool stuff.&lt;/p&gt;&lt;p&gt;&lt;b&gt;"Shall We Play a Game?" - An Introduction to Game Development with XNA&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://blogs.msdn.com/cbowen/" target="_blank"&gt;Chris Bowen&lt;/a&gt;&lt;/i&gt; &lt;/p&gt;&lt;p&gt;Anyone who can write &lt;a href="http://en.wikipedia.org/wiki/Pong" target="_blank"&gt;Pong&lt;/a&gt; in 20 minutes deserves some serious kudoz. Using the XNA toolkit, he was able to walk us through the process of setting up the logic and display for the entire game with sound and "AI". Ok, no AI, but still very cool.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wpf Means Business II&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by Michael Hennessy&lt;/i&gt;&lt;/p&gt;&lt;p&gt;One benefit, to me, of using WPF is it's extreme similarities to web development. I don't have much (if any) experience in writing applications that leverage WPF, so this presentation was mostly an introduction for me.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Object Relational Mapping, an Introduction to NHibernate&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by Rik Bardrof&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/NHibernate" target="_blank"&gt;NHibernate&lt;/a&gt; is a .NET port of &lt;a href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29" target="_blank"&gt;Java's Hibernate&lt;/a&gt; that maps an object-oriented data model to relational data structures. This presentation was filled with great information about how to set up your projects to basically build the data structures for you, however, a lot of the work seems to be translated away from writing DB create statements into writing xml descriptions of those data structures. Seems like the same amount of work for a similar result, but maybe I am missing something. Products like &lt;a href="http://en.wikipedia.org/wiki/Django_%28web_framework%29" target="_blank"&gt;Django&lt;/a&gt; do a lot of this work for you already, so why can't NHibernate?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Extending Your Applications Using Dynamic Languages&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by Michael Cummings&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Michael talked about how &lt;a href="http://www.ironpython.com/" target="_blank"&gt;IronPython&lt;/a&gt; and &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt; and how they can be used to extend current applications. He used an example of a capture the flag game where you could update the intelligence of the players (all AI) using IronPython and see the results right away. These scripting languages can allow your customers to leverage your product in ways you couldn't have imagined, extending their usefulness.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Introduction to Design: The Power and Glory of the User Experience&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://learn2learn2program.com/default.aspx" target="_blank"&gt;Michael de la Maza&lt;/a&gt;&lt;/i&gt; &lt;/p&gt;&lt;p&gt;This was a pretty cool presentation. He's at Code Camp, not design camp, so his take-away message was that there are people out there who are actually good at design and that they should be hired. Just like engineering your code and engineering your data structures, you must engineer your users' interaction with it. Users don't care that your database is fully normalized, they just care that the information is there and is accurate. They don't care that you're using WPF and that the interface is vector-based, they just want it to be able to scale to their brand new 30 inch HD display. Michael broke the session-goers into two groups whose jobs were to develop the user experience for a computerized version of Tic-Tac-Toe. This was a very successful way to get people who probably don't think about what users want very often to do just that. I think the only flaw was that our group didn't realize the target audience was the other team and instead decided to talk about two separate designs instead: one for kids and one for adults with 3 minutes to kill.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Test Driven Development w/TestDriven.net and nUnit&lt;/b&gt;&lt;br&gt;&lt;i&gt;Presented by John Baird&lt;/i&gt;&lt;/p&gt;&lt;p&gt;I'm a fan of crude humor, and John didn't fail to deliver. His great talk on a test driven development process and how to use nUnit was sprinkled with boisterous yelling and possibly inappropriate jokes that I found hilarious. Atalasoft &lt;a href="http://www.billbither.com/cs/blogs/billbither/archive/2007/11/13/9-concepts-high-tech-ceo-s-should-know-about-software-development.aspx" target="_blank"&gt;is an agile shop&lt;/a&gt; so John was preaching to the choir on this one (well, only if the choir was made up of the three Atalasoft employees there, because the rest of the crowd was still living in dark ages of simple bench testing). He walked through the benefits of the agile process and how you can cut programming time down from 7 days to 4 while adding in 3 days of test implementation. It's a hard concept to wrap your head around, but it's the truth. Those 3 days you're implementing tests, you're actually writing the actual code in your head, making the job of actually putting it into Visual Studio &lt;a href="http://www.urbandictionary.com/define.php?term=wicked" target="_blank"&gt;wicked&lt;/a&gt; &lt;a href="http://www.urbandictionary.com/define.php?term=crazy" title="Look at definition number 4." target="_blank"&gt;crazy&lt;/a&gt; easy.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;;subject=Code+Camp+9%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;;title=Code+Camp+9%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;title=Code+Camp+9%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;;title=Code+Camp+9%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx&amp;amp;;title=Code+Camp+9%3a+Thoughts+and+Impressions&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/07/code-camp-9-thoughts-and-impressions.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13627" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="Conferences" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Conferences/default.aspx" /></entry><entry><title>&quot;Bad, IIS. Bad!&quot; - Forcing IIS to run your site in .NET 2.0</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx</id><published>2008-04-03T14:43:00Z</published><updated>2008-04-03T14:43:00Z</updated><content type="html">&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"&gt;&lt;div style="padding:8px;font-family:Arial,Helvetica,sans-serif;font-size:10pt;"&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"&gt;&lt;img src="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.jpg" align="right" height="381" hspace="10" width="350"&gt;&lt;/span&gt;I was working in IIS, today, and came across an issue where it was attempting to load my site in ASP.NET 1.1.xxx. I, for one, know that the site I was deploying was built as a precompiled web from VS2005, which, as far as I know, means that it's .NET 2.0 for sure. I also knew that all of the assemblies I was referencing were .NET 2.0 and the web config had all the appropriate .NET 2.0 love.&lt;/p&gt;&lt;p&gt;The first thing I did was search around IIS to see if there was a way to beat it into submission and force it to run the site in ASP.NET 2.0. No luck... I believe the newer versions of IIS have this functionality, because I swear I've used it before, but I wanted to deploy now!&lt;/p&gt;&lt;p&gt;After a bit of searching, I came across this great little utility called &lt;a href="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx" target="_blank"&gt;ASP.NET Version Switcher&lt;/a&gt; that saved me a boatload of time by Denis Bauer.&lt;span class="Apple-style-span" style="font-family:'Lucida Grande';font-size:12px;white-space:pre;"&gt;&lt;/span&gt; It shows all of the sites in IIS and easily lets you switch the .NET Framework version for any one. Granted, it just runs the command line utility that I'm sure is easy enough to figure out, but GUIs are nice too.&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;subject=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13596" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="ASP.NET" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx" /><category term="IIS" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/IIS/default.aspx" /><category term="Deployment" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Deployment/default.aspx" /></entry><entry><title>AJAXWorld '08: Thoughts and Impressions</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx</id><published>2008-03-26T11:52:00Z</published><updated>2008-03-26T11:52:00Z</updated><content type="html">&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse:collapse;font-family:arial;"&gt;This was my second conference as an Atalasoft employee and I must say, 'I have terrible luck.' Back in September, I went with my coworker &lt;a href="http://www.atalasoft.com/blogs/rickm/" target="_blank"&gt;Rick&lt;/a&gt; to &lt;a href="http://www.remix07boston.com/" target="_blank"&gt;ReMix&lt;/a&gt; in Boston and, while I can't speak for the both of us, I was largely unimpressed. The content was definitely geared towards a different audience: the sessions progressed very slowly and the demos were more than basic, not showing much at all. To its credit there were excellent keynotes by Microsoft about &lt;a href="http://labs.live.com/photosynth/" target="_blank"&gt;Photosynth&lt;/a&gt; and &lt;a href="http://tirania.org/blog/" target="_blank"&gt;Miguel de Icaza&lt;/a&gt; about &lt;a href="http://www.mono-project.com/Main_Page" target="_blank"&gt;Mono&lt;/a&gt; (a near-complete .NET implementation for the Linux platform). They both entertained and gave me a lot to take away. Also of note, &lt;a href="http://mlb.mlb.com/index.jsp" target="_blank"&gt;MLB&lt;/a&gt; was there as well showing off their new digs. And it's always good to throw in a plug for the caterers which provided amazing food. Simply amazing.&lt;br&gt;&lt;br&gt;When I heard that I would be attending &lt;a href="http://ajaxworld.com/" target="_blank"&gt;AJAXWorld&lt;/a&gt; a few months ago, I was pretty excited. I thought it would be bigger than ReMix and attract even larger contributors, like Google-Microsoft-Yahoo-Adobe. It was in NYC, so that's always a plus if you like being in the city (which I do), and its title gave the impression that there was more focus on AJAX and advanced &lt;a href="http://www.atalasoft.com/products/dotimage/thinclient/" target="_blank"&gt;zero-footprint technologies&lt;/a&gt; and not just web development. Boy, as I wrong. There seemed to be a similar number of attendees (but all of the small conference rooms were overflowing), the only large companies were Microsoft and Yahoo (Adobe was a sponsor but was never seen and Google must have had better things to do). Vague presentations on &lt;a href="http://svn.xantus.org/shortbus/trunk/bayeux/bayeux.html" target="_blank"&gt;Bayeux&lt;/a&gt; (a &lt;a href="http://en.wikipedia.org/wiki/Comet_%28programming%29" target="_blank"&gt;Comet&lt;/a&gt; protocol implementation) and an iPhone SDK session (yep, no AJAX here) failed to impress. Apple's NDA certainly didn't help the latter.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse:collapse;font-family:arial;"&gt;Ok, that was my rant, now I'll go over all the sessions I was able to attend and give credit where it's due. I attended the conference with Dave Cilley, who &lt;a href="http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/03/21/atalasoft-at-ajaxworld-2008-east.aspx" target="_blank"&gt;posted his blog&lt;/a&gt; the other day about the event and what he thought about it. He attended a few different sessions than I did, so it's definitely a good read.&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tuesday, March 18th&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 1: Comet - The Web That's Instantly On and Always On&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.jroller.com/jonasjacobi/" target="_blank"&gt;Jonas Jacobi&lt;/a&gt;&lt;/i&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;The concept is simple. Using a few different techniques, you simply make a request from the client to the server and the server doesn't respond until they have the answer. Because they respond at the moment they have the answer, the client receives feedback the moment it is available and not 5 seconds too late in the case of polling. It gives you a way to build truly event-driven applications using a publish-subscribe pattern instead of being based on Request-Response like almost all current-day AJAX applications.&lt;br&gt;&lt;/p&gt;&lt;p&gt;This presentation on Comet became a talk about server load and faux-multicasting data back to clients. While this is definitely a crucial part of Comet, since you are keeping persistent connections open to each of your clients instead of dropping them every time you answer a request, I don't feel it should have been the focus of this session. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 2: ASP.NET AJAX Design &amp;amp; Development Patterns&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.joeon.net/" target="_blank"&gt;Joe Stagner&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Joe is a very good presenter, and he brings good demos to the table as well. This presentation put focus on the &lt;a href="http://www.asp.net/ajax/" target="_blank"&gt;ASP.NET AJAX Toolkit&lt;/a&gt; provided by Microsoft and some best practices when using it. I'm glad he took some time to point out that while it's really easy (and maybe tempting) to use Update Panel, you should do it&amp;nbsp; in very few situations. Because the Update Panel is a do-it-all control, it just posts back the entire page and all of it's data in the background. The server is smart enough to only respond with what is necessary, but there is a lot of overhead in using it. Once the data gets back to the client, Update Panel does its job in shoving the changed content back where it belongs.&lt;/p&gt;&lt;p&gt;He also showed us a text editor called &lt;a href="http://www.contexteditor.org/" target="_blank"&gt;ConTEXT&lt;/a&gt; which I will have to look into more.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 4: Improving ASP.NET User Interfaces with the AJAX Control Toolkit&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://aspadvice.com/blogs/robertb/" target="_blank"&gt;Robert Boedigheimer&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;I've played with this toolkit before, so it was a nice overview, but there wasn't really anything new for me to see here. ASP.NET AJAX is a great way to create web apps with some AJAXy goodness without having to learn Javascript. One thing Robert pointed out that I wasn't aware of is that you can actually download the source for the toolkit and edit it. Microsoft even provides customers with an snk file so they can sign the assembly for deployment! Granted, whenever you make a change, just know that you're going to either have to support it every time you upgrade to a new version of the toolkit, or you'll have to convince the writers to add in your fix later.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wednesday, March 19th&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 1: Can We Fix the Web?&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.crockford.com/" target="_blank"&gt;Douglas Crockford&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Douglas created &lt;a href="http://en.wikipedia.org/wiki/JSON" target="_blank"&gt;JSON&lt;/a&gt; so he obviously knows what he's talking about. This opening keynote (at 7:30am!, ouch) proposed that we need to completely start over on the internet. It was written for static sites with static content that did nothing but bring text to the web. Today, we are trying to build highly dynamic applications that allow us to use the web in ways it was certainly not intended to be used. Sure, he makes a good point. Web development is hard, and Javascript is insecure, and its potential successor is seriously flawed by being entirely backwards compatible, but do we have a choice? When Microsoft releases a new operating system, they risk destroying every application that was every written for it. We have to take this in steps, but Douglas understands that. His presentation was bold for a purpose, to get us thinking about the urgency of the issue and take the steps toward fixing the problem. Here are some of his suggestions in how we might move forward:&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Advertisers should conform to a subset of Javascript called AdSafe. Currently, ads have full access to the DOM and can potentially wreak havoc on any site hosting them. When asked why Yahoo doesn't lead this front, he explained that it will require support from all major online advertisers (Yahoo, Microsoft, and Google) to adopt this standard before it is a viable solution. If any one adopted it first, not only would the standard fail, but that company would see incredible drops in its advertiser base.&lt;/li&gt;&lt;li&gt;Firefox needs to stop doing evil things with Javascript.&lt;/li&gt;&lt;li&gt;Google Gears and Adobe AIR (and others) should and use create a common communication protocol.&lt;/li&gt;&lt;li&gt;IFrames must be eliminated entirely.&lt;/li&gt;&lt;/ul&gt;Web development is like &lt;a href="http://en.wikipedia.org/wiki/Turducken" target="_blank"&gt;Turducken&lt;/a&gt;.&lt;br&gt;&lt;p&gt;&lt;u&gt;Session 3: Developing AJAX Applications for iPhone and iPod Touch&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.aptana.com/node/292" target="_blank"&gt;Kevin Hakman&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Kevin works for a company, &lt;a href="http://www.aptana.com/" target="_blank"&gt;Aptana&lt;/a&gt;, which develops an IDE for AJAX development. It's offered in two forms: a plugin to Eclipse as well as a standalone application, and it has support for Mac OS X, Windows, and Linux which is nice.&lt;/p&gt;&lt;p&gt;For iPhone development, Aptana offers an iPhone emulator and also works directly with the iPhone simulator provided by the iPhone SDK offered for the Mac platform. It provides code completion and some pretty solid debugging features for javascript development. &lt;br&gt;&lt;/p&gt;&lt;p&gt;In addition to the IDE, Kevin talked about a javascript web server called &lt;a href="http://www.aptana.com/jaxer" target="_blank"&gt;Jaxer&lt;/a&gt;. He didn't mention its performance, but it basically allows you to write all of your code (client and server) in the HTML file and use runat attributes in your script tag to specify which end it's destined to run on. You can easily create server-proxy functions (AJAX calls) inline with your javascript without knowing anything about XmlHttpRequest or other AJAX techniques. Very slick.&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 4: Real-Time, Real-Time, or Real-Time Web 2.0?&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://jjacobi.blogspot.com/" target="_blank"&gt;Jonas Jacobi&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This was essentially a condensed version of the first session we went to on day 1. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 5: jMaki as an AJAX Mashup Framework&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://weblogs.java.net/blog/arungupta/" target="_blank"&gt;Arun Gupta&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This was very interesting. In addition to providing a framework for developing AJAX Mashups, they allow you to abstract away objects from different libraries and allow them to interact with one another "seamlessly". The "j" in &lt;a href="https://ajax.dev.java.net/" target="_blank"&gt;jMaki&lt;/a&gt; stands for Java, I'm assuming, so I'm not sure how much use I'll get out of it in ASP.NET-land.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 7: HTTP Multicast Routing, Scalling the Real-Time Web&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.kaazing.com/content/view/63/81/" target="_blank"&gt;Ric Smith&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This went deeper into the way HTTP "Multicasting" works and how it could be implemented. I don't think he needed to go into Comet at all, since it was just another overview with no code, but at least in this presentation, we learned that there was a reason for
why it was so vague... Bayeux is in private beta and they couldn't show
us any code. I'm a big fan of demos, so this was definitely a
disappointment.&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 9: RIAs with Comet and Critical Updates in Enterprise Environments&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by Emil Ong&lt;/i&gt;&lt;/p&gt;&lt;p&gt;The only reason why I went to this session is because the presenter was not from Kaazing (the other three Comet prezos were). I have nothing against Kaazing or their products, they just wouldn't show me any cool code because they're in Private Beta. Emil showed off some neat stuff and with his diagrams of how their SDK worked, I was able to better understand how I might implement a Comet solution. Again, the only problem I see here from my perspective is that it's for Java and I work in a .NET shop.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Thursday, March 20th&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;u&gt;Session 2: Introduction to the iPhone SDK&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://iphone.sys-con.com/author/744hoffman.htm" target="_blank"&gt;Kevin Hoffman&lt;/a&gt;&lt;/i&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;As I mentioned in my rant, the lack of content in this presentation is not Kevin's fault. He's just honoring the NDA he signed (like the rest of us that downloaded the iPhone SDK) stating he could say nothing about it. Most of his presentation went over the limitations of the SDK and focused on re-showing us what happened at the event where Apple launched the public beta program. One thing that threw me for a loop was hearing that to debug your application, you either need to rely completely on the iPhone simulator, buy an iPod touch, or sacrifice your iPhone! That's right, in order to test your application, you need to install a special version of iPhone software that removes the phone functionality and Edge connectivity, presumably making AT&amp;amp;T happy. According to Kevin, the License Agreement states that there's no guarantee that your iPhone will ever be the same again...&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 3: Now Playing - Desktop Apps in the Browser!&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://www.nexaweb.com/" target="_blank"&gt;Coach Wei &amp;amp; Bob Buffone&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This was purely entertaining at the expense of the presenters. They went back and forth in a "tightly orchestrated" dialog that was so corny it made me laugh. I would tell you more about what they had to offer, but I stopped listening when they posted the text "That's Retarded" on the big projector. It was in response to something scriptedly-stupid that his fellow presenter said. While, in context, this could be seen as funny, but my girlfriend is a special needs teacher in a middle school and I have certain feelings about using these words out of the realm of diagnosing a person with mental disabilities.&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session 4: DreamFace - The Ultimate Framework for Creating Personalized Web 2.0 Mashups&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by Oliver Poupeney&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This was, by far, the most visually-interesting presentation of the entire conference. Through the web interface, he put together a demo workflow right in front of us. It was very impressive to see how a user could tie a web service to a functioning widget and serve it into a mashup.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Session: The Digital Black Belt's Guide to Building Secure ASP.NET AJAX Applications&lt;/u&gt;&lt;br&gt;&lt;i&gt;Presented by &lt;a href="http://joeon.net/" target="_blank"&gt;Joe Stagner&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Both of the presentations he gave that I went to, he started things off with a quote from Einstein: "The problems that exist in the world today cannot be solved by the level of thinking that created them." I found a few versions of that quote online and just picked that one... so if it's not the real Einstein quote then, "I'm sorry, Albert."&lt;/p&gt;&lt;p&gt;But isn't that why we're at this conference? So that we can all put our heads together and become smarter than our past-selves who created these problems in the first place?&lt;/p&gt;&lt;p&gt;Joe showed us some cool tools like &lt;a href="http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project" target="_blank"&gt;WebScarab&lt;/a&gt; and put some good examples on the projector that can get people thinking. The big ones were about injecting javascript into SQL making that code run at a later time for someone else that visits the site. Very cool, but easy to defend if you go through the process of never trusting anything that comes into your site like Joe suggests. That's a good rule to live by.&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;;subject=AJAXWorld+%2708%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;;title=AJAXWorld+%2708%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;title=AJAXWorld+%2708%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;;title=AJAXWorld+%2708%3a+Thoughts+and+Impressions" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx&amp;amp;;title=AJAXWorld+%2708%3a+Thoughts+and+Impressions&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/26/ajax-world-08-thoughts-and-impressions.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13551" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author><category term="AJAX" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx" /><category term="Comet" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Comet/default.aspx" /><category term="Conferences" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Conferences/default.aspx" /><category term="Turducken" scheme="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Turducken/default.aspx" /></entry><entry><title>Putting the Post on a Pedestal</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx" /><id>http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx</id><published>2008-03-25T19:04:00Z</published><updated>2008-03-25T19:04:00Z</updated><content type="html">&lt;span class="Apple-style-span" style="font-size:12px;"&gt;&lt;p style="padding-top:0px;padding-right:0px;padding-bottom:15px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:20px;"&gt;I’ve wanted to start a blog for a long time now, but whenever I have time to do it, I always convince myself to put it off until next time. Being my first post, I’d like to tell you all a little about myself and what I’d like to bring to the Blogosphere.&lt;/p&gt;&lt;p style="padding-top:0px;padding-right:0px;padding-bottom:15px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:20px;"&gt;My name is Jacob Lauzier and I am a Software Engineer, here, at Atalasoft in Easthampton, MA.&lt;/p&gt;&lt;p style="padding-top:0px;padding-right:0px;padding-bottom:15px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:20px;"&gt;My previous title was Software Systems Engineer, dealing with build issues and making sure software releases went out on time and in tact. During my transition into the world of AJAX development I’m sure I’ll keep my hands in builds for at least a while. You’ll even see that transition unfold here as I talk about my work toward contributing to the NAnt community as well as my experiences at AJAX World '08.&lt;/p&gt;&lt;p style="padding-top:0px;padding-right:0px;padding-bottom:15px;padding-left:0px;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:20px;"&gt;I hope to be writing again very soon.&lt;/p&gt;&lt;/span&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;;subject=Putting+the+Post+on+a+Pedestal" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;;title=Putting+the+Post+on+a+Pedestal" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;title=Putting+the+Post+on+a+Pedestal" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;;title=Putting+the+Post+on+a+Pedestal" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx&amp;amp;;title=Putting+the+Post+on+a+Pedestal&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/03/25/putting-the-post-on-a-pedistal.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13548" width="1" height="1"&gt;</content><author><name>jacobl</name><uri>http://www.atalasoft.com/cs/members/jacobl.aspx</uri></author></entry></feed>