Comments

# Andrew said on November 28, 2003 12:00 PM:

I have found that a lot of simple things are like that, it is almost impossibe to find real basic instructions.

In my first explorations of c#, I had trouble declaring arrays. I would keep typing "new Array(" and then ... well I'm sure you know the feeling.

# Scott Galloway said on November 28, 2003 12:04 PM:

I think we all have those days...

# Drew Marsh said on November 28, 2003 01:36 PM:

It would be more efficient to write the code like this:

<codeSnippet language="C#">
myValue = (string)myHashtable[myKey];

if(myValue != null)
{
... work with it here ...
}
</codeSnippet>

The reason for this is that it reduces the number of lookups. In your example, you're doing two lookups: ContainsKey and then the indexer. In my code, you're doing one lookup and then testing the result which, if the dictionary doesn't contain the key, will be null.

# Mike said on November 28, 2003 02:13 PM:

Hmm, interesting. I guess I had it in my head that attempting to index the hashtable on a non-existent key would throw an Exception. Is that the "old VB6" way? Something in my brain is telling me that.

Thanks for the opimization.

Mike

# Vazz said on November 28, 2003 02:26 PM:

I admit I spent half an hour looking for the same thing. I was looking for a 'get' method! I feel accessing should be included in code snippet in the help.

# Brian Desmond said on November 29, 2003 01:27 AM:

As soon as I setup a server at school, my team is going to start doing this - agg blog for us to track everything we do.

# Josh Baltzell said on November 29, 2003 01:44 AM:

You mean to tell me that people on projects in workplaces know what the other people on the team are doing and are looking for better ways to communicate information? Weird... I want to work somewhere like that.

# Christophe Lauer said on November 29, 2003 04:34 AM:

IMHO, the weekly 15 minutes team "Standing Meeting" from Extreme Programming is more efficient... or at least is a good complement.

# Dave Burke said on November 29, 2003 09:18 AM:

I recently tailored ScottW's phenomenal .text 0.94 source for our company and particular project environment. My experience with it is on my blog under the .text category. All users can post to any project and subscribers are managed in the weblog by project. We haven't made the leap to RSS client aggregators on desktops, but no one has a problem with the email-subscription model I put in place. In a way it beats RSS since subscribers receive all comments via email as well. I, of course, use Newsgator.

The release of the project weblog was pretty successful, and I was asked to put a similar weblog system online for Proposals (which I did in a couple of days), as well as one for Opportunities.

When our people have Newsgator installed on their desks, I'll know our project weblogs have been a success.

# RDF said on November 29, 2003 01:20 PM:

Hey Mike,

who could this client be?
could it be satan?
.. or just W.

later,

# TrackBack said on November 29, 2003 11:59 PM:
# Darrell said on December 1, 2003 09:21 PM:

Have you installed IISLockdown and/or URLScan?

# Matt Berther said on December 1, 2003 10:17 PM:

Mike: Ive had a similar issue in the past and there was an error in the web.config file.

Try running the project (CTRL-F5) and if there's an error with the web.config, it will alert you as to where it is.

I hope this solves your problem.

# Phil Weber said on December 2, 2003 12:52 AM:

Also, make sure the VS Debuggers group has permission to access your application's directory.

# Jon Galloway said on December 2, 2003 01:01 AM:

This is where I turn when I run into ASP.NET Debugger problems (just rarely enough that I don't remember the answers offhand): http://www.gotdotnet.com/team/csharp/learn/whitepapers/howtosolvedebuggerproblems.doc

# Toby Henderson said on December 2, 2003 05:39 PM:

Make sure you're not running URLscan or IISlockdown wizard, if you are you need to configure URLscan to allow DEBUG.

# Jesse Ezell said on December 3, 2003 03:40 PM:

They probably assumed you would be smarter about how you returned your SQL results :-)

No one in their right mind ever returns 13,000 rows from a query to output on an ASP.NET page. Implement paging or filtering at the SQL level.

# Mike said on December 3, 2003 04:32 PM:

<rhetorical question>
Why implement paging at the SQL Server when the grid does it for you?
</rhetorical question>
In this case, it is perfectly valid to return 13,000 rows to the middle tier. I would never consider sending 13,000 rows to the UI.

Mike

# Anon said on December 3, 2003 04:46 PM:

I'd basically agree with Jesse: in most cases (OK all cases I've ever seen), it makes more sense to limit your SQL query to what you can reasonably handle in the UI layer.

# coco said on December 4, 2003 04:22 PM:

WTF? Might I ask how you came across such a strange video? Here's another gem from the Germans:

http://story.news.yahoo.com/news?tmpl=story&cid=573&ncid=757&e=10&u=/nm/20031203/od_nm/germany_cannibal_dc

# Thomas said on December 4, 2003 04:34 PM:

Its an honest to goodness workplace training video for the driver. Granted they made it funny, but it really is for training.

# TrackBack said on December 4, 2003 06:32 PM:
# Randy H. said on December 4, 2003 06:37 PM:

I agree with you, but I also think that there may be other factors that will drive the use of the CLR in Yukon. PAG and some of the well-known authors will introduce some patterns for using the CLR that will become part of the common development practice for utilizing the CLR in Yukon. I expect to see some significant coverage of this on MSDN next year too.

# Yosi Taguri said on December 5, 2003 02:13 AM:

hi mike,
I didn't extend it because it was a private work for the company I worked in...

# Johnny Hall said on December 5, 2003 04:47 PM:

AndNode andNode = node as AndNode;
if (andNode != null) {
...
return buf;
}

OrNode orNode = node as OrNode;
if (orNode != null) {
...
return buf;
}

I think. Haven't coded it up.

# Steve said on December 5, 2003 04:52 PM:

You could also do a string compare on the type.

switch(node.GetType().FullName)
{
case "Namespace.AndNode":
...
}

You may also want to think about redesigning your classes. In your current design you'll need to recode that method every time you add a new node which generally isn't a good sign.

# Steve said on December 5, 2003 04:54 PM:

When you add a new node *type* is what I should have said above.

# Johnny Hall said on December 5, 2003 04:54 PM:

I agree, best to implement Process inside each subclass.

# Andrew said on December 5, 2003 05:02 PM:

At simplest level, you could put a "Process" string property in a node.
That prop/method could return your node.left + node.OperatorText + node.right.

The instead of calling Process(node) to get a string, you would just call node.Process

Avoid names like process when you can, they are not clear ;)

# Mike said on December 5, 2003 05:10 PM:

Thanks for the quick feedback folks.

I will consider redesigning this - the Process is supposed to take a query tree and make a big SQL string out of it, based on a bunch of knowledge about column and table names has. I don't know if I want to embed that knowledge into the nodes of the tree or not.

Oh, and the actual method name isn't really Process. I'm removing details that aren't necessary or may be considered proprietary.

# CausticMango said on December 5, 2003 05:21 PM:

Any reason why you don't use the polymorphic behavior of objects and do this:

public string Process(AndNode node)
{
return String.Concat(Process(node.left), “ and “, Process(node.right));
}

public string Process(OrNode node)
{
return String.Concat(Process(node.left), “ or “, Process(node.right));
}

public string Process(TermNode node)
{
return termNode.term;
}

# CausticMango said on December 5, 2003 05:26 PM:

Based on your later description of the problem, maybe you should consider using employing the Interpreter design pattern (GoF) to represent your syntax tree as a set of composite functor classes.

Interpreter
http://www.dofactory.com/Patterns/PatternInterpreter.aspx

Functor
http://www.eli.sdsu.edu/courses/spring98/cs635/notes/command/command.html

# CausticMango said on December 5, 2003 05:33 PM:

One more thing, remember the Single Responsibility Principle (SRP) -- I see you got some advice to place the process behavior in the classes themselves. This may be a good thing, be revisit the intent of those classes first.

A class should only be defined with a single set of consistent responsibilities. If you find moving this behavior causes your Node classes to have behavior that violates there original intent, you are violating the SRP.

http://www.objectmentor.com/mentoring/OOPrinciples

# Scott Mitchell said on December 6, 2003 01:19 AM:

Both are open source, so feel free to help out with the controls! :-)

You can see the RssFeed control in action at:
http://aspnet.4guysfromrolla.com/blogs/aspnet.aspx">http://aspnet.4guysfromrolla.com/blogs/aspnet.aspx

and on the ASP.NET home page on 4Guys:
http://aspnet.4guysfromrolla.com/

More info on both controls at:
http://scottonwriting.net/sowblog/CodeProjects.htm

# Scott Mitchell said on December 6, 2003 01:28 AM:

As many others have said, you probably want to move Process into each class. As a more plain-English way of saying what CausticMango said formally, andtime you find yourself with switch statements to determine what type of object you have, best to move that functionality into each individual class...

hth

# Dan Bright said on December 7, 2003 11:28 PM:

Oh my...

I'm a bit scared...

# Andrew Cencini said on December 8, 2003 08:30 PM:

Answers to many of the questions above should come in the forthcoming Yukon Full-Text Search paper due out in a few weeks.

There are filters out there (third party and Microsoft) for other document types --> a number of XML filters, a PDF filter by Adobe, Corel has a WordPerfect filter apparently, and there are also supposedly filters for compressed files and lesser-known file types.

A few people have ventured to write sample filters in C# which I think is great. I've done similar work, but more in reverse -- putting together code to get data _out_ of IFilters, Wordbreakers and Stemmers using C# (for testing purposes). I'll be posting that shortly.

There are some more exciting multi-lingual capabilities coming in Yukon but I'd like to let the paper describe them :)

Thanks,
--andrew

# OmegaSupreme said on December 12, 2003 11:02 AM:

XBOX deployment ! :| Omg would you care to elaborate ?

# Mike said on December 12, 2003 11:18 AM:

It was a slip of the tongue...

But the idea of it...hmmm.

Another friend of mine said that apparently some people are installing Linux on XBox consoles. Its cheaper because the hardware is subsidized...

Mike

# Adam Hill said on December 12, 2003 04:27 PM:

Its not the MS CLR but....

http://primates.ximian.com/~miguel/all.html#12%252F09%252F2003+12%253A00%253A00

# Joel said on December 12, 2003 04:45 PM:

I didn't say/er mean that... grrr.... I meant XCopy and Said XBox... I was up all night - I was tired...

Joel

# Joel said on December 17, 2003 01:09 AM:

Feel better?

# Sijin Joseph said on December 17, 2003 01:56 AM:

That has to be the most convoluted piece of code i've ever heard about. Had me rolling on the floor. :D :D

# Adam Weigert said on January 15, 2004 05:39 PM:

I would say that in general to stay away from static methods.

The only exception for this is methods like the Parse method of Int32.

Since you would not want to do something like

Int32 value = Int32("123")

Because constructors are not meant to be hefty just only initializers you would instead want to call a method which implies processing.

Int32 value = Int32.Parse("123")

You would not want to do something like

Int32 value = new Int32() // if this was possible
value.Parse("123")
// or
value = value.Parse("123")

That is when you want to use a static method because you do not require an instance of the method.

Now for the business services you will ALWAYS want to create a unique instance of the class or at the very least make a Singleton object.

Also remember, static methods cannot be overriden in inherited classes.

I just found it easier to maintain objects that are instantiated versus ones with static methods.

Why, well I wrote an exception manager class and I decided, well for ease of use I'm going to make all the methods static and use a singleton approach.

Well its a nightmare now if I want to change functionality or something else on the object. What if I wanted to inherit the manager into something more specific. I can't, I'm stuck. Not to mention I had to use two objects to get the same thing one would have done.

It wasn't a true singleton. It created an instance of the instantiatble exception manager and called its methods from the static methods. NIghtmare when I look back on it. But guess what, everyone is using it and I'm stuck.

If I had done it right I would have made the exception manager abstract and then provided some base functionality then forced each app to at least create one class that implements the exception manager in an appropriate manner for their application rather than forcing all applications to fit into one container (set of methods).

Just examples of my bad experiences with static methods ...

# Mike Cole said on January 15, 2004 06:06 PM:

When a method does not consume or modify state information within a class, it is perfectly reasonble to expose it using the static modifier. Your static methods then become more of a function library that you have chosen to associate with a particular class.

One particularly valuable use of static methods is found in the factory design pattern. Here, you need a place for logic that will determine what object to actually create (and where) for return to a client.

My guess is your performance concerns are not valid. Certainly, tho, if one would normally have an instance of the class available, probably not wise overdoing the static methods. I would really need more information on this business facade layer implementation...

# Paul Wilson said on January 15, 2004 06:16 PM:

There is no performance issue. The relevant issues are things like inheritance (as Adam pointed out) and remoting. Static methods do not inherit, nor can they get remoted if you may need to use them in a distributed system. However, they are still perfectly reasonable, if not prefered, when you are creating simple libraries of functions.

# Udi Dahan - The Software Simplist said on January 16, 2004 02:48 AM:

Your co-worker is right on. This is the first step to moving to a service oriented architecture ( see a collection of thoughts on the topic here: http://udidahan.weblogs.us/archives/012028.html

Performance is not an issue here.

Note that what is being discussed is a business facade layer. This pretty much is supposed to define in what ways the business services can be called. This is not some implementation of a domain model.

Think of it as the API of the business. These are services that don't belong necessarily to any one class, but rather coordinate work among many classes.

# Radim Hampel said on January 16, 2004 03:11 AM:

Udi, I know, that your knowledge of soa is good, but i do not think, that exposing some method as static is a move towards soa. You would have to change more, than only few method. But certainly you know it, so nothing more needs to be said here :)

# Udi Dahan - The Software Simplist said on January 16, 2004 03:00 PM:

Radim,

Kudos ! You've done it ! You've managed to push me over the edge to finally ( FINALLY ) write a post on migrating to SOA.

I'll post a link here too later.

# Udi Dahan - The Software Simplist said on January 16, 2004 07:58 PM:

Although not as comprehensive as I'd planned ( for lack of space ) here it is:

http://udidahan.weblogs.us/archives/012683.html

I didn't much get into the importance of static methods per se, but there was a strong undercurrent.

# Adam Weigert said on January 17, 2004 12:32 AM:

I agree with the statement that static methods are great for function libraries. I would even go as far to say that it becomes a non-issue if you class is sealed. Since it cannot be inherited then there is no reason not to have static methods if you really do not need to maintain state.

I can some what see why an SOA layer can use static methods. There really is no need to inherit SOA services. Of course this makes me wonder how SOA scales into remoting and such.

But sometimes I'm always thinking ahead, saying to myself, you know I could extend this object in the future and if I force it to this limitation now because I'm not planning on extending it but I could see management saying 2 months after the release that they would want that functionality ... well then ...

I'm discovering maintaining API's is tricky and political business. Specially when they support line-of-business applications. :D

# Udi Dahan - The Software Simplist said on January 17, 2004 07:11 AM:

Adam,

Your comment touched on a very important, specific point. "management saying 2 months after the release that they would want that functionality ". They want functionality. They don't care about objects, inheritance, remoting, etc.

At the most basic level, adding functionality means adding another method to a given service - or adding a new service with that method. Then, use the new functionality in client code.

I don't see this as having much to do with extending objects, inheritence, etc. Its about the business. Of course, when it comes to implementing the functionality, use all the tools and methods that OO gives you - I mean, why not ?

Finally, SOA doesn't scale by remoting - whatever that means. SOA scales by either scaling up the server a given service is running on ( adding RAM, more CPUs, etc ), or by scaling out to more servers. Because of the stateless nature of a service, you don't have state affinity issues, so its that much easier.

Finally ( and this time I mean it ), SOA is ALL about line-of-business. Yes, it's sometimes tricky, but hey, that's why we get paid the big bucks.

# Avonelle Lovhaug said on January 17, 2004 04:13 PM:

I can completely relate to this post. Until last year, I was working for a consulting company, and I always felt like I was doing more than just the technical parts of my job. I was helping to respond to RFPs, participating in sales meetings, and other non-technical activities. And while I could do those things, and didn't mind doing those things, it bugged me that my job had to be more broad, while others got away with saying "I'm not technical". Especially since some of these people didn't do their own jobs very well. (Sales, marketing and PMs for example who couldn't spell or write coherent sentences, for example.)

To solve the problem, I now work as an independent consultant. I still have to do all those non-technical things (in fact, I do more of them), but I am no longer annoyed by dumb excuses by sales/marketing types.

# Shannon J Hager said on January 17, 2004 05:25 PM:

I have IE set for "Every visit to the page" and I don't have that problem in any ASP.Net apps.

# Phil Scott said on January 21, 2004 01:25 PM:

500 connection pools because of the change in security context. What's interesting when people also specify a min of 10 connections in a pool too.

# Robert Regnier said on January 21, 2004 02:02 PM:

I'd like to change the code generation to replace all Friend methods and properties with Public. Can you do this with the annotations? I doesn't look like it...

Of course, the question that'll come back is "why?". Because in order to write reusable code, I need to work at the datatable and datarow level of my strongly typed datasets to do some work (getting column names, etc). Given that I'm using Microsoft prescribed design patterns and layering my application, and given that we've decided to use datasets to transport data between layers (another big topic there) the Datasets need to be in a layer accessible to all other layers - we call it Common. Now, the code generated as Friend accessible is no longer accessible to my other projects/layers so I find myself doing a search and replace 'Friend' to 'Public' whenever the dataset needs regenerating.

What irks me is that if my application wasn't layered, I wouldn't have this problem. Any ideas?

# Dave Bettin said on January 21, 2004 06:26 PM:

Here ya go: http://www.microsoft.com/sql/reporting/howtobuy/faq.asp

# TrackBack said on January 21, 2004 06:46 PM:
# Thomas Wagner said on January 21, 2004 07:54 PM:

It'll be free - similar to OLAP. But its a dog right now. If you do some more research you'll see.

# Alex Lowe said on January 21, 2004 10:22 PM:

I think saying it's a dog without telling us why is pretty sad. I can see that at least one other blogger (http://weblogs.asp.net/sjsmith/archive/2004/01/19/60468.aspx ) is excited about the product and he is using it. Have you used the product Thomas?

# Simon said on January 22, 2004 04:54 AM:

Not quite as simple as saying its free.

Reporting services comes with SQL Server. Therefore each server that has reporting services requires a SQL License. If you want to use it in its raw form the default interface is through the web, therefore you have 2 choices have 1 sql box with IIS installed and thus 1 SQL license or 2 boxs on with SQL on it that contains your data and one with IIS and Reporting services (and a SQL license) on it. So if you don't want IIS on your SQL box then you will need a second SQL License for your IIS box.

Hope that makes sense, it is very subtle, and dependant on the how you want to secure your main SQL boxes.

# TrackBack said on January 26, 2004 04:43 PM:
# Thomas said on January 27, 2004 07:16 PM:

Mike - I remember some review of this thing talking about it not being programmable with C# or VB.NET. Did you see anything in regards to that?

# AndrewSeven said on January 28, 2004 10:21 PM:

Both great groups, who produce good stuff but it seems like you are comparing the qualities of apples to those of oranges.

# Frans Bouma said on January 29, 2004 05:21 AM:

THe problem is this: there are serious issues with today's tools like VS.NET, .NET 1.1 etc. Instead of cranking out fixes for those issues (I mean, read the newsgroups and you run into a lot of them), we get hype about next-gen technology which seems to fix the issues we have today. That's not helping us one bit :), it leaves us with the feeling that there is no customer support.

Also, how many people have the whidbey alpha bits? 10,000 people? For those 10,000 people Microsoft puts up articles how to do this and that. For the other 6 million people using .NET today these articles are completely useless. However 50% of the articles are for these 10,000 people, and NO fixes are released.

It thus comes down to this:
- there are issues, we ignore them
- instead of fixing the issues, we hype the next-gen tool which will fix the issues eventually.

That's no customer support, something that is also part of 'quality'. Microsoft is so eager to tell everybody that they listen to their customers. Well, I really don't see a lot of customers demanding NO support and hype instead.

"When indigo arrives", that's at least 2 years away. Do you remember what you wrote 2 years ago? Was it targeting 2004 tech? I don't think so, because you can't make a living from writing software that is ready to rock in 2006, today, and that's what's this is all about: we need solutions TODAY, because the majority of the customers of .NET deal with issues TODAY with today's technology.

# TrackBack said on January 29, 2004 05:11 PM:
# Weston Binford said on January 29, 2004 05:53 PM:

Looks like somebody already posted it to the discussion forum on his site:

http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=108869&ixReplies=18

# Chris Stewart said on February 2, 2004 06:27 PM:

Whoa... I can understand being a geek and all, but naming your child as Version 2.0 is just plain wrong. Think of the bullshit he'll go through for his entire life...

# Rob said on February 2, 2004 06:47 PM:


No self-respecting geek would do this but a dork geek-wannabe would. :)

# Mauricio Feijo said on February 2, 2004 06:59 PM:

sooo, when he goes to kg he will be V. 2.01? How about high school? V. 2.04..

when he gets married he can be V. 3.0! That is a whole new version, not only some features added..

When he gets old and retires he will probably be ... 95, full of bugs, loosing a lot of functionality and crashing all the time..

Sorry, couldn't help.. :^)

# Stefano Demiliani said on February 2, 2004 07:22 PM:

Really??? Wonderful :)

# Dave said on February 2, 2004 07:39 PM:

Handy if the Bogyman keeps stealing your floppies eh?

# mr.ska said on February 4, 2004 11:11 AM:

Just wait. Next they'll have "low in carbs, no transfats". You just wait.

# Jon Galloway said on February 8, 2004 04:04 AM:

Contrary to popular opinion, @table varibles make as much use of tempdb as do #temp tables. See http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q305977& Question 4. I believe the main benefits of @table variables is that SQL Server knows the scope is limited so it can minimize locking, transaction scope, etc. I agree they're better than #temp tables and much, much better than cursors.

# Steven Livingstone said on February 9, 2004 04:22 AM:

Thanks for this! Now I can update my code to be much more scalable :)

# Alex Lowe said on February 11, 2004 04:08 PM:

Timely question: http://aspnet.4guysfromrolla.com/articles/021104-1.aspx

Subscribe to the great 4Guys RSS feed:
http://aspnet.4guysfromrolla.com/rss/rss.aspx

# Shannon J Hager said on February 11, 2004 04:25 PM:

This probably does what you need:

http://www.metabuilders.com/Tools/DialogWindow.aspx

# Jon Galloway said on February 11, 2004 04:29 PM:

I'd agree you should go with the MetaBuilders deal if that does what you need.

I've worked with a function that sets form fields on the window.opener form, which is essentially what the Metabuilders control does. Here's a simple function that does this:

function SetImageId(imageID,imageSrc) {
var i, inp = self.location.search.substr(1);
var queryString = new Object();
if (inp.length &gt; 0) {
var ary = inp.replace(/\+/g, " ").split("&amp;");
for (i in ary) {
ary[i] = unescape(ary[i]).split("=");
queryString[ary[i][0]] = ary[i][1];
}
}

var form = queryString["formname"];
var field = queryString["fieldname"];
var field2 = queryString["imagename"];
var srcString = 'uploads/images/' + imageSrc;

eval("window.opener.document." + form + "." + field + ".value='" + imageID + "';");
eval("window.opener.document." + form + "." + field2 + ".src='" + srcString + "';");
window.close();
}

# Joel said on February 11, 2004 11:44 PM:

Is the question "how to do this" or "is this the right thing to do" ?

# MARCUS HUMPHREY said on February 13, 2004 10:59 AM:

THOUGHT IT WAS A GOOD VIDEO JUST BRINGS THE SAFETY ASPECT TO LIFE BUT MADE FUN FOR A CHANGE ( UNLIKE THE GERMANS!!!)

# Craig Gemmill said on February 25, 2004 03:58 PM:

Here's some more to play with:
http://www.eggheaven2000.com/Website_Eggs/more3.html

# vinnie tripodi said on February 25, 2004 04:04 PM:

just add "dotnet" to any search phrase and tab over to "Groups" ... you'll get only newsgroup hits. this tip used along with their toolbar search control is awesome.

enter "dotnet marshalbyref" in the control and get all newsgroup hits.

MSDN search is a joke. The Q is... will be soon be paying for google access now that they are going public???

# James Geurts said on February 25, 2004 04:04 PM:

You could always just narrow the search results by appending site:microsoft.com to your search...

# Scott said on February 25, 2004 04:17 PM:

prepending site:microsoft.com usually gives me better results than using the google.com/microsoft search engine.

# AndrewSeven said on February 25, 2004 05:27 PM:

Get the google deskbar, you can make custom searches.

Googling "someClassName class" is pretty good for framework classes

# Jeff said on February 27, 2004 01:45 PM:

Some people take things too seriously. I don't think anyone, publishers, authors or readers, has the expectation of being a Jedi master in [your programming platform here] in 21 days. It's just a clever marketing way to say, "We'll give you the basics and be as straight-forward as we can about it because you're really busy and important."

# Joel said on February 27, 2004 01:49 PM:

Does this mean that we should "JUST" start becoming masters of Windows 95? Are you also suggesting that due to the rate of change in our industry there are no experts?

I've read that if you take One hour per week to study a subject you will become an expert in 4 years. Along that line - if you take 10 hours a week (probably about average for most type A personalities) then you can achieve the same goal in about 5 months. What I think needs to be quantified is what in fact you are teachning yourself in 21 days. If you are teaching yourself the fundamanetals of something (the very basics of C# for example) - this "may" be achievable provided that within that 21 days you spend at least 1 hour per day.

I don't think I've ever seen "Become an EXPERT .NET Architect from Scratch" in 21 days before.

Just my 2cents

# Sandra Davis said on March 4, 2004 10:33 AM:

Very helpful. I couldn't find a decent explanation of this anywhere else. Thanks!

# Sandra Davis said on March 5, 2004 04:51 AM:

Just noticed that the loop should be <= @MaxRowId. As it is, the last row of the table is never checked, as RowId starts counting at 1 rather than 0.

# TrackBack said on March 5, 2004 05:35 PM:
# anon said on March 15, 2004 02:15 PM:

VB.NET

# Lance said on March 15, 2004 02:53 PM:

Ditto.

You will see more of this sort of "programming within properties" thing coming in Whidbey too!

# Chumpol said on March 15, 2004 11:57 PM:

I would like VIDEO training for forklift.

best regards
chumpol
kseg@kseg.co.th

# TrackBack said on March 16, 2004 12:29 AM:

You have been Taken Out! Thanks for the post.

# Scott said on March 19, 2004 06:07 PM:

I haven't had much luck installed Reporting services. You might look at ActiveReports, I've heard a lot of good things about it.


http://www.lazycoder.com/weblog/index.php?p=41
http://www.lazycoder.com/weblog/index.php?p=42

# Kent Tegels said on March 19, 2004 10:11 PM:

Nope. RS is a purely connected model.

# Issam Elbaytam said on March 20, 2004 01:59 AM:

ActiveReports for .NET from www.datadynamics.com meets all the requirements you mentioned.

# David Cumps said on March 20, 2004 11:22 AM:

I'll take an Admin who silently overlooks his sites and who doesn't have time to flame ;)
http://www.winternet.com/~mikelr/flame79.html

# Mathew Nolton said on March 23, 2004 11:50 AM:

This is really interesting and it will help me with something I am doing.
-Mathew Nolton

# Scott (from webinar) said on March 23, 2004 04:55 PM:

You really should get a raise.

# andy Hellmuth said on March 24, 2004 11:39 AM:

I think the matrix spoof is really funny

# Marcello said on March 31, 2004 12:30 PM:

Search MSDN for "Connection Pooling for the .NET Framework Data Provider for SQL Server"

If you not change the "<....>" in the ConnectionString you have 1 connection pool.

# bonder@codescholar.com said on April 7, 2004 05:17 PM:

nUnit 2.1
nAnt 0.84 (free) or Visual Build ($99)

# Fabrice said on April 8, 2004 05:01 AM:

You'll find some in the SharpToolbox. Categories are Testing, Build, Profiling.
http://SharpToolbox.com

# HL Yap said on April 13, 2004 01:30 AM:

would like to do some training

# Lubos Andrle said on April 13, 2004 05:23 AM:

Hi, I would like more information and your experience about porting CQL parser to .NET platform because I want to use this solution for my project (digital library gate SRU/SRW).

Thanks Lubos.

# yang said on April 21, 2004 01:02 AM:

good artical ,thank you!

# wilson said on May 13, 2004 08:50 AM:

great

# Jacki said on May 13, 2004 12:44 PM:

I would like the video

# ron said on May 14, 2004 09:53 PM:

not sure yet

# jamy said on May 17, 2004 01:35 AM:

Good Morning Sir,
I Would Like to get a video tape for training forklift

Thank's

# Y2k said on May 19, 2004 09:52 AM:

Only one connection

# dfdf said on May 26, 2004 11:30 AM:

dgdgdgd

# MIGUEL ANGEL AVILA GONZALEZ said on May 31, 2004 11:35 PM:

thanks a lot

# Rohit said on June 1, 2004 03:25 AM:

We need 5 pool connection

# Benjamin J. J. Voigt said on June 1, 2004 05:10 PM:

How about concurency and threat savety? Security testing (buffer overflow inspection, CSS vulerability)?

# Rob Sanderson said on June 2, 2004 12:47 PM:

Hi,

I was wondering if you'd gotten anywhere with CQL since you blogged this?

Rob Sanderson

# Adamo Mosca said on June 2, 2004 05:20 PM:

Is it possible to pass the table datatype as a parameter to another procedure? If not is it possible with a cursor? If not is it possible at all to pass a recordset as a parameter?

# China Men said on June 7, 2004 04:07 AM:

garbage

# Cuchulainn said on June 15, 2004 03:18 AM:

This is how I would go about it:

You spent an hour a day studying programming for 21 days? Great. You put in 21 HOURS, not DAYS. And that's less than a day's workload.

(If you do the math, you'll be spending 21th day's worth of studying on your 441st day of studying, if you keep the one-hour-a-day regime. And that 441 days don't count the holidays and sundays. If you were to add these in, it's probably going to take at least 2 years.)

# gohn said on July 6, 2004 01:24 AM:

good work

# gohn said on July 6, 2004 01:24 AM:

good work

# sherbeny said on July 14, 2004 10:58 AM:

i think 500 pool

# stefan demetz said on August 7, 2004 07:28 PM:

http://dotnetjunkies.com/WebLog/stefandemetz/archive/2004/07/17/19594.aspx

# Christian Weyer said on November 5, 2004 02:27 AM:

There seem to be two approaches to handling this situation:

1. Use the Destination property instead of the Url property and also include a Via to set the next hop for the message. The following code should do the trick for you:

this.Destination = new EndpointReference(
"http://localhost/service.asmx",
"http://localhost:7777/service.asmx"">http://localhost:7777/service.asmx");


2. Use a logical name for the service with a combination of the Destination property and the SoapActor attribute on the WebService itself. SoapActor("urn:MyService") on the WebService class in conjunction with the following at the client should do the trick:

this.Destination = new EndpointReference(
"urn:MyService",
"http://localhost:7777/service.asmx"">http://localhost:7777/service.asmx");

# Christian Weyer said on November 5, 2004 02:28 AM:

Sorry, the URIs got crapped...

# jayson knight said on July 8, 2005 03:59 AM:

Good call on this; I've always wrapped an #if debug around a System.Thread.Sleep() for WinServices.

# Joel said on August 5, 2005 04:26 PM:

Should NOT start with the CMMI process template? Explain...

# Mike said on August 8, 2005 10:56 AM:

Well, if a company has no particular SDLC in place, would they choose the MSF Agile or the CMMI VSTS process template for their first Team System project? I would think they would choose Agile.

# Charles Chernack said on August 9, 2005 08:31 PM:

Can you help me to find some .NET training for my Chinese friend who lives in Beijing. I would like her to learn and perhaps get certified in .NET.

Reply chernack@gmail.com

# Joel Semeniuk said on August 10, 2005 01:31 AM:

In one of my presentations I demonstrate the customization of a process template using the Imaginet Team System Customization toolkit.. Here I demo adding a "Threat" work item type and provide fields to capture categorization (STRIDE) and Prioritization metrics (DREAD).

I do agree that this should be encapsulated in the process template itself. This is also not in the current builds of MSF for CMMI Improvement that I've seen either.

I would suspect that at some point someone will likely post a work item definition to handle this at VSTSRocks.net.

Heck, I could probably post the work item definition I created for the demo - however, the schema of the work item type and underlying process guidance has likely changed enough for it to be invalid in any release other than beta 2.

# BradC said on August 10, 2005 04:58 PM:

It seems to me that a difficult, but less important feature (3, 3, 9, 9) = 24 (4.8 weighted) could easily outweigh a crucial but easy feature (5, 6, 2, 1) = 14 (4.3 weighted).

Do you apply a "reality check" to the final priority list to make sure it makes sense? Or does this all wash out because the top 60% of the list is going to get done anyway?

# Mike said on August 10, 2005 05:40 PM:

Yes, a reality check is in order, and usually that's where the weighting can adjust things if they are considerably out of whack. Or just deciding to rank them differently...

# Joel said on August 17, 2005 10:29 PM:

Actually, the formula could be made a bit more comprehensive, yet the complexity of the formula doesn't justify the difference in the results - typically. Also, take into consideration that you will likely place a "weight" on the different perspectives of the requirement. By default, eveything has equal weight of 1. If you wanted to place more weight on crucial features over risk and cost you could give it a weight of 2. The formula would look more like:

Priority = (Benifit*BenifitWeight + Penalty*PenaltyWeight)/(Risk*RiskWeight + Cost*Cost Weight)

Notice how the above is slightly different but slightly more difficult to do on a piece of paper - but possible in Excel and in Sharepoint.

If you wanted to get even more detailed - there is yet another method that takes into account the overall % of the requirement in the total number of requirements in a list. This method, however, does require Excel to calculate and impossible to implement without a lot of extra programming in Sharepoint.

# joel said on August 17, 2005 10:31 PM:

What's also great about Shelving is that you can move from one computer to another without needing to check in your code or moving the files yourself... something that's a huge pain in the A$$ with VSS.

# karl said on September 21, 2005 01:59 PM:

I felt like you did at first, but I eventually just got good at writing FxCop compliant code. Of course, there are some rules I turned off, so that I wasn't writing compliant code for the same of writing compliant code. With just a couple rules ignored, most of the code we produce is 98% FxCop-correct.

# Pascal Naber said on December 11, 2005 04:50 AM:

I made a little overview a while ago.
http://bloggingabout.net/blogs/pascal/archive/2005/11/29/10403.aspx

http://www.sqldownunder.com/ and http://aspnet.libsyn.com/ are new to me.

# Jeremy said on December 11, 2005 08:56 AM:

Look at TestDriven.Net for running NUnit or VSTS tests in the IDE. It's the fastest way to kick off unit tests or start the debugger in a unit test.

# Wally said on December 11, 2005 09:24 AM:

The asp.net podcast url is at: http://aspnetpodcast.com/cs11/default.aspx.

The libsyn url got setup incorrectly and actually shouldn't be there.

Wally

# Sonu Kapoor said on December 11, 2005 03:03 PM:

I have a complete collection of podcast blogs at:

www.dotnetslackers.com/Podcast/re-default.aspx

Thought you might be interested.

# Scott said on December 12, 2005 11:46 PM:

I thought you are supposed to say Holiday Party? :)

# .Net Adventures said on December 22, 2005 09:32 AM:

I guess you can map in this way the atribute names from TeamSystem into MbUnit too.

# scottgu said on January 2, 2006 04:59 PM:

Hi Mike,

One correction on the link above. You can learn more about the project on my site at: http://webproject.scottgu.com.

Hope this helps,

Scott

# Sigurdur G. Gunnarsson said on January 13, 2006 05:15 AM:

"If we don't use Team Suite, then we don't have the Microsoft testing tools, so we'll use NUnit instead."

Actually, if you just need the unit testing tools you can go for Team System Developer (which is cheaper than the full Team Suite).
Team System for Testers (and Team Suite) just has more test tools, like load testing for web applications, grouping of test cases etc.

# Brenton House said on January 13, 2006 03:45 PM:

Can you post your xsl files that you created?

# Kavitha Muthuswamy said on February 1, 2006 06:56 AM:

Take a look at this. I had to get rid of the javascript in the xsl and it worked like a charm.

http://confluence.public.thoughtworks.org/display/CCNETCOMM/XSL+Transforms

# juanjo said on February 10, 2006 12:21 PM:

Hi, great Blog...
How is the stand of your MsTestCoverage.xsl + convert utility? It will be great if you could post them...

# Darin Daniel said on February 11, 2006 03:25 AM:

you said: I worked on building project files for NDoc and MSTest that would be executed by MSBuild. Not so hard to do....I have been trying for days to get this all to work....no luck...could you post your projects and any code required ?

# John-Daniel Trask said on August 1, 2006 05:25 PM:

It is like comparing apples and oranges. SharePoint is a strong intranet solution and provides many more features than a wiki would. This includes rich workflow, document management facilities, personal "my sites", customisable layout etc. Having said all this, MOSS (effectively SharePoint 2007) allows the provisioning of Wiki sites within it as well as making major steps forward in the areas I mentioned earlier. I guess more important to your question is what are you looking to do with your solution? What problems do you want to solve? That would dictate more which way you should go. - JD

# Hector Correa said on August 1, 2006 06:28 PM:

On the areas that they have in common Sharepoint is like a wiki on steroids. This has it's pluses and minuses. On the plus sign Sharepoint support editting on a WYSIWYG interface (via Word or Excel for example) while most wikis have a rather rudimentary UI to edit information. Yet, at the same time wikis can be viewed and editted with just a browser.

# J Matthew Phipps said on August 1, 2006 10:09 PM:

As a SharePoint developer for a major governmental concern that projects force to break other country's toys, I have to say: You are not comparing similar tools. This is like comparing an apple to a rose. Sure, they are both plant product, but there the similarity ends. Likewise, they are used for completely different things. The closest thing you can say they share is the ability for users to contribute and control content. O.K., the above may be a bit of hyperbole, but, you can use Word to perform calculations, but wouldn't you rather use Excel?

# Chris said on August 2, 2006 10:29 AM:

Sharepoint now includes Wiki so what does it matter?

# Scott said on August 2, 2006 11:50 AM:

At OSCON I got a demo of a new "wiki" created by some ex-MS devs, they used to be on the Sharepoint team. The idea was to take the wiki concept, but iron out all the headaches of having to learn wiki markup. The end result is close to sharepoint. So I asked them, "Why am I using this instead of Sharepoint?". They had some good answers and are coming to my workplace to give another demo before we get too far into the Sharepoint rollout. A lot of the problems they were solving had to do with organizing content.

Check them out at opengarden.org, DekiWiki.

# Jason Haley said on August 6, 2006 11:25 AM:
# AndrewSeven said on August 8, 2006 04:47 PM:

In comparison to 2003 and before, I find that I have a lot of difficulty navigating the open documents in 2005.

I have the "Close All" command on a button and I use it all the time. "Close All but this" works sometimes, but when I feel lost, I'm rarely on the one file I was looking for ;)

# Kranthi said on August 11, 2006 04:48 AM:

I also have faced this problem. This may be due to insufficient RAM.

# Stuart Ballard said on August 31, 2006 11:51 AM:

One of my pet peeves with .NET is that the Message property of FileNotFoundException gets populated with the filename, rather than a message. It's just completely backwards. It means that if I'm writing code where, at the top level, I want to present the user with what went wrong when an exception happens (and in some cases, file I/O may fail for all sorts of reasons ranging from network drive unavailable to an invalid filename to lack of permission to file not found to... well, stuff I can't think of. So catching a higher level exception type is good here) I have to first check FileNotFoundException specifically and translate the Message into something human readable ("File " + ex.Message + " cannot be found"), then hope that every other exception type that might get thrown is not so stupid.

The particularly stupid thing is there's absolutely no reason FileNotFoundException shouldn't have had a FileName property to store the affected filename in so that the filename could be accessed programmatically. But since it doesn't, any program that needs to know the filename needs to use the Message property, which means that Message on this exception type can never be fixed.

Grr!

If only people actually followed your guidelines...

# Vikram said on September 23, 2006 04:21 AM:

So what it your first reaction to using the Team System

# Plip said on October 4, 2006 04:57 PM:

Mike,

I use them in my Web Deployment projects to sync up any schema changes from my local box to the staging server.

I don't use the Data sync but yeah - unit testing is a fantastic use for them.

You could even: -

1. Backup what's on the staging server.

2. Overwrite with sample data

3. Delete sample data

4. Restore what was on the staging server.

Cool huh.

# LeeB said on October 5, 2006 03:22 AM:

I totally agree.

As soon as I heard about AzMan I realised the potential it had (this is way back around the time it was released).  At that time the documentation and examples available were limited and the tool seemed to gain little popularity.

Now, the documentation seems to have improved and more people are talking about AzMan.  Net 2.0 added the AuthorizationStoreRoleProvider which is a start but this doesn't touch the full power of AzMan (eg operations are not supported IIRC).

I'd love to see more framework support for AzMan, especially along the lines of the attribute based approach you describe.

# Steve Porter said on October 5, 2006 04:44 PM:

I think that Team System for Database Developers has this sort of functionality built in.  Also allows you to run update and create scripts as part of the build so you can enforce that the 'one true' schema is the schema uses.

Ta.

Steve Porter

# Gabriel Lozano-Morán said on October 10, 2006 02:26 PM:

The YAGNI is there to remind you as a developer to invest time in the features that you need for the current iteration and stop wasting time on features you might need in the feature. Imho if a specific software factory generates several layers for you including code in 5 minutes it does not really violates the YAGNI principle. Also a software factory is not only about creating a project from A-Z at the start of a project, instead in a Software Factory there should be different stages. For example a Software Factory should be able to create a Data Access Layer for you (as far as you need it) with maybe some default classes. Next when you need to create a new Gateway class the software factory should do it for you. A nice example if Microsoft's implementation of Software Factories in the name of Guidance Audomation (GAT+GAX)

# Griffin Caprio said on October 10, 2006 02:48 PM:

if the divide between what you use vs. what you get is so large ( 1k vs. 15k LOC), then your factory is made up of core assets that are too corse grained.  Of course, that must mean you're including source code in your project, which isn't the real level that a SF is supposed to be used at.  

A software factory should be at a much higher level then simple code generation.  It should be made up of core assets and support development by assembly, not just a set of CodeSmith templates that create a ton of .cs files.

Also, this could have been an exception to his company's original software factory intent.  A SF will only be valuable if there are 10's or 100's of the same type of application being produced.  If not, you're just creating bloat, like Steve sees.

# David Findley's Blog said on October 13, 2006 06:28 PM:

I remember seeing the &quot;Developers vs Programmers&quot; article on digg recently. I did think at

# Ace said on October 15, 2006 11:52 PM:

Well IMHO the developers vs programmers paradigm is not accuarte , it should be more like developers/programmers vs Software Engineers to be exact.

# David Laribee said on October 21, 2006 06:55 PM:

I would read PoEAA first. I, like you, read Nilsson's book before DDD (backwards ;>)... I think all of these books draw on the stuff in the Fowler book.

I just picked up Core J2EE patterns as Ted Neward suggested in his p&p book. Looks promising...

# gozh2002 said on October 25, 2006 10:05 PM:

I totally agree with you that MS people is far behind the software architecturing in enterprise application. This won't change if MS people not read PoEAA and DDD but focusing on MSDN, software factory or new MS eva stuff. (wcf/wff..)

# Plip said on October 26, 2006 06:40 PM:

Mike,

Great post, thanks for your perspective on this.

You might notice I specifically didn't include any programming technologies, more layout and effects technologies, and this is the angle I was coming from when I wrote the post.

The ecosystem as a whole is huge as you point out, there are areas of enterprise services provided by Database servers, Gateways and application logic tiers.

If you knock together a paint diagram I'm happy to Officify it (I think that's the right term? ;-) )

Cheers,

Phil.

# PD said on October 27, 2006 10:25 AM:

Wait until you use Powergadgets, then you will reall be hooked to PowerShell.

There is a CR2 available for download at http://www.powergadgets.com/trial/

Cheers,

PD

# Carl said on October 31, 2006 04:25 PM:

Yeah, you would need to synergize your approch to the paradigm shifts and leverage the existing core  competencies...

Thanks for sharing this manifesto, and please stop the PHB talk :|

# Joe Chung said on October 31, 2006 07:27 PM:

The problem with manifestos, methodologies, and this whole business of software architectures is that they are all totally ignored by the people who actually write the bad code all of us have to suffer with.

No manifesto, no methodology, and no architecture is going to turn a bad coder into a good coder, and there are a lot more bad coders out there than good ones.

# Steve Porter said on October 31, 2006 08:11 PM:

The section titled Writing Maintainable Code over Architecting for Reuse and the Future that had me jumping up and down screaming halle-f@%king-lujah.

# Community Blogs said on November 1, 2006 01:47 PM:

Rob Howard asks &quot;Which is more difficult?&quot;Steve, if you liked the &quot;Writing Maintainable

# sadek drobi said on November 27, 2006 05:36 PM:

www.sadekdrobi.com

i am posting examples about further observations of the Model View Presenter pattern, with sample code soon...

# Brian Mulloy said on December 15, 2006 02:31 AM:

the idea of a "some kind of SQL Server connector to Swivel" is an interesting one.  I wonder what that might look like?

Brian Mulloy

CEO & Cofounder

www.swivel.com

# 5 Things You Didn't Know About Me said on February 6, 2007 10:42 PM:

PingBack from http://blog.roberthahn.ca/articles/2007/02/07/5-things-you-didnt-know-about-me

# Bailey said on February 7, 2007 12:41 PM:

You can do better than that!  I knew #2, #3, #4, and half of #1!

#5 - really?  You must have much better classroom-management skills than I do (lack of which confirmed me as a non-teacher).

# games » Friday, April 13, is MSN Unicode Screen Name day said on April 14, 2007 11:48 AM:

PingBack from http://addictinggameblogs.info/friday-april-13-is-msn-unicode-screen-name-day/

# Microsoft Business Intelligence Conference, Wednesday Keynote said on November 26, 2007 03:18 PM:

Pingback from  Microsoft Business Intelligence Conference, Wednesday Keynote

# MS BI Conference 4: Best Practices for Migration to Microsoft BI said on November 28, 2007 04:49 AM:

Pingback from  MS BI Conference 4: Best Practices for Migration to Microsoft BI

# Подлипенский Павел - блог о технологиях и деньгах said on August 12, 2008 08:14 AM:

Довольно забавно слышать как старшее поколение называет всех, от геймера до разработчика баз данных...

# IT CAREER « Itcareer’s Weblog said on September 23, 2008 08:54 AM:

Pingback from  IT CAREER &laquo; Itcareer&#8217;s Weblog

# evastonline.com » Blog Archive » Computer programer said on August 15, 2009 12:29 PM:

Pingback from  evastonline.com  &raquo; Blog Archive   &raquo; Computer programer

# shanmugamm said on April 30, 2010 03:05 PM:

Great

# Darren Kopp said on April 30, 2010 03:32 PM:

Truncate skips the transaction log, so delete was most likely reading the table info to put info into transaction log, which is why it was taking so long.

# Twitter Trackbacks for SQL Table stored as a Heap - the dangers within - Mike Diehl's WebLog [asp.net] on Topsy.com said on April 30, 2010 03:35 PM:

Pingback from  Twitter Trackbacks for                 SQL Table stored as a Heap - the dangers within - Mike Diehl's WebLog         [asp.net]        on Topsy.com

# Danijel said on May 2, 2010 01:56 AM:

As far as I know, TRUNCATE TABLE statement actually drops the whole table altoghter, and re-creates it anew.

# Peter said on May 3, 2010 08:41 AM:

To comment on the comments on truncate (all are false).

According to books online:

* Less transaction log space is used.

The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

* Fewer locks are typically used.

When the DELETE statement is executed using a row lock, each row in the table is locked for deletion. TRUNCATE TABLE always locks the table and page but not each row.

* Without exception, zero pages are left in the table

After a DELETE statement is executed, the table can still contain empty pages. For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. If the delete operation does not use a table lock, the table (heap) will contain many empty pages. For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.

# jonmcrawford said on May 3, 2010 09:16 AM:

Darren, see Paul Randall's blog, myth 19/30 from the month of April, www.sqlskills.com/.../A-SQL-Server-DBA-myth-a-day-(1930)-TRUNCATE-TABLE-is-non-logged.aspx

Truncate is indeed logged, it just doesn't have to log each individual record.

-Jon

# Wesley said on June 2, 2010 03:04 AM:

And the URL to the company site is?

# Paresh Prajapati said on June 3, 2010 09:12 AM:

Hi,

I am interested for Database Admin

# progremmer | Andreperdana's Blog said on August 25, 2010 02:22 AM:

Pingback from  progremmer | Andreperdana&#039;s Blog