<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Pat Gannon's blog</title>
        <link>http://patrickgannon.net/Default.aspx</link>
        <description>.NET, SQL Server, Javascript, Tcl</description>
        <language>en-US</language>
        <copyright>Pat Gannon</copyright>
        <managingEditor>PatrickJosephGannon@yahoo.com</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <image>
            <title>Pat Gannon's blog</title>
            <url>http://patrickgannon.net/images/RSS2Image.gif</url>
            <link>http://patrickgannon.net/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Tip: Creating DB Defaults After The Fact</title>
            <link>http://patrickgannon.net/archive/2008/06/11/tip-creating-db-defaults-after-the-fact.aspx</link>
            <description>&lt;p&gt;We have all written SQL scripts to create a table that has one or more column defaults, as follows:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;create table MyTable&lt;br /&gt;
(&lt;br /&gt;
     myTableId int primary key identity(1,1),&lt;br /&gt;
     name varchar(100) not null,&lt;br /&gt;
     modifiedOn datetime &lt;strong&gt;default(getdate())&lt;/strong&gt;,&lt;br /&gt;
     someOtherDate datetime&lt;br /&gt;
)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That works well, but in some cases, you want to add a default after the fact, and you don't want to drop and re-create the table with the new default (because there is data in the table).  I had this situation today so I decided to load up SQL Books Online and see if I could figure out how to write a SQL script to add a default to an existing table.  (I prefer to keep incremental schema change scripts rather than making schema changes in SQL Server Management Studio, or Enterprise Manager in this case, because it makes it easier to keep multiple environments/DBs in sync.)  I would have expected the syntax to be something like this:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;alter table MyTable add default df_modifiedOn to someOtherDate 'getdate()'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...but it's nothing of the sort.  The syntax is a bit weird, IMO, and here it is:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font face="Arial"&gt;create default df_someOtherDate AS 'getdate()'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;sp_bindefault df_someOtherDate, 'MyTable.someOtherDate'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;GO&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;font face="Arial"&gt;I'd be interested to know if there's other syntax out there for accomplishing the same goal in one SQL statement.  (Post a comment!)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;That's all folks!&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; As it turns out, the type of default created by using using "create default" is a different sort of default than the one you get by specifying "default" in a column definition, and the type created by "create default" is only maintained in SQL Server for backwards-compatibility.  (In other words, don't do it unless you absolutely have to.)&lt;/p&gt;
&lt;p&gt;I removed the default I created using the above method (using sp_unbindefault and then 'drop default') and then I created a new default by dropping and re-adding the column (so I guess my initial instinct on how to do this was almost correct).&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;alter table MyTable drop column someOtherDate&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;alter table MyTable add someOtherDate datetime not null default(getdate())&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As it turns out, the data in this particular column is not valuable to me at this point, so dropping and re-adding the column is an acceptable solution.  If you needed to preserve that data, you could dump it into a temporary table before dropping and re-adding, and then dump it back into your regular table from the temporary table.  Is there a simpler way to do this?&lt;/p&gt;&lt;img src="http://patrickgannon.net/aggbug/6.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/06/11/tip-creating-db-defaults-after-the-fact.aspx</guid>
            <pubDate>Wed, 11 Jun 2008 19:13:41 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/6.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/06/11/tip-creating-db-defaults-after-the-fact.aspx#feedback</comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/6.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Should Developers Learn C?</title>
            <link>http://patrickgannon.net/archive/2008/06/06/should-developers-learn-c.aspx</link>
            <description>&lt;p&gt;I recently listened to &lt;a href="http://weblogs.asp.net/jgalloway/archive/2008/06/05/technology-round-table-podcast-3-should-developers-learn-c-teched-2008-keynote-announcements.aspx"&gt;Technology Round Table Podcast #3&lt;/a&gt; and one of the topics was 'Should Developers Learn C?'.  In it, &lt;a href="http://weblogs.asp.net/jgalloway/"&gt;Jon Galloway&lt;/a&gt; stated that there are much more important things developers could spend their time learning than C (such as learning their core platform in-depth - eg. .NET/SQL Server).  Another voice (perhaps it was &lt;a href="http://www.lazycoder.com/weblog/"&gt;Scott Koon&lt;/a&gt;?) said that it is necessary for developers to learn about how their code is working 'under the hood' (memory and registers, etc.), and he gave a metaphore that developers who don't know how things are working at that level can only &lt;em&gt;paint your car&lt;/em&gt; rather than making more substantive changes.  Although all metaphores break down at some point, I think this is a particularly weak one.  If someone can totally overhaul a system (such as one written in VB or on top of .NET) by making major changes to the code, that amounts to a heck of a lot more (metaphorically speaking) than just re-painting a car, even if they don't know how to interpret assembly or inspect the heap manually if they wind up having an unhandled error in unmanaged code.  (I think a better analogy might be a mechanic who could replace your transmission versus a mechanic who could re-build your transmission.)  Heck, I've taken two classes in assembly (one for x86 chips and one for Motorolla chips) and I normally don't even bother to try to interpret that generated assembly if I somehow get such an error.  I probably could if I had too, but there's normally much more effective ways to debug a problem written in a higher level language than debugging the underlying assembly.  Although I can't say it's NEVER necessary, it hasn't been necessary for me in the 8+ years I've been developing software professionally in high-level languages.&lt;/p&gt;
&lt;p&gt;My first reaction to this discussion was to think: Well it's really not enough to just learn C, you really should learn assembly language first to understand things at a REALLY low level (invoking hardware interrupts, etc.), and then learn C.  In reflecting on Jon's take on the issue, however, I realized that perhaps one size does not fit all.  I wonder if people's opinion on this issue really just reflects their own personal background.  I think I was certainly guilty of that in my first analysis of the question.  (I, after all, learned assembly language and C and C++...)  It seems to me now that this boils down to an issue of human nature.  People that attain some degree of success in life commonly are inclined to encourge people to follow in their foot-steps.  In other words, if I perceive myself as successful, then the path to success that I'm most familiar with is probably going to be my own.  So if one never really had to learn C, but one still perceives oneself as successful, then one is probably going to advocate that it's not really necessary for developers to learn C.  If one forged their software knowledge in the fires of assembly and C, however, one is likely to suggest that as much is necessary for developers to learn.&lt;/p&gt;
&lt;p&gt;I think the more important question is: '&lt;em&gt;Who should learn C?&lt;/em&gt;' and furthermore &lt;em&gt;'Who should learn assembly?&lt;/em&gt;'  I think the answer lies in what type of software the developer works on, and what direction they would like to take in their career.  As I have &lt;a href="http://blogs.veloc-it.com/pat/archive/2008/01/30/teaching-computer-science.aspx"&gt;previously blogged&lt;/a&gt;, I think there will be more distinct career paths within software development as the field matures.  Like in medicine, we will have the equivelent of doctors/MDs (framework developers, language creators, AI specialists, etc.) and the equivelent of nurses/RNs (developers who work on small line-of-business applications and small web apps) and the equivlent of nursing assistants (junior developers, QA testers, etc.).  Based on that belief, I think that the training necessary for a developer who works on embedded systems or large-scale web app frameworks is different than the training necessary for a developer who works on point-of-presence web sites, just as the training for an MD is entirely different than the training for RNs.  MDs need to be able to diagnose rare, mysterious diseases and come up with a customized plan of treatment for a patient who may have multiple conditions, whereas an RN just needs to know how to diagnose and treat common problems, administer medication, talk to families, etc.  Accordingly, MDs have to study the mechanics of the human body in a lot more detail, whereas RNs learn more about 'soft skills' and the like.&lt;/p&gt;
&lt;p&gt;Should you learn C (or Erlang or Smalltalk)?  That depends on what you want to do.  If you want to work on massively scalable applications or complex embedded systems, then yes, you probably should learn C and also possibly assembly and/or IL.  If you just want to continue creating line of business applications in VB.NET (which is not to say that you're not improving), then you would probably be better off spending your time on something else that will make you a better developer.  (Do I even need to list the plethora of options?)&lt;/p&gt;&lt;img src="http://patrickgannon.net/aggbug/5.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/06/06/should-developers-learn-c.aspx</guid>
            <pubDate>Fri, 06 Jun 2008 17:56:37 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/5.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/06/06/should-developers-learn-c.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/5.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Written Requirements vs. On-site Customers</title>
            <link>http://patrickgannon.net/archive/2008/05/25/written-requirements-vs.-on-site-customers.aspx</link>
            <description>&lt;p&gt;I have been reading "The Art of Agile Development" by James Shore and Shane Warden, and I just finished the first section (chapters 1-4).  It is a very lucid and pragmatic guide to practicing XP, and I am anxious to put some of these ideas into action.  I must admit that prior to reading this book, I thought that XP teams iteratively encapsulated requirements in stories, and I didn't really grasp the note card concept.  In actuality, each story is merely a brief representation of a bite-sized unit of functionality (used for release planning and tracking), and the detailed requirements are relayed in real time by the on-site customer, and are not written down.  This is an intriguing concept, but I have a lot of questions about how to apply this on the types of projects I tend to work on.  I am hoping the rest of the book will resolve some of these questions.  In this post I'll compare the advantages and disadvantages of an on-site customer versus a requirements document (iteratively developed or written up front).&lt;/p&gt;
&lt;p&gt;There are a few really significant advantages of using an on-site customer (or two or three) on your project.  The first is that the requirements are never out of date.  In a world where businesses are growing and adapting constantly, it is critical that development teams understand and act on the changing requirements of their business with as little lag time as possible.  In short, technical agility enables business agility, and business agility is a big competitive advantage in a dynamic market place.  Furthermore, technical staff (eg. developers) don't waste time writing requirements documents, which are essentially depreciating assets because they become increasingly out-dated over time.  Arguably roughly the same amount of time is spent analyzing requirements over-all, but the time is spent by business stake-holders whose time may be less expensive (because they are employed directly by the client and/or because they are lower-level domain experts with less years of experience than developers in the case of teams large enough to warrant on-site clients in addition to the Product Manager), and whose investment of time analyzing requirements in-depth can be more easily capitalized on by the client organization outside the scope of the current project.  (In-house domain experts are in a good position to recommend process improvements and propose future projects.)  Finally, customers can manage the relative priority of specific features within a story in real-time (like whether or not it's more important to validate a particular piece of data or add a new field, for example), which further enables business agility.&lt;/p&gt;
&lt;p&gt;There are some disadvantages of using on-site customers in liu of writing a requirements document, however.  One disadvantage of particular interest to projects on a tight budget is that offshoring is much less feasible.  Sending an on-site customer half-way around the world for an extended period of time is going to prove too difficult and costly for many organizations to consider.  Attempting to provide a virtual on-site customer over the internet is problematic as well due to the drastic time differences usually present between western clients and eastern development teams.  The situation would seem to prove even more complex for mixed project teams that have some developers on-shore and some developers off-shore.  This would seem to require two on-site customers (one for each site) who would probably spend as much time synchronizing with each other as relaying requirements to the development team.  Another disadvantage is that this method of analyzing requirements would seem to be incompatible with fixed bid projects.  Although I tend not to prefer working on fixed bid projects, they are often a fact of life because they reduce the monetary risk to the client, and they offer a "price tag" that is easy for clients to base a purchasing decision on.  When you do a fixed bid project, it is necessary to precisely define the functionality that will be developed for the price offered.  Fixed bid projects put clients and development teams at competing interests; it is in the client's best interest to squeeze every bit of valuable functionality that they can out of the fixed bid project, so in the common case that there is judgement call about what requirements are in-scope and what are not, clients will always strongly air on the side of in-scope.  As such, the more amguity there is in the scope definition, the more work the client will lump into the project they're paying a fixed amount for.  Therefore, a development team must define the scope very precisely in order to stand any chance of having a fixed bid project be profitable (in most situations).  A comprehensive requirements document, while it still may not define scope completely, serves that purpose much better than an on-site client from my perspective.  Finally, in my experience with requirements analysis, when asking business stakeholders about how a particular process should take place, they often realize their process is not as clearly defined as it ought to be, and they must circle the wagons internally in order to clarify the process.  Since that takes time, doing so in the middle of a development effort could cause unexpected delays and thus cause deadlines to be missed (or long hours to be put in at the end of an iteration since clients always seem to think they can provide the answers in the eleventh hour and you ought to be able to automate their process within minutes of their defining that process for you).&lt;/p&gt;
&lt;p&gt;In addition to those disadvantages of on-site customers, there are some advantages to writing requirements documents.  First, it allows problem areas to be exposed up-front, so that related functionality can be implemented first and scheduling risks can be mitigated early on, which is benificial in managing client expectations and forecasting project cost/ROI accurately.  This is true of both iteratively developed requirements documents (developed at the beginning of each iteration) as well as requirements documents written entirely up front (but is more true of the latter).  Another related advantage for requirements documents written entirely up-front is that they enable more precise long-term resource allocation for the development of a strategic project by an important deadline like a trade show (because estimates can be made more accurately for a specific set of critical functionality).  Lastly, up-front requirements documents enable system architects to assess appropriate high-level technology choices prior to project inception.  Although emergent design is a great way to establish a flexible and clean architecture for code-based solutions, it seems less effective for leveraging pre-existing tools or frameworks within the application.  For example, if you define requirements iteratively (or even more so if they're defined continuously as with an on-site customer), you may decide to hand-code certain business logic in an early iteration, and then realize in a future iteration that utilizing BizTalk makes sense to enable the functionality in that iteration, so business logic relating to that functionality should be defined within BizTalk.  At that point, you must either have business logic scattered in multiple sources (some in BizTalk, some in "code"), or you need to spend time re-creating the existing business logic in BizTalk and removing it from code.  Similarly, you may send out some simple email notifications manually in an early iteration, and then realize in a later iteration that it makes sense to use the (.NET 3.0) Workflow Framework to conditionally send all notifications in the application, at which point you would need to retro-fit your existing notification functionality, which results in a greater total amount of time needed to implement the notification functionality in this fictional project (because requirements were defined iteratively).&lt;/p&gt;
&lt;p&gt;Although I think a lot of projects can benefit from having an on-site customer, there are other project circumstances which demand a traditional requirements document.  Those projects include fixed bid projects, fixed deadline projects, projects utilizing offshore developers and solutions heavily leveraging pre-existing frameworks/middleware/etc.  On-site customers seem to work best in environments meeting the fairly extensive list of pre-requisites to practicing XP on a project: Management Support, Team Agreement, A Colocated Team, (On-Site Customers), The Right Team Size and Use All Practices (Shore: pages 44-49).  Although this list seems prohibitive, the Shore book offers advise about how to change your environment into one that meets the pre-requisites.  Additionally, "advanced XP" can still be applied to environments where one or two pre-requisitves may not be satisfied.  For many projects with a less compatible and flexible environment, writing a requirements document (sometimes even up-front) still makes sense.  I may post about this topic again if the rest of the book impacts my opinions on this topic significantly.&lt;/p&gt;&lt;img src="http://patrickgannon.net/aggbug/4.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/05/25/written-requirements-vs.-on-site-customers.aspx</guid>
            <pubDate>Mon, 26 May 2008 02:35:28 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/4.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/05/25/written-requirements-vs.-on-site-customers.aspx#feedback</comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/4.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Next NBNUG meeting: Subversion Integration in Visual Studio</title>
            <link>http://patrickgannon.net/archive/2008/04/11/next-nbnug-meeting-subversion-integration-in-visual-studio.aspx</link>
            <description>&lt;h4 style="TEXT-ALIGN: center" align="center"&gt;&lt;span style="COLOR: red; FONT-FAMILY: Verdana"&gt;Tuesday&lt;/span&gt;&lt;span style="FONT-FAMILY: Verdana"&gt;, 4/15/2008, meeting at &lt;/span&gt;&lt;st1:time minute="0" hour="19"&gt;&lt;span style="FONT-FAMILY: Verdana"&gt;7:00 PM&lt;/span&gt;&lt;/st1:time&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h4&gt;
&lt;h2 style="TEXT-ALIGN: center" align="center"&gt;&lt;span id="WhereWhenField"&gt;&lt;/span&gt;O'Reilly Media in &lt;st1:place&gt;Sebastopol&lt;/st1:place&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;p style="TEXT-ALIGN: center" align="center" valign="top"&gt;&lt;span id="WhereWhenField"&gt;&lt;/span&gt;&lt;st1:street&gt;&lt;st1:address&gt;1003-1005 &lt;span class="SpellE"&gt;Gravenstein&lt;/span&gt; Highway North&lt;/st1:address&gt;&lt;/st1:street&gt;, Sebastopol&lt;br /&gt;
Tarsier Conference Room (between Building B and Building C)&lt;br /&gt;
(8 miles west of &lt;st1:city&gt;&lt;st1:place&gt;Santa Rosa&lt;/st1:place&gt;&lt;/st1:city&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;span id="DescriptionField"&gt;
&lt;div align="center"&gt;
&lt;table style="WIDTH: 466.5pt; mso-cellspacing: 2.2pt; mso-padding-alt: 0in 0in 0in 0in" cellspacing="3" cellpadding="0" width="622" border="0" class="MsoNormalTable"&gt;
    &lt;tbody&gt;
        &lt;tr style="mso-yfti-irow: 0"&gt;
            &lt;td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt"&gt;
            &lt;p class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: Verdana"&gt;My development team has recently switched from Visual SourceSafe and &lt;span class="SpellE"&gt;SourceOffSite&lt;/span&gt; to Subversion (SVN) for source code revision control.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: Verdana"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p class="MsoNormal"&gt;&lt;span style="FONT-FAMILY: Verdana"&gt;In this presentation, I'll talk briefly about the reasons we switched, and share how the transition was accomplished. The bulk of the presentation will be a workshop in which we'll connect two or more computers to a live SVN repository and let group members discover how to work with SVN hands-on.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"&gt;
            &lt;td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt" valign="top"&gt;&lt;span id="Bio0"&gt;
            &lt;p style="MARGIN: 0in 0in 3.05pt"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
            &lt;table style="WIDTH: 95%; mso-cellspacing: 0in; mso-padding-alt: 0in 0in 0in 0in" cellspacing="0" cellpadding="0" width="95%" border="0" class="MsoNormalTable"&gt;
                &lt;tbody&gt;
                    &lt;tr style="mso-yfti-irow: 0"&gt;
                        &lt;td style="PADDING-RIGHT: 0in; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; PADDING-TOP: 0in"&gt;
                        &lt;h2 style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;&lt;span id="Span1"&gt;&lt;span class="itemtitle"&gt;Speaker Biography&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr style="mso-yfti-irow: 1"&gt;
                        &lt;td style="PADDING-RIGHT: 0in; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; PADDING-TOP: 0in"&gt;&lt;span id="Span2"&gt;
                        &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
                        &lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Steve &lt;span class="SpellE"&gt;Bockman&lt;/span&gt; is an independent software developer who began his career in 1977 in a utility position, installing software packages for a manufacturer of business computers. Since then he has worked in the fields of speech recognition, terrain analysis, computer graphics, desktop publishing, industrial automation and web applications.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
                        &lt;p class="MsoNormal"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
                        &lt;p class="MsoNormal"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Steve’s first exposure to anything Agile occurred around 2000, when a co-worker suggested that they try pair programming. He liked what he saw, but didn't get involved again until 2005, while participating in a development effort in which changing requirements were part of the ground rules. He has been happily exploring Agile techniques ever since.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
                        &lt;p class="MsoNormal" style="MARGIN-BOTTOM: 12pt"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;
                        &lt;/span&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr style="mso-yfti-irow: 2"&gt;
                        &lt;td style="PADDING-RIGHT: 0in; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; PADDING-TOP: 0in"&gt;
                        &lt;h2 style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;&lt;span id="AgendaTitle"&gt;&lt;span class="itemtitle"&gt;Agenda&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes"&gt;
                        &lt;td style="PADDING-RIGHT: 0in; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; PADDING-TOP: 0in"&gt;&lt;span id="Agenda"&gt;
                        &lt;p class="MsoNormal"&gt;&lt;st1:time minute="0" hour="19"&gt;7:00 - 8:00&lt;/st1:time&gt; Subversion presentation by Steve &lt;span class="SpellE"&gt;Bockman&lt;/span&gt;&lt;br /&gt;
                        &lt;st1:time minute="0" hour="8"&gt;&lt;span id="Agenda0"&gt;8:00 - 8:10&lt;/span&gt;&lt;/st1:time&gt; Q&amp;amp;A&lt;br /&gt;
                        &lt;st1:time minute="10" hour="8"&gt;8:10 - 8:20&lt;/st1:time&gt; book raffle &lt;br /&gt;
                        &lt;st1:time minute="20" hour="8"&gt;8:20 - 8:30&lt;/st1:time&gt; wrap up &lt;br style="mso-special-character: line-break" /&gt;
                        &lt;br style="mso-special-character: line-break" /&gt;
                        &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
                        &lt;/span&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;
            &lt;/table&gt;
            &lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;/span&gt;
            &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
            &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style="MARGIN: 0in 0in 0pt"&gt; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;For more information, go to &lt;a href="http://www.baynetug.org/"&gt;http://www.baynetug.org/&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;h3 style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;Questions&lt;/h3&gt;
&lt;p style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;If you have any questions regarding this event please contact Pat Gannon at &lt;a href="mailto:nbnug.com@gmail.com?subject=North%20Bay.NET%20User%20Group%20meeting."&gt;nbnug.com@gmail!NO!SP!AM.com&lt;/a&gt;.&lt;/p&gt;
&lt;h3 style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;Event Sponsors&lt;o:p&gt;&lt;/o:p&gt;&lt;/h3&gt;
&lt;p style="MARGIN-TOP: 5.1pt; TEXT-ALIGN: center" align="center"&gt;&lt;span id="Sponsors"&gt;It will be free to attend this meeting, thanks to O'Reilly providing us the facility at no cost. &lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;img src="http://patrickgannon.net/aggbug/3.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/04/11/next-nbnug-meeting-subversion-integration-in-visual-studio.aspx</guid>
            <pubDate>Fri, 11 Apr 2008 21:29:21 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/3.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/04/11/next-nbnug-meeting-subversion-integration-in-visual-studio.aspx#feedback</comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/3.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Get started in 5 minutes - jsUnit</title>
            <link>http://patrickgannon.net/archive/2008/04/09/get-started-in-5-minutes---jsunit.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;This is the first post in a new blog post series I'm calling "Get started in 5 minutes".  In this post, I'm going to describe how you can get started using &lt;a href="http://www.jsunit.net/"&gt;jsUnit&lt;/a&gt; to unit test your client-side Javascript code in 5 minutes.  jsUnit is a port of jUnit (a Java unit testing framework) and there is a lot more to jsUnit that I'm not going to get into (you can even test server-side code), but I think this will be enough for many of you to unit test your client-side code.  In doing so, you can pracice &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test Driven Development&lt;/a&gt; without wincing when your Javascript grows in complexity.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;"Either Karate: yes, or Karate: no.  No Karate: maybe so." -Karate Kid&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Here are the steps to get started...&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=28041"&gt;Download jsUnit&lt;/a&gt; (currently jsunit2.2alpha11.zip)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;2. Extract the "jsunit" directory in the ZIP file into your web app folder.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;3. Create a Javascript library containing the code to be tested.  In this case, call it MyLibrary.js, put it in your web app folder and paste in the following code:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;function setName(name)&lt;br /&gt;
{&lt;br /&gt;
    document.all['name'].value = name;&lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;4. Create a test page (similar to a test fixture in NUnit, etc.).  In this case, call it TestMyLibrary, put it in your web app folder and paste in the following code:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;jsUnit test&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;script language="JavaScript" src="jsunit/app/jsUnitCore.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script language="JavaScript" src="MyLibrary.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script language="JavaScript"&amp;gt;&lt;br /&gt;
            &lt;br /&gt;
        function testSetName()&lt;br /&gt;
        {&lt;br /&gt;
            setName('Pat Gannon');&lt;br /&gt;
            assert('name field set incorrectly', document.all['name'].value == 'Pat Gannon');&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;input name="name" type="text" /&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;This test page includes the jsUnit library (jsUnitCore.js) which gives us testing functions like "assert".  As with other unit testing frameworks, there are a slew of assert-variants, listed &lt;a href="http://www.jsunit.net/documentation/assertions.html"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;5. Navigate to http://&amp;lt;web app&amp;gt;/jsUnit/testRunner.html (type in the URL to your web app in place of &amp;lt;web app&amp;gt;).&lt;br /&gt;
 In the first text field, enter "&amp;lt;web app&amp;gt;/jsUnit_test.html"&lt;br /&gt;
 Click the "Run" button&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;The bar on the page shows green, indicating that the test passed.  (Note that tests are auto-discovered, so the function name must begin with "test".)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;Architectural considerations&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;One thing that strikes me as sub-optimal about jsUnit is that your tests must be DIRECTLY inside your (HTML) test page.  It would be nice if you could specify your test page in one test box (on the test runner page) and specify a Javascript file (which contains the actual tests) in another text box.  The reason this would be handy is that you could specify the actual page that the Javascript will be used in (production code) as your test page without having to embed your Javascript tests in your production web page.  Since that's not possible, here are some potential work-arounds:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;A. Maintain a seperate test page from your regular (production) page&lt;br /&gt;
The problem with this approach is that if your Javascript depends on certain fields being present (or other UI constraints), then you will wind up needing to repeatedly migrate those fields (etc.) from your regular (production) page to your test page (or vise-versa if you're practicing TDD).  The nice thing about this approach is that it forces you to think about the dependencies of your Javascript code on the HTML page that uses it.  This could be adventageous when you want to re-use that Javascript because the test page provides a minimal template describing the UI elements that must be present in a page for it to use your Javascript library.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;B. Include the unit tests in the regular (production) page&lt;br /&gt;
This is the most low-maintenance, low-tech solution to the problem.  You don't have to migrate any UI fields or do anything fancy, but your pages will download slower because people that browse to your web page will be downloading your unit test code.  This also might look funny to savvy users who do a 'view source' on your web page (or other developers maintaining your code in the future).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;C. Server-side include mechanism&lt;br /&gt;
One solution that seems fairly slick to me would be to conditionally include the unit testing code in your regular (production) page using a server-side include that only comes into play when a query string parameter is present, like so:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&amp;lt;% if (Request["UnitTest"] == "true") { %&amp;gt;&lt;br /&gt;
 &amp;lt;!-- #Include File="TestMyLibrary.js" --&amp;gt;&lt;br /&gt;
&amp;lt;% } %&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;I have to admit that I haven't actually tried this approach so I'm not 100% sure it would work, but I'm confident that a solution along these lines would be possible through some mechanism.  This solution would keep maintenance (field migration) to a minimum without affecting download performance.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;D. Manual Discovery of unit tests&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Another solution that is a little klunky in my opinion would be to force the discovery of unit tests in a seperate Javascript file by declaring a Javascript function called "exposeTestFunctionNames" in your regular (production) page that returns a list of strings, which are the names of each of your test methods.  This solution would require you to include some test-related code (the aforementioned function) in your production code, but it would likely be far less than using solution B.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;Decision time&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Is there any better solutions that I haven't thought of?  In the application that I'm currently building, the test page has to be seperate from the production web page anyways (the production web pages that use the Javascript we're developing will not be under our control), so option A is a no-brainer for my current situation.  Since this is not a problem for me at the moment, I haven't actually tried to implement any of the aforementioned solutions, but I would be interested to hear how other people solve this problem (as I'm sure other people reading this blog post will be), so please post a comment!&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;Ooh... Where do we go now? (appologies to Guns N Roses)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Now that you have a basic unit test working with jsUnit, there are a number of resources that you may be interested in to help you kick it up a notch.  &lt;a href="http://www.opensourcetesting.org/unit_javascript.php"&gt;This site&lt;/a&gt; lists a number of different Javascript tools that relate to unit testing.  The most interesting thing I saw on there was &lt;a href="http://jsmock.sourceforge.net/"&gt;jsmock&lt;/a&gt;, which is a mocking framework for Javascript.  There is also &lt;a href="http://siliconforks.com/jscoverage/"&gt;JSCoverage&lt;/a&gt;, which generates code coverage statistics and &lt;a href="http://www.valleyhighlands.com/testingframeworks/"&gt;JSXUnit&lt;/a&gt; which apparently is for unit testing managed JScript code, including code that runs in Silverlight.  Last but certainly not least, you should go read the brief and to-the-point &lt;a href="http://www.jsunit.net/documentation/index.html"&gt;jsUnit documentation&lt;/a&gt;.&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;&lt;img src="http://patrickgannon.net/aggbug/2.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/04/09/get-started-in-5-minutes---jsunit.aspx</guid>
            <pubDate>Wed, 09 Apr 2008 21:53:57 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/2.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/04/09/get-started-in-5-minutes---jsunit.aspx#feedback</comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/2.aspx</wfw:commentRss>
        </item>
        <item>
            <title>You found it!</title>
            <link>http://patrickgannon.net/archive/2008/04/09/you-found-it.aspx</link>
            <description>&lt;p&gt;This is my new, re-hosted blog.  My old blog is at &lt;a href="http://blogs.veloc-it.com/pat"&gt;http://blogs.veloc-it.com/pat&lt;/a&gt; and you can view old posts there.  I may move that content over to this blog at some point, but there's no easy way to import content from an RSS feed in Subtext, so those posts will continue to live on veloc-it.com until I either decide to implement an RSS import for Subtext or just take the time to copy and paste everything.&lt;/p&gt;
&lt;p&gt;Thanks for updating your RSS feed!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://patrickgannon.net/aggbug/1.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pat Gannon</dc:creator>
            <guid>http://patrickgannon.net/archive/2008/04/09/you-found-it.aspx</guid>
            <pubDate>Wed, 09 Apr 2008 21:38:47 GMT</pubDate>
            <wfw:comment>http://patrickgannon.net/comments/1.aspx</wfw:comment>
            <comments>http://patrickgannon.net/archive/2008/04/09/you-found-it.aspx#feedback</comments>
            <wfw:commentRss>http://patrickgannon.net/comments/commentRss/1.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>