|
|
26 February 2003
|
|
|
22 February 2003
|
|
| |
The Last Configuration Section Handler I'll Ever Need.
I'm sure someone, somewhere has already written this, but I figured it out on my own today, and it's just too cool not to share. Basically, it's a bit of code that lets me store objects in my application of web configuration file, and all I have to do is write the type that holds the values. [CraigBlog]
6:31:52 PM
|
|
|
|
18 February 2003
|
|
| |
QQQ is sending out an SOS.
Thomas Marquardt, one of our developers on ASP.NET, recently published an article on MSDN about ASP.NET performance monitoring. Along with the article are a number of great utilities (all complete with C# source code).
We developed them internally to help automate diagnosing customer issues with production apps, and they are also used as part of our ASP.NET stress testing program (I'll provide more details about our stress lab in a future blog entry). These source utilities include:
Snap.exe -- a command-line tool for logging performance data for processes.
HttpClient.exe -- a simple client that records time to last byte (TTLB) for HTTP requests.
ErrorHandler.dll. This is an IHttpModule that you can add to the HTTP pipeline to log unhandled exceptions to the event log. It is better to log errors to a SQL Server database (that is what we do in our stress lab -- since it makes reporting across hundreds of servers easier), but the example uses the event log for simplicity.
QQQ.exe -- a command-line tool for stress testing an ASP.NET application. When used in combination with a stress client, such as Homer or ACT, this tool will attach debuggers to the worker process and monitor certain performance counters. It can be tuned to automatically break into the debuggers when performance degrades.
QQQ is probably my favorite utility -- especially given that its name is complete nonsense. "QQQ" stemmed from the fact that Dmitry (ASP.NET dev manager) likes to name all of his test ASP.NET pages with those initials, usually under various temporary directories scattered accross his harddrive.
QQQ is usually used in combination with the windbg and cdb debuggers (which you can download from: http://www.microsoft.com/ddk/debugging/installx86.asp). These debuggers are more appropriate for system level dubugging (versus the VS debugger) in that they have less effect on the process they are attached to (unlike the VS debugger which tends to impact timings within the target process -- making stress investigations harder).
QQQ is also typically used in conjunction with a .NET Framework debugger extension we call "sos.dll". Strike.dll was the parent debugger extension we used in V1 of the .NET Framework -- "sos.dll" affectionately stands for "son of strike". You can download son of strike at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/DBGch03.asp.
If you are doing hard-core production ASP.NET development, and want to build up an infrastructure for testing and monitoring your web applications, then I'd definitely recommend spending an hour browsing through the above code. There are a lot of cool tips/tricks you can pick up and re-use.
[ScottGu's Blog]
11:35:56 AM
|
|
|
|
14 February 2003
|
|
| |
NUnitAddin support for JUnit!

If anyone is actually reading this weblog, please check out my new home here. There will be some - shock - horror - original content there! I know I've been very lame in the past and just used this place as a scrap book. I'm turning over a new leaf, please give me another chance... ;o)
11:22:40 AM
|
|
|
|
13 February 2003
|
|
|
12 February 2003
|
|
|
11 February 2003
|
|
| |
One file that you should always keep in mind is:
C:Program Files
Microsoft Visual Studio .NET
FrameworkSDKincludeCorError.h
In your case, the error is:
#define META_E_BADMETADATA EMAKEHR(0x118A)
// Merge: Inconsistency in meta data import scope
9:28:19 PM
|
|
|
|
08 February 2003
|
|
| |
PermissionGrabber. Yesterday I vowed to turn on SecurityManager all the time, and figure out the necessary policy files for Java applications that I use. Ross mused that it would be cool if the Java runtime provided a flag to generate this information automatically. What a great idea! And, who needs help from the runtime? PermissionGrabber is a simple Java app that will execute some other Java app, figure out what permissions it needs to run, and generate an appropriate policy file. All you have to do is java PermissionGrabber SomeApp I just threw this together and can think of a few dozen little enhancements already. Let me know if this is cool and what you would like to see added. [Ockham's Flashlight]
10:29:10 AM
|
|
Dogfood.
In my neverending quest to amuse myself by confusing myself, I've reimplemented my Xml2CodeDom tool in XML so that it can now generate itself.
It took over 1600 lines of XML to generate only 130 lines of C# code so I don't expect that developers will be flocking over to this new format anytime soon. It was a fun experiment while it lasted.
This could, however, have some interesting applications for language agnostic code generation. Maybe tools like CollectionGen could use something like this in order to support all features for more than just one language without having to actually duplicate the logic for each language. [authorities here are alert.]
12:14:32 AM
|
|
ConsoleHost.
This is my version of Scott Guthrie's example demonstrating how to process ASP.NET requests outside of IIS. Mine automatically copies itself to the current directory's bin subdirectory (else it won't work) and also allows you to pass in parameters from the command line.
I had trouble getting Radio to "upstream" this file until I changed the extension. Anybody know what's up with that? [authorities here are alert.]
12:11:50 AM
|
|
|
|
07 February 2003
|
|
| |
Interception for ServicedComponents.
Clemens is starting to publicly talk about the features of his interception toolkit for EnterpriseServices. I think that this very thing is just sooo cool.
[Transaction] public class Component : newtelligence.EnterpriseServices.AspectServicedComponent { private string val = "";
public Component() { }
[Match("[A-Z]*")] public string SetMeGetMe { get { return val; } set { val = value; } }
[GreaterEqualTo(0)] public int TestField;
[return: MinLength(1)] public string Hello( [MinLength(1),MaxLength(20)] string Name, [Between(1,100)] int Age, [MinLength(1)] out string retString, [LaterThanToday] DateTime when) { return "Test"; } }
This rocks, right? Not just the fact that one can use custom attributes - that's already well known - but even more that his toolkit will allow you to use interception with ServicedComponents to automatically check these properties whenever you call the method. The keywords here are automatically and ServicedComponent. My only question is: Why is there a stateful variable ("private string val") in your ServicedComponent ;-)? Just kidding ... it's an educational sample. [Ingo Rammer's DotNetCentric]
7:28:16 PM
|
|
Jenifer Tidwell: UI Patterns and Techniques. "Each of these patterns (which are more general) and techniques (more specific) are intended to help you solve design problems. They're common problems, and there's no point in reinventing the wheel every time you need, say, a sortable table -- plenty of folks have already done it, and learned how to do it well. Some of that knowledge is written up here, in an easily-digestible format." [almostperfect]
Wow, wasn't this a cool find? I worked with Jenifer years ago at Gensym and lost contact with her work. She has been working in this area of UI Patterns for quite some time and this is most definetly worth a look. [Sam Gentile's Weblog]
11:51:36 AM
|
|
|
|
05 February 2003
|
|
|
01 February 2003
|
|
|
31 January 2003
|
|
| |
Running as Local Admin on a DEV box - Just say NO!.
Anil writes,
"It IS lazy coding. This need for elevate privileges occurs when a developer runs as Local Administrator on their own dev box and cranks out software that in turn has no concept of rights and limits. I have made a conscious attempt to run as a regular User on my DEV box. "
Great point. I saw Keith last year and it really made me think. Probably not enough since I still make this mistake a lot of times :D
Anil: "One of the things that I will try to document in my explorations are programs that violate this rule.. Especially ones that a developer needs to use on an ongoing basis. "
Great. Can't wait to see it.
"One of the people whose views I am following through his writings is Keith Brown of Developmentor. He has been advocating this for a long time... Here are some links to what he has to say about running as a non-Administrator on your dev box. "
Good links.
[@CyberForge] [ScottW's ASP.NET WebLog]
12:41:16 PM
|
|
|
|
30 January 2003
|
|
|
29 January 2003
|
|
|
27 January 2003
|
|
| |
Let's be careful out there ....
I'm in the process of setting up a new desktop dev machine, and spent the better part of this evening installing tons of software. One of the patches that I hadn't installed yet was SQL Server 2000 Service Pack 3. The reason why I hadn't really thought about it was because none of my SQL Server boxes are exposed to the public Internet. My ISA server is configured to block UDP port 1434 traffic by default.
But there is one SQL Server box that I almost forgot about: my laptop. I tend to connect to all sorts of foreign networks with my laptop. Had I done so with an unpatched SQL Server running on my laptop, I would have brought the Slammer worm back home behind my ISA server firewall. Then all hell would have broken loose.
So the lesson here is: beware of laptops. They can easily subvert the security provided by your network's perimeter defenses. And make sure you patch ALL SQL servers regardless of whether they are behind your firewall or not! [IUnknown.com: John Lam's Weblog on Software Development]
1:13:12 PM
|
|
|
|
26 January 2003
|
|
|
25 January 2003
|
|
| |
LinuxWorld In Words - Mono Notes.
I stuck around LinuxWorld until Miguel de Icaza issued his State of the Mono Address. I've been following the Mono project for some time via the website, but this was much better.
C# is done, VB is 70% done, and JavaScript is 50% done. This is good. Miguel demonstrated an almost unmodified version of iBuySpy that was only really slow because it was connecting to an MSSQL server in Spain over 802.11b.
In theory, you could write an ASP.NET web application today and deploy it on a Linux server using Mono. You can reuse the docs that are available for C# and .NET (from Microsoft), and you can also reuse the docs and resources available from MS and third parties.
Miguel stressed that we should reuse the Microsoft booth (next to the Mono booth) to learn about all of the cool ASP stuff that you can do.
The Mono team is also working on a new version fo their JIT compiler which will speed up apps significantly. He also demoed a sweet debugger written in GTK# (GTK bindings for C#) and a digital camera organization app that he wrote for himself (not for you). It was running slow over a wireless connection, so he brought out the laptop to reassure us that the app was fast and non-blocking.
It is obvious that WinForms is one of the least mature parts of Mono. More people are interested in using Mono for hosting ASP apps, so that stuff is getting done quicker. He stressed several times that if we wrote some regression tests, patched some code, did some documentation, that Mono would be complete in a matter of weeks.
There is database support for pretty much every popular database that runs under Linux. You can take an exe produced from Visual Studio or the mono compiler and run it using mono.
Overall I was impressed by the state of Mono and the demos. It's awsome to be able to take a Microsoft demo app out of the box and run it using Mono. There were only a few configuration changes that had to be made to take case specific files into consideration. Other than that, it just worked: mono server.exe 8080. [Matt Croydon: .NET]
12:51:47 PM
|
|
|
|
23 January 2003
|
|
| |
The Exception Management Application Block provides a simple yet extensible framework for handling exceptions. With a single line of application code you can easily log exception information to the Event Log or extend it by creating your own components that log exception details to other data sources or notify operators, without affecting your application code. The Exception Management Application Block can easily be used as a building block in your own .NET application.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/emab-rm.asp
1:40:20 AM
|
|
|
|
22 January 2003
|
|
| |
There can be only one....
This is an old trick, but updated for the .NET world.
Question, how do you keep more than one instance of an app from running (this can be especially useful for Terminal Server scenarios).
Mutex m; public Form1() { InitializeComponent(); bool gotIt = false; m = new Mutex(true, "SomethingReallyUnique", out gotIt); if (!gotIt) { MessageBox.Show("This application is already running."); Application.Exit(); } }
[Sean 'Early' Campbell & Scott 'Adopter' Swigart's Radio Weblog]
11:58:10 AM
|
|
|
|
21 January 2003
|
|
|
16 January 2003
|
|
| |
The Hacker FAQ
- 4.1: I can't get an estimate out of my hacker.
- Your hacker hasn't figured out how hard the problem is yet. Unlike most workers, hackers will try very hard to refuse to give an estimate until they know for sure that they understand the problem. This may include solving it.
The Manager FAQ
- 3.6: I'm stuck, and my manager won't stop pressuring me to get unstuck.
- The best solution I've ever heard is to ask your manager what happens if he loses his keys. How long will it take to find them? Once he's done looking everywhere he can think of, why doesn't he keep looking in all those places over and over and over? This is the best analogy to difficult creative work that most people will have had experience with.
- 5.4: My manager counts from one.
- Ordinals (counting numbers) have always started from one; counting from zero, while obvious and natural to many programmers, is probably wrong from a linguistic standpoint. Try to be flexible.
7:19:17 PM
|
|
|
|
15 January 2003
|
|
|
13 January 2003
|
|
| |
TeeGofer. "TeeGofer is a tool designed specifically for the .NET Component writer. Written in 100% native C# code, it works by reflection to read in metadata from .NET Assemblies (.DLLs or .EXEs) to create first class quality online help documentation. The Tool is extremely easy to work with, presenting a tree navigator of the entire structure of any Assemblies selected for the Help Project."
Really Cool! [sellsbrothers.com: Windows Developer News]
7:34:35 PM
|
|
|
|
11 January 2003
|
|
|
10 January 2003
|
|
|
07 January 2003
|
|
|
06 January 2003
|
|
|
03 January 2003
|
|
| |
2:14:45 PM
|
|
|
|
02 January 2003
|
|
| |
Reinventing the cryptographic wheel
I've seen a lot of articles that contain some home-brewed algorithm for converting a string password into a cryptographic key for use with symmetric encryption (DES, Triple-DES, Rijndael, etc.)
You don't need an algorithm for this; it's already in the box.
byte[] salt = new byte[2] {200, 100}; // can also use null salt PasswordDeriveBytes p = new PasswordDeriveBytes("MyPassword",salt); int bytesInKey = 32; byte[] key = p.GetBytes(bytesInKey); foreach (byte b in key) { Console.Write(b.ToString("X")); } Console.WriteLine();
Returns:
8134CDE1B8E01F9A1B261CAC17D8BBF7E0A9CD839526638F4DC2355473C98
[Sean 'Early' Campbell & Scott 'Adopter' Swigart's Radio Weblog]
10:34:00 PM
|
|
|
|
31 December 2002
|
|
| |
Favorite Visual Studio .NET 2002/2003 (Everett) shortcuts
Ctrl + R, Ctrl + R - Turn on/off Word-Wrap. Ctrl+K, Ctrl+K - Add a Bookmark/Remove a Bookmark. SHIFT+ALT+ENTER - Full screen mode for code editing. CTRL+K, CTRL+C - Comment and uncomment the selected region of code. CTRL + SHIFT + S - Save all CTRL + J - List members CTRL + SHIFT + B - Build solution CTRL + TAB - Next Window CTRL + SHIFT + TAB - Previous window CTRL + F4 - Close current window CTRL + F8 - Build and browse CTRL + M, CTRL + M - Toggle region
You can also view a list of all the shortcuts,
Have your own favorite? Post a comment. [Sean 'Early' Campbell & Scott 'Adopter' Swigart's Radio Weblog]
8:48:19 PM
|
|
|
|
13 December 2002
|
|
| |
Illustrated GOF Design Patterns in C# [Software Engineering] - Posted @ 05:07 am: PermLink
Ian Marino has written up a set of articles on The Code Project documenting how to implement the various GOF design patterns in C#. Lots of sample code is included.
- Creational Patterns
Abstract Factory, Factory, and Builder patterns.
- Structural Patterns Section I
Adapter, Bridge, Composite, and Decorator patterns.
- Structural Patterns Section II
Facade, Flyweight, and Proxy patterns.
- Behavioral Patterns Section I
Chain of Responsibility, Command, and Interpreter patterns
- Behavioral Patterns Section II
Iterator, Mediator, Memento, Observer, and State patterns
- Behavioral Patterns Section III
Strategy, Template Method, and Visitor patterns
1:35:19 AM
|
|
|
|
09 December 2002
|
|
| |
What's really in that assembly?
System.Reflection is great, but sometimes you wanna know more. Ever notice that you can't see (say) the IL of a method given a MethodInfo? Jim Miller [who was one of the main forces behind ECMA-335 (soon be an ISO standard as well!)] just posted two PERreaderWriter packages up on gotdotnet for working with PE files in the raw from managed space. Looks way more convenient than the unmanaged API's (ICorMetaData and friends). Jim showed his own language agnosticism by posting two versions - one written in C# and one written VB.NET.
These libraries are probably most interesting to people writing compilers and related tools (I may use them myself for this soon) but there's good stuff here even for general development, including this snazzy class:
[Serializable] public class MMFStream : Stream, IDisposable { private OSMappedViewOfFile mappedViewOfFile; private Int64 position = 0; private Int64 fileLength; ... }
Yes! Everybody needs one of those in their toolbox! [Managed Space]
2:15:31 AM
|
|
|
|
02 December 2002
|
|
| |
|
Q: |
[6.4] How can I automatically register my assembly when I build it from Visual Studio.NET? |
5top |
|
A: |
It is possible to execute pre and post build steps for C# and VB.NET projects by utilizing a special project type from C++ called a utility project. Prior to testing a server application you must install it into the GAC and register it using regsvcs running on an account with administrative privileges. You can create scripts that will automate this process by doing the following:
- Add a new project to your solution
- Select the project type Visual C++ projects
- Select the template Makefile Project
- Enter the name Pre-Build
- Click OK - this will display the makefile project wizard
- Click finish on the makefile project wizard
- Right click on the Pre-Build project and select properties
- In the General page of the configuration properties, change the configuration type to Utility
- Click the apply button - new options will appear when you do this
- Select the build events folder and Pre-Build Event
- In the Command Line enter Pre-Build.bat along with any parameters you require for your build script.
- Repeat steps 1-11 for Post-Build events (substitute Post-Build wherever it says Pre-Build)
- Select Project / Project Dependencies... from the menu
- All projects should depend on Pre-Build, this will cause it to build first
- Post-Build should depend on all the other projects, this will cause it to build last.
Now you can create the two build scripts Pre-Build.bat and Post-Build.bat with the commands that you want to run when these events occur.
Pre-Build In the pre-build event, you should return the machine to a known state so you will want to remove the assembly from the GAC and uninstall the Enterprise Services application if the assembly exists. Be aware that regsvcs.exe returns an error if the assembly does not exist which Visual Studio will interpret as a build error.
Post-Build In the post build event, you will want to take the steps necessary to deploy and register the server app in preparation for debugging. For most Enterprise Services assemblies this includes adding it to the GAC and calling regsvcs.exe to register the assembly. |
7:41:20 PM
|
|
|
|
01 December 2002
|
|
|
30 November 2002
|
|
| |
1:57:27 PM
|
|
|
|
29 November 2002
|
|
| |
Why you want to use Enterprise Services for your .NET application
Clemens "Mr. Enterprise Services" Vaster has started a series of pieces about using COM+/.NET Integration (following up on his "power = work/time" piece) He writes:
COM+ provides the implementation of a lot of common architectural patterns and solutions to very typical functional challenges. If I either don't understand these patterns or, more often, don't see an obvious mapping of such a functional challenge that I find in my project to a feature provided by COM+, I simply won't use it. The dilemma: If you don't really know what's in COM+ feature bag, you won't be able to find out why you'd ever want to consider using it. If you have no interest in COM+, you will not buy a book on it. For most developers, all feature areas of COM+ beyond "Transaction.Required" therefore remain in the dark. [Clemens Vasters]
Looks like it will be a nice series of articles. Also check out what Tomas Restrepo and Ingo Rammer have to say. [Managed Space]
6:39:22 PM
|
|
|
|
24 November 2002
|
|
| |
This is a set of NAnt Tasks that you can use for your own buildscripts. This is a very early version (0.1.2.0), so there's not much yet. Here's what you'll find here:
- Checksum: This is a basic port of Ant's original Checksum task. For now, it only allows you to calculate a checksum value for a set of files.
- Concat: This one allows you to concatenate a set of input files. Again, it's a basic port of Ant's Concat task.
- MailEx: This one is a modified version of NAnt's original Mail task, which uses filesets instead of attributes to especify attachments.
- MgmtClassGen: This one allows you to execute mgmtclassgen.exe from your NAnt scripts to generate typed WMI classes.
- NUnitReport: This is a NAnt/NUnit version of Ant's JUnitReport task. It allows you to generate an HTML report of your NUnit test results. You can see an example of such a report here.
- Record: This is a preliminary version of Ant's Record task, which allows you to record parts of your build's output (log) to a file. It's very useful when combined with NUnitReport to generate full-blown reports of your daily builds that you can send via e-mail.
7:26:13 PM
|
|
|
|
22 November 2002
|
|
| |
.NET Refactoring Tool Enters Beta. "C# Refactory is a revolutionary new tool which enhances Microsoft's Visual Studio.NET IDE. It performs a number of complex refactorings automatically, allowing you to shape and re-shape your code as needs arise. It also helps you identify code which needs attention by calculating metrics, from 'lines of code' all the way up to 'cyclomatic complexity'. It is fully integrated with the IDE - no external tools means that refactorings are always ready at your fingertips."
As I'm writing a bunch of book code just now, I'm not a good beta tester for this tool, but the descriptions of what it does look yummy. I would especially love Extract Method and Rename Type. [sellsbrothers.com: Windows Developer News]
9:55:27 PM
|
|
|
|
15 November 2002
|
|
| |
Little known COM feature: CoGetInterceptor. This function provides you with a universal interception mechanism that lets you dynamically inspect all aspects of a call and that feels a lot like .NET Remoting Context interception sinks (which unfortunately went from documented to "internal only" in .NET FW RTM)
I don't have the cycles right now to provide an isolated sample or an in-depth explanation, but it works something like that:
IUnknown * pItfToBeIntercepted; ICallInterceptor * pInterceptor;
// ... get pItfToBeIntercepted from somewhere
MyEventHandler * myEventHandler = new MyEventHandler( pItfToBeIntercepted ); // implements ICallFrameEvents CoGetInterceptor(iidToBeIntercepted, NULL, IID_IContextInterceptor, (void**)&pInterceptor); // get interceptor pInterceptor->RegisterSink( myEventHandler ); // register
with myEventHandler being an instance of a class that implements ICallFrameEvents. That interface has a method OnCall that gives you the ICallFrame info. You forward the call to the actual target object using ICallFrame::Invoke or you can just consume the call right there and not forward.
To get between the caller and the object, you call QueryInterface for iidToBeIntercepted on pInterceptor and hand this reference to the client instead of the actual interface.The actual "inner" interface is wrapped by the class that handles ICallFrameEvents and which forwads the call to it inside OnCall using ICallFrame::Invoke. (as shown in the pseudo-code constructor above).
If the target object is aggregatable, you can do all of this in an outer QueryInterface, proxying each interface being asked for and therefore construct a fully transparent interception layer. [Clemens Vasters: Enterprise Development & Alien Abductions]
10:12:31 AM
|
|
|
|
12 November 2002
|
|
|
11 November 2002
|
|
| |
FTP Client Software.
If you are looking for a good FTP Client, check out SmartFTP. It has a nice polished interface that looks good on W2K and XP. And it is free for personal use. I'm going to buy a copy anyway (29 bucks) because I really like it. Much better than CuteFTP or WS-FTP. [News from the Forest]
5:55:22 PM
|
|
|
|
07 November 2002
|
|
| |
8:13:31 PM
|
|
|
|
02 November 2002
|
|
| |
ReST.NET.
Yesterday (and this afternoon), I banged out some code that makes implementing RESTful web services a bit simpler (not too much right now). Basically using a pattern, it will dispatch a specific URI to a specific method. This pattern is of course a regular expression. Each verb may have 1 or more patterns. If you don't want to handle a specific verb, don't put it in the verbs section of the config file. When faced with this situation the handler will return Method Not Allowed to the client. [News from the Forest]
Muy interesante... [Scott Hanselman's Weblog]
2:04:50 AM
|
|
|
|
01 November 2002
|
|
|
25 October 2002
|
|
| |
Peter has posted the slides for his excellent RESTful Soap talk at the recent WS DevCon. This talk was one of my favorites at the conference. I really felt that I didn't understand REST at all before. Now, I feel that I at least understand the major points. After seeing all of the "controversy" on the blogs and elsewhere, I really felt that Peter did a fine job of presenting both sides of the argument fairly. Peter's assertion that the intersection of the two circles between REST and SOAP is one that I believe now: there are valuable things to be gained from it. [Sam Gentile's Weblog]
1:37:34 AM
|
|
|
|
22 October 2002
|
|
| |
Load discipline.
One thing that Steve Loughran talked about at the March 2002 Web Services DevCon was about scheduling loads. His philosophy is this: it takes 10 minutes to load a server, but only 1 minute to find a bug. Therefore, you should load at most once a day, to avoid running in circles.
How true this is. I've had a lesson in load discipline over the past few weeks. In the system I'm working on, it takes about an hour from the time a build is kicked off until the time the code is delivered from the staging area. To load on our "copy" system, where customers develop code against, it takes about 5 minutes each to load 2 app servers and another 15 minutes each to load 2 web servers. And that's the problem: it takes about 90 minutes and at least 3 people (me, the sysadmin who actually executes the install, and the change management coordinator)to build and install the system, and a minute to find the bug. Case in point: this morning, we loaded the system with the output of Friday's daily build. But somebody had checked in a stylesheet and apparently hadn't done much testing, and this completely broke one of the web services,which we found out not 5 minutes after the load was complete. If we'd let the build settle on a testing system, we'd have shaken that problem out there rather than on a (semi-) production system. So the first point is that you have to get a day of testing on some server that doesn't fall under change control.
The second problem is that when you do find a bug, the worst thing to do is to patch the bug and slam an update onto the server you've just loaded. This just puts you further behind the 8-ball; now everybody's life is on hold until the server's up. The better solution is to do some triage:can the server live until tomorrow in its current state? If so, then work towards shaking out the problem on development servers; if not, then roll back the install and fix the problem on development servers. Either way, if a load fails, it's not getting fixed until tomorrow. I don't care who's screaming for a fix; unless somebody's life is at risk, it's not happening until tomorrow.
What's so wrong with doing more than 1 load a day? Number one,it wastes time. Even in a heavily automated environment, a load takesa lot of time, much longer than finding bugs. Number two, with all the wasted time, the amount and quality of testing goes down, and you end up testing on production servers, where it's most expensive to fix. And finally, it puts too much pressure on everyone involved. Developers start to try to squeeze changes in before the build without adequate testing. The build monkey screws up an install script. Sysadmins start making typos. People under the gun make mistakes. This isn't trench warfare, it's software development,so don't go acting like you'll get a medal for heroics. It's far better to get into a rhythm and let the process work itself out. [Gordon Weakliem's Radio Weblog]
1:37:37 AM
|
|
|
|
10 October 2002
|
|
| |
i learned with Orca and izfree to start with..izfree is good for making a basic MSI "template" of sorts..but you can do everything with orca..it just takes some work reading the SDK documentation to learn how it works. Two other tools you might want to use, both are included in the sdk i believe.
makecab: this is a command-line utility that will combine/compress files into a .cab file. msidb: command-line utility used to package actual cabs internally into an msi. Also can be used to extract a cab, or remove a cab entirely(kill a stream).
2:28:31 AM
|
|
|
|
08 October 2002
|
|
| |
I do a lot of work with small offices on the side, and consequently I have to write a lot of VBA code. I tried writing some of that in C# and ended up wrapping the Office Automation interfaces automatically with Visual Studio.NET. Fortunately, Microsoft has released the blessed Microsoft Office Primary Interop Assemblies. There's also a tutorial which touches on the importances of PIAs in bridging the .NET to COM gap. [Scott Hanselman's Weblog]
5:36:22 PM
|
|
|
|
06 October 2002
|
|
| |
Screen Scraped Goodness. RSS 1.0 feeds for CNN, the BBC, Red Hat, and more. Interestingly, CNN is hosting its own feed. Unfortunately, it's... [injektilo]
3:00:45 AM
|
|
|
|
04 October 2002
|
|
| |
NUnit 2.0 Released. NUnit 2.0 Released. From the readme:
"This is the second major release of the xUnit based unit testing tool for Microsoft .NET. It is written entirely in C# and has been completely redesigned to take advantage of many .NET language features, for example custom attributes and other reflection related capabilities."
"In the next few weeks we will be formulating the next release trying to incorporate as many requests as possible." [sellsbrothers.com: Windows Developer News] [Sam Gentile's Radio Weblog]
5:20:55 PM
|
|
|
|
02 October 2002
|
|
| |
2:43:48 PM
|
|
|
|
25 September 2002
|
|
|
24 September 2002
|
|
|
23 September 2002
|
|
| |
Native XML Script.
Now this is cool.
This technology would have saved many of the hairs I ripped out of my head from mixing XSLT and procedural code (Java, C#, etc.). What would be even cooler is if there was an XSLT engine that natively supported XML Script. [News from the Forest]
11:39:04 AM
|
|
|
|
22 September 2002
|
|
|
21 September 2002
|
|
|
20 September 2002
|
|
| |
I'm just about to convert over to Easynet for my ADSL local loop. Here is what I'm getting before the changeover...
2002-09-20 08:04:47 EST: 1457 / 222 Your download speed : 1457868 bps, or 1457 kbps. A 177.9 KB/sec transfer rate. Your upload speed : 222617 bps, or 222 kbps. Seems like broadband .. above the 1mbit barrier! |
1:07:07 PM
|
|
|
|
18 September 2002
|
|
|
17 September 2002
|
|
|
16 September 2002
|
|
|
© Copyright
2003
Jamie Cansdale.
Last update:
26/02/2003; 03:09:01.
|
|
| February 2003 |
| Sun |
Mon |
Tue |
Wed |
Thu |
Fri |
Sat |
| |
|
|
|
|
|
1 |
| 2 |
3 |
4 |
5 |
6 |
7 |
8 |
| 9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 16 |
17 |
18 |
19 |
20 |
21 |
22 |
| 23 |
24 |
25 |
26 |
27 |
28 |
|
| Jan Mar |
|