
|
 |
 |
|
| |
 |
Friday, September 24, 2004 |
I raised this question at the office today and I was surprised by they debate which arose. Generally developers seemed to immediately favor "instantiate an object" until they had participated in the debate a little. Then the majority leaned on the side of "instantiating a class."
Which one do you think is correct?
1:55:20 PM
|
|
 |
Wednesday, September 15, 2004 |
I spent considerable time customizing the Windows XP/2003 install recently in order to slip-stream in the SATA drivers. In the process I came across several good links for this type of thing. All appear to have their root at Microsoft Software Forum Network, a great site especially for IT/Windows type of information.
- Creating Multi-Boot DVDs - Provides a step-by-step guide on creating multi-boot CDs and DVDs. There is also a beginners guide. An entire forum dedicated to the topic of Multi-Boot CD/DVDs is also available. More instructions are available here.
- Creating the ultimate unattended Windows install CD
- XPCreate - a large batch file that slip-streams hot fixes and Windows install customizations into a new ISO image. This program is great and I highly recommend it to anyone trying to slipstream drivers into their unattended install. (It doesn't appear to support Windows 2003 AMD 64 bit :( but greenmachine provides excellent support and I would imagine he would add stuff if there was enough demand. Incuded in this utility are
CDImage - Command line creation of ISO files (an internal tool from MS but available none-the-less with the XPCreate download). A GUI (currently Beta) version is available here and rumor is that it wraps the command line version. CDBurn.exe - Command line CD burning given an ISO file BBIE (Bart's Boot Image Extractor) - Command line extraction of bootimages from CD/DVD/ISOs
Just on the own these utilities are quite useful in my opinion, never mind there use with XPCREATE
- Slip-streaming SATA drivers - There are many other links for this such as this forum posting. Just search google for Si3114r.
- XPlode - A tool for aiding the process of running unattended commands/installs during Windows install. There is little documentation but the utility is actually a CMD/BAT file so it is self documenting to some extent (although the author certainly performed some wonders IMO). The top "How to run XPlode" topic on the forum provides the best introduction.
- Both XPCreate and Winnt.sif files use and INI format. As a result I needed a commandline INI editor. For some reason it took considerable time to find this program... so much so that I began writing one (in C++ of course) but avoided this at the last minute. Fortunately, I came across EZ INIEdit here and then INIMAN.EXE/INITOOL.EXE tools called INITyme which are part of the XPCreate download.
- One of my favorite windows unattended install tips is to open a command prompt at T-12. Besides performing custom actions this is a great location to debug the cmdlines.txt file. To open the command prompt simply add
start /w cmd.exe
to the [Commands] section of CmdLines.txt. Alternatively, place that command along with other commands into a CMD/batch file as described here.
11:50:14 AM
|
|
Last week I gave Windows 2003 x64 AMD w/SP1 BETA a spin on my new 64 bit AMD server. I was disappointed at the viability of this. Not because the OS is bad (didn't use it enough to know) but because it had virtually no software or driver support.
Here are my notes:
- Neither Microsoft Virtual PC nor Microsoft Virtual Server seem to have 64 bit versions and they don't even install on the 64 bit OS making them unavailable on that platform. This was the biggest disappointment and caused me to uninstall.
- Daemon tools ISO reader didn't work (this was my number 2 disappointment)
They know there is demand for a 64 bit version and they are planning on releasing one but there is no ETA.
- I wanted to try VSTS but there is not 64 bit versions yet although MS will provide them in time.
- The Java based SATA RAID software doesn't appear to have a 64 bit version voiding any RAID configurations on this platform.
- Tyan provided beta 64 bit SATA drivers (Si3114r)
- The Windows 2003 CD structure is different than normal Windows Cd's. There is very little in the I386 directory and lots in the AMD directory. This makes sense but it is hard to know how to customize the install. Where does $OEM$ go for example?
11:32:45 AM
|
|
I recently built an AMD 64 server using the following components.
- SuperMicro SC742T-550 Black ($286.00)
- 1 X OPTERON (AMD 64) 246 2.0 GHz ($485.00)
- Thunder K8S Pro (S2882) mother board ($519.99)
- Western Digital 7200RPM 80GB Hard drive WD800JB% ($63.50)
- 2 X Seagate 7200RPM SATA Hard drive ST3200822AS% ($128.00 each)
- Pioneer DVR-108 DVD+/-RW ($91.99)
- 2 X DDRAM Transcend PC2700 1GB ECC ($235.00)
Everything was purchased from www.newegg.com except the mother board which came from www.buy.com because NewEgg was out of stock. This was my first experience with NewEgg and I have to say their prices were considerable better than I found else where on virtually every item. Very impressive! The big drawback is that they have a restocking fee if you wish to return something even if you are just replacing it with a different item. Only replacing defective materials with the exact same item avoids the restocking fee.
Comments about the hardware are as follows:
- The chassis supports 7 SATA drives but the mother board only supports 4.
- Both the motherboard and the chassis include SATA drive cables and the chassis provide normal power connectors so it isn't necessary to hook up special SATA power cables (although the mother board does provide some).
- The RAID management software uses Java and requires the Java VM get installed. It also leaves a DOS box around after launching when you log in. This software left something to be desired.
- The SATA card on the motherboard does not have Windows 2003 build in drivers making the disks inaccessible during Windows 2003 install without providing a floppy or slip-streaming the drivers into the Windows 2003 CD.
- There are two ACT cables (I think they are LEDs for the SATA drives) coming from the Chassis that don't seem to have a connection on the mother board.
- The motherboard doesn't have a Power Source LED light.
- Researching and building the server myself was way too time consuming but I haven't done it for several years so it was good to have a refresher.
- The fan on the chassis power supply doesn't work. I suspect (but I am not an authority on this) the problem is due to the fact that there is a square 4 prong connector coming out of the power supply but there is no destination connector on the mother board.
- The lack of built in support for SATA drives in Windows XP/2003 is an absolute pain (but now I digress to software so I will post these turmoils separately.)
11:19:57 AM
|
|
 |
Monday, September 13, 2004 |
While at his my Mom and Dad's a few weeks ago my 4 year old son got into a conversation about his last name. Granny told him that his last name was, "Michaelis," making his full name "Benjamin Michaelis." To which he promptly replied that his full name was, "Benjamin Michaelis.NET."
VERY SCARY!!!!
7:34:06 AM
|
|
 |
Saturday, September 11, 2004 |
Applications: Running 32-Bit Applications with Windows Running on AMD Opteron and AMD Athlon 64 Systems
Google Search It
I came across this title in the release notes for the beta version of Windows 2003 for 64 bit AMD with SP1. It seems innocuous enough at first. The problem is in the details which I quote below:
Generally, you can run 32-bit applications on Windows Server 2003, Standard Edition; Windows Server 2003, Enterprise Edition; and Windows XP 64-Bit Edition without making any changes. Applications that meet the following criteria, however, are not compatible with Windows products running on AMD Opteron and Athlon 64 systems:
- Applications with 16-bit installers
- Applications that install 32-bit kernel-mode drivers
- Applications with dependencies on any version of Microsoft .NET Framework
We recommend that you contact your software vendors to verify whether one of these exceptions applies to your software.
Hmmmmm... I think that could be a problem for me. Uggghhhhhhh!!!!!! Besides, wasn't the .NET Framework supposed to deal explicitly with this problem?
11:08:54 PM
|
|
 |
Friday, September 10, 2004 |
One omission from .NET 1.0 that would have been extremely useful is a Stopwatch that can report accurate time (presumably using the high performance counter APIs). It is needed especially for doing any type of small scale testing. Unfortunately, there is no such class in .NET 1.0. However, 2.0 does have such a class in the System.Diagnostics namespace called Stopwatch.
If you are stuck in the 1.0 world still then Daniel Strigl has defined a class on CodeProject called HiPerfTimer that could easily be converted to look like the Stopwatch class in 2.0.
10:24:59 AM
|
|
 |
Monday, August 02, 2004 |
Yesterday I competed in a TROIKA, a half Ironman (1.2 mile swim, 56 mile bike, 13.1 mile run). My goal was to finish and finish I did. Wahoooo!!!
Summary:
- Swimming is tons easier with a wet suit.
- Flat tires don't magically fix themselves when you pump them up. You must fix the flat or change the tire. Duh!
- Energy bars are too chewy to eat while biking. I imagine that energy goo would be a lot better.
- The race is significantly harder without any support from folks you know, cheering you on, collecting your gear, providing encouragement, pushing you not to take it easy, etc. Along the way were chalk writings on the pavement along with spectators spurring contestants on and I am sure having someone you know cheering for you makes a huge difference.
- My goal was to finish and at the end of the bike section I was confident I could do this. As a result, I felt fine about walking a significant part of the run. Next time (if there is such a thing) I need a goal that will motivate me to try harder.
- Don't use your equipment for the first time on race day. (Another Duh :) )
A full description of my race can be found here.
9:35:31 AM
|
|
 |
Thursday, June 03, 2004 |
In the past I have been a big fan of NewsGator and pretty much used it exclusively. However, one particularly irritating feature of some blogs is that they only supply the title, posting URL, and date in the RSS feed, forcing one to go to the website to view the body. intraVnews deals with this issue displaying the posting URL content below the blog content. This is a fantastic feature that allows one to still follow blogs that don't provide a body. (This begs the question that perhaps blogs that don't provide a body should continue to be boycotted regardless of the tools to overcome the problem.)
I am currently giving intraVnews a try and so far I am reasonably pleased. In fact, I have NewsGator and intraVnews installed simultaneously without problem. My two negative comments on intraVnews relate to
- Moving blog folders - The UI for this is rather cumbersome and time consuming if there are lots of blogs.
- The scheduler to download doesn't appear to autostart (presumably a setting I haven't found yet.)
One of the key items I need to investigate soon relates to exporting the settings of the RSS reader and then importing them once I re-install the OS.
12:34:50 AM
|
|
 |
Wednesday, June 02, 2004 |
Here is an interesting device especially if you already own a Windows Media PC and want to add cassette capabilities. The PlusDeck 2 is an internal cassette deck for your computer that can help convert cassettes to their WMA/MP3 equivalent. I have lots of cassettes, especially talks from Willow Creek, that I would love to convert just so they can be digitally organized. I would then listen to the MP3s on my not-yet-existent mini Smart Phone with built in MP3 player (and Bluetooth of course).
10:59:23 PM
|
|
When .NET was first released I was disappointed by the fact that they had not provided a definition for the term "component." The term was common in the COM days but it was never clearly defined as referring to a particular COM object or the DLL in which the COM object was implemented.
Under .NET the definitions remain ambiguous and at this point too many leading engineers have placed a stake in the ground one side or the other so it is unlikely to get resolved any time soon. Some, like Juval Lowy, firmly believe it corresponds to a class. Other sway more toward it referring to an entire assemble.
I share Michael Platt's amazement that these terms remain ambiguous given the length of time they have been pervasive in the industry. Furthermore, the frequent need to create designs that include classes as well as the containers of the class definitions would lead one to expect that their definitions were firmly established. Perhaps what makes this even worse is that "module" now has a definite meaning in the .NET space. Therefore, it cannot be used as the generic term for a container of compiled code.
Personally, I prefer the component to mean assembly (or container of compiled code) as I don't believe there is any need to provide another word for object or class as these have firm O.O. definitions. Furthermore, there is not really any generic term for the files (or streams) that contain a series of bytes implementing a feature (or class etc.) Component seems like a great term to fill this hole. Recently I read Michael Platt's discussion of the terms Object, Component, Model, and Service and was pleased to hear I am not alone in my leanings.
Thoughts?
5:10:32 PM
|
|
 |
Tuesday, June 01, 2004 |
I recently wanted a button or keystroke that could automatically toggle the Lock Anchor state for shapes in Microsoft Word. Unfortunately, there didn't seem to be a built-in Word action for doing this. Using a tip from Cindy Meister I created the following macro that does the trick nicely:
Sub ToggleShapeAnchor() Dim newlockAnchorSetting As Boolean If Selection.Type = wdSelectionShape Then If (Selection.ShapeRange.Count >= 1) Then newlockAnchorSetting = Not Selection.ShapeRange(1).LockAnchor End If For Each Shape In Selection.ShapeRange Shape.LockAnchor = newlockAnchorSetting Next End If End Sub
I also had a problem with trying to make fine adjustments of the shapes. Each adjustment caused the shape to jump a couple inches up the page. Further adjustment caused it to jump again. Cindy informed me that this was generally indicative of damage in the binary structures of the control page layout and advised I tried round tripping the file to RTF, WordML, or HTML. I also found that turning on and off the anchor sometimes seemed to get particular images positioning correctly again.
9:40:54 PM
|
|
The current C# 2.0 specification includes the following quote:
"A comparison operator (==, !=, <, >, <=, >=) has a lifted form when the operand types are both non-nullable value types and the result type is bool. The lifted form of a comparison operator is formed by adding a ? modifier to each operand type (but not to the result type). Lifted forms of the == and != operators consider two null values equal, and a null value unequal to a non-null value. Lifted forms of the <, >, <=, and >= operators return false if one or both operands are null."
What does this mean?
Perhaps the most significant concept in this paragraphs is at the end where it declares that the operators <= and <= versus the operator == behave differently for Nullable<T> types when that have the value null. As a result, even though == may return true, the >= operator and the <= operator will sometimes return false. Let's consider an example.
int? x, y; // Declares two variables of type Nullable<int> x = null; y = null;
Assert.IsTrue(x == y); Assert.IsFalse(x <= y);
When null is involved with a nullable type, therefore, the >= operator would not be equivalent to the combination of the > and == operators. In other words, the expression x>=y would not be equivalent to the combination of x>y || x==y. Perhaps what is most unusual about this is generally they operator >= is called greater-then-or-equal but in the case of both operands being null, the result of the >= operator would be not equal even though the == operator indicates they are equal.
Furthermore if you were to sort a list of Nullable<T> types using the > operator for ascending order and the < operator for descending order then regardless, all items with the value null would sort to the same location regardless of which operator (< or >) was used (null items would always sort to the top or the bottom regardless of which operator is used.)
Note that currently the May 2005 Visual Studio.NET Tech. Preview does not support the >= and <= operators. Also, the == operator is marked as obsolete.
I would be curious to know what folks think about this implementation?
(This topic is also being discussed at on the GotDotNet C# Language Message board here.)
4:21:35 PM
|
|
It has now been one month since my bicycle accident. I would like to say everything is back to normal but there are a few hitches.
Mental state
I will let you draw your on conclusions based on interactions with me and the following additional data points:
- Pushed the undock button when leaving work but I ended up forgetting my laptop at work for one night last week. Normally an allergic reaction starts when I get to far from the laptop and I didn't even realize the mistake until I got home.
- I left my wallet on the bus (my means of commuting while I can't ride a bicycle) last week and didn't realize it was missing until half way through the day. (Fortunately, this is Spokane and not <enter city name here> because I picked it up intact with all cash and cards 2 days later at lost and found.)
- I asked my son to put his used paper napkins into the dishwasher 3 times one evening. Fortunately, my beautiful wife was there to point out my nonsensicalness.
- Today I took a bus from work to the transit station. I then moved to another bus and waited for it to leave. Five minutes into the journey I realized that the bus I boarded at the transit station was taking me back to work rather than home. I disembarked soon enough to be in walking distance from home and this was the first time taking this particular route but still, it wasn't particularly bright of me.
Physical state
On Friday I had a tilt table test in the morning, an appointment with an orthopedic surgeon for my AC separation in the early after noon, followed by a stress (treadmill) test and meeting with the cardiologist toward the end of the day. Earlier that week I also had a CAT scan of my heart. The orthopedic went so far as to say that I should come and see him in six months if I still have a problem but that it should heal on its own (I responded that is wasn't personal but I hoped I wouldn't need to see him again either.) At the very end of the tilt table test I went pale and sweaty but I didn't faint (the goal if it was to be a positive test). In the end the cardiologist concluded that all the tests were negative except for the tilt table test which was abnormal but inconclusive. Therefore, he recommended that I go for a Catheter Ablation. He also cleared me for driving but not exercise.
Emotional state
Looking forward to this all being over. Frustrated by my lack of productivity both at work and with writing. Perhaps this is normal but I am blaming it on my accident regardless. :)
Summary
- I am uncomfortable with doing the Catheter Ablation and I don't think there is enough evidence to warrant putting a tube into my heart.
- They have also not been able to show any exercise related syncope and it frustrates me that they are still asking me not to do any exercise, especially when my two syncope related incidents immediately following my accident have more in common with driving than exercise.
11:09:13 AM
|
|
 |
Sunday, May 23, 2004 |
For those of you who were not able to make it to Tech Ed 2004 this year, here are several of the developer related talks that will be broadcast over the web (in date order):
I am not sure why these are the only ones showing up on the Microsoft Event Search pages so if you come across others please let me know.
10:05:05 PM
|
|
 |
Wednesday, May 12, 2004 |
On May 2 I qualified to join the Washington Saved-by-the-Helmet Club by having a serious accident on my bicycle and living to tell about it because of my helmet. Eric Brady and I were making our now annual bicycle ride to the Bloomsday race of Spokane. This is our third year of biking down and racing, but this year was an exception because I didn't actually make it there.
On the corner of Pines and Montgomery in Spokane Valley I had a bicycle accident. Montgomery is at the bottom of an incline and I fell trying to cross over a triangular median with ramps for wheeled traffic. I don't remember anything except what the median looked like before the accident. Eric described the accident,
"...when you went over the ramp on the pedestrian island, it kicked the rear tire up and threw your weight forward. You then landed on the front tire, went over the handlebars, skidded/bounced one time maybe twice on the pavement, and contacted the curb. It all happened very, very fast."
In other words, after going over my handlebars, I skidded about 6 to 8 feet and my head collided against the curb, cracking my helmet. Following the accident I went by ambulance to the emergency room trauma services at Deaconess hospital in downtown Spokane. From there I was admitted to ICU (Intensive Care Unit) where I remained for three days before being released to the neurological ward and home the next day.
Diagnosis
-
-
No broken bones.
-
Road rash on my left shoulder, knee, arm, ear and face.
-
AC separation of my left shoulder.
How am I doing?
-
Considering what happened I am doing really well.
-
I am experiencing more tiredness than normal and I am essentially sleeping during the day at the same time my one-and-a-half year old daughter takes naps.
-
I have pretty constant headaches but I am learning to just accept them as "expected." I take Acetaminophen (Tylenol) with Codeine at night for them and regular Acetaminophen during the day as needed. I am also on some meds. to reduce the chance of seizures.
-
According to my neurologist I am not currently allowed to bike or drive which makes getting to work rather difficult (I normally bike to work year round). Fortunately, the doctor has also recommended I not work for two weeks following my hospital stay. Still, this puts pressure on Elisabeth as we always have to take the kids with us in order for me to go out.
-
I don't get to exercise until my cardiologist grants permission just in case my accident was caused by an exercise induced blackout. This makes my preparation for Troika Half Ironman difficult at best.
-
The Intra-ventricular hemorrhage has caused a loss of short term memory and my mind is a lot slower. (This would be a great time to challenge me in Go or chess or throw some puzzle my way.) Fortunately my thinking is improving but it is slow and I still find it takes me a lot longer to work through stuff that I previously did instantly.
-
My arm hurts, especially when lifting my daughter.
-
I feel frustrated at my lack of ability to do anything productive (work and writing are the key sources of frustration) but slowly I am starting to be able to sit at the computer for short durations.
7:56:06 AM
|
|
 |
Sunday, April 25, 2004 |
I have been playing around with the inaccuracies of floats and decided to share some of the simplest comparisons that might surprise folks that use the equality comparisons of floats indiscriminately.
The following code listing pretty much captures the issues:
using System.Diagnostics; ... decimal decimalNumber = 4.2M; double doubleNumber1 = 0.1F * 42F; double doubleNumber2 = 0.1D * 42D; float floatNumber = 0.1F * 42F;
Trace.Assert(decimalNumber != (decimal)doubleNumber1); // Displays: 4.2 != 4.20000006258488 System.Console.WriteLine("{0} != {1}", decimalNumber, (decimal)doubleNumber1);
Trace.Assert((double)decimalNumber != doubleNumber1); // Displays: 4.2 != 4.20000006258488 System.Console.WriteLine("{0} != {1}", (double)decimalNumber, doubleNumber1);
Trace.Assert((float)decimalNumber != floatNumber); // Displays: 4.2 != 4.2 System.Console.WriteLine("{0} != {1}", (float)decimalNumber, floatNumber);
Trace.Assert(doubleNumber1 != (double)floatNumber); // Displays: 4.20000006258488 != 4.20000028610229 System.Console.WriteLine("{0} != {1}", doubleNumber1, (double)floatNumber);
Trace.Assert(doubleNumber1 != doubleNumber2); // Displays: 4.20000006258488 != 4.2 System.Console.WriteLine("{0} != {1}", doubleNumber1, doubleNumber2);
Trace.Assert(floatNumber != doubleNumber2); // Displays: 4.2 != 4.2 System.Console.WriteLine("{0} != {1}", floatNumber, doubleNumber2);
Trace.Assert((double)4.2F != 4.2D); // Display: 4.19999980926514 != 4.2 System.Console.WriteLine("{0} != {1}", (double)4.2F, 4.2D);
Trace.Assert(4.2F != 4.2D); // Display: 4.2 != 4.2 System.Console.WriteLine("{0} != {1}", 4.2F, 4.2D);
I find the results notable in several regards:
-
You can use a double to expose the inaccuracy of a float.
-
Comparing decimalNumber and floatNumber reveals they are not equal even though printing the values out to 20 decimal places indicates they are equivalent.
-
doubleNumber1 and floatNumber are not equivalent even though they are both assigned the exact same calculated value in the code. (In fact, the IL reveals the values are different.)
-
This is not just an issue of calculation as the last two assertions reveal.
The obvious question at this point is why?
-
float is only accurate to 7 digits so if you cast it to a data type that can hold more than that you will inevitable expose the "insignificant" portion such that it becomes significant. (This is why (double)4.2F does not equal 4.2D.)
-
decimal, float and double get initialized with different calculated values because they require different levels of accuracy. The decompiled IL code is as follows:
decimal decimalNumber = 4.2; double doubleNumber1 = 4.200000062584877; double doubleNumber2 = 4.2000000000000002; float floatNumber = 4.2000003;
In response to and appreciation of Julian's post here I took the time to correct my post. Thanks Julian!
I should perhaps delete the entire post but I think my carelessness requires a correction. The primary modifications are as follows:
- I updated the IL code. Converting the hex values displayed by ILDasm.
- Deleted the "Trace.Assert((decimal)4.2F != 4.2M);." "Trace.Assert(!4.2M.Equals(4.2F));" was what I should have posted.
- I updated the variable names to be slightly better.
- Deleted: "Even though floatNumber and doubleNumber2 are assigned the same values in IL they still don't evaluate as equal." This was incorrect. They are not assigned the same value in IL, only in C#.
- Delete: "Any time you compare one <of these> types against another the Equals(object value) method is called and it returns false if the data type is not the same. " It didn't really fit as I didn't use the Equals() method in any of my code and generally the Equals() method is overloaded with a parameter that takes the class type.
- Deleted: "If you remove the calculations and simply assign 4.2F ...." This was just incorrect (see colophon).
Colophon: The root cause of all the errors was the fact that I was using csc.exe for compiling and not VS.NET. As a result, I forgot the /D:TRACE switch so assertions were ignored. I am amazed that only one of the assertions in the end was invalid but regardless I should have been more careful.
8:07:40 PM
|
|
 |
Saturday, April 24, 2004 |
For the past year my wonderful wife has been complaining about the hand-me-down stereo system that we have. Although the system is relatively good the CD player has packed up and the amplifier takes about 20 minutes to warm up due to a bad capacitor that I haven't taken the time to fix. We temporarily replaced it with a boom box but the CD player gave out on that to? We also purchased and under-the-counter CD player and radio but last week the CD player on that died to. What is the deal with CD player reliability or is it just me?
Anyway, I would like to replace it with a network (802.11b/g or Ethernet) enabled stereo system but it appeared that no such thing existed unless of course one goes with a Windows Media Center PC or Linux. The problem with Windows Media Center PCs, however, is they require a monitor and I just want a stereo (I don't want a TV, I am not disciplined enough for that.) A Windows Mobile powered stereo an an x86 processor would be great and I would love the challenge of trying to build one but writing drivers for FM receivers, CD players and the like seems beyond my time constraints. This leaves me with Linux but this too seems like a time sink waiting to happen.
Today I ran across a pretty the Cyruslink system which appears to be running a Pocket PC OS. This seems to be an ideal solution except for one significant factor: £2,999 just for the "lowend" Linkserver.
5:25:26 PM
|
|
 |
Friday, April 23, 2004 |
I unexpectedly received the following dialog from Microsoft Outlook 2003 after dialing in to my VPN.

Perhaps what puzzles me most is exactly who "I'm" is referring to. I was not aware that my computer had feelings of remorse -- or any feelings for that matter.
10:51:41 PM
|
|
I came across two NNTP news reader add-ins for Microsoft Outlook recently. The first is NewsLook and the second is from MAPILab's. It appears none of the have the fast efficient newsgroup reading support that come | | | |