ORACLENERD twitter/oraclenerd view chet justice's profile on LinkedIn feed oraclenerd t-shirts Unemployment Clock:

  Make Money Blogging
Yeah, it's pretty much a futile effort, but hey, I've been paid by Google.



Only 430 posts. I think that puts me at less than $0.40 a post. 28 months would come out to less than $4 a month.

Labels: , ,

 
  The Long Drive Home
So I am starting to understand why people who travel don't have a lot of time.

For the past 3 weeks I have driven back and forth to Greenville, SC, a round trip of 1200 miles. That's 600 miles on Sunday and 600 miles on Thursday. My record so far is 7 hours and 45 minutes, approximately 75 MPH.

Tomorrow I will be flying and will be there in 1.5 hours. Much better.

My reasoning for driving is multi-fold:
1. I'm not in the habit of flying thus maintain a tad bit of fear at the prospect. I know it's not rational...
2. 4 trips in a month comes out to about $3,000, I can't float that kind of money now. Driving saves me about $400 a week in air travel and about $250 a week in car rental. Driving costs about $120 round trip in gas.
3. Driving pays. Current federal rate is 0.55/mile. 1200 miles = $660. Subtract that from $120 and I am ahead $540. Multiply that by 4 weeks and I'm at about $2,000.

One thing I did not take into account is the exhaustion factor. When I get home, I don't want to do a thing and just dread Sunday creeping up. Despite having a driving buddy coming home this past Thursday, I slept pretty much all day Friday. Today I was a slug too. I'm not much use to my kids in that state.

So I'm going to fly. I nice early morning flight won't bother me much as I will still be too tired to think too much about being scared. Perfect. Sucks that I have to leave so early in the morning, but what can you do?

I still can't float the money to do this every week, so I'm going to try and rotate the schedule, fly, drive and beg for a week of remote work to ease the burden.

Any tips or tricks for traveling out there? I'm using TripIt, which is nice to keep everything in one place. What else?

Labels: ,

 
  The Costs and Benefits of Enterprise Technology
My technology chops lag a bit behind the writers and readers of this blog. While I am taking the Piwowar EBS challenge along with Chet, Floyd and others, my day to day activities are more focused on trying to blow hot air onto the frozen middle of enterprise technology management. Chet recently retweeted a good question that got me thinking, reading and (now) writing. The question was:

RT: @brhubart

That post linked to a super article called Upper Mismanagement from The New Republic. It discusses how many executives, having risen up from finance instead of operational backgrounds, are probably incapable of leading American manufacturing today.

We see many of those same problems in IT. Those leaders who come from a finance background tend to be focused on showing the money (or the savings), while the technical leadership are just as focused on innovative technology. That often leaves the more operational business folks hanging in between, trying to keep the business going - doing more with less.

One problem seems to be that the wrong people are making the decisions - for the wrong reasons. This is an organizational problem: the right people are not in the right place. Technical, financial, and business folks all need to work together to create the solutions that will best advance the organizational mission. Too great a focus on any of those areas will potentially endanger the goals of the others. Jake spoke to part of this divide in his OOW 08 presentation (slide 9):

Jake Kuramoto's 2008 OOW Presentation

What about solutions?

In a recent seminar on financial management for IT, we worked with Intel's Business Value Index model. When you have a few minutes, read this white paper: IT@Intel White Paper Using an IT Business Value Program to Measure Benefits to the Enterprise. I'll provide the first line as a teaser:
Intel's IT business value (ITBV) program has shifted our IT investment decision making process to a customer-focused, data-driven model that demonstrates the impact of IT on Intel’s bottom line.
Yes! Right on! Isn't that what we all do?! I'd argue that if we all did this even half as well as Intel we wouldn't have as many questions about "finance killing IT" or "IT costing too much" or "IT not serving business needs."

I encourage all of us to read this paper. It explains how Intel's model "works by evaluating IT investments along three factors: IT business value, impact on IT efficiency, and the financial attractiveness of an investment." I love how they are ranked.

The key to the success of the Intel model seems to be accurate measurement of all three factors. Cost is frequently measured, but not always accurately. How often have you seen a solution implemented without provisions for its total cost? IT efficiency is measured less often. Business value is typically implied in requirement gathering, but I often see operational metrics missing once a solution goes into production. One example comes from a business intelligence project I am working on. In all of our work to help our business owners develop KPIs, we came up short on defining those metrics that would indicate how well IT was performing. See a good post from CIO magazine on developing metrics for IT.

So, if it is easy and obvious to do the right thing around measuring the benefits of IT to the enterprise, why is it not done consistently? I used to think it was just me, or just my organization, or just my industry (Higher Education and Research). Since I have been in school and doing a bit of consulting, though, I find my peers in all industries are singing the same tune. Perhaps one answer is implied in the New Republic article referenced earlier in this post. Perhaps we are not preparing ourselves and those around us to take the lead in this area.

Here is a good recent publication from my industry highlighting the shifting roles in IT leadership. I would argue it is not that different in other industries. Nor would I argue that any of this is new. Here is a similarly good recent publication from the CIO Executive Council called the State of the CIO 2010. I also recently read some great old school management principles from IBM's heyday. They are enjoyable and still applicable. Check out especially the "IBM management principles and practices" and the "Quintessential quotes."

Please find the comments if you love or hate any of the resources I've included. Please also drop a comment if you have an answer to the question of "will 'show me the money' kill IT?"

Thank you @oraclenerd and @brhubart for getting me thinking, reading, and writing. Now I can shed the slacker tag for a spell and get back to my work on the Piwowar EBS challenge (I am still on hardware and OS, ugh).

Ted [ linkedin | twitter ] is Vice President for Communications at the Higher Education User Group, MBA and MSIS student at the Johns Hopkins University, Director of Administrative Systems at MICA, and slacker at badgerworks.

Labels: , ,

 
  Random Things: Volume #11
Work: Consulting
I just returned home from my first week consulting. I went to the northern part of Alabama and didn't have much of a connection (phone or data) most of the time.

From my perspective it was a rousing success. Now I just need to wait and see if the client approved of my work.

I chose to drive as it was semi-last minute (last Thursday I found out) and I haven't had a good road trip in years. I promise it wasn't a fear of flying.

On the way I picked up the guy I would be working with at the Atlanta airport. We had only (briefly) communicated through email and one "get up to speed" phone call. I think it's safe to say that we got along pretty well. After a couple of hours with the client the following day, they asked how long we had been working together and were absolutely shocked to learn that we had just met.

As to the work, I got to rekindle some of my OBIEE administration skills, specifically the rpd (or metadata). It was fun to get back into it as I had been prepping for this the past couple of weeks. By day 2 I was in a zone (adding physical tables, replacing logical table data sources, etc).

My colleague's expertise was in Answers, so I got to see some pretty cool stuff. I'm trying to talk him into blogging and offered him a guest slot to see if he likes it.

The clients were great and easy to work with...overall an A+.

Google Latitude
As I have a new blackberry (couldn't afford the droid yet), I managed to download my Google Contacts, GMail and most importantly, Google Maps...which ties in with Google Latitude.

I could see myself driving up I-75 and even better, I could expose my location to my wife and parents (I am an only child...the center of their universe :). I even tried to use it to find my phone which I had misplaced this afternoon (it had fallen under my seat) to no avail. Basically, I believe it uses the cell towers to approximate your location, the closest I saw it was within 800 meters.

Amusingly, as we're driving to Atlanta this afternoon and my father calls...WTF? he says. "I'm taking my colleague to the airport"

"Are you going back?"

"No, I'm headed home"

I had neglected to tell him that I would be there through Thursday...he of course thought the worse.

I have 2 pretty cool guest posts on the way. Mr. Meyers has one and Mr. Piwowar finally got to Part 3 of his EBS install guide. :) I'll post those next week so they don't get lost in the weekend down time.

Labels: , ,

 
  ORACLENERD, Inc.
Today I made it official...I filed my paperwork with the State of Florida to incorporate. It seemed fairly obvious what the name should be.

If you read the previous post, you probably gathered that little fact.

All of this is related to the fact that I have a new job. I'm not quite ready to talk about the details yet but I believe there is quite a bit of opportunity here. For one, I'll be working with OBIEE again. It's been about 9 months since I last worked with and I was just getting started. There may also be some work with APEX, which would be great. Finally, there's a very outside shot that I may get to work with Exadata v2 in the somewhat near future.

Maybe you're wondering why I incorporated? I don't know, just seemed like fun. Actually, I'll be working as a consultant. This is my first real trek down that road. I have to learn about billable hours, successful travel planning...and probably most importantly, budgeting.

I'm very excited about this opportunity. I will have to travel a bit, but I'll also get to work from home quite a bit so I believe in the long run, family time will probably be greater than when I was going to that "9 to 5" type job where I was actually away from home more than 60 hours a week. We'll see.

Labels: , ,

 
  How To Apply For an EIN
EIN being an Employer Identification Number.

You can find the start page here at irs.gov.

This is the second time I have done this, well, second time I have had an EIN. I'm pretty sure the lawyer did it the first time around. If I remember correctly, that cost me a whopping $500, 5 years ago. Of course that included incorporation as well.

I remember how daunting it was back then, starting your own business. I felt like I had to hire a lawyer to do it. The truth is, it's very easy to do. Especially if you consider the sheer volume of documentation that exists on the Oracle database...this is a piece of cake.

It took 10 minutes to complete, but most of that time was spent doing screen captures. Twenty steps in all.

Landing page from the link above:



Begin Application:



Choose the type of business:



"Sub" Corporations:



Confirm your selection:



Why do you need an EIN?



Principal Officer?



Individual details:



Location of corporation:



Verify physical location:



"Accept Database Version" is funny. Do most people understand what that would mean? I guessed that's the USPS version of my address...but I tend to work with these types of scenarios.

Corporation details:



More about the corporation:



What does your corporation do?



I selected other because there was no IT type category on there.

What kind of Other?



What kind of Consulting?



How do you want this delivered?



Summary:



EIN assigned!



Additional information:



Thank you!



Pretty easy all in all. I bet is was a bit harder 5 years ago (i.e. not automated).

Amusingly, this form is only available at certain times of the day. I tried this morning and was told the online assistant didn't work until 7 PM on Sundays. WTF?

Labels: ,

 
  I've Got a Job!
Details to follow.

Labels:

 
  Dilbert: You're Fired!

Labels: ,

 
  Losing A Job: The Aftermath
So I've got a little experience in "losing" my job. Laid off, furloughed, rehired, resigned (and walked out), new job, laid off.

Of course I didn't lose one of those jobs...I know right where they are. I just can't or won't go back to them.

Fortunately for me, I've made a lot of good friends online. Very supportive friends. It makes "losing" a job that much easier.

Of course there's more to it...the effect it has on the family.

Kate...she doesn't understand yet. She just smiles and laughs and makes everything go away.

LC, however, is starting to grasp it. He doesn't say anything to me, but he does say stuff to his mother.

"Are we going to have to move back to Gainesville?"

"Is poppa going to pay our bills for us?"

You know...fun stuff like that.

Strangely, not to long ago he was always asking me to fire myself so I could be home all the time (it's the only way I get a vacation these days).

And then there's the wife, the lovely woman who agreed to marry me (yikes!) and has supported me through all of this. Without her, I could not have made it as far as I have.

When we met, we were polar opposites. I was a bit on the timid side and she...well, she doesn't have much of a filter. A perfect match!

Over time I have found my voice and she has muted hers (only a little). We're meeting somewhere in the middle (at least that's what I tell myself).

Kris does not work. She held LC in her hands and told me she didn't want to go back to work. I couldn't argue. Although she did work briefly but was let go because LC had an ear infection and needed medical attention. We didn't fight it. She's a stay-at-home mom, and we like it that way. She's been able to help Kate out with doctor visits, physical therapy, speech therapy, HGH injections...the list goes on and on.

Since she doesn't work, she feels, at times, out of control. When I "lose" my job, that feeling is heightened.

Not really sure what the point of this was...it's not to feel sorry for me, that's for sure. Just a warning to those out there in a similar situation. It doesn't effect just you...it effects your entire family (I haven't even mentioned my parents, or Kris' parents).

The only advice I can give to help alleviate this is:
1. Have enough money in the bank to weather the storm
2. ...OK, just 1.

Labels: , , , , ,

 
  The Perfect Job
Since I am no longer tethered, I can talk about my perfect job without fear of offending.

Company Size
I don't necessarily care how big the company is, but I know the bigger it is, the more bureaucratic it gets. Small usually means more nimble. I like large companies because that's a lot of people to get to know.

Culture
Casual. Definitely casual. I've been spoiled the last 6 months...shorts, t-shirt and flip-flops to work everyday. I met a recruiter the other day and I actually had to wear (long) pants and a button-up shirt. Yuk. I like to dress up...just not every day.

Cursing. Have to have cursing.



More points if you add in a swear jar.



Even professional. I want to work with people who have Jedi skills. I want to work with Good Lazy people, not Bad Lazy.

Benefits
Health Insurance, 401k plans, vacation time...all of those are important. On site gym? WIN! Even though I fail to go, it's nice to have that option. That was one of the big selling points in moving to Tampa. WellCare had a massive (to me anyway) campus, weight room, basketball and racquetball courts. They even had a softball field.

The last place I worked had a great gym and a car wash guy that came every week or so (though I never partook).

Environment
This definitely crosses path with some of the other categories, but I decided to create a new one because I wasn't sure exactly where it fit.

By environment, I mean your desk set up. Must haves:
--2 or more 21 inch monitors
--kick ass desktop machine
--a very nice chair. If I spend a lot of time in that thing, in better be comfortable.
--Ergonomic keyboard. I've been using Microsoft's Natural Keyboard (the rounded one) since I started using a computer in 1996 or 1997. I even take it to work if they don't provide one. I left mine at the last place and sent a frantic email to the HR lady to retrieve it for me.

+1 if this is your setup.



Location
I don't want to work at home all of the time, but I do want to be close. Spending more than an hour on the road a day is a waste of time. Traffic sucks too. The past couple of months I would have baseball practice at 6:30 on Mondays and Tuesdays which means I had to leave the office no later than 5:15. I'd then swing by home, pick up LC in the driveway and off to practice we went. Thursdays were similar with tutoring at 6.

I'd also like to be able to work from home once in awhile. Some places never let you do it...I work a lot and I get into the zone at night typically. If you don't want to allow me to work from home once in awhile, why should I work at home at all?

More than anything I just want the flexibility.

So what's your perfect job? Anything like mine?

Labels: ,

 
  Free Oracle Developer/dba
There is a serious lack of work in the Tampa market and desperate times call for desperate measures.

Now, I've always wanted to do this, but was never in a position to do so financially...I'm still not, but something is way better than nothing.

I'm going to offer my services for free.

Not forever mind you, somewhere between 2 and 4 weeks. It is negotiable.

If it works out, i.e. you like what I can bring to your organization, I prove that I pick new systems up quickly and I fit in well with your team; and I like working in your organization, then you pay me for that time worked and I sign up full-time either as a permanent employee or some sort of contract.

If it doesn't work out, we part ways and no one is worse for wear. You get free work from me and I get to experience a new environment (i.e. meet new people, expand my network, etc).

You can view my resume here (permanent link up top coming soon).

Some basic highlights:
PL/SQL: Expert (I don't like that term)
DBA: Junior to Mid-level (or DBA in lowercase, "dba")
APEX: Worked with up to version 3.2, admittedly rusty, but passionate about the product.
Design: Love modeling data. Model just about everything in my head (in normal life). Use Visio extensively for visual representations. Experience with SQL Developer Data Modeler, ERwin, etc.
Documentation: Give me a wiki or something similar and I'll document just about everything that I do.

That's it. Contact info is on my resume or up top on the "email" icon.

It's now posted on craigslist as well.

Labels: , , , , ,

 
  Father, Husband, Employee, Coach, Tutor
I had been pondering a post on how impossibly busy I have been lately. You know, the 45-60 hours in the office, the 2 hours on the road back and forth, coaching a bunch of 6-7-8 year olds and tutoring someone in database concepts. And blogging of course.

It doesn't seem to have quite the punch now.

Here's what it would have looked like anyway...

Father
With all that has happened in the last couple of years, I still get to come home to people that like me no matter what. LC and his battle stories with the girls at school and Kate...well, she just is. Her smile lights up the room. The infectious laugh...the hugging (finally!)...she just makes my day.

Husband
Intentionally left blank.

Employee
Move along...nothing to see here.

Tutor
It's been about 4 weeks since I began tutoring. I thought I would post more on it, but I've been so busy with everything else that I just never go to it. That should change now though, at least for awhile.

There is nothing like having to communicate complex systems to those who don't know the first thing about databases. Where do you start?

Last week was especially difficult. We had to diagram some tables based on one paragraph of requirements. This was more inline with logical modeling as well, which I don't have a lot of experience with. Which means, you have to represent (as I understood it anyway) your relationships without use of an intersection table. WTF?

Coach
One of the best things in the world. If you ever have the opportunity to coach young children, take it! Yes, it's painful at times. Yes, it is like herding cats. Yes, they do not listen. <-- does that even make sense?

But...you can yell at them for an hour straight. I don't mean the jerk kind of yelling, I mean the fun, obnoxious kind of yelling. Whatever that is.

For whatever reason, I'm naturally loud. Amazingly, I get louder on the baseball field.

There is no better way to turn your day around than by yelling at a bunch of kids. The best stress-reliever of all time possibly.

Labels: , ,

 
  Starting Over...Again.
On Friday I was told, "They're [things] just not working out..." and let go from my job. The job counter was up to a whopping 189 days though...which is encouraging. That was my longest un-interrupted stint of employment in 17 months.

On the surface, it looks terrible; there's no doubt about that. I cringe at my record over that time. Two firings, one layoff and one furlough. Ouch.

The first firing was self-inflicted. Not something I am proud of...I had interviewed, was offered and accepted a position with RevolutionMoney prior to that though, so you could say I was checked out or just looking for an easy escape. I still wish it had gone down differently but I can't change the past.

That self-inflicted would, combined with the most recent news, looks pretty bad for me as an employee.

Employee Oriented

Am I a team player?

Do I work well with others?

Am I a good employee?

Do I lie, cheat or steal?

Technical

Do I have technical skills?

How do I compare to my peers?

What is my skill level?

All perfectly valid questions for a potential future employer.

I should defend myself right?

I have no idea right now.

I think the best thing I can do right now is engage potential employers, answer any and all questions, as openly and honestly as possible, and hope for the best. I know the market isn't great right now...but I'll do what I need to do find a job.

I find myself envious of those who have been with companys for a long period of time. Amusingly, had I been a bit more patient, I would have probably found WellCare to be a nice home for awhile. I still have a lot of great friends from there I think mostly because they were my support system when Kate got sick.

I took the job at RevolutionMoney because it was a startup and offered an opportunity to do all kinds of really cool stuff. None of the "really cool stuff" came to fruition though and all of the people behind that push either left or were let go.

I had just gotten comfortable in my recent job, was in a bit of groove...but "things just weren't working out."

So I'm looking.

If you know anyone out there looking for a lazy Oracle developer/modeler/little dba, send them my way.

Labels: ,

 
  "They're just not working out..."
Yup, let's stop the clock.

189 days isn't so bad is it?



Read the timeline for more info on my brief stint in Tampa.

Labels: , ,

 
  (Old) Social Media and Travis Page
Driving home on Wednesday listing to the local AM station, 970 WFLA, there was an announcement for the radio resumes and the most recent winner, Travis Page.

Travis then came on air, told us a little about himself and what he was looking for. I couldn't believe it when I heard Database Technologies.

Really? On the radio? I couldn't believe it.

When I got home I had to check this guy out. First thing I wanted to know, was he an Oracle guy or a Microsoft guy. Reading through his resume I found that he did have a little bit of Oracle, but he was obviously focused on SQL Server. Boo.

I had to give the guy credit though. I look(ed) for jobs through twitter, dice, monster, etc., pretty much all the places where you didn't have to talk. This guy used the radio. The radio isn't new, or shiny. Perhaps it can be shiny...but I digress.

So I dropped Travis a line telling him about tonight's SOUG meeting and encouraged him to attend. Sure enough he did.

I love that kind of dedication. I've tried to help people in the past only to see them ignore my advice.

So, if you're in the Tampa Bay area and looking for a junior developer, either Oracle or SQL Server (ugh), call Travis immediately for an interview.

We talked for a bit after the meeting and seems like a very genuine guy (plus, he showed up!). Besides his little SQL Server problem, I think a company could find good use out of a guy like him. Resourceful and dedicated are two very good traits to have in an employee.

If you missed it up above, you can find Travis' resume here.

Labels: , ,

 
  Learning From Failure
I think I began reading The Daily WTF about 4 years ago. I don't miss or skip a post.

I remember this one time, probably about the time I began reading the site, I had to automate a process to move files from one server to another. Originally, I had tried to create a network drive (yes, it was Windows) on the database server so that I could just use a simple Java class to read the directory and then load the files via DBMS_LOB.

I had ultimately decided on a service, but I didn't know how to write one for Windows. Then I found the Java Service Wrapper which would allow me to write the guts in Java and then install it on Windows as a service. Perfect.

Now that I had that settled, I had to figure out how to detect when a file was read to be moved. I decided on a looping mechanism, to check every minute or so, to see if a file was available. It looked something like this (I'm a tad rusty, so bear with me):
package project1;

import java.util.Date;

public class Class1
{
public static void main(String[] args)
{
Class1 class1 = new Class1();
Date d = new Date();
long l = d.getTime() + 1000000000;
String s = String.valueOf( l );

for ( int i = 0; i < l; i++ )
{
//some sort of MOD "wait" here, then check for the file
}
}
}
It wasn't pretty, but it seemed to work.

Then I got a call from the server admin.

SA: "You've got something running on this machine that's spiking the CPU."

Me: "Really? I can't think of anything."

SA: "Well, take a look and see if you can find anything."

Me: "10-4"

Sure enough, go into Task Manager and there's java.exe hogging up all the CPU. WTF?

I just ran this on my machine and you can see the CPU start to spike:


Off to Google to see what I can find. During my research, I found mention of a small method called Thread.sleep(long). So I replaced my brilliant add 1000000 to the current date with Thread.sleep(6000), or whatever equals 60 seconds. Problem solved.

A short time later I read a post on The Daily WTF about the same exact problem (I can't find the exact post for the life of me). The "victim" did the exact same thing I did. The solution was the Thread.sleep() call.

Me = FAIL

One more short example.

Over beers, a friend (see last entry) of mine and I were discussing the failure of the North Korean missile launch. I said, "Idiots." He said, "They're going to learn a lot more from that failure than they would have had it suceeded."

Spoken like a true engineer I guess.

The point? You learn by trying. You learn my doing. You learn by failing. Whether you realize it or not, you learn. (Well, some people don't, but that's another post). If you're reading here though, that probably means you have a passion for what you do. That means that you are trying. You are learning (maybe not here specifically ;).

Here's to trying and failing and hopefully trying and succeeding.

Labels: , , , ,

 
  Burnout
After about 5 years of near constant activity I'm finally beginning to feel the effects.

In 2004 I started a business. I would work over 100 hours a week including my day job trying to get that thing going (which never happened). The birth of Kate in December of that year really changed my life. Pretty much every since Kate has been to keep our heads above water financially.

Early 2005 I took a different job. They (graciously) allowed me to work up to 60 hours at for time. That certainly help alleviate some of the financial pressure.

In the last quarter of 2006 I got a call from a recruiter saying I could make two and a half times that money in Tampa. I took it. Unfortunately the contract only ended up lasting about 5 weeks before I rolled into a permanent position. That was WellCare.

About 1 year ago to the day, I was fired from WellCare, ostensibly for blogging about their layoffs. Strangely, last week they announced another round of layoffs.

I then took a contract (temp to perm) position at RevolutionMoney. My hopes were very high as it was still in the start-up phase and they were looking to compete with the likes of Visa and MasterCard. Less than 2 months later though I was let go.

Five weeks after that I was brought back as a permanent employee. Only to be furloughed 3 months later and brought back 4 days later.

In April I resigned and took a position with a new company.

Oy...

Where's the burnout?

I think all of this has led to a bit of burnout. I use to come home and after the kids went to bed starting work on some other side project. Now I just catch up on all the movies I've missed over the past 5 years. The desire to do new and different things is there, just not the will. I get on the computer and start doing other, more trivial stuff.

Lately I'm trying to get Oracle installed on Ubuntu. Mostly screwed that up and will probably have to reinstall everything. I know enough to be very dangerous.

At work I've lost a bit of my fight. I'm still passionate, I just don't have the desire to argue my point all the time. Yes, I know, choose your battles and all that. Most of the fights I've had though are fundamental, like constraints. Without a position of authority (Lead or Architect or DBA or something), I'm not sure I can get others to listen.

It's not like I'm socially inept. I know how to get along and work with others. I just don't know how (anymore) how to change their minds. I've tried proving my ideas out, but it mostly doesn't matter. I'm up against something larger here.

So, I'm a bit burned out. I have not posted a technical article here in more than a month. That's frustrating.

Have you had burnout similar to mine? How do you handle it? What do you do to get over it?

Labels: ,

 
  Top Ten Grammatical Errors That Make People Look Stup--Silly....
I had been planning and scheming to be the "first" to have a guest blogger...but Lewis beat me to the punch. Yes, yes, I know, neither of us were the first to think of it.

I'm part of this the Network with Gators group on LinkedIn and one of the daily digests came through my email titled, "How many Gators are making the leap to entrepreneurship or business owners?" (I've probably done the quotation marks wrong). Anyway, I saw one of the comments by one Tiffany Morgan and decided to reply to her privately.


I liked the fact that she was creating something all her own, especially that she was so young in doing so. I was probably face down...I mean, doing something else, something non-constructive, at her age. (Seriously, it's not like I'm 70 or something, so why does early 20's sound so young?)

Anyway, I thought many of us could use some good writing tips. If you're like me, you won't necessarily go looking for them. So I'm bringing right to you.

Without further ado, Tiffany Morgan.





Words are one of the few things in this world that aren’t discovered—they are entirely manmade. Because of this, those of us who love the things fight among ourselves (and with those who hate the things) to form some semblance of consistency through them, to make the words that make the world make sense be sensical themselves, to give them empirical, scientific substance when they inherently have none. So we draft up things like dictionaries, thesauruses, and style books. Few people read them, fewer love them, but everyone needs them. A typo can be easily overlooked, but not knowing the difference between “who” and “whom” or “its” and “it’s” can make the difference between acceptance and rejection, publication and dismissal, credibility and incredibility. It’s not necessary to beat yourself up memorizing the rules, but it is helpful to know at least some of the common issues our tenth grade English teachers should have taught instead of harping on the state assessment exam.

Top Ten Grammatical Errors That Make People Look Stup—Silly... .

I just received a tongue lashing from Tiffany because I tried to give her crap about the ellipsis

10. Putting quotation marks inside periods and commas – This is never, ever right. No matter what anyone tells you, quotation marks (and yes, they are called "quotation" marks, not "quote" marks) always (times infinity squared) go outside periods and commas. This rule does not always apply to other punctuation marks, however, so just memorize it for these two for now.

Wrong: "I love Twitter", she said.
Right: "I hate Twitter," he said.

9. Using "and" when you mean "to"

Wrong: I’m going to call my dad and wish him a happy Father’s Day.
Right: I’m going to call my dad to wish him a happy Father’s Day.

8. Mixing up "then" and "than" – "Then" denotes time, sequence, or addition. "Than" is a comparative word.

Example:
I’m going to school, and then I’m going to work.
She likes cake better than ice-cream.

7. "Lose" v. "Loose" – "Lose" means something is or may no longer be possessed. "Loose" means something is slack.

Example:
I don’t want to lose my job.
My shoelace is loose.

6. There, Their, and They’re – "There" refers to a place, stage, or relation. "Their" is possessive for a group. "They’re" is the contraction form of "they are." No examples here. They are seriously self-explanatory.

5. Saying "whether or not" – The word "whether" means there is an option. To say "whether or not" is redundant.

Wrong: I don’t care whether or not you like my Hammer pants!
Right: I don’t care whether you like my Hammer pants!

4. Using "of" when you mean "have" – We might say it this way, but writing it this way is a big no-no.

Wrong: You should of listened to your boss.
Right: You should have listened to your boss.

3. "Affect" v. "Effect" – People who have never learned the difference between these words generally use "effect" for everything, but I promise you: They are different! "Affect" is a verb and means "to influence," but "effect" is a noun (except when it’s a verb, meaning "to cause," but we’ll leave that alone for now).

Example:
Having the puppy in the house positively affected her mood.
The cute puppy had no effect on her mood.

2. "You’re" v. "Your" – "You’re" is the contraction of "you are," and "your" is possessive. Once again, no examples here. We can do this, people!

And the number-one-please-never-get-this-wrong-again-or-the-world-might-implode-grammatical-error-that-makes-people-look-stupid-er-I-mean-silly error is:

1. "Its" v. "It’s" – "Its" is possessive. "It’s" is the contraction form of "it is."

Example:
It’s going to be a rainy day.
The dog wagged its tail.

There are others, and maybe we’ll get to those if Chet is gracious enough to invite me back. This is by no means an exhaustive list, and I barely even began to touch on word usage, which is actually more bothersome in some ways than misusing contractions and possessives. Until then, try remembering these rules in your day-to-day activities—when writing papers, preparing memos, e-mailing, and if you want to get really fancy, texting. When you don’t have time to get it completely right, though, just get it written, and contact a professional. I’m a professional editor, and you can contact me through my website, www.WriteWordEdit.com, for an extra set of eyes or for extensive editing of pretty much anything (personal statements, essays, research papers, resumes, fiction, non-fiction, and more).

Lastly, as a general disclaimer, any errors or typos found herein are the sole fault of an early a.m. dysfunctional brain. Coffee, please?

Happy writing,

Tiffany Morgan
Write Word Edit
Founder/Editor in Chief
www.WriteWordEdit.com

Labels: , ,

 
  The Computer Setup
I get to setup my new computer.

Here's a list of tools I'm installing:

SQLDeveloper, for those moments I wanted to be able to easily download data. Great database navigator as well. I create reports here and in JDeveloper as well.
JDeveloper, though I won't be using Subversion for work, I'm hoping there is a plugin for source control that I can use. Still my favorite editor of choice.
7zip
CubicExplorer, which is a tabbed windows explorer and fairly nice.
WinMerge, always nice to be able to easily compare files.
FastStone Capture - screen grab utility. You can also add arrows and stuff to your captured images.

Firefox was already installed so I imported my JSON file with my standard links (Oracle Documentation, Google Stuff, etc). I needed some FF Add-ons though:
Meebo, which I'm trying out for the first time.
ScribeFire, for the occasional quick post.
Shareaholic, for quickly sending links out.
Delicious, naturally.

Oracle Database was already installed along with BI Publisher, so I didn't have to worry about those. I'm sure I'll have others, but these are the basics.

Labels: ,

 
  La Revolución ha Muerto
For me anyway. I am moving along.

I will certainly miss all the friends I made and miss the opportunity to work with some very, very smart people. I wish I could have stayed, especially after the announcements yesterday (here, here, here, here, here, here, and here).

Bradd, this is not an April Fool's Joke. ;)

I guess the good news is that it wasn't involuntary. Will be added to the Tampa Timeline.

I start a new job on Friday.

Labels: ,

 
  Keep it Down
I've tired (for the moment anyway) of adding Part II, III, etc. to the titles. So I'm going with a whole new name.

This is a followup to last week's post, Shut Your Mouth! In the comments Niall Litchfield (love the hair!) left a link to a brilliant article, Unskilled and Unaware of It.

I know I have read that or a summary of it at some point in the last few years.

The summary of the article reads:
People tend to hold overly favorable views of their abilities in many social and intellectual domains. The authors suggest that this overestimation occurs, in part, because people who are unskilled in these domains suffer a dual burden: Not only do these people reach erroneous conclusions and make unfortunate choices, but their incompetence robs them of the metacognitive ability to realize it. Across 4 studies, the authors found that participants scoring in the bottom quartile on tests of humor, grammar, and
logic grossly overestimated their test performance and ability. Although their test scores put them in the 12th percentile, they estimated themselves to be in the 62nd. Several analyses linked this miscalibration to deficits in metacognitive skill, or the capacity to distinguish accuracy from error...
As Niall suggested, try to read it self-critically.

I think I know when I don't know...but I'm sure there have been plenty of occasions where I thought I knew but I really didn't. I'd also like to think that I don't do this any longer, that it was a fancy of youth, but I can't be so sure. Most recently it would have been in the consideration of building out a highly scalable system.

Anyway, have you ever worked with someone so described? If so, how did you go about dealing with it? Did you make an effort to teach or give "negative" feedback so they might learn? I'm thinking every domain (IT, Financial Services, etc) has those that fall into this category? How do you fix it? Can it be fixed?

Labels:

 
  Shut Your Mouth!
Those of you who know me, know that I have a tendency to talk a bit. I've been counseled by many (wife, friends, co-workers, etc) to keep my thoughts to myself but I still have a "problem" with it.

I've been known to send out emails late in the night to my CIO...only to do the same exact thing a couple of weeks later at the start of a holiday.

Just a little advice here, if you do decide to do something like this. Don't do it on Friday night where you have all weekend to think about whether or not you should have sent it. Especially don't do it on a Friday night if you have Monday off too.

Starting a blog helped, a little. I could scream out into the nothingness that is the 'tubes. There wasn't as much back and forth as I would like though. It's gotten better over time as more and more people read this blog, but nothing can replace that instant gratification of a healthy discussion.

And healthy are the ones I am talking about. I don't (necessarily) mean that I just talk to talk. I have opinions on just about everything software related. Architecture. Design. Style. Best Practices. Performance. I'm even worse when it comes to databases. I think I have a pretty good grasp of how to model data. I've been creating diagrams since before I became an IT guy. I understand when it is good to normalize and when it is good to denormalize.

I am very passionate about what I do. I love what I do. Every other week I get a paycheck and I'm stunned that someone pays me to do this.

You know what, if they're gonna pay me all this money, I'm not so sure they want me to keep my mouth shut.

The usual caveat: When a decision is made, with or without my input, I will keep my mouth shut about it. Either I accept the decision or I start looking for other work...that's my decision to make. But I won't be that guy who keeps arguing the point long after. At least I try not to be, I ain't perfect.

It also goes without saying that not all people are equal in a discussion. Some have strengths that others do not.

I think a good discussion can lead to better products. There is plenty to be learned through good discussion. A multitude of view points can force you to reconsider your own position; possibly strengthening it for future debate or forcing you to abandon that idea.

How could that ever be bad?

Not everyone feels the same way of course. Not everyone likes these types of discussions. Either they feel that it's not my place to disagree (i.e. I'm not qualified) or they just don't like being challenged. If my boss says stop, I stop. If a peer says stop I'll ask why.

So, do you know how to keep your mouth shut? Any good stories of how it went bad? or good? Please share...there's much to learn from the discussion.

Labels: ,

 
  April Fools!
Suffering from a bout of writer's block I impulsively decided to post that I had lost my job again. I figured it would be somewhat plausible given my recent past. I think it worked, a little. I realized that I did tag it "funny" but left it on there. Notably, Gary caught it.

I did email Lewis and Dom privately to tell them I was being funny. Bradd caught it himself going so far as to delete his original post.

I started to worry about jinxing myself, you know, the self-fulfilling prophecy sort of stuff? One way or another, it's out of my hands. It was funny to me at least. I think Jake chuckled a little bit but didn't want to acknowledge my small prank.

I was paid back by LC when I got home...he popped out of the bushes and scared me. Followed by another sneak attack shortly there-after.

Happy April Fool's Day!

Labels: ,

 
  Not Again...
Seriously...could I have a worse year?

I've been laid off again!

I'm starting to get a complex...
Mr. Justice,

Due to the economic downturn...yada yada yada

Labels: ,

 
  Cisco Fatty - A Cautionary Tale
For those of you who don't know, last week a young woman interviewed at Cisco and shortly after leaving published the following tweet:
Cisco just offered me a job! Now I have to weigh the utility of a fatty paycheck against the daily commute to San Jose and hating the work.
Needless to say it wasn't the smartest thing in the world to do.

Since I have some experience in the matter, I figured I would chime in.

Last year, about this time, I blogged about WellCare's layoffs at the time. Looking back I find it...funny? that I didn't know better. Despite people telling me not to do it. Maybe I was just stubborn. Anyway, I blogged it and in less than an hour it came across my Google Alerts, along with everyone else in the company who had set up Google Alerts for WellCare. Oops.

I removed the post that afternoon when my VP gave me an earful and the rest is history. My contract was terminated the following Tuesday when I returned to work.

With Twitter it's even easier though. There's an illusion of privacy I think, especially for those who don't truly understand the social web. I didn't completely understand it, or what the consequences could be. Perhaps I did though and just didn't care. I still wrestle with that. I'm not proud of the way it went down, but it's in the past now.

That said, I think I took responsibility for my actions. I have expressed regret here and in interviews. I don't blame anyone but myself.

@theconnor though seems to be taking another tact. While stating
it was crass of me to say what I did and I take full responsibility for the stupidity of my action.
she then goes on to talk of the impact of Twitter and that people don't really know what it is or what it's affect will be. Really? What about the people that have been fired for blogging (ahem)? What about the people that have been fired for posting on Facebook?

I think she was on the right path with her decision to post, but I don't think she goes far enough to show she's learned from it. She had a golden opportunity to redeem herself ever so slightly, but she didn't. Humility in this instance would have gone a long way in her future endeavors.

Update
Hat tip to Jake

Labels: ,

 
  Fun with Deployments
I'm sure many of you have had deployments such as this, but it was my first.

The day started at 2:00 AM. Joy.

In the office a little after 3 (40 minute drive) and the place is bustling. There are about 10 people in the office already (we have 50 employees) and 2 on the phone.

Mr. DBA had a whopping 1 hour of sleep.

I managed to get about 4 as I just feel asleep putting LC (not Lewis Cunningham, Little Chet) to bed.

To summarize the deployment, massive changes to our core OLTP system which needed to be propagated to the BI/DW environment. We started meeting/planning for this back in December as downtime was required.

As part of the preparation, a code freeze was implemented last week as well as a deployment (fixes/patches) freeze.

Before leaving yesterday, I disabled the production OLTP jobs that would run during the deployment window. I then disabled all jobs on the BI/DW side.

Just before deployment of the database changes, Mr. DBA created a restore point.

We set up a 2 hour window to deploy and validate. Deployment of the database changes took about 15 minutes. Validation took a little over an hour. Once the call that we were backing out was made, I began work on the BI/DW side.

I had DROPped, ALTERed and CREATEd about 200 objects. Everything went smoothly (3 or 4 practice runs). I turned all the jobs back on.

I then began copying the 187 OBIEE reports that were affected over to the production environment. I know there are better ways, or at least I've heard of them, but I was going with what I was sure of. Copied the old reports to a new folder and began replacing them.

Once I was done with that, I went through my checklist of changed reports to make sure they were working (at least from a functional standpoint). Nine of them were still broken. I made fixes to those and moved forward.

I then fixed and validated our Financial reports because we have a daily 11 AM deadline.

I did however forget to include a few grants from objects I DROPped and reCREATEd. I fixed a few of them in the morning then notified (and apologized) the business that they may have issues copying the Oracle (we don't really have any others) DBA group of the objects that may be affected.

My piece from start to finish took about 4 hours. I was done* by 9.

Had lunch with my parents (they bought!) and brought them back to meet everyone. I was laughed at (nothing new there) for bringing them in. I think my Mom cried too (might be an only child thing or the fact that it took me 10 years to graduate from college so she thought I would be a lawn man forever).

I'll still have work to do on the reports as the Business folks begin to validate, but overall it was a big win. The planning and implementation on this deployment was excellent and I was proud to be a part of it.

Labels:

 
  Using Twitter...
I've been using Twitter for a little over a year now.

Initially, I didn't really get it. I was just trying it out since many of the people I read were using it. After that initial post, it was 3 months before I used it again. The 3rd time was 2 months after that.

From my timeline, I started to really use it at the end of July after I was laid off at the behest of Jake. He suggested using it to search for jobs. Though I didn't find any that matched up well for me, it was my breakthrough.

Last month I broke the 1000 tweet milestone.

I've used Twitter to search for jobs, to meet new (Oracle) people, to ask questions, to scream from the rooftop and other things. I try and encourage others to use it as well, most recently my colleague @serge_a_storms.

It's a great way to ask questions too. A couple of weeks ago I posted a question asking for scripts to download source. @neilkod reminded me of DBMS_METADATA and I was off. I really use to love the OTN Forums participating heavily in the Application Express forum. I like this medium a lot better though. Just a quick tweet and I can get answers or pointers from a multitude of people. I don't think it replaces the forums just yet, but I like it.

Probably my favorite part of it though is the "screaming from the rooftop" effect. @crisatunity seems to have taken this to a new level recently which is quite amusing. What do I mean by screaming from the rooftop?

You know those times you are going through thousands of lines of code and you see something stupid? You want to scream right? Tweet it. Goes without saying though it is public and will stay around forever...but it's fun. Sometimes you'll get sympathy from others, sometimes you'll get crickets.

Have you tried it out yet? What are your thoughts on it? If you do use it, do you blog as well?

Labels: ,

 
  Developing a J2EE based SOA Architecture
No, I haven't gone to the dark side.

I just figured it would be best to know my enemy. ;)

Tonight I went to the Tampa JUG (no, it's not a code word for the local strip joint so stop laughing), or, the Tampa Java Users Group. The guy that runs is the the not so infamous Mr. V, from Application Developers vs. Database Developers Part II. I also got to meet/see some former WellCare colleagues as well (hi everyone!).

The presentation was done by Kevin Barfield from JBoss.

Interesting tool which incorporates (I think I'll get this right) the JBoss server, BPM and just about anything else you can imagine. It also included an overview of the Enterprise Service Bus (ESB). That's also a new file type that you can load (as opposed to .ear, .war, etc).

Overall pretty cool stuff, but I really can't put it into context. I'd have to monkey around with it for awhile before I could truly understand what to do with it.

Anyway, that was my trip on the dark side. Not a whole lot of fun but an opportunity to expand my horizons.

Labels: ,

 
  What's My Purpose?
No, not as a person. I kind of know that one; father, husband, son, etc.

I'm talking about my chosen career.

Software Developer, Database Developer, DBA, however it is that I am defined professionally.

What is my purpose as one of those?

I bring this up because I had a great conversation with a friend over the weekend. In discussing all things geeky, he said, "My job is to eliminate the need for me."

That's a paraphrase of course because I believe beer was involved during this discussion.

I about jumped out of my seat though. I had never heard anyone (to my knowledge or memory anyway, though my old boss may jump in and remind me) utter those words. I have uttered those words (but not to my wife apparently, as I called her almost immediately) before. I have said them in interviews, in discussions...but never here.

"My job is to eliminate the need for me."

Indeed.

I strive for that...to build a system that requires virtually no support. I am nowhere close, but I strive for it.

What other role do we serve but a support role (unless we sell software)? IT in just about every instance is a cost center right? We are there to support the business side of the house do their job more effectively and more efficiently. Nothing more, nothing less.

We aren't there to build systems that will require constant care. We aren't there to ensure we have a job in the future. We're hired to build the best application possible and get out of the way.

Of course, there are many factors in our way for doing so. Poor business requirements is probably the number 1 reason. If the business can't describe how can we build it?

The upside of eliminating the need for us is we can move on after a couple of years. We can demand more money up front as they won't need us for 5 or 10 years (still don't know how to sell that one). The idea remains the same though...

So then, how do we build software that will obviate the need for us? I still don't know...but if you do, feel free to comment.

Labels: ,

 
  Ubuntu Installation Update
I finally managed to seriously try a non-windows OS recently.

To update, I have installed it on 4 machines at home. They are all still in dual-boot mode as I haven't completely figured out how to get rid of Windows without screwing everything up, but 2 of the 4 now default to Ubuntu. It's progress right?

Machine 1:
Dual Xeon Pentium 3 Processor with a speed of 1.6 Mhz (is that right?), 512 MB Ram. It's an old Dell Dimension 530 workstation that I bought on EBay. After installation I quickly realized that the graphics card (Diamond FireGL2) was incompatible. Joy. So I'm currently debating whether to get a newer, compatible graphics card.

Machine 2:
IBM Thinkpad (can't retrieve the specs at the moment). 256 MB Ram. This is my son's computer (he's 6) and the initial inspiration. It was old, had the remnants of corporate security on it, and was a perfect test subject for my trials.

I still haven't been able to get the internal wireless card working (Intersil Prism 2.5), but I did have an old Linksys PCI card lying around, so there is internet access. Tonight I was trying to diagnose the reason for no sound and apparently messed something else up in the process (hopefully I'll learn something from all of this). The latest error on restart was of the GDM variety, though I can't recall it specifically.

Machine 3:
Dell Inspiron 4300. P3, 1.8 Mhz. 512 MB Ram.
This has been my work-horse for the past 7 years. Over the last 2 or 3 though, I've used it mainly to work remotely. In the beginning, I had JDeveloper (9 I believe) and Oracle 9i Server running on it at the same time. That was painful. Overall it seems to run just fine with Ubuntu. Though I probably won't be doing any performance testing (Oracle) with it soon.

From oraclenerd

Machine 4:
Dell XPS, T5350 (I think) Dual Core Processor. 3 GB Ram.
This is my main "work" computer and has Windows Vista installed on it. I installed Ubuntu (dual, default is still Windows as it's shared) last week. Downloaded JDeveloper 11i (.bin file) and managed to install it successfully (w00t!). Next up I want to install Oracle 11g Server using this post as a guide (thanks Mr. Norris).

Performance on this machine rocks. Vista out of the box took up 1 GB of Ram. Ubuntu is running at about 400 MB. I have had no problems on this machine and look forward to learning more here...

From oraclenerd

And if you've got any resources you can link up for me, please do.

Labels: , ,

 
  What a Life...
Saturday afternoon I had scheduled to go golfing (I'm not a regular golfer) for a friend's bachelor party (believe it or not, no strippers). Saturday morning wifey was sick so I decided to cancel the day of golfing (drinking). For weeks I had also planned on attending the Museum of Science and Industry (MOSI) Tweetup Saturday night. Since wife was sick and there was a second event, dinner, I opted to go see my friend and celebrate with him.

My friend is a former teammate from UF (Go Gators!). Of the 8 people who attended, I was the only one not a high school (or further back) chum.

Anyway, one of his high school friends (and teammate) was a guy who played 12 years in the Big Leagues (MLB). He retired 2 years ago.

Me:
"So, what do you do now?"

Him:
"I chase my kids."

Me:
"Wow"

35 years old and his job is to chase his kids. How sweet is that? He never has to work a day for the rest of his life. I wonder if I had been fortunate (read: talented) enough to play MLB if I could handle doing "nothing" for the rest of my life? I couldn't imagine it now...I work almost non-stop. Either for work or just learning something new. Doing "nothing" would probably drive me nuts.

What about you? Could you retire at 35 or whatever your current age and do nothing?

Labels: ,

 
  2009 New Year's Resolutions
I was tagged by @crisatunity here, so I'll do this. Hopefully The Curmudgeon isn't reading...

These are professional resolutions, not personal (I'm fat, so guess what #1 is on that list).

1. No brainer here. Go the entire year without losing my job. If I leave voluntarily, that doesn't count. I'm just shooting for no firings, no layoffs and no furloughs.
2. Become proficient in OBIEE. I've been given a second chance so to speak. Our DW guy decided now would be a good time to start his own consulting company and I am the lucky recipient of his job. Bonus: Datawarehousing is all the rage. OBIEE is a great tool to have in the tool box so I consider myself lucky on more than one front.
3. Build a PL/SQL only test harness. I don't really know why, but I want to give this a go. I've used SQLUnit (and like it) and a little bit of utPLSQL, but I think there's a lot to learn here. Specifically, how to generate and run code. I've never really done that, except for a small DROP <OBJECT> script now and again.
4. Contribute something tangible to the Oracle community. So I blog, cool. I've done an ApEx presentation, sweet. I would love to be able to contribute an application (a test harness perhaps?) or some sort of library. I don't know exactly what it is yet...

Four is good enough for me this year. One will be the one I focus on most...I just hope it doesn't become a self-fulfilling prophecy. ;)

So, who shall I ask to join us? Jake has already done like 33 end-of-the-year posts...I'm sure one of them included some form of resolutions (predictions actually, it qualifies though). Here we go:

1. Bradd Piontek || (twitter, blog)
2. Don Seiler || (twitter, blog)

I've paired those 2 guys together because I'm pretty sure they know each other. Watching them on Facebook and Twitter go at it keeps me laughing all day. For instance, tonight on Facebook Bradd posted a picture of him drinking something out of a brown paper bag and asking the community to guess what he was drinking. Mr. Seiler said something along the lines of "shame and disappointment?"

3. Dan McGhan || (twitter (loser), blog)

Dan was my "co"-presenter in September on ApEx. I made him do the whole thing, mostly because he heckled me (i.e. answered all the questions) in my first presentation.

*No drinking went on during the writing of this post.

Labels: , ,

 
  Countdown Timer Part II
Once before I had a countdown (well, countup) timer to mark the time since my last production incident (one where I screwed something up). It was a way to poke fun at myself but also a steady reminder to be careful.

In that vain, I've created a new one marking the consecutive time I've been employed! As noted in my previous post, I've had difficulty holding on to jobs this past year. Three times in fact. Fired once, laid off twice and brought back twice (by the same company).

Here's to not having to reset this effin clock in 2009!

Cheers!

Labels: ,

 
  This is the LAST time...
On Friday I was furloughed...and today I was invited back. I start tomorrow.

Wow is really all I can say. Perhaps I should write a book or something? These past couple of years certainly qualify as book worthy. :)

Labels: ,

 
  The Tampa Timeline
I moved to Tampa a little over two years ago. To say it's been hectic would be a gross understatement. Here's the events myself and my family have been through in that short time:

November 27, 2006 - Begin work at WellCare as a contractor.
December 2, 2006 - Closed on Gainesville house
December 17, 2006 - Purchased Tampa house
December 26, 2006 - Rolled into a fulltime position at WellCare in the Datawarehouse group
January 4, 2007 - New CIO announced at WellCare
April 21, 2007 - Kate gives the Reaper the finger
Summer 2007 - Awarded on-the-spot bonus, only to be *PIPped 2 days later
August 6, 2007 - Sent a "manifesto" to my CIO
August 14, 2007 - Started this blog
October 24, 2007 - FBI Raids WellCare with 200 agents
January 26, 2008 - CEO and CFO resign from WellCare
April 24, 2008 - Gave my first professional presentation on Application Express
May 22, 2008 - I write a short statement on my blog that WellCare is doing layoffs
May 27, 2008 - I am fired from WellCare, with cause, for posting company "confidential" information
May 28, 2008 - My wife officially takes over as my blogging editor
May 31, 2008 - I get my official offer from Revolution Money as a contractor
June 15, 2008 - My paternal Grandfather passes away at 89
July 27, 2008 - I'm let go from Revolution Money
August 29, 2008 - My wife's maternal Grandmother passes away at 94
September 2, 2008 - I start as a fulltime employee at Revolution Money
September 24, 2008 - My wife's maternal Grandfather passes away at ~95 (no one knows his exact age)
December 26, 2008 - I'm furloughed from Revolution Money
December 29, 2008 - I'm asked to come back to Revolution Money.
April 8, 2009 - I resign and am then escorted from the premises.
April 10, 2009 - I start my new job.
October 16, 2009 - I get fired let go again.
November 3, 2009 - Became an Oracle ACE

What have I learned in this time?
1. Don't go into the office. If you boss says he needs a word, say you have to go to the bathroom and run for your car.
2. Leave early. If layoffs are coming and you aren't there, they can't let you go!
3. Don't check email while on vacation.
4. Life is rough sometimes, but you have to roll with it.
5. Have fun. We spend more time with those at work than we do with our families. Enjoy yourself while you are there. I got to play ping pong everyday (after 5 naturally) at Revolution Money with my Arch Nemesis. I won two times...out of a thousand games. But it was fun.

*Performance Improvement Plan

Labels: , ,

 
  Looking...Again!
Not once, not twice, but three times in one year!

So if you know anyone who needs an ORACLENERD, forward them on!

Thanks.

Labels: , ,

 
  Random Things
The best how-to on the SQL MODEL clause, by Duke Ganote.

I've been trying most of the day to PIVOT a query based on monthly buckets (up to 7). It's driving me crazy. I haven't been able to get it going with Analytics and that's what led me back to Duke's post.

I'm co-presenting Application Express at the SOUG meeting with Dan McGhan. Dan graciously helped out when I stumbled last time. You can get directions and sign up here.

I'll be doing more of the backend (why does that always make me giggle?) stuff and Dan will be showing off some of the cool front end stuff (customization, javascript plugins, etc).

By the way, I found out at the DBA 2.0 one day conference that we were presenting. That was funny.

I like twitter now. Jake suggested using it to search for jobs during my recent stint of un-employment...I like the "micro-blogging" thing.

I did get my old job back last week. They (thankfully) were able to move the start time up a month. I get to do some testing as part of the deal.

I do miss home though. It was nice hanging out with my wife without having to always rush through conversations. Being around the kids (before school started) was fun too. I have never been able to enjoy my time because I'm always thinking about some problem...since I had no job I was released from that burden.

The Wii is gathering dust, kind of. I did score a 184 on tanks (Wii Play) last night. I also miss my afternoon naps...

But I'm thankful to have a job again. Lots to do...

Labels: , , ,

 
  Day 15...
So I think I'm going through the Depression stage of The Five Stages of Grief. Actually, I don't really follow that (in order anyway). I think I have 2 stages of Acceptance. I Accepted the situation as it was on the same day (maybe that was numbness?). I just thought things would work out sooner than they have. No worries though, I'll bounce back soon enough!

I've had three interviews so far. The first (consisting of two) was for a data architect position with a local company. I was referred via a friend. I received word last week that I did not get it. I had a little hope that they might give me a go, but out philosophical differences were too great. Essentially, I'm a data-centric person, they were more software (MVC) oriented. I don't think the two positions are mutually exclusive, but I couldn't sell them on it. A bit of religiousity there I think.

Second was a phone interview for an APEX position in New York. One, I would have been able to go to New York for the first time and two, I would be working with APEX again (consistently anyway). I got bumped because I don't have experience with web services. The extent of their web services was the authentication. Isn't it just like calling a function or something? Seriously, how hard could that be? Anyway...

Third was today. Went pretty well I think. I'll know more later this week.

My sleeping habits have gone to shit. My son got a Wii for his birthday last month and I stay up until all hours playing. I bowled a perfect game tonight in fact! This is why I haven't played video games since Intellivision.

I'll end on a good thought. Today was the first day of school for both the kids and when I got home, I got a rousing ovation from them (always nice). We've had a great time the past couple of weeks.

So I lay down for a nap...and you know when you go to relax your body so you can sleep? I relaxed my facial muscles (I have a tendency to grind my teeth), I realized I was smiling...very cool.

Labels: ,

 
  Tampa - Employment Resources
What else would I be writing about?

If you're ever in the Tampa area, here are some resources you can utilize to find a job.

Consulting Agencies

Veredus
TekSystems
Tech USA
Sun Personnel
Rita Technology Services
Stradis

Job Sites

Employ Florida - My father sent this one to me yesterday. Very good.
(The obvious ones)
Dice
Monster
Career Builder

If I think of anymore I'll add them here. If you know of any others in the area, leave 'em in the comments.

Labels:

 
  Oracle Jobs in Doral (Miami), FL
Trying to help someone out. Wife won't leave (permanently) to Miami, so I'm out of the running. Number of positions on the left, short position description on the right.

Contact me either through comments or email (chet.justice at gmail) and I'll give you the contact information of the recruiter.

1 Oracle Fin Apps 11i Financials Functional need (core modules)

6 Oracle PL/SQL Developer needs w/ FinApps experience

2 Lead PL/SQL Developer needs w/FinApps

4 Oracle Reports 6i Developer needs

2 Lead Oracle Reports 6i Developer needs

2 Oracle Discoverer needs

Labels: ,

 
  How to Find a Job
My job search is going. I had an interview last Friday and I have a follow-up tomorrow. I've got a few other leads, but nothing as concrete.

Last time I "lost" my job, I was prepared and was working within a week. I've been able to explore different ways to search for jobs this time as I was taken by surprise.

Here's a rundown of how I'm currently looking for work:
1. Twitter - Jake over at AppsLab suggested creating a feed on the "oracle" keyword. Sure enough, I've seen 5 or 6 job postings.
2. LinkedIn - Trolling my connections and others (again, suggested by Jake)
3. ORACLENERD - Nothing's come of this one, but I'm hopeful that someday in the future it will work for me. At the very least, it gives prospective employers insight into my thinking.
4. craigslist - I've found 2 or 3 jobs postings through here.
5. Friends - I've been fortunate to meet a lot of people in the Tampa Bay area. Despite my firing I've still got a decent reputation around town.
6. CareerBuilder - Goes without saying.
7. Monster - Still works.

One thing I have noticed is that my hits go way up when I lose my job. I'll accept a low hit count if it means I can keep my job!

Special thanks go to Tom, Jake, LewisC, Frank, Dodd, and Ray. If I left you off, it wasn't on purpose...there's just been so much going on.

Labels: ,

 
  I Found a New Job!
http://www.foxnews.com/story/0,2933,395181,00.html

My wife thinks I'm perfect for it!

Labels: ,

 
  Don't Go Into the Office
Whenever my boss asks me to come with him...I will politely tell him I'm not going.

I was laid off yesterday.

I want to see how many jobs I can have in one years time apparently. I didn't undermine myself this time though.

So if you know of anything in the Tampa Bay area, please let me know.

Labels: ,

 
  Revolution Money Seeks Senior DBA
Here's your chance to work with 11g RAC.

Either email me (chet dot justice at gmail) your resume and I will pass it along, or drop me a line and I will provide you with the appropriate contact information.

Here are the details:

JOB SUMMARY

As a Database Administrator with Revolution Money Inc, you will be responsible for all aspects of administration and the deployment of the various database components of our products. Major duties are to include installation, configuration, integration, tuning, troubleshooting and support.

Joining our team means you will have the opportunity to implement and use advanced features such as clustering and replication. We operate in the following environment: Linux; Oracle 11g RAC on ASM with Oracle Data Guard and Oracle Streams; 7 x 24 on-call support.

DUTIES & ESSENTIAL JOB FUNCTIONS
• Responsible for 24X7 production support.
• Install and maintain Oracle servers and service pack deployments.
• Manage security of application access to databases.
• Facilitate root cause analysis on database issues.
• Maintaining database performance by developing tuning methodologies.
• Perform backup and recovery.
• Assist database development environment and life cycle within the organization using best practices to ensure the benefits of standardization, documentation and change management.
• Providing information by collecting, analyzing, and summarizing database performance and trends.
• Research, planning and implementation of database upgrades and patches.
• Maintain technical documentation relating to database management.
• Perform benchmarking analysis to properly size hardware platforms.

OTHER FUNCTIONS AND RESPONSIBILITIES

Assist our internal customers running Oracle Database products including Oracle Applications.

QUALIFICATIONS

Required:

• A Bachelor's Degree in computer science or equivalent is required along with 5+ years experience with Oracle as a DBA.
• Production experience managing and monitoring Oracle 10g RAC databases.
• Oracle OEM/Grid Control, RMAN
• Strong PL/SQL , UNIX Scripting, Perl
• Solid Linux/UNIX and networking experience.
• Must be highly motivated, and a quick learner.
• Strong interpersonal skills and the ability to work well in teams, as well as working within a fast-paced, dynamic environment are requirements.

Desirable Skills:

• Oracle 11g RAC databases
• Oracle Streams
• Oracle BI/Data Warehouse, Oracle Financials, OID, OWB

Labels: , ,

 
  Process
I read The Daily WTF, well, daily. On Thursday last week, there was a good one on process. Essentially, the entire process had to be followed when an error occurred at boot. F1 would have solved the problem immediately...

My first job I never really got to put anything into production, so I wasn't real familiar with it. My second job, I was the lone ranger, so I did everything myself (though I did not do development in production). My last job however, was full of "The Process."

Rightfully so, especially in a large environment (i.e. more than 1 developer), though I think it was a bit overdone. And up until one of my failed deployments, the deployment itself was done through the Change Request (CR). What I mean by that, is that the code was attached to the CR itself. Since I attached a newer version, which had not been QA'd, well, you get the picture. We finally moved to a system whereby the DBAs actually deployed from our source control system...thankfully.

Now I'm in an environment that's a mix between the last job and the second to last. Everything is QA'd, but there isn't this whole process surrounding deployments...yet. Fortunately we're small enough to deal with it.

What's the point? I'm not sure.

Perhaps it's that I've learned more what not to do from The Daily WTF...

Labels: , ,

 
  Corporate Life III
See Part I and Part II.

In Part I of Corporate Life, I said:
It feels like I've experienced about every event I could have imagined:
1. In January of 2007, a new CIO/SVP was hired and promptly restructured (replaced the VPs) the IT department.
2. In October of 2007, we had a nifty FBI raid.
3. January of 2008, we appear to be losing our CEO, CFO and General Counsel.
prodlife then mentioned that I hadn't experienced layoffs.

Four months later I did, on May 22, WellCare laid off 208 employees. I blogged it. I was fired.

I'm up to five corporate experiences.

I'm still missing the merger/acquisition and the IPO. Anything I'm missing?

Labels: ,

 
  Long Live the Revolution!
Revolution Money that is...

I'm no longer afraid to at least say that, though if you had checked out my LinkedIn profile, you would have seen it.

Revolution Money is a startup company described as "PayPal meets MasterCard" without the fees. Among the board members are:

  • Steve Case, founder of AOL

  • Ted Leonsis (here and here), among other things, he is the current owner of the Washington Capitols

  • Larry Summers, former Secretary of the Treasury

There are a couple of other board members, but those are the ones that I know of off-hand.

So far I am extremely happy, though I don't really know how to deal with the distress that is no longer there. I suppose it will wane with time...

Everyone I work with seems to be amongst the best and brightest which is pretty cool. My view (pictures coming soon) is pretty awesome. Relaxed environment (think casual Friday every day). The CEO brings his dog into work...

I should have the opportunity to learn quite a bit here.

Labels:

 
  I've Got a New Job!
Woohoo!

(Internal Dialog)
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.
I will talk to them before writing anything about them.

*This post was approved by my wife. ;)

Labels: ,

 
  Blogging Safely Part II
Man, I just have too much time on my hands.

I've debated whether I should write about the specifics of my termination. Yes. No. Yes. No. Alright, no.

After counsel from a few fellow bloggers (how cool is that? A built in support group!), I've decided against it. If I were independently wealthy (read: not dependent on a salary), I might.

I am also trying to take the high-road, trying to have some class I guess.

The more I sit around the worse I feel about it too. It is/was a humbling experience.

Yes, I was ready (and looking) to leave. But to be walked out of the building is not fun (though many thought I was just playing another prank). I wish it had not happened that way.

I do have my own opinions and I will voice them, but when a decision is made, I usually just shut my mouth and either live with it or look for a new job (if I totally disagree). Many people view this as arrogance I believe. That I am not open to new ideas. That is most definitely not the case.

(can you say rambling?)

So, if you blog and haven't read my previous post on Blogging Safely, do it now. Something good must come out of this.

Discuss blogging with your employer. See if they have guidelines on blogging. If not, err on the side of caution.

Thanks to everyone for your support. It reminds me of the support I received last year at this time when my daughter fell ill. Now I have a virtual family!

Labels: , ,

 
  Blogging Safely
Jake from AppsLab left a link in the comments to my previous post, Lessons Learned. The link was to an article about Mark Jen, who was fired from Google after 11 days for blogging.

It got me curious as to what was out there, so below is a list of links that point to either "safe blogging" articles or those that were fired for blogging about their company.

Lessons Learned From Google Blogger Who Got Fired - 5 lessons here. #5 is, "Don't make the same mistake twice."

Of Blogging and Unemployment - a former Microsoft employee gets the sack.

Delta employee fired over blog sues company

Fired simply for having a blog

Beware if your blog is related to work

Have a blog, lose your job?

Avoid getting fired for blogging

Warning: Your clever little blog could get you fired

How to Blog Safely (About Work or Anything Else)


Or you can just google it.

Back to lessons learned, I'll speak with management or HR at my next company to see if they have guidelines. If not, I'll err on the cautious side and not mention anything.

Labels: , ,

 
  Lessons Learned
I was let go yesterday. Many thought that it was another one of my pranks...which was funny. Following are my lessons learned from my time there:

1. Get express written permission about what you can (if anything) and cannot blog about.
2. Not everyone is your friend.
3. Not everyone will like you...just because.
4. Some people will not hesitate to throw you under the bus.
5. Big companies might not be the place for me.
6. Big companies are full of many motivated and talented people.

I learned a great deal in the year and a half. My family and I moved from Gainesville to Tampa and it was the best decision we've made so far.

I was exposed to data warehousing which was a challenge to say the least. To spend a week trying to figure out the best way to move data was an interesting exercise.

I was exposed to big company politics which was fun.

Overall my experience there was positive. I learned a great deal both personally and professionally. I met and hope to retain many good friends and I will miss all of them dearly.

Labels: , , ,

 
  Socially Networked Employees Are Better?
Here's one for Jake from AppsLab.

Apparently one person has equated the Social Networking to performance in the [IT] work-place.

I thought it was a pretty good article. I would hope that I am one of the people that others choose to go to, but I'll probably never know.

Labels:

 
  Oracle at Home: The Results
Almost 70% of you responded that you do not have Oracle installed at home. That was a bit of a shocker to me.

I figured that it would be the other way around; people who read blogs, Oracle blogs specifically, would be more likely to have Oracle installed at home.

So, why not?


Create polls and vote for free. dPolls.com

Labels: , , ,

 
  Validating a Process
I mentioned sometime back that I would be posting the code. I can't post the entire set of code but I can post the relevant parts.

Problem


Inbound Remittance Advice files are loaded into our Operational Data Store (ODS). We have absolutely no control over this, it lies with another group. On occasion, those files are double, or even triple, loaded.

Goal


To provide the business (and ourselves) with a way to track when files came in and if the entire processed worked as expected (no lost dollars, no lost record counts).

What do we do?


1. Read the files when they first come in (on disk).
2. Query the appropriate tables at certain intervals to verify it matches the file amounts.
3. Load those results into a table and then fail the normal load process if we detect any incongruities.

Solution (proposed)


1. Create a directory object on the Oracle server.
2. Copy inbound files to that directory.
3. Read files from that directory (Java anyone?)
4. Load files into CLOBs (so that I don't have to spend half my day finding the damn things, simple APEX app and I'm good to go).
5. Parse files to find relevant information (Java)
6. Query tables at various stages, blah blah blah.

Solution


Since the UTL_FILE doesn't have a function to read the contents of a directory, Java comes into play. I've done it before and I found the code originally on asktom (where else?).

For those of you too lazy (like me) to click the link, here's the important stuff:
snip...
File file = new File( path );

list = file.list();

for ( int i = 0; i < list.length; i++ )
{
File indvidualFile = new File( path + list[i] );

if ( indvidualFile.isFile() )
{
element = list[i];
statement.setString( 1, element );
}
}
snip...
Since I'm using Java, I might as well use the StringTokenizer, makes like so much easier. But wait, since I'm reading it as a CLOB (and not a String), what do I do? I tried clob.toString(). Nope, it's just a pointer to the actual CLOB.

I have to use Reader and CharacterStream, getting well beyond my knowledge of Java.

With the help of a fellow Java developer, I was pointed towards StreamTokenizer which works in a similar fashion to StringTokenizer, or so I thought. Apparently StreamTokenizer is one of the lower level classes...so I had to figure out the ASCII values of the character I wanted to split on (a tilde: ~). I think my Java friend was surprised I figured this out...

Reader characterStream = clob.getCharacterStream();
StreamTokenizer stream = new StreamTokenizer( characterStream );
stream.resetSyntax();
stream.wordChars( 32, 125 );
stream.parseNumbers();
Fun.

After I got that as a String, I could then use the StringTokenizer, which I knew.

Could I have split the CLOB using PL/SQL? Yes. Did I want to? Not really. I was already using Java so why not just use the Tokenizer?

The five classes were jarred and loaded into Oracle via the loadjava command. Wrap it all up in PL/SQL and life is easy!

PROCEDURE get_directory_contents( i_directory IN VARCHAR2 )
AS
LANGUAGE JAVA NAME 'com.hmocompany.dw.LoadFileNames.getFileNames( java.lang.String )';

Labels: , ,

 
  It's a Matter of Time
I've been thinking a lot lately about my recent failed deployments.

How did I get so sloppy?

I'm not one to make excuses, but I would say there are some mitigating circumstances at least. Time being one of them.

So I got out my trusty calculator (SQL*Plus), and ran the numbers.

From August 26, 2007 through March 30, 2008, I've worked 1802 hours. Of that, 118 were PTO or holiday, which brings the total down to 1784. For perspective, a work year of 8 hours per day comes out to 2080 hours a year.


VAR HOURS NUMBER;
EXEC :hours := 1784

1 SELECT
2 ROUND( ( :HOURS / 2080 ) * 100, 1 ) per_of_tot_year_hours
3* FROM DUAL
ETL_WRK@ORA10GR2>/

PER_OF_TOT_YEAR_HOURS
---------------------
85.8

Cool! Only 86% of my hours in a little over 6 months!

Obviously, this is not a good thing.

Further breaking the numbers down:


VAR C VARCHAR2(10);
EXEC :C := '26-AUG-07';

SELECT
start_day,
end_day,
days_between db,
SUM( business_days ) bd,
ROUND( ( :hours / days_between ), 1 ) hpd,
ROUND( ( :hours / ( days_between / 7 ) ), 1 ) hpdw,
ROUND( ( :hours / SUM( business_days ) ), 1 ) hpwd,
ROUND( ( :hours / SUM( business_days / 5 ) ), 1 ) hpww
FROM
(
SELECT
start_day,
end_day,
TRUNC( end_day - start_day ) days_between,
start_day + rownum dayof,
( CASE
WHEN TO_CHAR( start_day + rownum, 'D' ) IN ( 2, 3, 4, 5, 6 ) THEN
1
END ) business_days
FROM
dual a,
(
SELECT
TO_DATE( :c, 'DD-MON-YY' ) start_day,
TO_DATE( '30-MAR-08', 'DD-MON-YY' ) end_day
FROM dual
) b
CONNECT BY LEVEL <= TRUNC( end_day - start_day )
)
GROUP BY
start_day,
end_day,
days_between
/

START_DAY END_DAY DB BD HPD HPDW HPWD HPWW
---------- ---------- ------ ------ ------ ------ ------ ------
08/26/2007 03/30/2008 217 155 8.2 57.5 11.5 57.5

DB = Days Between
BD = Business Days
HPD = Hours Per Day
HPDW = Hours Per Day/Week
HPWD = Hours Per Work Day
HPWW = Hours Per Work Week

The scary part is that I am not very diligent about entering my time. It's probably short anywhere between 5 and 10%.

I'm not the only one working these kinds of hours either. I know for a fact there are others.

Do you think this plays a role in my failed deployments?

Labels: , ,

 
  Failed Deployments: An Index
Since there seem to be so many now, I'm creating this index page to track them. Enjoy!

The Countdown Timer - a brief not on the origin of the countdown timer adorning my site.

Good Day to Worse Day - This is the day that the countdown timer was first started.

DELETEng an entire production table.

Blowing up the Rate Application.

Labels: , , ,

 
  Another Failed Deployment...
Just before I went on vacation I (we) deployed an application so that our finance group could maintain their own rates.

We were doing between 5 and 8 critical change requests a month, unacceptable. I fought months ago to bring the rates into the data warehouse so that we could own them and eventually build this application (in APEX of course).

So what happened?

From my perspective:
1. I was rushing so that I could go on vacation without worry.
2. I was doing support work while trying to build the application.
3. I added create_date into the composite unique key without at the very least truncating SYSDATE. This created duplicate records. This was the impetus behind my post the other day named "How do you audit?"

We performed the official root cause analysis today and here's what came out of it:
1. There is no defined or official design process.
2. No official or formal design review was performed.
3. Chet sucks!

It was a good exercise. I believe I am always open and upfront about mistakes. I welcome criticism.

Length between failed deployments: 5 days

I guess it's better to get them out of the way in that short time span. It's never fun and it's always embarrassing. Ultimately, I just have to accept it and move on.

Labels: ,

 
  WellCare Data Breach...
Great...
I haven't spoken with anyone at work about this but I was aware of the event before going on vacation. I did not know any of the particulars, only that it involved Georgia in some way.

I believe everyone works hard to safeguard patient data. The short term drawback is that it will make everyone's life that much more difficult, the long term good will be a better process (I hope).

Labels: , ,

 
  Vacation?
I've been on "vacation" since April 4th. Of course I was sick and slept most of the day. On Sunday, I took the family to Disney World. Last year my parents bought us annual passes to the Magic Kingdom so that we could all go together to get away.

I am an only child. My parents and I never had vacations, we just moved somewhere (8 times). If we did go somewhere, it was to my parents home town town for a week or two to visit Grandma and Grandpa.

Now, here's what I consider a vacation, sitting on a beach drinking Corona's with my beautiful wife (no kids) staring at the ocean. Yes, this is the Corona ads you've probably seen. Quiet. No work. Perfect.

I love the kids, but they are harder "work" than work. On "vacation," I am the pack mule. I carry everything and everyone. A friend at work has shared this story about Man's Stages of Life, I'm in the donkey phase...

I'll say it again because I don't believe my sense of humor always comes out correctly (I'm rarely serious), I love my family, my kids, but a break it is not.

Disney H5N1?


We did have a great time despite all of us coming down with the Disney version of the bird flu. Imagine a virus made up of viri (sp?) from 100 countries...that's what we all have. I'm hacking right now. I took a half day on Thursday and spent the following day with Kate at home. She slept most of the day. Kris and Little Chet spent the day at Disney's Hollywood Studios. Saturday we came home because Little Chet finally caught it. Now we're resting.

Upcoming


  • Little Chet gets a tooth pulled tomorrow

  • Pick up new Dell XPS laptop tomorrow (woohoo!)

  • Go back to work (woohoo?)

  • I'll be doing my first Application Express presentation for the Suncoast Oracle Users Group, SOUG. Actually, it's my first IT related presentation. If you can make it, please come by and laugh. More information about the presentation can be found here.

Labels: , , ,

 
  Failed Deployment...
236 Days
20 Hours
48 Minutes
30 Seconds

I hate making mistakes but I've made another one. My streak ends almost 237 days from my previous one.

Something so silly too.

In our source system, data was been double loaded somehow. So we decided on a surgical delete. A total of 7 DELETE statements needed to be run; 4 on the source system and 3 on the target system.

The source system went off without a hitch. I babysat the re-load of the source tables and was ready to have our load jobs run in our target system.

What's this? It ran in half the time?! How's that possible?

I pulled up our logs to find that zero rows were loaded into one of our tables. There should have been 45 Million plus.

I started to run down the possible causes:
1. Did the job we have in the scheduler that TRUNCATEs our persistent staging tables run? Nope.
2. Did I fail to instruct the DBAs correctly in the critical CR? Nope. Instructions look good.
3. Next to the logs, it ran fine on Saturday morning but not Sunday morning. What happened yesterday?
4. Ah yes, my CR. Open up the script...nothing out of the ordinary...and then I saw it.

On our target system, we use work tables to pre-generate a keys. It makes things a heck of a lot faster and removes the need for PL/SQL lookups in SQL (no, we don't have incremental builds yet).

So the work table needs to be DELETEd from first based on the keys from the first:

DELETE FROM some_key_table a
WHERE EXISTS ( SELECT NULL
FROM the_main_table
WHERE business IN ( 'TTT', 'TTR' )
AND dateof = TO_DATE( '24-MAR-08', 'DD-MON-YY' )
AND my_key = a.my_key );

OK, no funny business there.

Then I DELETE from the main table:

DELETE FROM the_main_table a
WHERE EXISTS ( SELECT NULL
FROM the_main_table
WHERE business IN ( 'TTT', 'TTR' )
AND dateof = TO_DATE( '24-MAR-08', 'DD-MON-YY' ) );

As I look at it I wonder WTH I was thinking using an EXISTS clause on the main table. That's the source.

But do you see what I missed?

See it yet?

OK, I left out the "AND my_key = a.my_key" from the inner query. Obviously a stupid approach, but it would have worked. The best way to do it is to just get rid of the EXISTS clause:

DELETE FROM the_main_table a
WHERE business IN ( 'TTT', 'TTR' )
AND dateof = TO_DATE( '24-MAR-08', 'DD-MON-YY' ) );

Live and learn, live and learn...

Labels: , , ,

 
  Use the [Oracle] Database dammit!
Dom Brooks recently posted an article about the Dea(r)th of the Oracle RDBMS. It seemed to struck a chord.

I've written about MySQL Friday or Application Developers vs. Database Developerswhich were similar in thought; the database is a bucket.

Ultimately, my take is that application developers don't know and don't want to learn how to use a database. PL/SQL specifically, is a platform in and of itself. You can do so much in the database now that you essentially need an application only for display, to determine the row color if you will.

The usual caveat follows:
If you are building applications that are supposed to be database independent, then the logic belongs in the application. The database is a bucket.

If you are building business applications specific to Oracle though, use the damn thing. Application/web developers are then forced to work on the design and user interface, not application/transaction logic.

Easy steps to actually utilize your database:
1. Use as many constraints as humanly possible - This will reduce the amount of code you have to write and you'll have the security of knowing the data will be what you constrain it to be.
2. DEFAULT columns in table definitions - create_date or load_date can be default to SYSDATE and thus left out of any application code. I've gone so far as to use SYS_CONTEXT( 'MY_CONTEXT', 'USERID' ) as the DEFAULT value for the create_user column. That along with a NOT NULL (or CHECK) constraint, makes life that much easier.
3. Did I mention constraints? Primary Key and Foreign Key constraints are very important to maintain data integrity (ensure you have the data you expect). Don't forget to index those foreign keys.
4. Security - VPD (Virtual Private Database) or Fine Grained Access Control. No longer do you need to maintain two separate schemas (or databases), just add a column and only allow those with the value set see that data. If you are using ApEx, this is incredibly easy to do.
5. Security (Roles and Privileges) - No more table based authorization, let the database do it through roles and privileges. GRANT EXECUTE ON my_package TO some_user

That's my short list for today. Like Dom, this makes me angry. If there were some rational logic behind it, great, convince me. I haven't seen it yet though.

Labels: , , , ,

 
  The Return to ApEx
It's been almost a year, but I've finally gotten a chance to dive back into ApEx!

I've been working primarily on our financial reconciliation for our Medicaid business. That's now very stable as we have everything in our fancy new star schema.

One of the support type activities we've been doing for the past 6 months is maintaining their rate tables...manually. They send (and resend) a csv file and we then match and insert those new records into their rate tables. I don't get to recreate the entire thing unfortunately, it's horribly designed, but I do get to do something.

So instead of doing these manually I finally convinced my boss that this could be done relatively easy with ApEx. I've demo'd it for him in the past, so he's aware of it's capabilities (my evangelism of it doesn't hurt though). Of course our VP steps in and says we have to go through the technical review board. Fair enough, I'm all for standards.

Thankfully my manager convinced the architects that we don't have the Java or Ruby resources to do this, plus, it would take weeks!

So, here's to ApEx, and the further infiltration of it at WellCare!

Labels: , ,

 
  Bowling for IT
Another non-Oracle related post. Just fun at work.

Last Friday we had another one of our IT all-hands meetings. My goal at each one is to make either the rumor list (of the top ten variety) or to be somehow be involved (hopefully good) in other ways.

Two months ago I was promoted to SVP of IT, because I was able to talk my CIO into it. Last month, I was promoted to CEO because I happen to resemble our new CEO. This month, the "light" piece was a "Where are they now?" complete with old/new pictures of IT employees. (Needless to say I am an only child...I crave attention!)

To say I've gained weight since starting a career/marriage/family would be an understatement. I went from a lean and mean 170 to about 250 now. The first pic I had just completed a sprint triathlon in Clermont, Florida. The second was sometime after the birth of my first child.


I take about every opportunity I can to send out the first one to new friends. "I didn't always look like a slob. That got to be my "before" picture and my "after" picture was my mugshot from my ID badge (yikes).

There I was 10 feet tall and looking great! I no longer had to send the picture out to anyone (and risk possible graffiti, though I guess posting it here doesn't help matters).

The important part was that I made all-hands again. I think that's 12 in a row.

And finally to the title of the post. After our all-hands meeting we went bowling. Food and bowling were free. I did notice however that there are quite a few, um..., drinkers among IT. I would certainly say that I fall into that category. At one point, it took so long to get a drink (only one bartender for 100 some odd people) I tried to ban the sale of mixed drinks so it would speed things up. However, my ploy didn't work.

I just bought two beers and waited for everyone else to follow-up with pitchers!

Gotta have fun at work right?

Labels: ,

 
  EDI Fun
or Electronic Data Interchange, just a fancy phrase for sending and receiving files. We (IT) do love to complicate things don't we?

I've put the change data capture stuff on hold as my never-ending project goes into it's 12th week past deadline. It's at nine 9s: 99.9999999. It's finance related stuff and nothing less than 100% is acceptable. I'm tired.

Part of my project was to move from an already built in house table to the raw (files) tables. My feisty colleague took on that fun challenge for 6 months or so. He's heading up a new project though so he's had to pass the baton on to me. I've accepted it...reluctantly. ;)

Anyway, we store these inbound files all over the place (seemingly to me). I started writing a little Java application that would scan a directory, read these x12-820 files and tell me the interchange date, control number, total amount and some other useful information.

I plan on either putting this in the database and wrapping it up in PL/SQL or creating a service (Java Service Wrapper) and pushing this useful data to a table. So if you have to deal with the wonderful x12/820 formats, you may want to check back soon for the code. I can't promise it will be good, but it will work!

Labels: , , , , ,

 
  Application Developers vs Database Developers
It started innocently enough with this article. I sent it out to about 20 colleagues.

The best line from the article:
"Jerry: "Yeah, databases cause lots of headaches. They crash all the time, corrupt data, etc. Using text files is better."

One of my more recently arrived colleagues (I'll call him Mr. M) replied to everyone with this statement:

"Kind of funny actually, databases are less and less important at the large investment banks, where they basically load everything up into a data grid across a several hundred node cluster. Writing to the db is way too slow."

This started a day long exchange of emails. What follows is the entire thread (up until my last post tonight).

Me:
"I would just argue that they don’t necessarily know how to write to databases. I would however love to see benchmarking done on both methods. Would be an interesting test..."

Mr. M:
"Well, my understanding is they just can’t scale out the db enough. Even something like Oracle RAC won’t work. And outside of the military, these are probably the top 1% of programmers in the world building this stuff."

Me:
"A benchmark would be the only way I would believe it.

If you said the top 1% of database developers tried it and failed, I would be more likely to agree.

My experience is that application developers != database developers. Different type of thinking involved."

Mr. M:
"'A benchmark would be the only way I would believe it.'

Do you need a benchmark before you would believe in-memory retrieval is faster than disk retrieval? Essentially, this is what we’re talking about.

'If you said the top 1% of database developers tried it and failed, I would be more likely to agree. My experience is that application developers != database developers. Different type of thinking involved.'

Why? It’s an issue to do with application performance not simply database performance. Database concerns are a subset of application concerns, essentially a specialization, requiring less encompassing knowledge. ;)

From the article you linked to (http://www.watersonline.com/public/showPage.html?page=432587)

"Better data management is the answer, says Lewis Foti, manager of high-performance computing and grid at The Royal Bank of Scotland (RBS) global banking and markets. "For very large compute arrays, the key issue is data starvation and saturation. This problem requires data grids with high bandwidth and scalable, parallel access,
...
Banks are learning that data management in a distributed grid environment is very different from online transaction processing. "With so many data sources, distribution channels, demands for aggregation and analytics, surges in data volumes and complex dynamics between the flows, we need to manage 'data in motion' and give up the notion that data is somehow stored. It's dynamic, not static," says Michael Di Stefano, vice president and architect for financial services at GemStone Systems
...
There is even some debate over how small a unit of work can be put on today's grids. Di Stefano at GemStone, for example, says, "One client has gone from 200 trades per second in a program trading application to more than 6,000 trades per second. This shows what the technology can do."

Yep, the writing is on the wall. Oracle knows it too.

http://www.google.com/search?hl=en&q=oracle+buys+tangosol&btnG=Google+Search"

Me:
"Good points. If it is in-memory it would be faster. I have not had the pleasure to work on such a system.

I do disagree with the database concerns being a subset of application concerns. The data drives the app. We’re probably getting religious at this point (or am I)."

Mr. M:
"‘The data drives the app.”

Exactly, but who’s to say where the data comes from or in what format? My application data may reside completely in xml files, or maybe I get it from some third party web services a la the en vogue “mashup.” Heck, I may not even need to worry about a database anymore…. http://www.amazon.com/gp/browse.html?node=16427261 The database is only one particular concern of the overall application. And it’s the application that matters. Data is useless if it just sits on a disk somewhere. It’s the ways in which the application lets the users view and manipulate the data that adds value to the business.

Yep, definitely a different type of thinking between application developers and database developers."

Me:
"Definitely religious now.

Applications come and go, data stays the same. Think Green Screens, EJBs, Ruby…what’s next?"

Mr. M:
"'Applications come and go'

Exactly. Businesses are not static, nor are the markets they compete in. Changing applications are a function of changing business processes and changing markets.

'data stays the same.'

Nonsense. Otherwise UPDATE would not be an SQL reserved word. If you mean database technology stays the same, well, I’m more inclined to agree with that.

'Think Green Screens, EJBs, Ruby...what’s next?'

Whatever comes along to let the business more effectively respond to current market realities. Application platforms have evolved much faster than database platforms have. They’ve had to, their sphere of operation is much broader than that of databases, this is only natural, they deal with much broader concerns than do databases. Databases in the internet era function in essentially the same role they did in the era of dumb terminals. Clearly application platforms have evolved orders of magnitude more. Hence the statement, database concerns are a subset of application concerns.

Here’s a simple test….if I take some business application and I’m forced to throw away one or the other, either the database or the appl- wait a second, it doesn’t even make sense to finish it, does it? The business can live without the database. I could do all kinds of things with the data, I could stick it anywhere. The business can’t live without the application though. Another way to look at is, what do the business users look at, test, approve, and use? The database? Of course not, they look at the application. They could care less whether the data sits on disk in an RDBMS, xml, or flat files."

Me:
"We obviously violently disagree.

Without the database (and I use database and data interchangebly), the business could no longer function. The app is meaningless. How would you contact your customer? You couldn’t find it.

'Exactly. Businesses are not static, nor are the markets they compete in. Changing applications are a function of changing business processes and changing markets.'

Poorly designed applications…that is all."

A Feisty Colleague:
"Using data and database interchangeably is incorrect. A database is a mechanism for data storage. XML data sets and flat files are mechanisms for data storage, too. So is a file cabinet, because, the data doesn’t have to be electronic, it could be … gasp! … on paper, and the application to use that data would be hands for holding the paper and a pencil to update and add data to the page."

Me:
"No it isn’t. I take into account xml files, flat files, web services (but not paper, unless it’s scanned) and all that. It would be consumed by the database and then accessed by the application via SQL.

(that’s for Mr. M and the feisty one)"

At which point someone forwarded the home page for Oracle's TimesTen In-Memory Database.

Me:
"A database on/in the mid-tier...Perfect!"

Mr. M:
"Implicit acknowledgment that disk IO operations that come with traditional database access simply can’t match the performance of in-memory data access (a point which you previously were unconvinced of but now seem perfectly accepting of the idea once you see it’s got Oracle’s imprimatur on it).

Of course, why any application developer would want to program against an SQL interface if they weren’t forced to is beyond me. It is orthogonal to the programming model of most application platform languages.

Surely Oracle recognize this fact too or they wouldn’t be buying Tangosol and other data grid technologies. Of course, most of those products are far more technically advanced than TimesTen or anything Oracle has in that space.

Incidentally, it’s illustrative to note that Coherence and other products like it were for the most part designed and built by application programmers. The development of all these products is pretty much driven by the needs of the large investment banks on Wall Street. These trading applications simply had too many concurrent transactions to use an RDBMS (a problem quite a number of public domains now share, most famously google.com, nope, no RDBMS there, yet miraculously there is still data). The database just simply would not scale to such a degree. So the application developers, by necessity, came up with an alternate solution that did work, a fully transactional cache of data replicated across a cluster with node numbers in the thousands, and no relational model whatsoever to speak of. A perfect example of how database concerns are only one, sometimes small, concern amongst many that application developers must be aware of and ready to solve."

Me:
"Like you said initially, the top 1%.

Many of us will never touch a system like this.

I will certainly concede that it is faster (still would love to see benchmarking though), but that still leaves 99% of the applications out there that do not require that kind of performance."

Me (again):
"And don’t forget, I use data and database interchangeably. Applications are nothing without the data right?

As to the object/relational impedance mismatch...well, more people that don’t know how to work in sets. Looping is what they understand. I understand the application side more than you seem to give me credit for.

I’m not saying applications aren’t important, they are. Data (databases) and applications go hand in hand. If the application went away though, they could still access their data via SELECT statements (yes, via an application client tool), however painful that may be. Applications make retrieving data that much easier for our users.

If anyone wants to unsubscribe from this mailing list, just let us know. This is fun for me (I’m guessing Mr. M too)."

Needless to say it was a fun day. It didn't get [too] personal. More than anything I'm happy to have an equally passionate colleague.

Besides, he claims he was just fracking around with me. ;)

Labels: , , , ,

 
  Is It Arrogance?
I wrote on Friday night about my experiences that day.

I am a very opinionated person. I believe, whole-heartedly, that the database is severely under-utilized, especially at my current employer.

I believe that one of the big draws of MySQL is that it's easy for web/application people to pick up. I also believe, in our situation, that's it's a way for application developers to skirt the whole "data" problem. They'll just pawn it off on the Production DBAs to keep the database running.

Amusingly, some of our application developers brought down one of our Oracle instances, more than once. Pretty tough thing to do I always thought.

I've read articles on bind variables since the beginning, but since it had been drilled into me, I found it quaint. Who would do that?

From a C# app someone passed in hundreds of thousands of un-bound INSERT statements. It flooded the shared pool (is that right?) and brought it to a screeching halt.

Anyway, back to the point.

I've been very vocal lately about MySQL. A few of my friends have begun to warn me that I may be crossing the line towards arrogance. That I will come off as someone resistant to change.

I don't see it. But sometimes we're the last to see our own reflection.

I don't believe that I am resistant to change. I like change. I just want it to be proven, that's all. I embraced ApEx because it made my life easier. That's all I want.

Does this make me arrogant?

Labels: , , , ,

 
  MySQL Friday
Each month we have an IT All-Hands meeting.

Last month I was promoted to Senior Vice President (SVP), because of my superior management techniques.

Today I was promoted to CEO! Unfortunately it only lasted for a few minutes. I happen to resemble our new CEO (and I'm always pining for a promotion) and they thought it would be funny (again) to bring me up.

I hugged the guy behind me, shook hands with people next to me and ran up to the front. I wanted to shriek, like the people do on The Price is Right, but I didn't have it in me. You gotta have fun at work right?

Well, after that it got serious. Our new Director (at WellCare, Directors are executives, one step up from managers and one below VPs) who heads our architecture team (and release management) got up to discuss where he would be taking us.

Slide one:
From 3 database engines to 1.
From 4 programming languages to 2.
From 3 OSs to 1.

Wanna guess what question I had?

"So, what database engine are we going to use?"

I knew the answer, but I take every single opportunity I get to make my point.

"MySQL."

Being on the datawarehouse team, I was confident that Oracle was not going away.

He went on to explain:

"Legacy applications would be maintained but everything going forward would be done in MySQL."

A flurry of questions came from the crowd so I was unable to followup immediately. I could feel the room come alive...it was weird (I think I'm still hopped up from the events that took place today).

Our CIO asked if there were any more questions or comments.

I spoke up.

I have two points.
1. If it's about cost, move all of the one-off applications into just a few Oracle instances. From what I can tell, we have somewhere in the neighborhood of 100. Let's say 5 databases, datawarehouse, our production OLTP and one for others. All you need to do is assign them different schemas, voila! Cost is much lower and there is a very big chance to reuse code.
2. Actually, I can't remember what my other point was. I think it had something to do with putting the logic in the database, that Java was the fad a few years ago, Ruby was the big thing now, what would it be in 5 years? Will we have to rewrite all of the logic then? (I guess I do sorta remember).

After that, someone asked about the two programming languages. Not a great answer from the crowd's reaction. Then someone asked about the OS.

The crowd was riotous (if that's a word). The CIO had to calm us all down.

I made a remark that he hadn't danced yet (one of our former hazing techniques for new employees) because I didn't want it to be completely personal, or just to ease something that I started.

After the meeting, I spoke with the Director. Oracle will be gone in 20 years because of the open source databases, it's being commoditized (not sure what that means). SOA is the wave of the future.

It was a polite conversation. I told him I look forward to learning from him but that I will probably never be sold on that idea. Fewer moving parts, simplicity, that's what I want.

I then spoke with the CIO, told him that once the decision was made, I would support it and keep my mouth shut (or find a new job).

I sent an email to the VP of the Director's group (after a couple of beers...idiot!) explaining my rationale.

One of the biggest reasons we chose to come to Tampa, to WellCare specifically, was because it was so young and immature. I would have the opportunity, if I could prove myself, to shape the future of IT here.

It's nice to have a voice.

Anyway, it's Friday, I'm prepped to spend all weekend at work to get this project delivered that was due in November. Have a good weekend!

Labels: , , , , , ,

 
  Love Your DBA
I consider myself a Developer/DBA.

That said, you've probably either read about or experienced the typical riff between the developer and the DBA.

At my current employer, I am finally surrounded by true Production DBAs. Initially, I found it difficult to work them. When I would ask "Why can't I do that?" I would rarely get a response.

Over time though, things have changed...for the better.

I believe it's called trust.

Trust that I am trying to do the right thing.
Trust that I want to learn.
Trust that I will listen to their suggestions.
Trust that I won't hack their DEV/QA instances using CREATE ANY PROCEDURE and EXECUTE ANY PROCEDURE.
Trust that I want to build a scalable and robust application.

So love your DBA. Give them time to get to know you. Give them time to learn your style, your methodology. Maybe someday they'll love you back and your job will get infinitely easier.

Labels: , , ,

 
  Open Source Obsession?
Since our new CIO came on board last January, there seems to a big movement towards Open Source tools.

While I have nothing against them, I've used various tools in the past; I just don't see what our obsession is with them.

Let's start with Ruby on Rails. An open source framework built on top of Ruby. It's used for web development. It's supposed to be a much more user intuitive language which makes it so easy. Fair enough. I'm always for something that will make my job easier. Our corporate website and provider portals were previously created on the dot net framework.

It was decided last year to replace our entire web infrastructure with Ruby on Rails. I'm still trying to figure out why. It's not that I am a pro-Microsoft guy, but the site worked. There were complaints about it missing this or that functionality, but that's fairly easy to remedy. As far as I know, dot net can support AJAX functionality (which I believe was at the heart of everything).

The demos of the new site were very cool (apparently we paid someone a lot of money to design the site...a LOT of money). It looked all web 2.0ey, big buttons, small text (which is a suprise given we are an HMO managing Medicare). It looked a lot like the 37signals applications in fact. I guess I've read Tom Kyte for far too long and his rant about putting business logic in the database because the front end will always change. Seems true. Java or dot net were all the rage a few years back, now it's Ruby, in a couple of years it will be something else (ApEx!) at which point we will have to rewrite the whole thing.

Next up, MySQL. It's a given that this database has come a long way. Version 5 even has stored procedures. It's a great free database that supports many websites out there. Free is good. Well, mostly free anyway, we do pay support costs right now. Almost every new project is built on top of MySQL. Why? I'm not sure other than free.

I asked the question to the CIO in one of our All-Hands meetings and his response was cost.

Fair enough, Oracle is expensive. The way we use Oracle is even more so. Each project seems to get it's own database. Why they don't get a schema on an existing database I don't quite understand. I've been told that it is a logistical nightmare to pull down a database that affects so many different applications. Each group wants their own version, etc., etc.

I can understand the Data Warehouse having their own database and perhaps our main appplication having it's own database; but every single application? Why not a one off database that houses all the smaller applications in different schemas? That's what Oracle was built for? Plus you can reuse code, reduce the number of instances (thus reducing the cost)...I just don't understand.

I believe my main complaint is that they are still just treating the database (whether Oracle or MySQL) like a bucket. Web people should not be writing SQL; Ruby people should not be writing SQL; just like I shouldn't be writing Ruby code. I don't know it.

I would be willing to bet that I could re-create many of our smaller applications in a much shorter period of time in Oracle and ApEx given the same requirements.

So I rant on. If I truly thought that this was an effort to make IT cheaper and more sustainable, I would be on board. I just don't see that that is the case...

Labels: , , , ,

 
  Corporate LIfe (Continued)
The rumors were true, our top three executives resigned on Friday. I have a tendency to believe in the best of people so I sure hope this is their idea of taking one for the team.

If you're interested you can read more about it here, here, and here.

As prodlife mentioned in her comments from my previous post, layoffs are something (thankfully) I haven't had to endure. But it may come after the possible acquisition.

I don't think I'm too worried, jobs seem fairly easy to come by. I'd just like some stability for awhile.

Labels:

 
  Corporate Life
One of the biggest reasons we decided to move down to Tampa (November 2006) was so that I can work in a "real" corporate environment (i.e. more than a few hundred people). WellCare has about 3,000 employees, IT makes up about 250.

It feels like I've experienced about every event I could have imagined:
1. In January of 2007, a new CIO/SVP was hired and promptly restructured (replaced the VPs) the IT department.
2. In October of 2007, we had a nifty FBI raid.
3. January of 2008, we appear to be losing our CEO, CFO and General Counsel.

Now I just need to wait for the merger/acquisition and I will have experienced just about everything!

Labels: ,

 
  Asynchronous Distributed HotLog - CDC Part III
This is the third installment (one and two)of my attempts to configure Oracle's CDC from a 9.2.0.6 source (highest release for windows) to a 10.2.0.1 (ditto) target.

After being appropriately set up with privileges (DBA's trusted me with the DBA role!) on our actual environments, 9.2.0.7 source and 10.2.0.3 target (Sun Solaris), I've moved back to trying to just get a simple proof of concept working on my machine.

That's had it's own difficulties, though I can safely say that I can manually create 9i and 10g databases manually.

Getting the databases configured properly has been my biggest challenge. I had eliminated most possibilities down to either Net Services or something to do with the JVM. I used my local listener and ruled out Net Services. It was down to the JVM. I kept getting this strange error:

ERROR at line 1:
ORA-00600: internal error code, arguments: [qccsrc_createHLSource-3], [], [],
[], [], [], [], []
ORA-06512: at "SYS.DBMS_CDC_IPUBLISH", line 133
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_CDC_PUBLISH", line 226
ORA-06512: at line 2
A trace file was generated (with the above error) but it didn't really tell me anything. I googled the phrase, nothing. I went to Metalink, nothing. It looked like a Java call though, so I tore the database down and rebuilt everything. Just in case, I added XDB, Data Mining and InterMedia in case there was some reference there.

Installing InterMedia was a pain. I kept getting a failure of a particular jar (ORA-23542?), could not resolve the class.

I googled one of the classes that failed to see if anyone had run across this before. There was only one record found...and it was mine from about a year and half ago! I found that very amusing.

So I went into the \ord\im directory and found a readme.txt. As I am scanning through it I see CLASSPATH. So I add the environment variable and voila! Perfect install. That would have solved my problem from before too. I followed the docs on the install to a T. Nothing in there about CLASSPATH. Perhaps I should write them and ask for it to be added?

Anyway, thinking the best, since I had a perfectly clean installation, I tried again:

SQL> BEGIN
2 dbms_cdc_publish.create_hotlog_change_source
3 ( change_source_name => 'T',
4 description => 'Test',
5 source_database => 'ORANINE' );
6 END;
7 /
And I waited for an agonizing minute thinking I had it this time...

BEGIN
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at "SYS.DBMS_CDC_IPUBLISH", line 133
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_CDC_PUBLISH", line 226
ORA-06512: at line 2
Barnacles!

At least the ORA-0600 is gone, but I am back to where I started.

Another good thing is that I am really learning how to pour through trace files and tkprof files.

All the examples I have found make it seem so easy...why can't I get this dang thing to work?!

Labels: , , , ,

 
  Instrumentation: DEBUG/LOGGING
In my previous entry on instrumenting code I detailed the way in which you could use the DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS procedure to help monitor your long running code.

In this one, I will detail my home grown version of Tom Kyte's debug routine. I do know that others have similar code but can't seem to find them right now.

You can find the source code here.

Contents:
2 tables
2 sequences
1 package
1 procedure
1 build file

debug_tab allows you to turn the debugging on and off. debug_details_tab will store each line that you write to the debug routine when turned on.

Here's an example of it in practice:

CREATE OR REPLACE
FUNCTION get_age_in_months( p_id IN NUMBER ) RETURN NUMBER
IS
l_age_in_months INTEGER;
BEGIN
--instrumentation calls
debug( 'GET_AGE_IN_MONTHS' );
debug( 'P_ID: ' || p_id );
debug( 'select value into variable' );

SELECT age_in_months
INTO l_age_in_months
FROM people_tab
WHERE id = p_id;

debug( 'L_AGE_IN_MONTHS: ' || l_age_in_months );

RETURN l_age_in_months;

EXCEPTION
WHEN no_data_found THEN
debug( 'no data found' );
RETURN NULL;
END get_age_in_months;
/
show errors


I mentioned in the previous article that I had had difficulty grasping this concept initially. I think once I related it to DBMS_OUTPUT.PUT_LINE it became much more clear to me.

This simple debug routine has helped me tremendously in the last year or two that I have used it. Especially when you get nested levels of logic. It gets very hard to keep track of where you are, but with this you can run your procedure or function and then issue a SELECT against the debug_details_tab and see what was happening when.

I even began using this in my APEX applications. I would preface each line with "APEX: " and then write whatever was necessary so that I could step through the various pieces of code. It became crucial when I was doing validation on a table of records in a collection...oh so much easier.

On large systems this will generate a lot of data. I definitely would not put this inside a loop doing some sort of batch processing, but it is helpful to find where things fail out.

It can certainly be improved on. I basically took the idea of DBMS_OUTPUT.PUT_LINE and wrote it to a table, nothing fancy there. Mr. Kyte mentions writing it to the file system as well. Since I don't have ready access to the database file system, this was the easiest.

Make your life easier and use a debug/logging routine in your code. No longer will you have to comment, the debug statements should do it for you!

Labels: , , , , , , ,

 
  Instrumentation: DBMS_APPLICATION_INFO
Instrumentation has something that I have come to rely on fairly heavily. I believe I first read about it on asktom, but the one that really spurred me on was this post on instrumentation on his personal blog.

Initially, I couldn't really wrap my head around instrumentation. I don't know why it was so difficult; I had a similar problem with sessions when I first started my career. I look back now and it just seems so obvious.

Now that I am doing datawarehouse work, nothing is fast. Fast to me is now one hour to load 30 or 40 million records. No more split second queries for me.

We currently use no tools. It's straight PL/SQL. Instrumentation of the code is ideal. Actually, it's more instrumentation to aid monitoring. The tool most easily used is provided by Oracle in the DBMS_APPLICATION_INFO package.

There are three subprograms that I use most, SET_MODULE, SET_ACTION and most importantly SET_SESSION_LONGOPS. I hadn't started using it until this year, I mainly stuck to the first two. SET_SESSION_LONGOPS is now part of my procedure/function template I've created in JDeveloper.

What it allows you to do is set a row in the v$session_longops view (I know it's not actually putting the row in the view...it's the underlying table, but I digress). You can then monitor how your job is doing.

Here's an example:

dbms_application_info.set_session_longops
( rindex => g_index,
slno => g_slno,
op_name => 'GETTING MEMBER DATA',
sofar => 0,
totalwork => l_table.COUNT + 1,
target_desc => 'GETTING MEMBER DATA' );

g_index and g_slno are global variables in the package. l_table is a PL/SQL TABLE OF VARCHAR2.

Now you can monitor the progress of your job in v$session_longops!

Here's the query I use:

SELECT
username,
sid,
serial#,
TO_CHAR( start_time, 'MM/DD/YYYY HH24:MI:SS' ) start_ti,
time_remaining rem,
elapsed_seconds ela,
ROUND( ( sofar / REPLACE( totalwork, 0, 1 ) ) * 100, 2 ) per,
sofar,
totalwork work,
message,
target_desc
FROM v$session_longops
WHERE start_time >= SYSDATE - 1
ORDER BY start_time DESC


Now you too can sit for hours and watch your job move incrementally forward!

But seriously, it does help tremendously to know where a job is at. You can further use the SET_MODULE and SET_ACTION calls to see a specific point in the processing (inside a loop).

Here's the code in context:


PROCEDURE get_member_data
IS
l_exists INTEGER;
TYPE table_of_lobs IS TABLE OF VARCHAR2(3);
l_table TABLE_OF_LOBS := TABLE_OF_LOBS( 'COM', 'ORG' );
l_count INTEGER := 0;
BEGIN
--check to see if there is enrollment data, if not, move on
SELECT COUNT(*)
INTO l_exists
FROM members
WHERE rownum < 2;

IF l_exists = 1 THEN--data exists, truncate and reload

g_index := dbms_application_info.set_session_longops_nohint;

EXECUTE IMMEDIATE 'TRUNCATE TABLE member_stg';

g_audit_key := p_audit.begin_load
( p_targettable => 'MEMBER_STG',
p_loadsource => 'MEMBER_SOURCE',
p_loadstatus => 'PRE',
p_loadprogram => 'GET_MEMBER_DATA',
p_commenttext => 'INSERT' );

dbms_application_info.set_session_longops
( rindex => g_index,
slno => g_slno,
op_name => 'GETTING MEMBERS',
sofar => 0,
totalwork => l_table.COUNT + 1,
target_desc => 'GETTING MEMBERS' );

FOR i IN 1..l_table.COUNT LOOP
l_count := l_count + 1;

INSERT INTO member_stg
SELECT *
FROM members;

g_total_rows_affected := g_total_rows_affected + sql%rowcount;

COMMIT;

dbms_application_info.set_session_longops
( rindex => g_index,
slno => g_slno,
op_name => 'GETTING MEMBERS',
sofar => l_count,
totalwork => l_table.COUNT + 1,
target_desc => 'GETTING MEMBERS' );

END LOOP;

p_audit.end_load
( p_auditkey => g_audit_key,
p_loadstatus => 'SUC',
p_rowsuccess => g_total_rows_affected );

gather_table_stats
( p_tablename => 'MEMBER_STG',
p_schemaname => 'MYHOME' );

dbms_application_info.set_session_longops
( rindex => g_index,
slno => g_slno,
op_name => 'GETTING MEMBERS',
sofar => l_count + 1,
totalwork => l_table.COUNT + 1,
target_desc => 'GETTING MEMBERS' );

END IF;

EXCEPTION
WHEN others THEN
p_audit.failed_load
( p_auditkey => g_audit_key,
p_comments => SQLCODE || ' ' || SQLERRM );
RAISE;

END get_member_data;

Labels: , , , , ,

 
  Ling Chi II
or Death By a Thousand Cuts. I wrote about it before.

Today was one of the worst days I've had at this job.

I got home last night knowing I had to run and test a new line of business in our test environment. This was a fairly small subset so it should run fairly fast, two or three hours. Around 1:30 AM, it completed. I did my quick sanity checks and realized that it just wasn't working right.

Crap, I forgot to load our new rates. That has to be it.

So I reran the rates and then reran our process.

It's now 3:00 AM. I run my sanity check and it's exactly the same as the last one.

I quickly realize that some of the rates hadn't been updated like I assumed they had. This test was null and void. I went to sleep...mad.

I woke up around 8:15 with my son telling me something about Transformers. What? Oh, OK, I'm in his bed. I take him to school and get to work around 9:15.

I'm cranky because the other developer didn't do his part, but probably more mad at myself for not making sure they completed their piece.

I throw a piece of candy. Better.

Of course my colleague isn't in today, so I have to make sure the DBAs deploy this to our test environment.

Finally I get the process working and it finishes around noon. I send out a note to the business and QA letting them know that they can begin.

I get a call from the business around 2:30, it's not working the way they expected. One of our rates overlaps another causing invalid results to return.

Thanks for telling us that sooner. The day before deployment and were getting new requirements. Awesome!

I walk over to my boss' desk with my badge in hand, ready to quit, kind of, to tell him the news. He talks me off the ledge.

We then head over to their building to discuss and indeed it's something they didn't realize. OK, fair enough. Had they seemed to appreciate me/us a little bit more over the past eight months I probably wouldn't have been so mad. It was just one more thing though.

My boss decides how this will be remedied. I argue (gently) that this is not an application issue but a data issue. He agrees. We'll just put one job on hold and make the necessary changes to the [driving] data.

Two IT VPs, one business VP and the CIO need to sign off on two change requests, one for the driving data and one for the application.

We're slated to deploy tomorrow pending UAT signoff, though that shouldn't be a problem.

Ten to twenty percent of my time is spent writing code, the rest is paperwork. I believed I had mastered the administrative stuff only to get this requirement change at the last minute.

One more thing...just one more thing.

Ling Chi indeed.

Labels: , ,

 
  Keeping it Simple
One of my all time favorite articles is The Complicator's Gloves on Worse Than Failure (formerly the DailyWTF). It identifies the tendency of software developers in particular to come up with overly complex solutions, usually when there is a much simpler one available.

This was the context of my latest rant to my CIO. Actually, this theme seems to play out in all my rants. Funny how that works.

While web services and the like have their place, many times they are used just because they are the cool new thing, not because of a pressing need. I know I am not the first to mention that nor will I be the last.

Whether it was years of reading asktom (for pleasure no less) or the influence of my first boss, I have striven (sp?) to build applications that are scalable yet easy to maintain.

One of my proudest accomplishments as a developer was at my previous job. A small state-contracted agency where I was the lone developer. I, thanks to a very trusting boss, was allowed to install Oracle and soon after found Application Express (APEX). In 18 months I was able to create some 350 pages of forms and reports for the organization. One person, 350 pages. I once found a job ad for a web developer to help maintain a 100 page website on a team of six. What? Six people? Really? Must be java or something. ;)

I continued to work for them on a contract basis for about six months after I left. Mostly until the new guy got comfortable. Unfortunately for me, they didn't require my services a whole lot. Yes, I could be deluding myself, I realize that...but I just don't believe it. They WOULD tell me.

Back to my point. At our organization we seem to have quite a few architects. They talk of Ruby on Rails, Java, JBoss, etc. MySQL gets a brief mention on occasion.

We have a hard enough time writing good SQL or PL/SQL, so now we're going to introduce new languages and a new database platform?

If we were a company that made software, I will probably be [mostly] on board, but we are not. We store and manage data for the business to do their job.

I do hope I am wrong about them and that they do talk about the importance of data in our organization. I just haven't see it yet.

So, put it in the database, use APEX when appropriate (95% of the time) and keep it simple.

Labels: , , ,

 
  Oops I've Done it Again
By it, I mean I've sent another rant to my CIO. Here's my first one that I sent to Dratz before starting my own blog.

Fortunately, we've developed a bit of a rapport. I still should not do this type of thing on a holiday when it could be days before I hear back...it just makes my mind wander and wonder if I will have a job come Monday.

Update


I still have a job...I really need to stop this.

Labels: , ,

 
  Death By a Thousand Cuts
In case I haven't mentioned it before, I work for a fairly immature IT organization. We're heading in the right direction mind you, but defined and documented processes don't really exist.

Yesterday I went back and forth with our QA department about two truncate table statements. We had performed this in production before and we didn't change the code. It needed to be tested and I needed to do a unit test plan. Today I needed UAT signoff. What? There's no business user.

Our EDI group is overtaxed right now, so I wrote a process to delete data in "their" database on tables that they created. Part of that process was to drop the constraints and then recreate them with the ON DELETE CASCADE rule. Amusingly, they created most of them with the SET NULL rule and then had NOT NULL constraints on those columms. Sweet. I needed to do all this and finally delete the data, of course none of the environments (DEV/TEST/PROD) are the same, so what worked in DEV didn't work in TEST. I'm guessing that as soon as it is deployed in PROD, I will have missed something else. I'll look like the idiot too. Did I mention that I have to create indexes for all those foreign keys? No, well, I did. Otherwise the process would take days to complete. There are some 13 tables in total. Three child tables of the parent table and then multiple child tables of those child tables. Awesome!

I'm on my fifth day of trying to complete a "simple" delete now.

Since the FBI raided, QA has become more strict. OK, understandable, but there was never a notice saying so, nor what the new rules would be.

I finally get my final approval and the work orders are created. Release Management gives me the all clear (the files were staged for the DBAs). I ran over to let them know and he wants to go through the instructions before I leave to make sure everythings clear. We then go into the staging folder and only two of the eight files are there. Deep breath. I call the Release Management group and let them know. It will be an hour before they get home.

I know that was an honest mistake. When I went back to make sure I filled out all the forms correctly I realized that I had left one file off of my build list, so I originally only had seven.

DBA just called and he was slammed with other critical deployments/production problems and wasn't able to get to it tonight. It would happen in the morning.

A "simple" delete will have taken seven days to complete.

Slow slicing indeed...

Labels: ,

 
  I Want to Be Better Than Tom Kyte
OK, that got your attention. Somehow I knew it would.

I believe Mr. Kyte to be one of the foremost experts at Oracle development. His solutions are usually simple and concise. His philosophy is simple and concise; logic belongs with the data (in the database), don't reinvent the wheel if we've already created it (using supplied packages) and keep it simple. Of course Mr. Kyte may have objections to some of that, but that's the general idea I have gleaned over that past 5 years.

I am very competitive

1. One of the reasons I got into IT in the first place was that I didn't like this whole group of people knowing more than I did.

2. I grew up playing baseball, I liked being better than most of the other kids. I still believe that if I hadn't drank away my opportunity in college, I'd still be playing.

3. I'm an only child, I'm used to the attention and crave it. How do I get it now? By being better than everyone else.

My goal is to be the best developer in the world

Will I ever achieve that? Could it even be measured? Is there some sort of Oracle developer competition out there?

Perhaps I should start small...be the best Oracle developer at WellCare, then Tampa, Florida, the U.S, North America, Northern Hemisphere and finally the World!

I am probably not the best Oracle developer at WellCare, so I have a ways to go. That's what drives me though. Trying to be the best. I'm surrounded by a lot of smart people which is a good thing. No...a great thing. I've been the lone wolf developer for too long. Now I have the opportunity to learn directly (as opposed to just reading) from others. There is give and take. Sometimes my solution is the best and sometimes it is not.

I don't believe my competitive nature interferes with my interpersonal relationships (I hope not anyway). It is more of an internal thing to me. Once upon a time I was skinny and in shape and I did triathlons. I wanted to be a pro (laughable). Each time though I tried to outdo my previous performance. Did I want to win? Sure I did, but it was more important for me to improve.

I believe that I am strong enough to take criticism from others. I can admit when I'm wrong (see countdown timer above).

I do want to be the best. I'll probably never have the opportunity (nor the time) to do what Mr. Kyte has done. I'm not going to strive to be mediocre though. Whether I realize that goal or not is mainly irrelevant, but that is my goal...to be better than Mr. Kyte.

Labels: , , , ,

 
  FBI and Others...
I did have a job when I got back into town. Unfortunately I let the news of the FBI raid ruin the remainder of my vacation.

There still isn't a whole lot of information available, most of it is just speculation of course, but it seems now everyone is piling on.

Class Action Lawsuit Against WellCare Health Plans
WellCare Says SEC Joins Probe

On Monday of last week the stock price hit an all time high of over 128 dollars. It closed at $28.62 today. Um, yikes. We had purchased a few shares at around the $100 mark and lost about $200 dollars. If there's a bright side to all this it's that we can actually afford to buy more than a couple of shares now...

Labels:

 
  Looking for an Oracle Developer?
So I am on vacation (well, I wouldn't necessarily call being a pack mule vacation) at Disney World this week.

Yesterday I received a text message from one of my friends, our company was being overtaken by armed FBI agents, lots of 'em.

FBI raid shutters Medicare insurer

FBI Raids Tampa WellCare

I've never seen any of these types of activities, though the scope of duties has been fairly limited (I've been there less than a year). I find it hard to believe as everyone I have worked with on the IT side of things I KNOW is on the up and up. I've never been asked to do anything nefarious...My hope, that if true, it is only a select few individuals.

I thoroughly enjoy working there. I am surrounding by some great people, both personally and professionally, but I do have a family to feed so...

So if you are in the Tampa area and are looking for a hard-working Oracle developer (APEX, PL/SQL), either email me or post a comment (I won't post the comment, but I will receive it via email and I can contact you from there). I'll also work on getting my resume updated and online.

Labels: , , ,

 
  To LOOP or Not To LOOP - Revisited
In a previous post, I pondered the decision of LOOPing (i.e. PL/SQL calls to a lookup). Given 8 days to code and a 90 hour week last week I think I came up with a decent solution.

Initially I went the easy route, writing PL/SQL functions that would populate collections and then do the matching. I tried to tune the functions so that the collection would be populated only once for each line of business and then ordering the result set that would be passed through. In my mind, this would reduce the number of cursors opened. I wasn't if that would make a difference or not, but I was going to give it a try.

Well, it was dog slow. One of the lookups calls was estimated to take days to complete (I only know this because I have gotten into the habit of using dbms_application_info.set_session_longops).

So I rethought it.

I only needed to get the keys right?

I first created a primary key on the staging table (same key that would be used in the dimension). I then created a "work" table that would reference that key and then store the other key that I needed to lookup. I also made the foreign key a unique key (one to one relationship) so that I would know immediately if I did something wrong. I then used straight SQL to populate that table. One pass for all the values that matched and then another pass with those that didn't have a matching record (padded rows).

From days to minutes...2 minutes in fact. So I applied that technique to two other lookup situations.

The code is still pretty straight-forward and adding another line of business is relatively easy (I checked this today and it took all of 10 minutes). All the fancy PL/SQL and collection stuff I had created was thrown out the window.

So I did manage to use straight SQL, the performance is phenomenal and maintenance will be easy.

It even passed muster (albeit grudgingly) with our more seasoned datawarehouse folks. Ultimately, they couldn't complain when it ran in under two hours...

Labels: , , ,

 
  Zero Day is NOT Upon Me
I got a brief reprieve today, I guess.

Neither of my two deployments are going through tomorrow, so I have two more weeks to go until another opportunity to screw something up. ;)

Speaking of which...
I watch SpongeBob Squarepants quite a lot with a 5 year old boy in the house. I was watching this episode the other day where Patrick (the starfish and best buddy to SpongeBob) found out his parents were coming over to visit him.

He was not very happy as his parents treated him like he was stupid. SpongeBob told him that he would help out by acting even dumber than Patrick thus making Patrick actually look smart. The act worked, but too well. Patrick, even out of earshot of his parents, kept cracking stupid jokes at the expense of SpongeBob. This resulted in SpongeBob getting mad and reminding Patrick that he was only acting stupid to help him out.

Since I put my sign up (not counting my counter up top, no one here gives me a hard time) everyone has consistently beat me up over it. Today was it for me. Yes, I brought it on myself with the sign and all that, but I'm through with it. My boss mentioned that if I had to reset my sign that I wouldn't really be there to do so as I would have been escorted out the door (he didn't say this in a mean-spirited way...he might be right next to me) and unable to reset.

I started practicing how I would answer questions about my firing in my next interview.

Interviewer: "So, why did you get fired?"
Me: "Well, I screwed up production a couple of times."
Interviewer: "How did you do that?"
Me: "The first time I deployed code from development to production."
Interviewer: "Really?! Why did you have access to production?"
Me: "..."
Me: "On the second occurence, I deployed a bug into production; I changed a non-requirement driven piece of code"
Interviewer: "What about QA? Didn't they do regression testing?"
Me: "..."

I felt a little better.

I've have never been happy about my mistakes, I tried to "man-up" and own them; perspective and context are good things though. I should learn from my mistakes and correct the behavior that led to them, that's all I can really do.

Labels: , ,

 
  To LOOP or Not to LOOP
I've already established my creds as a Tom Kyte follower.

Tom's mantra:

  • You should do it in a single SQL statement if at all possible.

  • If you cannot do it in a single SQL Statement, then do it in PL/SQL.

  • If you cannot do it in PL/SQL, try a Java Stored Procedure.

  • If you cannot do it in Java, do it in a C external procedure.

  • If you cannot do it in a C external routine, you might want to seriously think about why it is you need to do it…


I'm faced with a new datawarehouse load, eventually it will be about 100 million records. If I go the straight SQL way (embedded in PL/SQL), I'll need to create multiple objects to support that method and each time we add a new line of business, we'll have to add more objects and more code.

If I can encapsulte it in PL/SQL, I could eliminate most of the necessary supporting objects, but at a big cost, performance. It would make coding time much quicker and ultimately more maintainable (in my opinion), adding a new line of business would simple by updating the packaged functions with an additional control check.

It's a difficult pill to swallow though. I'm originally an OLTP guy and I can write pretty good SQL. Being so new to datawarehousing concepts I feel like I am cheating somehow. Making that decision of when to move to slow-by-slow seems exceedingly difficult. Hopefully with more experience in the datawarehouse environment it will become easier...but it's still tough.

Labels: ,

 
  The Chicken Almost Came Home to Roost
We have a daily meeting with the Business concerning the current, long running project. This is the one I have screwed up a couple of times.

I have a scheduled deployment next week, mainly just performance improvements. I've managed to get this down from 10-12 hours to 7-8.

At the end of the meeting, the Business questions the need for the performance improvements - we're re-architecting my solution in parallel because mine was just a conversion from SAS (yuk!) - as we'll be live in just 2 months with the new one.

Obviously, I know why they're thinking that.

IT, me, can't be trusted to do it right. Since I've, umm...screwed up a couple of times. Why do this if it's not broken?

I just hung my head low, I knew, and I couldn't really argue with them. I had no ground to stand on. Our PM said that he'd take it back to our manager and let them know.

I went to lunch and thought about this blog entry I would be writing.

I got back from lunch and my PM informed me that this would be going into production...the Business' big boss, Miss VP, said so.

Woohoo! Someone has some semblance of confidence in IT (me)!

I've done everything I could to make sure that I didn't do something silly. We had a peer code review to compare the most recent build against that which was in production. My unit tests were much more thorough. I worked with QA to get them to look at specific points. Let's just hope all goes well.

This is a big test for me. Either I pass and gain some credibility back or fail and lose my job. Wish me luck!

Labels: , ,

 
  Code Style
Having a specific coding style has become more apparent to me now that I work in a team environment. I have my way, which is of course the best, and everybody else has there way, which isn't nearly as good.

I'm sure if I could make the rules, I'd have everyone writing code according to my ways. Power corrupts and all that.

I have learned to accept others' ways though. It's been difficult at times. If the code is readable and it works, I usually just bite my tongue.

Strangely, I love to type. I manually create all of my scripts. I make my code "pretty." I don't use GUI tools to auto-generate table definitions, and I especially don't use tools to format my code.

Toad Formatter, or whatever it's called, is my enemy. I'm sure Toad is not the only one with some sort of auto-formatter and I don't like any of them. For some reason I believe it is an abomination.

When I get to do the technical interview, I scan their resume for SQL*Plus. If I don't see it, I ask them what tools they use. If they don't mention SQL*Plus, I'm skeptical of their abilities...until I get to the five constraints question.

This is not to say that people that use Toad or SQLDeveloper are bad coders or anything, it's just my preference.

So what's your preference?

Labels: ,

 
  The Good Manager
I read Lewis Cunningham's article today What Keeps you at your Job?

This is something I think about quite often. I am in a very chaotic, immature organization currently. The process to deploy code changes about every other day and of course non of it is documented. Then there's the fact that I had complete control at my previous job, I was the DBA, Architect, Web Developer and Designer (suck at that), and most importantly Database Developer. I had a very good manager who just literally let me run wild (within reason of course).

For me, that was a perfect situation. I felt I was under-utilized at my previous job and that was the perfect opportunity to flex my muscles. I learned a great deal there and I am forever thankful for that.

One of the big reasons I took my current job was because of the chaos and the immaturity of the IT organization. There are countless opportunities to help shape the future, to build the foundation. I'd also get to experience life in the for-profit corporate world where performance is rewarded financially. There's also significant room to advance relatively quickly compared to more established environments.

I have learned things on the technical side, but far and away my biggest gain in knowledge is in how to do software development in a team environment and the peculiar politics of a company.

I have my manager to thank for that. He is a former military officer who attended one of the military academies. He has worked in our industry for a number of years and is our subject matter expert on the financial side of things.

  • He gives us (developers) the opportunity to voice our opinions.
  • He gives us a view into the politics.
  • He gives us the big picture view.
  • He is fair.
  • He does not do things just because that's the way they're done. He fights those battles so that we don't have to do it the wrong way.
  • He backs us up.
  • Shit doesn't roll downhill with him.
To me, those are all terrific qualities. When I've screwed up, he tells me; usually though, he asks me questions so that I will come to the realization. He's been an outstanding leader and most importantly (to me anyway), a teacher.

If he ever decided to leave, I might just have to follow him.

Labels: , ,

 
  Working with the Business
I was once one of those annoying Business users who constantly pestered the IT department.

Probably one of the biggest reasons I got into IT was because I didn't like the control that IT (seemingly) had over me. I wanted that kind of control, but I also wanted to share it.

I have tried to carry my end user mentality with me to IT. I try and go out of my way to learn the business; from reading procedures to just sitting down with them and discussing what they do. This was fairly easy to do in the smaller companies I've worked with, but now that I am in a 3,000+ person company, it has gotten a bit more difficult.

I read an article by Steve Jones about getting closer to your business. I couldn’t agree more.

I would love (and have asked) to be able to spend more time with the Business folks. Perhaps shadowing them for a week, or just writing reports so I can get a better feel for what they do with the data/information we provide them. Better yet, make it part of the on-boarding for new employees. Spend 6 weeks with various departments or something like that. Some companies have management programs that do just that.

Anyway, I believe time spent with the Business makes me a better developer and hopefully builds up a good working relationship (trust) between IT and the Business.

Labels: ,

 
  Business Logic: In the Database or in the Application
When I started in the Data Warehouse, I began subscribing to as many BI/Data Warehousing blogs that I could find (there don't seem to be lot of them). Intelligent Enterprise (Roger Kimball) and Bill Inmon seem to be the most popular or well known. I also read Mark Rittman (and Mr. Mead), David Aldridge, Lewis Cunningham and Dratz who all seem to have more of an Oracle lean.

Today I read a post from Dan Linstedt titled "How Data Models can Impact Business." I followed the rather lengthy, but descriptive post, until I got to this part:

"Ok, I kind-of buy it, but what about Referential Integrity, when should that be enforced?
In two places:
1) When the data is captured within the application capturing it - it would clean up a LOT of these source systems, and put much more rigorous business logic (and cleaner data) into the source systems to begin with.
2) When the data is "released" for users, to reports, to screens, to output. This is when reusable common services / routines for getting data out are helpful. They implement the referential integrity in the application layer."

Now, I haven't been in IT all that long (5+ years now), but I put as much business logic into the database as I possibly can. I use the front end (APEX, woohoo!), to handle row color or something along those lines.

If you start with a good, flexible model, have a strong database team (DBAs, Developers) and you build a good API to your physical model (no INSERT, UPDATE or DELETE to any users, the only entry point to your tables being your API), flexibility and maintainability should not be a problem. Making changes should not entail a monumental effort. I suppose if the application in Mr. Linstedt's article is the only point of entry into the tables, I probably wouldn't really disagree (he's just moved it from my database API to his application), but then you have a giant bucket. Why not just use what you have paid for and build it in the database? That way, more than one application can use the same API over and over.

Labels: , , ,

 
  Fun with SQL
My group held it's first Peer Code Review today. It was my code (the code I've screwed up a couple of times). One of the requirements (I stuck to them this time, yeah for me!) was to limit the data we were pulling from another system to only the last 48 months. There were three different procedures that needed this date but I didn't want to break the existing automated job so I defaulted everything to:

p_date_from DATE DEFAULT ADD_MONTHS( TO_DATE( TO_CHAR( SYSDATE, 'YYYYMM' ), 'YYYYMM' ), -48 )

I wanted the last full 48 months and this worked just fine.

This is a fairly long process which takes anywhere from 8 to 12 hours to run, depending on system resources. One of my colleagues asked what would happen in the event of a crash (on the last day of the month) and the required re-start (on the first day of the month). One set of data would have everything going back 49 months and the other 48 months which would create a lot of errors. A great catch.

Since we're in maintenance mode now (re-architecting the whole thing), we decided not to stop the deployment, we looked at the calendar to see when the first occurence was in which the 1st fell on a Sunday (the job is scheduled weekly on Sunday)...which now that I think about it, was probably wrong. We should have been looking for a Sunday in which was also the last day of the month. Anyway...

I like trying to answer questions with SQL. So I wanted to find the occurences on which Sunday was also the first day of the month (despite while writing this realizing that we should have been looking for the last day, again, digression). Here's my resultant query:

SELECT
ADD_MONTHS( TO_DATE( TO_CHAR( SYSDATE, 'YYYYMM' ), 'YYYYMM' ), myrownum )first_day_on_sunday
FROM
(

SELECT rownum myrownum
FROM dual
CONNECT BY LEVEL < 100
)
WHERE TO_CHAR( ADD_MONTHS( TO_DATE( TO_CHAR( SYSDATE, 'YYYYMM' ), 'YYYYMM' ), myrownum ), 'D' ) = 1
AND TO_CHAR( ADD_MONTHS( TO_DATE( TO_CHAR( SYSDATE, 'YYYYMM' ), 'YYYYMM' ), myrownum ), 'DD' ) = 1
/

FIRST_DAY_
----------
06/01/2008
02/01/2009
03/01/2009
11/01/2009
08/01/2010
05/01/2011
01/01/2012
04/01/2012
07/01/2012
09/01/2013
12/01/2013
06/01/2014
02/01/2015
03/01/2015
11/01/2015

I'm not so sure it impressed my colleagues, but it certainly reinforced the notion that I'm a nerd.

Labels: , ,

 
  Humor in the Workplace
In an effort to deal with my recent screwup (one of two recent ones), I decided to try and laugh at it a bit.

Our organization is very young and since the on-boarding of our new CIO, our directive has been to stabilize current processes. In that regard, the VP who heads up the Infrastructure team has placed placards on his office window signifying the number of days one or another system has been up with no interruption in service.

I ran into him in the hallway and suggested he put one up for me too, "Days since Chet 'messed' up Production code." He got a hearty laugh out of that.

I've always been able to laugh at myself, if not immediately, then soon after. So I put up a hand made sign in my cube that read the same thing; I'm at 21 days. Hopefully it will remind me as I'm pouring through code not to touch that which is out of scope with the current requirements. That was my mistake on both occurences.

It's definitely a talking piece and hopefully people can laugh at it (as I can...sortof), but it will be a constant reminder to me as well.

Labels: , ,

 
  Why I Blog
I never really had a true mentor, well, a physical one anyway. I could ask questions to my first boss, but it was apparent rather quickly that they better be good ones.

So I took to reading AskTom everyday. Mostly the new posts at first but as time went on, there were fewer and fewer of those. Tom was mostly answering old questions. But they were fun to read and you could really get insight to his thinking. That's what I needed the most. The Why of doing things. I think this post illustrates more the Why, I still read that one from time to time.

Then a couple of years ago he began blogging. That really gave me a view into his mindset. I learned about instrumentation there, how to ask questions, how to answer them and the rule of thumb, to name but a few.

I think that was the first blog I read consistently.

I found his advice and his technical expertise inspiring. More than anything though, I liked have a view into his world. I believe that alone helped me get over the technical hurdle, to begin to really understand what was going on and why I should do things a particular way.

I hope I can do the same. I want to share my experiences, challenges and mistakes so that others may learn from them. I also want to provide more technical content, even though much of it is answered in one place or another, just because I have a different take. Someone might relate to my style and find me inspiring (that would be way cool).

I now consume about 40 or 50 different blogs daily. Most of them are Oracle related, but I also read many business blogs, opinion blogs, security blogs and data warehousing blogs (though I haven't found one yet that really inspires).

I believe it is a good thing to be well rounded and I try to be.

So that's why I blog. I want to share. Hopefully you'll find something you can relate to here.

Labels: ,

 
  Good Day to Worse Day
Today I got the opportunity to have lunch with my CIO.

A few weeks ago I sent him a manifesto, which I would now classify as more of a philosophy. He kept promising me he would articulate a response via email. Being the CIO of a Fortune 400 company, I figured he had better things to do than to write out an email to me. So I offered him up a trade, lunch in exchange for the email. Surprisingly, he agreed.

Today was the day but I fully expected him to cancel; surely something else would come up. Nothing did, but he did move it back by 15 minutes.

Down to the cafeteria we went (I was really hoping to go out to lunch, just to get a ride in his Porsche Gemballa). We sat in a booth and started talking. We discussed everything from my group (excellent group of people, talented and fun), using MySQL databases for one-off projects (I was for putting them in a single Oracle database), to the state of our current OLTP application (crud).

He mentioned user-defined fields (OLTP) and I told him about one instance where someone in our company created those in an internal application. I didn't say anything at the time because it was not in my group and I didn't want to call someone out for something I thought was wrong. He told me I should have, that it would be in the best interests of the company. Then he said something that I have heard him say in our All-Hands meeting, "Let me be the one that makes the wrong decision."

That sealed the deal for me. I have liked him and what he has done since he got here, but that one comment told me that he took his job as leader seriously. I was thoroughly impressed.

So that was the good (great) part of the day. I felt great because our CIO listened to me prattle on for an hour and listened to me. He even used one of my analogies (well, not mine really) in his management meeting a short time later.

Now on to the worse part.

The application I have been working on for the last few months required an Emergency Fix (EFIX) because they had detected a bug. I realized quickly that I was the culprit. Something that had worked previously was changed by me in an effort to re-factor the code. It wasn't broken. There was no specific business requirement to re-factor it, I just did it...and screwed it up. The ironic part is I had just sent out an article to my co-workers about discipline making good developers.

I told this to the Business folks, what I had done; and apparently I hadn't earned any brownie points with them because they escalated it to my boss and VP. Which of course had to go to the CIO as well...

I definitely screwed up. There's no way around that. I know better than that. Oh well. It was certainly a lesson in humility. I'm just thankful I still have a job...

Labels: , , ,

 


Guest Authors

How To

Popular

Previous Posts

Code Projects

Archives
August 2007 / September 2007 / October 2007 / November 2007 / December 2007 / January 2008 / February 2008 / March 2008 / April 2008 / May 2008 / June 2008 / July 2008 / August 2008 / September 2008 / October 2008 / November 2008 / December 2008 / January 2009 / February 2009 / March 2009 / April 2009 / May 2009 / June 2009 / July 2009 / August 2009 / September 2009 / October 2009 / November 2009 / December 2009 / January 2010 / February 2010 /


Aggregated by OraNA