<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14022687</id><updated>2012-01-04T18:39:46.814-05:00</updated><category term='virtualization'/><category term='soccer'/><category term='SQL'/><category term='crap'/><category term='food'/><category term='Linux'/><category term='programming'/><category term='hockey'/><category term='music'/><category term='testing'/><category term='Windows'/><category term='HTC EVO'/><category term='Oracle'/><category term='SSIS'/><category term='rant'/><category term='humor'/><title type='text'>The Grouch Blog</title><subtitle type='html'>A grumpy wasteland of garbage from the brain of a grouchy person...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://grouchgeek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default?start-index=101&amp;max-results=100'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>302</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14022687.post-1888243917460136664</id><published>2011-02-28T20:41:00.003-05:00</published><updated>2011-02-28T21:00:51.475-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>I hate it when I am wrong</title><content type='html'>&lt;p&gt;I recently learned that one of my &lt;a href="http://grouchgeek.blogspot.com/2009/09/crud-with-oracle-merge-statement.html"&gt;blog posts about the Oracle MERGE statement&lt;/a&gt; has one not one-hundred percent correct statement.&lt;/p&gt;&lt;p&gt;"This means the DELETE does not use column data in the USING clause sub-query; very important. Some column in the UPDATE must be updated for the DELETE to work. To handle this set one or more columns to values that would never appear (in combination) in the data and use those values as a delete trigger."&lt;/p&gt;&lt;p&gt;From Oracle 10g 2 and higher SQL Guide: "Specify the DELETE where_clause to clean up data in a table while populating or updating it. The only rows affected by this clause are those rows in the destination table that are updated by the merge operation. That is, the DELETE WHERE condition evaluates the updated value, not the original value that was evaluated by the UPDATE SET ... WHERE condition. If a row of the destination table meets the DELETE condition but is not included in the join defined by the ON clause, then it is not deleted. Any delete triggers defined on the target table will be activated for each row deletion."&lt;/p&gt;&lt;p&gt;To clarify:&lt;/p&gt;&lt;p&gt;The DELETE WHERE condition can reference a column from the USING (the source) but the row table in the MERGE INTO (the target) must be have a column updated.&lt;/p&gt;&lt;p&gt;I need to do more experimentation before I correct previous posts and the best way to code for this. I am guessing that a "transaction" column can be in the source (USING) and then that can be tested on the DELETE WHERE and is part of a DECODE(u.indicator,'DELETE','i.column,u.column) so false data are not needed for columns with a NOT NULL constraint.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1888243917460136664?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1888243917460136664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1888243917460136664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1888243917460136664'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/02/i-hate-it-when-i-am-wrong.html' title='I hate it when I am wrong'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8808558358953187056</id><published>2011-02-02T12:19:00.001-05:00</published><updated>2011-02-02T12:20:45.344-05:00</updated><title type='text'>PCI compliance</title><content type='html'>Why do searches for PCI compliance on the database return only links to people selling software and or consulting services?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8808558358953187056?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8808558358953187056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8808558358953187056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8808558358953187056'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/02/pci-compliance.html' title='PCI compliance'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-264003955935586261</id><published>2011-01-27T18:40:00.002-05:00</published><updated>2011-01-27T18:54:23.291-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>New mobos and 16GB memory</title><content type='html'>So I'm going through Newegg looking at motherboard plus AMD processor combo deals, tempting myself to spend money. I want a system with 16GB of memory so I can do virtualization (as in Windows DC, SQL Server, Oracle Database all running at the same time). The first five motherboards I look at support 16GB of DDR3 memory in their specifications at Newegg and at the manufacturer website but when you look at the memory compatibility list NONE of them have verified configurations with 16GB of memory. &lt;strong&gt;NONE&lt;/strong&gt; of them. How can you claim support without verification? The most common verified configuration was 2GB of memory. Who the FRAK buys a high end motherboard with the intent of having only 2GB of memory. That will barely run Windows 7 Ultra Professionasupercalifrakkinfantastic 64bit turbo while watching Blue-Ray movies and playing Crysis 2 full screen at 2 billion frames per second.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-264003955935586261?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=264003955935586261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/264003955935586261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/264003955935586261'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/01/new-mobos-and-16gb-memory.html' title='New mobos and 16GB memory'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4806559725301450673</id><published>2011-01-21T06:00:00.002-05:00</published><updated>2011-01-21T09:11:15.187-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><title type='text'>VMWare teams, part one</title><content type='html'>&lt;p&gt;I'm fartin' around with Teams in VMWare Workstation and publishing steps I have used.&lt;/p&gt;&lt;h4&gt;Team&lt;/h4&gt;&lt;p&gt;What you will need:&lt;ul&gt;&lt;li&gt;Windows Server 2008&lt;/li&gt;&lt;li&gt;VMWare Workstation&lt;/li&gt;&lt;li&gt;hardware with at least 4 GB of memory and 200 GB of disk&lt;/li&gt;&lt;li&gt;patience&lt;/li&gt;&lt;li&gt;some beer or alcohol of choice helps too&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Steps:&lt;ol&gt;&lt;li&gt;Create a Team&lt;/li&gt;&lt;li&gt;New Team; named SewerSystem&lt;/li&gt;&lt;li&gt;Don't add VMs yet&lt;/li&gt;&lt;li&gt;Add one LAN segment&lt;/li&gt;&lt;li&gt;Finish&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;h4&gt;VM1 - Domain Controller&lt;/h4&gt;&lt;p&gt;Steps:&lt;ol&gt;&lt;li&gt;Add new VM; Typical for Windows 2008 Server Core (easy install) SepticTank located in the SewerSystem directory&lt;/li&gt;&lt;li&gt;Modify VM configuration to have a single NIC on the LAN segment&lt;/li&gt;&lt;li&gt;Let easy install do the OS and VMware tools, create a user called sadmin&lt;/li&gt;&lt;li&gt;Log in as sadmin after installation completes and reboots a couple times; there should be a command window:&lt;/li&gt;&lt;li&gt;netdom renamecomputer %USERDOMAIN% /NewName:DC1&lt;/li&gt;&lt;li&gt;netsh interface ip set address "Local Area Connection" static 192.168.0.1 255.255.255.0 192.168.0.1 1&lt;/li&gt;&lt;li&gt;net user Administrator Passw0rd1234&lt;/li&gt;&lt;li&gt;shutdown /r /f /t 0 /d p:2:3 /c "STFU"&lt;/li&gt;&lt;li&gt;start /w ocsetup DNS-Server-Core-Role&lt;/li&gt;&lt;li&gt;dcpromo /unattend /AutoConfigDNS=Yes /DomainNetBiosName=grouchnet /NewDomainDNSName=grouch.net /ReplicaOrNewDomain=Domain /NewDomain=Forest /ForestLevel=3 /DomainLevel=3 /SafeModeAdminPassword="Passw0rd1234"&lt;/li&gt;&lt;li&gt;net user a-grouchy "Passw0rd1234" /add /fullname:"A Grouch" /domain&lt;/li&gt;&lt;li&gt;net group "Domain Admins" "a-grouchy" /add /domain&lt;/li&gt;&lt;li&gt;net user e-grouchy "Passw0rd1234" /add /fullname:"A Grouch" /domain&lt;/li&gt;&lt;li&gt;net group "Enterprise Admins" "e-grouchy" /add /domain&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Step descriptions:&lt;ol&gt;&lt;li&gt;duh&lt;/li&gt;&lt;li&gt;duh&lt;/li&gt;&lt;li&gt;duh, the easy install can't log in as Administrator so create one&lt;/li&gt;&lt;li&gt;duh, I had to log in once or twice and reboot&lt;/li&gt;&lt;li&gt;rename computer&lt;/li&gt;&lt;li&gt;set NIC to static IP&lt;/li&gt;&lt;li&gt;set Administrator password (was blank)&lt;/li&gt;&lt;li&gt;reboot&lt;/li&gt;&lt;li&gt;configure DNS&lt;/li&gt;&lt;li&gt;configure domain controller (reboots)&lt;/li&gt;&lt;li&gt;add a domain admin user&lt;/li&gt;&lt;li&gt;add to the domain admin group&lt;/li&gt;&lt;li&gt;add an enterprise admin user&lt;/li&gt;&lt;li&gt;add to the enterprise admin group&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;References:&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.technet.com/b/benp/archive/2008/06/20/how-to-configure-a-server-core-domain-controller-vanilla-to-first-dc-in-a-forest.aspx"&gt;How to Configure a Server Core Domain Controller: Vanilla to First DC in a Forest&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4806559725301450673?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4806559725301450673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4806559725301450673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4806559725301450673'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/01/vmware-teams-part-one.html' title='VMWare teams, part one'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2738837281324138727</id><published>2011-01-20T07:53:00.000-05:00</published><updated>2011-01-20T12:44:33.900-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><title type='text'>VMWare host-only network, part one</title><content type='html'>&lt;p&gt;I'm fartin' around with host-only networking in VMWare Workstation and publishing steps I have used.&lt;/p&gt;&lt;h4&gt;VM1 – domain controller with DNS&lt;/h4&gt;&lt;p&gt;What you will need:&lt;ul&gt;&lt;li&gt;Windows Server 2008&lt;/li&gt;&lt;li&gt;VMWare Workstation (will differ for other virtualization products)&lt;/li&gt;&lt;li&gt;hardware with at least 4 GB of memory and 200 GB of disk&lt;/li&gt;&lt;li&gt;patience&lt;/li&gt;&lt;li&gt;some beer or alcohol of choice helps too&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Steps:&lt;ol&gt;&lt;li&gt;Create a VM for Windows 2008 Server (easy install)&lt;/li&gt;&lt;li&gt;Modify VM configuration to have a single NIC, host-only network&lt;/li&gt;&lt;li&gt;Let easy install do the OS and VMware tools&lt;/li&gt;&lt;li&gt;Log in as Administrator then set up the NIC with a static IP address (usually 192.168.xxx.yyy with yyy usually 128, subnet 255.255.255.0 default gateway 192.168.xxx.001)&lt;/li&gt;&lt;li&gt;Personal preference: change the computer name and description from the default WIN-K7AATU-BARADA-N1KT08 to something reasonable and easy to remember&lt;/li&gt;&lt;li&gt;Reboot&lt;/li&gt;&lt;li&gt;Log in as Administrator&lt;/li&gt;&lt;li&gt;Run dcpromo.exe; Active Directory Domain Services will begin installing&lt;/li&gt;&lt;li&gt;At the Active Directory Domain Services Installation Wizard leave "Use Advanced mode installation"; Next&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;Create a new domain in a new forest; Next&lt;/li&gt;&lt;li&gt;Enter a Fully Qualified Domain Name of the forest root domain (grouch.net, b.org, example.com, ...); Next&lt;/li&gt;&lt;li&gt;Select Windows Server 2008 as the Forest Functional Level; Next&lt;/li&gt;&lt;li&gt;In Additional Domain Controller Options page, select DNS server; Next&lt;/li&gt;&lt;li&gt;Click Continue for the manual delegation message&lt;/li&gt;&lt;li&gt;Accept the defaults for database, log files and SYSVOL folders; Next&lt;/li&gt;&lt;li&gt;Enter a Directory Services Restore Mode Administrator Password (DSRM); Next&lt;/li&gt;&lt;li&gt;Summary; Next&lt;/li&gt;&lt;li&gt;Check Reboot on completion then go get a beer or five&lt;/li&gt;&lt;li&gt;Log in as Administrator of your new domain controller and finish your beers&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;References&lt;ul&gt;&lt;li&gt;&lt;a href="http://tsells.wordpress.com/tag/host-only-network/"&gt;How to test Windows Authentication with Applications and VMware Workstation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windowsreference.com/windows-server-2008/step-by-step-guide-for-windows-server-2008-domain-controller-and-dns-server-setup/"&gt;Step By Step Guide for Windows Server 2008 Domain Controller and DNS Server Setup&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2738837281324138727?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2738837281324138727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2738837281324138727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2738837281324138727'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/01/vmware-host-only-network-part-one.html' title='VMWare host-only network, part one'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3302537583896607726</id><published>2011-01-19T18:30:00.003-05:00</published><updated>2011-01-19T18:41:44.793-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Throw some server at it</title><content type='html'>&lt;p&gt;From one developer to another; use as much memory and resources as possible because the servers can handle it and we need to make our lives easier.&lt;/p&gt;&lt;p&gt;There are a few vomit inducing things that pop into my mind when I hear things like that.&lt;/p&gt;&lt;p&gt;I fully comprehend and realize that the days of C.I.C.S. and nitpicking over kilobytes of memory are over in favor of get it done now and throw resources at it world of today. We have scalable clouds now, right? Why bother doing something efficiently when you can just do it, get it done and make yourself look good (or save your job, or make your resource manager look good). Just add another node.&lt;/p&gt;&lt;p&gt;Something has to give somewhere though.&lt;/p&gt;&lt;p&gt;As noted in a previous post, adding a millisecond to each transaction might seem like nothing in the long run but when millions of transactions are taking place and those milliseconds multiplying like those bunnies from that Monty Python movie; there will be performance issues.&lt;/p&gt;&lt;p&gt;Then the developers complain to the system administrators and users complain to the help desk (who also complain to the system administrators) and web users complain or simply take their business elsewhere which causes the business units to complain to their managers who meet over lunch at a bistro with IT managers who then order the system administrators to fix it.&lt;/p&gt;&lt;p&gt;Resources are finite, even in a cloud.&lt;/p&gt;&lt;p&gt;Resources are finite on the client, too. Many in the younger generation would rather do things on their phones than sit in front of a computer and not every phone has Flash, Silverlight, etc. or enough display space to handle the additional burden of poorly conceived code.&lt;/p&gt;&lt;p&gt;I just thought of a business model. I'll ask your managers if they are having performance problems and then charge by the hour to point out issues that will cause a crap-ton of meetings, lots of paper to be printed, and inner turmoil to increase between the development staff and administrators while users think I'm a minor god (or something).&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3302537583896607726?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3302537583896607726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3302537583896607726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3302537583896607726'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2011/01/throw-some-server-at-it.html' title='Throw some server at it'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7520240033279043879</id><published>2010-12-13T07:08:00.002-05:00</published><updated>2011-01-19T18:36:12.299-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Another crapplication</title><content type='html'>&lt;p&gt;It never ceases to amaze me how software that sells for five figures or more can contain so much shit code. My most recent example: I noticed a CPU hogging process running on our Oracle server and was astonished at two things. First thing was a SELECT * in a static query containing eight inner joins. The second item was that same statement (and over 3000 almost identical statements) was not using a bind variable in the WHERE clause for the primary key (a VARCHAR2(254) containing a GUID).&lt;/p&gt;&lt;p&gt;There is no excuse for production code containing a SELECT * from any number of tables. What made this example even more inexcusable was the table contained a BLOB and judging by the pattern of other SQL statements these queries were pulling back a description and last updated by date.&lt;/p&gt;&lt;p&gt;There is only one excuse that I know of to NOT use bind variables in prepared statements. To be honest, I do not know if this is one hundred percent true of Oracle or other databases, but if the query is selecting by status or other column where the difference between the counts of the values is extreme then it would be best to not use a bind variable on that status. If a table contains a billion orders where status is filled and a couple hundred with a status of cancelled and the query is selecting only by status then using a bind variable might not provide an optimal plan for both situations (it might use a full table scan on filled and index for cancelled). In the above example, the software was creating, parsing, opening, fetching then closing the same logic SQL thousands of times when it should have created, parsed once then bound and executed (reused) thousands of times. It was a single row select by primary key (a GUID even) and that should always be done using a bind variable.&lt;/p&gt;&lt;p&gt;The developers might not be at fault here. The above scenario reeks of poor, generated, object oriented code. Get the primary keys for all of your data objects then read them one by one to display on some dumb-ass web page. More likely: read incoming XML data stream into business logic tier then instantiate all the needed business and data turds then have the business turds use the data turds to retrieve data using the exact opposite of a single, bound, efficient SQL statement, then convert the results of all the turds to XML so the rendering engine can puke it out to a web browser, iDroid, dumb phone, really dumb phone, tablet, pad, tampon, car dashboard, HAM radio or intelligent kitchen appliance.&lt;/p&gt;&lt;p&gt;What frustrates me is that I am seeing this crap in a pricey application. I would be tolerant it were coming from some schmuck trying to write an application to pay his (or her, no wait, probably his) way through college. This application has numerous customers, all of which are suffering with this crapplication and the unlucky system administrators are stuck between the bean counters and the vendor when attempting to tune the piece of weasel poop.&lt;/p&gt;&lt;p&gt;&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:30433844824883"&gt;A good Ask Tom article&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7520240033279043879?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7520240033279043879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7520240033279043879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7520240033279043879'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/12/another-crapplication.html' title='Another crapplication'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2748567361076357100</id><published>2010-11-23T04:14:00.000-05:00</published><updated>2010-11-23T16:17:36.941-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTC EVO'/><title type='text'>HTC EVO the first month</title><content type='html'>&lt;p&gt;I have had my HTC EVO for over a month now. The experience has been good so far.&lt;/p&gt;&lt;p&gt;I have a couple of nitpicks. The message indicator light should flash while the device is connected to a charger or USB. SMS messages and mail messages should have the option of repeating the notification tone until responded to (like a pager).&lt;/p&gt;&lt;p&gt;Battery life is poor but what can anyone expect. Does anyone really believe they will be watching HD video over 4G without sucking that wafer-thin battery dry in less than an hour? If I rarely use the device the battery will be around 53 percent charged by the end of the day; with no Wi-Fi, 4G, Bluetooth or GPS services active. The wife uses Pandora all day at work so she leaves the phone attached via USB all day. Anyone texting, talking and Facebarfing and Twitching all day will likely not have a charge at the end of the day.&lt;/p&gt;&lt;p&gt;The 4G service is now available around my house out in the middle of nowhere but does not appear to be available in downtown Columbus where I work (strange). When I ran speed tests using 4G I was getting very mixed results depending upon where I was and what destination I was hitting. The down speed was comparable with Wi-Fi but the up-speed was much faster about half the time. The whole 4G experience is going to need a year or two before it is widely usable and stable and firmware for phones with that service is stable.&lt;/p&gt;&lt;p&gt;I have also paid my first bill. The initial shock took a few beers to get through.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2748567361076357100?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2748567361076357100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2748567361076357100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2748567361076357100'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/11/htc-evo-first-month.html' title='HTC EVO the first month'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5148452352099173212</id><published>2010-11-16T13:27:00.001-05:00</published><updated>2010-11-17T20:45:41.740-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>Bye to Schelotto, Hejduk, more</title><content type='html'>&lt;p&gt;It is definitely a sad day for the Crew organization but in the long run it is just a day. We all knew that good guys like Oughton and Hejduk that have put a face on this team would no longer be able to contribute toward the common goal of the organization and most fans; hardware. Legends like Schelotto that brought class and talent would eventually either move on or be pushed out. Even Padula, the pirate at left back, who just a season or two ago was considered the key component of the Crew championship run, would fade away.&lt;/p&gt;&lt;p&gt;I think what makes today really hard to deal with is the sudden harshness of the events. Our season was over in an instant with a missed penalty and most of the heart, soul and leadership is likely gone just as abruptly. As the shock of the playoff loss set in maybe only a handful of people realized that would be the last time they would see those four players in a Crew uniform; it sure did not for me.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As mentioned in my previous blog post, I was hoping Schelotto was going to be retained one more season to help teach and shape the attacking midfield and his successor. That is what he should have been doing this 2010 season; getting his replacement ready and perhaps even using his last season as a rallying point to will the rest of the team back into the finals. Instead it is an abrupt end that will leave a bitter taste.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It is easy to feel like twice shat feces about this but it is now up to the Crew organization to deliver. They want to go young, fine. Fans have survived youth movements with each coach before Bob. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The most important priority now is to get that skilled player and face for the Crew. My wife knows little about soccer but she knew who Schelotto and Hejduk (the surfer dude with the long hair, no!) were and more importantly what they brought to the team: he was their best player and he was one of the favorite players (big fan favorite, remember the pictures of him in the north end). &lt;br /&gt;&lt;/p&gt;&lt;p&gt;We still need a finisher up top. I like Renteria but seriously, it is about time we invested a little more at the position beyond what we have done before.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I also am willing to hold off on judgment until we get some results. It will be months and a couple of drafts before the Crew will know where they need to throw their money. That is going to be a long, suck-ass couple of months, too. We were fortunate to have Schelotto and Hejduk while they were here and should be thankful for it. It is now up to the Crew to find the next group of players for us to be thankful for.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dispatch.com/live/content/local_news/stories/2010/11/15/gbs2_Schelotto.html"&gt;Fan-favorite Schelotto leaving Columbus Crew&lt;/a&gt; (TheDispatch)&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.dispatch.com/blog-18/2010/11/schelotto_has_elite_place_in_c.shtml"&gt;Schelotto has elite place in city's sports history&lt;/a&gt; - great comparison to Sergei Fedorov&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.dispatch.com/marace_nhl/2010/11/keep_gbs_around_1.shtml"&gt;Keep GBS around&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.massivereport.com/content/letter-mark-mccullers"&gt;A letter from Mark McCullers&lt;/a&gt; (MassiveReport)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Also, just read on the forums: &lt;a href="http://www.barleysbrewing.com/downtown/"&gt;Barley's Christmas Ale Guest Tapper: Columbus Crew captain Frankie Hejduk&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5148452352099173212?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5148452352099173212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5148452352099173212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5148452352099173212'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/11/bye-to-schelotto-hejduk-more.html' title='Bye to Schelotto, Hejduk, more'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1360737248983309610</id><published>2010-11-11T17:39:00.005-05:00</published><updated>2010-11-11T20:00:30.099-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTC EVO'/><title type='text'>Custom EVO wallpapers</title><content type='html'>&lt;p&gt;There appears to be a lot of confusion and mixed information on the best way to do wallpapers for the HTC EVO mobile device. There are about four resolutions and a couple of techniques in various forums. I did some of my own research and this is what I found. I assume you are using a stock device and have not removed the base UI.&lt;/p&gt;&lt;p&gt;The EVO screen is 480 x 800 (pixels; all numbers are in pixels).&lt;/p&gt;&lt;p&gt;There are seven homes per scene; the middle and three to the left and to the right.&lt;/p&gt;&lt;p&gt;The best resolution for incoming images is 960 x 800.&lt;/p&gt;&lt;p&gt;When choosing wallpaper, expand the green boundary box to use the entire image. This results in the least amount of distortion of the final image displayed on the EVO homes.&lt;/p&gt;&lt;p&gt;The top 38 pixels will never be seen; they are covered by the status bar. If you have an embarrassing zit on your forehead or do not want to folks to know you are a NASCAR fan then make sure your acne and logos are in the top 38 pixels of the wallpaper.&lt;/p&gt;&lt;p&gt;The leftmost and rightmost 48 pixels will never be seen. On the left side, pixels 1-48 are hidden, 49-59 can be seen momentarily when swiping right when on the leftmost home, and pixel 60 bleeds onto the leftmost home. On the right side it is the same just in reverse; but the last pixel does not bleed into the rightmost home.&lt;/p&gt;&lt;p&gt;The bottom 56 to 70 pixels are usually hidden by the lock/menu bar except when you pinch and then select a home and when the device is locked. So food stains on your shirt, nipples and muffin tops would go in that area.&lt;/p&gt;&lt;p&gt;The extended homes do not have their own separate wallpaper. The center home is in the middle 480 x 800 pixels of your wallpaper. When you swipe in a direction to get to one of the extended homes the wallpaper is shifted 60 pixels in that direction (240 pixels on each extended side, 60 of those are not visible). &lt;/p&gt;&lt;p&gt;So start with a 840 x 762 image assuming that the bottom 60 or so pixels will be seen when the device is locked but usually will be hidden. Add borders (solid black is fine) to the top, left and right to make the image 960 x 800. Send it to your device using whatever method you choose and then enjoy.&lt;/p&gt;&lt;p&gt;Of course, someone from HTC will come along and probably debunk all of this but it works for me.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1360737248983309610?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1360737248983309610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1360737248983309610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1360737248983309610'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/11/custom-evo-wallpapers.html' title='Custom EVO wallpapers'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8251152661277275558</id><published>2010-11-08T19:53:00.001-05:00</published><updated>2010-11-17T18:25:46.331-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>The Columbus Crew 2010, summary</title><content type='html'>&lt;p&gt;I find myself in a similar situation. &lt;a href="http://grouchgeek.blogspot.com/2009/11/hello.html"&gt;Last year on this day I wrote about the premature Columbus Crew exit from the MLS playoffs Thursday to Real Salt Lake&lt;/a&gt;. This season the same thing has happened, just at the hands of the Colorado Rapids. So when I look back at that 2009 season post what has changed and what has stayed the same?&lt;/p&gt;&lt;p&gt;I still hate the MLS playoff system and feel it gives the advantage to the lesser record team because the lesser team is likely to use the home field advantage to get more goals in the first game then play a quote boring defensive system assuming the top seeded team must score win by one more goal than the deficit.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There were positive spots to the 2010 season. The Crew made it to the playoffs (falling to Colorado on a missed penalty kick), to the finals of the Lamar Hunt U.S. Open Cup (falling to Seattle), and are still in the CONCACAF Champions Cup/Champions League.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sagging attendance would probably lead the negative points when the league and cup results are removed. The Crew did not find a replacement for Schelotto (that we know of). Some players that should have been relegated to the bench this season are still signed through next season.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I also think it still boils down to one word: inconsistency. First there was the inconsistent lineup due to injuries to key players like Rogers, O'Rourke, Hesmer and Renteria. Second, inconsistent performances from Rogers, Hejduk, Hesmer, Padula, and Schelotto in some ways. Forwards would be hot one game, go cold, go to the bench for another forward, that forward would be hot, etc. Third, inconsistent coaching. Robert Warzycha seemed to get out-coached near the end of the season (again) and many have questioned his line-up choices.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So (again) where does the Crew go from here?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Warzycha is not the immediate problem. If Kreis and Nowak can coach and get results then Warzycha can. The Crew organization as a whole is degrading before our eyes from the top down. The Crew need a shot in the arm from somewhere whether it be an exciting new player or some new feature of the team or something marketable.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I will probably get laughed at for this but I think we should find some way to get Jon Busch back as backup keeper. Jon is one of those franchise players you would like to always have on your team in some way shape or form. Bring him back to where he started. Gruenebaum would probably go.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In the defense we need to find a replacement for Hejduk in a starting role. Francis can start for Padula if we keep him. I am guessing Iro or Brunner will go to expansion leaving O'Rourke in the mix with Marshall.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Gaven and Carroll are the only midfield players I would keep. Moffat had sub-adequate performances (again, inconsistency). Ekpo and Burns are good players. Rogers is a huge question mark but I would love to see him get a solid season with Schelotto. Oughton and can be kept with the team as long as it is feasible to do so. Schelotto should be retained for one more season but the Crew need to find his replacement this season.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The forward spots need overhauled. Garey will likely go to expansion. Renteria should start and if Mendoza can put in a consistent performance like the one at the home playoff match then he should be in the mix as well. Lenhart is a bench player. We could still use a quality striker but I do not see us getting one, ever (pessimistic but realistic).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If I were asked to name the priorities for the 2011 season they would be: retain Schelotto for one more season as a player, acquire Schelotto's replacement so he can work alongside Guillermo and develop to lead the team. The next thing the Crew needs is a forward capable of playing with Schelotto (and his successor) and scoring a bucket load of goals. Warzycha should be retained as coach unless an obvious and adequate replacement is both available and feasible for the organization. Last, the Crew need a shot in the arm in the form of something exciting in the organization or a charismatic player to get some buzz generated about the team.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8251152661277275558?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8251152661277275558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8251152661277275558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8251152661277275558'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/11/columbus-crew-2010-summary.html' title='The Columbus Crew 2010, summary'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7399147889134512527</id><published>2010-10-19T22:15:00.002-04:00</published><updated>2010-10-19T22:40:56.166-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Okay, I'm one of the sheep now</title><content type='html'>&lt;p&gt;I purchased a HTC EVO smart phone and service plan. I feel, strange...&lt;/p&gt;&lt;p&gt;It is a really nice device. Calling this and all other new generation of devices a phone is really stupid. A phone is something you shove in your ear and talk to someone with. This is a mobile device, not a phone.&lt;/p&gt;&lt;p&gt;It has the Android 2.2 system, etc. etc. You can look all of that crap up on Google.&lt;/p&gt;&lt;p&gt;Speaking of Google, the synchronization with Google contacts was instantaneous. Within two minutes the device was activated and all of my contacts were in the phone and ready to use. That is very awesome. Facebook and Yahoo crap works too.&lt;/p&gt;&lt;p&gt;The process of purchasing the device took two hours. I have a history with, um, Tnirps. It took nine years to clear up this history and it still was not totally clean when we went to the Tnirps store. The Tnirps store was a petri dish of the most odd, obnoxious, and just some of the worst examples of humanity. The chick with the tattoos and the half mohawk was interesting. Then there was the two gangstas that were both stoned solid and bitching about the five minute wait. Disgusting. &lt;/p&gt;&lt;p&gt;What sucks about the HTC EVO is that Tnirps is charging us an extra $10 a month for 4G service that does not exist in any consistently reliable form within a hundred miles of the city. What a crock. The stand Tnirps takes is, tough cookies; pay the $10 and we might get you 4G service by November.&lt;/p&gt;&lt;p&gt;Just because I am one of the sheep now does not make me not hate the people that drive while using their phones and devices. I saw some woman trying to manage her mobile device while driving on I-70 in rush hour traffic; not paying attention at all to the road and vehicles in front of her.&lt;/p&gt;&lt;p&gt;They should create a special lane for cell phone drivers; just like the special lane for bus and taxi services. Every mile should have a turn off that leads into a car crusher so if the driver is not paying attention they get in a one way lane to a 6 foot square of death. If you get to your destination without crashing into someone or causing an accident behind you or getting demolished by the idiot on the phone behind you and can pay attention enough to not get sucked into the car crusher then congratulations.&lt;/p&gt;&lt;p&gt;Once I get past making backgrounds for my home pages and ring tones using Bender from Futurama I might actually learn how to use the device and have it become a valuable business and social (bwah hah hah) asset.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7399147889134512527?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7399147889134512527' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7399147889134512527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7399147889134512527'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/10/okay-im-one-of-sheep-now.html' title='Okay, I&apos;m one of the sheep now'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5348919865560429188</id><published>2010-08-11T16:49:00.002-04:00</published><updated>2010-08-11T16:58:14.652-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle FULL JOIN or UNION ALL</title><content type='html'>&lt;p&gt;Someone was kind enough to argue with me recently about doing a UNION ALL instead of a FULL JOIN in Oracle (&lt;a href="http://grouchgeek.blogspot.com/2009/09/crud-with-oracle-merge-statement.html"&gt;in a MERGE&lt;/a&gt;). This same poop chute also posted a spam link that probably led to some Trojan downloader.&lt;/p&gt;&lt;p&gt;To make a long post short, Oracle usually does what it thinks is the best way of fetching data and it is spot on most of the time. Hints and fresh statistics can be used when mother optimizer is not right.&lt;/p&gt;&lt;p&gt;Consider this table:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE TABLE megacrap AS&lt;br /&gt; SELECT&lt;br /&gt;   LEVEL AS mega_id&lt;br /&gt; , TO_CHAR(TRUNC(SYSDATE)-LEVEL,'MM/DD/YYYY') AS mega_varchar&lt;br /&gt; , TRUNC(SYSDATE,'YEAR')+LEVEL AS mega_date&lt;br /&gt; FROM DUAL&lt;br /&gt; CONNECT BY ROWNUM BETWEEN 1 AND 4000;&lt;br /&gt;ALTER TABLE megacrap ADD(CONSTRAINT pk_megacrap PRIMARY KEY(mega_id));&lt;/pre&gt;&lt;p&gt;Updated with this MERGE:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;MERGE INTO megacrap m&lt;br /&gt;USING (&lt;br /&gt; SELECT&lt;br /&gt;  NVL(v1.mega_id,t1.mega_id) AS mega_id&lt;br /&gt;, v1.mega_varchar&lt;br /&gt;, v1.mega_date&lt;br /&gt; FROM megacrap t1&lt;br /&gt; FULL JOIN (&lt;br /&gt;  SELECT&lt;br /&gt;    LEVEL AS mega_id&lt;br /&gt;  , TO_CHAR(TRUNC(SYSDATE)-LEVEL,'MM/DD/YYYY') AS mega_varchar&lt;br /&gt;  , DECODE(LEVEL,420,NULL,TRUNC(SYSDATE,'YEAR')+LEVEL) AS mega_date&lt;br /&gt;  FROM DUAL&lt;br /&gt;  CONNECT BY ROWNUM BETWEEN 1 AND 4100 --- 100 new rows&lt;br /&gt; ) v1 ON v1.mega_id = t1.mega_id&lt;br /&gt; WHERE v1.mega_id IS NULL OR v1.mega_id NOT IN(1,2,69) --- delete 1,2,69&lt;br /&gt;) u&lt;br /&gt;ON (m.mega_id = u.mega_id)&lt;br /&gt;WHEN MATCHED THEN&lt;br /&gt;UPDATE SET&lt;br /&gt;  m.mega_varchar = u.mega_varchar&lt;br /&gt;, m.mega_date = u.mega_date&lt;br /&gt;WHERE DECODE(m.mega_varchar,u.mega_varchar,1,0) = 0 OR DECODE(m.mega_date,u.mega_date,1,0) = 0&lt;br /&gt;DELETE WHERE m.mega_varchar IS NULL&lt;br /&gt;WHEN NOT MATCHED THEN&lt;br /&gt;INSERT VALUES (&lt;br /&gt;  u.mega_id&lt;br /&gt;, u.mega_varchar&lt;br /&gt;, u.mega_date&lt;br /&gt;);&lt;/pre&gt;&lt;p&gt;Guess what the plan looks like: MERGE STATEMENT&lt;ul&gt;&lt;li&gt;MERGE MEGACRAP&lt;ul&gt;&lt;li&gt;VIEW&lt;ul&gt;&lt;li&gt;HASH JOIN OUTER&lt;ul&gt;&lt;li&gt;VIEW&lt;ul&gt;&lt;li&gt;&lt;b&gt;UNION ALL&lt;/b&gt;&lt;ul&gt;&lt;li&gt;HASH JOIN RIGHT OUTER&lt;ul&gt;&lt;li&gt;VIEW&lt;ul&gt;&lt;li&gt;COUNT&lt;ul&gt;&lt;li&gt;CONNECT BY WITHOUT FILTERING&lt;ul&gt;&lt;li&gt;FAST DUAL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;INDEX PK_MEGACRAP FAST FULL SCAN&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;NESTED LOOPS ANTI&lt;ul&gt;&lt;li&gt;VIEW&lt;ul&gt;&lt;li&gt;COUNT&lt;ul&gt;&lt;li&gt;CONNECT BY WITHOUT FILTERING&lt;ul&gt;&lt;li&gt;FAST DUAL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;INDEX PK_MEGACRAP UNIQUE SCAN&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;TABLE ACCESS MEGACRAP FULL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Mother optimizer decided a UNION ALL was the best option. Now which SQL statement do you want to code and maintain? The FULL JOIN above or the UNION ALL with GROUP BY or UNION ALL with GROUP BY and ANTI JOIN?&lt;/p&gt;&lt;p&gt;Oracle Database SQL Language Reference 11g Release 2 (11.2)&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/queries006.htm"&gt;Joins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/queries004.htm"&gt;UNION [ALL], INTERSECT, MINUS Operators&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5348919865560429188?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5348919865560429188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5348919865560429188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5348919865560429188'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/08/oracle-full-join-or-union-all.html' title='Oracle FULL JOIN or UNION ALL'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7325503530250787009</id><published>2010-08-09T21:45:00.003-04:00</published><updated>2010-08-09T21:52:10.444-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Cell phones while driving, again</title><content type='html'>&lt;p&gt;I have become sick and tired of people in general. The stupidity and callousness of the masses whittles away at my patience every day, day after day. I grasp for signs of humanity but rarely find genuine goodness in anyone. What makes me write today is something that has caused me to rant before. This time the topic could have caused loss of my health or even my life.&lt;/p&gt;&lt;p&gt;&lt;p style="margin-bottom: 0in"&gt; &lt;p style="margin-bottom: 0in"&gt;Someone on a cell phone nearly ran me off the road this morning on route 33 on my way to work. She started moving over into my lane forcing me to brake and travel over the rumble strips and partially into the grass at about 60 miles per hour. She must have hit her breaks and slowed down as I recovered back onto the road and accelerated as far as I could away from her and her vehicle. I was sick to my stomach for a good thirty minutes after that. I should have tossed my cookies at work, I probably would have felt better.&lt;/p&gt;&lt;p style="margin-bottom: 0in"&gt; &lt;p style="margin-bottom: 0in"&gt;Two weeks ago someone in a car with a cell phone stuck to her ear blatantly ran a red light in front of me, coming about two feet from colliding with my car. She gestured to me like as if I did something wrong. She ran the red light from a semi-blind spot for me, from behind a bridge.  &lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;The was also an asshole that made a left turn in front of me as I was making a right turn but at least he was not on a cell phone; unless he was using hands-free Bluetooth crap.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Cell phones while driving are dangerous. It does not matter how much technology is thrown at this it will not change how irresponsible some people are. These people are not going to change until they collide with another vehicle or wrap their car around a light pole or kill someone. I do not want to be that statistic.  &lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;If you get a call then either offer to call back or pull over somewhere and talk.&lt;/p&gt;&lt;p style="margin-bottom: 0in"&gt;I do not want my tombstone to read "killed by some douchebag driving a Durango while blabbing on a cell phone"&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7325503530250787009?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7325503530250787009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7325503530250787009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7325503530250787009'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/08/cell-phones-while-driving-again.html' title='Cell phones while driving, again'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8491205540493539961</id><published>2010-07-21T06:36:00.004-04:00</published><updated>2010-07-21T18:34:31.903-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Back to school, save big?</title><content type='html'>&lt;p&gt;I'm looking at the most recent Tramlaw savings newsletter and it had a back to school section aimed at college students. Yes, you new and returning college students can save money on college essentials like MP3 players, Oisiv flat panel LCD TVs and video games.&lt;/p&gt;&lt;p&gt;Huh? What is wrong with that picture.&lt;/p&gt;&lt;p&gt;First question, MP3 players? Get with the times. Most every smart phone and semi-intelligent phone, and flat out dumb phone can play your MP3 library. Why purchase another device; unless you have some Batman utility belt fetish?&lt;/p&gt;&lt;p&gt;Flat panel LCD? How about letting mom and dad have the LCD while you take their hand me down television. Who has the higher percentage of being burglarized and getting that nice, new LCD stolen; someone living on campus maybe?&lt;/p&gt;&lt;p&gt;Video games? Maybe for Christmas but not for new students. I'm also guessing that anyone already into video games has already been nurtured through childhood by five or six game consoles and probably does not need a new one. Serious gamers are going to want a gamer PC (see below) with quad-core, multi-video, SSD in RAID-0 goodness; which they also probably already have.&lt;/p&gt;&lt;p&gt;High ticket electronics for college students should start at laptops/netbooks. In this day and age they are almost a necessity.&lt;/p&gt;&lt;p&gt;In all fairness to Tramlaw, they do have an "off to college" department page that advertises their cheap-ass furniture and essentials like appliances, vacuum cleaners,  bedding, cheap storage and microwaves. That department also advertises the MP3 players, video games and mini-fridges that should be secondary to everything else a college student is going to need like outrageously priced books and lab materials, tuition, rent, fuel, utilities, food (Tramlaw covers that one, though), transportation and communications.&lt;/p&gt;&lt;p&gt;But hey, that is what student loans are for, right?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8491205540493539961?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8491205540493539961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8491205540493539961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8491205540493539961'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/07/back-to-school-save-big.html' title='Back to school, save big?'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4100272098685505170</id><published>2010-07-08T11:57:00.000-04:00</published><updated>2010-07-08T11:58:30.350-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Importing .csv into Google contacts</title><content type='html'>&lt;p class="MsoNormal"&gt;Yesterday I started work on creating a comma separated values file to import into Google for my looming smart phone purchase. &lt;/p&gt;&lt;p class="MsoNormal"&gt;I added a fake contact, Rod Vanhugendong, and all of Rod’s contact information including work, personal, birthday, etc. I exported that contact to a .csv file so I could get column headers and know where to put data.&lt;/p&gt;&lt;p class="MsoNormal"&gt;I put a group of contacts in, saved the file and then imported the data.&lt;/p&gt;&lt;p class="MsoNormal"&gt;My first attempt failed because all of the data got shoved into notes, not the individual fields. I searched Google help and found little from Google but numerous posts from individuals having similar issues. There were two solutions so I tried one and that appeared to work, eventually. The solution that worked put everything into sections with column headings like Section 1-Mobile.&lt;/p&gt;&lt;p class="MsoNormal"&gt;More on this later; I had some time to kill during lunch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4100272098685505170?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4100272098685505170' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4100272098685505170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4100272098685505170'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/07/importing-csv-into-google-contacts.html' title='Importing .csv into Google contacts'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8698856050563069600</id><published>2010-07-07T11:43:00.003-04:00</published><updated>2010-07-07T12:05:16.240-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Upgrade time, mini rant</title><content type='html'>&lt;p&gt;This is a little mini-rant. I was looking to upgrade my home workstation from an AMD X2 to a Phenom II quad-core and noticed there are six-core processors out now. I checked the Newegg reviews and had a laugh. &lt;/p&gt;&lt;p&gt;One purchaser had one of them with with 3TB of RAID10 and dual video cards and 8 GB of memory and the system can miraculously handle anything thrown at it. I would hope so. That system has more processing power than all the African nations that qualified for the World Cup it damn well be able to handle everything thrown at it.&lt;/p&gt;&lt;p&gt;Next you have the overclockers that are looking to squeeze that extra decimal out of their Windows 7 Ultimate score by running the processor with the fastest clock speed and the most cores beyond the unit specifications. It is a concept I just don't understand in the post-Celeron era of the 1990's. After the upgraded cooling the cost is more than the next step up in processors with stock equipment.&lt;/p&gt;&lt;p&gt;I priced out some configurations and folks are dropping anywhere from $1,300 to $2,400 every 3 or 4 months when new technology comes out. Where are they getting the money?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8698856050563069600?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8698856050563069600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8698856050563069600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8698856050563069600'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/07/upgrade-time-mini-rant.html' title='Upgrade time, mini rant'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4706724542546775022</id><published>2010-06-29T22:38:00.003-04:00</published><updated>2010-06-29T22:54:39.481-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Hands free texting</title><content type='html'>&lt;p&gt;I just saw a spot on the local news about hands free texting. You talk into your bluetooth headset and your voice is converted to text so you can text your friends or post an Twitter update on your way home from work.&lt;/p&gt;&lt;p&gt;Seriously?&lt;/p&gt;&lt;p&gt;Why are people so desperate to do anything but drive when they are driving a car? Do we really need more distractions while operating machines capable of causing serious injury and death when used irresponsibly? Does that bitch on her cell phone yelling at me while speeding off in the wrong direction in the Walmart parking lot really need technology to Twitter the deal she just got kitty litter?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4706724542546775022?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4706724542546775022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4706724542546775022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4706724542546775022'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/06/hands-free-texting.html' title='Hands free texting'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-204006607062538955</id><published>2010-06-28T20:38:00.003-04:00</published><updated>2010-06-28T20:54:57.891-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Ubuntu 10.04 to WHS shares</title><content type='html'>&lt;p&gt;Ok so I have this Windows Home Server and I also have an Ubuntu 10.04 desktop that I would like to connect to this Windows Home Server. I tried Nautilus Windows Network and none of the work groups would mount. The original document from the Internet (duplicated about eighty times on different servers) offers no help beyond the "it should be there".&lt;/p&gt;&lt;p&gt;One post on Ubuntu forums suggested making a directory in /mnt for each Windows Home Server then mounting each share with mount -t cifs. To me this seems like a lot of work but I have not found another way to get this to work so install smbfs and create some directories.&lt;/p&gt;&lt;pre&gt;sudo aptitude install smbfs&lt;br /&gt;for i in Documents Music Photos Software Videos; do mkdir -p ~/Grouchy-WHS/$i; done&lt;/pre&gt;&lt;p&gt;To get shares to mount I had to specify a user and a password in the options but a single line for loop did the trick.&lt;/p&gt;&lt;pre&gt;for i in Documents Music Photos Software Videos; do sudo mount -t cifs -o user=grouchy,password=getbent //Grouchy-WHS.local/$i ~/Grouchy-WHS/$i; done&lt;/pre&gt;&lt;p&gt;Okay, now all I have to do is type the above line in whenever I want to get to the shares. That sounded stupid, so I tried making a custom panel launcher. No success. I eventually created a script to handle the mount and unmount.&lt;/p&gt;&lt;pre&gt;for i in Documents Music Photos Software Videos; do sudo umount //Grouchy-WHS.local/$i; done&lt;/pre&gt;&lt;p&gt;Both work from the terminal but I cannot get them to work from the panel application. It seems so simple.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-204006607062538955?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=204006607062538955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/204006607062538955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/204006607062538955'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/06/ubuntu-1004-to-whs-shares.html' title='Ubuntu 10.04 to WHS shares'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1532074158629159911</id><published>2010-04-27T14:50:00.005-04:00</published><updated>2010-06-22T16:49:20.963-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>2010 Oracle VM, part 2, OEM database</title><content type='html'>&lt;p&gt;First, create a linked clone of the OEL5.5 VM created in &lt;a href="http://grouchgeek.blogspot.com/2010/04/my-2010-oracle-vm-project-part-one.html"&gt;part one&lt;/a&gt;; call it something not stupid - like OEL5.5 OEMGRID. Quick note: you might need to bump the memory of this virtual machine to at least 1.5GB else the Oracle Database installer will complain; that did not happen the first time I did this but the second time I was about 3K (yes, 3 measly F'ing K) short of the minimum.&lt;/p&gt;&lt;p&gt;Start the cloned VM and log in as root.&lt;/p&gt;&lt;p&gt;I had the luxury of having a domain name and static IP address so I used the following tool to configure my network and then edited /etc/hosts:&lt;/p&gt;&lt;pre&gt;system-config-network-tui&lt;br /&gt;vi /etc/hosts&lt;br /&gt;10.9.8.7  grouch1.grouch.net grouch1&lt;br /&gt;:x&lt;/pre&gt;&lt;p&gt;I would reboot now so the rest can be handled through ssh and cut and paste (unless you like typing).&lt;/p&gt;&lt;h4&gt;Oracle Database Preinstallation Requirements&lt;/h4&gt;&lt;p&gt;Most of the chapter two Preinstallation Requirements have been set by installing .rpm package oracle-validated (part one). The oracle-validated .rpm installs all Oracle Database dependancies and also modifies /etc/sysctl.conf, /etc/security/limits.conf, /etc/modprobe.conf and /boot/grub/menu.lst to include kernel parameters. It also creates some of the users and groups. Login as root and execute this to finish up and add an administrative user:&lt;/p&gt;&lt;pre&gt;/usr/sbin/groupadd oper&lt;br /&gt;/usr/sbin/groupadd oracle&lt;br /&gt;/usr/sbin/usermod -g oinstall -G dba,oper,oracle oracle&lt;br /&gt;passwd oracle&lt;br /&gt;/usr/sbin/useradd grouchy&lt;br /&gt;/usr/sbin/usermod -g grouchy -G dba,wheel grouchy&lt;br /&gt;passwd grouchy&lt;/pre&gt;&lt;p&gt;Next step is to create the directories where software will be installed, for database files and for recovery files (note: in real life production land these could be on separate disks or one gigundous LUN, but we are happy fun test land so who cares)&lt;/p&gt;&lt;pre&gt;mkdir -p /u01/app/oracle&lt;br /&gt;mkdir -p /u02/oradata&lt;br /&gt;mkdir -p /u03/recovery_area&lt;br /&gt;chown -R oracle:oinstall /u01/app/oracle /u02/oradata /u03/recovery_area&lt;br /&gt;chmod -R 775 /u01/app/oracle /u02/oradata /u03/recovery_area&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;A reboot is not required but why not (what better way to test what you screwed up). Now might also be a good time to take a snapshot in VMWare.&lt;/p&gt;&lt;h4&gt;Oracle Grid Infrastructure&lt;/h4&gt;&lt;p&gt;The OEM VM will not be clustered and will not be using Automatic Storage Management (ASM) so the Grid Infrastructure for standalone server and Oracle Cluster Synchronization Services (CSS) are not required.&lt;/p&gt;&lt;h4&gt;Installing Oracle Database&lt;/h4&gt;&lt;p&gt;Login to the VM as root. Connect the database .iso image as a DVD or mount the DVD and connect that to the VM. If empty directory /media/cdrom does not exist then make it. As root, mount the CD (mount -t iso9660 -o ro /dev/cdrom /media/cdrom).&lt;/p&gt;&lt;p&gt;I use PuTTY with X11 forwarding enabled in my Ubuntu workstation (that I am running VMWare Workstation on) to connect to the VM as user oracle and do the installation.&lt;/p&gt;&lt;p&gt;First, edit ~/.bash_profile and append the following:&lt;/p&gt;&lt;pre&gt;umask 022&lt;br /&gt;ORACLE_BASE=/u01/app/oracle&lt;br /&gt;ORACLE_SID=orcl&lt;br /&gt;export PATH&lt;br /&gt;export ORACLE_BASE ORACLE_SID&lt;br /&gt;unset ORACLE_HOME&lt;br /&gt;unset TNS_ADMIN&lt;/pre&gt;&lt;p&gt;Do a quick . .bash_profile to execute that script. Next, create some directories in the oracle user home (personal preference):&lt;/p&gt;&lt;pre&gt;for i in backup crap expimp junk log run save scripts sql temp&lt;br /&gt;do&lt;br /&gt;mkdir ~/$i&lt;br /&gt;done&lt;br /&gt;cd ~/crap&lt;/pre&gt;&lt;p&gt;Start installing:&lt;ol&gt;&lt;li&gt;/media/cdrom/runInstaller&lt;/li&gt;&lt;li&gt;Skipped security updates; Yes&lt;/li&gt;&lt;li&gt;Installation Option; Install database software only&lt;/li&gt;&lt;li&gt;Grid Options; Single instance database installation&lt;/li&gt;&lt;li&gt;Product Languages&lt;/li&gt;&lt;li&gt;Database Edition; Enterprise Edition&lt;/li&gt;&lt;li&gt;Installation Location; Oracle Base: /u01/app/oracle  Software Location: /u01/app/oracle/product/11.2.0/dbhome_1&lt;/li&gt;&lt;li&gt;Create Inventory; &lt;b&gt;/home/oracle/oraInventory&lt;/b&gt;; *1&lt;/li&gt;&lt;li&gt;Operating System Groups;&lt;/li&gt;&lt;li&gt;Prerequisite Checks; all passed&lt;/li&gt;&lt;li&gt;Summary;&lt;/li&gt;&lt;li&gt;Install Product;&lt;/li&gt;&lt;li&gt;Finish&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;*1 pure laziness on my part because the preinstallation instructions never made nor setup privileges on the default /u01/app/oraInventory but now that I think about it the inventory directory should be outside of the whole OFA structure.&lt;/p&gt;&lt;h4&gt;Oracle Database Postinstallation Tasks&lt;/h4&gt;&lt;p&gt;I did not do anything here.&lt;/p&gt;&lt;p&gt;Go to &lt;a href="http://tahiti.oracle.com/"&gt;Tahiti&lt;/a&gt; and check out the installation guide for more information&lt;/p&gt;&lt;p&gt;Updates:&lt;dl&gt;&lt;dt&gt;06/22/2010:&lt;/dt&gt;&lt;dd&gt;Corrected errors, added smart-ass comments, etc. blah blah blah...&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1532074158629159911?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1532074158629159911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1532074158629159911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1532074158629159911'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/04/2010-oracle-vm-part-2-oem-database.html' title='2010 Oracle VM, part 2, OEM database'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4600470567118633286</id><published>2010-04-26T16:52:00.008-04:00</published><updated>2010-06-22T11:16:12.599-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>My 2010 Oracle VM project, part one</title><content type='html'>&lt;p&gt;As I look back through my blog there have been numerous ambitious attempts to do this but all have stopped before they got started. Pretty sad. Such is life, especially when you yearn to have one instead of fiddling around with software when you should be doing anything but.&lt;/p&gt;&lt;p&gt;Here are the constants:&lt;ul&gt;&lt;li&gt;VMWare Workstation 7 on Ubuntu 10.04 64 bit&lt;/li&gt;&lt;li&gt;Oracle Enterprise Linux 5 Release 5 32 bit&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Here are my goals:&lt;ul&gt;&lt;li&gt;One VM with OEL, OEM GRID 11.1, Database 11.2 (EM/RMAN repository)&lt;/li&gt;&lt;li&gt;One VM with Database 11.2 using ASM&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;The first step is to create a VM I can use as a template for my two goal VMs.&lt;/p&gt;&lt;p&gt;Create template OEL5.5 VM:&lt;ol&gt;&lt;li&gt;Create a VM with at least 1GB of memory (2GB if feasible) and one 20GB (to 40GB) virtual disk (bridged network, uncheck automatically connect new USB device, do not connect sound card and printer at power on)&lt;/li&gt;&lt;li&gt;Power on the VM with the Oracle Enterprise Linux 5 Release 5 mounted as an .iso (or physical DVD)&lt;/li&gt;&lt;li&gt;Press ENTER at the "boot:" prompt, next, skip, next&lt;/li&gt;&lt;li&gt;Choose language and keyboard&lt;/li&gt;&lt;li&gt;OEL partitions everything perfectly, no need to review or modify (/boot with LVM with swap and / volumes)&lt;/li&gt;&lt;li&gt;Next, GRUB, DHCP, time zone (uncheck System clock uses UTC)&lt;/li&gt;&lt;li&gt;Set root password&lt;/li&gt;&lt;li&gt;Select Customize now. Next.&lt;/li&gt;&lt;li&gt;Desktop Environments. Uncheck GNOME&lt;/li&gt;&lt;li&gt;Applications. Uncheck all (except maybe Text Based Internet)&lt;/li&gt;&lt;li&gt;Base System. Uncheck Dialup Networking Support and X Window&lt;/li&gt;&lt;li&gt;Base System. Check System Tools; click Optional packages, check oracle-validated&lt;/li&gt;&lt;li&gt;Next, next, installing packages, reboot.&lt;/li&gt;&lt;li&gt;Highlight networking, then run tool&lt;/li&gt;&lt;li&gt;Set Firewall and SELinux both to Disabled&lt;/li&gt;&lt;li&gt;Next&lt;/li&gt;&lt;li&gt;OS installation complete. Login. User root.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Install VMWare tools:&lt;ol&gt;&lt;li&gt;VM: Install VMWare tools (will prompt you to mount something)&lt;/li&gt;&lt;li&gt;mkdir /media/cdrom&lt;/li&gt;&lt;li&gt;mount -o ro /dev/cdrom /media/cdrom&lt;/li&gt;&lt;li&gt;cd&lt;/li&gt;&lt;li&gt;tar -xzf /media/cdrom/VM*tar.gz&lt;/li&gt;&lt;li&gt;cd vmware-tools-distrib&lt;/li&gt;&lt;li&gt;./vmware-install.pl&lt;/li&gt;&lt;li&gt;I kept defaults for everything; installation unmounts the VMWare tools&lt;/li&gt;&lt;li&gt;cd&lt;/li&gt;&lt;li&gt;rm -fr vmware-tools-distrib&lt;/li&gt;&lt;li&gt;shutdown -h now&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Take a snapshot of the OEL5.5 virtual machine. This snapshot will be used in the cloning process.&lt;/p&gt;&lt;p&gt;In the next parts I will use this template VM to create the OEM GRID and Database VMs&lt;/p&gt;&lt;p&gt;Updates:&lt;dl&gt;&lt;dt&gt;06/22/2010:&lt;/dt&gt;&lt;dd&gt;Now on Ubuntu 10.04&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4600470567118633286?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4600470567118633286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4600470567118633286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4600470567118633286'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/04/my-2010-oracle-vm-project-part-one.html' title='My 2010 Oracle VM project, part one'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4576739382942821508</id><published>2010-04-20T16:36:00.001-04:00</published><updated>2010-05-07T20:29:41.031-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>The Oracle CBO statistical time bomb</title><content type='html'>&lt;p&gt;Ever have a query or process that runs fine for years and years and years but then one day just slows to a crawl, going from seconds to hours in execution time? If so, you have run into what I call the Oracle CBO statistical time bomb.&lt;/p&gt;&lt;p&gt;Oracle 10g/11g has a daily job that queries for &lt;b&gt;"stale"&lt;/b&gt; and missing optimizer statistics on Oracle table/index objects. Those optimizer statistics are used by the optimizer when choosing the best access plan, join types, index and table scans to use for a SQL query. The default for &lt;b&gt;"stale"&lt;/b&gt; is if 10 percent of the data have changed (static in 10g, can be changed in 11g).&lt;/p&gt;&lt;p&gt;Let's assume we have this really, really big invoice table that grows at a constant rate over time. This table has an index on the financial quarter. Each quarter roughly 25,000 new rows are inserted, and then updated 3-5 times each (as status changes, etc. whatever), and some idiot needs to clean up a couple hundred bogus rows each month. Here is the table for 2010:&lt;/p&gt;&lt;pre&gt;Financial    Total  Insert  Update  Delete  Changed  Percent&lt;br /&gt;Quarter       Rows    Rows    Rows    Rows     Rows  Changed&lt;br /&gt;2010 Q1  1,000,000  25,000  80,000     169  105,169   %10.51 - daily job gathers statistics&lt;br /&gt;2010 Q2  1,024,836  25,000  80,000     169  105,169   %10.26 - daily job gathers statistics&lt;br /&gt;2010 Q3  1,049,672  25,000  80,000     169  105,169   %10.01 - daily job gathers statistics&lt;br /&gt;2010 Q4  1,074,508  25,000  80,000     169  105,169   %09.78 - not stale yet, still have 2010 Q3 statistics&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Without current statistics, the Oracle cost-based optimizer thinks one index and access method would be more efficient than a different index and access method (when it really, really, really is not).&lt;/p&gt;&lt;p&gt;I'll need an Oracle Guru to correct me but here is what happens in 2010 Q4:&lt;/p&gt;&lt;p&gt;Your super-optimized, meticulously coded query, queries the invoices by quarter and by another column existing in a massive subquery.&lt;/p&gt;&lt;p&gt;For 2010 Q1,Q2,Q3 the CBO says there are 25,000 rows reading the quarter index and likely less rows using an index on another column (customer number perhaps) if it does the massive subquery first. The CBO got it right and the massive subquery executes first then reads the table via index on the other column.&lt;/p&gt;&lt;p&gt;For 2010 Q4 the CBO says there are no/few rows for Q4 (when there are really 25,000) so read the invoices using the quarter index and then do a nested loop each time on the massive subquery because the cost of the read by quarter index times the cost of the massive subquery is less than the plan it took above (when it really is not). Instead of doing that nested loop on a couple rows (yawn) it does that nested loop massive subquery 25,000 times. Yikes.&lt;/p&gt;&lt;p&gt;What to do? Plan ahead.&lt;/p&gt;&lt;p&gt;Go to &lt;a href="http://tahiti.oracle.com/"&gt;Tahiti&lt;/a&gt; and research DBMS_STATS in the Oracle Database PL/SQL Packages and Types Reference. Know your tables and diffuse the time bomb before it goes off. Let the daily job handle the stale statistics. Tables that contain an index on a period of time (quarter, year, etc.) or code based on a period of time (i.e. the Spring 2010 line of Mountain Dew with Ginseng and Xanax) should be researched as candidates for statistics gathering outside of Oracle's daily job. Gather table statistics before the big processing periods.&lt;/p&gt;&lt;p&gt;References&lt;ul&gt;&lt;li&gt;&lt;a href="http://richardfoote.wordpress.com/2010/02/16/how-does-an-execution-plan-suddenly-change-when-the-statistics-remain-the-same-in-limbo/"&gt;How Does An Execution Plan Suddenly Change When The Statistics (And Everything Else) Remains The Same ? (In Limbo)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4576739382942821508?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4576739382942821508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4576739382942821508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4576739382942821508'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/04/oracle-cbo-statistical-time-bomb.html' title='The Oracle CBO statistical time bomb'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-937550224208401166</id><published>2010-04-20T15:44:00.000-04:00</published><updated>2010-04-20T15:45:25.758-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle and SSIS; ORA-00903 during verification</title><content type='html'>&lt;p&gt;Can you tell I have been suppressing my pain and hate up into a nice little ball, instead of talking about my feelings while laying in some lush, peaceful green meadow, sipping Chamomile tea and popping anti-depressants like candy.&lt;/p&gt;&lt;p&gt;This issue is one of those classic, what the **** is going on here errors.&lt;/p&gt;&lt;p&gt;Here is what I am suffering with:&lt;ul&gt;&lt;li&gt;Windows XP and Windows Server 2003&lt;/li&gt;&lt;li&gt;SQL Server 2008 Integration Services&lt;/li&gt;&lt;li&gt;Native OLE DB\Oracle Provider for OLE DB, Oracle 11g R1 or Oracle 10g&lt;/li&gt;&lt;li&gt;OLE DB Source (Oracle) using a query.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h4&gt;The Problem&lt;/h4&gt;&lt;p&gt;Getting ORA-00903 table or view not found during execution on verification step on Data Flow OLE DB Oracle source; even though at design time (in the OLE DB source editor dialog) the SQL parses correctly &lt;b&gt;AND&lt;/b&gt; pulls back test data in the source &lt;b&gt;AND&lt;/b&gt; the query runs successfully everywhere else using the same credentials.&lt;/p&gt;&lt;h4&gt;The Solution&lt;/h4&gt;&lt;p&gt;Drink.&lt;/p&gt;&lt;p&gt;Smoke.&lt;/p&gt;&lt;p&gt;Break something.&lt;/p&gt;&lt;p&gt;Then:&lt;ul&gt;&lt;li&gt;in Oracle, CREATE a VIEW for the query&lt;/li&gt;&lt;li&gt;if the query contains a user function you will also need to in Oracle, GRANT EXECUTE ON schema.function TO view_schema_owner WITH GRANT OPTION&lt;/li&gt;&lt;li&gt;in Oracle, GRANT SELECT on VIEW to the USER used by SSIS (if necessary)&lt;/li&gt;&lt;li&gt;in SSIS, use the Advanced Editor on the OLD DB source; Component Properties; AccessMode = OpenRowset, OpenRowset = SCHEMA.view (standard editor will not pull up the view and you are limited to a drop-down)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;There that was painless, right?&lt;/p&gt;&lt;p&gt;I have been told that shutting down Visual Studio sometimes helps (it did not). Shutting down Visual Studio works if you switch databases in the connection manager and then get ORA-00903 table or view not found in the OLE DB source. One co-worker stated he rebooted his machine and then things worked (it did not).&lt;/p&gt;&lt;p&gt;I'm sure I was doing something stupid like trying to use a subquery or SYSDATE but WTF; it parsed, it pulled back test data, it works everywhere but the verification step when debugging it.&lt;/p&gt;&lt;p&gt;****!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-937550224208401166?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=937550224208401166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/937550224208401166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/937550224208401166'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/04/oracle-and-ssis-ora-00903-during.html' title='Oracle and SSIS; ORA-00903 during verification'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-964600605185369201</id><published>2010-04-20T15:08:00.002-04:00</published><updated>2010-04-20T15:12:22.867-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle and SSIS; SQL tasks and procedures</title><content type='html'>&lt;p&gt;I am posting today to hopefully prevent others from the hell I have been through. I really have no idea why I continue to do this as my psyche at this point is so eroded that I should be deriving pleasure from the suffering of others like some serial killer in the making.&lt;/p&gt;&lt;p&gt;Getting Oracle and Microsoft to play nice is like trying to get Sean Hannity and Nancy Pelosi to share a quiet evening together making babies while discussing health care and what to spend their money on. If that reference is dated then consider the choice of wiping with toilet paper or the large grain sandpaper and then using the sandpaper; or perhaps shoving a sea urchin up your nose then pulling it out the other nostril.&lt;/p&gt;&lt;p&gt;Here is what I am suffering with:&lt;ul&gt;&lt;li&gt;Windows XP and Windows Server 2003&lt;/li&gt;&lt;li&gt;SQL Server 2008 Integration Services&lt;/li&gt;&lt;li&gt;Native OLE DB\Oracle Provider for OLE DB, Oracle 11g R1 or Oracle 10g&lt;/li&gt;&lt;li&gt;Execute SQL Task trying to execute a PROCEDURE or PACKAGE.PROCEDURE that has input or output parameters&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h4&gt;Connection Manager&lt;/h4&gt;&lt;p&gt;The only non-default property is RetainSameConnection set to True (connections to Oracle are expensive). Personally, I see no need for resource pooling but that is another post.&lt;/p&gt;&lt;h4&gt;Execute SQL Task&lt;/h4&gt;&lt;p&gt;General&lt;dl&gt;&lt;dt&gt;ConnectionType&lt;/dt&gt;&lt;dd&gt;OLE DB&lt;/dd&gt;&lt;dt&gt;SQLSourceType&lt;/dt&gt;&lt;dd&gt;SQLStatement:&lt;pre&gt;{call your_stupid_package.dumb_ass_procedure(?,?)}&lt;br /&gt;or&lt;br /&gt;BEGIN your_stupid_package.dumb_ass_procedure(?,?); END;&lt;/pre&gt;&lt;/dd&gt;&lt;dt&gt;IsQueryStoredProcedure&lt;/dt&gt;&lt;dd&gt;False (usually greyed out, but can be set via Properties, but has no bearing on anything)&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;p&gt;Parameter Mapping; Add each parameter:&lt;dl&gt;&lt;dt&gt;Variable Name&lt;/dt&gt;&lt;dd&gt;whatever User::variable you have defined already&lt;/dd&gt;&lt;dt&gt;Direction&lt;/dt&gt;&lt;dd&gt;Input or Output&lt;/dd&gt;&lt;dt&gt;Data Type&lt;/dt&gt;&lt;dd&gt;VARCHAR (I have not been able to get anything else to work yet)&lt;/dd&gt;&lt;dt&gt;Parameter Name&lt;/dt&gt;&lt;dd&gt;the left to right sequence number of the parameter starting at zero (so, if you only have one the parameter name is 0)&lt;/dd&gt;&lt;dt&gt;Parameter Size&lt;/dt&gt;&lt;dd&gt;the size of the variable&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;p&gt;I would cite references but that vast majority of searches dead-end with single posts in forums where some poor slob went begging for help and found none; or sometimes found a reply from another kindred spirit also suffering through the same agony. Those who did have solutions were not passing parameters or were using an Expression to build the query string with parameters (doing their own SQL injection; which also does not help those using output parameters).&lt;/p&gt;&lt;p&gt;The above works, with a couple warnings, but works.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-964600605185369201?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=964600605185369201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/964600605185369201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/964600605185369201'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/04/oracle-and-ssis-sql-tasks-and.html' title='Oracle and SSIS; SQL tasks and procedures'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7488809747847094534</id><published>2010-03-01T21:04:00.003-05:00</published><updated>2010-03-01T21:14:10.777-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>I did go in a ...</title><content type='html'>&lt;p&gt;&lt;dl&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;Yeah baby, you'd dig it the most. But you know what the funniest thing about Europe is?&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;What?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;It's the little differences. I mean, they got the same s... over there that we got here, but it's just – it's just there it's a little different.&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;Example?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;All right. Well, you can walk into a movie theater in Amsterdam and buy a beer. And I don't mean just like in no paper cup, I'm talking about a glass of beer. And in Paris, you can buy a beer at McDonald's. And you know what they call a Quarter Pounder with Cheese in Paris?&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;They don't call it a Quarter Pounder with Cheese?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;Nah, man, they got the metric system, they wouldn't know what the f... a Quarter Pounder is.&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;What do they call it?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;They call it a "Royale with Cheese".&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;"Royale with Cheese".&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;That's right.&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;What do they call a Big Mac?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;A Big Mac's a Big Mac, but they call it "Le Big Mac".&lt;/dd&gt;&lt;dt&gt;Jules&lt;/dt&gt;&lt;dd&gt;"Le Big Mac." What do they call a Whopper?&lt;/dd&gt;&lt;dt&gt;Vincent&lt;/dt&gt;&lt;dd&gt;I don't know, I didn't go in a...&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;p&gt;There was probably some reason or list of reasons why Vincent Vega did not go into that fast food establishment in that opening scene from the movie Pulp Fiction. I really cannot remember why we ended up there tonight. It was probably because it was on the same side of the street and I was wanting to avoid a left turn on a very short light from the eight dozen or more better fast food joints across the street. Maybe it was because I remember seeing a steak burger advertised on the television and felt the remote chance it might be palatable.&lt;/p&gt;&lt;p&gt;"We are out of steak."&lt;/p&gt;&lt;p&gt;A burger joint, out of meat. Holy crap. They offer to substitute two hamburger patties which likely meant we microwaved too many frozen hamburger discs and not enough frozen steak blobs and it would not be feasible to make another batch of steak. So instead of steak I get whatever animal they ground up for hamburger.&lt;/p&gt;&lt;p&gt;They are short handed so it takes about five minutes to assemble our meal from the heated storage bins. Yum. Of course, almost half the staff was out back smoking by the dumpster.&lt;/p&gt;&lt;p&gt;We arrive home and examine our food. My shoes looked more edible than the burger. There were two small, wilted pieces of lettuce hidden within the sauce. The bun tasted horrifying. It was just awful. The wife had a fish sandwich which was equally horrid. There was a thin, transparent film of tartar sauce on top of the processed fish wedge. The bun and breading managed to dominate over both the fish ans tartar sauce. That is just unnatural. How can baked and fried dough overpower bold sauce and fish that has endured months of storage and who knows what?&lt;/p&gt;&lt;p&gt;Ninety minutes have passed and the meal feels like a porcupine in my stomach. I am debating whether I should attack that wad of lard with a shot of hard liquor or just drown it in milk or send a salad into the battlefield of stomach acid. It is just awful feeling.&lt;/p&gt;&lt;p&gt;For the two or three people that read this blog once a month or year, I beg you not to go to this place.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7488809747847094534?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7488809747847094534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7488809747847094534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7488809747847094534'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/03/i-did-go-in.html' title='I did go in a ...'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-9064323581050896396</id><published>2010-02-25T21:41:00.001-05:00</published><updated>2010-02-25T21:45:57.250-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle MERGE, type 2 dimension</title><content type='html'>&lt;p&gt;I decided to look into this topic while learning SQL Server Integration Services and debating with my caffeine soaked brain if the slowly changing dimension task container would be more efficient than a T-SQL MERGE statement. I began wondering why the hell we were planning on shipping about 40 gigabytes per day out of Oracle into tables in SQL Server that are truncated (emptied) and rebuilt then query to determine what 2 kilobytes worth of changes took place that day. Why on earth would we want to stress out that multi-core, refrigerator sized server when an underpowered server and network and storage can do all the work?&lt;/p&gt;&lt;p&gt;Fact tables and dimensions are part of data warehousing. A slowly changing dimension is a dimension that slowly changes over time (duh). There are three types of slowly changing dimensions:&lt;/p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;Type 1: Update the old values with the new values (do not give a crap about history)&lt;/li&gt;&lt;li&gt;Type 2: Create a new row in the dimension with a new primary (surrogate) key, and optionally update existing rows&lt;/li&gt;&lt;li&gt;Type 3: Update the old values with the new values, and add additional data to the table (date of the change, keep one level of history)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;You would figure type 3 would come before type 2 but who cares..? This dimension uses a generated surrogate key for uniqueness (a sequence) and dates to keep track of when the row was effective with a NULL end date indicating this row is the current version of the foreign primary key value and all others contain historical data and attributes.&lt;/p&gt;&lt;p&gt;The same logic used to maintain slowly changing dimensions can also be applied to tracking historical changes to tables.&lt;/p&gt;&lt;p&gt;The code that follows assumes only additions and changes are taking place; after all nobody ever deletes data do they? The dimension table is simple, no clustering, no partitioning, bit-map indexes, or compression, and is purely for example:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE TABLE crap_dimension&lt;br /&gt;( dim_pk_surrogate  NUMBER&lt;br /&gt;, dim_version_beg_date  DATE&lt;br /&gt;, dim_version_end_date  DATE&lt;br /&gt;, dim_pk_foreign  VARCHAR2(10)&lt;br /&gt;, dim_description  VARCHAR2(60)&lt;br /&gt;, dim_bulb  VARCHAR2(05)&lt;br /&gt;, dim_sum  VARCHAR2(08)&lt;br /&gt;)&lt;/pre&gt;&lt;p&gt;The MERGE SQL statement is best used for inserts and updates. Here is the single statement used for the entire dimension update:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;MERGE /*+ APPEND */&lt;br /&gt;INTO crap_dimension m&lt;br /&gt;USING (&lt;br /&gt;--- Step 1  BEG :: Select new and changed data for the USING section of the MERGE&lt;br /&gt;SELECT&lt;br /&gt;  DECODE(v2.dim_upsert_level,1,v2.dim_pk_surrogate,0) AS dim_pk_surrogate&lt;br /&gt;, v1.dim_pk_foreign&lt;br /&gt;, v1.dim_description&lt;br /&gt;, v1.dim_bulb&lt;br /&gt;, v1.dim_sum&lt;br /&gt;FROM (&lt;br /&gt;--- Step 1a BEG :: Collect data from your OLTP or ODS or POS &lt;br /&gt;  SELECT&lt;br /&gt;    crap_id AS dim_pk_foreign&lt;br /&gt;  , crap_desc AS dim_description&lt;br /&gt;  , crap_poop AS dim_bulb&lt;br /&gt;  , crap_turd AS dim_sum&lt;br /&gt;  FROM crap_oltp_or_ods_source&lt;br /&gt;--- Step 1a END&lt;br /&gt;--- Step 1b BEG :: Remove identical data attributes already in the dimension&lt;br /&gt;  MINUS&lt;br /&gt;  SELECT&lt;br /&gt;  , dim_pk_foreign&lt;br /&gt;  , dim_description&lt;br /&gt;  , dim_bulb&lt;br /&gt;  , dim_sum&lt;br /&gt;  FROM crap_dimension&lt;br /&gt;  WHERE dim_version_end_date IS NULL&lt;br /&gt;--- Step 1b END&lt;br /&gt;) v1&lt;br /&gt;--- Step 1c BEG :: two rows are needed for updates, update existing and insert new data, LEFT JOIN cartesian product of &lt;br /&gt;LEFT JOIN (&lt;br /&gt;  SELECT&lt;br /&gt;    dim_pk_surrogate&lt;br /&gt;  , dim_pk_foreign&lt;br /&gt;  , dim_upsert_level&lt;br /&gt;  FROM crap_dimension&lt;br /&gt;  ,   (SELECT LEVEL AS dim_upsert_level FROM DUAL CONNECT BY LEVEL BETWEEN 1 AND 2)&lt;br /&gt;  WHERE dim_version_end_date IS NULL&lt;br /&gt;) v2 ON v2.dim_pk_foreign = v1.dim_pk_foreign&lt;br /&gt;--- Step 1c END&lt;br /&gt;--- Step 1  END&lt;br /&gt;) u&lt;br /&gt;ON (m.dim_pk_surrogate = u.dim_pk_surrogate)&lt;br /&gt;--- Step 2  BEG :: If update, mark the end date&lt;br /&gt;WHEN MATCHED THEN UPDATE &lt;br /&gt;  SET m.dim_version_end_date = SYSDATE&lt;br /&gt;--- Step 2  END&lt;br /&gt;--- Step 3  BEG :: Insert new data and the new versions of changed data&lt;br /&gt;WHEN NOT MATCHED THEN INSERT&lt;br /&gt;VALUES (&lt;br /&gt;  dim_pk_surrogate_seq.NEXTVAL&lt;br /&gt;, SYSDATE&lt;br /&gt;, NULL&lt;br /&gt;, u.dim_pk_foreign&lt;br /&gt;, u.dim_description&lt;br /&gt;, u.dim_bulb&lt;br /&gt;, u.dim_sum&lt;br /&gt;)&lt;br /&gt;--- Step 3  END&lt;br /&gt;;&lt;/pre&gt;&lt;p&gt;I tried to break down the statement into steps.&lt;/p&gt;&lt;p&gt;Step 1a collects data from your ODS or OLTP and can be a simple query or a gigantic, complicated parallel query with a hundred joins and aggregate steps. The important thing to remember is we only want to do this expensive step once. When 1a completes we will have a fairly large result set.&lt;/p&gt;&lt;p&gt;Step 1b subtracts all identical data attribute rows that already exist in the dimension from the previous result set. This should significantly reduce the working set of rows at the expense of a full table scan through our dimension. When 1b completes the working set will contain new data and changed data from the source tables.&lt;/p&gt;&lt;p&gt;Step 1c creates data for updates. If data in the source has changed then two rows will be needed for the dimension; one row to update the existing data making the row historical and one row to insert for the new data making it the current row.  The surrogate and foreign primary keys for all current rows are Cartesian joined to values 1 and 2 (one full table scan then hash join instead of two full table scans) and then left joined to the previous result set. New data from the source will not match data and will remain as one row with a NULL surrogate primary key. Changes from the source will match and join to the two rows in the query creating the two rows needed to do the update and insert. The surrogate primary key will be 0 for inserts (assuming the sequence started at 1 or higher) and valued for updates.&lt;/p&gt;&lt;p&gt;Step 1 finishes with rows containing changes to be applied to the dimension. Step 2 updates historical rows simply setting the end date to the current date. Step 3 inserts new data from the source and the new current version of the row for changed data.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-9064323581050896396?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=9064323581050896396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9064323581050896396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9064323581050896396'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/02/oracle-merge-type-2-dimension.html' title='Oracle MERGE, type 2 dimension'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3089015947649292189</id><published>2010-02-25T20:27:00.001-05:00</published><updated>2010-02-25T20:31:03.087-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>More virus crap</title><content type='html'>&lt;p&gt;It had been a while since I went on a tour through the blogosphere using the next blog link at the top of the page. After stumbling through a lot of foreign crap in languages I did not understand I come to a blog that starts the hard drive going nuts. Oh F.&lt;/p&gt;&lt;p&gt;When the hard drive goes nuts you usually have a virus or something nasty trying to do something to your computer. AVG caught and probably stopped and cleaned the malicious crap. I was going to post some Oracle MERGE code but now I have to wait until a full system scan completes and bitch about things from my netbook.&lt;/p&gt;&lt;p&gt;So here I am watching Olympic curling (Canada versus Switzerland, ladies) and typing this on my netbook with cats jockeying for space on my lap and on the couch around me. I keep getting the same thought in my head: why the hell am I still blogging? Seriously. Why do I share code and my life with the world? Most of my friends have moved on to do their belly-aching in status updates and micro-blogging. Any therapeutic value from blogging can easily be replaced by a good beer or six (Sam Adams Winter Ale, I have a stockpile of it). &lt;/p&gt;&lt;p&gt;For the untrusted Internet I need to look into programs like Sandboxie or running web browsers inside virtual machines. When I purchase a new computer I will likely be running Linux which still has equal levels of threat, but it seems like fewer viruses are written to exploit Linux and it seems safer.&lt;/p&gt;&lt;p&gt;As I watch the women's Olympic ice hockey gold medal game I wonder if this will be my last blogger rant. Maybe I will start using Google Buzz and join others with one-line status updates like "my computer might be frakked" or "I really hate Microsoft again".&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3089015947649292189?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3089015947649292189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3089015947649292189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3089015947649292189'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/02/more-virus-crap.html' title='More virus crap'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4636916102473168886</id><published>2010-01-31T20:53:00.001-05:00</published><updated>2010-02-24T18:23:16.182-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>No time for stupid</title><content type='html'>&lt;p&gt;I try not to be in a hurry during most of my life. On the roads I try not to rush things especially in rough weather. When developing I try to do things right the first time instead of pushing something out and then dealing with the problems later. There is one instance, however, when I become angry; when my time gets wasted by stupid people.&lt;/p&gt;&lt;p&gt;There should be a gate with a short IQ test guarding the entrance of every self-scan lane at a supermarket. Tonight I picked the self-scan lane with the fewest people in it. One person with two small containers. That seemed reasonable enough. Not for this complete waste of human genetic material. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The first problem, this dude was eating out of one of the containers. After scanning the first, unopened container he places it on top of the machine instead of into the bag or at least onto the area that measures the weight of the item you just scanned. So he waits until the bagging error message comes up and presses the button to skip bagging.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Next, this idiot tries to scan the container he is eating out of. His fingers are sticky to begin with so he is already limited in dexterity. The bar code is on the side of the container so he then tries to angle the container so it will scan and not spill the contents. It never occurs to this idiot during the eight or nine attempts to scan the container to put the lid back on the container for the two or three seconds needed to scan the damn thing. Eventually, he does get the thing to scan. Does he put it in the bag? No, he puts it on top of the machine and waits the five to ten seconds for the scanner to yell at him so he can press the  skip bagging button.&lt;/p&gt;&lt;p&gt;He then starts feeding money into the cash input as the machine repeatedly asked him if he was done scanning crap and was ready to start feeding the thing money. You are probably wondering where the cell phone comes in. It was about ten seconds before the machine locked up and required the cashier to come over and fix things. At least he did not stop screwing up the self-scan machine to talk on his phone but instead placed the phone on top of the machine and talked to it. However, he is now out of cash and wants to start feeding coins into a coil slot with tape on it and a large sign next to it stating the device cannot accept change.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;He pouts for a moment and then barks at the cashier to come fix the machine. It takes the cashier about a minute or two to log in to the machine, reset it, eject the cash in the cash feeder and then set his whole transaction to be handled elsewhere to keep things moving. Thank you. What should take twenty seconds on a rough day takes more than five minutes as the lines at the 20 items or less and self-scan extend beyond the edge of the aisles (but are still moving).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I should not be worried about five minutes out of the (hopefully) millions of minutes in my life but I do let it get to me. I hate waiting for stupid crap like that. &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4636916102473168886?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4636916102473168886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4636916102473168886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4636916102473168886'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2010/01/no-time-for-stupid.html' title='No time for stupid'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2280060807336083596</id><published>2009-12-29T21:04:00.002-05:00</published><updated>2010-04-27T07:57:53.314-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Yahoo! sucks on my netbook</title><content type='html'>&lt;p&gt;I tried the new Yahoo! Mail today. I switched back to "classic" mail immediately. The first issue:&lt;/p&gt;&lt;p&gt;There seems to be a screen resolution problem. Your screen resolution is set below our minimum recommendation. When it's set under 1024 x 768 pixels, the all-new Yahoo! Mail won't look as good. You can continue with your current settings, but you won't be able to enjoy the full effect.&lt;/p&gt;&lt;p&gt;Really? My netbook has a 1024x600 resolution and I can go to 1024x768 with a scrolling desktop. The scrolling desktop is annoying and makes things unusable. Applications should scroll, not desktops.&lt;/p&gt;&lt;p&gt;The new mail does not render well in Opera. I use Opera because I think the scaling feature is superior to Firefox, IE and Chrome. It is nice to be able to size the contents of the web page to 70 to 90 percent while maintaining usability and readability. That is a nice feature when you have that 1024 x 600 netbook display. At 100 percent it looks like crap and does not get any better at zoomed levels.&lt;/p&gt;&lt;p&gt;I tried using Firefox and IE to see the full effects I should be enjoying. There are fixed frames and an annoying status bar, menu, message scroll, etc. I can see why they want a large fixed resolution.&lt;/p&gt;&lt;p&gt;I have been a Yahoo! mail user since 1998. That is over a decade of using Yahoo! One of the reasons why I liked Yahoo! was simplicity. While other web sites were going through the phases of hipness like massive image filled pages, Java applets, tons of unwanted JavaScript, excessive use of CSS and everything - Yahoo! kept most things simple. As the years passed, however, all of their services and applications got fatter. Messenger got fatter so I ended up using Gaim (Pidgin). Mail started getting fatter so I started using Google Mail more. Workstations are more powerful now than years ago and are able to handle newer technologies but it seems like some applications and web sites are forgetting that hardware using them are getting smaller or are coming from non-traditional sources (like game consoles and media devices). &lt;/p&gt;&lt;p&gt;Maybe I am just getting old.&lt;/p&gt;&lt;p&gt;(I also realize the reason for some of the new Web 2.0 stuff is for smaller devices like phones and hand-helds).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2280060807336083596?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2280060807336083596' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2280060807336083596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2280060807336083596'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/12/yahoo-sucks-on-my-netbook.html' title='Yahoo! sucks on my netbook'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7631238431799996048</id><published>2009-11-23T07:47:00.000-05:00</published><updated>2009-11-23T13:47:39.946-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Data Pump for data refreshes part 4</title><content type='html'>&lt;p&gt;&lt;a href="http://grouchgeek.blogspot.com/2009/09/oracle-data-pump-for-data-refreshes.html"&gt;Part one&lt;/a&gt;, &lt;a href="http://grouchgeek.blogspot.com/2009/10/oracle-data-pump-for-data-refreshes.html"&gt;part two&lt;/a&gt; and &lt;a href="http://grouchgeek.blogspot.com/2009/10/oracle-data-pump-for-data-refreshes_29.html"&gt;part three&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This is a follow-up to the third part of this series with some real-world examples to make corrections and to justify some points.&lt;/p&gt;&lt;p&gt;I ran into a known 10g bug when attempting a DATA_ONLY export using parallel processing (ORA-00001: unique constraint () violated. The bug was fixed with 11g (Oracle forums). The source database was small so I did ran parallel=1 to get it to work. For larger databases that might not be feasible. The next test would be to modify the first export to get data and metadata and then do the DATA_ONLY on the first import step.&lt;/p&gt;&lt;p&gt;Other than the error above, the export and import for the first refresh went smoothly. The second import was more of a complete account copy do I could not use exactly what I specified in part three. &lt;/p&gt;&lt;p&gt;I did one export and one import. The export went quickly and without error. The import ground to a halt at the TABLE_STATISTICS step due to a bug in the Oracle Data Pump when schema and/or tablespace remapping is used. I had to terminate the import. Forums suggest using a EXCLUDE=STATISTICS in the parameter file to avoid these two incredibly slow steps and then rebuilding the statistics after the import (done through Enterprise Manager or whatever). The export of 57 GB of data took roughly 12 minutes. The import of that data took roughly 20 minutes for just the data. Source objects seemed to take a while and, as mentioned, the statistics took forever.&lt;/p&gt;&lt;p&gt;The data pump is a remarkable improvement over the previous import and export utilities. What took hours before can now be accomplished in less than an hour.&lt;/p&gt;&lt;p&gt;More to come.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7631238431799996048?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7631238431799996048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7631238431799996048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7631238431799996048'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/11/oracle-data-pump-for-data-refreshes.html' title='Oracle Data Pump for data refreshes part 4'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5342055359307473032</id><published>2009-11-23T02:10:00.000-05:00</published><updated>2009-11-23T14:11:19.114-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Microblogging</title><content type='html'>&lt;p&gt;I made this comment on the soccer boards I occasionally frequent but it was a decent rant.&lt;/p&gt;&lt;p&gt;I dislike micro-blogs like Twitter and social web sites used like micro-blogs. Sentence fragments are replacing meaningful dialog. I get so tired of the cryptic crap like "so many things wrong with today." What? Did your cat die? Are you on the rag? Did you get a skunky beer?  Is your boss licking your coffee cup while you sleep at your desk?&lt;/p&gt;&lt;p&gt;What?&lt;/p&gt;&lt;p&gt;It seems like every tweet or status update from a friend below the age of 27 is like this.&lt;/p&gt;&lt;p&gt;The problem with these sentence shortened cries for attention is that unless you are tight within the sphere of friends and know what is going on you are left to draw your own conclusions about what is really going on in their lives. This is especially true for public figures that post these dramatic little giblets about their lives leading to four or fifty different interpretations to what they actually meant. Twitter updates sometimes worse than the Bible for interpretation.&lt;/p&gt;&lt;p&gt;Why the drama?&lt;/p&gt;&lt;p&gt;I realize that I am not using the latest and greatest iDroid portable media server/game console/camera/asset manager/phone and probably do not understand what is really going on. I understand that text messaging is the cool thing to be doing right now and that these short cryptic messages are really some English sub-language I will never understand or whatever. But, if you have friends or people that you want to be up-to-date with every little detail of your life then are you really doing a disservice to friends left guessing about the seriousness of the situation? Yoda is a better conversationalist.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5342055359307473032?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5342055359307473032' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5342055359307473032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5342055359307473032'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/11/microblogging.html' title='Microblogging'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1124813906458707968</id><published>2009-11-08T16:59:00.003-05:00</published><updated>2009-11-08T17:04:17.354-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>The Columbus Crew 2009, summary</title><content type='html'>&lt;p&gt;The Columbus Crew exited the major league soccer playoffs Thursday to Real Salt Lake. After winning the Supporter Shield for best record at the end of the regular season the reigning MLS champions lost and away match 0-1, a home match 3-2 and 4-2 on aggregate goals for the playoff series. Now that the sting has edged I feel able to comment on it.&lt;/p&gt;&lt;p&gt;My first thought is that I hate the first round of the MLS playoff system. The team with the best record plays away first and then comes back home for one game. Two games where the best team gets a home field advantage by playing the last game of the two games at home. To me that gives the advantage to the lesser record team because the better record team will be more likely to play defensively for a tie to take the series back home for the win or play defensively to not give up too many goals to take back home and score more goals. If the lesser team gets more goals in the first game then they hold a distinct advantage in game two because the better record team must score one more goal than they did leaving the lesser team to play a clogged defense and counter attack game. This is a moot point since the Crew lost both games. So what happened?&lt;/p&gt;&lt;p&gt;There are lots of opinions on what happened but I think it all boils down to one word: inconsistency.&lt;/p&gt;&lt;p&gt;First there was the inconsistent lineup due to injuries to key players like Schelotto, Hesmer and Marshall. Brunner, Iro, Zayner and O'Rourke stepped up with admirable performances in place of Chad Marshall. Problems with injuries and players not being at full performance complicated mid to late season matches that also included Open Cup and Champions League games. There were also games where players were called up to national teams causing complications in starting lineups.&lt;/p&gt;&lt;p&gt;Second, inconsistent performances. There are a lot of names in this list: Rogers, Hejduk, Gaven, Hesmer, Moreno, and even Schelotto in some ways. Defender Chad Marshall outperformed Moreno, Garey and Lenhart in point production. Moreno spent more time acting than scoring. He looked dangerous one time, the first game he came back from injury. Rogers had one goal in 1,700 minutes playing for the Crew.&lt;/p&gt;&lt;p&gt;Third, inconsistent coaching. Robert Warzycha took over the championship team from 2008 from Sigi Schmid. Some games made him look like a genius but in reality we got lucky. Revolving line-ups were forced by injuries, suspensions, and the introduction of Champions League play. They were also made by Warzycha. The 2008 Crew marched into the playoffs with the starting eleven players they were going to field the entire playoffs. Schelotto did not play the first game of the playoffs leading to questions about the team and the coaching staff.&lt;/p&gt;&lt;p&gt;So where does the Crew go from here?&lt;/p&gt;&lt;p&gt;Warzycha and the coaching staff need to explain their position but should also keep their jobs going forward to next season. There are people calling for Warzycha to be let go but who do we replace him with? Schelotto? If not Schelotto then who do we replace him with and who would we be able to afford?&lt;/p&gt;&lt;p&gt;Goalkeeping and defense has some interesting aspects to it. Hesmer is likely not going anywhere and stays in goal. Gruenebaum will likely be kept as a more than capable backup unless his trade value dictates otherwise. Marshall and O'Rourke were the central defense last season and they took us to a championship. Eric Brunner stepped up this season in central defense while Chad Marshall was injured and should be kept as a key part of the future. Unfortunately that leaves O'Rourke, a strong player out of luck and looking for a position. Gino Padula was just as strong this season as last so O'Rourke cannot occupy his position. On the right side, Crew heart and soul Frankie Hejduk began to show his age especially in the playoffs. Jed Zayner played adequately on the right side when Hejduk was out with injury or the national team and should probably, and unfortunately for Hejduk get the start in 2010 on the right side. This still leaves a strong player, O'Rourke, looking for a position. It also leaves international Andy Iro (England) on the bench and given Iro's 2009 performance was both good and slightly less than adequate he will be retained unless there is an opportunity to obtain better players by trading him.&lt;/p&gt;&lt;p&gt;The 2009 midfield was inconsistent due to injuries, national team call-ups, and coaching. The only consistent player was Brian Carroll who should be retained. Guillermo Barros Schelotto was the offense this season which is only good if other players are also contributing, which they were not. O'Rourke was used as a defensive midfielder this season but Adam Moffat returned in 2009 with both good and sub-adequate performances (again, inconsistency). On the outside Ekpo led the team with assists and had some key goals, Rogers had one fewer goals and assists than Ekpo with fewer minutes and games played. Eddie Gaven has six goals but no assists. This is an adequate contribution but leads to questions regarding who to start and keep for 2010. Crew fan favorite Duncan Oughton remained with the team in 2090 with limited action and as can be kept with the team as long as it is feasible to do so. The remaining midfield did not spend much time on the field and will likely end up as inconsequential players that can be waived, traded or kept.&lt;/p&gt;&lt;p&gt;The forward spots will likely endure the most scrutiny this season and for good reason. The bash brothers, Lenhart and Garey, showed a couple games of promise and dominance followed by barely adequate performances. This is my personal opinion but neither forward has provided a franchise worthy performance. Alejandro Moreno produced a couple game winning goals this season and spent time injured but he has earned a reputation as a flopper and most if not all referees in the league are not buying his acting. Since he is not scoring a large number of goals to offset this he becomes a liability and his position in 2010 will likely be as a bench player or not with the Crew at all. Emilio Renteria came aboard mid-season and had equal portions of bad and good in his performances. Both Moreno and Renteria are from Argentina and I would probably favor the younger Renteria going forward.&lt;/p&gt;&lt;p&gt;If I were asked to name the priorities for the 2010 season they would be: retain Schelotto for one more season as a player, acquire Schelotto's replacement so he can work alongside Guillermo and develop to lead the team. I do not think Gaven, Rogers, Ekpo, Moffat or any of the developmental players are those players so the Crew need to identify someone to fill that role from another MLS team or from another league. Next would be to retain Marshall, Hesmer, Carroll and Padula as they are all key players in the Crew roster. The next thing the Crew needs is a forward capable of playing with Schelotto (and his successor) and scoring a bucket load of goals. Ekpo, Brunner, O'Rourke and Zayner are young and show promise and value for the Crew future. Rogers and Gaven are both young but are both question marks (in my opinion) as both have the potential to create great value but have slumped during the 2010 season. Hejduk and Moreno should have their roles relegated. Last, Warzycha should be retained as coach unless an obvious and adequate replacement is both available and feasible for the organization.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1124813906458707968?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1124813906458707968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1124813906458707968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1124813906458707968'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/11/hello.html' title='The Columbus Crew 2009, summary'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-9071620850717443668</id><published>2009-11-08T14:20:00.003-05:00</published><updated>2009-11-08T14:33:47.697-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows Home Server, part one</title><content type='html'>&lt;p&gt;I recently decided to take the plunge and invest in newer technology for our home server. I wanted a small, efficient system to replace the iDEQ mini computer running Windows Server 2003. I was favoring an Ubuntu Linux system running on a VIA green computing platform. Unfortunately, the VIA motherboard was too unstable to run Windows or Linux on. I gave up after swapping power supplies and memory; everything else is integrated into the motherboard. During that time the Intel Atom based hardware and Windows Home Server (WHS) appeared. Since Windows in some flavor will always be running somewhere in the house and WHS was getting favorable reviews I took the plunge and purchased an all-in-one unit with the WHS license.&lt;/p&gt;&lt;h4&gt;The Hardware&lt;/h4&gt;&lt;p&gt;I purchased an Acer easyStore H340 for $360 (before tax and shipping). It features the Intel Atom 230 processor, a Western Digital WD10EAVS 1 TB hard drive, 2 GB DDR2 memory and has 5 USB 2.0 ports, 1 eSATA port and a gigabit Ethernet port. The front door opens to reveal four SATA drive bays (the non-system drives are hot swappable). Windows Home Server  (WHS) with Power Pack 1 comes installed and ready to finish on the TB disk drive. The McAfee Total Protection was installed but not active, sitting there waiting for me to activate the trial and then pay later.&lt;/p&gt;&lt;p&gt;The unit is smaller than any of the mini-computers I currently own. It is also quiet and unassuming and would quite at home in any basement likely near the router. There are indicator lights on the left side for power, drive and network activity and a multicolored status indicator light. Each drive has a multicolored status indicator light.&lt;/p&gt;&lt;p&gt;I added a WD10EADS 1 TB hard drive to the system. The drive trays are plastic and cheap feeling so I was careful with the tray I put the hard drive into and when I slid it back into place. It was recognized by the server and I added it to the storage pool without issue. There are close to 2 TB of storage in the pool.&lt;/p&gt;&lt;p&gt;After doing some reading I decided to purchase a 750GB hard drive but not add it to the storage pool. This drive will be used for bit torrent downloads, distributed updates and other high activity data. The 750GB was likely overkill but only $12 more than a 300 GB drive. When you do not add the drive to the pool the corresponding indicator light stays purple instead of a happy blue like the other drives in the pool.&lt;/p&gt;&lt;p&gt;I also purchased a Seagate 1TB hard drive and external enclosure to serve as a backup drive. I was able to hook up the external drive, dedicate it to backups and then make a quick backup of what was on our server.&lt;/p&gt;&lt;h4&gt;The Software - Windows Home Server&lt;/h4&gt;&lt;p&gt;Windows Home Server (WHS) came pre-installed on the Acer machine and almost ready to go upon start up. Connecting to the WHS begins with the connector software that comes on an accompanying disc. Shares are created for pictures, video, software, recorded TV programs, and for a public folder. WHS seems to prefer Windows authentication and having your user names and passwords synchronized across multiple computers. This was an issue for me because I had an older computer with one user name and most newer computers had my full name as the user name. I renamed the one account and broke a security license key for a piece of software I really do not use anymore. Still, one minor aggravation to play well with WHS.&lt;/p&gt;&lt;p&gt;Management is performed (or should be performed) through the Home Server Console.  The console cannot be resized which is an annoyance for those of us that have netbook computers and limited vertical resolutions. Many options are compacted into an one panel and the administrator can expand the console and WHS through plug-in modules. Remote desktop can be used to maintain the server but with caution; anything specific to WHS should be managed by WHS and if you do things outside of WHS you can potentially screw up WHS.&lt;/p&gt;&lt;p&gt;I had problems removing McAfee software. I was not happy with Acer at this point. Why install trial software that nags you without providing a means for un-installing it? I rushed in and used remote desktop to connect and then remove the software with errors. I had to reboot the server to get the components to disappear from the console. I have not checked the registry or disks to see if the product was removed completely.&lt;/p&gt;&lt;p&gt;I have not used the workstation backup feature of WHS. The workstations I have have too much junk on them and I do not like the idea of my netbook being awakened in the middle of the night to have a backup performed. I prefer to have control over tasks like backups and updates on the netbook devices.&lt;/p&gt;&lt;p&gt;Another feature I have not used yet is the ability to put things on the Internet through WHS. Exposing a WHS to the world is scary without doing some reading first. I am happy right now with having the WHS closed to the rest of the planet. Since I am on that topic, how do you think ISPs are going to react to the idea of a technology adequate family putting a server on the Internet. Imagine what happens when someone on this planet figures out to hack the default implementation of WHS. Millions of potential zombie computers and personal data stores open to damage.&lt;/p&gt;&lt;p&gt;The primary goal of WHS is to centralize the protection, access, organization and storage of home data and services. This assumes at least one or more home workstations and portables are in use in the home (it would not make sense to pay for a license and have a server without one). These computers would be routinely backed-up to WHS. Media is to be stored centrally on the WHS server so multiple computers and other devices can get to it. So if everything is centralized for security and convenience then why are two important aspects of Windows not part of WHS.&lt;/p&gt;&lt;p&gt;Why no integration with Microsoft Security Essentials (MSE)?&lt;/p&gt;&lt;p&gt;MSE is free for XP, Vista and 7 users and regularly goes to the Internet for software and virus list updates. WHS coordinates the backup of devices on a regular schedule, why not centralize the security definitions and MSE software updates instead of having each home device connecting to the Internet to do so? Make a plug-in for MSE within WHS, which would download security definitions and updates to protect itself and provide them as a primary source for computers on the home network (the Internet being the secondary source if the WHS was unavailable or the computer were away from home).&lt;/p&gt;&lt;p&gt;Why no integration with Windows Server Update Services?&lt;/p&gt;&lt;p&gt;WSUS is also a free download but is geared more towards corporate environments. I have WSUS running on the current home server and it was nice to have a local copy of the 12 to 16 updates Microsoft just released on Tuesday. With WSUS the patches were downloaded once and then distributed locally to my two desktops in minutes. The same updates took roughly 40 minutes on my netbook, which is new and not currently pulling from the WSUS server.  There are instructions on how to install WSUS on WHS available on the Internet but there is no support and no guarantees future updates to WHS would not cause a failure of WSUS and/or WHS for software not installed through plug-in. As with the security services, provide a plug-in for WHS to download and be the primary source for software updates for all local devices that can get to the WHS (leaving the Internet as the secondary source).&lt;/p&gt;&lt;h4&gt;Summary&lt;/h4&gt;&lt;p&gt;There will be follow-ups to this post as I start getting deeper into WHS and as more and more plug-ins and options become available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-9071620850717443668?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=9071620850717443668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9071620850717443668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9071620850717443668'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/11/windows-home-server-part-one.html' title='Windows Home Server, part one'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1769620409386027026</id><published>2009-10-29T15:38:00.001-04:00</published><updated>2009-10-29T15:40:14.236-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>New software</title><content type='html'>&lt;p&gt;A lot of recent software updates have appeared in the past 48 hours. The latest version of Ubuntu 9.10 (Karmic Koala) has been released. So download UKK or wait for the KKK (KDE/Kubuntu 9.10 Karmic Koala) if that is what you prefer. Opera released version 10.01 of Opera 10 browser with "turbo". "Neato". Mozilla released version 3.5.4 of Firefox 3.5 browser. Mozilla also released SeaMonkey 2.0; the all-in-one Internet application suite.&lt;/p&gt;&lt;p&gt;Get stuff:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ubuntu.com/getubuntu/mirror"&gt;Ubuntu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/firefox.html"&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.seamonkey-project.org/"&gt;Seamonkey&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1769620409386027026?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1769620409386027026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1769620409386027026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1769620409386027026'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/10/new-software.html' title='New software'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5741729927880756806</id><published>2009-10-29T12:34:00.002-04:00</published><updated>2009-11-23T13:22:44.577-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Data Pump for data refreshes part 3</title><content type='html'>&lt;p&gt;&lt;a href="http://grouchgeek.blogspot.com/2009/09/oracle-data-pump-for-data-refreshes.html"&gt;Part one&lt;/a&gt; and &lt;a href="http://grouchgeek.blogspot.com/2009/10/oracle-data-pump-for-data-refreshes.html"&gt;part two&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This part gives you the UNIX scripts and SQL that seem to work best in the environments I work in. the standard disclaimers apply. This likely is not the best way of going about this (or it might be) and I provide zero support for this. If it works for you, fantastic; send me some beer. If it frustrates you to no end because most of it works but you constantly find little annoyances and Oracle manuals are absolutely no help; welcome to my world.&lt;/p&gt;&lt;p&gt;The following UNIX steps assume the user on the server has appropriate privileges to execute Oracle binaries and has the environment set correctly.&lt;/p&gt;&lt;h4&gt;prod_expdp.sh&lt;/h4&gt;&lt;p&gt;This shell script sets the ORACLE_SID environment variable and then executes the data pump export utility twice; once for data and once for sequence metadata.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;#!/bin/sh&lt;br /&gt;# prod_expdp.sh - run datapump exports for a complete refresh of PROD to TEST&lt;br /&gt;#&lt;br /&gt;ORACLE_SID=prod&lt;br /&gt;expdp test_schema/testing PARFILE=prod_expdata.par&lt;br /&gt;expdp test_schema/testing PARFILE=prod_expmeta.par&lt;/pre&gt;&lt;h4&gt;prod_expdata.par&lt;/h4&gt;&lt;p&gt;The next two files are parameter files used by the export. The contents of the first file, for the data extract, is self-explanatory. The PARALLEL parameter was not used but included here because you will want some level of parallelism for optimal extract performance. The %U on the DUMPFILE parameter assigns a unique number to each extract file for parallel processing (4 files in this example). This parameter file should contain any EXCLUDE statements for tables that do not need to be exported.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;DIRECTORY=test_dp_folder&lt;br /&gt;DUMPFILE=prod_data_%U.dmp&lt;br /&gt;LOGFILE=prod_data_exp.log&lt;br /&gt;CONTENT=DATA_ONLY&lt;br /&gt;SCHEMAS=test_schema&lt;br /&gt;PARALLEL=4&lt;/pre&gt;&lt;h4&gt;prod_expmeta.par&lt;/h4&gt;&lt;p&gt;The second parameter file is for sequence metadata. Why two exports? I have two reasons why, in my opinion, there should be two. The main reason was to separate metadata (small) from table data (massive). You cannot do a metadata and data import in the same import job without doing all objects and I did not want the second step processing a gigantic data extract file just to get the microscopic slice of metadata. Second reason, INCLUDE and EXCLUDE are exclusive; only one can be used per execution and most extracts will want to exclude table data (if any).&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;DIRECTORY=test_dp_folder&lt;br /&gt;DUMPFILE=prod_meta_%U.dmp&lt;br /&gt;LOGFILE=prod_meta_exp.log&lt;br /&gt;CONTENT=METADATA_ONLY&lt;br /&gt;SCHEMAS=test_schema&lt;br /&gt;INCLUDE=SEQUENCE&lt;/pre&gt;&lt;p&gt;Extracted files will need to be relocated to the test server.&lt;/p&gt;&lt;h4&gt;test_impdp.sh&lt;/h4&gt;&lt;p&gt;This shell script sets the ORACLE_SID environment variable, executes SQL*Plus to build some SQL, executes the data pump import utility twice - once for data and once for sequence metadata, and then executes SQL*Plus to do post import SQL and invalid object compiles.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;#!/bin/sh&lt;br /&gt;# test_impdp.sh - run pre/post SQL create SQL, datapump imports for a complete refresh of PROD to TEST&lt;br /&gt;#&lt;br /&gt;ORACLE_SID=test&lt;br /&gt;sqlplus -s test_schema/testing @test_impsql.sql&lt;br /&gt;impdp test_schema/testing PARFILE=test_impdata.par&lt;br /&gt;impdp test_schema/testing PARFILE=test_impmeta.par&lt;br /&gt;sqlplus -s test_schema/testing @test_imp_post.sql&lt;br /&gt;sqlplus -s test_schema/testing @compile_invalid.sql&lt;br /&gt;sqlplus -s test_schema/testing @compile_invalid.sql&lt;br /&gt;sqlplus -s test_schema/testing @compile_invalid.sql&lt;/pre&gt;&lt;h4&gt;test_impdata.par&lt;/h4&gt;&lt;p&gt;The data import parameter file is similar to the data export parameter file but with the extra TABLE_EXISTS_ACTION parameter instructing the data pump to truncate (empty) the table if it exists.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;DIRECTORY=test_dp_folder&lt;br /&gt;DUMPFILE=prod_data_%U.dmp&lt;br /&gt;LOGFILE=prod_data_imp.log&lt;br /&gt;CONTENT=DATA_ONLY&lt;br /&gt;SCHEMAS=test_schema&lt;br /&gt;PARALLEL=4&lt;br /&gt;TABLE_EXISTS_ACTION=TRUNCATE&lt;/pre&gt;&lt;h4&gt;test_impmeta.par&lt;/h4&gt;The metadata import parameter file is self-explanatory.&lt;p&gt;&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;DIRECTORY=test_dp_folder&lt;br /&gt;DUMPFILE=prod_meta_%U.dmp&lt;br /&gt;LOGFILE=prod_meta_imp.log&lt;br /&gt;CONTENT=METADATA_ONLY&lt;br /&gt;SCHEMAS=test_schema&lt;/pre&gt;&lt;h4&gt;test_impsql.sql&lt;/h4&gt;&lt;p&gt;This SQL script is where all the magic happens. This is where all of the pain-in-the-ass, that is damned annoying, why oh why Oracle do you punish us you gigantic corporate fudge-packers, gets taken care of. This script dynamically builds two SQL scripts: a pre-import script and a post-import script. All enabled triggers and referential constraints (foreign keys) must be queries so they can be disabled and then enabled. Do not enable a constraint or trigger that was disabled; it was likely disabled for a reason likely by some developer behind your back. The script must also query all sequences so they can be dropped before import. The data pump import does not have a parameter or option to replace an existing sequence, so sequences must be dropped pre-import. Dropping the sequence causes two problems: privileges granted to those sequences will be lost and all source types containing the sequence will become invalid. The post-import SQL must grant privileges so this SQL script will query existing privileges (the schema owner must be able to query the all_tab_privs view).&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;SET FEEDBACK OFF TERMOUT OFF TRIMSPOOL ON VERIFY OFF PAGESIZE 0 LINESIZE 200&lt;br /&gt;SPOOL test_imp_pre.sql&lt;br /&gt;SELECT 'ALTER TRIGGER '||trigger_name||' DISABLE;' &lt;br /&gt;FROM user_triggers&lt;br /&gt;WHERE base_object_type = 'TABLE' AND status = 'ENABLED'&lt;br /&gt;ORDER BY trigger_name;&lt;br /&gt;SELECT 'ALTER TABLE '||table_name||' DISABLE CONSTRAINT '||constraint_name||';' &lt;br /&gt;FROM user_constraints&lt;br /&gt;WHERE constraint_type = 'R' AND status = 'ENABLED'&lt;br /&gt;ORDER BY table_name;&lt;br /&gt;SELECT 'DROP SEQUENCE '||sequence_name||';'&lt;br /&gt;FROM user_sequences&lt;br /&gt;ORDER BY sequence_name;&lt;br /&gt;SPOOL OFF&lt;br /&gt;SPOOL test_imp_post.sql&lt;br /&gt;SELECT 'ALTER TRIGGER '||trigger_name||' ENABLE;' &lt;br /&gt;FROM user_triggers&lt;br /&gt;WHERE base_object_type = 'TABLE' AND status = 'ENABLED'&lt;br /&gt;ORDER BY trigger_name;&lt;br /&gt;SELECT 'ALTER TABLE '||table_name||' ENABLE CONSTRAINT '||constraint_name||';' &lt;br /&gt;FROM user_constraints&lt;br /&gt;WHERE constraint_type = 'R' AND status = 'ENABLED'&lt;br /&gt;ORDER BY table_name;&lt;br /&gt;SELECT 'GRANT '||privilege||' ON '||object_name||' TO '||grantee||';'&lt;br /&gt;FROM user_objects&lt;br /&gt;JOIN all_tab_privs ON table_schema = USER AND table_name = object_name&lt;br /&gt;WHERE object_type = 'SEQUENCE'&lt;br /&gt;ORDER BY object_name;&lt;br /&gt;SPOOL OFF&lt;br /&gt;@test_imp_pre.sql&lt;br /&gt;QUIT&lt;/pre&gt;&lt;h4&gt;compile_invalid.sql&lt;/h4&gt;&lt;p&gt;The generic SQL script will query invalid source objects (made invalid by the sequence being dropped), create SQL to compile those invalid source objects, and then execute that SQL. This generic script will need to be executed at least once but up to six times due to objects being invalidated when an object is compiled. For example: if procedure A calls procedure B that uses sequence C, both A and B will be invalid when the sequence is dropped. If A then B is compiled, A will be valid until B is compiled then will become invalid. The second execution of the compile script will compile A and since nothing depends upon A we are done.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;SET FEEDBACK OFF TERMOUT OFF TRIMSPOOL ON VERIFY OFF PAGESIZE 0 LINESIZE 200&lt;br /&gt;SPOOL compile_invalid_pass.sql&lt;br /&gt;SELECT 'ALTER '||DECODE(SUBSTR(object_type,1,7),'PACKAGE','PACKAGE',object_type)||' '||object_name||' COMPILE'||DECODE(object_type,'PACKAGE BODY',' BODY;','PACKAGE',' PACKAGE;',';')&lt;br /&gt;FROM user_objects&lt;br /&gt;WHERE object_type IN ('TRIGGER','PACKAGE BODY','PACKAGE','FUNCTION','PROCEDURE') AND status = 'INVALID'&lt;br /&gt;ORDER BY object_name, object_type;&lt;br /&gt;SPOOL OFF&lt;br /&gt;@compile_invalid_pass.sql&lt;/pre&gt;&lt;h4&gt;Sequence of Events&lt;/h4&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt;run export script&lt;ol&gt;&lt;li&gt;export table data&lt;/li&gt;&lt;li&gt;export metadata for sequences&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;move exported data to test server (if not on the production server)&lt;/li&gt;&lt;li&gt;run import script&lt;ol&gt;&lt;li&gt;run SQL to create pre and post-import SQL&lt;ol&gt;&lt;li&gt;query referential constraints that need to be disabled&lt;/li&gt;&lt;li&gt;query triggers that need to be disabled&lt;/li&gt;&lt;li&gt;query sequences that need to be dropped&lt;/li&gt;&lt;li&gt;query referential constraints that need to be enabled&lt;/li&gt;&lt;li&gt;query triggers that need to be enabled&lt;/li&gt;&lt;li&gt;query privileges to sequences that need to be granted on sequences that were dropped and then imported&lt;/li&gt;&lt;li&gt;run the pre-import SQL&lt;ol&gt;&lt;li&gt;disable referential constraints&lt;/li&gt;&lt;li&gt;disable triggers&lt;/li&gt;&lt;li&gt;drop sequences&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;import table data&lt;/li&gt;&lt;li&gt;import metadata for sequences&lt;/li&gt;&lt;li&gt;run the post-import SQL&lt;ol&gt;&lt;li&gt;enable referential constraints&lt;/li&gt;&lt;li&gt;enable triggers&lt;/li&gt;&lt;li&gt;grant privileges on sequences to users&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;run compile SQL&lt;ol&gt;&lt;li&gt;query for invalid objects&lt;/li&gt;&lt;li&gt;compile source types made invalid after the sequence drop&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;run compile SQL&lt;ol&gt;&lt;li&gt;query for invalid objects&lt;/li&gt;&lt;li&gt;compile source types made invalid after the last compile&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;run compile SQL&lt;ol&gt;&lt;li&gt;query for invalid objects&lt;/li&gt;&lt;li&gt;compile source types made invalid after the last compile&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;You are probably thinking to yourself “holy fudging fudge, all of that bullfrog for a stupid little sequence?” I know I am. Hundreds of other individuals are thinking the same thing. There are other ways of handling sequences. Generate DDL for the sequence and then drop and create it; but that has the same effect as above (loss of privileges and invalid objects). Select MAX() and use that value to build SQL to drop and create it; same problems as above. Select MAX(), alter the increment by property of the sequence, get the next value, then restore the increment by property. The last two would require prior knowledge of the table(s) and column(s) using the sequence. One of our production databases is a vendor package that has over forty sequences so some up-front work would be required to match sequence to column to table. The last solution is cleanest because it does not require the recompilation of source objects or restoration of privileges. The whole issue could be avoided in the value of the sequence was considered a data object instead of a metadata object.&lt;/p&gt;&lt;p&gt;The next part will hopefully deal with the dirty details like how much undo/redo is generated, what about performance, etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5741729927880756806?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5741729927880756806' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5741729927880756806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5741729927880756806'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/10/oracle-data-pump-for-data-refreshes_29.html' title='Oracle Data Pump for data refreshes part 3'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-86037053517180818</id><published>2009-10-21T16:00:00.001-04:00</published><updated>2009-10-28T16:06:01.978-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Data Pump for data refreshes part 2</title><content type='html'>&lt;p&gt;In &lt;a href="http://grouchgeek.blogspot.com/2009/09/oracle-data-pump-for-data-refreshes.html"&gt;part 1&lt;/a&gt; tables were created and populated with data. The following UNIX steps assume the user on the server has appropriate privileges to execute Oracle binaries and has the environment set correctly. We now use the data pump to export the whole schema:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;ORACLE_SID=prod&lt;br /&gt;expdp test_schema/testing DIRECTORY=test_dp_folder DUMPFILE=prod_full_%U.dmp LOGFILE=prod_full_exp.log SCHEMAS=test_schema&lt;/pre&gt;&lt;p&gt;Get the dump files to the target server and then run the import:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;ORACLE_SID=test&lt;br /&gt;impdp test_schema/testing DIRECTORY=test_dp_folder DUMPFILE=prod_full_%U.dmp LOGFILE=prod_full_imp.log SCHEMAS=test_schema EXCLUDE=USER&lt;/pre&gt;&lt;p&gt;The EXCLUDE=USER assumes the schema owner user already exists in the target database and avoids the annoying error.&lt;/p&gt;&lt;p&gt;The tables, data, constraints, triggers and sequences have been populated. One thing to notice, however: the NEXTVAL for the sequence is 141 and not the 124 from the production system. The reason for this is default CACHE value (20) used when the sequence was created. The sequence imported will always be a multiple of the CACHE setting plus the start value. If your application cannot deal with gaps in the sequence value then use the NOCACHE setting when creating the sequence otherwise every shutdown will introduce gaps and every refresh of test data will introduce gaps.&lt;/p&gt;&lt;p&gt;The next part will document how to refresh data.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-86037053517180818?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=86037053517180818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/86037053517180818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/86037053517180818'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/10/oracle-data-pump-for-data-refreshes.html' title='Oracle Data Pump for data refreshes part 2'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5055581065221679163</id><published>2009-09-28T11:23:00.002-04:00</published><updated>2009-09-28T16:05:15.989-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>CRUD with the Oracle MERGE statement</title><content type='html'>&lt;p&gt;Most of this post came about after a lengthy search of the clicker-web for information on Oracle materialized views. There are three or fifty situations at work where such a construct might be helpful to performance and overall health of the system (like when five different folks are running the same query over and over and over again).&lt;/p&gt;&lt;p&gt;Most situations that could benefit from a materialized view are "complex materialized views" according to Oracle manuals and guide (i.e. I am doing something more complicated than "hello world" in SQL). Others have documented that the materialized view update is really a MERGE behind the scenes. I am quite familiar with a MERGE and that was actually my first choice before I thought to myself "there is probably something already created for this complicated crap". Why recreate the square wheel, right? In this case the square wheel might be more efficient in the long run.&lt;/p&gt;&lt;p&gt;First, I will create a quick table and add some constraints to it:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE TABLE table_full_of_crud AS&lt;br /&gt; SELECT&lt;br /&gt;   LEVEL AS id&lt;br /&gt; , TRUNC(SYSDATE,'YEAR')+(LEVEL-1) AS some_stupid_date&lt;br /&gt; , CASE MOD(LEVEL,7) WHEN 0 THEN NULL ELSE TO_CHAR(TRUNC(SYSDATE,'YEAR')+(LEVEL-1),'DAY"," MONTH D YYYY') END AS varchar_crud&lt;br /&gt; FROM DUAL&lt;br /&gt; CONNECT BY ROWNUM BETWEEN 1 AND 120;&lt;br /&gt;ALTER TABLE table_full_of_crud&lt;br /&gt; ADD (CONSTRAINT pk_table_full_of_crud  PRIMARY KEY(id))&lt;br /&gt; MODIFY (some_stupid_date NOT NULL);&lt;/pre&gt;&lt;p&gt;Here is what I consider to be a well-formed, structured MERGE that will handle new rows, updated rows and rows that need to be deleted:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;MERGE /*+ append */ INTO table_full_of_crud  m&lt;br /&gt;USING (&lt;br /&gt;SELECT&lt;br /&gt;  NVL(v1.id,t1.id) AS id&lt;br /&gt;, NVL(v1.some_stupid_date,TRUNC(SYSDATE)-12345) AS some_stupid_date&lt;br /&gt;, v1.varchar_crud&lt;br /&gt;FROM table_full_of_crud t1&lt;br /&gt;FULL JOIN (&lt;br /&gt; SELECT * FROM (&lt;br /&gt;   SELECT&lt;br /&gt;     LEVEL AS id&lt;br /&gt;   , TRUNC(SYSDATE,'YEAR')+(LEVEL-1) AS some_stupid_date&lt;br /&gt;   , CASE MOD(LEVEL,20)&lt;br /&gt;     WHEN 0 THEN NULL&lt;br /&gt;     WHEN 7 THEN TO_CHAR(TRUNC(SYSDATE,'YEAR')+(LEVEL-1),'DAY"," MONTH D YYYY')&lt;br /&gt;     ELSE TO_CHAR(TRUNC(SYSDATE,'YEAR')+(LEVEL-1),'MM/DD/YYYY')&lt;br /&gt;     END AS varchar_crud&lt;br /&gt;   FROM DUAL&lt;br /&gt;   CONNECT BY ROWNUM BETWEEN 1 AND 160&lt;br /&gt;  )&lt;br /&gt;  WHERE MOD(id,69) &gt; 0&lt;br /&gt;) v1 ON v1.id = t1.id&lt;br /&gt;) u&lt;br /&gt;ON (m.id = u.id)&lt;br /&gt;WHEN MATCHED THEN&lt;br /&gt; UPDATE SET&lt;br /&gt;   m.some_stupid_date = u.some_stupid_date&lt;br /&gt; , m.varchar_crud = u.varchar_crud&lt;br /&gt; WHERE NOT(&lt;br /&gt;   (m.some_stupid_date = u.some_stupid_date)&lt;br /&gt;   AND DECODE(m.varchar_crud,u.varchar_crud,'EQ') IS NOT NULL&lt;br /&gt; )&lt;br /&gt; DELETE&lt;br /&gt; WHERE m.some_stupid_date = (TRUNC(SYSDATE)-12345)&lt;br /&gt;   AND m.varchar_crud IS NULL&lt;br /&gt;WHEN NOT MATCHED THEN&lt;br /&gt; INSERT (m.id, m.some_stupid_date, m.varchar_crud)&lt;br /&gt; VALUES (u.id, u.some_stupid_date, u.varchar_crud);&lt;/pre&gt;&lt;p&gt;Here is a line by line explanation of all this crap:&lt;ol&gt;&lt;li&gt;The start of the MERGE statement, with append hint (direct path, etc.) INTO table; I use a table alias of "m" to indicate this is the table having data merged into it (makes sense)&lt;/li&gt;&lt;li&gt;USING; we will be using a subquery&lt;/li&gt;&lt;li&gt;SELECT (our subquery)&lt;/li&gt;&lt;li&gt;The NVL of the primary key is required due to the FULL [OUTER] JOIN; if the row needs deleted then the merge data primary key will be NULL, if inserted the original primary key will be NULL, if update neither will be NULL&lt;/li&gt;&lt;li&gt;The NVL of this column is due to the NOT NULL constraint and to use as our "delete trigger"; "delete triggers" should be a value that will never appear in the column&lt;/li&gt;&lt;li&gt;VARCHAR2 column&lt;/li&gt;&lt;li&gt;FROM the table that will be the target of the merge;&lt;/li&gt;&lt;li&gt;FULL [OUTER] JOIN is used to return the rows that exist in either table&lt;/li&gt;&lt;li&gt;SELECT the merge data; this subquery will contain new rows and rows that might need updating in the merge target table&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data modify some rows to null values&lt;/li&gt;&lt;li&gt;data keep some rows the same&lt;/li&gt;&lt;li&gt;data modify the rest&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;data delete the 69th key value (remove it from the subquery)&lt;/li&gt;&lt;li&gt;data&lt;/li&gt;&lt;li&gt;End of using subquery; assign table alias of "u" (again, makes sense)&lt;/li&gt;&lt;li&gt;ON here is where (usually) primary key values are matched back to each other and influence the next two sections; what to do when things do or do not match&lt;/li&gt;&lt;li&gt;If the condition above evaluates to TRUE then the "WHEN MATCHED THEN" section is performed&lt;/li&gt;&lt;li&gt;UPDATE the target table&lt;/li&gt;&lt;li&gt;SET column value&lt;/li&gt;&lt;li&gt;SET column value&lt;/li&gt;&lt;li&gt;I use the WHERE clause of the merge update clause to determine if the row columns have changed or not; if they have NOT changed then why have the undo and redo overhead (???)&lt;/li&gt;&lt;li&gt;If a column cannot be NULL then a simple comparison will work&lt;/li&gt;&lt;li&gt;If a column can be NULL then DECODE can be used on both columns in the comparison&lt;/li&gt;&lt;li&gt;End of NOT(&lt;/li&gt;&lt;li&gt;DELETE from the target table&lt;/li&gt;&lt;li&gt;The WHERE clause check for the "delete trigger(s)" in (TRUNC(SYSDATE)-12345)&lt;/li&gt;&lt;li&gt;AND check for null columns (the FULL JOIN will produce NULL values in columns without corresponding rows in the merge data)&lt;/li&gt;&lt;li&gt;The "WHEN NOT MATCHED THEN" is performed when merge data cannot be matched to rows in the merge target&lt;/li&gt;&lt;li&gt;So INSERT (columns)&lt;/li&gt;&lt;li&gt;With new VALUES (from the merge subquery data)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The USING sub-query will almost always contain a complex piece of SQL to collect new and updated rows. The handle deletes of rows in the merge target table it needs to be joined to the query data with a FULL OUTER JOIN. If deletes are not needed, then the FULL JOIN is not needed. Here is a visual representation of the FULL OUTER JOIN:&lt;/p&gt;&lt;pre&gt;ID1 X1   Y1     ID2 X2   Y2&lt;br /&gt;1   data data   1   data data&lt;br /&gt;2   data data   2   data data&lt;br /&gt;3   data data   4   data data&lt;br /&gt;4   data data   5   data data&lt;br /&gt;5   data data   6   data data&lt;/pre&gt;&lt;p&gt;After FULL JOIN&lt;/p&gt;&lt;pre&gt;ID1  ID2  X2   Y2&lt;br /&gt;1    1    data data&lt;br /&gt;2    2    data data&lt;br /&gt;3    NULL NULL NULL&lt;br /&gt;4    4    data data&lt;br /&gt;5    5    data data&lt;br /&gt;NULL 6    data data&lt;/pre&gt;&lt;p&gt;The non-primary key columns in rows that need to be deleted will be NULL. This can be used in the topmost section of the USING sub-query (via NVL) to create delete trigger data, which brings me to the DELETE mechanism.&lt;/p&gt;&lt;p&gt;The hardest part of the above statement was getting the DELETE clause to work. Reading the Oracle 10g Database SQL Reference helped somewhat; especially this point: &lt;/p&gt;&lt;p&gt;The only rows affected by this clause are those rows in the destination table that are updated by the merge operation. That is, the DELETE WHERE condition evaluates the updated value, not the original value that was evaluated by the UPDATE SET ... WHERE condition. If a row of the destination table meets the DELETE condition but is not included in the join defined by the ON clause, then it is not deleted. &lt;/p&gt;&lt;p&gt;This means the DELETE does not use column data in the USING clause sub-query; very important. Some column in the UPDATE must be updated for the DELETE to work. To handle this set one or more columns to values that would never appear (in combination) in the data and use those values as a delete trigger.&lt;/p&gt;&lt;p&gt;I always add a WHERE clause to the UPDATE to determine if anything has changed. If nothing has changed then why generate the undo and redo data? Simply compare non-null columns and then null-evaluated columns to determine if data have changed.&lt;/p&gt;&lt;p&gt;The INSERT clause is the same as the INSERT statement we all know and love.&lt;/p&gt;&lt;p&gt;One discussion I came across on the Internet was about using a UNION ALL instead of the FULL OUTER JOIN. The UNION ALL performs better (one full index scan) than the FULL JOIN (two index scans and then a UNION-ALL). UNION ALL is a set operator, however, and updated rows would be duplicated (one unique row from the merge table and one from the query data). Something could probably be written but the FULL JOIN is simple, easy to maintain and worth whatever fractional overhead (compared to the actual merge) incurred.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5055581065221679163?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5055581065221679163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5055581065221679163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5055581065221679163'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/09/crud-with-oracle-merge-statement.html' title='CRUD with the Oracle MERGE statement'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2357753773762450577</id><published>2009-09-25T17:43:00.001-04:00</published><updated>2009-09-28T12:36:34.909-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Drugs, doctors, dumb gripe</title><content type='html'>&lt;p&gt;I heard the most interesting conversation outside the door on the examination room I was waiting in. I was there for what felt like an upper respiratory infection (or more likely remnants of) and subsequent examination. A pharmaceutical representative was talking to the doctor about a drug. A normal human would have been shocked by the conversation but with my current mindset I was able to shrug it off and not be surprised.&lt;/p&gt;&lt;p&gt;Why? This crap is everywhere. There is not a single organization or area that does not have these back door shenanigans.&lt;/p&gt;&lt;p&gt;Welcome to the world.&lt;/p&gt;&lt;p&gt;People pile poop on the bug drug companies and they deserve every last ounce but they also deserve credit for developing life saving and life enhancing medicines. What I find equally offensive are the people who poop on those pharmaceutical companies but support the natural, organic and alternative products. They are doing the same thing – making money off a product and potentially causing harm to individuals where medicine is needed to prevent illness or death.&lt;/p&gt;&lt;p&gt;What was said? Drug rep asks about drug. Doctor says there is too much conflicting information so he prescribes drug. If drug benefits patient he lets them stay on the drug. Drug rep wants to target a one year life cycle per patient for the drug. Other things were said. Mentions of the conversation getting on Internet were made. It was humorous to them.&lt;/p&gt;&lt;p&gt;A co-worker once said they have a drug to wake you up, a drug to keep you awake, to put you to sleep, a to make you happy, to make you sad, so you just do not care anymore, to get you hard, to make you stay hard, to make the pain go away and a drug to make you – well they have a drug for everything.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2357753773762450577?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2357753773762450577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2357753773762450577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2357753773762450577'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/09/i-heard-most-interesting-conversation.html' title='Drugs, doctors, dumb gripe'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8083026549296389330</id><published>2009-09-21T21:11:00.001-04:00</published><updated>2009-09-30T07:54:55.774-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Bad mood music playlist</title><content type='html'>&lt;p&gt;My current "Bad Mood Music" playlist...&lt;ol&gt;&lt;li&gt;Exodus - "Deranged", from "Pleasures of the Flesh"&lt;/li&gt;&lt;li&gt;Overkill - "I Hate", from "The Years Of Decay"&lt;/li&gt;&lt;li&gt;Wrathchild America - "Surrounded By Idiots", from "3D"&lt;/li&gt;&lt;li&gt;Anthrax - "Antisocial", from "State of Euphoria"&lt;/li&gt;&lt;li&gt;Nailbomb - "24 Hour Bullshit", from "Point Blank"&lt;/li&gt;&lt;li&gt;Fight - "Kill It", from "War of Words"&lt;/li&gt;&lt;li&gt;GWAR - "America Must Be Destroyed", from "America Must Be Destroyed"&lt;/li&gt;&lt;li&gt;Stormtroopers of Death - "Speak English or Die", from "Speak English or Die"&lt;/li&gt;&lt;li&gt;Sacred Reich - "The American Way", from "The American Way"&lt;/li&gt;&lt;li&gt;Corrosion of Conformity - "Vote With a Bullet", from "Blind"&lt;/li&gt;&lt;li&gt;Megadeth - "Into The Lungs Of Hell", from "So Far, So Good... So What! [Remaster]"&lt;/li&gt;&lt;li&gt;Megadeth - "Set The World Afire", from "So Far, So Good... So What! [Remaster]"&lt;/li&gt;&lt;li&gt;Metallica - "Battery", from "Master of Puppets"&lt;/li&gt;&lt;li&gt;Death Angel - "The Ultra-Violence", from "The Ultra-Violence (Remastered)"&lt;/li&gt;&lt;li&gt;Pantera - "Mouth For War", from "Vulgar Display of Power"&lt;/li&gt;&lt;li&gt;Marilyn Manson - "The Beautiful People", from "Antichrist Superstar"&lt;/li&gt;&lt;li&gt;Disturbed - "Down With The Sickness", from "The Sickness"&lt;/li&gt;&lt;li&gt;Limp Bizkit - "Break Stuff", from "significant other"&lt;/li&gt;&lt;li&gt;Slipknot - "People = Shit", from "Iowa"&lt;/li&gt;&lt;li&gt;Static X - "I'm With Stupid", from "Wisconsin Death Trip"&lt;/li&gt;&lt;li&gt;Anthrax - "Chromatic Death", from "Attack of the Killer B's"&lt;/li&gt;&lt;li&gt;Sepultura - "Attitude", from "Roots"&lt;/li&gt;&lt;li&gt;Slayer - "War Ensemble", from "Seasons In The Abyss"&lt;/li&gt;&lt;li&gt;Exodus - "War is my Sheppard", from "Tempo of the Damned"&lt;/li&gt;&lt;li&gt;Pantera - "War Nerve", from "The Great Southern Trendkill"&lt;/li&gt;&lt;li&gt;Slayer - "Exile", from "God Hates Us All"&lt;/li&gt;&lt;li&gt;Suicidal Tendencies - "How Will I Laugh Tomorrow (Heavy Emotion Version)", from "Controlled by Hatred/Feel Like Shit"&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8083026549296389330?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8083026549296389330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8083026549296389330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8083026549296389330'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/09/bad-mood-music-playlist.html' title='Bad mood music playlist'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3031227895747664313</id><published>2009-09-21T16:00:00.002-04:00</published><updated>2009-10-28T14:48:15.162-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Data Pump for data refreshes part 1</title><content type='html'>&lt;p&gt;This post will be the first in a multi-part post about the Oracle data pump utility. My goal for this series of posts is to (hopefully) provide a road map for Oracle database users to use the data pump utilities to refresh one or more test/development databases from a periodic snapshot of production data.&lt;/p&gt;&lt;p&gt;The data pump import and export utilities were added alongside the older export and import utilities in version10g of Oracle Database. These utilities can be used to make logical backups of metadata and data in databases from the entire database down to an individual table.&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14215/part_dp.htm"&gt;Oracle Data Pump&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/obe/obe10gdb/integrate/datapump/datapump.htm"&gt;Oracle by Example: Unloading and Loading Database Content with Oracle Data Pump&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The first thing I noted when doing a snapshot of a production database at work is that when enough parallel processes are given to the data pump it smokes the pants off the previous utilities. What took hours now took minutes. That made me happy and I am sure my arteries will be happy without the 4am runs to White Castle while the export chugged along. Note, I have not done an import of production data yet and there is a reason for that – the unknown.&lt;/p&gt;&lt;p&gt;Like any good administrator I wanted to understand this new tool before I just started restoring data to databases. What about jobs? How do I handle sequences? Unfortunately the Oracle documentation is painfully lacking in that area. The 10g documentation for the old export has a section called "considerations when exporting database objects" that explains how to handle sequences, LOB columns, synonyms, etc. It also has a lengthier section on "considerations when importing database objects" which was also helpful. The 10g and 11g documentation has examples but lacks the depth of information the previous two utilities had.  The 10g documentation has more useful information about the old utilities than it does about the fancy new ones and the 11g documentation for the data pump is about the same as the 10g data pump (11g has a legacy mode to support the old utility parameters, btw). This meant I had to set up a database to test the following items that could be affected by a data refresh:&lt;ul&gt;&lt;li&gt;constraints&lt;/li&gt;&lt;li&gt;referential constraints (i.e. foreign keys)&lt;/li&gt;&lt;li&gt;indexes&lt;/li&gt;&lt;li&gt;statistics&lt;/li&gt;&lt;li&gt;triggers&lt;/li&gt;&lt;li&gt;sequences&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are other objects like dimensions and quotas but those items will wait until a later time and date.&lt;/p&gt;&lt;p&gt;The first major difference between the old and new utilities is the use of DIRECTORY objects in the data pump utilities. The system DBA will need to create a directory object and grant privileges to it or use the default directory object named DATA_PUMP_DIR (I recommend creating your own so you have more control over who and what and how much).So as someone with the appropriate privileges:&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE USER test_schema IDENTIFIED BY "testing"&lt;br /&gt;   PROFILE DEFAULT&lt;br /&gt;   DEFAULT TABLESPACE users&lt;br /&gt;   QUOTA UNLIMITED ON users&lt;br /&gt;   ACCOUNT UNLOCK;&lt;br /&gt;GRANT CONNECT,DBA TO test_schema;&lt;br /&gt;CREATE OR REPLACE DIRECTORY test_dp_folder AS '/u69/oraldata/testdpump';&lt;br /&gt;GRANT READ,WRITE ON DIRECTORY test_dp_folder TO test_schema;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Next create tables.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;--- Time periods&lt;br /&gt;CREATE TABLE time_periods&lt;br /&gt; AS&lt;br /&gt;SELECT&lt;br /&gt;  time_date&lt;br /&gt;, EXTRACT(YEAR FROM time_date) AS time_year&lt;br /&gt;, EXTRACT(MONTH FROM time_date) AS time_month&lt;br /&gt;, EXTRACT(DAY FROM time_date) AS time_day&lt;br /&gt;, TO_NUMBER(TO_CHAR(time_date,'d')) AS time_day_of_week&lt;br /&gt;FROM (&lt;br /&gt;  SELECT TRUNC(SYSDATE,'YEAR')+(LEVEL - 1) AS time_date&lt;br /&gt;  FROM DUAL&lt;br /&gt;  CONNECT BY ROWNUM BETWEEN 1 AND ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),36)-TRUNC(SYSDATE,'YEAR')&lt;br /&gt;);&lt;br /&gt;ALTER TABLE time_periods ADD (CONSTRAINT pk_time_periods PRIMARY KEY(time_date));&lt;br /&gt;--- Customer table&lt;br /&gt;CREATE TABLE customers&lt;br /&gt; AS&lt;br /&gt;SELECT&lt;br /&gt;  LEVEL AS customer_id&lt;br /&gt;, 'Test customer #'||TO_CHAR(LEVEL,'000000000') AS customer_name&lt;br /&gt;FROM DUAL&lt;br /&gt;CONNECT BY ROWNUM BETWEEN 1 AND 100;&lt;br /&gt;ALTER TABLE customers ADD (CONSTRAINT pk_customers PRIMARY KEY(customer_id));&lt;br /&gt;--- Purchase order table&lt;br /&gt;--- A sequence&lt;br /&gt;CREATE SEQUENCE seq_pk_purchase_orders;&lt;br /&gt;SELECT seq_pk_purchase_orders.NEXTVAL FROM dual;&lt;br /&gt;--- Table with foreign keys&lt;br /&gt;CREATE TABLE purchase_orders&lt;br /&gt;( po_id  NUMBER&lt;br /&gt;, po_date  DATE&lt;br /&gt;, po_cust  NUMBER&lt;br /&gt;, po_tag  VARCHAR2(64)&lt;br /&gt;, po_tot_items  NUMBER&lt;br /&gt;, po_tot_value  NUMBER&lt;br /&gt;, CONSTRAINT pk_purchase_orders PRIMARY KEY(po_id)&lt;br /&gt;, CONSTRAINT fk_po_date FOREIGN KEY(po_date) REFERENCES time_periods(time_date)&lt;br /&gt;, CONSTRAINT fk_po_cust FOREIGN KEY(po_cust) REFERENCES customers(customer_id)&lt;br /&gt;);&lt;br /&gt;--- A trigger that modifies the PO tag&lt;br /&gt;CREATE OR REPLACE TRIGGER tr_po_tag&lt;br /&gt;  BEFORE INSERT ON purchase_orders FOR EACH ROW&lt;br /&gt;BEGIN&lt;br /&gt;  :new.po_tag := CASE WHEN :new.po_tag IS NULL THEN 'SGPO' ELSE 'CUST '||:new.po_tag END;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The SQL is used to insert test data into the purchase orders table&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;INSERT /*+ APPEND */ INTO purchase_orders&lt;br /&gt;SELECT&lt;br /&gt;  seq_pk_purchase_orders.NEXTVAL&lt;br /&gt;, TRUNC(TRUNC(SYSDATE,'YEAR')+DBMS_RANDOM.value(0,(SELECT COUNT(time_date) FROM time_periods)))&lt;br /&gt;, TRUNC(DBMS_RANDOM.value(1,(SELECT COUNT(customer_id) FROM customers)))&lt;br /&gt;, CASE MOD(r1,69) WHEN 0 THEN NULL ELSE DBMS_RANDOM.string('A',12) END&lt;br /&gt;, CEIL(r2)&lt;br /&gt;, CEIL(r2*123456)/100&lt;br /&gt;FROM (&lt;br /&gt;  SELECT LEVEL AS r1, ABS(DBMS_RANDOM.normal) AS r2&lt;br /&gt;  FROM DUAL&lt;br /&gt;  CONNECT BY ROWNUM BETWEEN 1 AND 123&lt;br /&gt;) v1&lt;br /&gt;;&lt;br /&gt;COMMIT;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3031227895747664313?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3031227895747664313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3031227895747664313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3031227895747664313'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/09/oracle-data-pump-for-data-refreshes.html' title='Oracle Data Pump for data refreshes part 1'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4428505945804195693</id><published>2009-09-08T21:12:00.001-04:00</published><updated>2009-09-08T21:18:10.935-04:00</updated><title type='text'>Life sucks sometimes</title><content type='html'>&lt;p&gt;You ever get to a point in your life where everything is getting better and you are beginning to feel happy about life and then you get smacked in the face? Well, I got slapped and punched and kicked and jabbed in the heart and spit upon all in the course of about a week.&lt;/p&gt;&lt;p&gt;I would love to share some opinions but to be blunt, it does not matter. The Internet is the wrong place to share such opinions.&lt;/p&gt;&lt;p&gt;Things are getting better and returning to normal, though. Hopefully that means I will have time to post some Oracle crap and some gripes about stuff. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4428505945804195693?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4428505945804195693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4428505945804195693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4428505945804195693'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/09/life-sucks-sometimes.html' title='Life sucks sometimes'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1545412697084204579</id><published>2009-08-14T14:34:00.005-04:00</published><updated>2009-08-14T19:30:24.632-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle 10g database authentication</title><content type='html'>&lt;p&gt;This is my attempt to get my collective knowledge of authorization in the Oracle 10g Database world in one location. The following steps and information assume you have access to a super-user (i.e. AS SYSDBA) and a database with a "USERS" tablespace.&lt;/p&gt;&lt;p&gt;First, create the schema owner user, read and update roles and then grant built-in roles with necessary system privileges to the users. Also grant the read role to the write role.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE USER test_schema IDENTIFIED BY "t3sting"&lt;br /&gt; PROFILE DEFAULT&lt;br /&gt; DEFAULT TABLESPACE users&lt;br /&gt; QUOTA UNLIMITED ON users&lt;br /&gt; ACCOUNT UNLOCK;&lt;br /&gt;CREATE USER test_user IDENTIFIED BY "t3sting"&lt;br /&gt; PROFILE DEFAULT&lt;br /&gt; DEFAULT TABLESPACE users&lt;br /&gt; QUOTA 5M ON users&lt;br /&gt; ACCOUNT UNLOCK;&lt;br /&gt;CREATE ROLE test_READ NOT IDENTIFIED;&lt;br /&gt;CREATE ROLE test_CRUD IDENTIFIED BY "supercomplicatedpassword";&lt;br /&gt;GRANT CONNECT TO test_schema,test_user;&lt;br /&gt;GRANT RESOURCE TO test_schema;&lt;br /&gt;GRANT test_READ TO test_CRUD;&lt;/pre&gt;&lt;p&gt;Next, connect as schema owner to create objects and then grant object privileges to them to the read and write roles&lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_schema&lt;br /&gt;Enter password:&lt;br /&gt;Connected.&lt;/pre&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE TABLE test_table&lt;br /&gt;  COMPRESS&lt;br /&gt;  AS&lt;br /&gt;SELECT&lt;br /&gt;  TO_CHAR(time_date,'YYYYMMDD')||'.01' AS time_id&lt;br /&gt;,  time_date&lt;br /&gt;,  EXTRACT(YEAR FROM time_year_beg_date) AS time_year&lt;br /&gt;,  time_year_beg_date&lt;br /&gt;,  ADD_MONTHS(time_year_beg_date-1,12) AS time_year_end_date&lt;br /&gt;,  EXTRACT(MONTH FROM time_date) AS time_month&lt;br /&gt;,  TRUNC(time_date,'MONTH') AS time_month_beg_date&lt;br /&gt;,  ADD_MONTHS(time_date-1,12) AS time_month_end_date&lt;br /&gt;,  TO_CHAR(time_date,'Day') AS time_day_of_week&lt;br /&gt;,  CASE time_date&lt;br /&gt;    WHEN time_year_beg_date THEN 'New Years Day'&lt;br /&gt;    WHEN NEXT_DAY(time_year_beg_date+30,'MON')+14 THEN 'Presidents Day'&lt;br /&gt;    WHEN NEXT_DAY(ADD_MONTHS(time_year_beg_date,5)-1,'MON')-7 THEN 'Memorial Day'&lt;br /&gt;    WHEN ADD_MONTHS(time_year_beg_date,6)+3 THEN 'Independance Day'&lt;br /&gt;    WHEN NEXT_DAY(ADD_MONTHS(time_year_beg_date,8)-1,'MON') THEN 'Labor Day'&lt;br /&gt;    WHEN ADD_MONTHS(time_year_beg_date,10)+10 THEN 'Veterans Day'&lt;br /&gt;    WHEN NEXT_DAY(ADD_MONTHS(time_year_beg_date,10)-1,'THU')+21 THEN 'Thanksgiving'&lt;br /&gt;    WHEN ADD_MONTHS(time_year_beg_date,11)+24 THEN 'Christmas'&lt;br /&gt;    ELSE NULL&lt;br /&gt;  END AS time_holiday_description&lt;br /&gt;FROM (&lt;br /&gt;  SELECT&lt;br /&gt;     TRUNC(SYSDATE,'YEAR')+(LEVEL - 1) AS time_date&lt;br /&gt;  ,  TRUNC(TRUNC(SYSDATE,'YEAR')+(LEVEL - 1),'YEAR') AS time_year_beg_date&lt;br /&gt;  FROM DUAL&lt;br /&gt;  CONNECT BY ROWNUM BETWEEN 1 AND ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),36)-TRUNC(SYSDATE,'YEAR')&lt;br /&gt;);&lt;/pre&gt;&lt;pre&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; DESC test_table&lt;br /&gt;Name                                      Null?    Type&lt;br /&gt;----------------------------------------- -------- ----------------------------&lt;br /&gt;TIME_ID                                            VARCHAR2(11)&lt;br /&gt;TIME_DATE                                          DATE&lt;br /&gt;TIME_YEAR                                          NUMBER&lt;br /&gt;TIME_YEAR_BEG_DATE                                 DATE&lt;br /&gt;TIME_YEAR_END_DATE                                 DATE&lt;br /&gt;TIME_MONTH                                         NUMBER&lt;br /&gt;TIME_MONTH_BEG_DATE                                DATE&lt;br /&gt;TIME_MONTH_END_DATE                                DATE&lt;br /&gt;TIME_DAY_OF_WEEK                                   VARCHAR2(9)&lt;br /&gt;TIME_HOLIDAY_DESCRIPTION                           VARCHAR2(16)&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT COUNT(*) FROM test_table;&lt;br /&gt;&lt;br /&gt; COUNT(*)&lt;br /&gt;----------&lt;br /&gt;     1095&lt;/pre&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;GRANT SELECT ON test_table TO test_READ;&lt;br /&gt;GRANT INSERT,UPDATE,DELETE ON ON test_table TO test_CRUD;&lt;/pre&gt;&lt;p&gt;The test_user USER has CREATE SESSION system privileges so test_user can create a session and connect to Oracle and see PUBLIC objects. The test_user cannot see or access test_schema.test_table&lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_user&lt;br /&gt;Enter password:&lt;br /&gt;Connected.&lt;br /&gt;&lt;br /&gt;SQL&gt; DESC test_schema.test_table&lt;br /&gt;ERROR:&lt;br /&gt;ORA-04043: object test_schema.test_table does not exist&lt;/pre&gt;&lt;p&gt;Authorization to schema objects can be granted: directly to the USER, indirectly through a ROLE, or through granted execute privilege on a source object (PROCEDURE, FUNCTION or PACKAGE) created with AUTHID DEFINER.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;GRANT SELECT ON test_table TO test_user;&lt;/pre&gt;&lt;p&gt;Privileges granted directly to the USER are recognized immediately&lt;/p&gt;&lt;pre&gt;SQL&gt; DESC test_schema.test_table&lt;br /&gt;Name                                      Null?    Type&lt;br /&gt;----------------------------------------- -------- ----------------------------&lt;br /&gt;TIME_ID                                            VARCHAR2(11)&lt;br /&gt;TIME_DATE                                          DATE&lt;br /&gt;TIME_YEAR                                          NUMBER&lt;br /&gt;TIME_YEAR_BEG_DATE                                 DATE&lt;br /&gt;TIME_YEAR_END_DATE                                 DATE&lt;br /&gt;TIME_MONTH                                         NUMBER&lt;br /&gt;TIME_MONTH_BEG_DATE                                DATE&lt;br /&gt;TIME_MONTH_END_DATE                                DATE&lt;br /&gt;TIME_DAY_OF_WEEK                                   VARCHAR2(9)&lt;br /&gt;TIME_HOLIDAY_DESCRIPTION                           VARCHAR2(16)&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT DISTINCT time_holiday_description FROM TEST_SCHEMA.test_table;&lt;br /&gt;&lt;br /&gt;TIME_HOLIDAY_DES&lt;br /&gt;----------------&lt;br /&gt;Veterans Day&lt;br /&gt;New Years Day&lt;br /&gt;Independance Day&lt;br /&gt;Memorial Day&lt;br /&gt;Presidents Day&lt;br /&gt;Labor Day&lt;br /&gt;Thanksgiving&lt;br /&gt;&lt;br /&gt;8 rows selected.&lt;/pre&gt;&lt;p&gt;As schema owner user revoke the privilege from the USER and then grant the read ROLE to USER test_user.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;REVOKE SELECT ON test_table FROM test_user;&lt;br /&gt;GRANT test_READ TO test_user;&lt;/pre&gt;&lt;pre&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01919: role 'TEST_READ' does not exist&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Unless granted the privilege to do so, the schema owner USER cannot GRANT a ROLE to a USER; a super-user must do it.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;GRANT test_READ TO test_user;&lt;/pre&gt;&lt;p&gt;The ROLE privileges are not available until the USER reconnects or sets the ROLE&lt;/p&gt;&lt;pre&gt;SQL&gt; DESC test_schema.test_table&lt;br /&gt;ERROR:&lt;br /&gt;ORA-04043: object test_schema.test_table does not exist&lt;br /&gt;&lt;br /&gt;SQL&gt; SET ROLE test_READ;&lt;br /&gt;&lt;br /&gt;Role set.&lt;br /&gt;&lt;br /&gt;SQL&gt; DESC test_schema.test_table&lt;br /&gt;Name                                      Null?    Type&lt;br /&gt;----------------------------------------- -------- ----------------------------&lt;br /&gt;TIME_ID                                            VARCHAR2(11)&lt;br /&gt;TIME_DATE                                          DATE&lt;br /&gt;TIME_YEAR                                          NUMBER&lt;br /&gt;TIME_YEAR_BEG_DATE                                 DATE&lt;br /&gt;TIME_YEAR_END_DATE                                 DATE&lt;br /&gt;TIME_MONTH                                         NUMBER&lt;br /&gt;TIME_MONTH_BEG_DATE                                DATE&lt;br /&gt;TIME_MONTH_END_DATE                                DATE&lt;br /&gt;TIME_DAY_OF_WEEK                                   VARCHAR2(9)&lt;br /&gt;TIME_HOLIDAY_DESCRIPTION                           VARCHAR2(16)&lt;br /&gt;&lt;br /&gt;SQL&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt;SET time_holiday_description = 'Special Day'&lt;br /&gt;WHERE time_id LIKE '____1107%';&lt;br /&gt;UPDATE TEST_SCHEMA.test_table&lt;br /&gt;                  *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The test_user USER cannot update test_schema.test_table without privileges. The test_schema USER granted the privileges to the test_CRUD ROLE so a super-user can GRANT that ROLE to test_user.&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;GRANT test_CRUD TO test_user;&lt;/pre&gt;&lt;p&gt;Connect as test_user and try again.&lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_user&lt;br /&gt;Enter password:&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt;SET time_holiday_description = 'Special Day'&lt;br /&gt;WHERE time_id LIKE '____1107%';&lt;br /&gt;&lt;br /&gt;3 rows updated.&lt;br /&gt;&lt;br /&gt;SQL&gt; ROLLBACK;&lt;br /&gt;&lt;br /&gt;Rollback complete.&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Notice how test_user was able to update the table but did not need the password for the test_CRUD role? When a ROLE is granted to a USER or another ROLE it is as a DEFAULT ROLE and all default roles are applied when the session is created. The USER must be altered by a super-user to indicate what roles are default (or not default).&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;ALTER USER test_user DEFAULT ROLE ALL EXCEPT test_CRUD;&lt;/pre&gt;&lt;p&gt;The test_user USER will not have the test_CRUD ROLE when it creates a session.&lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_user&lt;br /&gt;Enter password:&lt;br /&gt;Connected.&lt;br /&gt;&lt;br /&gt;SQL&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt;SET time_holiday_description = 'Special Day'&lt;br /&gt;WHERE time_id LIKE '____1107%';&lt;br /&gt;&lt;br /&gt;UPDATE TEST_SCHEMA.test_table&lt;br /&gt;                  *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;SQL&gt; SET ROLE test_CRUD;&lt;br /&gt;SET ROLE test_CRUD&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01979: missing or invalid password for role 'TEST_CRUD'&lt;br /&gt;&lt;br /&gt;SQL&gt; SET ROLE test_CRUD IDENTIFIED BY "supercomplicatedpassword";&lt;br /&gt;&lt;br /&gt;Role set.&lt;br /&gt;&lt;br /&gt;SQL&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt;SET time_holiday_description = 'Special Day'&lt;br /&gt;WHERE time_id LIKE '____1107%';&lt;br /&gt;&lt;br /&gt;3 rows updated.&lt;br /&gt;&lt;br /&gt;SQL&gt; ROLLBACK;&lt;br /&gt;&lt;br /&gt;Rollback complete.&lt;/pre&gt;&lt;p&gt;Source types assume the privileges of the source type definer or invoker (definer rights and invoker rights). Create a PROCEDURE as USER test_schema:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE OR REPLACE PROCEDURE set_special_day AUTHID DEFINER&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt; SET time_holiday_description = 'Special Day'&lt;br /&gt; WHERE time_id LIKE '____1107%';&lt;br /&gt; COMMIT;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;GRANT EXECUTE ON set_special_day TO test_user;&lt;/pre&gt;&lt;p&gt;Reconnect as USER test_user. When the PROCEDURE is invoked the rights and privileges of the owner are used, not the current user (invoker). A schema owner by default has privileges to all objects created in their schema.&lt;/p&gt;&lt;pre&gt;SQL&gt; conn test_user&lt;br /&gt;Enter password: *******&lt;br /&gt;Connected.&lt;br /&gt;&lt;br /&gt;SQL&gt; EXEC TEST_SCHEMA.set_special_day&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT DISTINCT time_holiday_description FROM TEST_SCHEMA.test_table;&lt;br /&gt;&lt;br /&gt;TIME_HOLIDAY_DES&lt;br /&gt;----------------&lt;br /&gt;Veterans Day&lt;br /&gt;New Years Day&lt;br /&gt;Independance Day&lt;br /&gt;Memorial Day&lt;br /&gt;Presidents Day&lt;br /&gt;Special Day&lt;br /&gt;Labor Day&lt;br /&gt;Thanksgiving&lt;br /&gt;&lt;br /&gt;9 rows selected.&lt;/pre&gt;&lt;p&gt;Replace the PROCEDURE as USER test_schema but with AUTHID CURRENT_USER&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE OR REPLACE PROCEDURE set_special_day AUTHID CURRENT_USER&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt; SET time_holiday_description = 'Special Day 2'&lt;br /&gt; WHERE time_id LIKE '____1107%';&lt;br /&gt; COMMIT;&lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;&lt;p&gt;Reconnect as USER test_user. &lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_user&lt;br /&gt;Enter password: *******&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt; EXEC TEST_SCHEMA.set_special_day&lt;br /&gt;BEGIN TEST_SCHEMA.set_special_day; END;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;ORA-06512: at "TEST_SCHEMA.SET_SPECIAL_DAY", line 4&lt;br /&gt;ORA-06512: at line 1&lt;/pre&gt;&lt;p&gt;There are no privileges granted directly or through default roles to the current USER, test_user. Grant all roles as default to USER test_user using a super-user:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;ALTER USER test_user DEFAULT ROLE ALL;&lt;/pre&gt;&lt;p&gt;Reconnect as USER test_user.&lt;/p&gt;&lt;pre&gt;SQL&gt; conn test_user&lt;br /&gt;Enter password: *******&lt;br /&gt;Connected.&lt;br /&gt;&lt;br /&gt;SQL&gt; EXEC TEST_SCHEMA.set_special_day&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT DISTINCT time_holiday_description FROM TEST_SCHEMA.test_table;&lt;br /&gt;&lt;br /&gt;TIME_HOLIDAY_DES&lt;br /&gt;----------------&lt;br /&gt;Veterans Day&lt;br /&gt;New Years Day&lt;br /&gt;Independance Day&lt;br /&gt;Memorial Day&lt;br /&gt;Presidents Day&lt;br /&gt;Special Day 2&lt;br /&gt;Labor Day&lt;br /&gt;Thanksgiving&lt;br /&gt;&lt;br /&gt;9 rows selected.&lt;/pre&gt;&lt;p&gt;The confusion for me was with AUTHID DEFINER. What if USER test_user were granted temporary privileges to create objects in the test_schema schema?&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;GRANT DBA TO test_user;&lt;/pre&gt;&lt;p&gt;Now create the PROCEDURE as USER test_user using the recently granted built-in DBA ROLE:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;SET ROLE DBA;&lt;br /&gt;CREATE OR REPLACE PROCEDURE TEST_SCHEMA.set_special_day AUTHID DEFINER&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; UPDATE TEST_SCHEMA.test_table&lt;br /&gt; SET time_holiday_description = 'Special Day 3'&lt;br /&gt; WHERE time_id LIKE '____1107%';&lt;br /&gt; COMMIT;&lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;&lt;p&gt;Now have super-user REVOKE all the fun roles from USER test_user:&lt;/p&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;REVOKE dba, test_CRUD FROM test_user;&lt;/pre&gt;&lt;p&gt;Reconnect as USER test_user and try to execute the PROCEDURE:&lt;/p&gt;&lt;pre&gt;SQL&gt; CONN test_user&lt;br /&gt;Enter password: *******&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt; EXEC TEST_SCHEMA.set_special_day&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; SELECT DISTINCT TIME_HOLIDAY_DESCRIPTION FROM TEST_SCHEMA.test_table;&lt;br /&gt;&lt;br /&gt;TIME_HOLIDAY_DES&lt;br /&gt;----------------&lt;br /&gt;Veterans Day&lt;br /&gt;New Years Day&lt;br /&gt;Independance Day&lt;br /&gt;Memorial Day&lt;br /&gt;Special Day 3&lt;br /&gt;Presidents Day&lt;br /&gt;Labor Day&lt;br /&gt;Thanksgiving&lt;br /&gt;&lt;br /&gt;9 rows selected.&lt;/pre&gt;&lt;p&gt;Confused? I was until I looked at the owner of the procedure.&lt;/p&gt;&lt;pre&gt;SQL&gt; SELECT owner, authid FROM dba_procedures WHERE object_name = 'SET_SPECIAL_DAY';&lt;br /&gt;&lt;br /&gt;OWNER                          AUTHID&lt;br /&gt;------------------------------ ------------&lt;br /&gt;TEST_SCHEMA                    DEFINER&lt;/pre&gt;&lt;p&gt;When defining source types &lt;span style="font-weight:bold;"&gt;the DEFINER for AUTHID DEFINER is really the USER that is owner of the schema where the source type was created&lt;/span&gt;; not the USER doing the CREATE. When the test_schema USER created the PROCEDURE it by coincidence was also the owner.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1545412697084204579?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1545412697084204579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1545412697084204579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1545412697084204579'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/08/oracle-10g-database-authentication.html' title='Oracle 10g database authentication'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2592983920865761524</id><published>2009-07-31T18:39:00.003-04:00</published><updated>2009-08-28T15:11:17.405-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Long time, no gripe (cell phones)</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;I meant to post this a little while ago so July would have something in it but I held off. As I age like wine into vinegar I do not feel like ranting as often. There is still the same amount of stupid in the world but if you cannot offer solutions or ideas to help resolve the issues you are ranting about then all of that typing and editing is mere therapy for your mind. It sure is not therapy for my hands; they will hurt more than my mind. However, one thing has repeatedly pissed me off for months now: &lt;strong&gt;cell phones&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First, let me rant about cell phone users that call or text while operating a vehicle. Pass the law now. I find very few reasons to have a conversation longer than 30 seconds while you are on the road. If you are on the phone more than a minute then pull over. This goes out to the:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;dingbat on a cell phone that pulled out of the apartment complex in front of me causing me to throw my brakes and skid, that was one heart attack I did not need that early in the morning&lt;br /&gt;&lt;/li&gt;&lt;li&gt;idiot trying both text and talk while riding cowboy on a bicycle that was on a road with a 50 mph speed limit&lt;br /&gt;&lt;/li&gt;&lt;li&gt;douche bag that tailgated my fiancée for 30 minutes and then when traffic stopped abruptly got angry, pulled alongside her and proceeded to cuss her out while still on the damned cell phone&lt;br /&gt;&lt;/li&gt;&lt;li&gt;granny on I-70 driving 40 mph while on the cell phone as near collisions stacked up behind her&lt;br /&gt;&lt;/li&gt;&lt;li&gt;tool in front of me on the off ramp that was not paying attention when the light turned green forcing me to wait another light; my bladder wants revenge&lt;br /&gt;&lt;/li&gt;&lt;li&gt;dimwit not paying attention to the arrows in the Walmart parking lot that actually yelled at me for going the right direction but getting in her way (while on the cell phone the entire time)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;bonehead at the merge close to where I live that used his yacht-sized vehicle to merge at the last second, without turn signal, less than an inch from clipping me&lt;br /&gt;&lt;/li&gt;&lt;li&gt;dilrods behind me, left of me and in front of me not paying attention, boxing me in, almost causing an accident&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are a few more but that is all I remember.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Second beef: cell phone commercials that portray other cell phone owners as gigantic pussies. Like that guy that goes crying in the rain as if his entire family were just fed to lions on the Serengeti. "He can't twitter, facebook or youtube." Oh, poor baby. My life is just over because I cannot tweet that I am on my phone standing in the rain somewhere because I am too stupid to find shelter. Boo hoo. Forty million children will starve today but I am in total anguish because I cannot get a status update from the teenager I am stalking on Twitter. Boo hoo. Then there is the family of losers complaining about how the other loser family members are using their cell phones to do crap they used to do on a computer at the same level of annoyance. OMG, Dad posts too much on Facebook. You poor suffering child. How awful your life must be. You are using a $100 cell phone inside a screened in California room while millions have lost their jobs and do not know if they will be able to feed their children in the future. Just awful; get that spoiled brat some Flinstones chewable Xanax, encase her in bubble wrap and roll her down a hill.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Last gripe (that I feel like typing about) – Bluetooth headset talkers that get upset because they think you are listening in on their conversation. You dumbass we have no choice but to listen to your conversation as you stand there and emote with your arms as you are talking and laughing and yelling and carrying on. I think the next time I am going to cuddle up in fetal position and just start yelling loudly "la la la la, I cannot hear you, la, la la la, la la la, not listening, la la la, trying to tune your annoying ass out, la la la."&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I could go on but have probably alienated half of my audience and friends by now, although single digits have never bothered me in the past.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Solutions? I despise legislation but banning cell phone usage in vehicles except for emergency usage would be a start. Laws can be revoked or changed when they live out their usefulness. Commercials? Don't buy the product. Bluetooth blabber mouths? Maybe try to kill them with kindness and politeness and if that does not work then kill them with something else?&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2592983920865761524?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2592983920865761524' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2592983920865761524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2592983920865761524'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/08/long-time-no-gripe-cell-phones.html' title='Long time, no gripe (cell phones)'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7433050825576462279</id><published>2009-06-19T16:12:00.002-04:00</published><updated>2009-07-14T13:03:35.375-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Afternoon at the library</title><content type='html'>&lt;P&gt;I really wish I knew how to use the 1.3 mega pixel camera on my netbook. I was at a public library today, killing an hour or two waiting until my sweetheart was off work. You know how libraries are supposed to be quiet places where people can read or study or blog without interruption and annoyance. Two problems with that.&lt;/P&gt;&lt;P&gt;The first is a teenage kid sitting about six feet from the sign clearly stating to refrain from using cellular phones and setting them to silent. He has been on the phone on the same call for fifty minutes while also playing on a Playstation portable. So it's "hmm. Yeah. Mumble mumble. Yeah. Umm. Mumble. The game... Yeah. Um. (voice on phone is louder than him at this point). Yeah. Yeah. Muh. Yeah. Mumble. Mumble. Broken English. Mumble. A'ight. Mumble. Yeah. Yeah. No. No. That wasn't me. Mumble. Mumble. She don't know. Laugh. Mumble. Ah yes. Yeah. No. Mumble. Mumble. Yeah. Uh huh. Nuh-huh. Yeah. Mumble mumble mumble. You get bored. Mumble. I can have that. Blah blah blah. Heh heh heh." over the clackity-clack of whatever he was playing.&lt;/P&gt;&lt;P&gt;Second was the one year old bouncing off everything like a pinball and squealing at the top of his/her lungs. There is no parental guidance to be found. The kid will make a pretty good running back when he or she grows up.&lt;/P&gt;&lt;P&gt;"Mumble. Yeah. A'ight. I just wanna go. Yeah. Yeah. Mumble mumble. Yeah. Umm. Mumble. Yeah. Um. No. Yeah. Yeah. Muh. Yeah. Mumble. Mumble. Broken English. Mumble. A'ight. Mumble. Yeah. Yeah. No. No. That wasn't me. Mumble. Mumble. Whatever she do is okay. Mumble. Yeah."&lt;/P&gt;&lt;P&gt;I am wondering to myself. If I grab the lamp next to me and proceed to bash this individual's skull in would a) the police be called and I hauled off to jail for murder, b) I be loudly applauded until the librarian shushes everyone, or c) I silence the entire building. I can live with the last two. So those odds are 66/33 that I will be in a happier state after clubbing this dude. Tempting.&lt;/P&gt;&lt;P&gt;Finally. After the 64 minute mark the douche bag with the phone hung up and left. The child is getting tired and cranky but quieter if you can believe that.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7433050825576462279?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7433050825576462279' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7433050825576462279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7433050825576462279'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/06/afternoon-at-library.html' title='Afternoon at the library'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2774894851992884709</id><published>2009-06-10T01:23:00.000-04:00</published><updated>2009-06-10T13:08:44.961-04:00</updated><title type='text'>Sleep</title><content type='html'>&lt;P&gt;I have trouble getting to sleep. I have had this problem for years. It was never a problem until my new neighbors moved into the apartment behind mine and then began having sex at all hours of the night and morning. There is nothing worse than awakening from a decent sleep to the sound of a dog whimpering in heat. The situation changed as I began living with someone. She could fall asleep in minutes while it took me sometimes up to an hour. Of course, she snored. It was hard to sleep with an outboard motor next to me so I would simply escape to the relative silence of the couch with the nearby aquariums. I tried numerous things to help me get to sleep faster, here are the results.&lt;/P&gt;&lt;P&gt;Over-the-counter sleep aids do not work very well with me. Most are just a double dose of Benadryl (diphenhydramine). If it did work, great. If it did not or I was awakened during the night I would spend hours in a haze.&lt;/P&gt;&lt;P&gt;I tried herbal supplements like melatonin and Valerian root. Neither supplement helped me get to sleep. The valerian sometimes had the same effect the diphenhydramine would have. I tried Valerian in capsule form and in Sleepy Time Extra tea. I also tried zinc supplements via tablets and also through ZMA. There were no long term effects.&lt;/P&gt;&lt;P&gt;I tried limiting and eliminating caffeine. That would make a short term difference but nothing would happen long term (more than a couple days). Caffeine intake did not affect how long it took to get to sleep. I also tried varying my exercise and as with the caffeine, no long term changes.&lt;/P&gt;&lt;P&gt;I tried turkey, eating a banana, and drinking a protein shake. None of them worked.&lt;/P&gt;&lt;P&gt;I tried reading before bed and that did not work.&lt;/P&gt;&lt;P&gt;I tried different pillows including full sized, wheat husk and memory foam but there was really no change.&lt;/P&gt;&lt;P&gt;I tried laying flat on my back on a hard floor. I tried cooling my wrists under running water.&lt;/P&gt;&lt;P&gt;There was only one thing that seemed to have benefit: background noise. I had a noisy desk fan I would use to provide background noise. My girlfriend at that time hated that fan. There were times where the fan would be louder than normal or would make squeaking noises as it got older. I would have to take it apart and clean in. My current love of my life has a white noise generator that we use on the “night” setting to get a constant sound of crickets in a field or something like that.&lt;/P&gt;&lt;P&gt;My fiancee also has problems getting to sleep. She has taken Ambien (Zolpidem), Lunesta (Eszopiclone) and ?. She had a prescription for the Ambien and samples of the Lunesta and suggested that I try both and see what happens.&lt;/P&gt;&lt;P&gt;Both drugs were very effective. I could get to sleep regardless of noise from snoring or a television. I stayed asleep, and was able to awaken in time for work.&lt;/P&gt;&lt;P&gt;The Ambien was too effective. Apparently I received an alert on my work phone at around three in the morning, got up, acknowledged the message and then went back to sleep. I do not remember that ever taking place. Once on Ambien I could not get off Ambien without having a really bad night or two or five. Since I was borrowing from my fiancee's prescription and not remembering alerts from work I had to take the Ambien off my list.&lt;/P&gt;&lt;P&gt;The Lunesta was not addictive and I was able to leave the drug, have trouble falling asleep as usual, but still get sleep. The Lunesta left an awful taste in my mouth but I prefer sleep over funny tasting water any night. At this time, there is no generic equivalent for Lunesta.&lt;/P&gt;&lt;P&gt;I went to my physician and had him write a prescription for the Lunesta. I have been taking the Lunesta for a week now in half doses (cutting the pill in half). Sleep has been more than adequate so the drug is doing the job I am asking it to do. Eventually, I want to only use the drug from time to time when I need it (usually Sunday nights). Our feline inhabitants have slightly altered sleeping arrangements in the Grouchy household so the couch and spare bedroom are not realistic options. Eventually the spare bedroom will be available but until then I will probably continue taking the Lunesta when I feel I will need to.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2774894851992884709?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2774894851992884709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2774894851992884709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2774894851992884709'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/06/sleep.html' title='Sleep'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4443887078411034035</id><published>2009-06-09T15:00:00.000-04:00</published><updated>2009-06-09T15:21:27.938-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>The Oracle schema owner user</title><content type='html'>&lt;P&gt;Most of this blog post is based upon this &lt;a href="http://oracleandting.blogspot.com/2006/11/creating-schema-owner.html"&gt;late 2006 post by Ponder Stibbons&lt;/a&gt;. I took those ideas and ran with it.&lt;/P&gt;&lt;P&gt;The usual disclaimers apply. I assume you know what a schema is and what a schema owner is. I also assume you know a little bit about Oracle SQL and Database. This post is based release 10g and will be tested on 11g. All SQL in this post can be freely used, modified, claimed as your own, whatever. All SQL here should be used as a guideline and not used verbatim.&lt;/P&gt;&lt;P&gt;The first steps require SYSDBA or adequate rights and create components used for all schema owners including roles, a profile and perhaps a tablespace.&lt;/P&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;/*&lt;br /&gt; * Step 1: create table space in non-ASM server (you have probably already done this)&lt;br /&gt; */&lt;br /&gt;CREATE SMALLFILE TABLESPACE crap_data&lt;br /&gt; LOGGING&lt;br /&gt; DATAFILE&lt;br /&gt;  '/u02/oradata/crapdb/CRAP_DATA1.dbf' SIZE 500M AUTOEXTEND ON NEXT 250M MAXSIZE 5000M&lt;br /&gt; , '/u03/oradata/crapdb/CRAP_DATA2.dbf' SIZE 500M AUTOEXTEND ON NEXT 250M MAXSIZE 5000M&lt;br /&gt; , '/u04/oradata/crapdb/CRAP_DATA3.dbf' SIZE 500M AUTOEXTEND ON NEXT 250M MAXSIZE 5000M&lt;br /&gt; , '/u05/oradata/crapdb/CRAP_DATA4.dbf' SIZE 500M AUTOEXTEND ON NEXT 250M MAXSIZE 5000M&lt;br /&gt; EXTENT MANAGEMENT LOCAL&lt;br /&gt; SEGMENT SPACE MANAGEMENT AUTO;&lt;br /&gt;/*&lt;br /&gt; * Step 2: create a profile&lt;br /&gt; */&lt;br /&gt;CREATE PROFILE schema_owner_profile&lt;br /&gt;  LIMIT CPU_PER_SESSION UNLIMITED&lt;br /&gt;  CPU_PER_CALL UNLIMITED&lt;br /&gt;  CONNECT_TIME UNLIMITED&lt;br /&gt;  IDLE_TIME UNLIMITED&lt;br /&gt;  SESSIONS_PER_USER UNLIMITED&lt;br /&gt;  LOGICAL_READS_PER_SESSION UNLIMITED&lt;br /&gt;  LOGICAL_READS_PER_CALL UNLIMITED&lt;br /&gt;  PRIVATE_SGA UNLIMITED&lt;br /&gt;  COMPOSITE_LIMIT UNLIMITED&lt;br /&gt;  FAILED_LOGIN_ATTEMPTS 3&lt;br /&gt;  PASSWORD_LOCK_TIME UNLIMITED&lt;br /&gt;  PASSWORD_GRACE_TIME UNLIMITED&lt;br /&gt;  PASSWORD_LIFE_TIME UNLIMITED&lt;br /&gt;  PASSWORD_REUSE_MAX UNLIMITED&lt;br /&gt;  PASSWORD_REUSE_TIME UNLIMITED&lt;br /&gt;  PASSWORD_VERIFY_FUNCTION NULL;&lt;br /&gt;/*&lt;br /&gt; * Step 3: create roles&lt;br /&gt; */&lt;br /&gt;CREATE ROLE schema_owner_role NOT IDENTIFIED;&lt;br /&gt;CREATE ROLE schema_admin_role NOT IDENTIFIED;&lt;br /&gt;-- or&lt;br /&gt;CREATE ROLE schema_admin_role IDENTIFIED BY "30charactercomplexpassword";&lt;br /&gt;/*&lt;br /&gt; * Step 4: grant privileges to both roles&lt;br /&gt; */&lt;br /&gt;GRANT CREATE SESSION TO schema_owner_role;&lt;br /&gt;GRANT ALTER SESSION TO schema_owner_role, schema_admin_role;&lt;br /&gt;/*&lt;br /&gt; * The bare minimum for a schema administrator: the ability to create source and&lt;br /&gt; * user types that use the "invoker rights clause"&lt;br /&gt; */&lt;br /&gt;GRANT CREATE PROCEDURE TO schema_admin_role;&lt;br /&gt;GRANT CREATE TYPE TO schema_admin_role;&lt;br /&gt;/*&lt;br /&gt; * Additional privileges&lt;br /&gt; */&lt;br /&gt;--- Scheduler&lt;br /&gt;GRANT CREATE JOB TO schema_owner_role, schema_admin_role;&lt;br /&gt;--- Convenience&lt;br /&gt;GRANT CREATE TABLE TO schema_admin_role;&lt;br /&gt;GRANT CREATE CLUSTER TO schema_admin_role;&lt;br /&gt;GRANT CREATE VIEW TO schema_admin_role;&lt;br /&gt;GRANT CREATE SEQUENCE TO schema_admin_role;&lt;br /&gt;GRANT CREATE TRIGGER TO schema_admin_role;&lt;br /&gt;--- Data warehousing&lt;br /&gt;GRANT CREATE MATERIALIZED VIEW TO schema_admin_role;&lt;br /&gt;GRANT CREATE DIMENSION TO schema_admin_role;&lt;br /&gt;--- Data cartridge&lt;br /&gt;GRANT CREATE OPERATOR TO schema_admin_role;&lt;br /&gt;GRANT CREATE INDEXTYPE TO schema_admin_role;&lt;br /&gt;--- Restrict synonyms to database administrators ?&lt;br /&gt;GRANT CREATE SYNONYM TO schema_admin_role;&lt;/pre&gt;&lt;P&gt;The first step in the block creates a tablespace. It is usually a good idea to give each schema its own tablespace with a similar name but not necessary. The statement will look different if you are using ASM or different mount points (of course). Some articles suggest using the "USERS" tablespace and others suggest using common tablespaces. Use whatever your organization has determined to be best practice.&lt;/P&gt;&lt;P&gt;Step two creates a profile for all schema owner users. Ponder's post recommends not using built-in or Oracle delivered stuff. I agree. If it comes from a vendor, do not use it; copy it and then tailor it to your specific needs.&lt;/P&gt;&lt;P&gt;The third step is to create a role. I chose to create two roles: a default role for all sessions and an administrative role used only for administrative tasks. To do administration on objects in the schema would then require the administrative role to be set before constructive or destructive changes took place. The downside to this approach could prohibit certain GUI tools. The upside is slightly better security and one additional barrier to careless individuals that occasional accidently screw something up repeatedly. The default role is needed to create a session and might also be helpful if you are using the Oracle scheduler and defining jobs that run as the schema owner (more on that later).&lt;/P&gt;&lt;P&gt;The last step (four) is to grant privileges to the two roles. The default role needs to create a session. In my opinion, the roles should be able to alter their sessions (this is a potential risk). The administrative role should have the ability to create procedures and create types. Most source and user types can be defined with an "invoker rights clause" that allows the package to execute using the privileges of the user that defined the source or object or using the privileges of the user executing or using the source or object. If doing security through stored procedures, AUTHID DEFINER is usually used when defined by the schema owner to allow the procedure full DML access to any object in the schema (and then execute privileges are given to user roles). Additional privileges are for convenience and the scheduler so define what you think is needed.&lt;/P&gt;&lt;P&gt;Creating schema owner users is a three step process from this point forward (assuming all use the same tablespace). Create the user, grant the roles, and then set the default role.&lt;/P&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;/*&lt;br /&gt; * Create the user, grant roles, set "owner" role to default&lt;br /&gt; */&lt;br /&gt;CREATE USER crapbase&lt;br /&gt; PROFILE schema_owner_profile&lt;br /&gt; IDENTIFIED BY "30charactercomplexpassword"&lt;br /&gt; DEFAULT TABLESPACE crap_data&lt;br /&gt; QUOTA UNLIMITED ON crap_data&lt;br /&gt; ACCOUNT LOCK;&lt;br /&gt;GRANT schema_owner_role TO crapbase;&lt;br /&gt;GRANT schema_admin_role TO crapbase;&lt;br /&gt;ALTER USER crapbase DEFAULT ROLE schema_owner_role;&lt;br /&gt;/*&lt;br /&gt; * Create roles the application might use to access data in the schema&lt;br /&gt; */&lt;br /&gt;CREATE ROLE crapbase_read_role NOT IDENTIFIED;&lt;br /&gt;CREATE ROLE crapbase_full_role IDENTIFIED BY "30charactercomplexpassword";&lt;/pre&gt;&lt;P&gt;The first step is to create the user. Use the profile created previously. Set the default tablespace and give unlimited quota on that tablespace else the schema owner will not be able to define objects that require persistence like tables. Most documents recommend leaving the account locked and then unlocking it when maintenance is to be performed.&lt;/P&gt;&lt;P&gt;The second step is to grant the two roles to the new user.&lt;/P&gt;&lt;P&gt;The last step is to alter the user so the administrative role is not a default role and must be set to obtain those privileges.&lt;/P&gt;&lt;P&gt;One optional step would be to create roles used for read only and full access to objects in the new schema. Individual users would be granted these roles as default or not as default and then the application would set the role(s). Instead of read and full, there could be a more elaborate role structure based upon your organizational requirements.&lt;/P&gt;&lt;h4&gt;Oracle Scheduler&lt;/h4&gt;&lt;P&gt;A schema can have jobs defined to it in addition to tables, views and procedures. Jobs can be created by the schema owner or by a user with CREATE ANY JOB privileges. Jobs created by the schema owner user or by other users in the schema are owned by the schema owner user. Jobs execute with the privileges of that user. The schema user account can be locked and jobs will continue to execute. In one of our environments, the default role has the CREATE JOB privilege so a job can create another job based upon data in other tables.&lt;/P&gt;&lt;h4&gt;Security&lt;/h4&gt;&lt;P&gt;The schema owner user should have a strong password that is changed regularly and should be locked unless needed to define a source or object type with AUTHID DEFINER invoker rights. If someone gets in as schema owner they have full control over all data in that schema. Strict roles should be used to limit access to schema data. Users with administrative roles should be used to create tables, indexes, etc. within the schema.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4443887078411034035?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4443887078411034035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4443887078411034035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4443887078411034035'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/06/oracle-schema-owner-user.html' title='The Oracle schema owner user'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7166555531798426934</id><published>2009-06-05T06:39:00.003-04:00</published><updated>2009-06-09T21:25:48.808-04:00</updated><title type='text'>Grouchy gripe day today</title><content type='html'>&lt;P&gt;I have a couple things I would like to get off my chest this morning.&lt;/P&gt;&lt;P&gt;One. I cannot stand the pseudo techno-intellectuals that make statements based on superior hardware and then assume everything applies downward. Windows 7 runs great on my Intel Core i7 Extreme Edition with 12 GB of DDR3 1866 memory and two Western Digital Raptors in a RAID 0 configuration. No ****? Startup time is fantastic. Well, it should be. You have hardware that God has to wait in line for and everything runs smooth and performance is fantastic. Just because your newest version of Windows or Linux runs incredibly fast on your mega box it does not mean it will perform just as well on a more standard machine given a one or two year upgrade time frame.&lt;/P&gt;&lt;P&gt;Two, I cannot stand web sites that cram every unnecessary Web 2.0 component on their home pages. What works well on your developer workstation with its Core 2 Quad Extreme with 16GB of memory might not work as well on my AMD 754 socket processor and 1 GB of memory or my netbook with its hamster sized screen, Atom processor and 2GB of memory. I just drug my parents kicking and screaming out of the Windows 98 world where processors were named by number and their megahertz clock speed into the land of Windows XP and processors named after sissy, woodland creatures. They do not give a rat's ass if your tag cloud rotates or if that multi-gigabyte, centralized news / ad / feature thing in the middle of your page looks good. They would be more interested in a dancing baby or Jesus.&lt;/P&gt;&lt;P&gt;Sorry. Today I offer zero solutions, only gripes.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7166555531798426934?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7166555531798426934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7166555531798426934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7166555531798426934'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/06/grouchy-grip-day-today.html' title='Grouchy gripe day today'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2406224968441459201</id><published>2009-05-27T21:02:00.007-04:00</published><updated>2009-05-29T15:18:22.557-04:00</updated><title type='text'>Building a time dimension with SQL</title><content type='html'>&lt;P&gt;The time dimension can be found in the majority of star-schema based data warehouses. There are literally dozens of ways to generate the values in the table at the lowest level of the dimension.&lt;/P&gt;&lt;P&gt;The easiest way is to simply plug the contents of the table into a spreadsheet and then import the spreadsheet into a table. Seriously... Why write all the complicated code when you can manually put it all in, show it to users, let them bitch about it, make changes, fix their frak-ups, and then cram the data into a table. The table is not built on an hourly/daily/monthly basis like other dimensions. However, if you wish to use SQL (Oracle) then maybe I can help.&lt;/P&gt;&lt;P&gt;If at any point during this conversation you the reader notice room for improvement, please comment.&lt;/P&gt;&lt;P&gt;The Table&lt;/P&gt;&lt;P&gt;My personal preferences for time dimensions:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;define columns only for the basic values and values that are too expensive to calculate within a view, do not define columns that can be easily calculated with date math or TO_CHAR functions within a view&lt;/LI&gt;&lt;LI&gt;do not bother with partitioning or logging&lt;/LI&gt;&lt;LI&gt;use table compression&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Most time dimensions I see include columns for day of month, end of week, day in year, etc. My reasoning behind storing only the base values and complex values and then doing columns like day in year in a view is two-fold. First is I/O reduction. I would rather do the blocked read of two or three blocks and some CPU rather than do five to ten blocked reads. Second is flexibility. If someone is crawling up your ass for another group of columns so their horribly inefficient DSS actually looks feasible the nerd simply adds the column to the view.  Regardless of what you store in it, the time dimension is small compared to other dimensions and the fact table so why bother with partitioning overhead. The table can be recreated so use NOLOGGING. Compression will reduce the size by about thirty percent leading to fewer I/O requests at the expense of CPU. I always want CPUs working.&lt;/P&gt;&lt;P&gt;Creating Values&lt;/P&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;MERGE /*+ parallel(time_dimension,4) append */&lt;br /&gt;INTO time_dimension m&lt;br /&gt;USING (  -- Step 7: use the record set as part of the merge&lt;br /&gt;  WITH period_sf AS ( --- Step 1 - factored subquery for the various periods from operational databases&lt;br /&gt;   SELECT&lt;br /&gt;    'Craptastic' AS period_id&lt;br /&gt;   ,  TRUNC(SYSDATE,'YEAR') AS period_beg_date&lt;br /&gt;   ,  TRUNC(ADD_MONTHS(SYSDATE,12),'YEAR')-1 AS period_end_date&lt;br /&gt;   FROM dual&lt;br /&gt;   WHERE 1 = 1&lt;br /&gt;  )&lt;br /&gt;  , distinct_years_sf AS ( --- Step 2: factored subquery for all distinct years&lt;br /&gt;    SELECT DISTINCT TRUNC(period_beg_date,'YEAR') AS year_beg_date&lt;br /&gt;    FROM period_sf&lt;br /&gt;    UNION&lt;br /&gt;    SELECT DISTINCT TRUNC(period_end_date,'YEAR') AS year_beg_date&lt;br /&gt;    FROM period_sf&lt;br /&gt;  )&lt;br /&gt;  SELECT  -- Step 6: select base values for the date, values that will enter the time dimension&lt;br /&gt;    TO_CHAR((v1.year_beg_date + v2.day_num),'YYYYMMDD')||'.01'  AS time_id&lt;br /&gt;  , v1.year_beg_date + v2.day_num  AS time_date&lt;br /&gt;  , v3.period_id  AS time_period_id&lt;br /&gt;  , v3.period_beg_date  AS time_period_beg_date&lt;br /&gt;  , v3.period_end_date  AS time_period_end_date&lt;br /&gt;  , v1.year_beg_date + v2.day_num - v3.period_beg_date + 1  AS time_period_day&lt;br /&gt;  , CASE (v1.year_beg_date + v2.day_num)&lt;br /&gt;      WHEN v1.year_beg_date THEN 'New Years Day'&lt;br /&gt;      WHEN v1.year_presidents_date THEN 'Presidents Day'&lt;br /&gt;      WHEN v1.year_easter_date THEN 'Easter'&lt;br /&gt;      WHEN v1.year_memorial_date THEN 'Memorial Day'&lt;br /&gt;      WHEN v1.year_independance_date THEN 'Independance Day'&lt;br /&gt;      WHEN v1.year_labor_date THEN 'Labor Day'&lt;br /&gt;      WHEN v1.year_veterans_date THEN 'Veterans Day'&lt;br /&gt;      WHEN v1.year_thanksgiving_date THEN 'Thanksgiving'&lt;br /&gt;      WHEN v1.year_christmas_date THEN 'Christmas'&lt;br /&gt;      ELSE NULL&lt;br /&gt;    END AS time_holiday_text&lt;br /&gt;  FROM ( --- Step 4: generate values for each &lt;br /&gt;    SELECT&lt;br /&gt;      year_id&lt;br /&gt;    , year_beg_date&lt;br /&gt;    , year_end_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1885 AND 1970 THEN year_beg_date + 52&lt;br /&gt;        WHEN year_id BETWEEN 1971 AND 9999 THEN NEXT_DAY(year_beg_date + 30,'MON') + 14&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_presidents_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1900 AND 2199 THEN NEXT_DAY(year_end_date - 244 + easter_value + (CASE WHEN easter_value &lt; 5 THEN 17 ELSE -12 END),'SAT') - 34 + (CASE year_id WHEN 2079 THEN 7 ELSE 0 END)&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_easter_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1882 AND 1970 THEN year_end_date - 215&lt;br /&gt;        WHEN year_id BETWEEN 1971 AND 9999 THEN NEXT_DAY(year_end_date - 214,'MON') - 7&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_memorial_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1882 AND 9999 THEN year_end_date - 180&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_independance_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1894 AND 9999 THEN NEXT_DAY(year_end_date - 122,'MON')&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_labor_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1954 AND 1970 THEN year_end_date - 50&lt;br /&gt;        WHEN year_id BETWEEN 1971 AND 1977 THEN NEXT_DAY(year_end_date - 92,'MON') + 21&lt;br /&gt;        WHEN year_id BETWEEN 1978 AND 9999 THEN year_end_date - 50&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_veterans_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1863 AND 1938 THEN NEXT_DAY(year_end_date - 31,'THU') - 7&lt;br /&gt;        WHEN year_id = 1939 THEN NEXT_DAY(year_end_date - 61,'THU') + 21&lt;br /&gt;        WHEN year_id = 1940 THEN NEXT_DAY(year_end_date - 61,'THU') + 14&lt;br /&gt;        WHEN year_id BETWEEN 1941 AND 9999 THEN NEXT_DAY(year_end_date - 61,'THU') + 21&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_thanksgiving_date&lt;br /&gt;    , CASE&lt;br /&gt;        WHEN year_id BETWEEN 1870 AND 9999 THEN year_end_date - 6&lt;br /&gt;        ELSE NULL&lt;br /&gt;      END AS year_christmas_date&lt;br /&gt;    FROM ( --- Step 3: calculate a few values for the years in the second step&lt;br /&gt;      SELECT&lt;br /&gt;        EXTRACT(YEAR FROM year_beg_date) AS year_id&lt;br /&gt;      , year_beg_date&lt;br /&gt;      , ADD_MONTHS(year_beg_date,12) - 1 AS year_end_date&lt;br /&gt;      , TRUNC(MOD(EXTRACT(YEAR FROM year_beg_date) / 38 * 1440,60) / 2) AS easter_value&lt;br /&gt;      FROM distinct_years_sf&lt;br /&gt;    )&lt;br /&gt;  ) v1&lt;br /&gt;  JOIN ( --- Step 5: generate numbers 0 through 366 and join to the years&lt;br /&gt;    SELECT (LEVEL - 1) AS day_num FROM DUAL CONNECT BY ROWNUM BETWEEN 1 and 367&lt;br /&gt;  ) v2 ON v2.day_num BETWEEN 0 AND (v1.year_end_date - v1.year_beg_date)&lt;br /&gt;  LEFT JOIN period_sf v3 ON (v1.year_beg_date + v2.day_num) BETWEEN period_beg_date AND period_end_date&lt;br /&gt;  ORDER BY time_id&lt;br /&gt;) u&lt;br /&gt;ON (m.time_id = u.time_id)  --- Step 8: update or insert (i.e. MERGE)&lt;br /&gt;WHEN MATCHED THEN UPDATE&lt;br /&gt;  SET&lt;br /&gt;    m.time_date            = u.time_date&lt;br /&gt;  , m.time_period_id       = u.time_period_id&lt;br /&gt;  , m.time_period_beg_date = u.time_period_beg_date&lt;br /&gt;  , m.time_period_end_date = u.time_period_end_date&lt;br /&gt;  , m.time_period_day      = u.time_period_day&lt;br /&gt;  , m.time_holiday_text    = u.time_holiday_text&lt;br /&gt;WHEN NOT MATCHED THEN INSERT&lt;br /&gt;  VALUES&lt;br /&gt;  ( u.time_id&lt;br /&gt;  , u.time_date&lt;br /&gt;  , u.time_period_id      &lt;br /&gt;  , u.time_period_beg_date&lt;br /&gt;  , u.time_period_end_date&lt;br /&gt;  , u.time_period_day     &lt;br /&gt;  , u.time_holiday_text&lt;br /&gt;  )&lt;/pre&gt;&lt;P&gt;Most time dimensions will have primary units within periods or intervals of time. Sales might have sales periods. Colleges might have semesters. Television might have quarters and sweeps weeks within them. The source for these periods could be one or more tables in an OLTP database or ODS or perhaps already in the data warehouse if using a star-snowflake hybrid schema. Each source should be a factored sub-query containing the period primary key and the dates the period starts and ends. Oracle will create a temporary table for each sub-query. For this example, I chose one period based upon the current year (table dual is available on every Oracle database).&lt;/P&gt;&lt;P&gt;The second step is to generate a record set from all period sub-queries with distinct years (the first date of each year). The sub-query is also factored because it could be used more than once to generate record sets based on individual years.&lt;/P&gt;&lt;P&gt;The next few steps create data specific for each year in the above sub-query. I do this to avoid doing repetitive calculations for all 365 or so days in each year (do you really want the server calculating when Easter occurs for each day or just do it once for each year; yeah I thought so).&lt;/P&gt;&lt;P&gt;Next, each year is joined to a day number, 0 through the end of the year.&lt;/P&gt;&lt;P&gt;Each factored period sub-query that will have values in the time dimension is then LEFT JOINed to the years plus days result set. The left join is required because there might not be overlaps in the various periods. For example: a set of sales periods existed before, during, and then after a corporate acquisition.&lt;/P&gt;&lt;P&gt;The columns from the result set are fed into the USING part of the MERGE statement. The results are either inserted into or used to update the time dimension. The /*+ APPEND */ hint is used to trigger a direct-path insert for table compression and the /*+ PARALLEL */ hint is optional but could speed up the process depending upon your server.&lt;/P&gt;&lt;P&gt;The above example is very, very simplistic. There is an entire data warehousing language and concepts documentation library that I have yet to digest. I am also certain there are better ways of doing the same thing I have done in the SQL above. I could have also used PL/SQL and loop constructs to build the dimension table. To be honest, there are more important things in life.&lt;/P&gt;&lt;P&gt;Feel free to comment on my SQL brain fart. Suggest improvements. Steal the code and call it your own, basking in the glory.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2406224968441459201?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2406224968441459201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2406224968441459201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2406224968441459201'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/05/building-time-dimension-with-sql.html' title='Building a time dimension with SQL'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2540434627600766969</id><published>2009-04-22T08:23:00.003-04:00</published><updated>2009-05-27T14:06:05.360-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crap'/><title type='text'>Yahoo messenger connection refused</title><content type='html'>It seems like there are other folks that have noticed connections to Yahoo Messenger are getting a "connection refused" error. I get errors in the morning all the time. Using advice from &lt;a href="http://www.trap17.com/index.php/Pidgin-Yahoo_t65654.html"&gt;this page&lt;/a&gt;, I tried hard coding an IP address in place of the scs.msg.yahoo.com and it connected first time. This is not a long term solution by any means. The post also suggested doing an ipconfig /flushdns from a Windows command prompt. But as with other errors I am simply spreading the word.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2540434627600766969?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2540434627600766969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2540434627600766969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2540434627600766969'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/04/yahoo-messenger-connection-refused.html' title='Yahoo messenger connection refused'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3234427451985127223</id><published>2009-04-21T22:44:00.001-04:00</published><updated>2009-05-27T14:06:24.960-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hockey'/><title type='text'>Jackets... Playoffs...</title><content type='html'>To quote myself from Bigsoccer:&lt;/p&gt;&lt;p&gt;&lt;i&gt;After that first period and those two strange goals it is clear this just is not meant to be...&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;I don't even hear Bill Murray from Caddyshack saying "Cinderella story. Outta nowhere. It looks like a mirac... It's in the goal! It's in the goal! It's in the goal!"&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;All I have in my head now is that "Bag of Weed" song from Family Guy this Sunday.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;The very first playoff game in Nationwide Arena history was over in one minute. With enough electricity in the building to power the cities of Columbus and Detroit what was the worst thing that could happen? A Detroit goal about one minute into the game? How about another Detroit goal at the end of the first period? I am certain the City of Columbus street cleaners are probably happy. The vacuum created by all the air being let out of the arena was probably powerful enough to suck the dirt and trash off streets in a four block radius around Nationwide.&lt;/p&gt;&lt;p&gt;The lowest point of the evening had to be the attempted retaliation for the brutal hit by Stuart on R.J. Umberger. Commodore flops into the Detroit bench after trying to make a hit then proceeds to push a Redwing over and watch Cleary (a Redwing) handling the puck behind the goal. The Jacket player guarding the net leaves to play the puck and Cleary leaving Zetterberg wide open for the third goal as Rick Nash and Mike Commodore literally stand there and watch mere feet away from play. It would have been a sin if there was no retaliation for knocking R.J. into a game five (which is looking like it will never be played) but what the players on the ice did was even worse. They looked like staggered drunks trying to retaliate and let one more goal in while doing so.&lt;/p&gt;&lt;p&gt;Game four better feature one or more of the following:&lt;ul&gt;&lt;li&gt;a hard, legal hit that leaves a first or second line player on the Detroit side flat on the ice (extra points for the leg twitch)&lt;/li&gt;&lt;li&gt;a goal by Rick Nash, heck I would settle for a crushing blow by Nash on someone at this point&lt;/li&gt;&lt;li&gt;a good, legal check on a Redwing by at least six of the following players: Russell, Peca, Huselius, Chimera, Williams, Modin, Vermette, Nash, Voracek&lt;/li&gt;&lt;/ul&gt;The team needs to exceed the physicality shown toward it, not match it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3234427451985127223?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3234427451985127223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3234427451985127223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3234427451985127223'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/04/jackets-playoffs_21.html' title='Jackets... Playoffs...'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2471446417542566187</id><published>2009-04-06T16:15:00.001-04:00</published><updated>2009-05-27T14:06:53.653-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Spinning wheels</title><content type='html'>Have you ever had one of those days where you are doomed to spinning your wheels working on a problem?&lt;/p&gt;&lt;p&gt;I have been working on improving one of our database triggers to do a single MERGE statement instead of opening two cursors, doing an insert and then doing an update of the same record. I kept getting a PL/SQL: ORA-00969: missing ON keyword compilation error. Can I not LEFT JOIN something to DUAL? Can I not use a :new.column variable within a function in that MERGE? I tried the usual reworking of the statement a half dozen times.&lt;/p&gt;&lt;p&gt;I tried a Google search.&lt;/p&gt;&lt;p&gt;Most arguments argued that it was just one record and to keep things simple and just do the update (or insert) and then handle the error to perform the other DML event. Yeah, it is only one record and the extra statement parse overhead is negligible in the grand scheme of things. Then again, I am an old mainframe system geek that remembers every little bit counts when dealing with high volume processing. Back in those days shortening an eye-catch in working storage by a couple bytes could end up saving 4K in a C.I.C.S. page. Do that for a couple dozen programs and you might end up increasing response time because of fewer space compressions. I see that methodology in practice; making things easy for the application developer at the expense of performance. It is a fight that is being lost to the get it done quickly, take credit, and make yourself and your resume look good crowd.&lt;/p&gt;&lt;p&gt;Then again, I could have used a code generator or some drag and drop development environment and it might have saved me a couple of hours of work by adding the required parenthesis around the condition on the ON clause before the merge update and merge insert clauses. I could have saved a couple hours of my valuable time. It is all about finding a good balance between doing what is best for performance and sustainability of hardware versus making our lives easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2471446417542566187?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2471446417542566187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2471446417542566187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2471446417542566187'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/04/spinning-wheels.html' title='Spinning wheels'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7938296672110516961</id><published>2009-04-02T12:22:00.001-04:00</published><updated>2009-05-27T14:08:22.463-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hockey'/><title type='text'>Jackets? Playoffs?</title><content type='html'>The past two times I happened to be wearing my Columbus Blue Jackets shirt when going out to eat for lunch I have been asked if they are going to make the playoffs. They are definitely not in yet but are in fairly good shape. So I sat down during lunch to figure things out.&lt;/p&gt;&lt;p&gt;First, the win against Nashville was huge.&lt;/p&gt;&lt;p&gt;There are 5 games and 10 points left in the season. To be completely safe from the Anaheim Ducks and Nashville Predators the teams 7 of the remaining 10 points. At 6 points we would probably be edged by the Ducks because they (would) have more wins. To be completely safe from the St Louis Blues sitting at 9th, the team needs 6 of the 10 points. Columbus could probably do it with 5 points but would have to win more games because a tie in games won would give the edge to the Blue who have a better head to head record against Columbus. To be safe from the Wild and Oilers the teams needs 4 of the 10 points, but could do it with 3 points. This assumes these five teams win all of their remaining 5 games and get the full 10 points.&lt;/p&gt;&lt;p&gt;Here are our remaining games:&lt;ul&gt;&lt;li&gt;Apr 4 at Predators; loss&lt;/li&gt;&lt;li&gt;Apr 5 vs Blackhawks; win&lt;/li&gt;&lt;li&gt;Apr 8 at Blackhawks; loss&lt;/li&gt;&lt;li&gt;Apr 10 at Blues; loss&lt;/li&gt;&lt;li&gt;Apr 11 vs Wild; win&lt;/li&gt;&lt;/ul&gt;I think we will manage 4 points in the next 5 games. Sneaking out with a point in an overtime loss in any of the 3 away games would be great. The Blues have games against the ailing Coyotes, Stars and Avalanche and their last home game of the season against Columbus. They won't get points in Detroit unless the Wings have a brain fart like the last time Columbus visited. So 8 points to the Blues. The Predators will likely get 4 points at home and at least 1 in their 3 away games; so let's say 5 points. The Ducks have 2 games against the conference leading San Jose Sharks but I think they will get 1 point from the home/home melee. They will probably get 2 points against the Coyotes and Stars giving them 5 points.&lt;/p&gt;&lt;p&gt;So:&lt;ul&gt;&lt;li&gt;6th Jackets 88 + 4 = 92&lt;/li&gt;&lt;li&gt;7th Ducks 84 + 5 = 89&lt;/li&gt;&lt;li&gt;8th Predators 84 + 5 = 89&lt;/li&gt;&lt;li&gt;9th Blues 83 + 8 = 91&lt;/li&gt;&lt;/ul&gt;or&lt;ul&gt;&lt;li&gt;6th Jackets 92 points&lt;/li&gt;&lt;li&gt;7th Blues 91 points&lt;/li&gt;&lt;li&gt;8th Ducks 89 points&lt;/li&gt;&lt;li&gt;9th Predators 89 points, miss playoffs&lt;/li&gt;&lt;/ul&gt;We aren't in yet but I think the team will make the playoffs for the first time in franchise history.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7938296672110516961?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7938296672110516961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7938296672110516961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7938296672110516961'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/04/jackets-playoffs.html' title='Jackets? Playoffs?'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3366891097239913842</id><published>2009-03-31T15:18:00.003-04:00</published><updated>2009-05-27T14:07:25.325-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>ORA-01839 using an INTERVAL</title><content type='html'>One of our application developers had a program that was been active and usually working for years but for some reason does not work issuing a cursor not open error every once in a while. It has been a source of anger for a while because the application will magically start working a day later without any changes to the application or host system. The source of the problem: an error occurred at cursor open due to date arithmetic using an INTERVAL and that error was not handled.&lt;br /&gt;&lt;br /&gt;Shame on someone for not handling the error.&lt;br /&gt;&lt;br /&gt;Regarding the INTERVAL logic, if you add or subtract a month interval from a date that results in the day being outside the number of days in the month (going from March with 31 to April with 30 for example) the statement will throw an error.&lt;br /&gt;&lt;br /&gt;The developer is better off using the Oracle function ADD_MONTHS which does not throw an error. If the application needs a value of the first of the month if 31 days then the application should probably be subtracting days instead of months. If the warranty expires in 90 days then add 90 days. If the warranty expires in three months then unless there is some complex logic in the contract it should end on June 30 and not July 1 (just assuming).&lt;pre&gt;SELECT SYSDATE FROM DUAL;&lt;br /&gt;SYSDATE&lt;br /&gt;---------&lt;br /&gt;31-MAR-09&lt;br /&gt;&lt;br /&gt;SELECT SYSDATE - INTERVAL '2' MONTH FROM DUAL;&lt;br /&gt;SYSDATE-I&lt;br /&gt;---------&lt;br /&gt;31-JAN-09&lt;br /&gt;&lt;br /&gt;SELECT SYSDATE - INTERVAL '4' MONTH FROM DUAL;&lt;br /&gt;ORA-01839: date not valid for month specified&lt;br /&gt;&lt;br /&gt;SELECT ADD_MONTHS(SYSDATE,-4) FROM DUAL;&lt;br /&gt;ADD_MONTH&lt;br /&gt;---------&lt;br /&gt;30-NOV-08&lt;/pre&gt;&lt;a href="http://oracle-wtf.blogspot.com/2006/02/stop-press-oracle-granted-license-to.html"&gt;The INTERVAL logic has been discussed elsewhere&lt;/a&gt; including a comment from Tom Kyte about the pure ANSI implementation. I document it here to spread the word and hopefully keep others from banging their heads into a frothy pulp over silly crap like this. Standards; gotta love them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3366891097239913842?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3366891097239913842' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3366891097239913842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3366891097239913842'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/03/ora-01839-using-interval.html' title='ORA-01839 using an INTERVAL'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7001482243468861224</id><published>2009-03-30T06:16:00.001-04:00</published><updated>2009-05-27T14:07:43.326-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Recession garden</title><content type='html'>I do not remember which station I heard this on but their news teaser mentioned something about what to do for your "recession garden".&lt;/p&gt;&lt;p&gt;A what?&lt;/p&gt;&lt;p&gt;So because the United States is in a recession I am supposed to grow my own food in my own personal recession garden?&lt;/p&gt;&lt;p&gt;A what?&lt;/p&gt;&lt;p&gt;Do these people know how hard it is to maintain a garden large enough to supplement the store bought food supply a family requires to survive? Do they know how expensive it is? Hmm, I just lost my job and I am tapping my cash reserves to stay inside my house and keep my family fed. Wait, I got it. I will make a recession garden.&lt;/p&gt;&lt;p&gt;First I have no problem whatsoever with home gardens. If you truly want fresh tomatoes and other vegetables right out of the ground or off the vine you really cannot beat a home garden. Well that is not true. There are plenty of local farmers with farm markets where all sorts of freshness are available. I would rather help keep them in business because they serve a greater need.&lt;/p&gt;&lt;p&gt;Second, do these people live in Ohio? Residential soil is better suited for making pottery than growing things. You will likely need to borrow or rent a machine to grind up and process the soil and more than likely you will need to purchase a decent amount of top soil to grow stuff in.&lt;/p&gt;&lt;p&gt;Lastly, seed and chemicals for growth and parasite control are not free. Sanitization will also be required. Are there stray cats in the neighborhood? If so, you just built them another litter box so be prepared for that.&lt;/p&gt;&lt;p&gt;What is next? Recession Chia herb gardens? Recession barn so we can raise our own meat?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7001482243468861224?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7001482243468861224' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7001482243468861224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7001482243468861224'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/03/recession-garden.html' title='Recession garden'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4969933524400332257</id><published>2009-02-25T16:00:00.004-05:00</published><updated>2009-05-27T14:08:34.621-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>ORA-01578 and related heart attacks</title><content type='html'>Holy ****! We get this heart attack inducing error message in our production system:&lt;pre&gt;ORA-01578: ORACLE data block corrupted (file # 4, block # 1510490)&lt;br /&gt;ORA-01110: data file 4: '/u16/app/oracle/oradata/database/main_effin.dbf&lt;br /&gt;ORA-26040: Data block was loaded using the NOLOGGING option&lt;/pre&gt;Within seconds we are hitting Metalink and Google and Oracle forums and Burleson Consulting's sites and opening up service requests. It's not looking good. We call friends. "I've never seen that one before!" F***! We're so f*****. We consider running dbv. We consider preparing for a full restore. We data pump the table into a file on a different file system. We drop the table. We recreate the table. S**!, error when trying to create the table from the import. Drop the table again. Import the table. Both of us have to pee so bad we could extinguish an active volcano.&lt;/p&gt;&lt;p&gt;The Oracle finally calls back.&lt;/p&gt;&lt;p&gt;No problem. We see this a number of times each month.&lt;/p&gt;&lt;p&gt;Here's the deal.&lt;/p&gt;&lt;p&gt;The table and index are set to full redo logging but the CLOB in that table is not. A couple months ago we had to do a full restore of our production database. This part gets confusing because it's being related second hand but the block got marked as LOGGING because of the restore even though the LOB options are set to not generate full REDO logging. When someone tried to update that table Oracle as a safety measure marked the block as read only until measures were taken to check it. The "corruption" in this case wasn't corruption as in your data is fooggegated and there is some crap lost somewhere. The best thing to do is data pump export, drop, data pump import (what we were trying to do while freaking out before calm, cool, collected Mr. Oracle called). He also explained that generating REDO for LOBs is painfully expensive so there is a case for NOT generating REDO for them if the data are insignificant and/or can be recreated.&lt;/p&gt;&lt;p&gt;So here I am, bladder emptied. It felt so good it feels like I'm still taking that leak. My heart rate has returned to close to normal.&lt;/p&gt;&lt;p&gt;I really need to win the lottery...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4969933524400332257?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4969933524400332257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4969933524400332257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4969933524400332257'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/02/ora-01578-and-related-heart-attacks.html' title='ORA-01578 and related heart attacks'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5438918656403873215</id><published>2009-01-12T13:23:00.001-05:00</published><updated>2009-05-27T14:08:52.833-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Project: Oracle 11g on Linux</title><content type='html'>I recently found some inner motivation to go back an restart some personal computing projects at home. Maybe it was the time off from work today or I was tired of looking at high powered machines collecting cat litter dust. I'll keep this main post then add comments as I go. When I get something worth consolidating I'll repost&lt;/p&gt;&lt;h4&gt;The Project&lt;/h4&gt;&lt;p&gt;Install 64 bit Oracle 11g database on Linux. Get working two working installations: one with and then one without &lt;a href="http://www.oracle.com/technology/products/database/asm/index.html"&gt;Automatic Storage Management (ASM)&lt;/a&gt;. Learn ASM and &lt;a href="http://www.oracle.com/technology/deploy/availability/htdocs/rman_overview.htm"&gt;Recovery Manager (RMAN)&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;The Hardware and Software&lt;/h4&gt;&lt;p&gt;The project machine:&lt;ul&gt;&lt;li&gt;AMD 64 X2 3800+ CPU&lt;/li&gt;&lt;li&gt;4 x 1 GB DDR2 RAM (4 GB total)&lt;/li&gt;&lt;li&gt;4 x Seagate ST380013AS 80GB SATA150 drives&lt;/li&gt;&lt;li&gt;a Seagate ST3400633A 400GB ATA drive in an external USB enclosure.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;I chose &lt;a href="http://en.opensuse.org/"&gt;openSUSE 11.1 64bit&lt;/a&gt; as the operating system because SUSE Linux is one of the distributions supported by Oracle and their &lt;a href="http://en.opensuse.org/Oracle_on_openSUSE"&gt;Oracle on openSUSE&lt;/a&gt; document and accompanying PDF files seemed the most solid place to start.&lt;/p&gt;&lt;h4&gt;Configuration&lt;/h4&gt;&lt;p&gt;Oracle requires and/or recommends swap space equal to physical memory for installations with 2GB to 8GB of memory. I figured 4 SATA disks with 1GB swap files would be good. I did some research and there are too many arguments for and against multiple small versus one large swap file; so I took the most painful route of four times the work. The rest of disk one is root which will contain /opt and /u01 for software and initial databases. For the first round I used the rest of the disk space for /u02, /u03 and /u04.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5438918656403873215?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5438918656403873215' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5438918656403873215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5438918656403873215'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/01/project-oracle-11g-on-linux.html' title='Project: Oracle 11g on Linux'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5832383786762351930</id><published>2009-01-07T20:15:00.001-05:00</published><updated>2009-05-27T14:09:08.302-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>The Chinese buffet</title><content type='html'>The girlfriend and I have made a few trips to a Chinese buffet recently. Those eateries are a wonderful example of what is wrong with people and why both of us stay hidden from society as a whole.&lt;/p&gt;&lt;p&gt;One of the easiest groups of people to get upset at are the wasteful slobs that pile a plate full of food, eat maybe half of it, then go back for another overflowing plate of mostly the same stuff still on the original plate. If the goal is to sample everything then take reasonable portions of stuff you are not sure if you will like, more of stuff you do like. The same ideals apply to those who want to feed until gorged and no longer mobile under their own locomotion. Americans waste an ungodly amount of food every year; enough to make world hunger probably go away or diminish to the level of "now what were you complaining about again?"&lt;/p&gt;&lt;p&gt;Then there are the food thieves. They are the ones that will secretly package and hide food in their garb or handbags during the consumption process. One for my gut, one for my purse. Two for my gut, one for my handbag. I understand it is about getting your money's worth but walking into a buffet with a Gucci wallet  then walking out looking like you were about to go camping or were just enlisted into the military is another story.&lt;/p&gt;&lt;p&gt;For some strange reason a growing number of groups of people believe the buffet gives them a pass to exclude all manners and parenting from their public pie-hole stuffing. The other night there were two youths texting over their cell phones; so the missus and I had to endure twenty minutes of phone sound effects at the highest volume. Why? A group of loud, obnoxious cretins have waddled forth from their front porch couches to continue their "oh so important" 24 hour cell phone conversations. Yet if I were to go over, politely ask them to shut their noise holes and turn their ringer volumes down from a level that can be heard from space, I'd probably be shot. If I were to make Swiss cheese of their skulls, I'd go to jail after a thunderous round of applause. Also included in that group are the parents that just let their kids run feral like they were at a McDonalds. It's not a McDonalds. I understand the lack of oxygen due to not taking adequate breaths during your face stuffing might be part of the problem but when the floor looks like the badlands of a World War 1 trench war then you should be in jail and your kids should be in a compound somewhere.&lt;/p&gt;&lt;p&gt;Another group of people that aggravate me are the people that go to eat only crab legs. If you have seen them in action, you know who I am talking about. They usually travel in groups of two and ask to sit as close or with a direct line of sight to the pan containing the crab legs. The first thing these sloths do is empty that pan of crab legs. When the employees bring out a fresh pan of crab legs the stop what they are doing, swallow what is in or within the orbit around their mouths, then go back up to empty the pan of crab legs. Why by courteous and leave a few legs behind when you can shovel the entire catch onto your plate then shuffle back to the safety of the pile of shell carcasses and litter surrounding your table. I always pray that there will be two competing tribes of crab leg mooches so I can take humor from the situation as they jockey for position and circle the other buffet foods with an empty plate waiting for the crab legs to come out. It is like some sick game of musical chairs, just with food. It makes me feel a little better to think that a group of hardened men in Alaska didn't risk their lives in the dangerous, freezing oceans so two cellulite filled meat bags could gorge themselves on the cheap.&lt;/p&gt;&lt;p&gt;When I go to the Chinese buffet it is usually because I want a cheap variety of Oriental cuisine. I love steamed dumplings, green beans, and the California rolls with wasabi and ginger slices. I usually get a little bit of everything. I leave a clean plate. I eat quietly. If I see someone eyeing a dish I'm in the process of emptying I'll ask if they would like some or wait until a fresh batch comes out. I usually don't let the masses get to me but the last trip to the buffet just didn't sit right with me; too much rudeness and waste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5832383786762351930?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5832383786762351930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5832383786762351930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5832383786762351930'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2009/01/chinese-buffet.html' title='The Chinese buffet'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7260655437767784156</id><published>2008-12-04T14:30:00.004-05:00</published><updated>2009-05-27T14:09:21.379-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle date goodies in SQL/PLSQL</title><content type='html'>Originally published 03/12/08...&lt;/p&gt;&lt;p&gt;I have been searching through Google, Yahoo! and various forums to create a small library of useful functions and crud for Oracle PL/SQL and SQL. I was either unhappy with the solutions I found or simply thought I could do them better, differently or somewhat the same.&lt;h4&gt;Leap Year&lt;/h4&gt;&lt;pre  name="code" class="Sql:nocontrols"&gt;(3-EXTRACT(MONTH FROM TRUNC(date_column,'YEAR')+59)) -- returns 1 if a leap year, 2 if not; from DATE datatype&lt;br /&gt;(3-EXTRACT(MONTH FROM ADD_MONTHS('01-JAN-0001',numeric_year_column*12)-307)) -- returns 1 if a leap year, 2 if not; from NUMBER datatype&lt;br /&gt;DECODE(EXTRACT(MONTH FROM TRUNC(date_column,'YEAR')+59),2,'True','False') -- substitute VARCHAR2 values for the result&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;Holidays&lt;/h4&gt;&lt;br /&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;CREATE OR REPLACE FUNCTION is_holiday(i_date DATE) RETURN VARCHAR2 IS&lt;br /&gt; v_date DATE;&lt;br /&gt; v_y NUMBER;&lt;br /&gt; v_q NUMBER;&lt;br /&gt;BEGIN&lt;br /&gt; v_date := TRUNC(i_date,'Y');&lt;br /&gt; v_y := EXTRACT(YEAR FROM i_date);&lt;br /&gt; v_q := TRUNC(MOD(v_y / 38 * 1440,60) / 2);&lt;br /&gt; RETURN CASE i_date&lt;br /&gt;  WHEN v_date THEN 'New Years'&lt;br /&gt;  WHEN NEXT_DAY(ADD_MONTHS(v_date,1) - 1,'MON') + 14 THEN 'Presidents Day' --- Third Monday in February&lt;br /&gt;  WHEN NEXT_DAY(ADD_MONTHS('01-JAN-0001',v_y * 12 - 8) + v_q + (CASE WHEN v_q &lt; 5 THEN 17 ELSE -12 END),'SAT') - 34 + (CASE v_y WHEN 2079 THEN 7 ELSE 0 END) THEN 'Easter' --- valid 1900-2199 only&lt;br /&gt;  WHEN NEXT_DAY(ADD_MONTHS(v_date,5) - 1,'MON') - 7 THEN 'Memorial Day' --- last Monday of May&lt;br /&gt;  WHEN ADD_MONTHS(v_date,6) + 3 THEN 'Independance Day'&lt;br /&gt;  WHEN NEXT_DAY(ADD_MONTHS(v_date,8) - 1,'MON') THEN 'Labor Day' --- first Monday in September&lt;br /&gt;  WHEN ADD_MONTHS(v_date,10) + 10 THEN 'Veterans Day'&lt;br /&gt;  WHEN NEXT_DAY(ADD_MONTHS(v_date,10) - 1,'THU') + 21 THEN 'Thanksgiving' --- fourth Thursday in November&lt;br /&gt;  WHEN ADD_MONTHS(v_date,11) + 24 THEN 'Christmas'&lt;br /&gt;  ELSE NULL&lt;br /&gt; END;&lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;The above function appears to be fairly accurate. I tested 2000-2008 for all holidays and 1900-2199 for Easter (finding only one glitch for 2079 manually corrected with a CASE statement). The above function could prove handy if you have a time dimension in your data warehouse (who doesn't) and use PL/SQL to generate your data.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Easter&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;Uses the &lt;a href="http://en.wikipedia.org/wiki/Computus#Meeus.2FJones.2FButcher_Gregorian_algorithm"&gt;Meeus/Jones/Butcher Gregorian algorithm&lt;/a&gt;&lt;pre  name="code" class="Sql:nocontrols"&gt;FUNCTION GET_EASTER2_FN(i_year NUMBER) RETURN DATE IS&lt;br /&gt; v_g  PLS_INTEGER; -- the Golden number; sequence in the 19-year lunar cycle&lt;br /&gt; v_c  PLS_INTEGER; -- the Christian era i.e. century&lt;br /&gt; v_y  PLS_INTEGER; -- the year number in the Christian era&lt;br /&gt; v_e  PLS_INTEGER; -- the epact; days in excess of the solar year over the lunar year&lt;br /&gt; v_l  PLS_INTEGER; -- the ?&lt;br /&gt;BEGIN&lt;br /&gt; v_g := MOD(i_year,19);&lt;br /&gt; v_c := TRUNC(i_year / 100);&lt;br /&gt; v_y := MOD(i_year,100);&lt;br /&gt; v_e := MOD((19 * v_g + v_c - TRUNC(v_c / 4) - TRUNC((v_c - TRUNC((v_c + 8) / 25) + 1) / 3) + 15),30);&lt;br /&gt; v_l := MOD(32 + 2 * (MOD(v_c,4) + TRUNC(v_y / 4)) - v_e - MOD(v_y,4),7);&lt;br /&gt; RETURN ADD_MONTHS('22-MAR-0001',(i_year - 1) * 12) - TRUNC((v_g + 11 * v_e + 22 * v_l) / 451) * 7 + v_e + v_l;&lt;br /&gt;END;&lt;/pre&gt;&lt;h4&gt;Format Independant TO_DATE&lt;/h4&gt;&lt;pre name="code" class="Sql:nocontrols"&gt;FUNCTION TO_DATE_FN( i_datechar VARCHAR2 ) RETURN DATE IS&lt;br /&gt;  v_datechar VARCHAR2(32000) := UPPER(TRIM(i_datechar));&lt;br /&gt;BEGIN&lt;br /&gt;  RETURN CASE TRANSLATE(NVL(v_datechar,'N/U/L/L'),'0123456789/-ABCDEFGJLMNOPRSTUVY','##########/-^^^^^^^^^^^^^^^^^^^')&lt;br /&gt;    WHEN '^/^/^/^'     THEN NULL&lt;br /&gt;    WHEN '########'    THEN TO_DATE(v_datechar,'YYYYMMDD')&lt;br /&gt;    WHEN '######'      THEN TO_DATE(v_datechar,'MMDDYY')&lt;br /&gt;    WHEN '##/##/##'    THEN TO_DATE(v_datechar,'MM/DD/YY')&lt;br /&gt;    WHEN '##/##/####'  THEN TO_DATE(v_datechar,'MM/DD/YYYY')&lt;br /&gt;    WHEN '####-##-##'  THEN TO_DATE(v_datechar,'YYYY-MM-DD')&lt;br /&gt;    WHEN '##-^^^-##'   THEN TO_DATE(v_datechar,'DD-MON-YY')&lt;br /&gt;    WHEN '##-^^^-####' THEN TO_DATE(v_datechar,'DD-MON-YYYY')&lt;br /&gt;    ELSE TO_DATE('01-JAN-2989','DD-MON-YYYY')&lt;br /&gt;  END;&lt;br /&gt;END TO_DATE_FN;&lt;/pre&gt;&lt;br /&gt;More to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7260655437767784156?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7260655437767784156' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7260655437767784156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7260655437767784156'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/03/oracle-date-goodies-in-sqlplsql.html' title='Oracle date goodies in SQL/PLSQL'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2767727234877547067</id><published>2008-11-30T23:11:00.001-05:00</published><updated>2009-05-27T14:09:34.041-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>MLS 2008 Champions</title><content type='html'>Your 2008 champions of Major League Soccer: the Columbus Scruh, ... Crew.&lt;/p&gt;&lt;p&gt;What is more embarrassing? Having the commissioner of the league you just won a championship in come one letter short of calling you the "screw" on national television or having that same commissioner try to present the trophy to captain Guillermo Barros Schelotto when the captain was actually Frankie Hejduk; the guy strategically placed next to the cup for ease of transfer?&lt;/p&gt;&lt;p&gt;Suck a big one, Don.&lt;/p&gt;&lt;p&gt;Classic fail from the league head chimp aside, winning the 2008 MLS championship capped off a wonderful season that was a long time coming. There were a lot more fans that deserved this championship more than I. I can only offer praise to the groups that stayed with the team throughout the worst of the worst to finally get to greatness. I wasn't there for every game nor did I watch every game on television or at bar with a tab full of expensive finger foods and beer.&lt;/p&gt;&lt;p&gt;List of team accomplishments:&lt;ul&gt;&lt;li&gt;Took home the &lt;a href="http://en.wikipedia.org/wiki/Trillium_Cup"&gt;Trillium Cup&lt;/a&gt;; the league promoted distance rivalry between Columbus and Toronto, by beating them at home, then earning two draws on the road&lt;/li&gt;&lt;li&gt;Took control of the &lt;a href="http://en.wikipedia.org/wiki/MLS_Supporters'_Shield"&gt;Supporter's Shield&lt;/a&gt; for having the best record at the end of the season&lt;/li&gt;&lt;li&gt;Defender of the Year for Chad Marshall&lt;/li&gt;&lt;li&gt;Coach of the Year for Sigi Schmid&lt;/li&gt;&lt;li&gt;Most Valuable Player for Guillermo Barros Schelotto&lt;/li&gt;&lt;li&gt;Took home the 2008 MLS Cup for defeating Kansas City on aggregate goals, the Chicago Fire 2-1 at home, and then the New York Red Bulls 3-1 in Carson City&lt;/li&gt;&lt;li&gt;MLS Cup MVP for Guillermo Barros Schelotto for directly assisting on all three goals&lt;/li&gt;&lt;/ul&gt;I made sure I picked up a copy of the Columbus Dispatch to tuck away somewhere as a memory for my later years. It would be nice to pick up a photoset, too.&lt;/p&gt;&lt;p&gt;Some consider the celebration short-lived. An expansion draft was held the next Thursday and starter Brad Evans went to Seattle. There is talk that defender of the year Chad Marshall is heading overseas (more cash and higher level of play) and that coach of the year, Sigi Schmid is heading to Seattle to be closer to family on the West Coast and to get a longer-term contract (three years) to make it easy to settle somewhere. A sizable chunk of cash will be required to sign Guillermo Barros Schelotto for another year or so. There are developmental players that will be waived. There will be veterans that will probably be asked to step down.&lt;/p&gt;&lt;p&gt;Regardless of these developments, 2008 was a triumphant year for the Columbus Crew. Nothing can take that away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2767727234877547067?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2767727234877547067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2767727234877547067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2767727234877547067'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/mls-2008-champions.html' title='MLS 2008 Champions'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4375550028983653924</id><published>2008-11-20T13:11:00.005-05:00</published><updated>2009-05-27T14:09:48.763-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Web 2.blow, Oracle.com version</title><content type='html'>Go to &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/ou_homepage_utils.search_info?p_org_id=1001&amp;p_lang=US&amp;p_top_frame=Y"&gt;this Oracle University link&lt;/a&gt; with the various web browsers you have. Here is what you will see. In IE7 it renders well and you can get into the various tabs for schedules and details. In Firefox on Windows it operates but looks different. Unfortunately, it breaks on the sixth page of the checkout too but you won't know that unless you register, book a course, enter a purchase order number, enter names of five siblings you promise to sacrifice, etc. In Opera, well, it just pukes the whole mess up at the top of the screen and is totally unusable. If you set site options to mask as Netscape/Firefox it works.&lt;/p&gt;&lt;p&gt;Now I know I'm vastly in the minority here with Opera. That does not, however, excuse an if Netscape else if IE without an else; i.e. if the browser doesn't match anything previous just leave all objects null. Good programming would have at least put JavaScript compliant code in the final else and then hoped for the best. Most alternative browsers will try to be as standards compliant as possible.&lt;/p&gt;&lt;p&gt;Second, is all that JavaScript necessary? I find myself being left behind because I feel every web page doesn't need to look and perform like an iPhone. What's next; keyboards with motion sensors so. Whoops. Showing my age here. What's next; mice with horizontal and vertical sensors so... Ooops... Wrong again. Who uses mice anymore? Touch screens with voice recognition. Yeah. Every page is going to be LCD shake/touch/punch/slap and voice aware.&lt;/p&gt;&lt;p&gt;Actually I'm going off the deep end. I just want to be able to register for a $3,000 F'ing class so I can get a $270 certification then take another $3,000 F'ing class so I can get a $270 certification, so I can become a big-shot know-it-all Oracle guru about a month before we drop Oracle and go pure SQL Server. Now Oracle Identify Manager won't let me log into Oracle University via single sign-on (I can go to Metalink). When I "well F'you, I'll register" it says my sign-on is already in use. When I try to get my password, it says I don't exist. Sigh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4375550028983653924?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4375550028983653924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4375550028983653924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4375550028983653924'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/web-2blow-oraclecom-version.html' title='Web 2.blow, Oracle.com version'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6834120028355247165</id><published>2008-11-16T16:50:00.000-05:00</published><updated>2009-05-27T14:10:21.595-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>MLS conference finals</title><content type='html'>I have some catching up to do here?&lt;/p&gt;&lt;p&gt;The Crew went on to defeat the Kansas City Wizards in Columbus which sent them to the finals. Chicago pounded a wounded New England three zip in Bridgeview, sending them to face us in the Eastern Conference finals. It was a match for the ages, everything it was supposed to be and then some.&lt;/p&gt;&lt;p&gt;There were so many back stories.&lt;/p&gt;&lt;p&gt;The biggest one was the return of Brian McBride. McBride was one of the original Crew players and face of the organization. To this day, people still associate McBride with Columbus. Brian left in 2003 to join English Premier League (top level) club Fulham. This season, he returned to America to end his career in the MLS but not for Columbus; he wanted to play for Chicago, his hometown (Arlington Heights). His first encounter with his former MLS team was in Chicago where he had the first and last goals of the two goal tie. Now he would make his return to Columbus with our elimination on his mind.&lt;/p&gt;&lt;p&gt;Another big story was the return of fan favorite Jon Busch. Jon was acquired in the 2002 SuperDraft and was starting for the Crew by 2003. Busch was between the pipes when Columbus won the Lamar Hunt U.S. Open Cup in 2002 and won goalkeeper of the year in 2004. He suffered season ending ACL injuries in both 2005 and 2006. He was waived in 2007, picked up by Toronto, then waived again and then picked up by Chicago. Busch has been, and always will be, a vocal person. The person who once stated that he could not see playing anywhere but Columbus was now displaying public anger towards Coach Sigi Schmid.&lt;/p&gt;&lt;p&gt;What else? The Fire had Kettering, Ohio native Chris Rolfe. Both teams played to two, two to two draws. Chicago was the only team Columbus did not defeat in 2008. The Crew lost to Chicago back in the June Open Cup match.&lt;/p&gt;&lt;p&gt;The first goal of the match was the worst possible scenario. Roughly 30 minutes into the game a defensive brain fart lets McBride get a head on a Mapp cross. One to zip, visitors and the travelling fans were jubilant. The Columbus fans never gave up though. The second half was a completely different story.&lt;/p&gt;&lt;p&gt;Roughly 50 minutes into the match, Crew central defender Chad Marshall out-duals the aerial powerhouse McBride and heads home a Guillermo Barros Schelotto free-kick. It was a perfect strike off the cross-bar; nothing anyone could have done to stop it. Five minutes later, Eddie Gaven buries a low, bouncing shot underneath Busch for the second goal. That one would end up the game winner.&lt;/p&gt;&lt;p&gt;About forty nervous minutes followed. I certain every single Crew fan was thinking the same thing: when was McBride going to tie this in the dying moments of regulation (just like he did in Chicago). Well, it didn’t happen. A few missed heartbeats later the Crew were going to their first MLS Cup with their first conference championship.&lt;/p&gt;&lt;p&gt;Massive.&lt;/p&gt;&lt;p&gt;The Crew will face the Western Conference champions - the New York Red Bulls??? Don't ask. Just destroy them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6834120028355247165?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6834120028355247165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6834120028355247165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6834120028355247165'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/mls-conference-finals.html' title='MLS conference finals'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1068631834945293836</id><published>2008-11-10T12:40:00.002-05:00</published><updated>2009-05-27T14:10:58.388-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Mojave part 3, Mojave fights back</title><content type='html'>The machine I have been using Mojave on has had one or more folders in the \Users folders get corrupted and rendered inaccessible.  The short version of this fix was to make a copy of the most previous version of the corrupt folder, shut down, boot with the Mojave install DVD, go to recovery, get to the command prompt, then run chkdsk C: /f, then pray a bit, then see if things got fixed and if you need to recover.&lt;br /&gt;&lt;br /&gt;What a load of warthog feces.&lt;br /&gt;&lt;br /&gt;The pain-in-the-ass is not being able to run the chkdsk from the Mojave GUI or when the computer is restarted (via prompt when you try to run the GUI chkdsk). You can tell it over and over and over again but it never seems to run chkdsk.&lt;br /&gt;&lt;br /&gt;Fine...&lt;br /&gt;&lt;br /&gt;This corruption has occurred after installing software and after installing updates. Apparently, others have run into this problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1068631834945293836?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1068631834945293836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1068631834945293836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1068631834945293836'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/mojave-part-3-mojave-fights-back.html' title='Mojave part 3, Mojave fights back'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5759714146915056282</id><published>2008-11-03T21:14:00.000-05:00</published><updated>2009-05-27T14:10:21.596-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>MLS semi-finals, leg 1</title><content type='html'>The first leg of the home and away aggregate goal series went close to how I thought it would go. The Crew tied the Wizards with a late goal; so they will have to win the series at home. Wizard play maker Hercules Gomez will sit out that game because he was ejected after a violent foul in game one. New England was unable to score goals at home but luckily for them, the Fire didn’t score any either so their series is tied. The Red Bulls tied Houston on their home turf so they will probably get pounded when they travel to Houston. Real Salt Lake took a goal at home and hopefully they will survive their trip to California. Not surprising, there were three ties out of four games and not much scoring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5759714146915056282?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5759714146915056282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5759714146915056282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5759714146915056282'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/mls-semi-finals-leg-1.html' title='MLS semi-finals, leg 1'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8850917722865863640</id><published>2008-11-03T21:02:00.001-05:00</published><updated>2009-05-27T14:11:19.792-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Mojave, part two - the revenge</title><content type='html'>I have been using Windows Mojave for over a month now so I have decided to post some more thoughts.&lt;/p&gt;&lt;p&gt;Wireless networking, well, networking in general, is annoying at times. Compared to Windows XP, Mojave looks like it tries to do too much to make wireless networking dumb-ass proof. I usually end up doing a reboot after switching wireless networks because when I undock (from a wired connection) the wireless connection at work picks up if I’m lucky or when I get home the connection is strong but doesn’t always connect or connects for a moment or two then disconnects. It might be Dell because I’ve never had a problem with an IBM laptop.&lt;/p&gt;&lt;p&gt;Most of the problems with Windows Mojave have been with non Microsoft software. Symantec has an issue with correctly going into sleep mode, causing the battery to drain completely when you least expect it. Oracle’s Developer Tools for Visual Studio do not work out of the box. Then again, if Visual Studio was a 64 bit application, things might be different. Video and audio CODEC support in 64 bit mode is provided by someone outside of Microsoft and Media Player 32-bit is the default player, not the 64-bit one.&lt;/p&gt;&lt;p&gt;I think what annoys me the most about Mojave is that it just isn’t necessary. I was reading a magazine in the can the other day and one guy was suggesting that businesses start adopting Mojave because people are going to be wanting widgets for the side-bar. Really? That’s why I should upgrade hardware and operating systems, because people will be wanting sidebar widgets. How about some freakin’ software that works? How about 64 bit versions of some software? It has been how many years since 64 bit on the desktop was a reality? Some programs are not Mojave capable. How hard is it to make a program Mojave compatible? Some programs only work when run as administrator; why would a semi-thin client require administrator rights to work? Stupid.&lt;/p&gt;&lt;p&gt;My current impression of Mojave hasn’t changed much. It is a nice looking operating system and there are some things in the start menu that I like (like how you can type in the name of a program or control panel setting and it will filter the lists immediately for you, helps when you don’t have a mouse). Then again, everything I can do for this blog, my stories, and work can be done in Windows XP on a machine with a fourth the horsepower.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8850917722865863640?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8850917722865863640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8850917722865863640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8850917722865863640'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/11/mojave-part-two-revenge.html' title='Mojave, part two - the revenge'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1205355355525934175</id><published>2008-10-26T22:10:00.000-04:00</published><updated>2009-05-27T14:10:21.596-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soccer'/><title type='text'>Crew vs. DC, playoff thoughts</title><content type='html'>Today's match against D.C. United couldn't have been scripted any better. The same northwest goal post that denied two United attempts happily tucked a Brad Evans long-range shot into the back of the next for the only goal of the match. The massive supporters groups were able to enjoy the Supporter's Shield trophy and the Columbus Crew sent a hated rival with a long history of knocking us out of the playoffs, out of the playoffs. How sweet it is. Now it is on to the playoffs.&lt;/p&gt;&lt;p&gt;The first round of the MLS semi-finals consists of a home and away aggregate goal system. The lowest seed hosts the first game and the highest seed hosts the second game. In my opinion, this does not give the advantage to the team that did the best during the regular season. At best the two teams are equal or a slight advantage is given to the lower seeded team. Here is why.&lt;/p&gt;&lt;p&gt;The lower seeded team can come out hard; early and usually get away with it. New England did this to us in 2004 by delivering some hard fouls early in the match to our playmakers and midfield anchors (notable was a Shalrie Joseph tackle on Simon Elliot, worthy of ejection but went without even a caution and Simon wasn't the same player after that tackle; Joseph did the same thing to Jaime Moreno when they played DC, btw).&lt;/p&gt;&lt;p&gt;Using home field advantage for the first game, the lower seeded team has more control over the flow of the game as the visiting (higher seeded) team must usually sit back and feel out. The home and away series somewhat turns into a two-half match (one half home and away). So if the home team can squeeze out a victory by a goal (or more) they still control the flow of the game because the second leg forces the higher seeded team to score that many goals plus one (to avoid penalty kicks). The higher seeded team will need to press for goals opening them up for counter attack goals. I think this format benefits the "boring", defensive teams that rely upon the two or three highly skilled players up top typically running a quick counter attack three on three or four.&lt;/p&gt;&lt;p&gt;The first round will feature Columbus vs. Kansas City and Chicago vs. New England in the east, Houston vs. New York and Chivas USA vs. Salk Lake in the west. If I were New York I'd come out full throttle for the full 90 minutes and rack up as many goals as possible on that crap Astroturf surface. I still think Houston will take that one in the long run otherwise. I would like to see Real Salt Lake get by Chivas USA just to give Jason Kreis a pat on the back for his years of service to MLS, give the fans a pat on the back for being patient and getting a new stadium, and to keep California out of the playoffs. In the east I think New England is too volatile and weakened to go up against a surging Chicago team. I also think the Crew will prevail against Kansas City but we might have to do so on home turf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1205355355525934175?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1205355355525934175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1205355355525934175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1205355355525934175'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/10/crew-vs-dc-playoff-thoughts.html' title='Crew vs. DC, playoff thoughts'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7405879151097310336</id><published>2008-10-08T12:18:00.004-04:00</published><updated>2009-05-27T14:11:34.697-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Why SQL generators suck</title><content type='html'>Assume the following table:&lt;/p&gt;&lt;pre&gt;CREATE TABLE craps&lt;br /&gt;( craps_id          NUMBER&lt;br /&gt;, crap_size         NUMBER&lt;br /&gt;, crap_color        VARCHAR2(16)&lt;br /&gt;, crap_when_taken   DATE DEFAULT SYSDATE&lt;br /&gt;, crap_when_flushed DATE&lt;br /&gt;, crap_rating       NUMBER&lt;br /&gt;, CONSTRAINT craps_pk PRIMARY KEY ( craps_id )&lt;br /&gt;) storage_clauses, logging_clauses, santa_clauses ....&lt;/pre&gt;&lt;p&gt;To get a list of craps and their size and color for a time interval by time it was flushed or if that was null (i.e. it was a proud poop that someone wanted everyone to see) the time it hit the bowl; the efficient SQL would be:&lt;/p&gt;&lt;pre&gt;SELECT crap_size&lt;br /&gt;, crap_color&lt;br /&gt;, NVL(crap_when_flushed,crap_when_taken) crap_flushed_taken&lt;br /&gt;FROM craps&lt;br /&gt;WHERE NVL(crap_when_flushed,crap_when_taken) BETWEEN :1 and :2&lt;br /&gt;ORDER BY crap_flushed_taken ASC NULLS FIRST;&lt;/pre&gt;&lt;p&gt;Oracle would do a full table scan, efficient blocked I/O, and then poop out the results. Oh, wait. We're using a canned, record-based, RDBMS independant system that generates SQL that selects a list of primary keys and then reads each record by primary key. So we have something more like this:&lt;/p&gt;&lt;pre&gt;SELECT craps_id&lt;br /&gt;FROM craps&lt;br /&gt;WHERE NVL(crap_when_flushed,crap_when_taken) BETWEEN :1 and :2&lt;br /&gt;ORDER BY NVL(crap_when_flushed,crap_when_taken);&lt;/pre&gt;&lt;p&gt;and for each selected primary key value:&lt;/p&gt;&lt;pre&gt;SELECT crap_size&lt;br /&gt;, crap_color&lt;br /&gt;, NVL(crap_when_flushed,crap_when_taken) crap_flushed_taken&lt;br /&gt;FROM craps&lt;br /&gt;WHERE craps_id = :1;&lt;/pre&gt;&lt;p&gt;Oh, wait. That NVL on those two fields is business logic that needs separated from the data layer; so we create a function:&lt;/p&gt;&lt;pre&gt;CREATE OR REPLACE FUNCTION &lt;br /&gt; crap_flushed_taken (i_crap_when_flushed DATE, i_crap_when_taken DATE)&lt;br /&gt; RETURN DATE AS&lt;br /&gt;BEGIN&lt;br /&gt; RETURN NVL(i_crap_when_flushed,i_crap_when_taken);&lt;br /&gt;END;&lt;/pre&gt;&lt;p&gt;No, no, no, stupid. That layer shouldn't need to know to pass two dates in it should work off the record/object primary key identifier:&lt;/p&gt;&lt;pre&gt;CREATE OR REPLACE FUNCTION &lt;br /&gt; crap_flushed_taken (i_craps_id NUMBER)&lt;br /&gt; RETURN DATE&lt;br /&gt; AS&lt;br /&gt; v_crap_when_flushed DATE;&lt;br /&gt; v_crap_when_taken DATE;&lt;br /&gt;BEGIN&lt;br /&gt; SELECT crap_when_flushed, crap_when_taken&lt;br /&gt; INTO v_crap_when_flushed, v_crap_when_taken&lt;br /&gt; FROM craps&lt;br /&gt; WHERE craps_id = i_craps_id; &lt;br /&gt; RETURN NVL(v_crap_when_flushed,v_crap_when_taken);&lt;br /&gt;END;&lt;/pre&gt;&lt;p&gt;Actually, this is how they did it&lt;/p&gt;&lt;pre&gt;CREATE OR REPLACE FUNCTION crap_flushed_taken (i_craps_id NUMBER)&lt;br /&gt; RETURN DATE&lt;br /&gt; AS as language java name 'com.crap.name.name1.CrapFlushedTaken(java.lang.Integer) return java.lang.Date';&lt;/pre&gt;&lt;p&gt;That's a Java class that basically does the exact same thing that little slice of PL/SQL was doing. The final, generated SQL statement went something along the lines of this:&lt;/p&gt;&lt;pre&gt;SELECT craps_id&lt;br /&gt;FROM (&lt;br /&gt; SELECT q1.craps_id&lt;br /&gt; FROM craps q1&lt;br /&gt; WHERE NVL(crap_flushed_taken(q1.craps_id),TO_DATE(1,'YYYY')) &gt;= TO_DATE('????????','YYYYMMDD')&lt;br /&gt; AND NVL(crap_flushed_taken(q1.craps_id),TO_DATE(1,'YYYY')) &lt;= TO_DATE('????????','YYYYMMDD')&lt;br /&gt;) t0&lt;br /&gt;LEFT JOIN craps t1 ON t0.craps_id = t1.craps_id&lt;br /&gt;ORDER BY WHERE crap_flushed_taken(t1.craps_id) ASC NULLS FIRST, t1.craps_id ASC NULLS FIRST;&lt;/pre&gt;&lt;p&gt;Then the list program read each one of the selected primary key values and did this:&lt;/p&gt;&lt;pre&gt;SELECT crap_size&lt;br /&gt;, crap_color&lt;br /&gt;, crap_when_flushed&lt;br /&gt;, crap_when_taken&lt;br /&gt;FROM craps&lt;br /&gt;WHERE craps_id = :1;&lt;/pre&gt;&lt;p&gt;Holy slang for feces! Oracle does an index fast full scan on the ID, which it would see as the most efficient way of going about this because in the optimizer's sane mind it would never think anyone would do a single read of the same table inside of a function. So for each primary key in that table (because we don't know the result of the function so no way to limit the working set) we are doing at least three (select, order by, list program), random (record location likely won't match the maintained order of the index), entire table reads using an index (read index block, then lookup corresponding block). Poop on me and call me a sundae...&lt;/p&gt;&lt;p&gt;I tried to simulate the above with inline select statements but the 10g optimizer was smart enough to figure it all out and come up with a plan five times the cost of the optimized plan for proper, hand-tuned SQL. I could try running the thing to get real statistics but unfortunately this thing runs for nine hours. My efficient SQL above runs in 30 seconds.&lt;/p&gt;&lt;p&gt;There are options available. First would be to rewrite the canned code and do the selection process with the optimized hand-written SQL. Another option would be to create an index on the function (haven't tried it yet) so theoretically Oracle will see the SELECT crap matches an index and use the index instead of reading the whole table one row at a time through the primary key index.&lt;/p&gt;&lt;p&gt;I know this is probably an extreme example (or one of many) but I think the same thoughts can be applied to code generators and to the object oriented purists that believe no business logic whatsoever belongs in the data tier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7405879151097310336?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7405879151097310336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7405879151097310336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7405879151097310336'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/10/why-sql-generators-suck.html' title='Why SQL generators suck'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7815383998125017691</id><published>2008-09-30T06:11:00.000-04:00</published><updated>2009-05-27T14:11:19.792-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Mojave, whoa oh oh oh</title><content type='html'>Microsoft's new operating system, Mojave, was mandated for installation on the new hardware my employer recently purchased for me. Mojave looks an awful lot like Vista was supposed to look like but I heard Vista wasn't doing so well so I understand why Microsoft would want to replace it with Mojave. Anyways, I have decided to document my experiences here.&lt;/p&gt;&lt;p&gt;We installed the "Business" version of Mojave because the "Ultimate" version didn't have something that the "Business" version did have. We also installed the 64 bit version because the 32 bit version was either "a piece of crap" or "sucks donkey balls", I can't remember which. Luckily the hardware vendor provided a disk with all the appropriate drivers although we had to download a couple to get certain features to work. By installing the operating system ourselves we didn't have the 40 gigabytes of pre-loaded bull-feces to uninstall.&lt;/p&gt;&lt;p&gt;The second step was to install all the software we use on a daily, weekly, only-when-we-are-forced-to basis. As a systems administrator and developer I had double the amount of crap to install on the machine but was intelligent enough to download it all ahead of time to a portable drive. There was a lot of "Cancel or Allow" and "Something is attempting to do something" which led to a lot of clicking without reading because after a while you just get numb to it all. I could have been installing some Nazi Al Qaeda kitten snuff porn server hub and not known it because I had become conditioned to clicking these authorizations all the time. The only piece of software that isn't working at this writing is Eclipse. It throws a Java error when it starts up. Fudge.&lt;/p&gt;&lt;p&gt;The first noticeable difference between Mojave and XP is the Windows Sidebar. The sidebar, which by default hovers just above the clock in the explorer bar, features another clock, mini slide-show and news ticker. These things are called gadgets and there are about 400 more of them available ranging from just crap to useful eye-candy. Not wanting to be un-cool, I've loaded as many gadgets as I could into the sidebar. I don't need them but they look snazzy so who cares. I can't wait to have a themed slideshow so I can have some microscopic nudity in the sidebar for when I'm home.&lt;/p&gt;&lt;p&gt;Mojave includes a lot of eye-candy; i.e. things that look really sharp but might not affect your productivity.&lt;/p&gt;&lt;p&gt;I have found a few annoyances. The defragmenter does not show status, it just says this might take minutes or hours. To get around this run the command prompt as administrator then do a "defrag c: -a –v" to defragment drive "C:". I could not figure out how to enable hibernation (I have to create a power plan or something and still couldn't find the option to enable it) so I have to use "sleep" mode or shut down. The initial working set (i.e. just the applications that load at startup) is 1.4 GB. The machine has 4 GB so I will not pass judgment on Mojave being inefficient without looking at the internals. See my other blog posts on memory consumption; i.e. I'd rather have the machine using memory than hitting disk.&lt;/p&gt;&lt;p&gt;I am certain there will be more things to report as I use Mojave but at this time I'm not impressed. Everything I can do on Mojave I can do on Windows XP and even Linux if I so chose.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7815383998125017691?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7815383998125017691' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7815383998125017691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7815383998125017691'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/09/mojave-whoa-oh-oh-oh.html' title='Mojave, whoa oh oh oh'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-149521840607832989</id><published>2008-08-28T14:11:00.007-04:00</published><updated>2009-05-27T15:17:43.975-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>ORA-01008 on PL/SQL MERGE over link</title><content type='html'>If you get an "ORA-01008: not all variables bound" error when trying to do a MERGE INTO a remote table using local PL/SQL variables and local data from local tables, what do you do besides beat your head against the wall until it is soft and mushy like a sponge?&lt;pre name="code" class="Sql:nocontrols"&gt;DECLARE&lt;br /&gt;  v_turd VARCHAR2 := 'Stinky';&lt;br /&gt;BEGIN&lt;br /&gt;MERGE INTO table@link m&lt;br /&gt;USING (&lt;br /&gt;  SELECT&lt;br /&gt;    crap&lt;br /&gt;  , poop&lt;br /&gt;  , dood&lt;br /&gt;  , loaf&lt;br /&gt;  FROM local_table&lt;br /&gt;  WHERE num = 2&lt;br /&gt;) u&lt;br /&gt;ON (m.loaf = u.loaf)&lt;br /&gt;WHEN MATCHED THEN UPDATE SET m.turd = v_turd, m.poop = u.poop&lt;br /&gt;WHEN NOT MATCHED THEN INSERT VALUES (u.load, v_turd, u.crap, u.poop, u.dood, u.loaf);&lt;br /&gt;COMMIT;&lt;br /&gt;END;&lt;/pre&gt;Thankfully, it only took a couple of Google searches to find a solution offered by Carsten Herbe at &lt;a href="http://forums.oracle.com/forums/message.jspa?messageID=908103"&gt;Oracle's forums&lt;/a&gt;. The INSERT and UPDATE statements in the MERGE must only use data defined in the USING or literals (or maybe other stuff too). So...&lt;pre name="code" class="Sql:nocontrols"&gt;DECLARE&lt;br /&gt;  v_turd VARCHAR2 := 'Stinky';&lt;br /&gt;BEGIN&lt;br /&gt;MERGE INTO table@link m&lt;br /&gt;USING (&lt;br /&gt;  SELECT&lt;br /&gt;    crap&lt;br /&gt;  , poop&lt;br /&gt;  , dood&lt;br /&gt;  , loaf&lt;br /&gt;  , v_turd turd&lt;br /&gt;  FROM local_table&lt;br /&gt;  WHERE num = 2&lt;br /&gt;) u&lt;br /&gt;ON (m.loaf = u.loaf)&lt;br /&gt;WHEN MATCHED THEN UPDATE SET m.turd = u.turd, m.poop = u.poop&lt;br /&gt;WHEN NOT MATCHED THEN INSERT VALUES (u.load, u.turd, u.crap, u.poop, u.dood, u.loaf);&lt;br /&gt;COMMIT;&lt;br /&gt;END;&lt;/pre&gt;Sometimes I feel sorry for us computer nerds that have to deal with frustrating little things like a damned ORA-01008 that works perfectly in SQL when you are testing but as soon as you try to automate it with a variable you get your geek pee-pee whacked with a ruler. Bad geek, no work. Thankfully the clicker-web is littered with other suffering nerd-souls that have run into these problems on the smallest of free systems to multi-million dollar goliaths. Unlike other nagging problems this one didn't cause much suffering on my part. Hopefully by posting this here it will add to the Internet litter and maybe help others faster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-149521840607832989?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=149521840607832989' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/149521840607832989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/149521840607832989'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/08/ora-01008-on-plsql-merge-over-link.html' title='ORA-01008 on PL/SQL MERGE over link'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2560860378218381275</id><published>2008-08-26T13:19:00.002-04:00</published><updated>2009-05-27T14:12:20.548-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle instant client, Ubuntu, revisited</title><content type='html'>For those that want quick installation instructions assuming you have the installation files on the root of a mounted CDROM:&lt;/p&gt;&lt;pre&gt;sudo -s&lt;br /&gt;mkdir /opt/oracle&lt;br /&gt;cd /opt/oracle&lt;br /&gt;unzip /media/cdrom/instanclient-basic- (etc.version.blah.blah)&lt;br /&gt;unzip /media/cdrom/instanclient-sdk- (etc.version.blah.blah)&lt;br /&gt;unzip /media/cdrom/instanclient-sqlplus- (etc.version.blah.blah) optional&lt;br /&gt;ln -s instantclient_11_1 client&lt;br /&gt;cd client&lt;br /&gt;ln -s libclntsh.so.11.1 libclntsh.so&lt;br /&gt;ln -s libocci.so.11.1 libocci.so&lt;br /&gt;ln -s libsqora.so.11.1 libsqora.so&lt;br /&gt;tr -d '\r' &lt; /media/cdrom/tnsnames.ora &gt; /etc/tnsnames.ora&lt;br /&gt;tr -d '\r' &lt; /media/cdrom/sqlnet.ora &gt; /etc/sqlnet.ora&lt;/pre&gt;&lt;p&gt;To use SQLplus from a shell you need to add the ORACLE_HOME=/opt/oracle variable and add /opt/oracle/client to variable LD_LIBRARY_PATH to the /etc/bash.bashrc (for example).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2560860378218381275?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2560860378218381275' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2560860378218381275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2560860378218381275'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/08/oracle-instant-client-ubuntu-revisited.html' title='Oracle instant client, Ubuntu, revisited'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3200991433291238067</id><published>2008-07-15T13:11:00.002-04:00</published><updated>2009-05-27T15:18:46.045-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Making fudged PII</title><content type='html'>As I start dealing more with application development that sends data to external sources I think more about the security of personally identifiable data within that data. When testing web services and file transfers there is no reason to have real, personally identifiable information (PII) in that stream of test data. However, the destination for that data still needs values in those elements. There are a few ways to approach this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Random data&lt;/li&gt;&lt;li&gt;Pre-generated test data, test cases, etc.&lt;/li&gt;&lt;li&gt;Use existing data but generate PII from a real primary key&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The main problem I see with randomly generated data is "re-testing". For example: you send data for ID 1234567 to a service, randomly generating four columns of test data, then that service requests a re-test with the same data.&lt;br /&gt;&lt;br /&gt;Pre-generated data would be a set of test cases, known trouble patterns and other data created before testing occurs. This scenario is feasible for new development on new data systems, to test min/max/null value scenarios that would otherwise never appear in live data, or to force a specific set of data. Where this scenario becomes cumbersome is when there is a tightly integrated system with numerous historical pre-cursor processes; triple the complexity if that system is another vendor's package and not your own. For example: create customer, purchase 14 months worth of product, run through aging and re-bill process, reconcile A/R, and then skip a month of purchases. There could be over a hundred tables touched by that set of processes and if one is skipped/missed then the data for another group is no longer valid.&lt;br /&gt;&lt;br /&gt;Generating test data from the primary key is feasible when the system has a long history of identified test data handy but simply needs PII altered to protect the identity of the individual or organization. By using a unique, primary key the "fudged" PII data will always match back to the source primary key for instances where "re-testing" is required. For example: ID 1234567 always generates social security number 898-75-5309 (not a real number but will validate in some systems).&lt;br /&gt;&lt;br /&gt;The example below was written for Oracle SQL to show how to convert a seven digit primary key identifier into a social security number, date of birth and gender:&lt;pre name="code" class="Sql:nocontrols"&gt;SELECT t1.id  --- VARCHAR2(7)&lt;br /&gt;, TO_CHAR(899-FLOOR(TO_NUMBER(t1.id)/989901),'000')&lt;br /&gt; ||TO_CHAR(MOD(FLOOR(TO_NUMBER(t1.id)/9999),99)-99,'S00')&lt;br /&gt; ||TO_CHAR(MOD(TO_NUMBER(t1.id),9999)-9999,'S0000') social_security_number&lt;br /&gt;, TO_CHAR(TRUNC(TRUNC(SYSDATE-6574.5,'YEAR')-MOD(FLOOR(TO_NUMBER(t1.id)/10),2191.5)-CASE SUBSTR(t1.id,-1,1)&lt;br /&gt; WHEN '2' THEN 2191.5&lt;br /&gt; WHEN '3' THEN 2191.5&lt;br /&gt; WHEN '4' THEN 4383&lt;br /&gt; WHEN '5' THEN 6574.5&lt;br /&gt; WHEN '6' THEN 8766&lt;br /&gt; WHEN '7' THEN 10957.5&lt;br /&gt; WHEN '8' THEN 13149&lt;br /&gt; WHEN '9' THEN 15340.5&lt;br /&gt; ELSE 0 END),'MM/DD/YYYY') date_of_birth&lt;br /&gt;, CASE&lt;br /&gt; WHEN SUBSTR(t1.id,-1,1) &lt; '5' THEN 'Male'&lt;br /&gt; ELSE 'Female' END gender&lt;br /&gt;, CASE SUBSTR(t1.id,-1,1)&lt;br /&gt; WHEN '0' THEN 'AI' --- American Indian/Alaskan&lt;br /&gt; WHEN '1' THEN 'AS' --- Asian/Pacific Islander&lt;br /&gt; WHEN '2' THEN 'BL' --- Black/Non-Hispanic&lt;br /&gt; WHEN '3' THEN 'HS' --- Hispanic&lt;br /&gt; WHEN '4' THEN 'NR' --- Non-Resident Alien&lt;br /&gt; WHEN '6' THEN 'AS'&lt;br /&gt; WHEN '7' THEN 'BL'&lt;br /&gt; WHEN '8' THEN 'HS'&lt;br /&gt; ELSE 'WH' END ethnic_code&lt;br /&gt;FROM table_name t1 WHERE [selection criteria];&lt;/pre&gt;The social security number is pretty straight forward. If area numbers (first three digits) higher than 772 do not validate, then use area 267 (237-267 have all groups allocated within them).&lt;br /&gt;&lt;br /&gt;The date of birth is a little complicated but the attempt was to use the ones digit to generate one of seven date ranges with the lower two in the range getting more hits because they are the primary age group dealt with. Starting with a base age of 18 years of age, subtract one of seven six year blocks, and then subtract zero to six years.&lt;br /&gt;&lt;br /&gt;Gender was a simple test of the ones digit to determine male or female.&lt;br /&gt;&lt;br /&gt;Ethnic background was a simple translation of the ones digit to a code taking into account there are more numbers in four of the six groups.&lt;br /&gt;&lt;br /&gt;This was a very bare example meant only to suggest direction. It would be interesting to build a library (although someone probably already has).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3200991433291238067?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3200991433291238067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3200991433291238067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3200991433291238067'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/07/making-fudged-pii.html' title='Making fudged PII'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5255620697443966181</id><published>2008-07-13T20:29:00.002-04:00</published><updated>2009-05-27T19:55:56.589-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>No more Mr Cranky</title><content type='html'>One of my favorite Friday morning web reads is calling it quits soon. &lt;a href="http://www.mrcranky.com/"&gt;Mr Cranky&lt;/a&gt; and his movie reviews are going away in August. I’m so, well the world isn’t going to come to an end but a good source of honest movie reviews and funny caption contests will be no more. I’ve thought about writing movie reviews here and have done so for the “Blog of the Dead” but they relate directly to zombie movies and not to movies in general.&lt;br /&gt;&lt;br /&gt;In order to write movie reviews I would actually have to go to see movies in the theater. I’ll probably go see the Dark Night but I think the last movie I went out to see was Spider Man 3 and that was only to see how badly they fucked up the Venom character. I typically wait until the movies hit the rental queue on Netflix and I’m usually limited to horror movies and whatever movies my girlfriend rents. Theoretically I could still do reviews of rentals but they would be kind of late, wouldn’t they? I could always do mini-reviews of the rentals to see if my warped mind matches the rest of the critical world but I find myself with barely enough time to write for this blog and my story blog.&lt;br /&gt;&lt;br /&gt;Maybe instead of doing something in absence of Mr Cranky I should just let it fade off and not do something in the same vein, that would be the best honor of all.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Update: Mr Cranky did not go away. Yay!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5255620697443966181?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5255620697443966181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5255620697443966181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5255620697443966181'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/07/no-more-mr-cranky.html' title='No more Mr Cranky'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2144109095818362767</id><published>2008-07-10T08:15:00.000-04:00</published><updated>2009-05-27T14:11:34.697-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Web 2.blow</title><content type='html'>Okay this whole web 2.0 lets throw everything and the kitchen sink into a web browser and use it as a business computing platform has given me a reason to get angry and blog again.&lt;/p&gt;&lt;p&gt;I usually have two physical machines active at work (well, at home too). I have the Windows XP based machine where I do most of my work and an older Ubuntu Linux desktop machine that I use for web browsing, music listening, scripted automation, etc. I have four desktops on the Linux machine: music player and maintenance, one ore more Opera web browser sessions for various documentation and manuals, Opera web browser for Google searches, and one empty just in case I need it. This configuration is very useful to me and it comes in handy sometimes because the Windows XP machine has about 300 megabytes of anti-virus, usage monitoring, remote management agents, network client, print client, database server, remote update agents, groupware notification agents, software update sleeper programs, and who the frak knows what else running on it before I launch the first bit of work. In fact, if I have to boot/reboot the Windows XP machine in the morning I can usually have the Linux machine booted with all the applications I use there loaded, my "Good Morning" Opera session loaded and all pages viewed, etc. just as the Windows XP machine finished its rituals. Occasionally, usually when I'm doing real intensive work, my employer schedules scanner software to make sure I don't have any viruses, spyware, malware, underwear, etc. and to inventory my machine for hardware and software, and to scan all directories for .avi, .mp3, .mpg, etc. to see how much hard disk real-estate I'm using for I'm assuming "non-work related" stuff.&lt;/p&gt;&lt;p&gt;Okay, I know, get to the point. As we use more web-based applications I keep running into more examples of where a) they don't work in a browser, b) do not have complete functionality in one or more browsers; c) have functionality (possibly) broken by a feature of a browser. Here is what I deal with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;one environment, since it is deeply integrated into IE6, does not work in IE7 (so we cannot upgrade to IE7 yet)&lt;/li&gt;&lt;li&gt;one application simply refuses to work in Opera but works in IE6 and Firefox&lt;/li&gt;&lt;li&gt;one application works in IE but not well in Firefox or Opera due to poor JavaScript and CSS (yes, it's a Microsoft Visual Studio project, how did you guess)&lt;/li&gt;&lt;li&gt;one application works in IE but occasionally loses functionality in Firefox and Opera&lt;/li&gt;&lt;li&gt;one application requests I upgrade from IE6 to IE7&lt;/li&gt;&lt;li&gt;one application works in IE and Opera, but not Firefox (could be fixed with a GreaseMonkey script?)&lt;/li&gt;&lt;li&gt;one application does not work in Opera because of how they implement(ed) display:none in CSS for images&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are some applications that do make sense in the Web 2.0 world. However, there are also things that are better off in a "thick" client that is forced to adhere to a strict window API/widget toolkit. People have been conditioned, for good reason, to not trust the Internet and that is the reason why all the browsers either include anti-phishing, anti-hacking, ad blocking, flash blocking, JavaScript blocking, fraud protection, content blocking, etc. via add-on or built-in. Combine that with the straight fact that CSS, JavaScript, DOM and default fonts are not the same and/or do not work the same way on IE6, IE7, Firefox, Opera, etc. and that, IMHO, is why web based applications that try to do too much, fail (and piss me off).&lt;/p&gt;&lt;p&gt;Oh, and don't get me started on how security and personal identity security has been handled in this new, networked and Internet world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2144109095818362767?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2144109095818362767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2144109095818362767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2144109095818362767'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/07/web-2blow.html' title='Web 2.blow'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8443492078457004559</id><published>2008-06-16T11:51:00.000-04:00</published><updated>2009-05-27T14:11:34.697-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Lots, defined</title><content type='html'>Do you know the drill when you are ordering Lleb ocaT? You drive up to the menu and wait for someone to say something along the lines of "how are you doing?" instead of something like "welcome to Lleb ocaT can I take your order please?" I can understand if they want to shorten it to "welcome, may I take your order?" but most times when I get that fake drive-thru ice breaker I sit there after my brief "fine" answer waiting for someone to ask me what I'd want to force down. You then order your "food" and/or beverages, proceed to one of perhaps two windows, pay, get a drink shoved in your face, get your change, and then they ask "any mild or hot sauce?" as they are ready to toss the food bag at you.&lt;/p&gt;&lt;p&gt;I always reply "lots of hot sauce please".&lt;/p&gt;&lt;p&gt;Unfortunately there appear to be very few Lleb ocaT franchises that understand what "lots" means. In my opinion, there are four responses to the "sauce" question: none, some, yes (enough or adequate), or lots.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;"None" is self explanatory. The taste of the product is adequate, you can stomach it without the need for sauce, or you have more powerful chemical additives at home.&lt;/li&gt;&lt;li&gt;"Some" indicates you need at least a couple to either enhance the flavor of the food product, toys for the kids to play with, or would feel cheated if you didn't ask for some sauce.&lt;/li&gt;&lt;li&gt;"Yes" indicates you will need at least one sauce package per food item. This would most likely be the formula agreed to by management to equally appease customers flavorfully and parent company stockholders and franchise ownership fiscally; multiplied by 1.3275 rounding up.&lt;/li&gt;&lt;li&gt;"Lots" indicate that you either need to strongly mask the flavor of the food product or are so frakkin' hungry every ounce of sauce, food product, and wrapper scrapings are required to nourish you. This realistically means at least one per taco sized item and two to four per burrito depending upon burrito size and how much refried bean food product is in the burrito.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So today I order two burritos and three soft tacos, ask for "lots" of hot sauce and I'm given a whopping four plus no napkins to clean up with afterwards. Wow. Did you spit in the food as well?&lt;/p&gt;&lt;p&gt;I know how food service works. There are bean counters that know exactly what volume of soft drink to push, exactly how much product to deliver, exactly how many bags you should use and how many condiment packages you should put in with the order on request. They are looking at numbers under a microscope. Somewhere someone is saying "if we reduce the sauce packages by one per order we save 22/100 th of a cent in sauce and 1 and 13/100 th of a cent in manufacturing and 8 cents in advertisement per order. If you multiply times the average of 300 orders per day the franchise and stockholders can save over ten thousand dollars per year in just hot sauce packet count reduction. Do the same for "mild" and "fire" that would be a net savings of over thirty thousand dollars. If we assume our customers are slobs and reduce the napkin output per bag we can save the franchise and stockholders another twenty thousand dollars per year. Just in the United States alone, the estimated savings is a lot of money; probably over a trillion dollars. We could knock out the national debt in three years just by shafting the customer out of a hot sauce and napkin every single day."&lt;/p&gt;&lt;p&gt;Wow.&lt;/p&gt;&lt;p&gt;I think I'll just go to S'ydnew next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8443492078457004559?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8443492078457004559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8443492078457004559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8443492078457004559'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/06/lots-defined.html' title='Lots, defined'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5929344098162409685</id><published>2008-06-10T05:56:00.001-04:00</published><updated>2008-06-10T10:18:30.229-04:00</updated><title type='text'>Quickie update</title><content type='html'>Felt like a quick update.&lt;/p&gt;&lt;h4&gt;Life in general&lt;/h4&gt;&lt;p&gt;I usually try to keep my personal life out of the public only occasionally making reference to my job or home life. My personal life is just that, personal. I'm not some MySpace or YouTube attention whore that needs to pine endlessly about what Jason the boy stud did in study hall today. Things are getting better, though.&lt;/p&gt;&lt;h4&gt;The Blog of the Dead&lt;/h4&gt;&lt;p&gt;I am slowly attempting to catch up to the present times with my story blog. I have a large segment in December 2007 completed but need to fill in that piece with the story ending in October 2007. I usually have two or three different story pieces going at the same time depending on where I'm at when I get creative. There was one on the laptop and one on my main workstation. I use a USB drive to keep things in sync. I keep names, locations and an event timeline in an Excel spreadsheet.&lt;/p&gt;&lt;h4&gt;Technology&lt;/h4&gt;&lt;p&gt;Sometimes I wonder if I'm a glutton for punishment or just too stubborn to do anything differently.&lt;/p&gt;&lt;p&gt;I have two, high-powered machines at home: AMD X2 processors, one with 8GB of memory, one with 4GB of memory, both with infinitely more disk than they will ever need. I am installing Ubuntu 8.04 LTS server 64-bit on each of them. So why does this make me a glutton for punishment? Well, on one I am going to be installing VMWare and on the other I will be installing Oracle 10g database. VMWare is not guaranteed to work on the kernel Ubuntu 8.04 LTS server 64-bit is using and not really guaranteed to work on Ubuntu, period. Oracle 10g database is only supposed and to be used and installed on Red Hat Enterprise Linux or SUSE Linux Enterprise Server. Instead of using either of those two (they cost money, BTW), or using the free version of one (OpenSUSE), or one of the downstream distributions from Red Hat (Oracle Linux, Cent OS), I chose to use a different distribution and then scour the clicker-web looking for ways to force it to work with VMWare and Oracle database. Just by using the 64 bit version of Ubuntu is inviting pain, suffering and trouble. The X-Server 64 bit version does not work the same way as the 32 bit version on the same hardware. The 64 bit nVidia drivers are worse.&lt;/p&gt;&lt;p&gt;So why do I do this? Why not install Oracle database on Oracle Linux? Why not install VMWare on a kernel and distribution they support instead of searching far and wide looking for the patch and notes on how to install it?&lt;/p&gt;&lt;p&gt;I must be sick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5929344098162409685?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5929344098162409685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5929344098162409685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5929344098162409685'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/06/quickie-update.html' title='Quickie update'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1564761097389559724</id><published>2008-06-04T11:37:00.003-04:00</published><updated>2009-05-27T19:58:10.643-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Chili recipes</title><content type='html'>Just creating a blog post containing tasty chili recipes I've collected. If you stumble upon this and have one then leave a comment with a recipe or URL to one.&lt;h4&gt;Turkey and Chicken Chili&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;1 lb boneless skinless chicken breast&lt;/li&gt;&lt;li&gt;1 lb turkey sausage (breakfast)&lt;/li&gt;&lt;li&gt;1 can chili beans&lt;/li&gt;&lt;li&gt;1 can diced tomatoes (Del Monte "zesty chili style")&lt;/li&gt;&lt;li&gt;1 small can tomato paste&lt;/li&gt;&lt;li&gt;1 pkg chili seasoning&lt;/li&gt;&lt;li&gt;1/2 red onion, diced&lt;/li&gt;&lt;li&gt;1/2 red bell pepper&lt;/li&gt;&lt;li&gt;2 tbsp chili powder&lt;/li&gt;&lt;li&gt;1 tbsp salt&lt;/li&gt;&lt;li&gt;1 tbsp pepper&lt;/li&gt;&lt;li&gt;1 tsp crushed red pepper&lt;/li&gt;&lt;li&gt;1 tbsp cilantro&lt;/li&gt;&lt;li&gt;1 tsp garlic powder&lt;/li&gt;&lt;/ul&gt;Pan fry the sausage with the red onion until brown. Boil the chicken until it's tender enough to be shredded. Combine the meat in a pan and add 1 cup of water and the seasoning packet. Reduce until water is almost completely gone. Add in everything else however you want.&lt;/p&gt;&lt;p&gt;Can be topped with shredded cheese, sour cream and/or chives and served with cornbread on the side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1564761097389559724?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1564761097389559724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1564761097389559724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1564761097389559724'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/06/chili-recipes.html' title='Chili recipes'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6329527324296884866</id><published>2008-06-03T07:45:00.000-04:00</published><updated>2009-05-27T20:55:49.765-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Worth Quoting</title><content type='html'>Dave Barry on the Economic Stimulus Payment&lt;/p&gt;&lt;p&gt;This year, taxpayers will receive an Economic Stimulus Payment. This is a very exciting new program that I will explain using the Q and A format:&lt;/p&gt;&lt;p&gt;Q. What is an Economic Stimulus Payment?&lt;br /&gt;A. It is money that the federal government will send to taxpayers.&lt;/p&gt;&lt;p&gt;Q. Where will the government get this money?&lt;br /&gt;A. From taxpayers.&lt;/p&gt;&lt;p&gt;Q. So the government is giving me back my own money?&lt;br /&gt;A. Only a smidgen.&lt;/p&gt;&lt;p&gt;Q. What is the purpose of this payment?&lt;br /&gt;A. The plan is that you will use the money to purchase a high-definition TV set, thus stimulating the economy.&lt;/p&gt;&lt;p&gt;Q. But isn't that stimulating the economies of China and Japan?&lt;br /&gt;A. Shut up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6329527324296884866?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6329527324296884866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6329527324296884866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6329527324296884866'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/06/worth-quoting.html' title='Worth Quoting'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7029484587892105639</id><published>2008-05-24T22:06:00.003-04:00</published><updated>2008-08-04T08:32:02.741-04:00</updated><title type='text'>Computer hell</title><content type='html'>Friday night was a damn crummy night for me and my computers.&lt;/p&gt;&lt;p&gt;The first pile of crap I had to deal with was the 64 bit server version of Ubuntu. I have a powerhouse AMD X2 machine with 8GB of memory and 900 gigabytes of disk (500, 200 and 200). This machine will be dedicated to running VMWare Server and various groups of virtual machines for developmental purposes. I had the new 8.04 LTS edition. I installed using LVM leaving extra space for expansion of logical volumes if necessary.&lt;/p&gt;&lt;p&gt;The first problem was GRUB wouldn’t do anything.  Reboot, black screen, nothing. I altered the installation to install LILO and things worked this time. It was a minor annoyance but foreshadowed pain to come. I needed a desktop for VMWare so I decided to try KDE by installing the kubuntu-desktop package. There were four warnings issued during the installation. When I rebooted, LILO simply puked a bunch of 99’s on the screen then died. Great. I’ll try again later.&lt;/p&gt;&lt;p&gt;I just purchased a 24” wide screen LCD to replace the LCD one of our cats puked on and rendered non-operational. One of the problems with the large surface area of the desktop is that the styles that come with Windows XP are dull and look like crap. Some people at work have some really nice desktops so I figured I would find a nice them online, install it and bask in my coolness.&lt;/p&gt;&lt;p&gt;I went to a place called ThemeXP. I’m not going to provide a link, you’ll find out why later. I downloaded two themes in the form of executables. I assumed they were installers. When I tried installing them I was greeted by a pop-up window that explained these files had been “wrapped” and that you had to agree to services, etc. In short it was “f***-no” terminology.&lt;/p&gt;&lt;p&gt;I did some more investigation and found a link buried at the bottom that indicated some files were “wrapped” to defer operational cost through advertisements. Nice. We can really trust those advertisers. They have a stellar history of not trying to f*** over computer users. I cancel the install and look elsewhere. Then I noticed my hard drive just chattering away. Then AVG pops up a virus warning. I quickly do a process list and kill a msin.tmp process that was spawned by this “wrapper” program. More and more AVG pop-ups with files infected with the Win32/Gaelicum.A virus. My hell was just beginning.&lt;/p&gt;&lt;p&gt;I unplugged the network cable and booted a clean machine while scanning the infected one. The Win32/Gaelicum.A virus is a nasty little bastard that infects .exe files and is network aware. Grisoft had a cleaner utility to download and run in safe-mode. The problem, however, was that Grisoft AVG anti-virus had moved all infected executables to their virus vault; including the executable to manage the virus vault. So I can’t get the executables out of the vault to run the cleaner utility on them. Well that was just great.&lt;/p&gt;&lt;p&gt;I had to sleep on it. I was beyond furious.&lt;/p&gt;&lt;p&gt;So how did I fix it? In short: remove the infected drive from the computer and place it in a portable enclosure. Attach that drive via USB to a clean computer running the same software, copy AVG and Windows executables from the clean machine to the infected drive, copy vcleaner to the infected drive, detach the drive, install the drive back into the machine, boot, run the virus vault utility, take the infected executables out of the vault, reboot in safe mode, run vcleaner, reboot, scan again, test executables.&lt;/p&gt;&lt;p&gt;Whew.&lt;/p&gt;&lt;p&gt;Damage was minimal. Some things won’t uninstall due to corrupt binaries and I had to reinstall 7-zip.&lt;/p&gt;&lt;p&gt;I am a computer professional and I almost had my entire computer f***ed because I wanted a nicer looking desktop. I sent a mail message to themexp explaining what happened and haven’t heard back from them. Rot in hell. There is so much garbage out there that if you see a screen saver or theme or program somewhere just don’t install it. Don’t let your kids install screen savers or programs. If they do then punishment is no games and no Internet unless you need it for school. Don’t let you parents click on things unless you put them there to click on. If you are using a work computer just don’t install anything and if you employer blocks sites don’t bitch about it. Also, consider installing WOT (Web of Trust) or similar browser plug-ins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7029484587892105639?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7029484587892105639' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7029484587892105639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7029484587892105639'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/05/computer-hell.html' title='Computer hell'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4496794836731354984</id><published>2008-05-06T08:18:00.000-04:00</published><updated>2009-05-27T20:55:49.765-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Work and prison</title><content type='html'>When you think about the differences between work and prison, maybe prison isn't so bad...&lt;/p&gt;&lt;p&gt;IN PRISON.......You spend the majority of your time in an 8x10 cell.&lt;br /&gt;AT WORK........You spend most of your time in a 6x8 cubicle.&lt;/p&gt;&lt;p&gt;IN PRISON.......You get three meals a day.&lt;br /&gt;AT WORK........You get a break for 1 meal and you have to pay for it.&lt;/p&gt;&lt;p&gt;IN PRISON.......You get time off for good behavior.&lt;br /&gt;AT WORK........You get rewarded for good behavior with more work.&lt;/p&gt;&lt;p&gt;IN PRISON.......A guard locks and unlocks all the doors for you.&lt;br /&gt;AT WORK........You must carry around a security card and unlock and open all the doors yourself.&lt;/p&gt;&lt;p&gt;IN PRISON........You can watch TV and play games.&lt;br /&gt;AT WORK.........You get fired for watching TV and playing games.&lt;/p&gt;&lt;p&gt;IN PRISON.......You get your own toilet.&lt;br /&gt;AT WORK........You have to share.&lt;/p&gt;&lt;p&gt;IN PRISON.......They allow your family and friends to visit.&lt;br /&gt;AT WORK........You cannot even speak to your family and friends.&lt;/p&gt;&lt;p&gt;IN PRISON.......All expenses are paid by taxpayers with no work required.&lt;br /&gt;AT WORK........You get to pay all the expenses to go to work and then they deduct taxes from your salary to pay for prisoners.&lt;/p&gt;&lt;p&gt;IN PRISON.......You spend most of your life looking through bars from inside wanting to get out.&lt;br /&gt;AT WORK........You spend most of your time wanting to get out and go inside bars.&lt;/p&gt;&lt;p&gt;IN PRISON......There are wardens who are often sadistic.&lt;br /&gt;AT WORK.......They are called supervisors.&lt;/p&gt;&lt;p&gt;IN PRISON.......You have unlimited time to read e-mail jokes.&lt;br /&gt;AT WORK........You get fired if you get caught.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4496794836731354984?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4496794836731354984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4496794836731354984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4496794836731354984'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/05/work-and-prison.html' title='Work and prison'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1375988465134061487</id><published>2008-03-02T14:47:00.002-05:00</published><updated>2008-03-02T14:51:15.444-05:00</updated><title type='text'>Hello I'm Hillarobamy Clibama</title><content type='html'>"Hello, I'm Hillary Clinton"&lt;/p&gt;&lt;p&gt;"Hello, I'm Barack Obama"&lt;/p&gt;&lt;p&gt;Anybody else getting sick and damned tired of coming home and having to clear off at least one voice mail message every damned day? Anyone else frustrated at getting awakened during your lazy Sunday nap by the auto-dialers setup up by supporters of the Presidential hopefuls? I just did a Google search and evidently I'm not the only person sick of this crap.&lt;/p&gt;&lt;p&gt;Now that Texas and Ohio are suddenly important to Hillary and Obama, my home phone is getting at least one call a day. My girlfriend's dad was getting even more calls. Apparently, other places like New Hampshire have had the same problem. Most of the New Hampshire newspapers have printed letters from unhappy voters (and non-voters), many of whom simply said "I'm voting for this candidate" just to get the callers off their backs.&lt;/p&gt;&lt;p&gt;Guess what, dumb-asses. I can't stand any of the four remaining candidates for President. Clinton is all talk. Obama is another talker, just more aligned to future ideals that will be squashed by the remaining two branches. Huckabee is nut. McCain has some decent aspects but about as much charisma as tree bark; and "true conservatives" don't care for him anyways.&lt;/p&gt;&lt;p&gt;How did we end up with these four?&lt;/p&gt;&lt;p&gt;I'd consider libertarian again but the current crop of candidates for President and other offices makes me cringe. Again, is that the best you could find; what looks like a used car salesman, a Seinfeld extra, a crypt keeper, and a roller derby cross-dresser.&lt;/p&gt;&lt;p&gt;Anybody else out there just begging for consensus? Do you want to see something besides the conservative and liberal war parties fighting for this all-or-nothing cause when a democracy should build upon the commonalities between the people and place power of the government where it logically belongs? Anybody else believe that there is a place for big government, local government, and no-government?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1375988465134061487?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1375988465134061487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1375988465134061487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1375988465134061487'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/03/hello-im-hillarobamy-clibama.html' title='Hello I&apos;m Hillarobamy Clibama'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-783289393998045815</id><published>2008-02-26T06:39:00.000-05:00</published><updated>2009-05-27T20:55:49.765-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>A few jokes</title><content type='html'>Just a few jokes for today...&lt;/p&gt;&lt;h4&gt;HAVE YOU FORGIVEN YOUR ENEMIES?......&lt;/h4&gt;&lt;p&gt;Toward the end of the church service, the minister asked, "How many of you have forgiven your enemies?" About 80% held up their hands. The minister then repeated the question and all responded by raising their hands except one small, elderly lady.&lt;/p&gt;&lt;p&gt;"Mrs. Jones? Are you not willing to forgive your enemies?", the minister asked.&lt;/p&gt;&lt;p&gt;"I don't have any", she replied, smiling sweetly.&lt;/p&gt;&lt;p&gt;"Mrs. Jones, that is indeed unusual. How old are you?"&lt;/p&gt;&lt;p&gt;"Ninety-eight" she replied.&lt;/p&gt;&lt;p&gt;"Mrs. Jones, would you come down front and tell the congregation how a person can live for ninety-eight years and not have an enemy in the world?"&lt;/p&gt;&lt;p&gt;The little lady tottered down the aisle, faced the congregation, smiled sweetly and said, "I outlived the bitches."&lt;/p&gt;&lt;h4&gt;HOW TO POOP AT WORK&lt;/h4&gt;&lt;p&gt;We've all been there but don't like to admit it. We've all kicked back in our cubicles and suddenly felt something brewing down below. As much as we try to convince ourselves otherwise, the WORK POOP is inevitable. For those who hate pooping at work, following is the Survival Guide for taking a dump at work.&lt;dl&gt;&lt;dt&gt;CROP DUSTING&lt;/dt&gt;&lt;dd&gt;When farting, you walk briskly around the office so the smell is not in your area and everyone else gets a whiff but doesn't know where it  came from. Be careful when you do this. Do not stop until the full fart has been expelled. Walk an extra 30 feet to make sure the smell has left your pants.&lt;/dd&gt;&lt;dt&gt;FLY BY&lt;/dt&gt;&lt;dd&gt;The act of scouting out a bathroom before pooping. Walk in and check for other poopers. If there are others in the bathroom, leave and come back again. Be careful not to become a FREQUENT FLYER. People may become suspicious if they catch you constantly going into the bathroom.&lt;/dd&gt;&lt;dt&gt;ESCAPEE&lt;/dt&gt;&lt;dd&gt;A fart that slips out while taking a leak at the urinal or forcing a poop in a stall. This is usually accompanied by a sudden wave of embarrassment. If you release an escapee, do not acknowledge it. Pretend it did not happen. If you are standing next to the farter in the urinal, pretend you did not hear it. No one likes an escapee. It is uncomfortable for all involved. Making a joke or laughing makes both parties feel uneasy.&lt;/dd&gt;&lt;dt&gt;JAILBREAK&lt;/dt&gt;&lt;dd&gt;When forcing a poop, several farts slip out at a machine gun pace. This is usually a side effect of diarrhea or a hangover. If this should happen, do not panic. Remain in the stall until everyone has left the bathroom to spare everyone the awkwardness of what just occurred.&lt;/dd&gt;&lt;dt&gt;COURTESY FLUSH&lt;/dt&gt;&lt;dd&gt;The act of flushing the toilet the instant the poop hits the water. This reduces the amount of air time the poop has to stink up the bathroom. This can help you avoid being caught doing the WALK OF SHAME.&lt;/dd&gt;&lt;dt&gt;WALK OF SHAME&lt;/dt&gt;&lt;dd&gt;Walking from the stall, to the sink, to the door after you have just stunk up the bathroom. This can be a very uncomfortable moment if someone walks in and busts you. As with farts, it is best to pretend that the smell does not exist. Can be avoided with the use of the COURTESY FLUSH.&lt;/dd&gt;&lt;dt&gt;OUT OF THE CLOSET POOPER&lt;/dt&gt;&lt;dd&gt;A colleague who poops at work and is damn proud of it. You will often see an Out Of The Closet Pooper enter the bathroom with a newspaper or magazine under his or her arm. Always look around the office for the Out Of The Closet Pooper before entering the bathroom.&lt;/dd&gt;&lt;dt&gt;THE POOPING FRIENDS NETWORK (P.F.N)&lt;/dt&gt;&lt;dd&gt;A group of co-workers who band together to ensure emergency pooping goes off without incident. This group can help you to monitor the whereabouts of Out Of The Closet Poopers, and identify SAFE HAVENS.&lt;/dd&gt;&lt;dt&gt;SAFE HAVENS&lt;/dt&gt;&lt;dd&gt;A seldom used bathroom somewhere in the building where you can least expect visitors. Try floors that are predominantly of the opposite sex. This will reduce the odds of a pooper of your sex entering the bathroom.&lt;/dd&gt;&lt;dt&gt;TURD BURGLAR&lt;/dt&gt;&lt;dd&gt;Someone who does not realize that you are in the stall and tries to force the door open. This is one of the most shocking and vulnerable moments that can occur when taking a poop at work. If this occurs, remain in the stall until the Turd Burglar leaves. This way you will avoid all uncomfortable eye contact.&lt;/dd&gt;&lt;dt&gt;CAMO-COUGH&lt;/dt&gt;&lt;dd&gt;A phony cough that alerts all new entrants into the bathroom that you are in a stall. This can be used to cover-up a WATERMELON, or to alert potential Turd Burglars. Very effective when used in conjunction with an ASTAIRE.&lt;/dd&gt;&lt;dt&gt;ASTAIRE&lt;/dt&gt;&lt;dd&gt;A subtle toe-tap that is used to alert potential Turd Burglars that you are occupying a stall. This will remove all doubt that the stall is occupied. If you hear an Astaire, leave the bathroom immediately so the pooper can poop in peace.&lt;/dd&gt;&lt;dt&gt;WATERMELON&lt;/dt&gt;&lt;dd&gt;A poop that creates a loud splash when hitting the toilet water. This is also an embarrassing incident. If you feel a Watermelon coming on, create a diversion. See CAMO-COUGH.&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-783289393998045815?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=783289393998045815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/783289393998045815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/783289393998045815'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/02/few-jokes.html' title='A few jokes'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-9090454735554698946</id><published>2008-02-22T18:17:00.002-05:00</published><updated>2008-02-22T18:25:13.839-05:00</updated><title type='text'>Windows networking fun</title><content type='html'>This is a partial topic, a work in progress so to speak...&lt;/p&gt;&lt;p&gt;For the server: in registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser\Parameters set the string values for &lt;span style="font-weight:bold;"&gt;IsDomainMaster&lt;/span&gt; = TRUE and &lt;span style="font-weight:bold;"&gt;MaintainServerList&lt;/span&gt; = Yes&lt;/p&gt;&lt;p&gt;For all workstations: in registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser\Parameters set the string values for &lt;span style="font-weight:bold;"&gt;IsDomainMaster&lt;/span&gt; = FALSE and &lt;span style="font-weight:bold;"&gt;MaintainServerList&lt;/span&gt; = No&lt;/p&gt;&lt;p&gt;Related links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/188001"&gt;Description of the Microsoft Computer Browser Service&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-9090454735554698946?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=9090454735554698946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9090454735554698946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/9090454735554698946'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/02/windows-networking-fun.html' title='Windows networking fun'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5436033058805020502</id><published>2008-02-15T14:54:00.000-05:00</published><updated>2009-05-27T20:55:49.766-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>A parable worth reading</title><content type='html'>This came to my work mail address a while back...&lt;/p&gt;&lt;p&gt;A Japanese company (Toyota) and an American company (General Motors) decided to have a canoe race on the Missouri River. Both teams practiced long and hard to reach their peak performance before the race.&lt;/p&gt;&lt;p&gt;On the big day, the Japanese won by a mile. The Americans, very discouraged and depressed, decided to investigate the reason for the crushing defeat. A management team made up of senior management was formed to investigate and recommend appropriate action.&lt;/p&gt;&lt;p&gt;Their conclusion was the Japanese had 8 people rowing and 1 person steering, while the American team had 8 people steering and 1 person rowing. Feeling a deeper study was in order, American management hired a consulting company and paid them a large amount of money for a second opinion.&lt;/p&gt;&lt;p&gt;They advised, of course, that too many people were steering the boat, while not enough people were rowing.  Not sure of how to utilize that information, but wanting to prevent another loss to the Japanese, the rowing team's management structure was totally reorganized to 4 steering supervisors, 3 area steering superintendents and 1 assistant superintendent steering manager. They also implemented a new performance system that would give the 1 person rowing the boat greater incentive to work harder.? It was called the 'Rowing Team Quality First Program,' with meetings, dinners and free pens for the rower. There was discussion of getting new paddles, canoes and other equipment, extra vacation days for practices and bonuses.&lt;/p&gt;&lt;p&gt;The next year the Japanese won by two miles. Humiliated, the American management laid off the rower for poor performance, halted development of a new canoe, sold the paddles, and canceled all capital investments for new equipment. The money saved was distributed to the senior executives as bonuses and the next year's racing team was outsourced to India.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5436033058805020502?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5436033058805020502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5436033058805020502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5436033058805020502'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/02/parable-worth-reading.html' title='A parable worth reading'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7736309344610147317</id><published>2008-02-07T13:31:00.000-05:00</published><updated>2009-05-27T15:19:19.010-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>ORA-22992 Oracle hell</title><content type='html'>Welcome to my little corner of hell today. A third party vendor changed their tables structures recently, adding a CLOB field to some of their tables. Like most hard working technical folk we have had to write a lot of new code to provide functionality the third party vendor does not and will not provide. So some perfectly good ANSI standard SQL suddenly puked out a "ORA-22992: cannot use LOB locators selected from remote tables" error.&lt;/p&gt;&lt;p&gt;I'm not using any LOB's in the queries so why in the blue heck does Oracle want to their LOB locators? I did a search and thankfully found where someone on &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=2235210"&gt;Oracle's forums&lt;/a&gt; just tried to use the WHERE clause to join instead of the JOIN statement and it worked. I tried it on and sure enough, it worked. It goes something like this:&lt;/p&gt;&lt;pre&gt;table1&lt;br /&gt;crap1 VARCHAR2(10)&lt;br /&gt;crap2 DATE&lt;br /&gt;&lt;br /&gt;table2&lt;br /&gt;poop1 VARCHAR2(10)&lt;br /&gt;poop2 DATE&lt;br /&gt;poop3 CLOB&lt;br /&gt;&lt;br /&gt;SELECT crap2,poop2&lt;br /&gt;FROM table1@remote JOIN table2@remote ON crap1 = poop1;&lt;br /&gt;&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-22992: cannot use LOB locators selected from remote tables&lt;br /&gt;&lt;br /&gt;SELECT crap2,poop2&lt;br /&gt;FROM table1@remote, table2@remote WHERE crap1 = poop1;&lt;br /&gt;&lt;br /&gt;data&lt;br /&gt;glorious data&lt;/pre&gt;&lt;p&gt;There is nothing we geeks hate more than code that should work but doesn't. Especially when the people we work for are paying five, six, seven or more figures for this software. The problem was originally noticed over two and a half years ago!&lt;/p&gt;&lt;p&gt;M*^!@f^((#&amp;$&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7736309344610147317?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7736309344610147317' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7736309344610147317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7736309344610147317'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2008/02/ora-22992-oracle-hell.html' title='ORA-22992 Oracle hell'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-4146535826375378618</id><published>2007-11-06T12:07:00.000-05:00</published><updated>2007-11-06T12:44:26.071-05:00</updated><title type='text'>Customizable classes for objects</title><content type='html'>&lt;span style="font-style:italic;"&gt;Thoughts on object oriented programming, classes, objects and polymorphism&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I am in the middle of a project that involves code from another organization. This organization is trying to make their code as flexible as possible through configuration settings, user only classes and templates. I also maintain code for another system from another organization that provides no flexibility for customization of code. I starting thinking, did some Google searches, and didn't find anything; so I'm putting my thoughts here.&lt;/p&gt;&lt;p&gt;The typical class design model I see in all media is the base class containing all the base functionality then you extend that class one or more times to provide additional logic. So myFoo extends Foo. Foo contains a lot of good methods and logic but my organization needs one additional property and method; myFoo is created. Here is where I start thinking this sucks. Any class that instantiates Foo, must now instantiate myFoo instead. &lt;/p&gt;&lt;p&gt;If the external organization delivers those classes we changed to use myFoo, now we must go back and make those changes again.&lt;/p&gt;&lt;p&gt;Wouldn't it make sense to deliver a Foo that extends a baseFoo, have all the classes that use Foo just use Foo? The developing organization makes changes to the baseFoo classes and the customizing organizations make customizations to the Foo classes.&lt;/p&gt;&lt;p&gt;This method of class design is just as vulnerable to catastrophic changes as the widely taught method. If you change the data schema you will still need to change the data objects, business objects, presentation objects, etc. Nothing will prevent that mess for occurring or, well, being a mess. If, however, a hundred classes use Foo would it make sense to change all (or ones that need) to use myFoo?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-4146535826375378618?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=4146535826375378618' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4146535826375378618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/4146535826375378618'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/11/customizable-classes-for-objects.html' title='Customizable classes for objects'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5619538573995619182</id><published>2007-10-23T18:16:00.000-04:00</published><updated>2007-10-23T18:29:16.400-04:00</updated><title type='text'>Blast from the past</title><content type='html'>I came across some really old "vanity web page" crap I did back in 1998. It was just a start and never got published but, hey.&lt;/p&gt;&lt;h4&gt;Bachelor Necessities&lt;/h4&gt;&lt;p&gt;As a bachelor with many (too many) years of experience I feel it is my duty to document my experience somewhere. For those of you about ready to embark on the journey of bachelor life or those already on the trodden path, here are some things you might want to pick up along the way.&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;A Mini Fridge&lt;/dt&gt;&lt;dd&gt;This really isn't a necessity but something, for some strange mystical reason, a guy must have. Typical uses: beer. Typical placement: garage, basement, bedroom, television room - wherever you spend the most time. Estimated cost, $100.&lt;/dd&gt;&lt;dt&gt;George Foreman Grill&lt;/dt&gt;&lt;dd&gt;God bless you George "look at the lines, that's good eatin'" Foreman. This little bugger is so helpful and so easy to use any guy, no matter how dumb you are, can master one. Doesn't do a good job on steaks with bones in them but is perfect for frozen chicken breasts (don't bother thawing, just chuck'em on), burgers, fish, and just about all meats. Estimated cost, about $70.&lt;/dd&gt;&lt;dt&gt;An Outdoor Grill&lt;/dt&gt;&lt;dd&gt;You can go propane but you'll find you get the most use out of a small charcoal grill you can take with you in your car or let rust on your back porch/front step. Estimated cost, about $30.&lt;/dd&gt;&lt;dt&gt;Crock Pot&lt;/dt&gt;&lt;dd&gt;Another gift from the heavens to the bachelor. Just follow the recipes that come with the device. So easy, I was actually able to teach my dumb-ass complete waste of an ex-friend "L" how to cook. See my chili recipe. Estimated cost, about $40.&lt;/dd&gt;&lt;dt&gt;Microwave&lt;/dt&gt;&lt;dd&gt;Like, duh. Just buy a good one then treat it well and it will outlast you, all the women you are intimate with, and probably every dwelling you'll ever be in (even your casket). Estimated cost, who the hell knows - I bought mine ten years ago.&lt;/dd&gt;&lt;dt&gt;Big Screen TV&lt;/dt&gt;&lt;dd&gt;Even if you are stuck in the bedroom of your parent's house, you need a big screen TV. The big screen TV represents the following: a symbol of your manliness you can share with friends at football parties, a showcase for your best DVD movies and/or your porn collection, and a constant reminder of just how in debt you really are. Estimated cost, about $3600 (gotta get a good one, man).&lt;/dd&gt;&lt;/dl&gt;&lt;H4&gt;Chili ala' Grouch&lt;/H4&gt;&lt;P&gt;If you read my "bachelor necessities" above you should have noticed a crock-pot as one of the items there. This is what I use because a) I'm lazy, b) I'm a guy and need the flexibility of a crock-pot to hide my cooking inadequacies.&lt;/P&gt;&lt;p&gt;&lt;b&gt;Ingredients&lt;/b&gt;&lt;/p&gt;&lt;UL&gt;&lt;LI&gt;Two pounds of ground chuck or ground round (i.e. raw hamburger)&lt;/LI&gt;&lt;LI&gt;A can of chili beans&lt;/LI&gt;&lt;LI&gt;A can of tomato sauce (name brand, no generic)&lt;/LI&gt;&lt;LI&gt;A can of tomato paste&lt;/LI&gt;&lt;LI&gt;A can of diced tomatoes (or cut up a bunch of tomatoes, no seeds)&lt;/LI&gt;&lt;LI&gt;A can of green chilies (usually found in "Mexican" section)&lt;/LI&gt;&lt;LI&gt;One stalk of celery&lt;/LI&gt;&lt;LI&gt;One onion&lt;/LI&gt;&lt;LI&gt;Two green peppers&lt;/LI&gt;&lt;LI&gt;One jalapeno pepper&lt;/LI&gt;&lt;LI&gt;Two or more cloves of garlic (comes in bulbs, peel them to get cloves)&lt;/LI&gt;&lt;LI&gt;Chili powder (spice)&lt;/LI&gt;&lt;LI&gt;Pepper (the kind you shake)&lt;/LI&gt;&lt;LI&gt;One bay leaf (another spice) or Chinese 5-spice (yes, a it's a spice too)&lt;/LI&gt;&lt;LI&gt;Cumin (a spice)&lt;/LI&gt;&lt;/UL&gt;&lt;p&gt;&lt;b&gt;Instructions&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Brown the ground beef (this means you cook the hamburger until it turns brown, I had a family member that wondered why his chili had so much blood at the top - he was adding it raw).  Here is how I do it: a) throw the wad on my George Foreman Grill, b) insert the sliced cloves of garlic into the meat, c) liberally add pepper and chili powder, d) grill, e) crumble into the crock pot.&lt;/li&gt;&lt;li&gt;While your biff is browning, cut up the veggies.  Put the onion, celery, and jalapeno (and garlic) into the crock.&lt;/li&gt;&lt;li&gt;Open the cans.  Dump in the green chilies.  &lt;/li&gt;&lt;li&gt;Drain the grease from the beef (or don't, I don't care) and put it in the pot.&lt;/li&gt;&lt;li&gt;Add the bay leaf (or a couple shakes of 5-spice), a pinch of cumin, some pepper, some chili powder.&lt;/li&gt;&lt;li&gt;Dump in the tomato paste, then beans, then tomato sauce, then rinse cans with about a cup (measuring cup, i.e. a little bit) of water then dump into crock.&lt;/li&gt;&lt;li&gt;Start cookin (5-7 hours on high, 10-12 hours on low).&lt;/li&gt;&lt;li&gt;About one (high) or two (low) hours before the chili is done, stir in the green peppers.  The reason I do this is because when I added the peppers at the beginning that's all I could taste in the chili - green peppers.&lt;/li&gt;&lt;li&gt;When done cooking, serve hot and enjoy with a beer.  Don't ruin with crackers or I'll shoot you.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;Variations&lt;/b&gt;: Tex/Mex". Replace can of chili beans, stalk of celery, and green peppers with black and/or pinto beans, a half a can of corn, a red pepper and a yellow pepper.  Unlike the chili beans (which usually come in a sauce), you should drain and wash the black/pinto beans.&lt;/p&gt;&lt;h4&gt;Dealing with Depression&lt;/h4&gt;&lt;P&gt;If you are like me, and (according to some news sources) like over thirty percent of the population in the United States, you deal with depression on (sometimes) a daily basis. These feelings usually manifest themselves in the form of feelings of hopelessness or you might feel tired all the time.&lt;/P&gt;&lt;P&gt;What not to do.&lt;/P&gt;&lt;P&gt;Drugs are NOT the Answer.&lt;/P&gt;&lt;P&gt;When I say drugs I am describing anything from prescription drugs like Prozac to binge drinking. Drugs are only a temporary solution to the problem and usually make things worse. I have seen some co-workers on the drug Prozac and they are both psychos, one step away from full-out fruitcake. I have family members on different prescriptions and they aren't any better. One has been on various prescriptions for twenty (yes, 20) years. The physicians just keep giving him the line "let's try this one". These quacks have no idea what they are doing, they just continue to milk the system. One of my friends smoked marijuana (i.e. pot, reefer, weed) to escape his depression. That loser is still depressed and now half his tenth-grade brain is gone. The common thread is that all of these people are still taking drugs and they are all still just as depressed, if not more than they ever were.&lt;/P&gt;&lt;P&gt;Shrinks are NOT the Answer&lt;/P&gt;&lt;P&gt;If you a rock star or some wealthy Hollywood name, then a "shrink" might work for you. For the rest of us that need to work for a living, you might as well just stop someone on the street or sit next to someone at a fast food joint because you are likely to get the same answers. Basically you pay a "shrink" to listen and make observations but every single session boils down to a prescription (see above). They do not have the answers or if they do they are canned answers you could probably get from a box of cereal or Miss Cleo. I saw a psychiatrist once, and that was enough. There are no easy answers to anything, but there is something that can be prescribed.&lt;/P&gt;&lt;P&gt;Is God the answer?&lt;/P&gt;&lt;P&gt;Maybe… Part of the problem with religion or other social groups is that they remove your self-esteem by placing everything in someone else's hands. Instead of depending upon yourself, being responsible, and understanding your strengths and weaknesses, everything is now controlled by an external entity (i.e. God or insert religious icon here). It works for you if you can completely give yourself. For most people it works temporarily until that first bout of doubt sets in, then there is the possibility&lt;/p&gt;&lt;P&gt;My Solution?&lt;/P&gt;&lt;P&gt;Be depressed.&lt;/p&gt;&lt;P&gt;Seriously.  Believe it or not, depression is a completely normal state of being just as happiness, sadness, ecstasy, and indifference are.  It's okay to be depressed.  If you are depressed, chances are good there is a reason why you are depressed.  A couple of days later, you might still be depressed or you might do a one-hundred percent turn-around and be glowing with joy.  It might even take a month or a year or your entire puberty.  It's part of life.  Depression makes happy days happier but can be overwhelming at times.  Most people that "suffer" from depression have succumbed to it.  Don't succumb to it.  When the day is done, go over to the calendar and mark off the day because it's over.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5619538573995619182?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5619538573995619182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5619538573995619182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5619538573995619182'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/10/blast-from-past.html' title='Blast from the past'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3106353443282555670</id><published>2007-10-01T12:15:00.000-04:00</published><updated>2009-05-27T19:49:12.146-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Quick comments on CentOS 5</title><content type='html'>I have installed CentOS 5 on three machines so far; here are some notes:&lt;ul&gt;&lt;li&gt;all three machines needed the boot time &lt;b&gt;linux resolution:1024x768&lt;/b&gt; to get a usable display on the anaconda installer and lvm is not available if you install in text mode&lt;/li&gt;&lt;li&gt;it took four hours to get a workable desktop install (including updates, not including additional software)&lt;/li&gt;&lt;li&gt;on an IBM Thinkcentre I've had to disable then enable the network interface each time to get Internet connectivity&lt;/li&gt;&lt;li&gt;the Gnome desktop looks nice, a little cleaner than Ubuntu (I like the blue and themeset)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3106353443282555670?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3106353443282555670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3106353443282555670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3106353443282555670'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/10/quick-comments-on-centos-5.html' title='Quick comments on CentOS 5'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8295478034490975166</id><published>2007-09-19T07:06:00.000-04:00</published><updated>2007-09-19T12:08:22.047-04:00</updated><title type='text'>Dick doodles</title><content type='html'>&lt;a href="http://www.break.com/index/dick-doodles.html"&gt;Some of the greatest cartoons in the world started out in very perverse ways&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8295478034490975166?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8295478034490975166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8295478034490975166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8295478034490975166'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/09/dick-doodles.html' title='Dick doodles'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-7743614035063269592</id><published>2007-08-28T09:50:00.000-04:00</published><updated>2007-08-28T09:53:49.265-04:00</updated><title type='text'>C#/.Net vs Java vs ?</title><content type='html'>C#/.Net seems like a solid language and framework but you are locked into Microsoft for just about everything.&lt;/p&gt;&lt;p&gt;Java has so many frameworks and layers that it's hard to keep track of all of them. Then again, it has support from IBM, Oracle on the high-end and in the Open Source world and can be lightweight to almost overkill (EJB).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-7743614035063269592?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=7743614035063269592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7743614035063269592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/7743614035063269592'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/08/development-cnet-vs-java-vs.html' title='C#/.Net vs Java vs ?'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-2972511566584392841</id><published>2007-08-02T12:21:00.000-04:00</published><updated>2009-05-27T20:55:49.766-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>A few things to think about</title><content type='html'>&lt;ul&gt;&lt;li&gt;Can you cry under water?&lt;/li&gt;&lt;li&gt;How important does a person have to be before they are considered assassinated instead of just murdered?&lt;/li&gt;&lt;li&gt;Why do you have to "put your two cents in".. but it's only a "penny for your thoughts"? Where's that extra penny going to?&lt;/li&gt;&lt;li&gt;Once you're in heaven, do you get stuck wearing the clothes you were buried in for eternity?&lt;/li&gt;&lt;li&gt;Why does a round pizza come in a square box?&lt;/li&gt;&lt;li&gt;What disease did cured ham actually have?&lt;/li&gt;&lt;li&gt;How is it that we put man on the moon before we figured out it would be a good idea to put wheels on luggage?&lt;/li&gt;&lt;li&gt;Why is it that people say they "slept like a baby" when babies wake up like every two hours?&lt;/li&gt;&lt;li&gt;If a deaf person has to go to court, is it still called a hearing?&lt;/li&gt;&lt;li&gt;Why are you IN a movie, but you're ON TV?&lt;/li&gt;&lt;li&gt;Why do people pay to go up tall buildings and then put money in binoculars to look at things on the ground?&lt;/li&gt;&lt;li&gt;Why do doctors leave the room while you change? They're going to see you naked anyway.&lt;/li&gt;&lt;li&gt;Why is "bra" singular and "panties" plural?&lt;/li&gt;&lt;li&gt;Why do toasters always have a setting that burns the toast to a horrible crisp, which no decent human being would eat?&lt;/li&gt;&lt;li&gt;If Jimmy cracks corn and no one cares, why is there a stupid song about him?&lt;/li&gt;&lt;li&gt;Can a hearse carrying a corpse drive in the carpool lane?&lt;/li&gt;&lt;li&gt;If the professor on Gilligan's Island can make a radio out of a coconut, why can't he fix a hole in a boat?&lt;/li&gt;&lt;li&gt;Why does Goofy stand erect while Pluto remains on all fours? They're both dogs!&lt;/li&gt;&lt;li&gt;If Wiley E. Coyote had enough money to buy all that ACME crap, why didn't he just buy dinner?&lt;/li&gt;&lt;li&gt;If corn oil is made from corn, and vegetable oil is made from vegetables, what is baby oil made from?&lt;/li&gt;&lt;li&gt;If electricity comes from electrons, does morality come from morons?&lt;/li&gt;&lt;li&gt;Do the Alphabet song and Twinkle, Twinkle Little Star have the same tune?&lt;/li&gt;&lt;li&gt;Why did you just try singing the two songs above?&lt;/li&gt;&lt;li&gt;Why do they call it an asteroid when it's outside the hemisphere, but call it a hemorrhoid when it's in your butt?&lt;/li&gt;&lt;li&gt;Did you ever notice that when you blow in a dog's face, he gets mad at you, but when you take him for a car ride; he sticks his head out the window?&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-2972511566584392841?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=2972511566584392841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2972511566584392841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/2972511566584392841'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/08/few-things-to-think-about.html' title='A few things to think about'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1354789904484819694</id><published>2007-07-27T14:38:00.000-04:00</published><updated>2009-05-27T19:49:12.147-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>LVM on Linux</title><content type='html'>I feel stupid for saying this but I played around with LVM on Ubuntu Linux for the first time today. I need to get out more. The benefits to LVM are flexibility. The major downside is critical failure of a physical volume will screw all logical volumes in that pool. Ubuntu Linux has LVM almost completely automated; just choose use the whole disk with LVM and it creates a non-LVM boot partition then a physical volume with the rest. Easy. Adding another physical disk was easy:&lt;/p&gt;&lt;pre&gt;root@homer:~# fdisk -l&lt;/pre&gt;&lt;p&gt;There will be a message similar to this one, "Disk /dev/sdb doesn't contain a valid partition table", if the disk is brand new. If not, the partition table might require some modifications.&lt;/p&gt;&lt;pre&gt;root@homer:~# fdisk /dev/sdb&lt;br /&gt;&lt;br /&gt;Command (m for help): n&lt;br /&gt;Command action&lt;br /&gt;   e   extended&lt;br /&gt;   p   primary partition (1-4)&lt;br /&gt;p&lt;br /&gt;Partition number (1-4): 1&lt;br /&gt;First cylinder (1-130, default 1): &lt;br /&gt;Last cylinder or +size or +sizeM or +sizeK (1-130, default 130):&lt;br /&gt;Using default value 130&lt;br /&gt;&lt;br /&gt;Command (m for help): t&lt;br /&gt;Selected partition 1&lt;br /&gt;Hex code (type L to list codes): 8e&lt;br /&gt;Changed system type of partition 1 to 8e (Linux LVM)&lt;br /&gt;&lt;br /&gt;Command (m for help): w&lt;br /&gt;The partition table has been altered!&lt;br /&gt;&lt;br /&gt;Calling ioctl() to re-read partition table.&lt;br /&gt;Syncing disks.&lt;/pre&gt;&lt;p&gt;The &lt;b&gt;pvdisplay&lt;/b&gt; command can be used to determine the volume group name (VG Name) and display physical volumes. Now to create the physical volume, extend the volume group to include the new physical volue, then create a logical volume within the group.&lt;/p&gt;&lt;pre&gt;root@homer:~# pvcreate /dev/sdb1&lt;br /&gt;  Physical volume "/dev/sdb1" successfully created&lt;br /&gt;&lt;br /&gt;root@homer:~# vgextend Ubuntu /dev/sdb1&lt;br /&gt;  Volume group "Ubuntu" successfully extended&lt;br /&gt;&lt;br /&gt;root@homer:~# lvcreate --name share_01 --size 1016M Ubuntu&lt;br /&gt;  Logical volume "share_01" created&lt;/pre&gt;&lt;p&gt;Once created, put the ext3 filesystem on the new logical volume&lt;/p&gt;&lt;pre&gt;root@homer:~# mkfs.ext3 /dev/Ubuntu/share_01&lt;br /&gt;mke2fs 1.38 (30-Jun-2005)&lt;br /&gt;Filesystem label=&lt;br /&gt;OS type: Linux&lt;br /&gt;Block size=4096 (log=2)&lt;br /&gt;Fragment size=4096 (log=2)&lt;br /&gt;130048 inodes, 260096 blocks&lt;br /&gt;13004 blocks (5.00%) reserved for the super user&lt;br /&gt;First data block=0&lt;br /&gt;8 block groups&lt;br /&gt;32768 blocks per group, 32768 fragments per group&lt;br /&gt;16256 inodes per group&lt;br /&gt;Superblock backups stored on blocks:&lt;br /&gt;        32768, 98304, 163840, 229376&lt;br /&gt;&lt;br /&gt;Writing inode tables: done&lt;br /&gt;Creating journal (4096 blocks): done&lt;br /&gt;Writing superblocks and filesystem accounting information: done&lt;br /&gt;&lt;br /&gt;This filesystem will be automatically checked every 31 mounts or&lt;br /&gt;180 days, whichever comes first.  Use tune2fs -c or -i to override.&lt;/pre&gt;&lt;p&gt;Create a mount point then modify the &lt;b&gt;fstab&lt;/b&gt; so this new volume mounts.&lt;/p&gt;&lt;pre&gt;mkdir /share&lt;br /&gt;root@homer:~# cp /etc/fstab /etc/fstab_20072707&lt;br /&gt;root@homer:~# vi /etc/fstab&lt;/pre&gt;&lt;p&gt;Note the backup of fstab made! Reboot the machine and the new logical volume should be available on the mount point&lt;/p&gt;&lt;p&gt;Adding another drive to the pool was just as easy:&lt;/p&gt;&lt;pre&gt;root@homer:~# fdisk /dev/sdc&lt;br /&gt;&lt;br /&gt;Command (m for help): n&lt;br /&gt;Command action&lt;br /&gt;   e   extended&lt;br /&gt;   p   primary partition (1-4)&lt;br /&gt;p&lt;br /&gt;Partition number (1-4): 1&lt;br /&gt;First cylinder (1-130, default 1):&lt;br /&gt;Using default value 1&lt;br /&gt;Last cylinder or +size or +sizeM or +sizeK (1-130, default 130):&lt;br /&gt;Using default value 130&lt;br /&gt;&lt;br /&gt;Command (m for help): t&lt;br /&gt;Selected partition 1&lt;br /&gt;Hex code (type L to list codes): 8e&lt;br /&gt;Changed system type of partition 1 to 8e (Linux LVM)&lt;br /&gt;&lt;br /&gt;Command (m for help): w&lt;br /&gt;The partition table has been altered!&lt;br /&gt;&lt;br /&gt;Calling ioctl() to re-read partition table.&lt;br /&gt;Syncing disks.&lt;br /&gt;root@homer:~# pvcreate /dev/sdc1&lt;br /&gt;  Physical volume "/dev/sdc1" successfully created&lt;br /&gt;root@homer:~# vgextend Ubuntu /dev/sdc1&lt;br /&gt;  Volume group "Ubuntu" successfully extended&lt;/pre&gt;&lt;p&gt;To increase the size of the shared volume:&lt;/p&gt;&lt;pre&gt;root@homer:~# umount /share&lt;br /&gt;root@homer:~# lvextend -L2032M /dev/Ubuntu/share_01&lt;br /&gt;  Extending logical volume share_01 to 1.98 GB&lt;br /&gt;  Logical volume home_01 successfully resized&lt;br /&gt;root@homer:~# e2fsck -f /dev/Ubuntu/share_01&lt;br /&gt;e2fsck 1.38 (30-Jun-2005)&lt;br /&gt;Pass 1: Checking inodes, blocks, and sizes&lt;br /&gt;Pass 2: Checking directory structure&lt;br /&gt;Pass 3: Checking directory connectivity&lt;br /&gt;Pass 4: Checking reference counts&lt;br /&gt;Pass 5: Checking group summary information&lt;br /&gt;/dev/Ubuntu/share_01: 11/130048 files (0.0% non-contiguous), 8197/260096 blocks&lt;br /&gt;root@homer:~# resize2fs /dev/Ubuntu/share_01&lt;br /&gt;resize2fs 1.38 (30-Jun-2005)&lt;br /&gt;Resizing the filesystem on /dev/Ubuntu/share_01 to 520192 (4k) blocks.&lt;br /&gt;The filesystem on /dev/Ubuntu/share_01 is now 520192 blocks long.&lt;br /&gt;&lt;br /&gt;root@homer:~# mount /dev/Ubuntu/share_01 /share_01&lt;/pre&gt;&lt;p&gt;Too easy... Here are some links that were very helpful:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.linuxdevcenter.com/pub/a/linux/2006/04/27/managing-disk-space-with-lvm.html"&gt;Managing Disk Space With LVM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.howtoforge.com/linux_lvm"&gt;A Beginner's Guide To LVM&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1354789904484819694?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1354789904484819694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1354789904484819694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1354789904484819694'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/07/lvm-on-linux.html' title='LVM on Linux'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-8842087098505072001</id><published>2007-07-19T12:27:00.001-04:00</published><updated>2008-02-14T10:30:17.545-05:00</updated><title type='text'>On through the Blog-o-sphere</title><content type='html'>Occasionally, usually at work when my brain has numbed to the point of being able to be attached to a pole and used to mop floors, I'll use the Next Blog button at the top and just go through the Blog-o-sphere. Here is what I found:&lt;ul&gt;&lt;li&gt;1 epileptic seizure inducing&lt;/li&gt;&lt;li&gt;4 done by 18-21 year old that write like 8 year olds&lt;/li&gt;&lt;li&gt;1 well done, with good content&lt;/li&gt;&lt;li&gt;3 Orientals with nothing better to do than spend money and post pictures of what they ate that day&lt;/li&gt;&lt;li&gt;2 foreign language, living in America complaining about America&lt;/li&gt;&lt;li&gt;1 learning English, living in America, and complaining about America&lt;/li&gt;&lt;li&gt;9 foreign language, outside of America&lt;/li&gt;&lt;li&gt;1 horribly hip, teenage / college student with six zillion picture phone images&lt;/li&gt;&lt;li&gt;1 test / single nothing post&lt;/li&gt;&lt;li&gt;2 myspace wannabe, break stylesheet, l337 individual&lt;/li&gt;&lt;li&gt;1 foreign student in America&lt;/li&gt;&lt;li&gt;1 cool, but with a hundred embedded youtube objects&lt;/li&gt;&lt;li&gt;1 ugly with a hundred embedded youtube objects and link buttons&lt;/li&gt;&lt;li&gt;1 spam&lt;/li&gt;&lt;li&gt;1 American documenting her travels abroad&lt;/li&gt;&lt;li&gt;1 comic book related&lt;/li&gt;&lt;li&gt;1 real estate broker&lt;/li&gt;&lt;/ul&gt;The good news is the spam blogs are disappearing and almost gone. Also, the myspace wannabe and seizure inducing blogs are down as well. Hopefully they all went to myspace where it's okay to have six jillion youtube objects, pictures, horrifying templates and all sorts of cool but worthless crap. There are a lot of foreign blogs now, which I can't read. The blogs written in English are written at a kindergarden level. Oh well, I can't complain though. I'm certainly not perfect. I do think the blogging craze is starting to die down a little; maybe youtube and similar directions are now the cool thing and blogging is just, ick, words.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-8842087098505072001?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=8842087098505072001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8842087098505072001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/8842087098505072001'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/07/on-through-blog-o-sphere.html' title='On through the Blog-o-sphere'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1040839077304426382</id><published>2007-07-19T12:03:00.000-04:00</published><updated>2007-07-19T12:04:23.081-04:00</updated><title type='text'>Overpriced on eBay</title><content type='html'>Sometimes I just don't understand buyers on eBay; sellers, too.&lt;/p&gt;&lt;p&gt;I've been watching a specific Dell LCD for a little while now. It retails from Dell at around $320 brand spanking new shipping and tax included. Someone just bought a used one, no warranty, no return instructions from the seller for $321 after shipping on eBay; and they probably would have spent more. The other four almost identical options are shaping up to be similar bidding slap-fests that will end near or over the purchase price for a brand new item with warranty and vendor support.&lt;/p&gt;&lt;p&gt;One seller was selling SATA 150 drives as SATA II drives. When I asked a question about the model number not being the same as a spec from the auction it went unanswered. This seller usually opens up a lot of six to eight of these with very short open times, around a day or less.&lt;/p&gt;&lt;p&gt;I like Shuttle computers, the mini-xPC a.k.a. shoebox computers. A lot of them are being sold as "normally sell for $300 or more"; which is not the case. Not really true for these, though, more like $240 tops and for older technology. You can buy a newer model with current socket / chipset for around $190 plus the memory and processors are actually priced the same or cheaper for more capacity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1040839077304426382?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1040839077304426382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1040839077304426382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1040839077304426382'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/07/overpriced-on-ebay.html' title='Overpriced on eBay'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-1022748354452635860</id><published>2007-07-17T09:00:00.000-04:00</published><updated>2007-07-17T09:20:52.381-04:00</updated><title type='text'>Blogger to mySQL</title><content type='html'>The goal of this process was to get the Blog of the Dead (the story blog I work on) into a mySQL database at another location so new readers could start from the beginning then read the blog chronologically starting with the first gripping hours up through where I got bored with the whole thing. Blogger really wasn't designed to relive a story or sequential posts but it suited my purposes at the time.&lt;/p&gt;&lt;p&gt;The mySQL table uses the post date and time as the primary key and includes the author, Blogger permalink, post title and post body. I didn't save comments. Originally I looked at the Google API set but that only seemed to work with recent posts and you had to have feeds enabled.&lt;/p&gt;&lt;p&gt;Note: this only works for Bloggers using the classic templates (like me).&lt;/p&gt;&lt;h4&gt;Step 1: Save your existing template&lt;/h4&gt;&lt;p&gt;Copy the code for your existing template and save it somewhere locally, you will need to restore it later&lt;/p&gt;&lt;h4&gt;Step 2: Replace your template&lt;/h4&gt;&lt;pre&gt;&amp;lt;Blogger&amp;gt;&amp;lt;$BlogItemDateTime$&amp;gt;&amp;raquo;&amp;lt;$BlogItemTitle$&amp;gt;&amp;raquo;&amp;lt;$BlogItemAuthor$&amp;gt;&amp;raquo;&amp;lt;$BlogItemPermalinkUrl$&amp;gt;&amp;raquo;&amp;lt;$BlogItemBody$&amp;gt;&lt;br /&gt;&amp;laquo;&amp;lt;/Blogger&amp;gt;&lt;/pre&gt;&lt;h4&gt;Step 3: In &lt;b&gt;Settings | Formatting&lt;/b&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;set &lt;b&gt;Show&lt;/b&gt; to 999 days on main page&lt;/li&gt;&lt;li&gt;set &lt;b&gt;Timestamp format&lt;/b&gt; to MM/DD/YYYY HH:MM:SS AM|PM&lt;/li&gt;&lt;li&gt;set &lt;b&gt;Convert line breaks&lt;/b&gt; to no&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Step 4: In &lt;b&gt;Settings | Archiving&lt;/b&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;set &lt;b&gt;Archive Frequency&lt;/b&gt; to No Archive&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Step 5: View your blog&lt;/h4&gt;&lt;p&gt;Save the source for your blog somewhere locally&lt;/p&gt;&lt;h4&gt;Step 6: Reset everything&lt;/h4&gt;&lt;p&gt;Reset your formatting and archiving settings then template back to their original settings and content.&lt;/p&gt;&lt;p&gt;You should now have a text file that will need a little massaging to get into mySQL. I used UltraEdit to get the date/time into an ISO standard format and convert Windows CR/LF combinations to simple CR's. The resulting text file can be locally loaded with no column enclosures, no escape characters, \r plus the line terminator character as record ends, and the column separator character as your column separator. I'll revist this later with more details instructions with SED, etc.; I simply wanted to get my notes stored somewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-1022748354452635860?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=1022748354452635860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1022748354452635860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/1022748354452635860'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/07/blogger-to-mysql.html' title='Blogger to mySQL'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-5281862949404547621</id><published>2007-07-05T13:03:00.000-04:00</published><updated>2007-07-05T13:10:06.849-04:00</updated><title type='text'>VMWare Server networking tips</title><content type='html'>If you are installing a Linux operating system and using two virtual network interfaces: one bridged (i.e. can see the real interface and get to the world) and one host-only, define the host-only interface first then when finished with the virtual machine wizard add the bridged interface. The host only will be assigned eth0, the bridged eth1. On installation each will use DHCP and the nameservers for eth1 will by default override those for eth0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-5281862949404547621?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=5281862949404547621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5281862949404547621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/5281862949404547621'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/07/vmware-server-networking-tips.html' title='VMWare Server networking tips'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6805759866047783224</id><published>2007-06-25T09:08:00.000-04:00</published><updated>2007-06-25T09:15:50.532-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Testing 1-2-3</title><content type='html'>I want to see how labels are handled with classic templates.&lt;/p&gt;&lt;p&gt;&amp;lt;p&amp;gt;I want to see how labels are handled with classic templates.&amp;lt;p class=&amp;quot;blogger-labels&amp;quot;&amp;gt;Labels: &amp;lt;a rel='tag' href=&amp;quot;http://grouchgeek.blogspot.com/search/label/testing&amp;quot;&amp;gt;testing&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;It looks like Blogger just inserts a paragraph for you at the end and from the looks of the documentation you have no control over that. Nice...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6805759866047783224?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6805759866047783224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6805759866047783224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6805759866047783224'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/testing-1-2-3.html' title='Testing 1-2-3'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6233137218499674969</id><published>2007-06-23T13:42:00.000-04:00</published><updated>2007-06-23T13:53:58.570-04:00</updated><title type='text'>Crew cases, part two</title><content type='html'>Just a quick update. The painting is done on the two cases. The yellow case; well the paint job didn't quite turn out perfect and I gave up trying to get a nice smooth gloss after three coats of color and two clear coats. It looks good from a distance or on casual notice but when you get close you notice the dull spots. Oh well.&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8pgL2vbt_gQ/Rn1b04XjszI/AAAAAAAAAB0/tQkE3ChtCwU/s1600-h/Crewcases20070623+001.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_8pgL2vbt_gQ/Rn1b04XjszI/AAAAAAAAAB0/tQkE3ChtCwU/s400/Crewcases20070623+001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5079316918786306866" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8pgL2vbt_gQ/Rn1b-YXjs0I/AAAAAAAAAB8/chexI9YUzng/s1600-h/Crewcases20070623+002.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_8pgL2vbt_gQ/Rn1b-YXjs0I/AAAAAAAAAB8/chexI9YUzng/s400/Crewcases20070623+002.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5079317081995064130" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Still left to do are the Crew logo, the "Columbus Crew" on one of the 5 1/4" drive panels, and possible the LH in a circle (for Lamar Hunt). The black case is fully operational with and AMD X2 processor, 4GB ram, 500GB and 80GB x 2 RAID-0 running Ubuntu Linux 64bit 7.04 desktop. This machine will serve as a VMWare Server server development system with images on the striped array; with management, squid cache, apache, tomcat, mysql and maybe Oracle images. Fun. The yellow will be a Windows 2003 Server based development machine and swap out drive sets with Linux based server development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6233137218499674969?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6233137218499674969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6233137218499674969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6233137218499674969'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/crew-cases-part-two.html' title='Crew cases, part two'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8pgL2vbt_gQ/Rn1b04XjszI/AAAAAAAAAB0/tQkE3ChtCwU/s72-c/Crewcases20070623+001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6468424911176283875</id><published>2007-06-14T10:03:00.000-04:00</published><updated>2007-06-14T10:10:31.332-04:00</updated><title type='text'>Informative links about computers</title><content type='html'>Just putting this here for my own personal reference and might build on it in the future; or have other people build on it.&lt;a href="http://www.ocforums.com/showthread.php?t=458204"&gt;Power supply buyer's guide&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6468424911176283875?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6468424911176283875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6468424911176283875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6468424911176283875'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/informative-links-about-computers.html' title='Informative links about computers'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-3266065084728669115</id><published>2007-06-11T08:57:00.000-04:00</published><updated>2007-06-11T09:15:53.577-04:00</updated><title type='text'>No more FOX in the mornings</title><content type='html'>I am no longer going to wake up on the weekends to watch FOX and Friends on weekend mornings. This weekend on Bulls and Bears there were two blondes, one arguing and spouting off one-sided political vomit about another worthless blonde that deserves zero publicity. Ann Coulter discussing Paris Hilton. Good lord. One annoying stick figure she-male talking about a talentless socialite stick-figure.&lt;/p&gt;&lt;p&gt;That's it. No more.&lt;/p&gt;&lt;p&gt;I almost tuned out when they took &lt;a href="http://www.foxnews.com/story/0,2933,1216,00.html"&gt;Juliet Huddy&lt;/a&gt; off but then there was &lt;a href="http://www.cnn.com/CNN/anchors_reporters/chetry.kiran.html"&gt;Kiran Chetry&lt;/a&gt; to look at but now Kiran is with CNN replaced by &lt;a href="http://www.foxnews.com/story/0,2933,164751,00.html"&gt;Gretchen Carlson&lt;/a&gt; and now &lt;a href="http://www.foxnews.com/story/0,2933,64577,00.html"&gt;Page Hopkins&lt;/a&gt;. I like Page but she's no Juliet or Kiran.&lt;/p&gt;&lt;p&gt;Ann Coulter discussing Paris Hilton was the last straw, though. Two days later and my stomach is still sore and unable to accept anything stronger than pudding or yogurt. (And I do realize that discussing this is actually "publicity" for both but if some lowly blog like this one is "publicity" then that actually makes me feel a little better about the rest of the world that thinks both need to be forever hidden from the public eye in a jail or sealed in lucite or carbonite or something).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-3266065084728669115?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=3266065084728669115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3266065084728669115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/3266065084728669115'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/no-more-fox-in-mornings.html' title='No more FOX in the mornings'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6277377271789940553</id><published>2007-06-06T13:12:00.000-04:00</published><updated>2007-06-06T13:23:51.298-04:00</updated><title type='text'>Keeping CPUs busy</title><content type='html'>I guess I either don't understand the finer points of computer performance or don't understand why some people don't understand what I consider to be simple knowledge about computer performance.&lt;/p&gt;&lt;p&gt;"The CPUs on the server are running at high utilization, 60 to 80 percent"&lt;/p&gt;&lt;p&gt;Okay. So?&lt;/p&gt;&lt;p&gt;Are you paging (swapping) heavily? No. Is the disk I/O rate normal, low or very heavy? It's about normal. Is there a looping or run-away process or service? No.&lt;/p&gt;&lt;p&gt;Then what is the problem? (this isn't happening with my current employer, by the way)&lt;/p&gt;&lt;p&gt;It seems to me that if you aren't paging then you are not using all of your server's memory, else you would be swapping and that could be bad. If there are no looping processes then the software and operating system are functioning normally. If the disk (or network) I/O are normal then the software is reading and writing data like it should be. Again, what is the problem because it sounds to me like the CPUs are doing what they are supposed to be doing, utilizing themselves and if your I/O rates aren't through the roof then you are probably getting a portion of the CPU utilization through application buffer and cache hits (a really good thing, by the way). You don't spend a dump-truck full of money on a bunch of processors just to have them sit there at 10 percent utilization most of the time; you want them doing work! Throw more memory at them to boost cache and buffer hit rates or if that doesn't seem to help (which sometimes it doesn't; there is a sweet spot when doing read caching just because you can only cover so much especially when data is scattered on disk) maybe consider moving temporary spaces to memory (or covering them heavily).&lt;/p&gt;&lt;p&gt;The point is: you want your server processors to be busy if there is work to be done. Maybe I'm wrong or just don't understand things correctly but it seems like putting a motorcycle engine on a scooter; if you're never going to have the thing above 2 miles per hour then why all the horsepower? I see the same thing on the workstation. If all you are going to be doing is surfing the Internet, typing memos and using central application software do you really need a 2.8Ghz P4 sitting there doing nothing? I got in an argument with a pro-Firefox guy recently. He said Opera can use over 160 MB of memory. So? Is any other application using it? No. Then what harm? I'd rather have Opera intelligently caching as much as possible while there is no effect on other applications. "Well it shouldn't use that much!" Sigh.&lt;/p&gt;&lt;p&gt;IBM has a technology called Capacity on Demand (CoD) "so companies don't have to pay for computing resources until they use them." They have on/off and reserve processing that can be activated in increments of time (like a day) for end-of-period processing or for sporadic work loads. The company I work for has already had some fun with it. There are other aspects of CoD and it is a decent idea but I have to believe that IBM isn't in it just to keep customers happy; they are making their money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6277377271789940553?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6277377271789940553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6277377271789940553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6277377271789940553'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/keeping-cpus-busy.html' title='Keeping CPUs busy'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14022687.post-6916837505507895755</id><published>2007-06-05T12:27:00.000-04:00</published><updated>2007-06-05T12:40:29.692-04:00</updated><title type='text'>Subliminal ideas</title><content type='html'>Ever been on hold with some company, usually a tech support line or any other cost center that earns them zero cash, and listened to that grainy music? Ever wish when you had a caller on the line that just talks and talks and talks and talks and talks forever about nothing and just wants to vent or occupy your time? Ever wish you could put that person on hold, press a button and have something subliminal play within the music while they were on hold? I think I'm onto something here.&lt;/p&gt;&lt;p&gt;Lets say I'm some cable company where ninety percent of calls are people saying the cable is out even though you have a message up front saying so. When this person actually gets through they could have on-hold music that subliminally repeats "hey lard-ass, the cable will be back shortly why don't you go for a walk or ride a bike for a while?" Maybe the on-hold subliminals for a sales line would be something like "buy this product and you sure to be getting oral pleasure from your spouse or spousal life acquaintance".&lt;/p&gt;&lt;p&gt;Of course, the applications are endless. And they don't necessarily have to be devious, do they? How about a calm, reassuring "your mind is calm, your life is happiness" while on hold? Maybe not at a hospital or funeral home but you get the idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14022687-6916837505507895755?l=grouchgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14022687&amp;postID=6916837505507895755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6916837505507895755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14022687/posts/default/6916837505507895755'/><link rel='alternate' type='text/html' href='http://grouchgeek.blogspot.com/2007/06/subliminal-ideas.html' title='Subliminal ideas'/><author><name>Grouchy</name><uri>http://www.blogger.com/profile/17820174028241175306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://img114.imageshack.us/img114/8597/grandpasimpson80x804bv.gif'/></author><thr:total>0</thr:total></entry></feed>
