Archives / 2005 / February
  • If you want help, start by helping yourself

    I got an IM today from a guy trying to get POP Forums to work. At first he was just asking if I had the Visual Studio solution file to give him. I insisted he tell me what the problem was first, and after some coaxing, I finally got him to tell me about the error he was getting. One class or another was defined in more than one place, so I knew he obviously had the compiled assembly in there along side of the one he was compiling. Rookie mistake, no big deal. Everyone made it at one time or another.

    Then nothing would happen, he'd only get empty UI. He again started asking me for a solution file. He was being persistant and kind of rude, but I told him to ditch the autoeventwireup="false" from the page, as I knew that was the problem. Again, rookie mistake, but also one mentioned in the readme.

    Next he started getting an "object reference not set to an instance..." or something like that. I told him to fire up the debugger and see where it was happening. In the back of my mind, I think I already knew it was a missing element in web.config, but again he wanted me to do the work for him, and running the debugger wasn't an option for him. Maybe he didn't know how. Beats me.

    Regardless, he then began telling me my install instructions suck and I have no pride in my product and whatever. What good is it if no one can use it, etc. I was more than a little taken aback, considering he got the code for free. I'll be the first to admit it's not something flawless, but a little basic ASP.NET knowledge should get you up and running pretty quickly. I get enough e-mail from people using it that thought install went pretty smooth, so I'm not inclined to think it's a lost cause.

    I politely told him that he had a funny way of asking for help and that I was done talking to him.

    As someone who has done a fair amount of training for other developers, even at the introductory level, I have a fair amount of patience for people who don't quite get it. Heck, that's why I wrote my book. However, the "teach a person to fish" metaphor certainly applies, and it's one I stick by. I've forged some really good relationships with people that want to learn and help themselves. I have literal tolerance for people that don't want to do the work though.

    Anyway, speaking of the book, it looks like it will start shipping in less than two weeks, ready to ship to distributors on or around March 3. I'm really excited, as it will provide some much needed motivation and confidence. Please buy it. Tell a friend. :)

  • still suX0rz teh big one!!!!11

    I did give them a chance and send them feedback, but the crack monkeys at The Weather Channel still haven't fixed their site. My local page 90% of the time has some kind of HTML problem that prevents most of the page from displaying, including the ever critical radar.

    The worst thing is that they have to be losing out on ad revenue, unless they don't actually have any way to audit what actually gets displayed. I'd be kind of irate if I was an advertiser.

    What weather site do you use? One of our local TV stations has a fairly useful site.

  • Successful tweaking

    Last night's tweak fest and refactoring yielded really significant results. As I mentioned, it was session capping ad delivery that was bringing me down, and I think I've resolved that issue. On my old cheap hardware I've been able to get an average of 1.5 million ad impressions per day under a simulated load. Disk isn't getting overwhelmed, CPU time is around 75%, and delivery is under 0.1 seconds. I could easily push it harder, probably to 2 million impressions per day.

    I wish I could get my hands on some real hardware to see how it would perform!

    I think there are a few more areas I can tweak. I'd like to get to 3 million impressions per day on my ghetto box.

  • Shameless plug: Looking for contract work

    If anyone out there is looking for someone to do short-term .NET contract work, please drop me a line via the contact link at left. I'm pretty flexible as long as I can work electronically and don't have to move anywhere!

    Jeff needs a little work to pay his taxes on time!

  • Performance tweaking is fun!

    CliqueSite.Ads is coming along, finally. My intent to date has just been to make it work and perform well enough to meet my needs. It does that no problem, but I'm ready to really beat on it and tweak it a bit.

    So far my biggest bottleneck is in checking for frequency and session capping. It drags down performance to about 20% of what it can do otherwise. I'm not surprised, really, because it's checking user data against the entire impression table. I'm not sure how I'm going to overcome that. I could do something in-memory for the session tracking, but then I couldn't use it in a farm. The overall frequency capping has to be in one place. Regardless, there's no reason in either case to have to do that count every time. I'll have to think about a faster way to profile users.

    I like tweaking stuff and even refactoring big parts of an app to work faster. That explains why I briefly got addicted to overclocking my computer (before I realized that I was already getting framerates higher than my monitor could display in Doom 3).

  • Google: Doing evil?

    There's a lot of noise over Google's new toolbar function that puts new links in pages for "relevant" information. While they (for the moment) indicate that it's mostly harmless in terms of what they want to link you to, it sure sounds like something that Microsoft caught a lot of crap for a few years ago. More to the point, as someone that makes 90% of his living from the sites he publishes, I'm not a big fan.

    My biggest issue is that I've worked hard to keep people visiting my site, and hopefully even clicking on ads now and then. I've done a pretty good job of cultivating an audience that delivers a lot of impressions considering the relatively small potential audience overall. I don't want people to have a reason to go elsewhere. (For the record, I also have alternate means of revenue, including premium/subscription content.)

    Of course this all comes to the age-old debate about who owns the bits after they come down the wire. I'm not naive enough to think that I should have full control of that content when it lands on the client, but I'm not going to side with the inevitable response from Google that will go something like, "It's good for our customers." (Where have we heard that before?)

    It will be interesting to see how this pans out in the court of public opinion.

  • How do I find the application path in an HttpModule timer?

    Here's a pickle (to me, anyway)... How do you determine an application's path from an HttpModule inside of a running timer? I tried the obvious by passing in the application context and looking it up from Request.ApplicationPath, but that works only when the app first starts (which makes sense since there is no request when the timer fires). Code looks something like this...

        public class Module : IHttpModule
            public void Init(HttpApplication application)
                timer = new Timer(new TimerCallback(this.myMethod),
                    application.Context, TimeSpan.Zero, new TimeSpan(0, 15, 0));

            static Timer timer;

            private void myMethod(object sender)
                // this works the first time, but not on subsequent calls
                string path = ((HttpContext)sender).Request.ApplicationPath;

            public void Dispose()

  • XML in .NET is not that scary

    I have to admit... I don't use XML that often in anything I do. I mean, I use Web services frequently, but you don't need anything more than a fundamental understanding of XML to use them (that and an understanding about efficiency in the resulting SOAP messages).

    But when I do have a need to use XML for something, whether it be writing or reading an RSS feed or making some little widget to write and read configuration files, it never ceases to amaze me how easy it is. I think it's one of those things for Web developers that, if the practical example is there, would be learned right off the bat. I had been using .NET (ASP.NET, specifically) for more than a year before I had any reason to think about XML in .NET.

    Thinking back to the various books I was reading at the time, honestly, I skipped over most of the XML chapters. Sorry authors... you just didn't give any compelling reasons to read them. Hopefully authors of future beginning ASP.NET books (or new editions) will come up with more practical applications to encourage n00bz to dive in and use this stuff. It's useful for so many things.

  • Introducing CliqueSite.Ads

    I mentioned that I was building some ad serving software, and I think I'm ready to start getting it out there. CliqueSite.Ads is nearly in good enough shape to put it in the hands of some people that are willing to test it. If you're interested, please drop a comment here or e-mail. The best I can really do is give you a free license when it's done.

    I'm not yet sure how I'll price it and license it. I want it to be affordable because this stuff isn't really brain surgery, it's just time consuming to build. I will say that other similar products (those based on .NET, anyway) are ridiculously over-priced.

    CliqueSite.Ads can serve most ad formats that I can think of. It will do any size, pop-ups, rich HTML, etc. It does frequency and session capping. It aggregates data so you don't end up doing massive counts for every little report. The only thing I haven't added that might be useful is day/time blocking to restrict ads to certain times.

    Like I said, if you're game, drop me a line! I hope to get something out by the end of the weekend.

  • Props to a useful PHP application

    I've blogged about good ASP.NET apps before, but I wanted to point out one written in PHP that I like. This one is for the Ohio Valley Region of USA Volleyball, the region that I coach in.

    The region is the largest of any of the regions, with around 14,000 members. The regions (and USAV) is the governing body for junior Olympic volleyball, and the girls program makes up the largest portion of the membership. It's the girls juniors section of the site that I use the most. In addition to being a great resource for the bookkeeping of the giant membership pool, the app is also used to schedule tournaments and officials, register teams, show real-time results and rankings, etc. Like any good data-driven app, everything is cross-referenced.

    For example, my team is listed here. It shows my roster and our registration numbers. It also shows the tournaments that we're registered for. You can see what the current rank is for your team in your division. That in turn links to tournament results listed by team (we don't have our first tourney results posted yet). You can also shop for tournaments and check an event page to get directions and other info, as well as see which teams you'll play. You can even e-mail club directors and coaches associated with a particular event.

    It's not perfect, of course. There are some slow pages here and there, but considering that the whole thing is run by a volunteer, it's good stuff. The other real issue is that it's hard to get people trained to use it correctly. For example, there are only two tournaments listed on my team page. We're registered in more tournaments, but the tournament directors don't have us listed yet with our registration numbers, and therefore they don't show up. We used to have a lot of issues with results getting posted quickly for the same reason. Still, it's getting better, and it's easily the best site of any of the regions.

  • Looking for more examples of custom config sections in .NET v2.0

    As the title suggests, I'm looking for some more detailed articles on how to programmatically mess with a custom configuration section in v2.0. I already get how to derive from ConfigurationSection to make various attributes in the section's opening tag, but it's not clear to me if there's an easy way to put elements inside that section (like add, remove, vegetarian, naughtyWords, etc.).

    Can anyone point me in the right direction? Unfortunately the current docs still don't have a code sample.

  • What's up with POP Forums v8?

    I had really hoped to have the base class library for PF v8 finished by now, but alas, it has taken a back seat to other stuff. I had to get my ad serving software more in order to setup some campaigns I sold, but the good news is that the "distraction" may actually lead to software you can buy. It's a lot cooler than I thought it would be.

    The original plan was to get something quasi-functional out by the time Whidbey beta 2 was out, but I don't think that's going to happen. I'm not content with the way things are in terms of features and architecture. I don't want to just hash out a Whidbey-ized v7.x, so I'll take some time with it. Perhaps I can get it done in time for the RTM.

    Someone asked why I don't just open it up as a collaborative effort. There are two reasons. First is that the forum continues to be my lab and my education. This thing has been with me now in one form or another for six years. The second thing is that it must meet my needs first. It currently serves as the basis for nearly all of my sites and various projects I've worked on in the last few years.

  • No go on second book proposal

    I got word from the publisher of my first book that they're not interested in the proposal for my second. That's a real bummer. They say it wouldn't stand out enough, despite the fact that it had an endorsement from someone inside of Microsoft.

    I partly think that maybe the marketing folks just aren't in touch enough to understand why they're wrong. That's not so much their fault as much as it is mine for not pitching the concept in terms they would understand. The book is essentially an end-to-end case study book that follows the development of a product from idea to publication, including requirements, design, how to do test-driven development and solutions to at least a half-dozen problems that you encounter in practically every app.

    Oh well... I'll keep pitching to other publishers and she what happens. One way or another, I'm going to get it "out there" even if I have to publish it myself. It's a natural next step to my first book.

  • I don't like being tested

    I talked to a developer today that was checking me out for a recruiter. Unfortunately, he was one of these jerks more interested in trying to establish his superiority than finding out what I can do. Don't quiz me about some obscure design pattern that you read about in some book. I'm not impressed.

    I'm a problem solver, not an academic. I make things work, and acquire knowledge as it's required of me. That's how I roll, and so far it has served me pretty well.

    After encounters like that, I don't think I can go back to cubicle hell.

  • MSN Search is good for everyone

    With the MSN Search service officially going live, I think it's a great thing. I love Google, and they're good at what they do, but they're far from perfect. I'm sure Microsoft is far from perfect as well, but the point is that having a little competition should light a fire under their collective asses to do it better. Who will win? Who cares? If it leads to better search I don't care.

    I mentioned before that I'm conditionally more fond of MSN Search at the moment because three of my sites are top-four in the listings for their primary search terms. A number 1, 2 and 4. I can't complain about that!

  • I'm done! The dead trees are six weeks away.

    I signed-off on the last proofs from my book today, er, yesterday. I'm done! The book will be in my sweaty little hands in about six weeks or so. There will be a party, and oh yes, it will be good. I'm finally feeling accomplished.

    Even though the book has acknowledgements, I'd like to point out here in the community that Brian Goldfarb, the product manager in the Web Platform and Tools group, is the man. He was my connection to Microsoft while writing, and he kept me in the loop on changes despite what I can only assume is a ridiculous schedule. People like him are the reason that we have such cool toys to play with for a living.

    On to the next thing... I wish a publisher would hurry up and pick-up the proposal for my next book. Must strike while the iron is hot and I'm still motivated enough to write another one.