.NET

[note: this started as a comment but started getting a little long-winded. what follows is a little gentle ribbing of Paul for a recent post he wrote about being a lazy cache programmer :P] Mr. Stovell, you've officially lost your marbles :P j/k okay, just to play devil's advocate...>:) I think the asp.net cache framework fits very nicely for its purpose - what you propose seems like another abstraction on top of it, for the benefit of thinking *less* about what items you should cache to *optimize* code execution time? So, just throw everything possible at it. Cache can handle...

...and so dark in here.

I recently ran into a neat little nugget of functionality in C# with events. Normally in C# when we define events we stop at something like this:public event EventHandler<MyEventArgs> MyEvent; The thing is, you can explicitly implement the add and remove accessors if you throw some curly braces into the mix. Why does this matter? Imagine that you have a MainForm, and a usercontrol named ControlPanel. ControlPanel contains another usercontrol called hiddenControl that exposes an event that you want to handle in MainForm, but all MainForm has access to is ControlPanel...public event EventHandler<MyEventArgs> MyEvent{ add{ this.hiddenControl.MyEvent += value; } remove{ this.hiddenControl.MyEvent -= value; } } Now you can subscribe to...

posted @ Wednesday, April 25, 2007 5:44 PM | Feedback (0) | Filed Under [ .NET ]

This is just a re-statement of a forum thread that discusses the fix, but since gotdotnet is not going to be around very much longer I thought I'd post this little tidbit here as well. Basically, when I upgraded one of my sites to .net 2.0, skmMenu got upgraded right along with it. The only issue was that all of my menus would show up at the far left corner of the screen, and when you try to navigate to them over there they disappear thanks to the menu items between the cursor and the target. I think I only saw...

I read this excellent post from ScottGu and decided to use it with a page that implemented a masterpage. I didn't have to use postbacks in my scenario, but there were links included from the masterpage. The problem is that if you use app-relative paths for your href attributes (ex: <a href="/default.aspx">) the browser (FF 2.0.0.2 and IE 7 anyways) interperets the url with pathinfo differently than a url without. The base url includes the original page (ex: http://localhost:3333/rewriter.aspx/default.aspx). Guess what? The webserver picks up the last .aspx extension, default.aspx, that bad boy doesn't exist, and you get a 404 instead of...

posted @ Thursday, March 15, 2007 1:45 PM | Feedback (0) | Filed Under [ .NET ]

So I've been able to dig my teeth into some asp.net hacking recently, and I've been wrestling with learning to use SubSonic in the process. In dealing with the scaffold control I ran into a funny issue: none of the exposed properties on the scaffold control will output any style info of the GridView that the control uses (that I could figure out anyways). I ended up with black text on a black background. :/ Seeing as I have the source, I decided to give the scaffold control's GridView a little class...hello GridViewCssClass property! I set it up just like the...

It looks pretty neat. I really dig the "type inside the preview" Web Layout. That's just sweet. The plugin support looks promising...I've already started coding up a CodeHTMLer plugin for syntax highlighting ala PostXING, now if I can get one going that will allow me to post the same content to more than one blog I'll be in business. I've been on a little hacking-hiatus on PostXING for the past few months to spend the summertime with my son Ethan, so what a great way to stretch my geek muscle all over again at the end of summer!

posted @ Thursday, August 17, 2006 2:40 AM | Feedback (0) | Filed Under [ .NET ]

Exactly what I was looking for...I don't know a lot about reflection, so I wonder if there is a more elegant way to get this info.

posted @ Friday, August 11, 2006 5:00 PM | Feedback (3) | Filed Under [ .NET ]

There are a few things that have to happen for this "regression" to show up. First, you have to be working in .net 2.0 WinForms. Second, you must be using a custom application context. Third and most importantly, you must have at least one form open in your application that handles its closing event and sets CancelEventArgs.Cancel = true. What's the behavior? While operating under a custom ApplicationContext, what would be my Main form is closed by the user. Since the application context is not associated with that form, I decide to call "Application.Exit()" in an override of OnClosing. My...

Wow.

posted @ Wednesday, June 07, 2006 12:40 AM | Feedback (0) | Filed Under [ .NET ]

Jerry Pisk Path.GetTempFileName() guarantees that you will get an available name, it does actually go ahead and create the file so it is guaranteed to be yours when you use it. If you strip the extension off and substitute your own you may end up overwriting an existing file. Not a smart thing to do. In my case, I just really want the filename. Whether or not I change the extension, that file is mine to do with what I will. Also, since it's not in the same folder as...

posted @ Thursday, May 04, 2006 5:11 PM | Feedback (0) | Filed Under [ .NET ]

If you need to generate temporary / semi-unique filenames, here is a little snippet that uses the framework:using System.IO; string GetTempFileName(){ return Path.GetFileNameWithoutExtension(Path.GetTempFileName()); } As the name implies, this will return the temporary name of a file without the extension, so it's up to you to add whatever filetype you may be trying to create. For example, let's say I wanted to generate a .gif:string GetTempGifFileName(){ return string.Format("{0}.{1}", GetTempFileName(), "gif"); } I had overlooked this little piece of functionality because the component that I was using generated filenames with GUIDs, so I never really worried about it. Way to make my life easier, .netfx :) [ Currently Playing...

posted @ Thursday, May 04, 2006 3:02 PM | Feedback (0) | Filed Under [ .NET ]

Using Yield in PracticeThe moral of the story is STOP thinking so hard about it, just use "yield return" the next piece of data in the list.  When using the yield statment GetEnumerator's job is to answer foreach's question - "what's my next item please".  Walk all the items in your collection and yield return what you want.  Don't worry about remembering where you were - that's all part of the generated statemachine goo - it will stop and start the function you write as it...

posted @ Friday, April 14, 2006 3:13 PM | Feedback (0) | Filed Under [ .NET ]

I've updated the NetVibe source with a mildly useful update: listening for changes in SSID as well as IP Addresses. The source is hosted at http://chrisfrazier.net:8080/NetVibe on a subversion server. I used some code that I found at the FurryGoat experience, modified it a little bit, and it seems that it's at least useful in detecting if an SSID ends with something...for example, my WiFi at work has an SSID of VelocityDatabank, so I created a rule to look for an SSID/IP Address that EndsWith Databank. This code definitely needs improvement, but I have found it very useful, and now I don't...

This looks interesting. I thought Mr. "Just finished my last chapter of Beginning AJAX" would have for sure created this as an asp.net control...guess I should have read closer the first time ;) Could be useful in PostXING, ifn we ever put some real security innit. Since there has been so much interest in the SecurePasswordTextBox control (see my previous post http://weblogs.asp.net/pglavich/archive/2006/02/26/439077.aspx and http://weblogs.asp.net/pglavich/archive/2006/03/12/440052.aspx ), I thought I would take the time to iron out the bugs. When I first released it, I performed minimal testing (i.e. about 15 minutes worth) and just...

Sorry I keep putting out these tests, but I'm trying to see what different regexes will do to a friendly url in subtext. Nothing more to see here. [ Currently Playing : Have You Heard? - ZZ Top - Tres Hombres (3:12) ]

I've got weak regex skillz. I'll admit it. I don't use them very much, so when I do need to, it's nice to know that regexlib is sitting there, waiting for me to come to it with my regex needs. In particular, there is an online Regular Expression Tester that has helped me to look smarter than I actually am on more than one occasion. Sure, I could use a desktop tool for my regex needs (and sometimes I do), but regexlib has the added bonus of having a collection of user-contributed regular expressions that are super useful when looking for ideas...

I can't believe nobody called me on this: BackgroundWorker.IsBusy Property Reflector says it does exactly what I was looking for in a previous post. Technorati Tags:  Windows Forms  BackgroundWorker 

This is a private boolean member of the new BackgroundWorker class in .NET 2.0. If it were public, perhaps there would be less questions like this one on the gotdotnet messageboards. I ran into a similar problem recently and decided that instead of catching an exception when the BackgroundWorker is running, I would emulate the isRunning member myself. Since this is multithreaded by its nature, I decided to use a lock object to control access to a static boolean member in the class that uses the BackgroundWorker component.static bool isRunningBgWorker = false; static object lockObj = new object(); ... if (!isRunningBgWorker) { this.backgroundWorker1.RunWorkerAsync(); } I check to...

According to this thread, Microsoft may run into visioning problems if they stick with their new build number scheme (major.minor.yMMdd.revision) next year. A Version in the .NET framework consists of 4 integers for the major, minor, build number, and revision in that format. When the build number uses the year as the first digit, it becomes 3.0.70101.0 for example on January 1st of next year. The build number only goes up to 65535. Oops. As an alternative, I think I'll be sticking with the BuildDay method, using the UpdateVersion tool. I was hoping to be able to use the AssemblyInfoTask to...

A few people asked for the source code/a download for the little widget I whipped up on Friday, so I spent this morning adding a little bit of persistence. The original code for switching my networks is still in there (and still works on my machine if I change the code to point there) but I made it more general and also used it as an excuse to explore the Settings API as well as use a couple of neat features of VS 2005. (If you don't care about any of that stuff and just want to see if you...

This is pretty cool:System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged += new System.Net.NetworkInformation.NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged); I have a laptop that everyday switches between my wireless home network and my wired work domain. I was looking for a way to add scripting abilities to the interface itself (i.e. when a network connects, run some script) when I stumbled upon this jem. So, I now have a little winforms app that sits in my tray (yet another one) and doesn't do anything but run a script (that in turn modifies my hosts file) and change its tray icon when I'm connected to different networks. Here's what connected at home looks like:  It began as...

 Viral Marketing: VistaDB 2.1 database for .NET has been releasedThis 2.1 update includes over 60 improvements, including new support for .NET 2.0 and Visual Studio .NET 2005. VistaDB is a small-footprint, embedded SQL database alternative to Jet/Access, MSDE and SQL Server Express 2005 that enables developers to build .NET 1.1 and .NET 2.0 applications. Features SQL-92 support, small 500KB embedded footprint, free 2-User VistaDB Server for remote TCP/IP data access, royalty free distribution for both embedded and server, Copy 'n Go! deployment, managed ADO.NET Provider, data management and data migration tools. Free trial is available for download.- Learn more about...

I was having this problem in an application that I've been working on where I was drawing data points onto a PictureBox control - kind of like a canvas. The problem only showed up when a lot of data was thrown at the PictureBox: instead of seeing my data, I would see a loverly big red x. So I did some chasing down a few rabbit holes (apparently this is a difficult issue to pinpoint - I found loads of unanswered forum/newsgroup posts about a red x) and found Bob Powell's GDI+ faq. Specifically, I found a good overview of How not...

I've been chasing down this odd Visual Studio bug where the Enter, Backspace, and Arrow keys stop working. It happened to me in Redmond at Microsoft Campus (of all places!) and it's a known bug that a lot of others have run into apparently. Some folks have noted that it happens with the Beta 2 build, but the link above claims that it is gone from later builds. Sorry, wrong answer, kimo-sabe. Even on the RC build, this showed up. It has to do with how Visual Studio handles USER SETTINGS. Thanks to a comment in ScottH's blog, I found a command line switch (devenv...

Choice Quote:  Now that I have actually used XSL in a project I've come to this conclusion: XSL is the Devil. Go Check it Out. It's an interesting approach to wrapping [insert buzzword] functionality in an asp.net control. If you haven't read the first and second articles, you may want to read those first. The only drawback to this approach for me is the apparent lack of a commercial use license for the google maps api (somebody please prove me wrong on this). [ Currently Playing : Drive Slow (Feat. Paul Wall & - Kanye West -...

Just been shown something Microsoft are working on called "Spang" it's UNREAL. When "Spang" comes out you'll all be so much happier, wish I could share but it's all NDA.   [Via Plip's Weblog] What is Spang? It's going to revolutionize development as we know it. Keep a lookout for Spang.

posted @ Monday, October 03, 2005 5:40 PM | Feedback (1) | Filed Under [ .NET ]

Ha! Look at that! I totally called it. [ Currently Playing : All You Need - Sublime - Stand By Your Van - Live (2:44) ]

Check out this code project article with code for a Google Maps .NET control. very cool and handy stuff. and there are some demos here. [Via Tiernans Comms Closet] I read thru that, and it seems very useful to be able to manipulate things in codebehind like that. Once the lat/lon overlays are included, I may even check it out. In other mapping news, I was contacted recently by the mappoint webservice team b/c I haven't made any requests to the webservice for a while. I told them that the current webservice doesn't buy me a whole...

A few weeks ago I wanted to release an update to my own blogging engine and, because there was a minor data change I thought that it would be nice to export the data before running the update, change the files and then re-import it afterwards.  As I looked into this more I decided that I really should do it in a standards-compliant manner (if possible) and so then set out to: A) talk to people about it, B) rtfm some of the existing formats and C)...

This has probably been done a hundred times already, but I couldn't find one in the first few pages of google results, so I wrote my own in ~40 lines of C#:using System;using System.ComponentModel;using System.Drawing;using System.Drawing.Drawing2D;using System.Windows.Forms;namespace PostXING.Controls{ /// <summary> /// GradientPanel is just like a regular panel except it optionally /// shows a gradient. /// </summary> [ToolboxBitmap(typeof(Panel))] public class GradientPanel : Panel { /// <summary> /// Property GradientColor (Color) /// </summary> private Color _gradientColor; public Color GradientColor { get { return this._gradientColor;} set { this._gradientColor = value;} } /// <summary> /// Property Rotation (float) /// </summary> private float _rotation; public float Rotation { get { return this._rotation;} set { this._rotation = value;} } protected override void OnPaint(PaintEventArgs e) { ...

Earlier I said: call them "labels" or "tags" but give me a way to categorize my thoughts. Please. Thanks, Atom 1.0  [ Currently Playing : A Message - Coldplay - X&Y (04:45) ]

Darren's looking for ideas on how to migrate data from one blog engine to the next. This has been discussed before a lot, I'm sure, but it's not a bad conversation to have. So what's the answer? Sorry, I don't have that. I know that it would have been nice when developing PostXING to have an api that gives you more control or gives better querying ability, and I also know that none of the APIs that Darren talks about are it. For all of the metablog api's shortcomings, I find it at least decent enough to not have made a post...

I couldn't find a cut & dry solution to this (probably b/c it's too simple for anyone to think they would need an example) so here's how I got an xml file embedded as a resource in a vs2003 project written to the filesystem. First, you just add an xml file with some default information you want for it to your project and change its build action to Embedded Resource. Then, you find the name of the resource (it can be tricky if you have a few folders) by opening up ildasm and double clicking the MANIFEST node. Using that resource...

I'm seeing a little trend - I delete comment spam as soon as it gets to any of my weblogs, so I don't have any hard numbers - posts that I have written about Mike's ReverseDOS sure seem to be getting targeted by comment spammers. I don't see this in the blog that has ReverseDOS installed, but instead at the one hosted on weblogs.asp.net. What they don't know is that I have comment moderation turned on, so no comments make it thru without my say so. I wonder how many layers of defense will be required before I no longer have to...

If you are running your own asp.net blogging engine and you support comments/trackbacks/pingbacks, go get ReverseDOS. Right now. I'll wait. Back already? Great! Seriously, ever since installing ReverseDOS, I have yet to see one auto-generated comment, when I used to get about 50 a day. Worse on weekends. Here are a couple of lines that I added to the ruleset:<add type="post" pattern="poker" action="403" /> <add type="post" pattern="blackjack" action="403" /> Simple, right? It's usually the dead simple ideas that are the most elegant solutions in the end. Thanks, Mike. [ Currently Playing : Star Spangled Banner - Jimi Hendrix - (3:47) ]

posted @ Thursday, June 23, 2005 11:30 PM | Feedback (0) | Filed Under [ .NET ]

After another slew of referrer/comment spam that showed up in my blog this morning, I went ahead and downloaded Mike's ReverseDOS. I followed the steps outlined for setup, but it didn't quite work the way it was outlined at first - I got the dreaded "yellow screen of death". This was due to the entries that I had made in the web.config. So I looked at the entries that were already in there, and I noticed that some <section/> nodes were added to the <system.web/> node. Moving the default configuration from looking like this:<!-- copy and paste the following code --> <configSections> ...

Do you ever get an email that has some base64 gobbledegook in it? A lot of times, based on MIME information directly preceding this junk, it's actually an image that got converted to text but never converted back to an image (duh, right? Tell me something I don't know? Okay...)I got one of these earlier and decided to write a little utility to convert that string back into an image using the .net framework. It was pretty simple once I got the namespaces right:using System; using System.Drawing; using System.IO; using System.Collections; public class MyClass { public static void Main() { string base64 = @"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"; Bitmap map; using(MemoryStream stream = new...

posted @ Friday, May 27, 2005 8:49 PM | Feedback (1) | Filed Under [ .NET ]

Since there are probably going to be a lot of posts about all things Whidbey soon, as people get more and more chance to play with things, I've decided to throw in my two cents about a really cool piece of functionality that I recently used. ObjectDataSource - too cool, I've been waiting for something like this for a while. This is more my style than using stinkin' DataSets. You can see what I did at bluefenix.net . I built it based off of the Personal Site Starter Kit that comes with vwd on up, so there's still a lot of Lorem Ipsum...

Congrats, James! Always good to see someone you know catch a deal like this. Too bad there are no comments for me to tell him in his blog :P See for yourself: "Here we go!" on The CoverYourASP.NET Blog .

posted @ Friday, April 01, 2005 5:36 PM | Feedback (0) | Filed Under [ .NET ]

I took a chance and installed a CTP of Whidbey on my laptop. Thing is, I still use WebMatrix from time to time for POC stuff for v1.x of asp.net. Problem is, when you run the Cassini webserver from webmatrix, it picks up the latest version of the .netfx and will give you different errors based on which version is installed. To get around this and ensure that the WebServer.exe runs on version 1.1 of the .netfx, simply add a WebServer.exe.config file with the following contents:<configuration> <startup> <requiredRuntime version="v1.1.4322"/> </startup> </configuration> If you want to ensure WebMatrix runs on version 1.1 of the .netfx, you can...

posted @ Saturday, March 26, 2005 8:39 PM | Feedback (0) | Filed Under [ .NET ]

Although he only talked about high-level stuff (Exception Handling and Memory Management), I think Brad did a pretty good job. I stopped going to the Microsoft office out here because of all the 100 level classes, I couldn't justify taking time out of the trenches for learning stuff I already knew. But hearing the lead PM on the CLR team speak? It was time to attend my first Houston .NET UG meeting. To be fair, there was also the Hal-PC C# sig there, but I've never seen that room so packed. Overflow rooms had to be set up. Way to go,...

<snip>Q: You mean you didnt kill 200K people or change the tilt of the Earth's axis? a: not yet </snip>[Via brains-N-brawn.com] Classic. I rather enjoyed the article, and think that a lot of people are missing the point. Not that my opinion matters anyways, but I thought it was kind of a neat POC.

So earlier I said "This is gonna piss some people off..." about the EntLib, right? Well, straight from the developer's mouth: Scott Densmore The registration process is to help us better connect with you. I hope it doesn't detract you from downloading. I think you will love it.   Well, I hope I didn't come across as "I'm not going to download it", cuz I most definitely am. Matter of fact, I'm downloading now. I just thought it would be interesting to see who would say such classics as "The mothership...

Going to download the spankin new Enterprise Library, and before you can download you're presented with this: Enterprise Library Your registration information enables us to better provide you with the latest resources relevant to your needs, including pointers to service packs, security notices, training, trial versions of new products, conferences, new books, and more. Note that at any time you can manage all your Microsoft.com communication preferences from our Profile Center. Thank you for your interest in this download. Registration required for this download   ...

When I was working on the latest release of the BlogThisUsingPostXINGPlugin, I kept running into file access issues. The whole thing was an excersize in refactoring - well, really, the whole thing WAS a refactor, since the basic functionality already existed, but I was making additions in how things were going to work. First, I changed the XsltStream to return a FileStream or a ManifestResourceStream, based on the existence of a user-specific file: 1 Stream XsltStream 2 { 3 get 4 { 5 string filePath = Path.Combine(ConfigurationPath, this.BlogType.ToString() + ".xslt"); 6 if(File.Exists(filePath)){ 7 //read from...

Well, it looks like Darren decided to confuse the hell out of me and make his Project Distributor available for download at guess where? Project Distributor! Okay, maybe it's not that confusing (or maybe I just confuse too easily :) This is great news - ever since I've made PostXING available for download at Project Distributor I've had nothing but great things to say about the service...and now I can have it on a server all my own! Cheers, Darren, for coming up with a great idea and making it available to everyone. You rock. [ Currently Playing : Two Tabs of Mescaline - Glassjaw...

I feel like I've hit .net developer's gold. I was searching for a spell checking component and came across this site (with the help of Don Smith). Not only is there a spell checker component there (which looks pretty good at first glance) but there are a bunch of other useful tools ranging from a Windows API file search wrapper to web access for Visual SourceSafe and Draco.NET. Good stuff. P.S. I'm hoping to add spell checking and a couple of other items to PostXING. If you'd like to snag a copy, you can find the latest release here.

Well, kind of :) I have a collection that I want to access in C# with an indexer, the only problem is that the collection is written in VB.NET as part of a library which I need to consume and would be foolhardy to try and rewrite in C#. It's just a mixture of attributes and keywords - but gets me from having to call MyCollection.get_Item("key"); toMyCollection["key"]; Just a stylistic approach on my end to keep the readability of my C# consumer as high as possible. This is basically what I used:Imports System.Reflection ... <DefaultMember("Item")> _ Public Class MyCollection Inherits System.Collections.CollectionBase Public Sub Add(ByVal NewObj As MyClass) List.Add(NewObj) End Sub ... Default...

posted @ Friday, November 19, 2004 6:44 PM | Feedback (0) | Filed Under [ .NET ]

I was doing my early morning googling and came across this - a set of free icons in the WinXP custom format. Really nice if you want to add that touch of candy to your apps, be they windows or webforms. There are also a set of spheres there that have a slew of different colors...That along with the FireFox extension downTHEMall made for a great 5 minutes of getting some nice starter icon sets.

I just can't pimp Darren's new ProjectDistributor enough. Look at the ideas this guy comes up with. Every time I chat with him, something new is coming down the pike. Let me say, not just new, but innovative, fresh...sometimes so beautifully simple that I have to think "why didn't I think of that?". You know you're onto something when you make others say that. Anyways, Thanks Darren for giving me a little space to place my snippets and for coming up with a great idea that keeps getting better.

It has a white matte.

posted @ Friday, October 22, 2004 2:38 PM | Feedback (4) | Filed Under [ .NET ]

I've been doing a lot of that lately (embracing and extending). So I'm reading thru Mike's latest article, thinking how can I apply this to an application I'm currently developing? In the article, he mentions that Office 2003 uses both a deductive and inductive UI for various parts of the interface (see his article for a much better explanation than I could give you.) So I tried it out. I downloaded the code and applied something very similar to the Office example shown in the article using Tim Dawson's awesome Sandbar library. There was a problem, though. By virtue of a vertical scrollbar, enabled, disabled, visible,...

You can find them here or there. One of them was really just a VB.NET version of another article that I wrote a while back that was left in the comments by Robert Sindall. Hope someone finds them useful.

Okay, so I haven't posted for a while and you don't care. Established. But you've gotta check this out, for real. Francesco Sanfilippo has been putting in work on www.url123.com , an asp.net link shortening solution. Right, there are a lot of them out there, but this makes it so easy for me to shorten a url...I don't have to have the site open or even remember the name. How do I do this? Easy - bookmarklets. A bookmarklet is one of those things that is so simple, it's beautiful. Scenario: I'm chatting with someone on msn messenger, talking about NUnit. The nunit-gui...

posted @ Tuesday, August 17, 2004 5:21 PM | Feedback (0) | Filed Under [ .NET ]

CodeSmith r00l3z. I recently did my semi-annual "house cleaning", where instead of just getting rid of all the accumulated crap I've got on my dev box, I repave and start over. I did this with the idea that I wouldn't install anything without needing it first. Heh, maybe I can keep my start menu down to one column this time ;). So the need arises for CodeSmith - I need a custom collection, and I want to do it from VS.NET. Well, I head over to my \bin folder, and there's codesmith, waiting with a .bat file to re-register itself in VS.NET...

posted @ Tuesday, August 10, 2004 2:59 PM | Feedback (0) | Filed Under [ .NET ]

Earlier this year I started using NUnit to see what all the fuss was about. I started on a subset of an application that I'm working on, using it for the database interaction code. I figured that would be a good place to start, since I'm not sure how to test UI stuff, and these were the parts handed to me when the application was in spec stage. I took a pretty simplistic (and probably wrong by some accounts) approach - set up a database with the same structure as what would be used in the end (appended with NUnit to...

posted @ Thursday, June 24, 2004 9:20 PM | Feedback (0) | Filed Under [ .NET ]

I thought I linked to this before, but I guess I was wrong. Here's some google juice for those Office 2003 Faces.

posted @ Thursday, May 13, 2004 3:51 PM | Feedback (0) | Filed Under [ .NET ]

.NET Reflector 4.0.1.0 Click: Help | Check for Updates | Yes.

posted @ Tuesday, May 11, 2004 7:01 PM | Feedback (1) | Filed Under [ .NET ]

Okay, not everything, but at least www.weblogs.com and blo.gs. I already had some of the code in place, but then I came across an example by Charles Cook, mr. xml-rpc.net hisself, and decided to hack it a little bit. Pretty simple stuff, but this post will tell me if it works :) /me:crosses fingers update: So it looks like it "kinda" worked for weblogs.com - since my blog engine, .Text pings weblogs.com itself, I got a nice little message from weblogs.com saying I should get out more and enjoy life for pinging twice in a row. Well, my friends, it's raining today. blo.gs came back...

 <mumble>viral marketing...</mumble> :) FREE XDN Professional for .NET Bloggers during May 2004Mike Schinkel, president of Xtras.Net, made an offer on his personal blog of a free XDN Professional membership (http://www.xtras.net/xdn) during the month of May 2004 for anyone that blogs about .NET frequently. If you are a .NET blogger, see Mike's post for how to get your free XDN membership.

posted @ Friday, April 30, 2004 6:30 PM | Feedback (0) | Filed Under [ .NET ]