Thursday, 28 July 2005

What's your flavour, Internal or External, Rock Star or ordinary Joe

Caught this intersting discussion that started with Joels post about Hitting the High Notes. This was followed up with a tale from "someone with experience" by Scott in his post. Quite interesting reading with valid points made on both sides, and as he has a tendency to do on occasions, Joel has ruffled a few feathers.

One rather interesting paragraph that caught my eye,

"Sadly, this doesn't really apply in non-product software development. Internal, in-house software is rarely important enough to justify hiring rock stars. Nobody hires Dolly Parton to sing at weddings. That's why the most satisfying careers, if you're a software developer, are at actual software companies, not doing IT for some bank."

Sorry Joel, but I think this is a pretty broad assumption on your part. Personally, having worked at a software company and a bank, I can say that I found it much more satisfying doing development work at the bank. We had hardware that was mirrored in each environment from Production, Testing, Quality Assuance and Development. No worrying about performance/setup issues in each of the environments. What worked in development, was pretty much guaranteed to work in each of the other environments. If we required additional development tools to achieve a solution, they were provided without too much fuss.

We also had quite a bit more stick to push back against the business analysts when they suggested some sort of screwy work-around. This is something that doesn't happen enough in my current role. Far too often we are forced into providing adhoc workarounds to allow the business to continue make profit. The assumption on the part of the business is that if it works then it doesn't matter how badly it's coded, or maintained (if it's maintained at all), or how good it looks. The important part for the business is that it works.

Monday, 25 July 2005

The more things change the more they stay the same

Caught quite a lot of the cricket over the weekend. We've got Foxtel pay TV so I didn't have to put up with some silly bike race ( congrats to Lance Armstrong anyway). Having watched the match and read all the news articles I think this one quote nails how England performed "England have got a new cast and a new spirit, but the script does not seem have changed much."

Roll on test number two at Edgbaston which starts on the 4th of August. The last Ashes test played at this ground, Warne took 8 wickets for the match, and we were treated to centuries from Steve Waugh, Damien Martyn and Adam Gilchrist. Australia ended up winning by an innings and 118 runs.

AFL Round 17 Results

Picked 5 for the weekend, missing on Cats, Blues and the Eagles.Thought the blue boys had a chance to start back on their winning ways on the weekend but it was not to be. On current form it definitely looks as though we'll remain on the bottom of the ladder :(

Friday, 22 July 2005

AFL Round 17 Tips

MatchMy TipSpreadsheet Tip
Saints v MagpiesSaintsSaints
Bulldogs v CatsCatsCats
Hawks v BluesBluesHawks
Lions v BombersLionsLions
Power v TigersPowerPower
Swans v EaglesEaglesEagles
Kangaroos v CrowsCrowsKangaroos
Dockers v DemonsDockersDemons

Few different this week, I've gotta start pulling some roughies to climb the ladder a bit more.

The Secunia Weekly Scoreboard

In case anyone was missing this, here is the Secunia Weekly Advisory Summary
2005-07-14 - 2005-07-21

This week : 58 advisories

Windows : 9 Vulnerabilities
Unix/Linux : 32 Vulnerabilities
Other : 2 Vulnerabilities
Cross Platform : 15 Vulnerabilities

Oh what a night ...

As I nestled down on the couch and prepared myself for an evenings cricket viewing there was no way I, or probably anyone else for that matter, could have invisaged the drama that unfolded.

After watching the Aussie team smack England around the park, but in the process play a number of reckless strokes that lead them to be dismissed for a paltry 190 runs. It was entertaining cricket runs coming at a brisk one-day pace of 4.7 runs per over (usual scoring rate is 3 or less), and 10 wickets fell. England would have been feeling very pleased with themselves until McGrath bowled the first ball after the tea break. The metronome was at his best, and Englands top order were sadly lacking.

All in all a thoroughly entertaining day with 282 runs that were scored, at a fair clip in Australias innings, and 17 wickets falling for the day. Who said test cricket is boring??

Scorecard & Bulletin

Thursday, 21 July 2005

Shiny new monitor

The 19" LCD monitor I ordered on Tuesday has arrived :D

To give you idea of the change from my old Compaq 21" CRT monitor, the black squares at the bottom are satellite speakers that used to have sit at the back almost behind the old monitor because there wasn't room beside or in front.

As you can see heaps of extra space surrounding the screen now. To top it all off I'm still running 1600x1200 resolution, but at 180hz !! Talk about a crystal clear piccy :)

Personality and individuality

Check your Personality and individuality

Your answers suggest you are a Resolver

The four aspects that make up this personality type are:

Spontaneous, Facts, Heads and Introvert

Summary of Resolvers

  • Good at getting to the heart of a problem and quickly finding a solution
  • Make rational decisions using the facts available
  • Think of themselves as understanding, stable and easy-going
  • May focus on short-term results and lose sight of the big picture

Tuesday, 19 July 2005

Really portable DTS packages - Pt 2

Following on from my previous post, Really portable DTS packages, this is where we start to get into the inner workings of the template package.

First let me briefly summarise the approach that is taken.

To make things as dynamic as possible, and require a fairly low level of technical expertise for any migration, I the store most of the global variables required by a package in a database table. The location and security of this table I'll leave to your own implementation, but I favour having a secure central storage location that the other servers read from.

Each package also contains a static set of seven global variables that are used in retrieving the global variables from the table. These variables are used for items like a server name, database name, userid, password and a flag to indicate a trusted connection. The values for these global variables are set by passing them in on the command line using the /A parameter.

The first step in the package uses the passed details to setup a specific connection in the package to connect to the specified database. I could have used another Dynamic Properties task here, but I wanted to incorporate the functionality of prompting the user if the package is run without passing in the parameters. The next step executes an SQL statement to retrieve all the global variables necessary for package execution using the Package GUID. the result of the SQL statement is stored in a global variable as a Rowset.

The third step processes the Rowset object and dynamically creates all the global variables. The fourth step is simply a Dynamic Properties task that is used to dynamically assign all the necessary properties like file destinations, server and database names. The last step in the template package is executed at the end of the workflow and clears all the connection setting and variables that were created at runtime. This isn't really necessary as the package doesn't save those details between executions anyway, but it kept the security and compliance guys happy.

As we're passing in the server name at the start, there's no need to worrying about instances, changing server names and the like. When the package is ported to a different environment, the only changes you need to make are in the table. No DTS editing involved.

The structure of the table I'm using to store the global variables looks like this,

CREATE TABLE [dbo].[tblDTSPkgVariables] (
[RecID] [int] IDENTITY (1, 1) NOT NULL , -- allows easy record management in web front-end
[PkgName] [varchar] (128) NOT NULL , -- much easier to read in front-end
[PkgID] [uniqueidentifier] NOT NULL , -- the key to all the variables
[GV_Name] [varchar] (30) NOT NULL , -- duh, the name of course
[GV_Type] [varchar] (30) NULL , -- data type of the variable
[GV_Value] [varchar] (1000) NULL , -- the actual value to assign

Here's the script behind the first ActiveXScript task. Now I'm no gun programmer, so don't look at the methods/syntax I use as best practices. If you've got suggestions of how my script could be better, let me know.

Option Explicit
Function Main() Dim oConn ' DTS connection Object
Dim iErrNum ' error number
Dim sErrDesc ' error description
Dim sPkgName
 ' capture the package ID and name
DTSGlobalVariables("CON_PKGID").Value = DTSGlobalVariables.Parent.PackageID
sPkgName = DTSGlobalVariables.Parent.Name
 If UCase(DTSGlobalVariables("CON_SERVER").Value) = "EMPTY" Then
iErrNum = GetSetting(sPkgName)
End If

If iErrNum = 0 Then ' open object referring to VariableStorage connection
Set oConn = DTSGlobalVariables.Parent.Connections("GV_Store")

On Error Resume Next

oConn.Datasource = DTSGlobalVariables("CON_SERVER").Value
oConn.Catalog = DTSGlobalVariables("CON_DATABASE").Value
oConn.UseTrustedConnection = CBool(DTSGlobalVariables("CON_TRUSTED").Value)
If CBool(DTSGlobalVariables("CON_TRUSTED").Value) = True Then
oConn.UserID = ""
oConn.Password = ""
oConn.UserID = DTSGlobalVariables("CON_USERID").Value
If IsNull(DTSGlobalVariables("CON_PASSWORD").Value) or (DTSGlobalVariables("CON_PASSWORD").Value = "") Then
oConn.Password = ""
oConn.Password = DTSGlobalVariables("CON_PASSWORD").Value
End If
End if

iErrNum = Err.number
sErrDesc = Err.Description
On Error Goto 0 Set oConn = Nothing
End If If iErrNum = 0 Then
' signal success
Main = DTSTaskExecResult_Success Else
' log failure details
On Error Resume Next
DTSPackageLog.WriteTaskRecord iErrNum, sErrDesc
On Error Goto 0 ' signal failure
Main = DTSTaskExecResult_Failure End If
End Function
Function GetSetting(sPkgName) Dim sMsg ' message string
Dim sTitle ' message box title
Dim sInput ' input value
Dim iErrNum iErrNum = 0 sTitle = sPkgName & " - Server Name"
sMsg = "Enter name of server holding Global Variable List, or CANCEL to exit."
sInput = GetString(sMsg, sTitle, DTSGlobalVariables("CON_SERVER").Value)
If UCase(sInput) <> "CANCEL" Then
DTSGlobalVariables("CON_SERVER").Value = sInput
DTSGlobalVariables("CON_SERVER").Value = "Empty"
iErrNum = vbObjectError + 1
End If
If iErrNum = 0 Then
sTitle = sPkgName & " - Database Name"
sMsg = "Enter name of Database holding Global Variable List, or CANCEL to exit."
sInput = GetString(sMsg, sTitle, DTSGlobalVariables("CON_DATABASE").Value)
If UCase(sInput) <> "CANCEL" Then
DTSGlobalVariables("CON_DATABASE").Value = sInput
DTSGlobalVariables("CON_DATABASE").Value = "Empty"
iErrNum = vbObjectError + 1
End If
End If
If iErrNum = 0 Then
sTitle = sPkgName & " - Security Mode"
sMsg = "Enter security mode, 1 = Windows Trusted, 0 = SQL Security, or CANCEL to exit."
sInput = GetInt(sMsg, sTitle,DTSGlobalVariables("CON_TRUSTED").Value)
If CInt(sInput) = 1 Then
' using Windows security so set Trusted to True
DTSGlobalVariables("CON_TRUSTED").Value = "True"
ElseIf CInt(sInput) = 0 Then
' using SQL security so set Trusted to False and prompt for userid and password
DTSGlobalVariables("CON_TRUSTED").Value = "False"

sTitle = sPkgName & " - Username"
sMsg = "Enter Username, or CANCEL to exit."
sInput = GetString(sMsg, sTitle, DTSGlobalVariables("CON_USERID").Value)
If UCase(sInput) <> "CANCEL" Then
DTSGlobalVariables("CON_USERID").Value = sInput
DTSGlobalVariables("CON_USERID").Value = "Empty"
iErrNum = vbObjectError + 1
End If

sTitle = sPkgName & " - Password"
sMsg = "Enter Password, or CANCEL to exit."
sInput = GetString(sMsg, sTitle, DTSGlobalVariables("CON_PASSWORD").Value)
If UCase(sInput) <> "CANCEL" Then
DTSGlobalVariables("CON_PASSWORD").Value = sInput
DTSGlobalVariables("CON_PASSWORD").Value = "Empty"
iErrNum = vbObjectError + 1
End If
DTSGlobalVariables("CON_TRUSTED").Value = "Empty"
iErrNum = vbObjectError + 1
End If
End If
GetSetting = iErrNum
End Function
Function GetString(sMsg, sTitle, sValue) Dim sInput
Dim sErrMsg

sInput = ""
sErrMsg = "" sInput = InputBox(sMsg, sTitle, sValue)
While (IsNull(sInput) Or IsEmpty(sInput) Or IsNumeric(sInput) Or (UCase(sInput) = "EMPTY"))
sErrMsg = "Previous entry is Invalid !!! Please try again" & vbCrLf & vbCrLf & sMsg
sInput = InputBox(sErrMsg, sTitle, sValue)
GetString = sInput
End Function
Function GetInt(sMsg, sTitle, sValue) Dim sInput
Dim sErrMsg

sInput = ""
sErrMsg = "" sInput = InputBox(sMsg, sTitle, sValue)
If (IsNumeric(sInput) = False) Then sInput = 2
If (UCase(sInput) = "CANCEL") Then sInput = -1
While ((CInt(sInput) < -1) Or (CInt(sInput) > 1))
sErrMsg = "Previous entry is Invalid !!! Please try again" & vbCrLf & vbCrLf & sMsg
sInput = InputBox(sMsg, sTitle, sValue)
If (IsNumeric(sInput) = False) Then sInput = 2
If (UCase(sInput) = "CANCEL") Then sInput = -1
GetInt = sInput
End Function

Harry Potter and #$@!*! booksellers

Much like Mitch Denny and Greg Low, I could also have read the latest Harry Potter book by now.

The problem is that to avoid missing out I had pre-booked a copy of the book. Unfortunately, the store failed to point out that "pre-booking" a copy didn't necessarily guarantee that a copy would be available when it was released.

To date the store still doesn't have my "booked" copy available. They were however able to sell hundreds to the general public that hadn't booked a copy. Two of my friends are gloating over that fact that they brought the book from the same store without pre-booking! If I was prepared to forfeit my booking fee I'd cancel my booking and buy it over the counter like everyone else.

Big deals means big purchases

It's strange what huge discounts can do for a customers purchasing plans.

I wasn't planning to buy a large Plasma or LCD TV and I already have a large 21" Compaq CRT monitor for the computer. Thanks to a great deal (almost 50% off) through work we're lashing out and buying a LCD TV for the lounge and a 19" UltraSharpTM LCD Monitor for the computer.

New toys ... and it's not even Christmas ....

Good old TV

Caught Legends - The Best of Bert Newton on TV last night and laughed myself silly for about an hour. There was alot of old black & white footage from some of Bert's earlier days. My wife migrated out from England in the late 80's and I found myself reliving some of the great old shows that were on back in the "good old days".

Stuff like, In Melbourne Tonight and The Graham Kennedy Show where Bert and Graham Kennedy really made names for themselves.

Then there was "The Don Lane Show" where you never knew quite what Bert would get up to. The staple diet for a Saturday (first in the the morning, then when they switched to the evening) Hey Hey Its Saturday.

As I was reminiscing it came to me that all of these great TV shows were on Channel 9, or GTV 9 as it was back then. It bugged me like crazy that I couldn't remember a regular show on any of the other TV channels during that period. There was always Aussie Rules football on Channel 7 (HSV 7) and Countdown on ABC, but there doesn't seem to be anything else that sticks out.

Maybe this will help Australian TV Shows A to Z

Monday, 18 July 2005

Really portable DTS packages

Ok, I've been asked many a time how I setup DTS pacakges to make them portable. There's been many solutions thrown around the internet, but personally, I don't think any of them making DTS packages really portable. This fine article by Shane Dovers gives a few guidelines, but doesn't show you how it all hangs together. And this article by Kevin Feit sort of goes half way but leaves a lot to be desired in a real world scenario.

My solution to the problem of easily moving DTS packages from environment to environment is based mainly on this Microsoft Best Practices document. Don't be frightened off by the fact that the title says "for Business Intelligence Solutions", even if you are simply loading data into SQL Server, there are a number of DTS gems in this document.

I'm not going to bore you all to death with the details in one huge long post ( I'd have to think up another topic then wouldn't I ) for now. Let me me present the layout of the template package used when creating new packages. Over the next few posts I'll go through the tasks and scripts in the package.

Friday, 15 July 2005

The Secunia Weekly Scoreboard

The Secunia Weekly Advisory Summary
2005-07-07 - 2005-07-14
This week : 87 advisories

Windows : 11 Vulnerabilities
Unix/Linux : 58 Vulnerabilities
Other : 2 Vulnerabilities
Cross Platform : 16 Vulnerabilities

Thursday, 14 July 2005

Round 16 tips

MatchMy TipSpreadsheet Tip
Magpies v BombersBombersBombers
Cats v PowerCatsCats
Tigers v SaintsTigersTigers
Eagles v LionsEaglesEagles
Demons v SwansDemonsDemons
Crows v BulldogsCrowsCrows
Hawks v KangaroosKangaroosKangaroos
Blues v DockersBluesDockers

Wednesday, 13 July 2005

Normality reasserts itself.

The Australian one-day team dealt out another thrashing to England to show that, yes they are still the best team in the world and although England have improved, they still have a long way to go.

Scorecard & Bulletin

Good to see Jason Gillespie back in some form, with only one expensive over when Kevin Pietersen decided to play tennis instead of cricket.

Kevin Pietersen clubs a huge six on his way to 74
© Getty Images

And as for Gilchrist, what more can be said that hasn't already been said about the world's scariest batsman!!

Monday, 11 July 2005

Quote of the Day ??

I may get slapped for this, but this one is a gem from someone boasting to have a lot of knowledge in SQL Server and Oracle.

"can u please explain why we can't create a linked table. As access and SQL both are microsoft product"