Christian's Blog

AutoItX3 and QTP Part 2

May 28, 2010 by Christian Desserich

First, let's take a look at how I solved my problem of automating keystrokes from the number pad. This will be genericized so that you can run it inside QTP or even just save it in a .vbs file and execute it. It launches Notepad, waits for the notepad window to exist, makes sure it is activated, and then sends the keystrokes to generate the copyright symbol ©.

Set oAutoIt = CreateObject("AutoItX3.Control")
oAutoIt.Run("notepad.exe")
oAutoIt.WinWait "Untitled - Notepad"
oAutoIt.WinActivate "Untitled - Notepad"
oAutoIt.Send "{ALTDOWN}{NUMPAD0}{NUMPAD1}{NUMPAD6}{NUMPAD9}{ALTUP}"
Set oAutoIt = Nothing

Through messing around with AutoIt while trying to solve the problem of simulating typing on the number pad, I found that it is a great compliment to QTP's functionality. The mouse simulations are great, the window management methods are wonderful (wait for a particular window's existence, etc.), the registry management methods are outstanding, it has methods for setting and retrieving data from the system's clipboard, and the list goes on and on! So, I really wanted to use AutoIt for more than just that one test case. That just presents the problem of knowing whether or not the system running the tests in the future would have the AutoItX3 COM object available.

To work around that fact, I figured out I could uploaded the AutoItX3.dll file to the Quality Center project's "Subject" folder and create a quick script that can be run at the beginning of a test set in a stand-alone script or as part of any test script that requires AutoIt's functionality. The code downloads and sets up the AutoIt COM object automatically on the machine running the tests. This script could most likely be refined, but I just haven't really had the time or need to at this point. (Click here to view full-screen)

Dim regClr
Set regClr = DotNetFactory.CreateInstance("Microsoft.Win32.Registry", "mscorlib").ClassesRoot

If IsEmpty(regClr.OpenSubKey("AutoItX3.Control")) Then
Dim sbjNode, attachmentFilter, attachmentList, attachment
Dim fso, autoItX3File

'This is the name and destination path for the AutoItX3.dll file
Dim autoItX3DllName, autoItX3DllPath
autoItX3DllName = "AutoItX3.dll"
autoItX3DllPath = "C:WINDOWSsystem32" & autoItX3DllName

'Isolate the file in QC and download it
Set sbjNode = QCUtil.TDConnection.TreeManager.TreeRoot("Subject")
Set attachmentFilter = sbjNode.Attachments.Filter
attachmentFilter.Filter("CR_REFERENCE") = "'ALL_LISTS_" & sbjNode.NodeID & "_" & autoItX3DllName & "'"
Set attachmentList = attachmentFilter.NewList
Set attachment = attachmentList.Item(1)
attachment.Load True, ""

'Move it to the destination path
Set fso = CreateObject("Scripting.FileSystemObject")
Set autoItX3Dll = fso.GetFile(attachment.FileName)
autoItX3Dll.Copy(autoItX3DllPath)

'Register it
Set WshShell = CreateObject("WScript.Shell")
WshShell.Exec "RegSvr32 /s " & autoItX3DllPath

'Release objects
Set sbjNode = Nothing
Set attachmentFilter = Nothing
Set attachmentList = Nothing
Set attachment = Nothing
Set autoItX3Dll = Nothing
Set fso = Nothing
Set WshShell = Nothing
End If

Set regClr = Nothing

Of course, this code could be used to load any COM object. This could be really handy if you develop your own custom dll's for your tests. Other enhancements could be to make paths more dynamic, but I'm confident that this would work on any computer in my current client's organization.

 

AutoItX3 and QTP Part 1

May 27, 2010 by Christian Desserich

As usual, after I got into writing this, it got too long to be a single post. Part 1 covers the background for why I began to use AutoIt in QTP and how you can go about setting up a system to use it within QTP without installing all the tools that come with a full version of the AutoIt software. Part 2 will follow shortly and will cover some sample code that demonstrates how I used AutoIt in my QTP script to solve my problem and will cover some code that allows you to automate downloading and registering the AutoItX3.dll from a Quality Center project. This allows you to be confident that any computer that runs any script requiring the AutoItX3.dll will automatically have it set up for them.

First the background, I recently had a requirement that I wanted to automate that was apparently something that is very difficult to do with automation. The requirement was that the inputs for a web application would be able to accept special characters like ¢ or ©. These special characters are available via Windows Character Map, or there are also ALT+<Number> keyboard shortcuts for the most common ones. For example, © is generated by ALT+0169. The rub here is that the shortcuts only work with the number pad keys (the block of keys to the right of a standard keyboard). They do not work with the number keys above the letters. Therefore, you cannot use the shortcuts on most laptop keyboards and as I found out, most keystroke automations do not specifically support sending the number pad keys.

I figured it couldn't be THAT hard to automate the entering of a special character via its shortcut. I figured there must be a way using WshShell.SendKeys or the .NET System.Windows.Forms.SendKeys object. Boy was I wrong. I tried several methods using the above approaches, none of which worked since, as I already pointed out, those methods do not have separate commands for simulating the number pad. Having given up on finding the answer without help, I posed the question asking how to do it on my favorite QTP forum/site, AdvancedQTP.

One of my favorite people, Tarun Lalwani, gave me a solution privately and asked that I not share it since he was planning on writing an article about it on his site (which I think may have taken over as my favorite QTP forum/site). He hasn't posted an article about it yet so I can't link to it, sorry. I know that he has been busy developing yet another awesome contribution to the community called PowerDebug, so I'm pretty sure the article in question is not a priority for him at this point.

His solution was quite complex and he had to go deeper into the Windows API than I probably would have for the answer. It employs the usage of the Extern object and the user32.dll. Of course, I probably could have just automated the character map application to enter special characters, but that seemed like a ham-handed approach to me. Or, I suppose I could have just set the text with some text generated ahead of time, but I was convinced there must be a way to automate the generation of the characters.

Anyway, I digress. Another solution I researched was an automation scripting tool called AutoIt. I found out that I could easily simulate the keystrokes I needed with it, but I always hesitate to use anything other than pure QTP since I don't know who is going to run my tests in the future and I can only count on their configuration including QTP. Of course, the main reason I didn't want to use it was that I didn't want to have to figure out a new scripting language and research or devise a method of calling it from QTP (laziness).

However, I found out that they have a COM automatable version that could be registered with COM and then created as an object and used directly in QTP scripts (or any VBScript for that matter), no fuss, no muss. Here are the steps to get the AutoItX3 COM object working on your system without installing any of the other software associated with a full install of the AutoIt environment (this is on a WinXP system, I haven't done it on Vista or Win7 yet):

  1. Go to http://www.autoitscript.com/autoit3/downloads.shtml and click the "Download ZIP" button. (Or just click this link.)

  2. Extract the contents of the zip file (this is a self-extracting zip, just double click it).

  3. Open the "install" folder, then open the "AutoItX" folder.

  4. Copy the AutoItX3.dll file and paste the copy of it in the C:\WINDOWS\system32 folder.

  5. Copy the AutoItX.chm file and paste the copy somewhere handy for future reference. This is the compiled help file that contains the documentation for all the available methods.

  6. Open a command prompt and type "regsvr32 AutoItX3.dll".

  7. You should get confirmation that the registration succeeded.

  8. You may now create an instance of the AutoItX3.Control object and use it in QTP or VBScript to your heart's content!

  9. Refer to the help file in step 5 for all the details about what you can do with it. AutoIt is a very, very powerful automation tool!

Stick around for part 2, with code!

 

Bringing Windows to the Front in QTP Scripts Part 2

Feb 26, 2010 by Christian Desserich

Well, due to recent discoveries, I have to recant a lot of what I said in Part 1. Embarrassingly, that functionality is a snap to do with QTP's Window object, and I finally figured out how to successfully call ShowDialog on a .NET Form and pass the QTP window to it making the dialog modal  to the QTP window. This is what I was trying to accomplish and the whole reason I began this quest in the first place. In my defense, I have only used QTP on web applications, so I wasn't familiar with the QTP Window object. All effort was not wasted though, at least I learned about the QTP's Extern object!

I didn't realize how easy it was to find windows by their title with Descriptive Programming and the Window object. To easily find the QTP window you can just code: Window("RegExpWndTitle:=QuickTest Professional"). QTP only allows one instance running, so I would think this is pretty safe, but you could add more identification properties if you are worried that this could come back identifying more than one window. From there you can get runtime object properties, including the Handle for the QTP window.

Since it is easy to pick out windows this way, Part 1's functionality can be much more easily duplicated by finding the window that you want to bring to the front by using the identification properties of the Window object and simply calling the Window().Activate function. This is obviously much easier than defining and calling external methods as presented in Part 1, most embarrassing.

Anyway, on the subject of making the .NET Form modal to the QTP window, one of the strategies I was unsuccessfully trying to implement was to call the FromHandle method on the .NET Control class to get an object that implements the IWin32Window interface to pass to the ShowDialog method on the Form object. The reason I couldn't get this to work was that I kept attempting to hand the "raw" Handle directly into the method. What made this the most confusing was that .NET objects throw a "Method not found" exception when an argument is of the wrong type, so I was just figuring that the method was not available due to the fact that I instantiated the Control object indirectly with the QTP's DotNetFactory object.

I found a solution here. This forum post clued me into the piece of the puzzle I was missing. The FromHandle and similar methods are looking for an argument of the IntPtr type. The IntPtr object is an assembly that holds the handle value. The post also clued me into the NativeWindow class and its AssignHandle method. When calling the ShowDialog method, the only thing defined by the IWin32Window interface is that it has a Handle property, so all we need is an object that implements the interface to which we can assign the Handle property.

To make a modal dialog from a .NET Form with the QTP window as the parent:

Dim myForm, hWnd, intPtrHWnd, qtpWnd 
Set myForm = DotNetFactory.CreateInstance("System.Windows.Forms.Form", "System.Windows.Forms")
hWnd = Window("RegExpWndTitle:=QuickTest Professional").GetROProperty("hWnd")
Set intPtrHWnd = DotNetFactory.CreateInstance("System.IntPtr", "Mscorlib", hWnd)
Set qtpWnd = DotNetFactory.CreateInstance("System.Windows.Forms.NativeWindow", "System.Windows.Forms")
qtpWnd.AssignHandle intPtrHWnd
myForm.ShowDialog qtpWnd
myForm.Dispose
Set myForm = Nothing
Set intPtrHWnd = Nothing
Set qtpWnd = Nothing

The flexibility here is amazing. You can add any .NET form components to the form to build custom dialogs, inputs for passwords, etc. There are even SaveFileDialogs, FolderBrowserDialogs, andColorDialogs (to name a few), that can be shown modally to the QTP window in the same maner.

As promised, though, I was going to show the Shell.Application BrowseForFolder method, but of course, I will get the QTP window handle using the Window object this time.

Dim shell, hWnd, flder
Set shell = CreateObject("Shell.Application")
hWnd = Window("RegExpWndTitle:=QuickTest Professional").GetROProperty("hWnd")
Set flder = shell.BrowseForFolder(hWnd, "My Folder Browser", 0)
'Third arg is options arg, fourth arg is optional for root directory (Desktop is default, check docs for more info)
If flder Is Nothing Then
'Handle error
Else
MsgBox flder.Self.Path
End If
Set flder = Nothing
Set shell = Nothing

 

Bringing Windows to the Front in QTP Scripts Part 1

Jan 19, 2010 by Christian Desserich

This became too long to put in one post, so I broke it into two parts. Part one will cover the QTP Extern Object and the User32.dll function SetForegroundWindow. Part two will cover the BrowseForFolder function on the Shell.Application object.

Over the past few months, I have done a couple of custom testing functions that require user input. For example, in one script I was exporting an Excel file with some metrics pertaining to average log in and page load times. I wanted to prompt the user (usually me) to enter a location to save the Excel file. I found the BrowseForFolder function on a Windows Shell.Application object, but the folder browser dialog never popped up in front. I looked high and low for a way to move my desired window to the front. The only thing I could find was WScript.AppActivate, but I never had any success with that strategy. I ended up giving up for a while, since I was usually the only one running either of these scripts, so I knew what to do when the script paused, anyway.

My next attempt came a few days ago as I was trying to figure out a good, best practices method for abstracting test data and environment specific values such as URLs and DB connections. I am attempting to set up a system where if the test is running in a test set, then the test set itself will dictate the environment specific values, but when you are developing and debugging in QTP, a local config file would dictate the environment specific values. I also wanted it smart enough that if someone who had no knowledge of this system could run the tests and it would prompt them for input regarding which environment they wished to be the default and to automatically create the local config file.

Enter the DotNetFactory. I must preface the rest of this by saying that I am obsessed with using .NET objects in my scripts now, so a bulk of my postings about QuickTest Pro will most likely be on that subject. I figured that I would present the user with a custom form with some instructions, a drop-down, and a couple buttons to allow them to input the default environment facilitating the creation of the local config file for a user who doesn't already have one. This seemed all the more feasible given the fact that the .NET Form Class has a ShowDialog method. After coding up my dialog, testing it directly in a script, and thinking I got it, I moved the code to a function library attached to the scripts for use throughout the project. Alas, when the code is called from a function library, the dialog never pops to the front.

I spent a bunch more time trying AppActivate and other fruitless strategies, but all the research into these techniques, however futile, ultimately educated me on Windows Handles, the QTP Extern object, and other useful info. The solution I found to bring my custom .NET Form to the front was to access the User32.dll function SetForegroundWindow. The only way I could figure out how to utilize this function was to use the QTP Extern object. I will offer a warning at this point that in my research, I got the impression that this technique may not always work, although it's worked for me so far, and that it may not work for Vista or Windows 7 computers. I'm not exactly sure why, but I guess Microsoft was trying to make it more difficult for applications to push their way to the front since a lot of developers were using this technique. Apparently, this is why the flashing application handle on the task bar has become the norm.

The Extern object is used for declaring a function from an external .dll file for use in a script or function library. One of the things that confuses me about the Extern object is that in the function declaration, you specify the return type for the function and in this case it is a boolean indicating if the function was successful or not, but there is no mic constant to specify a boolean return type. If anyone knows what that is all about drop me a line. Since there is no constant for a boolean return type and I'm not sure if I would really want, or need, to do anything about it if the function returned false anyway, I used void for the return type. Here is how you declare SetForegroundWindow in a script or function library:

Extern.Declare micVoid, "SetForegroundWindow", "System.User32.dll", "SetForegroundWindow", micHwnd

The first argument is a built-in QTP constant for return type. Refer to the QTP help files for more information. The second is the function name. The third is the .dll file name. The fourth is the function "alias" which can specify different entry points for different character encoding. Click here for more information. The fifth and any following arguments are the type(s) for the arguments that will be passed to the SetForegroundWindow function. In this case there is one argument required and it is the Windows Handle for the application you want to bring to the front. I discovered that this is simply a number and you can pass it as a long integer.

I want to point out that I truly don't have a full grasp on the ins and outs of the underlying functionality going on here. Most of my knowledge comes from reading documentation, other blogs and articles, web searches, and a ton of trial and error. Anyway, here's the code to show a .NET Form and bring it to the front:

Dim myForm
Set myForm = DotNetFactory.CreateInstance("System.Windows.Forms.Form", "System.Windows.Forms")
Extern.Declare micVoid, "SetForegroundWindow", "user32.dll", "SetForegroundWindow", micHwnd
Extern.SetForegroundWindow CLng(myForm.Handle)
myForm.ShowDialog
myForm.Dispose
Set myForm = Nothing

Stick around for part two where we'll look at making the BrowseForFolder dialog on the Shell.Application object snap to the front and explore Windows Handles in a little more detail.

 

QuickTest Pro Introduction

Jan 11, 2010 by Christian Desserich

For almost a year now, I have been developing automated tests for a client who uses HP's (formerly Mercury's) QuickTest Professional and Quality Center. In my search for more knowledge and expertise as the months have passed, I have found that there is an amazingly huge community revolving around these products out there. The capabilities for automating application testing are amazing. However, I have also found that, like other software products, the documentation does not begin to hold the unreal amount of functionality included in these software tools, nor can the documentation possibly be able to cover all the real-world scenarios, best practices, or hacks.

The only way to really dig into the cutting edge of what can be accomplished is to go find those who are honing this edge and get yourself involved in the community. In fact, it even seems as if there is a lack of print books out there that cover these tools. The most complete one, which was written by an expert user in the community, was only recently released, http://www.amazon.com/QuickTest-Professional-Unplugged/dp/B002ACTWSM. I have not read the book yet hint, hint to the E-g management ;-), but luckily I have been able to pick the author, Tarun Lalwani's brain on more than one occasion on a couple community forums. Here is my list of resources that I use on an almost daily basis:

There have been many challenges during my introduction to these products and how they can best benefit me, as a developer, and the client. As I have pointed out, there are tons of community resources and forums out there that provide plenty of knowledge, but I would also like to write about a few tricks I have learned, as well. Some of this might be repeat information, but I hope to present it in an easily digestible for anyone looking for some decent hints or advice about these tools. Stay tuned!

 

Converting Database Data Directly to XML

Jan 26, 2009 by Christian Desserich

I had another interesting problem when an application framework we've been working with came out with a new version. Before, a value relating to the application user's "Position Name" (i.e. Manager) was a user-entered value. In the new release, this value was supposed to come from an XML configuration. Our client had already entered over 200 different positions and understandably didn't want to take the time to hand enter each one into this new configuration. I found out that DB2 has the XMLSERIALIZE() function and decided that this would be the easiest way to accomplish this without hand-typing each position name back into the system.

As mentioned above, in the original version of the framework the position name was typed in, but in the new version the configuration would be populated in a drop-down. Plus the configuration XML added two new elements that were obviously not present before. So the technique I used capitalized on some of the knowledge I gained working out the Vacuum of Columns. It turned out to be a simple select with two "dummied" columns.

select distinct XMLSERIALIZE(content XMLELEMENT(name "Position_Name", XMLELEMENT(name "Value", system_users.position_name), XMLELEMENT(name "Dollar_Limit", CAST(NULL AS VARCHAR(1))), XMLELEMENT(name "Level", CAST(NULL AS VARCHAR(1)))) as VARCHAR(120)) as "Result" from system_users



You can see that I used the cast(null as ___) technique from my earlier post to make sure the element tags existed even though they were empty, so that I didn't have to put those in by hand either. I executed this in SQireL and just cut and pasted it into the configuration and voila! All done with little fuss and less muss.

This particular example was on the verge of not being worth the time it took to figure this out, but I again learned something that may be extremely handy in the future, and it might save someone else some time, too. For more information, here is the article on IBM developerWorks :

http://www.ibm.com/developerworks/db2/library/techarticle/dm-0511melnyk/

 

The Vacuum of Columns

Aug 04, 2008 by Christian Desserich

I know that I'm laying on the space analogies pretty thick, but it just seems to work so far... Anyway, I learned something interesting today and I thought that I would pass it on. I'd like to start off saying that I don't know if this is the best way to go about trying to combine fairly unrelated records from fairly unrelated tables. If anyone has better ways to do this type of thing PLEASE let me know. I think given my constraints, this is the best way, but I would love to refactor if I could reduce the complexity.

Nevertheless, here goes. I had a situation where I had to pull records from two fairly unrelated tables that really were related based on certain conditions. One table (table B) was actually the child of a child of the other table, but there was not always a "grandparent" record in the other table (table A). Basically, I needed the record from the "grandchild" table (table B) unless it had a "grandparent" record (in table A), in which case I needed to see that record. That wouldn't be a huge deal if the tables shared column names and primary keys, but they didn't and we didn't want to do a whole redesign at this point just to satisfy this "list" view of the combined records. What I needed was to be able to alias null values for the columns that the tables didn't have in common so I could do two different selects with a SQL UNION. It took me a while to find some solutions, but this blog is where I found my answers. Here's how I did it:

Table_A
primary_keycol_1col_2col_3
1aaabbbccc
2dddeeefff
3ggghhhiii
4jjjkkklll
 
Table_B
composite_key_1composite_key_1col_1col_2
11mmmnnn
12oooppp
21qqqrrr
22sssttt


You can see that there a some common columns, but obviously the primary keys need to be separated and I need one column that doesn't exist in the other table. When using the UNION operator, though, the number of columns and their names need to be the same. Plus, as I mentioned some of the records in table B might have a related record two generations away (really just linked through one other table) in table A, but in that case I only want to see the record from table A. The approach I wanted to use was to have the columns that did not exist in table A to be there in the results, but be null in value and vice-versa the other direction. I found out that you could call a function that cast "null" as the correct data type and then alias it to make this happen. Basically, to get null integers (for the primary keys) I used the CAST() function like this:
CAST(NULL AS INTEGER)
And for the etxtra column that is of type VARCHAR with a size of 25:
CAST(NULL AS VARCHAR(25))
To select the records from table A while creating the columns for table B's composite key with null values (notice the aliasing):
SELECT Table_A.primary_key, CAST(NULL AS INTEGER) AS composite_key_1, CAST(NULL AS INTEGER) AS composite_key_2, Table_A.col_1, Table_A.col_2, Table_A.col_3
FROM Table_A
To select the records from Table_B while creating the columns for Table_A's primary key and extra column with null values is a little trickier because I don't want the records from Table_B that have a "grandparent" in Table_A. I found that if I joined to "up" to Table_A, Table_A's primary key would be null (seems kind of obvious now) and I could specify that I only wanted the ones that were null (had no related record in Table_A):
SELECT CAST(NULL AS INTEGER) AS primary_key, Table_B.composite_key_1, Table_B.composite_key_2, Table_B.col_1, Table_B.col_2, CAST(NULL AS VARCHAR(25)) AS col_3
FROM Table_B
LEFT INNER JOIN Intermediate_Table ON Table_B.foreign_key = Intermediate_Table.foreign_key
LEFT INNER JOIN Table_A ON Intermediate_primary_key = Table_A.primary_key
WHERE primary_key IS NULL
Then if the two selects are put together with a UNION, you get the entire list how it was required.
SELECT Table_A.primary_key, CAST(NULL AS INTEGER) AS composite_key_1, CAST(NULL AS INTEGER) AS composite_key_2, Table_A.col_1, Table_A.col_2, Table_A.col_3
FROM Table_A

UNION

SELECT CAST(NULL AS INTEGER) AS primary_key, Table_B.composite_key_1, Table_B.composite_key_2, Table_B.col_1, Table_B.col_2, CAST(NULL AS VARCHAR(25)) AS col_3
FROM Table_B LEFT INNER JOIN Intermediate_Table ON Table_B.foreign_key = Intermediate_Table.foreign_key
LEFT INNER JOIN Table_A ON Intermediate_primary_key = Table_A.primary_key
WHERE primary_key IS NULL
Result Set
primary_keycomposite_key_1composite_key_2col_1col_2col_3
1nullnullaaabbbccc
2nullnulldddeeefff
3nullnullggghhhiii
4nullnulljjjkkklll
null11mmmnnnnull
null12ooopppnull
null21qqqrrrnull
null22ssstttnull


You can see where the columns have been created where they didn't exist before and are filled with null values. In fact you could fill the result set with any values, but for this purpose null had the most (or least) meaning.

 

The Black Hole of Technology

Aug 03, 2008 by Christian Desserich

The Black Hole of Technology

When I was first studying up for job interviews I experienced a phenomenon I am calling "The Black Hole of Technology." I would look up one acronym, framework title, or protocol abbreviation only to find more that I didn't know about in the explanation. I would then dutifully click one of those links only to have the same thing happen. I would continue on and get about five subjects deep until I couldn't remember what I was trying to look up in the first place!

For example, if you look up "Model-view-controller" on everybody's favorite source, Wikipedia (it certainly was my very favorite while in school, if only for a starting point!), you'll find a link to the "Spring framework"page. I think, "Hmm, I know that this has been mentioned a lot," so I click on it. On that page there is mention of "SOAP." I think, "Hmm, I have always wanted to know what that is all about." I click on that. The explanation is not really super clear to me, but here is competing technology "CORBA." I think, "Maybe I'll find out more about what 'SOAP' and 'CORBA' are there." I click on that. I read and see "Python" and think, "Python, that sounds interesting!" I click on that. I think, "What's 'Duck Typing'?" I click on that. Then I think, "No, I need to get back to what I was looking up." So I go back two steps to "CORBA." Then I think, "What was 'SSL' again?" This goes on and on. It seems there is never an end to the hole you go down trying to learn about a technology.

Since then I have learned to limit myself to only going one, maybe two, levels down the hole. If I don't have a complete understanding of every single part of a technology, that's OK. It's just that it's in my nature to want to know about the nuts-and-bolts of something, but I have learned that it isn't completely necessary to be able to use that same something. It's just tough because while I don't know exactly how a computer works, I have a decent idea. While I don't know exactly how a car works I have a really good understanding of it. While I don't know exactly how my dishwasher works, I have a basis of knowledge. I've figured out that it's OK to not know these things. I can still surf the Web, drive, and get the dishes clean without memorizing blueprints and schematics.

 

Origins

Aug 02, 2008 by Christian Desserich

The idea behind the title of my blog is that nebulae are where stars are born. So, too, I want to become a star in my new career. I came from an electronics background, but have discovered that this industry is chock full of people with all kinds of previous experience. For example, E-g has a CPA amongst our ranks and my own brother has a bachelor's in mechanical engineering technology. I can only imagine that others, like me, who have converted to the IT field had an experience similar to mine. (Or maybe not, I suppose I've never done any real research on the matter!)

I have always been great at computers. I even took BASIC programming a couple of times in school. Back then the main machines to work on were the Tandy TRS-80s (more commonly known as Trash 80s). My father also brought home a Texas Instruments TI-99 that my brother and I played games on (Parsec anyone?), but also had a command line to program in BASIC. I also took a programming course in C and a couple in digital theory a few years out of high school. For some reason, I always loved making computers do things, even if it was just repeating characters in patterns on the screen, or a simple but comical Q&A program.

Somewhere along the line, however, my interests forked into music and electronics surrounding music. When I was in high school, I was especially interested in car stereos. What could be cooler than having a kickin' stereo when you are teenager? Wouldn't you know it, the father of one of my best friends owned a stereo shop.

The rest is history until I decided to go back to school a few years ago to ensure that I set a good example for my kids by earning my degree. Well, there was only one thing I wanted to study, programming. So, here I am, a newbie in a new career at thirty-two. Yet, just like I suspect about others like me, I am not really a newbie. I've really been doing this for a long time. It's kind of a wonder, though, that it has taken me this long to come full circle.

I suppose the point of this long a boring story is that although I am a newbie in experience, I am not a newbie in understanding. It's been a long time coming for me to find my way to the nebula, but now I can become comfortable in my ethereal surroundings and concentrate on shining as brightly as I can.

 

Inaugural Post

Aug 01, 2008 by Christian Desserich

Up until now, I haven't been a real blog addict (reading or writing). However, there has to be a first time for everything. What I hope to achieve by blogging is to give my loyal subscriber base of millions a different perspective on Java programming: that of the newbie. Hopefully along the way I can learn a few things about programming and maybe even myself. If by some miracle someone gets a chuckle, laugh, or by some twist of fate, a useful tip, that would be great. Otherwise, maybe this may just be a chronicle of my Java journey for me to look back on after I become an expert (most likely in a few months).

 

search blogs.e-gineering.com

« September 2010
SunMonTueWedThuFriSat
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  
       
Today

Links

Feeds

Navigation