Thursday, June 28, 2007

I know better...

Earlier this year, I picked up a freelance project. From the description, I figured it would be an easy problem to solve and a quick build.

So, I made the decision to forgo a requirements document, and just jump right in and develop what I thought was wanted/needed.

I can't believe that even after 4.5 years of doing this type of stuff, I still do things that stupid on occasion.

I was at a meeting with the guy last week, and discovered that our fundamental visions for how the application was supposed to work where off from one another. Sure, on the generals of the application, it was fine, it wasn't until the details were reviewed that we realized that I wasn't creating the functionality in a manner that was just slightly... well, off.

So, now I'm in the process of generating an SRS, SDD and DBDD, mainly because I'm sick of the hassle of not knowing exactly what it is I'm supposed to be doing here. Not that that isn't anyone's fault but my own of course.

Wednesday, June 27, 2007

Google Docs

Well, I logged into Google Docs this morning (much as I do every morning, it's one of my STARTUP Tabs in Firefox) and got a nice surprise. A brand new layout for the file system.
Frankly, I like it a lot better than the old layout. I like the folders, and the "Outlook" style that it is using here. It's more user friendly, and more intuitive to use-after all it is the paradigm that is used by Windows File Explorer, Outlook, and Google's own GMail and Reader applications.

I for one will not miss the pull down menus that were up there, and am glad they've made these changes. Thanks, Google.

Monday, June 25, 2007

What happened to my gridview buttons?

Argh, I have a website I'm working on. The website is broken into functional components (such as a page to deal with courses and a page to deal with events and so on), and these pages deal with every aspect of those components (adding, editing, listing, etc).

Well since I needed to be able to jump from one component to the other, I used query string variables to control which page I was on.

Not a big deal, it's an old technique which works. I could have just as easily used POST commands, but frankly, this works better as those query string variables can be bookmarked by the user.

Well, for whatever reason, the click events for some LINKBUTTONS in my GRIDVIEW aren't working. I don't know why, there's no reason why they shouldn't. They just don't work. It annoys me to no end.

I have the buttons defined properly. I have the GRIDVIEW defined properly. I've even got the GRIDVIEW RowCommand event handler defined properly, but for whatever reason, the thing just doesn't want to work.

Time to go smack my head against the wall for a bit, I guess.

EDIT: I meant to update this the other day, but I finally figured out what it was. The PANEL which held the GridView had the EnabledViewState attribute set to False.

Wednesday, June 20, 2007

Okay, this is just silly....

We're developing an web-application. Not that bad, we have a set of originating requirements, and a number of other design documents. We're using an AGILE methodology because the client isn't entirely certain of just what type of functionality they want.

Strike 1.

Also, the client isn't sure what type of database backend they're going to use, but they think it's Oracle - but it MIGHT be SQL Server.

Strike 2.

And they don't know on which server they're going to deploy this thing. It could be a UNIX box, or it could be under IIS.

Strike 3.

Yes, I definitely feel like I've struck out with this project. Unclear requirements and then top that off with the fact that we might not be able to develop in our primary development environment.

I may have to learn RUBY or some other arcane language in order to translate all my .NET code into something that can run happily on a 'NIX box.

It just hurts my head. Yet, at the same time, they won't let me go ahead and just learn RUBY because it might still be deployed on an IIS box, so they don't want the overhead of me learning a new language.

It's at this point, when I have an aneurysm.

Oh well, I have a pretty new design now, so I think I'll go bang my head against the wall for a bit.

Monday, June 18, 2007

Sometimes, I'm too smart for my own good....

I have an application, and it's common practice to build our applications with external data layers, that implement an interface, utilizing common data types and interfaces to send data back and forth. One common one is the IDataReader.

Well, I have this web application that I built - the one running the Oracle database - and we kept getting either a TNS Listener error or Connection Timeout errors. Frankly, I'm of the opinion that they're the same error, it's just that some are getting reported out of the .NET native OracleClient classes (which I utilized) and some are getting reported out of Oracle's implementation of the same (which my co-worker utilized).

Anyways, we kept getting these errors, which resolved down to the connection pool was getting filled up with connections. Bad for business to say the least.

What it ended up being, was we had forgotten a parameter on the Command.ExecuteReader function.

Normally, you don't need to pass in any parameters to this function, as most people use it directly there in the code with the connection and command objects, so they can destroy them all at the same time.

The problem comes in with the fact that since we're passing the DataReader out of the method which generates it, so it can be used elsewhere, we can't close down or destroy the connection and command objects as that would destroy the DataReader as well.

Which is where that parameter comes in.

It's called the CommandBehavior enumeration, and it is used like this:

Function GetValue As Data.IDataReader
   Dim comm As New OracleClient.OracleConnection
   Dim conn As New OracleClient.OracleConnection
   ' Snip Connection/Command stuff

   comm.CommandText = "EXEC MyPackage.StoredProcedure"
   GetValue = comm.ExecuteReader(CommandBehavior.CloseConnection)
End Function
Really, quite a simple solution when I remember to add it in.

Anyways, the CommandBehavior enumeration has a couple different options, but as noted, the one we're interested in here, is the CloseConnection option. What this does is destroys the underlying connection and command objects of a DataReader when the DataReader itself is destroyed.

And since I added it into the ExecuteReader calls in my data retrieval functions, the connection pool isn't being filled up, so I'm not getting all those errors.

Friday, June 15, 2007

Oracle SQL Developer

A couple days ago I was lamenting the lack of a good visual tool to work in Oracle with.

After all, there's only so many times you can do something in Notepad++ before you're wanting to pull your hair out.

Anyways, a wonderful commenter (thanks again, Justin) stopped by, and pointed me towards Oracle's SQL Developer. It's a free tool provided by Oracle that does almost everything I wanted from such a tool (it might do everything, but I haven't found a database diagramming option-of course that could just be merely that I can't find it, after all I've only been playing with it for a little bit.

Thursday, June 14, 2007

Software Development Related Body of Knowledge Listing

The Real World Software Architecture blog has published a listing of software development related bodies of knowledge here.

It seems my list of things I need to read in the upcoming month or so, has just increased greatly.

Oracle Tools

When I work in Oracle the thing I miss the most are the tools provided by SQL Server.

In SQL Server 2000, they had Query Analyzer and the Management Console. From those two applications, I could control everything about SQL Server.

In 2005, they rolled all of that into a single application called Sql Server Management Studio, and additionally rolled a lot of the functionality into Visual Studio 2005 as well.

I love using those tools. They're visual, powerful and if I need to get into the nitty-gritty SQL, I can.

Why, oh why, can't Oracle have something like that? I''m sick of working in Notepad++ building all these scripts - which I'm not sure are going to run, and then going to Oracle SQL *Plus to run them, only to discover I have some typo somewhere in that mass of SQL code.

Oracle is a powerful system - it has a lot of good features. Yet how you work in it is definitely not one of them.

IMO, Oracle needs to provide a good, powerful, visual interface to their system. I don't want to have to do everything in Oracle through SQL, and to be honest, the web interface that is provided is not good enough. Not when it's compared to SQL Server's Admin Console.

Wednesday, June 13, 2007

The Portable Web-Development Toolkit

An interesting article stumbled across my RSS Reader entitled The Portable Web Development Toolkit.

Basically, it is a web development & testing environment that can fit on a thumb drive (with at least 512MB of room).

So, I downloaded bits and peices of it (XAMPP, the portable web server mainly) and stuck it on my thumbdrive and tried to use it at the house.

And failed. It wouldn't serve my pages.

A tad frustrated, I took it to work, and all it managed to do was screw around with my IIS and caused me to need to reboot my machine.

Even more frustrated, I realize that I'm going to have to figure out someway to do testing on my little PHP thing. So, I checked to see if my webserver (hosted by GoDaddy) still ran PHP. Happily it appeared to do so - at least until I tried to connect to a database. So now, I'm having to contact GoDaddy support and figure out if it's just an issue with the Windows hosting or if they've removed PHP from the windows hosting all together.

Lucky me.

Storyboarding A Website

Well, I get to play catch up in regards to some of the documentation for one of the projects I'm working on. Basically, the REQMP section never got storyboarded for the SDD replacement document for that section. So that means that I get to do so.

Ah, the joys of random paperwork.

It's a nice, well defined process, and all the data is on the testing website or in the database scripts which work with the UI so it's not like I have to hunt long and hard for the data, it's just a tedious cut-n-paste job.

But, we need all our documentation in order, now don't we.

Monday, June 11, 2007

I seem to gather things to do...

Well, I have managed to bring in a new project onto my plate. It's not something overly large, just a simple PHP application for a forums that I'm involved in to rate things that the forum users produce.

So, I get the joy of ramping back up on PHP & MySQL to build this thing.

Friday, June 8, 2007

I'm on a redesign kick.

One of the projects that I "inherited" back when my co-worker was on paternity leave is codenamed EPB.

This is the application which I built all the interfaces for, to allow for ease of use in switching controls back and forth.

Not that big of a deal.

At least until I started thinking about things. Specifically the fact that the prime client for this application may want to go to an ORACLE solution using Oracle Application Pages (or whatever their psuedo-webserver thing is called).

Now, EPB represents hundreds, if not thousands, of man hours of development, all of it in .NET. The design of the database, and how the application works is mine. I laid the framework for it all, and I love it. The newest thing of using interfaces for the controls allows an even easier time in regards of new content and maintenance for the system.

So, you can imagine my frustration at all of that code being effectively useless in the Oracle stuff. After all, there's not a 1-to-1 relationship between how Oracle produces HTML and how .NET does it, so all those server controls we've built will need to have something else done to them.

Well, the other night, I went to sleep considering these implications - in part thanks to a visit from one of the principals from the client organization - and the next day thought up a solution.

Javascript, DHTML, AJAX, JSON and web services.

The system currently posts back to the webserver and then builds the page in .NET and streams out HTML to the client. What the server controls are, are little bits and pieces of logic designed to facilitate that whole process, and group it into logical data/processing parts for our system.

Yet, there is nothing stating that the system MUST behave this way. Heck, there's nothing stating that we have to have those little bits and pieces of logic in our compiled .NET DLL.

My solution is to kill all the ASPX pages, and have all of the data processing in a web service. With AJAX, we can get the data that we currently use to determine which page is being displayed, and then with JavaScript/DHTML (specifically, using the Prototype JS library) we can build that page dynamically as needed. Javascript will be responsible for control creation and destruction and sending the user-entered data to the web service.

JSON would ease, the amount of data being sent, in addition to just plain being easier to use as a data transfer medium.

Additionally, because the data saving logic is all on the web server, as long as it continues to accept the same properties, and return the same data, then we can transfer that logic into any code that we wish (with only possible manipulations of the asynchronous data transfer code). The HTML page and its attending JavaScript which would be the meat of how the UI works would stay the same, regardless of any changes tot he business logic.

And as a third benefit to this, we can use this web service in other scenarios as well. Consider, the application is built as a web interface. Well, with the data flow being in a web service, building a windows forms UI which consumes that service in a manner similar to the web UI would be an easy task.

Now, all I have to do is tell the principals here at my company that I want to redesign how EPB works once again.

Wednesday, June 6, 2007

.NET Data Parameters

so, we're working on this application, and its backend is an Oracle database, as I've been harping on for a week or two now. Anyways, we're utilizing packages and parameter lists because, well, it's Oracle, and the folks that designed the thing want every single data access to be via a stored procedure.

I can live with it.

Well, I've been playing with things, and discovered a slight flaw in the .NET to Oracle relationship. If I pass an empty string or a string without any characters to it, I get an error back from Oracle.

So, basically, if I have a text field and I enter a just a space, and then trim the value from that text field as I set it as the value of the data parameter I will get a hard crash.

Same as if the user leaves a text field blank.

This is the exception being reported by .NET:

Parameter 'teacher': No size set for variable length data type: String.
Why it would not accept the empty string, or even assume a NULL value I'm not certain. So I tried to provide default values, and apparently the parameter is overriding the default value as I get the same error.

Anyways, what I'm having to do is add a space to the values from the text field and then trim that value before I use it in the stored procedure.

And it gets better.

I can't reassign a value to the parameters, because they're all IN parameters by default. I guess I could change them to IN/OUT but that's a lot of hassle. So I'm having to do the trims every time I use the variable in the stored procedure.

This is just so much easier in SQL Server...

Tuesday, June 5, 2007

I feel like an idiot thanks to Oracle Stored Procedure parameters

Yeah, Oracle's Stored Procedures parameter lists made me feel like an idiot.

Consider, I have a person table, and one of the fields is an email address, named "Email." Well, not thinking perfectly well, I labeled the parameter that is being passed in "email" as well.

Oracle was perfectly happy with that.

Anyways, this Stored Procedure is designed to handle Insert/Updates for this Person table. Well with my parameter list the INSERT happens just dandy. Without a problem. But my UPDATE refused to put the new value into the column.

Ultimately, I realized that the stored procedure was ignoring my parameter on the update in order to have the table update the column with the value that is currently in there. Why, oh why wouldn't Oracle say "Hey, stupid, I don't know which value you want me to use, you've given me to variables named the same thing!" But no, unless I was paying close attention (and by the time I did my own testing, I missed it, and it only showed up in peer testing) I would have missed the fact that that single field of the Course wasn't updating.

Ah, just another reason why I love SQL Server over Oracle.

Monday, June 4, 2007

Michigan Man Fined $400 for Using Coffee Shop’s Wi-Fi Network

I just read this article over at

And frankly, it kind of scares me. I've been known to pull out my laptop and jump onto any network that I can log into. My wife has done it. I'm planning on buying a network-aware PDA soon, and would probably do it with that as well.

After all, in my point of view, it someone provides free access to something like that, I would assume that it was available for use. If they didn't want me to use it, then they should restrict it. If they want me to pay for using it, then they should provide a gateway where I have to enter payment for a timeblock.

To me, this is no different from parking at night outside of a business and opening up a book to read by the light provided from the lamps that the store provides in the parking lot. I didn't pay for that light, it's not mine, but the store is providing it without restriction.

Now, I guess I need to hunt through Florida's laws to see if there's a similar law down here.

Friday, June 1, 2007

Google Gears

All I've got to say is "Oh my stars and garters..."

Here's TechCrunch's article on this stuff, and here's the Google website for it.

I'm excited about this, and can't wait to see how well it works. Of course, now the question is do I learn Silverlight first or this first. Ack, decisions, decisions....

Blog Widget by LinkWithin