Development

Banishing Shadows in eConnect

While I prefer working through GP Web Services, sometimes the functionality you want/need simply isn’t there. Many people drop from Web Services directly to table access, but I prefer seeing if I can’t get what I need through eConnect instead. Generally speaking, I can. Unfortunately, the eConnect SDK documentation is sparse and only really useful for simple cases. Raw schema files and cryptic explanations are par for the course and this can be frustrating. Pulling a Customer Card So, I’m working on an application that requires that I take a Universal Locator Id and walk that back to the customer I need to...

posted @ Thursday, August 19, 2010 6:05 PM | Feedback (0)

Multi-blog Obsession

The multi-blog data provider for BlogEngine.Net has been taking up a lot of my brain space lately—to the point that I’m able to announce that it is installed and working “in the wild” on a hosted site (though not in anything like a heavy-load situation). I now have a copy of both my dev site and my personal site up and running from the same directory (and the same database). Frankly, I didn’t think it’d be as easy as it was. This success prompted me to create a 2.0 release (that is now up on the CodePlex site). Getting Static My main...

posted @ Thursday, April 02, 2009 5:26 PM | Feedback (17)

Multiple Blog Data

So I have a working LINQ to SQL provider for BlogEngine.Net. Now what? Given a little spare time, how about I see if I can’t use it to support running multiple blogs from the same installation? More importantly, see if I can use it to support running multiple blogs from the same database? Doing just that turns out not to be all that difficult. Scheming The current architecture for BlogEngine.Net’s data already has a bit more cohesion than it technically needs. All the objects have their own individual Ids and those Ids are used to relate...

posted @ Friday, March 27, 2009 5:00 PM | Feedback (0)

Gratuitous Use of Linq

Every now and then I get to doing something just because... well, because I can. These projects usually atrophy before becoming anything usable and serve more as a way to explore and practice than anything else. Usually. My latest tangent actually got to a state where I can let it loose in the wild and it’ll probably actual do what it is supposed to do. BlogEngine.Net Let me be perfectly clear up front: I don’t actually use BlogEngine.Net at all. Anywhere. I’m still a Subtext guy when it comes to blogging software. BlogEngine.Net still lacks critical features and that prevents me...

posted @ Wednesday, March 04, 2009 1:11 PM | Feedback (7)

So You Think You're An Admin?

I had an interesting problem crop up trying to run my own application this week. We have a routine that uses an excel spreadsheet to import orders into Dynamics GP that includes some twists that aren’t handled well by Integration Manager. Since the application runs from the network (using ClickOnce) and because these orders can be substantial and represent a commitment of corporate resources, we want some control over who can run them. Specifically, we use Active Directory group membership with hard-coded/defined groups. One of the groups I want to allow is Domain Admins. And yes, this is...

posted @ Friday, February 13, 2009 1:56 PM | Feedback (3)

Professional Values

One of the things I am seeing less of lately is the understanding that reasonable people can and will disagree with one another—without either of them being any the less reasonable or intelligent for doing so. It seems to me that people become so invested with the “rightness” of their ideas that they deny the possibility that those who disagree with them may be equally intelligent and well-informed. You see it a lot in politics, but I think that this attitude has crept into development discussions as well. I saw a manifestation of this in action after a...

posted @ Friday, February 06, 2009 7:17 PM | Feedback (5)

Appreciating Alt.Net

I’m on record as dissenting from some of the planks of the Alt.Net bandwagon. I question design for testability and have extended that to questioning what I consider to be the over-use of Dependency Injection (though I’ve also talked about using it successfully in a project that I believe warranted its use). Further, in my last post, I asked if the Alt.Net folks couldn’t expand their treatments of design principles to include contra-indications or fault points. I also decried those who actively stifle alternative viewpoints, though I left it vague about who I think might do so. Given...

posted @ Wednesday, January 21, 2009 5:38 PM | Feedback (0)

Professional Development

Many of the interesting .Net bloggers are part of the Alt.Net crowd; evangelizing Dependency Injection, Design for Testability, Test Driven Development, SOLID design and other development practices that they find useful in their work. It doesn’t take long reading these blogs to pick up on what looks like an unforgiving attitude towards those who don’t use the latest acronyms in their software development. This acrimony is unfortunate because most often what is at the heart of those who question the standard Alt.Net toolset isn’t so much principle as it is context. A Fundamental Assumption Unfortunately, discussing...

posted @ Wednesday, January 14, 2009 6:21 PM | Feedback (26)

I'm a Lumberjack

And I’m okay. Indeed, last week saw a payoff for one of those hygiene things you do because you know that you “should”. A Logging Story Allow me to share what happened (feel free to skip this section). We receive orders from a number of different sources. In addition to EDI, we have spreadsheets, flat-files, and we even originate a few ourselves under Vendor Managed Inventory (VMI) agreements. One of the things we’ve done recently is create a single “process pipeline” such that once orders enter the pipeline, their processing from that point forward...

posted @ Wednesday, November 12, 2008 6:13 PM | Feedback (2)

Changing Table Names in an OR/M

I spent some quality time googling this and even went and asked the nascent Stack Overflow community and didn’t come up with a satisfactory answer. Being the intrepid sort, I opened up a test project and started poking around, compiling information from a number of sources and playing until I got something that worked. For your amusement and/or edification, I’ll document what I found. What I Want to Do The basic scenario is that many typical “commodity” web applications use databases to store their information. Since most web hosting services come with a single database but charge extra for additional databases,...

posted @ Wednesday, August 27, 2008 6:30 PM | Feedback (3)

Too Much Quality

The latest .Net Rocks podcast was from a panel at TechEd 2008 (that I sadly missed while there). Richard Campbell was the moderator and the topic was Software Quality. It was a good, if somewhat one-sided discussion and I recommend giving it a listen if you are so inclined. I particularly liked Billy Hollis' perspective on quality because it was a perspective that was grounded in both reality and sound business principles. He kept bringing up quality in terms of trade-offs and the others kept trying to waltz around those comments with a more absolutist, almost dogmatic, vision...

posted @ Thursday, July 10, 2008 7:20 PM | Feedback (24)

Putting Dependency Injection in its Place

You might say that I’ve had issues with Dependency Injection in the past. Well, with all the things I’ve learned not to do, I thought I’d go into a case where I’m considering dependency injection because it looks like it might be a good fit. Project Background Like many (most?) developers, I’ve been involved for many years in a particular vertical market. Like most, my involvement in that vertical market includes acquiring a substantial amount of very specific domain knowledge. I’m sometimes reluctant to admit it, but I spent a good decade and more of my career...

posted @ Thursday, June 12, 2008 6:25 PM | Feedback (3)

The Technical Manager

Aaron Lerch talks a bit about what it takes to be a technical manager. He enumerates five characteristics that he feels are essential for a technical manager (personally, I think that they are better classified as skills because they’re learnable and improvable). Here’s his five: Communication Technical Savvy Organizational Skills Priorities Humility It’s a good list for the good times, I think. As long as things run more or less smoothly, a manager with those traits will be in good...

posted @ Wednesday, April 23, 2008 6:08 PM | Feedback (0)

TDD Considered Harmful?

Man, I'm going to catch it for that title. Okay, let me get this out up front: this post is a hypothesis that I consider probable. That's why there's a question mark in the inflammatory title. Okay, asbestos underwear in place, let's continue. The Hypothesis Here's the logic flow for my hypothesis. Unit testing (and its bosom buddy automated testing) provides substantial benefits when used regularly. These benefits are well-understood. Ensuring or regularizing unit testing is the primary value proposition of Test-driven Development (TDD). A majority of vocal unit testing...

posted @ Friday, February 22, 2008 9:27 PM | Feedback (20)

Testy Development

One of the things that irks me when discussing certain technical topics is a tendency towards boosterism that can hinder, or even halt, deeper evaluation and discussion. Some topics, tools, or practices arrive with a divine imprimatur of authority that is hard to resist. Since I believe in being personally responsible for the software development I undertake, I sometimes find myself exploring murky territory that seems like it should be better mapped. The latest of these pre-hallowed principles is Test-driven Development. What comes across as a casual assumption of superiority gets my hackles up. I'll show what I mean using...

posted @ Thursday, February 21, 2008 9:15 PM | Feedback (6)

TDD or POUT

Because Unit Testing is the plain-Jane progenitor of Test Driven Development, it's kind of unfair that it doesn't have an acronym of its own. After all, it's hard to get programmer types to pay attention if they don't have some obscure jargon to bandy about. UT is too awkward, besides being a state abbreviation in the U.S., so for this post (and, if it catches on, future posts as well) I'll borrow from the telco folks and call unit testing Plain Old Unit Testing. The Best of all Possible Worlds Part of my problem with TDD has been that it claims...

posted @ Thursday, January 31, 2008 7:39 PM | Feedback (14)

Post Comments

The discussion spawned from my TDD post has been interesting to me. I've enjoyed the comments by Phil on his post and by him and others on my own. I'm particularly flattered that one of the authors of the original study dropped by. I disagree with some of his points, but this isn't where I want to address them. Instead, I want to examine the discussion itself because this is definitely something that we as a software development community could be better at. The Report First, I want to emphasize something that I could have made clearer in my original post....

posted @ Tuesday, January 29, 2008 4:56 PM | Feedback (0)

Getting at the Details

This should be pretty short, but I could not find this information anywhere so here's something that will save you hours of frustration if you ever run into the same situation. WCF Myopia Windows Communication Foundation is nice and all, but it suffers from a really large myopia: it tends to assume that you control both the service and the client. This is a stupid assumption, but try finding information for a situation where a service throws a FaultException and you want to get at the details of the exception and you'll see what I mean. The Setup Dynamics Great Plains Web Services...

posted @ Monday, January 28, 2008 4:53 PM | Feedback (3)

Get Down With My Bad Self

I thought I'd take a shot at introducing myself here as suggested by Jay and maybe dispel any pretense at being a thinker, heady or no. Frankly, it's probably long past time that I put together some kind of background post about myself if only to give those who disagree with me a way to discount my arguments out of hand. I suspect this'll be long as I do go on sometimes. You can skip to a recent, similar post if you only want the heart of my current situation. Street Cred I've been playing with computers in one way or another...

posted @ Thursday, January 10, 2008 7:00 PM | Feedback (2)

Like We Need More Acronyms

In one of his characteristically long essays, Bill Whittle expounded at length on the genius of John Boyd. The essay is political and not necessary to understand my point, so follow the link at your own risk. At any rate, Boyd proved a tactical theory of aerial combat by repeatedly winning a challenge to the best Air Force pilots in Nevada. The challenger would start by having Boyd in a perfect kill position at thirty thousand feet over the Nevada desert. Once the challenger yelled "Fight’s on!", Boyd had 40 seconds to reverse their positions. Winning that challenge repeatedly and consistently...

posted @ Friday, January 04, 2008 5:57 PM | Feedback (0)

My DI Failure

A couple of months ago, I mentioned a project I had coming up that might benefit from using Dependency Injection. The use-case on this is simple enough. We receive all of our EDI text files to a specific directory. Those files need to be processed into standard, internal temporary tables. Since each of our vendors uses the EDIFACT X12 fields differently, we need to customize parsing the files according to vendor. This is actually one of the larger projects I undertake at our small in-house development shop so it needs more up-front architecture than most and it seemed like a...

posted @ Monday, December 31, 2007 11:10 PM | Feedback (0)

Dependency Injection Objection

I’ve been putting off a follow-up on Dependency Injection for a couple of months now. The amount of heat I anticipate receiving is so disproportional to the probable light gained that it makes me hesitate. This weekend, I picked up on a stream of referrals from a post at InfoQ that mentions my Dependency Injection post (though not the follow-ups). It does a reasonable job of spelling out the conversation that happened, though I was feeling picked on until it brought in Eli Lopian’s contribution to the discussion. In whole, it’s a good summary. The real pile-on happens in...

posted @ Monday, December 10, 2007 10:46 PM | Feedback (9)

Printing Reporting Services 2005 Reports

About a year ago, I had the "opportunity" to automate batch printing for a couple of reports for my small company. Printing an invoice and a packing slip for 100+ orders at a time practically begs to be automated. Now, because we have specific needs with regards to the order they print in and what gets stapled to what else, this wasn’t something you could build into the reports themselves. Because the reports were originally programmed in Crystal Reports, I descended into the Crystal cesspit and just made it happen. If you’ve ever tried to automate report data access...

posted @ Friday, December 07, 2007 8:21 PM | Feedback (18)

An Altova Mapforce Hack

Anyone who has been forced to deal with EDI X12 documents knows that they are a royal pain. Each document has tons of fields—enough for any reasonable use for any reasonable organization. Having so many defined fields is actually its biggest liability. It means that every organization that uses EDI X12 pretty much has to decide what fields are significant for them. That means, for example, that an 850 document is functionally different for Nordstroms than it is for, say, Wal-Mart. As a result, there’s a significant market for people who can map EDI documents. Most of them are service...

posted @ Thursday, October 18, 2007 1:40 PM | Feedback (8)

Deciding When to Use DI

I’ve been musing about software architecture lately and trying to come up with a framework to help choose when to go with more as opposed to less—something that’ll help me feel less arbitrary in my choices. I mean, software design is something of a dark art, but how much of that is inherent and how much is simply being too lazy to formulate good internal guidelines? My latest ruminations have revolved specifically around Inversion of Control in general and Dependency Injection in specific. Here’s the thing: for the development I do right now at a small reading glasses company, I’m reluctant...

posted @ Tuesday, September 18, 2007 8:58 PM | Feedback (5)

Small Company Development

I typically work with small companies who need to customize software to fit their business practices. A lot of companies have critical competitive advantages embedded in the way that they do things and need to ensure that their software doesn’t get in their way. That typically means that I deal with specific vertical markets (either at the vendor or client level) and dance with 500lb. gorillas to make things work the way companies expect them to. It’s business programming in the trenches and can be nasty, brutish, and, well, not short so much as constrained. The Typical Battlefield This is the...

posted @ Thursday, September 06, 2007 9:54 PM | Feedback (2)

Architecting Architects

In many companies developer career progression is deceptively straight-forward; Jr. Programmer, Programmer, Sr. Programmer, Team Lead, Architect, Sr. Architect, Bob (Bob being the semi-mythical entity referred to in obscure comments, worshipped by now-extinct aboriginal tribes, and rumored to haunt the sub-sub-basement). The differentiation between these positions starts off with how much you know. A Sr. Programmer is a Jr. Programmer who knows his tools inside and out and can complete assigned tasks quickly and without a lot of supervision. Around Team Lead time, however, progression stops being about what you know and starts revolving around your ability to choose wisely...

posted @ Thursday, August 30, 2007 9:40 PM | Feedback (9)

Poking Bears

I can’t believe the potent response I’ve gotten on my posts about Dependency Injection. Ayende Rahien responded individually to each of my posts himself, which is more than a little bit intimidating all on its own and a couple of development heavyweights left comments directly. Nate describes Ayende’s posts as the cavalry arriving and links to a couple of other responses. All of these posts disagree with me, though a post by Aaron Jensen indicates that he’s at least willing to consider the possibilities. All of this should have been foreseeable, really, as soon as I decided to publicly post...

posted @ Monday, August 20, 2007 11:10 PM | Feedback (7)

Tilting at Windmills

I’ve been giving poor Nate Kohari a hard time over at Discord & Rhyme. He has been very patient in Defending Dependency Injection. His attitude stands in sharp contrast to Ayende Rahien's post today about testing Linq for SQL. Ayende’s snide "(Best Practices, anyone?)" is exactly the attitude I lamented in my original post on Dependency Injection when I said I do wish that people would admit that DI doesn’t have compelling applicability outside of Unit Testing, however. I’m reading articles and discussions lately that seem to take the superiority of DI for granted. And I’ve read mock object examples that...

posted @ Thursday, August 16, 2007 10:59 PM | Feedback (8)

Dependency Injection

Dependency Injection is a design pattern used to abstract a provider from the class using it. Specifically, the calling class assumes responsibility for managing the provider instead of the class being called. Data access is a classic example of a provider that can be injected into classes that use it. If you decide to implement the DI pattern in a data access project, the most common method of doing so is to add an interface parameter on the constructor of each class that needs data access. A C# Example A class that accesses data might look like this (if it were programmed...

posted @ Tuesday, August 07, 2007 11:08 PM | Feedback (6)

Creating a Domain Publisher Cert for a Small Internal Software Shop

The trend towards increasing security introduces a number of intricacies for medium-sized business software shops using Active Directory Domains. An internal domain with more than a dozen workstations can introduce issues that are old hat for larger shops, but way beyond anything a small business will have to deal with. I ran into one such issue recently when I decided it'd be a cool thing for one of my apps to actually run from the network. The Problem The first sign I had a problem was when a module that worked fine locally threw a "System.Security.SecurityException" when run from a network share....

posted @ Monday, December 04, 2006 11:33 PM | Feedback (0)