Sunday, May 13, 2007
An Ode to Oscillococcinum
I just spent a week in Latin America, performing (it does seem these days that I perform as much I inform) Best Practice seminars organized by Quest Software and its partners in Buenos Aires, Bogota and Medellin.
On Friday, two hours before my talk in Medellin, I came down with flu symptoms: bad headache, every inch of my skin sensitive to the touch and painful, very tired. This was bad news. I had a three hour talk to do.
Fortunately, I was carrying a dose of Oscillococcinum in my bag for just this situation. I quickly poured the first dose of a hundred tiny white pills under my tongue.
It didn't help me over the next few hours; it doesn't take effect that quickly, but afte taking the other two doses over the rest of the day, I woke up Saturday morning at 4:30 AM ready to head to the airport and home, completely free of flu symptoms.
Oscillococcinum had done it again, for me! Incredible....
Oscillococcinum is a homeopathic remedy made by Boiron. It is incredibly effective and the fact that you probably don't know about it says a lot about the power of the pharmaceutical industry.
I urge you to find Oscillococcinum at your nearest natural food store and stock up. Also, visit your nearest drugstore (CVS, Walgreens, etc.) and if they do not carry Oscillococcinum, ask them to do so.
When AP is the enemy, who is our friend?
AP is one of the major news content providers to newspapers, websites, etc.
In April 2007, Tom Curley, AP president and CEO, said this about reporting in Iraq, and particularly the Anbar province: "It is about the Associated Press. We are the target. Freedom of the press is the target....There has been an extreme effort to shut down coverage from an out-of-control place. That is what the facts show.”
I read this quote in today's Sunday Tribune's column by Clarence Page, Held without charges.
Page informs us that two journalists, including Bulil Hussein of AP, have been detained and held without charges, by the US military. In the case of Hussein, AP has thoroughly investigated his activity in Iraq and can find no evidence to back up even the vague speculations made public by the Pentagon regarding Hussein.
If people like the CEO of Associated Press, must now openly declare that he and his company are the targets of the US government and military, we are in a very bad, very dark moment in our history.
And it is going to get darker and worse, unless U.S. citizens find their voices and do more than elect a Democrat in 2008.
Our nation is not perfect. But it is surely one of the best efforts to create a society of humans in which the rule of law holds sway over the actions of its individual members. That rule of law establishes the foundation for our democracy (also very imperfect), and it is something of which we should all be proud.
George Bush and Dick Cheney trample on those laws and undermine our democracy. They lie to us and barely even bother to cover for those lies. They hand over billions of our tax dollars to their friends in companies like Halliburton and Blackwater, even as those companies provide the most corrupted, degraded services in exchange for those funds.
And we let it happen. Well, I don't know that there's much I can do about it, but I will state publicly and add my name to whatever efforts are going on towards this end:
George Bush and Dick Cheney should both be impeached. They should be removed from office as quickly as possible. Indictments should be brought against them, and they should be arrested for their crimes.
Impeach Bush
Impeach Cheney
Saturday, May 05, 2007
$100M worth of sand?
So when I read the following juicy details about the special effects in Spiderman 3, well, I felt a little bit ill:
http://www.wired.com/wired/archive/15.05/pl_screen_p78.html
Blockbuster season's most expensive movie star isn't a clean-cut actor. It's a pile of sand. It took a 30-person f/x team two years of CG-heavy lifting to crank out Thomas Haden Church's villainous Sandman. The laborious supporting character is also rumored to be a big reason Spider-Man 3 ran an estimated $100 million over its original $200 million budget. "This isn't just an effect like a twister or a tidal wave," says Scott Stokdyk, visual f/x supervisor. "Because it's a character, each particle of sandpile has to roll and have a direction and a target and start forming in and be part of a flow that forms into a volumetric shape." The illusion meant a crash course in developing software simulators that made sand behave like a fluid or a gas one instant and a sack of tiny marbles the next. Sand supervisor Doug Bloom says: "We did six years of R&D in two years. We honestly started the project not knowing how we'd be able to finish it." But will Spidey 3 hit box office pay dirt? Only time will tell.
They spend $100M just on getting the special effects right for the Sandman villain? What the hell is wrong with them, and wrong with us, with humans, that we would tolerate such a disgusting expenditure of money at a time when there is so much pain, so much need?
I know, I am such a whiner. Fine. Whiner, I will be. I will not see Spiderman 3 in the theaters. Maybe I will bother to watch it someday on an airplane, or at home.
Thursday, May 03, 2007
What is wrong with this picture?
Wednesday, May 02, 2007
Quseful #2: The String Tracker Package
Sometimes you need to be able keep track of strings (names of some sort, usually) that you have used, so you do not use them again. I ran into this need, in fact, when I was building some backend code for Quest Code Tester for Oracle. We generate test code (a PL/SQL package) for the tests you described through the UI. That generated code includes declarations of variables. I can't declare a variable with the same name more than once. So I need to remember what I previously declared. To do that I built the qu_used package, which evolved into the string_tracker package.
The package requires Oracle Database 9i Release 2 and above, since it takes advantage of string-indexed collections. It is, I believe, an excellent demonstration of the elegance possible in one's code through the use of this structure.
I hope you can get as much value out of this package as I have.
Show me the code!
Sorry, rather than show you all the code here (very clumsy), I offer the source code and any supporting files in this zip file.
You can also download my entire "demo zip", containing all the scripts and reusable code that are part of my regular trainings. The zip for this Quseful is inside that zip as well.
Here are the files in the Quseful2.zip:
string_tracker3.pks - the lastest and greatest specification of the string_tracker package
string_tracker3.pkb - the lastest and greatest body of the string_tracker package
string_tracker.sql - a demonstration of using this code (also found below)
q##STRING_TRACKER.qut - a Quest Code Tester export of the test definition I built to veirfy that string_tracker works. You can import this into an installation of Code Tester and confirm for yourself that string_tracker works as advertised.
How do I use it?
The package contains several programs:
string_tracker.clear_all_lists Deletes all lists you may have defined in string_tracker in your session.
string_tracker.clear_list Deletes just the list specified in the call to clear_list.
string_tracker.create_list Creates a new list. Provide the name of the list, whether or not you want the strings in the list to be case-sensitive, and if you want to overwrite a list that already exists with this name.
string_tracker.mark_as_used Mark the specified string as "used" in the specified list.
string_tracker.string_in_use If the specified string is currently "used" in the specified list, return TRUE. Otherwise, return FALSE.
Examples
Here is an example of using string_tracker that mimics my own actual application of this package inside Code Tester.
I have a collection of outcomes (the tests I will perform after I test is run). For each outcome, I need to declare a local variable to hold the data. Since I can create more than one outcome for a particular OUT argument, I must be sure to avoid duplicate declarations.
DECLARE
/* Create a constant with the list name to avoid multiple,
hard-coded references. Notice the use of the subtype
declared in the string_tracker package to declare the
list name. */
c_list_name CONSTANT string_tracker.list_name_t := 'outcomes';
/* QCGU: A collection based on a %ROWTYPE associative array type */
l_outcomes qu_outcome_tp.qu_outcome_tc;
BEGIN
/* Create the list, wiping out anything that was there before. */
string_tracker.create_list (list_name_in => c_list_name
, case_sensitive_in => FALSE
, overwite_in => TRUE
);
/* QCGU: get all the outcome rows for the specified test case. */
l_outcomes := qu_outcome_qp.ar_fk_outcome_case (l_my_test_case);
/* For each outcome... */
FOR indx IN 1 .. l_outcomes.COUNT
LOOP
/* IF the string has not already been used... */
IF NOT string_tracker.string_in_use (c_list_name
, l_outcomes (indx).variable_name
)
THEN
/* Add the declaration to the test package. */
generate_declaration (l_outcomes (indx));
/* Make sure I don't generate duplicate declarations. */
string_tracker.mark_as_used (c_list_name
, l_outcomes (indx).variable_name
);
END IF;
END LOOP;
/* Clean up! */
string_tracker.clear_list (c_list_name);
END;
Gotchas
Keep the following in mind:
- With string_tracker, you can keep track of multiple (approximately 4.3 billion) of lists of used strings. Each list may contain approximately 4.3 billion strings in it.
- These lists only persist for the duration of your session (they are stored in package variables), and they consume PGA memory.
- The package requires Oracle Database 9i Release 2 and above, since it takes advantage of string-indexed collections.
I'd love to hear what you think of this utility and, in particular, if you found it useful. So please don't hesitate to post a comment on this blog or send me a note at steven@stevenfeuerstein.com.
About Qusefuls
A Quseful is a Quick and Useful (as opposed to Quick and Dirty) tip on now to write programs in the Oracle PL/SQL language more effectively. I will publish Qusefuls on my blog (feuerthoughts.blogspot.com) on a regular basis. Each Quseful contains a description of the tip ("What's the point?"), some PL/SQL code you can install in your environment to implement the tip ("Show me the code!"), an example of how to use the code to help you get your job done ("How do I use it?").
Sunday, April 22, 2007
God Bless the Congress of the United States of America!
This fact was driven home to me very forcefully tonite by a visit to My Yahoo, where I found some exciting news, news that made me proud to be an American.
As I am sure you are aware, a young man killed 33 people at Virginia Tech several days ago. A horrible, horrible event. He was clearly deranged, a madman. And look what he did with all those guns. A massacre.
Well, Congress is not wasting any time in showing that it means business when it comes to protecting the citizens of this great nation, the citizens who, in fact, put those men and women where they are today.
No, sir, Congresspeople are contemplating swift and strong action, as explained by this article from Reuters:
U.S. Congress may act to keep guns from mentally ill By Thomas Ferraro Sun Apr 22, 4:09 PM ET
WASHINGTON (Reuters) - Prompted by the Virginia Tech massacre, a U.S. Congress reluctant to tackle gun control may pass limited legislation to help keep firearms out of the hands of the mentally ill, lawmakers and aides said on Sunday.
"Given the horror that happened at Virginia Tech, I think there's a real chance of passing this," said Sen. Charles Schumer (news, bio, voting record), a New York Democrat, told "Fox News Sunday."
A Republican leadership aide agreed, telling Reuters, "If there is a consensus, and it is in lieu of knee-jerk draconian measures, (the chances are) probably really good." ... more
==========================
Can there be any doubt about the great wisdom of our leaders?
I certainly agree with them: people who are mentally ill should not be allowed to own weapons.This is a great time to be an American.
I pity all the other people around the world who have to be some other kind of person, like a European or even a Chinapean.
But maybe, just maybe, if you help the National Rifle Association establish a lobbying office in your country, then your nation, too, can rise to greatness.
In the meantime, it is entirely possible that God will only bless America.
Tough break, world.
Saturday, April 21, 2007
Quseful #1: Trace argument passing
About Qusefuls
A Quseful is a Quick and Useful (as opposed to Quick and Dirty) tip on now to write programs in the Oracle PL/SQL language more effectively. I will publish Qusefuls on my blog (feuerthoughts.blogspot.com) on a regular (hopefully at least weekly) basis. Each Quseful contains a description of the tip ("What's the point?"), some PL/SQL code you can install in your environment to implement the tip ("Show me the code!"), an example of how to use the code to help you get your job done ("How do I use it?").
What's the point?
A very good habit to develop is to add application-level tracing to your code. This tracing capability should be something you can turn on and off from outside your application code. Use it to keep track of application-specific information that is being used or processed by your code.
Options for tracing include:
- The DBMS_APPLICATION_INFO package
- The log4plsql open source utility
- The qd_runtime package of the Quest Codegen Utility
Whichever tracing option you choose, information that very often needs to be traced/verified are the values that were passed into a program through the parameter list (IN and IN OUT arguments). Programmers usually write such tracing code themselves, which can be a major pain in the neck when you have lots of arguments.
Below you will find a program that extracts the arguments of a program from the ALL_ARGUMENTS data dictionary view and generates a starting point for your argument tracing. It assumes that your tracing function takes two string inputs:
- the context: defaulted to the name of the program you provided
- the trace message: a single string that contains concatenations of all the arguments in the form ARGUMENT_NAME = ARGUMENT_VALUE.
You may well need to change either this program or the output from the program to match your actual tracing interface or to remove any arguments whose type does not allow implicit conversions to strings. At least it will have generated a nice starting point for you, saving a bunch of time.
Note: many thanks to Jornica for his help in enhancing and testing this utility!
Show me the code!
Sorry, rather than show you all the code here (very clumsy), I offer the source code and any supporting files in this zip file.
You can also download my entire "demo zip", containing all the scripts and reusable code that are part of my regular trainings. The zip for this Quseful is inside that zip as well.
How do I use it?
Call gen_trace_call and pass it the name of the program for which you need argument tracing. It then queries the correct argument information from ALL_ARGUMENTS and generates code by displaying it on the screen with DBMS_OUTPUT.
This program has four arguments:
pkg_or_prog_in
The name of the package that contains the subprogram you want to trace, or the name of the schema-level function or procedure you want to trace.
pkg_subprog_in
If tracing a program in a package, provide the name of that function or procedure here. If tracing a schema-level program, pass NULL.
nest_tracing_in
Pass TRUE (the default) if you want to nest your tracing call within a conditional statement that is used to first see whether or not tracing is enabled. This is useful for reducing the runtime overhead of tracing when disabled.
tracing_enabled_func_in
The name of the function (or chunk of code) that you want to run to see if tracing is enabled. The default is 'qd_runtime.trace_enabled', which is the function used by the Quest CodeGen Utility to check to see if tracing is enabled.
trace_func_in
The name of the function that you want to call to do the tracing. The default is 'qd_runtime.trace', which is the trace function offered by the Quest CodeGen Utility.
Examples
Here are some examples, generating code for programs that are available in my "demo zip" file. Please note that I have formatted all code using Toad's auto-formatter. It will not be quite as pretty "out of the box". I have also turned on serveroutput before running these scripts.1. A schema-level function (betwnstr.sf):
DECLARE
/* AFTER ENTERING - IN and IN OUT argument tracing */
PROCEDURE trace_in_arguments
IS
FUNCTION bool_to_char (bool_in IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
IF bool_in
THEN
RETURN 'TRUE';
ELSIF NOT bool_in
THEN
RETURN 'FALSE';
ELSE
RETURN 'NULL';
END IF;
END bool_to_char;
BEGIN
IF qd_runtime.trace_enabled
THEN
qd_runtime.TRACE ('BETWNSTR'
, 'STRING_IN='
|| string_in
|| ' - START_IN='
|| start_in
|| ' - END_IN='
|| end_in
|| ' - INCLUSIVE_IN='
|| bool_to_char (inclusive_in)
);
END IF;
END trace_in_arguments;
/* BEFORE LEAVING - OUT and IN OUT argument tracing */
PROCEDURE trace_out_arguments
IS
BEGIN
IF qd_runtime.trace_enabled
THEN
qd_runtime.TRACE ('BETWNSTR', 'RETURN_VALUE=' || return_value);
END IF;
END trace_out_arguments;
BEGIN
NULL;
END;
You will find an example of betwnstr that includes this tracing logic in it in the betwnstr_with_tracing.sf file.
2. A function inside a package (dyn_placeholder.pks/pkb):
DECLARE
/* AFTER ENTERING - IN and IN OUT argument tracing */
PROCEDURE trace_in_arguments
IS
FUNCTION bool_to_char (bool_in IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
IF bool_in
THEN
RETURN 'TRUE';
ELSIF NOT bool_in
THEN
RETURN 'FALSE';
ELSE
RETURN 'NULL';
END IF;
END bool_to_char;
BEGIN
IF qd_runtime.trace_enabled
THEN
qd_runtime.TRACE ('DYN_PLACEHOLDER.ALL_IN_STRING'
, 'STRING_IN='
|| string_in
|| ' - DYN_PLSQL_IN='
|| bool_to_char (dyn_plsql_in)
);
END IF;
END trace_in_arguments;
/* BEFORE LEAVING - OUT and IN OUT argument tracing */
PROCEDURE trace_out_arguments
IS
BEGIN
IF qd_runtime.trace_enabled
THEN
qd_runtime.TRACE ('DYN_PLACEHOLDER.ALL_IN_STRING'
, 'RETURN_VALUE=' || return_value
);
END IF;
END trace_out_arguments;
BEGIN
NULL;
END;
3. Same function, but using overrides for the tracing programs:
DECLARE
/* AFTER ENTERING - IN and IN OUT argument tracing */
PROCEDURE trace_in_arguments
IS
FUNCTION bool_to_char (bool_in IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
IF bool_in
THEN
RETURN 'TRUE';
ELSIF NOT bool_in
THEN
RETURN 'FALSE';
ELSE
RETURN 'NULL';
END IF;
END bool_to_char;
BEGIN
IF mypkg.tracing_on ()
THEN
mupkg.show_action ('DYN_PLACEHOLDER.ALL_IN_STRING'
, 'STRING_IN='
|| string_in
|| ' - DYN_PLSQL_IN='
|| bool_to_char (dyn_plsql_in)
);
END IF;
END trace_in_arguments;
/* BEFORE LEAVING - OUT and IN OUT argument tracing */
PROCEDURE trace_out_arguments
IS
BEGIN
IF mypkg.tracing_on ()
THEN
mupkg.show_action ('DYN_PLACEHOLDER.ALL_IN_STRING'
, 'RETURN_VALUE=' || return_value
);
END IF;
END trace_out_arguments;
BEGIN
NULL;
END;
Gotchas
Keep the following in mind:
- You have serveroutput turned on to see the output from this program.
- If your parameter list contains complex datatypes, like records and collections, you will definitely need to modify the output before it will work.
- It will only generate trace information for programs defrined in the current schema. You can add a schema argument to the program and change the user_arguments reference to all_arguments to generate code for programs in other schemas.
- On Oracle9i, you will still be facing a limit of 255 characters in a call to DBMS_OUTPUT.PUT_LINE (rises to 32K in 10g and above). You can avoid this issue by substituting the call to DBMS_OUTPUT.PUT_LINE with a program that works around this issue, a number of which are available in my "demo zip", including the pl.sp procedure and the p.pks/pkb package.
Do you like it? Do you use it?
I'd love to hear what you think of this utility and, in particular, if you found it useful. So please don't hesitate to post a comment on this blog or send me a note at steven@stevenfeuerstein.com.
About Qusefuls
A Quseful is a Quick and Useful (as opposed to Quick and Dirty) tip on now to write programs in the Oracle PL/SQL language more effectively. I will publish Qusefuls on my blog (feuerthoughts.blogspot.com) on a regular (hopefully at least weekly) basis. Each Quseful contains a description of the tip ("What's the point?"), some PL/SQL code you can install in your environment to implement the tip ("Show me the code!"), an example of how to use the code to help you get your job done ("How do I use it?").
Saturday, April 07, 2007
Green and ethical hotel-ing
I have been doing lots of (too much) traveling for many (too many) years. Yet it was only on this trip that I felt like I was finally hitting my stride, with everything I needed in place to make my trip really, really smooth.
In the bad old days of travel, I had a single backpack that I used (a) to carry all of my computer gear and extras for traveling, (b) to take to the fitness center for workouts, and (c) for just about anything I needed a pack for. So I was constantly moving stuff in and out of the pack. This meant that every time I was leaving for a trip, I had to make sure the pack contained everything I needed.
About two months ago, I had a brainstorm: why not buy another backpack and use it only for business travel? Then I can keep all the gear I need in that pack all the time. When I need to travel, I drop my laptop in and off I go! So I got a very nice Targus backpack for about $20 (CompUSA was going out of business and the pack was about 66% off.), and I put inside it:
* A mouse (regular size and functionality). I can't stand the Thinkpad touchpad. I need a mouse to do any serious work.
* A very cool in-your-hand "one finger mouse". This comes in really handy when I stuck in a coach seat, with no room for a regular mouse. Iwould have to scrunch up my shoulders to use the touchpad, and that really hurts my upper back. With the trackball, I can fully extend my arm and move the mouse from any position.
* A super-thin, but stiff Wowpad mousepad that I can put right over indentations sometimes found on a fold out airplane tray, and which normally louse up a mouse. I talked about this in a previous blog entry.
* An Imak computer glove that has a built-in beanie-bag that provides support for my palm and wrist. It goes wherever I go.
* The IGo universal adaptor so I can plug into the on-board electricity and not be bound to just battery power. Note: I found mine on eBay for half the cost of retail.
* An extra battery for the laptop. Oh wow, that can sure come in handy. On a recent trip, I waited till the last minute to pack and run for the airport. Now, when I put my laptop in the dock, I have to take out the battery, because it is (both are) an extended life battery and it sticks out the back. So this time around, I grabbed the laptop and dropped into my pack - without putting in the battery! Without the spare already in the pack, I would have been in BIG TROUBLE.
* An inflatable Eagle Creek lumbar pillow. Very nicely designed and a big help for avoiding lower back stiffness and aches on long flights.
* A headset with microphone that I can use with Skype. I am very much enjoying Skype when I travel internationally. It makes staying in touch back home so much easier. And I barely ever use Skype for computer-to-computer conversations. I can call "real" telephone numbers and pay something like $.021 per minute.
Well, that's about it for the gear I use on most every flight or most every trip.
And with my pre-prepped backpack, it all comes with me, all the time. How wonderful! So that's a big improvement over past travel experiences.
But it gets even better. I went to Denmark and Switzerland on this trip, and one thing I have noticed over the years about hotels in these northern European countries is that they often have a thick quilt for a top sheet on the beds (it is actually like a blanket that is slipped inside a sheet). That's very nice when it is very cold, or when a person easily gets cold. But that's not me. I tend to "run hot." I prefer fewer blankets and have trouble sleeping when I get too warm. This has caused problems in the past.
So I bought another travel accessory for this trip: the Cocoon TravelSheet. This very lightweight silk sheet is actually a superthin sleeping bag, of sorts. You spread it on your bed and lie inside it. It even has a section near the head into which you can slide a pillow, so it stays nicely in place. The whole thing compresses to the size of a large orange. How cool is that? So I figured I could use it when I would otherwise have to sleep under a heavy quilt-sheet.
But what I realized upon arriving at my first hotel, is that I could make much better use of this sheet than I had thought: I could simply lay it down on top of the nicely-made bed and never actually use the hotel linens!
What's so great about that? Well, two things that I can think of:
* I reduce the amount of linen that must be washed, saving water, cutting back on the phosphate and bleach pollution that washing produces. I simply come home from my trip and wash my nice silk travel sheet.
* Cleaning staff do not have to tear down and remake the bed. They can clean the room faster and they are less likely to strain themselves. "Strain themselves?" you ask. "What is Steven talking about?"
Many hotel chains are "upgrading" their rooms and implementing "sleep systems" that usually involve lots of pillows, heavy blankets, higher thread count sheets, and so on. Sounds really comfy, right? Well, there usually is a downside for someone in such situations. Cleaning staff now have to deal with more and heavier linens, and work harder to clean the same number of rooms in the same amount of time as before. Injuries are on the increase.
So by using my travel sheet, I am not only more comfortable, but I reduce pollution and improve the quality of life of at least one other human being. I like that.
Finally, I make sure that whenever I travel, I have $5 or the equivalent in foreign currency to leave as a thank-you for the cleaning staff. Two perspectives motivate my giving:
1. The way I see it, the more personal a service that a person provides to you, the more important it is that you leave a tip for that person. Someone cleaning up in my hotel room is essentially cleaning up my temporary home, including my bathroom. That's very personal.
2. As far as I can tell, the less visible the worker, the less they are likely to be paid. I don't think cleaning staff are paid very well, but they work very hard. So I feel it is important to complement their meager hourly wages.
So, in conclusion, I suggest that if you too travel an awful lot, that you:
* Prepack as much as you can to avoid unpleasant surprises ("Oh no! I forgot my power cable!").
* Find ways to minimize the ecological impact of your hotel stays. The level of convenience and luxury provided in business hotels tracks closely with the amount of resources consumed and waste produced.
* Leave tips for your room cleaners. Those few dollars will mean little to you and I, but an awful lot to people who are probably earning minimum wage.
Sunday, April 01, 2007
You call this wisdom?
Well, nobody's going to force you to read these. Here goes (writing from Vilnius, Lithuania):
- There are two kinds of people in the world: people who think there are two kinds of people in the world and people who don't. Which do you think is the more dangerous type?
- It's not hard to solve many of the biggest problems faced by humanity. You just have to get the rich and powerful to give up a bunch of their wealth and power.
- Our so-called leaders have utterly failed us (consider: we are causing massive climate change; 50,000,000 Americans are without medical insurance; the disaster in Iraq; people still dying of malaria and TB, etc.). I am not sure I could have done any better, but at least we should be honest enough with ourselves to admit this much.
But allow me to close with my favorite painting from the Contemporary Art Centre in Vilnius, by Aija Zarina titled My Mates:

Saturday, March 31, 2007
Passing the time in Zurich
| Subject: A fine visit to Zurich |
Zurich was an especially nice stop. Generally, when I do trainings for Oracle the local Oracle office pays no attention to me until I show up at the training location. That's understandable; they're all busy and this is just a job. But it's really nice when people in the city offer some hospitality (and I did receive very warm welcomes in Talinn, Estonia and Prague last year).
This year, Zurich was most hospitable. I was told that I would be picked up at the airport. Well, that's happened before and it has always been a professional driver from the transport service favored by Oracle. So I expected something similar. instead, I was met at the airport by Lutz Hartmann, a DBA and former Oracle trainer, who had recently left Oracle to offer training independently. It was so nice to be driven by a tekkie, someone who actually wanted to spend some time with me. Lutz helped me for the next two days, with transportation, with logistics at the seminar, and also by arranging a really wonderful dinner on Thursday night.
He'd spoken with Laurent Schneider, the only person in Switzerland who is both an Oracle ACE and an Oracle Master. I'd met Laurent at a couple of Oracle Open World. He is a very, very smart fellow, with a passion for chess and just about any other game. Whenever we are together, he insists that we play chess. Needless to say, I have never beat him, and usually the game is so lopsided as to be embarrassing. But he is unfailingly polite about all that. In any case, Laurent also knew from OOWs past that I very much enjoy billiards. So at his recommendation, Lutz arranged dinner at a restaurant that was also a billiards hall. That was a fun, fun evening -- a great change from talking for seven hours a day (which I'd just done for three days straight).
I had high hopes for escaping playing chess with Laurent on Thursday, but he was too clever by half and soon we were huddled around a board, placed on a billiards table in very poor light. Time to play chess! And incredibly, after a dozen moves or so, I had a superior position. But then...we had to take the board off the table and move to a very awkward spot with even less light. In fact, I noticed that the way Laurent was sitting blocked most of the light to the board. I struggled valiantly in the darkness to maintain my advantage, but actually I was psychologically resigned to losing from the first move and sure enough I soon made a small and then large blunder -- and the game went to Laurent.
Now, I want to be very, very clear: I do not believe that Laurent deliberately made it hard for me to see the board and therefore cause me to lose the game. No, no, not at all. Just an innocent coincidence. No hard feelings....
The two day training (Best of PL/SQL) that brought (or is bringing) me to Zurich (and Copenhagen and Vilnius and Utrecht) was held at the former FIFA headquarters in the hills above Zurich Centrum. Really nice place with an incredible view. The best part of the location, though, was the foosball (table soccer) table that was in the lobby of the building. Both days, during the break for lunch, I demonstrated my incredibly lame offensive skills and my pathetic goalie capabilities while the Swiss handily outplayed me. Still, great fun....
This conference center was also in a very posh neighborhood (Sonnenberg) of Zurich, which is saying a lot, because Zurich is a very rich (and beautiful) city. The obsession with making, buying and wearing incredibly expensive watches should tell you lots about this city. This is the view out from the front door of the FIFA building up to the house across the street.
Monday, March 26, 2007
Sacha Baron Cohen and his Terrible, Horrible, No Good, Very Bad Movie: Borat
But all the television ads and various pundits talked about how amazing the movie was. Cohen even appeared on Jon Stewart's The Daily Show (staying fully in character), a program I admire and respect greatly. And Stewart treated Cohen with some level of admiration.
So we rented the movie, my wife and I.
And all I could think of when it was done was: I am so glad I didn't actually pay to see that awful production in a movie theater.
It was far worse than I had been led to expect. Sure, there were some funny parts (usually derived from the jaw-dropping feeling of "Did he really just do that?"), but to my mind it was an extremeley crude production that got its laughs by:
* Truly dumb and revolting sight gags. The very worst of it: Cohen wrestles with his obese director, both of them naked and the latter's balls slapping against Cohen's face. All I could think was: how badly did Cohen want to make this film that he would go through that? Just disgusting....
* Endless references to penises, vaginas, prostitutes. "Perfect" movie for teenage males, but how could anyone elevate this garbage to "The Best Comedy Ever Made"?
* Incredibly offensive mockery of rural people. People living in his "home village" in Kazakhistan apparently find incest just fine and rape perfectly acceptable. They are all stupid beyond (below?) measure.
* Revealing the misogyny, bigotry and anti-Jewish sentiments of drunk people, frat boys, and "rednecks." Wow. That is really amazing. Who would have thought? Like we didn't know that you can find people pretty much anywhere you look who are ignorant or prejudiced.
So what's the big deal? People make stupid movies all the time, like Jackass One and Two.
Sure they do. But those movies don't get bandied about as the best comedy ever made. Why was this film treated so differently?
After thinking on it for awhile, I have come to this conclusion:
Borat got a free ride into the Stratosphere of fame and profit (the film must have brought in a fortune) because Cohen leverages the fact that he is Jewish, he plays a crude anti-Semite, and he castigates an entire nation as anti-Semitic. Turns out, you simply can't go wrong playing that card.
We all know how awful "those people over there" are when it comes to Jews. And if we don't know, well, we certainly aren't going to question it, because then it might as seem as if we are going "easy" on those anti-Semites, or that we don't take anti-Semitism seriously.
In other words, I think Borat was hyped the way it was by Western pundits and media as another guilt payment for the Holocaust. Jews have always been and always will be victims, Jews were almost all killed off by Hitler (and Stalin and Spain and....). Poor, poor Jews.
Now, please don't get me wrong. I am totally disgusted by anti-Jewish expression and action. The Holocaust was a terribly tragedy -- for Jews, for Gypsies, for homosexuals, for humanity as a whole. But can't we learn the right lessons from this tragedy?
Hitler's attempt at extermination of the Jews was made possible by decades of vicious stereotyping and scapegoating of an entire people.
Surely, then, Jews more than any other people should take care to avoid doing the same thing to another people. Yet that is exactly what Sacha Baron Cohen has done in Borat.
Cohen shouldn't be treated as an artistic genius. He should be considered a dangerous bigot who makes the world a more dangerous place. Hmmm. That sounds really harsh. OK, he might not be dangerous. He might not even be a bigot. But he is contributing to the bigotry of the world in dangerous ways.
I don't know if he has yet apologized to the people of Kazakhistan, but he certainly should. And perhaps he should also consider donating the profits of his film to a group that battles all kinds of bigotry, not just anti-Semitism.
Wednesday, March 21, 2007
Perfect Symmetry or a Case of Mistaken Reality?
Imagine my surprise (and utter dismay) when, midway through my senior year, I got a call from the administrator at the math department. She told me in no uncertain terms that I would not be able to receive my degree in mathematics (hey, it was still my major!) unless I took one more course. And not just any course, of course. It would have to be a 300 or 400 level class. Oh, the agony! But I somehow muddled through and did in fact graduate in 1980 with a degree in mathematics with high distinction - I kid you not. There's no accounting for.....well concealed disengagement.
And off I went through a cascade of programming jobs, without a single conscious career choice, until I landed at Oracle Corporation and the rest, as they say, is my personal history.
Anyway....I mention all of that to show that I really did have a fascination with mathematics (more accurately, abstract thinking and symbolic logic), and that fascination survives to this day. It's certainly served me well in my chosen profession of programming. And lately, I have found my focus shifting from the abstract manipulations of formulas to the brain that performs these manipulations.
I am now sitting on a plane that maybe soon will take off and return me from San Diego to Chicago (the pilot just announced that a baggage handler banged his vehicle against a cargo door and bent some metal. They believe it is not structural and that they can fix it and we can be on our way. Sigh.....). While contemplating yet another seriously delayed arrival at O'Hare, an article in the NY Times Science section caught my eye. Titled "The Scientific Promise of Perfect Symmetry," the article describes the results of a collaboration among mathematicians: the full elaboration of the E8 Lie group. This elaboration involved the computation of some 200 billion numbers, resulting in an elegantly symmetrical form.
Yeah, right, whatever.
I am sure it is an accomplishment of the mind most remarkable, but what I found striking was the conjecture that this structure and the conclusions we (oh, you know, "we" as in those other humans who live in the world of string theory) can draw from it, may be helpful in understanding some fundamental characteristics of our world/universe.
And then I read the closing statement:
"It could well be E8 that determines the deep inner structure of the universe," Dr. Adams [professor of mathematics at the University of Maryland who led the project] said.
Several fibers of my being instantly rebelled. That statement, I believe, reflects a very deep arrogance and misunderstanding of our world. And I knew that you would want to know that I felt this way, and that you would now be on the edge of your seat, waiting for me to explain.
Gladly.
Here's my problem with such statements: mathematics, physics, etc. are incredibly powerful tools that help us figure out how to manipulate the world around us to meet our needs (make us more comfortable, make life more convenient, etc.).
But the theorems of mathematics and physics do not determine anything in the world outside of our heads. That world simply is.
Here's another way of considering my point: imagine for a moment that humans no longer existed in the world (given the proclivities of George Bush and his ilk, and the sadly weakened state of our democracy, this is not such a far-fetched idea). No more people. No more books, no more Internet. Got it?
OK, now ask yourself these questions:
* Would the deep inner structure of the universe still exist? I would say "yes". The universe, physical reality, would go on existing as it always has. It simply is.
* Would mathematics still exist? I would say "no." Mathematics has no existence outside of our brains. There are things in the world that seem to conform to various mathematical formulae, such as Fibonacci's sequence. But all that really confirms is that our brains, existing in the same physical world as flowers, planets and quarks, construct patterns along the same lines as other organic systems of the world.
* Would gravity still exist? I would say "no." Gravity is an explanation for why when we jump up into the air, we come back down to the ground. But there isn't really any such "thing" as gravity. It's an idea in our heads, and even if there is no brain to come up with the theory of gravity, when we jump up into the air, we will still come back down to the ground.
* Would the world go on, and likely in a much more sustainable and "natural" fashion? I would say "yes." Lately, in fact, I have found myself thinking: if insects disappear, the global ecology would be shot to hell. But if humans manage to snuff themselves (ourselves) out? I imagine there will be no great cataclysm.
I imagine you get the idea. And some of you are undoubtedly saying to yourself: "This is a ridiculous splitting of hairs." I beg to differ. I think that humans are all too enamored with themselves and have largely lost perspective on our place in the world.
We tend to lose sight that all of our scientific theories, our understanding of the molecular structure of the world, our explorations into the incredibly bizarre quantum mechanical structures are nothing more than mental constructs. They will never be anything more than mental constructs. How can they be anything but that? We look at the world around us, we take in that data, we identify patterns in that data, and draw conclusions about how the world works, in order to change the way we relate to that world. But the world simply is, simply "works," with or without us.
Having said that, I am not arguing that we ignore or reject these theories, nor that we should treat them on par with belief systems like "God created the heavens and the earth." Absolutely not. Scientific theories represent some of the greatest accomplishments of humanity. I, for one, have no interest in abandoning (all of) what we have learned and built. I like electricity. I like running water. I dearly love my low-flush toilet.
In contrast, organized religious belief systems, things we take on faith that are fundamentally irrational, are to my way of thinking inherently dangerous -- if they move from the personal, individual manifestation to the public sphere. I hope that someday we will consider them curious relics of a persistent but regrettable stage in our evolution towards truly civilized beings. [But I don't think we'll make it that far.]
The world exists, and we exist in it. We achieved self-awareness, and that great mystery allows us to utilize our brains in increasingly sophisticated ways to alter the world to suit our needs and desires.
And while I believe that the most arrogant statement a human being can say is "We are created in God's image," I would say that the declaration "It could well be E8 that determines the deep inner structure of the universe." does not trail all that far behind.
Tuesday, March 13, 2007
Another handy travel accessory
Yes, another posting on how to make one's travel life more ergnomic. That is, another tip on how to keep on working without screwing up various parts of one's body, even when you spend most of your time in planes.
Why would I be paying so much attention to this issue? Here's my travel schedule last week and this week:
Monday March 5 - Dallas
Tuesday and Wednesday, March 6-7 - Atlanta
Friday, March 9 through Monday March 12 - Florida
Monday, March 12 - fly to Philly (home for 3.5 hours)
Tuesday, March 13 - fly to Boston
Wed, March 14 - fly to Ottawa
Then home for a whopping 3.5 days, then off to San Diego
Then home for a remarkable 5 days, then off to Europe for 2 weeks.
And my upper back is killing me, from hunching my shoulders up so much, trying to type on my keyboard on the plane, especially when I have to use the touchpad.
In any case, here's the latest cool device: the WowPad.
It is a super-thin, stiff, accurate mousepad. It comes in especially handy when I am trying to work on an economy class fold-down/out tray and the tray has an indented section for a cup. The optical mouse dies, but you just lay the WowPad over it and everything is copacetic.
It is also very handy when I arrive at my hotel room and find that the desk surface is glass or something else that totally screws up the optical mouse.
I like it lots.
Tuesday, March 06, 2007
An item of historical curiousity
It is the original proposal I sent to O'Reilly and Associates for my first PL/SQL book. I thought it might be of some interest to those who have benefited from Oracle PL/SQL Programming (the book), so here it is in all its glory:
Compuserve: 72053,441
April 5, 2007
Frank Willison
O'Reilly and Associates
Dear Mr. Willison:
Attached you will find a proposal for a book on Oracle's PL/SQL language. PL/SQL ((for Procedural Language Extensions to SQL) is the core technology for database and application development in many of Oracle Corporation's tools. Yet it has not received the focused attention it deserves, either from training classes or reference books. This gap between the technology and supporting resources provides an opportunity for O'Reilly and Associates.
I am currently discussing publication of such a book on PL/SQL with SAMS, but I am very interested in hearing from O'Reilly and Associates about this project. I will want to move as quickly as possible on the proposal. SAMS will be sending me a contract for review by the end of the week.
I hope that you find the proposal of interest. I look forward to your response.
Sincerely,
Book Proposal: A Programming Guide for Oracle PL/SQL.
Content/Structure of Book
The topic of the book is the PL/SQL programming language provided by Oracle Corporation. PL/SQL stands for "Procedural Language extensions for SQL" and is the underlying technology for complex programming in both the current and next generation of Oracle Corporation's application development and database management tools. While Oracle Corporation has produced reference manuals on PL/SQL, there are few if any books available in the marketplace which provide tips and techniques for "real world" development with PL/SQL.
The purpose of this book is to provide developers with practical strategies, tips and techniques they need to transform their formal education and training in PL/SQL into a set of skills they can use in the real world.
The underlying concept of the book is to go beyond the standard descriptions of features of the PL/SQL language and offer instead practical advice and a multitude of code samples and guides through those examples.
The major topics of the book include: overall strategies for development, coding standards, variable declarations, looping techniques, cursor management, exception handlers, character, date and number manipulation, code consolidation techniques. Readers of the book will gain both a solid understanding of the PL/SQL technology and the practical skills they need to deliver efficient and maintainable production code.
I plan to employ a multi-leveled approach to deepening one's expertise of the PL/SQL language. On the straight sequential level, I lead the reader from general strategies to coding standards to exploration of basic techniques and finally to the advanced use of these techniques, standards and stratgies to handle complex programming requirements. I also wish to have the book serve as a quick reference guide, so chapters are kept relatively short and focused on a particular topic.
With these levels, the reader watches the capacity of the PL/SQL language grow with the knowledge and skill of the developer. In addition, the reader applies the techniques learned in earlier chapters further on in the book, providing instant reinforcement. Each stage and example adds to the collection of solutions the reader has at her or his fingertips, ready to apply to a real world challenge. As a reference, the book's organization will allow the reader to quickly locate the topic and example she or he needs to meet the current, pressing need.
Whenever appropriate, I will supplement the narrative text and the code fragments with screen shots which show the PL/SQL code in the actual tool, tables and figures which provide graphical reinforcement of the text. In addition, I believe that some amount of humor is often extremely useful in improving the readability of a technical text.
Audience
This book is intended for anyone who uses PL/SQL to develop Oracle-based applications and has received at least introductory training in the language. Both beginners and more experienced users of PL/SQL will benefit from this book because many of its strategies, tips and techniques are available only from the author.
Oracle programmers generally receive only introductory training and then are left to fend for themselves when it comes to delivering efficient and maintainable production code. Existing trainings and third-party reference manuals do little more than regurgitate the contents of the Oracle Corporation documentation. On the other hand, it is widely recognized that programmers learn most effectively by example; this is especially true as regards the more complicated features of a product. Furthermore, while consultants are eager to demonstrate their expertise, they are often considerably less enthusiastic about sharing their "competitive edge" with in-house programmers.
As a result of these various factors, Oracle developers are greatly in need of resources which take them beyond the first, basic level of product understanding. They need books which can coach them with examples and the benefits of actual development experience so that they can greatly accelerate their learning curve towards a higher level of expertise.
I have worked with Oracle developers for over six years, both as a technical consultant for Oracle Corporation and as an independent consultant. I have seen over and over again that Oracle developers, no matter how competent, are unable to fully utilize their Oracle tools and achieve the maximum possible return on their significant investment in the software. More and more, this lack of sophistication is centered on the use (or mis-use) of the PL/SQL programming language.
Furthermore, as a registered subcontractor for Oracle Education, I know that Oracle itself does not even have a class for PL/SQL that goes beyond the most basic instruction and that users are hungry for this information.
Market Analysis
While I do not know enough about the volume of sales for books in the Oracle marketplace to offer a number, I believe that the potential for the sales of this book is strong precisely because:
PL/SQL is a core technology which has not yet been addressed in and of itself. As Oracle moves heavily into the client/server and GUI environment, this technology will prove ever more critical
All programmers who develop applications in any of the Oracle tools (current and next generation) must know how to use PL/SQL.
Existing trainings and books do not address the need for a deepening level of sophistication of PL/SQL programming.
In addition, I have a strong reputation within the Oracle user group community; I have been active authoring papers in user group newsletters and other publications. In addition I have presented papers at a number of conferences and also developed a utility for Oracle SQL*Forms developers for which I have over fifty customers. User awareness of an author is key to marketing a book effectively in the rapidly expanding world of Oracle developers.
Oracle is just making available widely its new Cooperative Development Environment of Windows-compliant development tools. As these products are more widely deployed, the PL/SQL component of the software will become even more critical. Finally, the full set of tools offers a confusing picture as concerns PL/SQL, since different versions of the programming language are available in different products and even within the same version, various features are disabled in some products. Developers need a book now that they can trust to guide them through this software tangle. The book should appear as soon as is possible.
Personal Qualifications
I have a bachelor's degree in mathematics and have worked as a programmer for thirteen years. I spent five years with Oracle Corporation. During and since that time, I established a reputation as a leading developer of Oracle-based applications, particularly with SQL*Forms Version 3. As the owner of ArtForms, I designed, built and currently market a debugger for SQL*Forms called XRay Vision. I have approximately fifty customers adn achieved widespread attention for this utility (a version of the debugger is made available free to all members of the International Oracle User Group via Compuserve as a membership benefit). I have been active within the Oracle user group community through the publication of articles in user group newsletters and other publications, such as the Oracle Corporation's own Oracle Integrator. In addition, I have published papers at a number of conferences, including the International Oracle User Week, and presented at both regional and national conferences, including ECO '94 in New York City in March 1994.
Saturday, March 03, 2007
A very cool mouse - and more about my ergonomic world
I now go to great and any available lengths to ensure that my setup is ergonomic and doing the least damage or stress to my body.
So...I have the latest Microsoft ergonomic keyboard and I love it. I encourage all of you to make the switch from a flat, straight keyboard. It's easy to see why. Hold your hands out in front of you. Notice how they naturally turn inwards? Now straighten them out so the palms are horizontal, as they would be to type on a "normal" keyboad. Feel the stress in your wrists?
I also sit on a ball chair to minimize slouching at the keyboard, improve abdominal tone and give me the opportunity to bounce up and down while I am working. Fun!
But for my mouse, I use a standard Logitech or Microsoft contoured mouse. Nice stuff, but as I paged through one of favorite catalogues (cyberguys.com), I came across a new sort of mouse that just im
mediately made sense to me: the Evoluent Vertical Mouse:Rather than forcing my hand to go flat, I can grip the mouse in a more natural vertical fashion, and then work the buttons on the vertical face of the mouse.
It is taking some getting used to, but again it is instantly obvious that this configuration results in less stress on my wrist. Thanks Evoluent!
Friday, March 02, 2007
I love to learn from others!
Fortunately, however, I still listen well enough (or selectively) to be able to learn from others.
I tell people attending my courses that if they think I say something wrong, or they have another way of doing things, to speak right up. I tell students that I learn something new in every course I give, and while that isn't really entirely true, it is true enough.
Well, I learned a very, very cool technique at OPP2007, the two day conference on PL/SQL organized by ODTUG (and I was the technical co-chair). My teacher in this case was Alex Nuijten of AMIS (whose Oracle team also won the Innovation and Community Award at OPP2007!).
OPP2007 was, by the way, a really fine event and if you write PL/SQL code you should be sure to attend the next one.
So, what did I learn? A very clever way to apply AUTHID CURRENT_USER to PL/SQL subprograms.
What the heck does that mean, you might ask. Well, AUTHID CURRENT_USER is a clause you can add to the header of your program (in the ZBI, as Bryn Llewellyn PL/SQL Product Manager, described it at OPP2007: the Zone Before the Is). It tells Oracle that when you run the program, any references to data objects (tables, views, etc.) should be resolved according to the privileges of the currently connected schema (the "invoker"), and not the owner of the program (the "definer"). That's why this feature is called "invoker rights."
But invoker rights only applies to data objects. If in your application, program A calls program B, and at the time of compilatoin B is resolved to be "APPDEV.B", then when you run A, it will call APPDEV.B, even if A is defined as AUTHID CURRENT_USER and you have your own program B in your schema.
Sorry, I know that was a rather dense explanation, but it is now 10:30 PM, I am sitting in the Admiral's Club business center at the San Fran airport, and I am tired. So that is all the explanation you get. The code below, however, should straighten things out for you.
So that's the problem: invoker rights doesn't affect the call stack of your programs.
Or does it?
The very cool technique that Alex shared during his excellent talk, Design Patterns in PL/SQL, is that you can use dynamic PL/SQL block execution to achieve the desired effect.
You can see this quite easily by running the following sequence of statements. Note that it assumes you have both the HR and SCOTT schemas present.
CONNECT hr/hr
CREATE OR REPLACE PROCEDURE show_user
AUTHID CURRENT_USER
IS
BEGIN
DBMS_OUTPUT.put_line ('HR!');
END show_user;
/
CREATE OR REPLACE PROCEDURE show_user_dynamic
AUTHID CURRENT_USER
IS
BEGIN
EXECUTE IMMEDIATE 'BEGIN show_user; END;';
END show_user_dynamic;
/
GRANT EXECUTE ON show_user_dynamic TO scott
/
GRANT EXECUTE ON show_user TO scott
/
CONNECT scott/tiger
SET serveroutput on
CREATE OR REPLACE PROCEDURE show_user
AUTHID CURRENT_USER
IS
BEGIN
DBMS_OUTPUT.put_line ('SCOTT!');
END show_user;
/
BEGIN
show_user;
hr.show_user;
hr.show_user_dynamic;
END;
/
After running this code you should see three lines of output:
SCOTT!
HR!
SCOTT!
And what it reveals is that when I call a program inside a dynamic PL/SQL block, then the invoker rights mechanism is applied to the "SQL" statement, and the reference to my program is resolved at runtime according to the privileges of the currently connected schema.
Brilliant!
Sunday, February 25, 2007
On the joy of being rational
Of course, that should come as no great surprise; logic is a critical factor of success in my chosen line of work: software programming.
In fact, all of cyberspace (as well as everything that humans manufacture from the "raw materials" of the world) is based on and needs reasoning, logic, rationality to work.
So, yes, sure, "cold, hard logic" is required to get beyond mere survival, mere existence.
But it is also a lot of fun. Fun, you say? How can it be fun to think about things like:
"If a = b and b = c, then a must surely equal c."
Well, heck, you don't have to ask me.
Ask the millions of people who are not software developers, who do not apply logic so explicitly and knowingly in their work do, but who, in fact, express their joy of being rationale on a daily basis.
I am talking about Sudoko players (and players of other logic puzzles). Same process as programming, but it is a game, and almost addictively enjoyable.
So that's one aspect of the joy of being rationale. I would like to offer another: applying logic and rationality to the activities of human beings to help clarify one's view of the world and how it works.
Today, I spent an hour or so shoveling off the crusty, heavy, wet snow/sleet/hail that fell last night in Chicago. As I did so, I found myself thinking about Martin Luther King and Martin Luther King Day. I have no idea why, I just did.
MLK is universally acknowledged to be a great hero (well, at least as universally acknowledged as is global warming).
And I support that sentiment. He was an incredibly courageous, smart, eloquent and compassionate human being. He was, in short, a good guy.
But you can't have good guys without bad guys, right? That only makes sense. That's only logical.
So who were the bad guys back then? Sure we always hear about Sheriff Eugene "Bull" Connor and others like him, who were in the front lines of maintaining segregation and Jim Crow laws. Who fired the guns, did the lynching, held the water cannons, and released the dogs.
But Connor was not a leader. He was doing his job. He was elected to his job and he was paid, he was protected and he protected in turn. "Elected?" you say to yourself. "Ah, I see where Steven is heading. All those people in the South were bad guys."
Yes and no. Anyone who actively supported segregation certainly was a "bad guy." And those who stood by in silence, whether out of fear or out of secret loathing, were also "bad guys," to some extent.
But let's fact it: most people living in the South then (and now) -- and not just the South -- had no power. The direction and content of their lives were largely determined by the those with real power: those with money, those with property, those who made sure that certain people were elected and not elected, those who financed the KKK and the Christian Conservative Council, as well as the City Councilmen.
The way I figure it, if MLK is a good guy, then the real bad guys of those days were the so -called leaders of our society. The CEOs of almost every corporations, the publishers of almost every newspapers, and certainly the politicians they put into place to write and pass laws that suited them and benefited them.
Isn't that obvious? Isn't this nothing more than simple logic?
Surely, we know how the world works, in our most cynical of hearts. We know that most Congresspeople are in the pockets of the lobbyists who provide most of the funds (and junkets to the Carribbean) that fill their election campaign coffers. We know that, more than ever before, the laws passed by Congress and signed by President Bush are in large part written by representatives of the companies that will benefit from those laws. Think: energy bill and Dick Cheney. Think: hundreds of millions of tax dollars spent on "mark ups" and sweet deals brokered behind closed doors in final "negotiating" sessions.
We also know that when things modern concepts like the 40 hour work week are finally enshrined in law, they are the result of massive social movements, of people who often sacrifice their lives, to bring about a modicum of justice in the world. And the reason they must do this is that they fight against the so-called leaders of our society who push back, who do everything they can for as long as they can to keep their power and wealth as concentrated as possible -- in their own hands.
Now, you might say, "Hey, that is just human nature. Dog eat dog. Nothing you can do about it."
And you might be right. There might not be much we can do about it -- except to work long and hard (decades, centuries) to push back against the most brutal aspects of human society, and make it a little bit more humane (like giving women and African Americans the vote, ending slavery, etc.), just a little bit at a time (and of course, there are periods of setbacks -- such as life under George W. Bush, during which we have seen our civil rights greatly eroded).
But at least while this is happening, at least while there are some people (and I am not so presumptuous as to include myself in this group) who are willing to sacrifice their well-being and often their lives for such noble goals, at least while there are heroes in the making and heroes to be saluted in the past, at least we can be honest and open about not just who the "good guys" were (and are), but also who the "bad guys" were (and are).
They live amongst us now.
They reap billions of dollars in unearned and outrageous compensation, while thousands of children sharing their town, city or state go hungry.
They have cozy dinners and meetings with Vice President Cheney, whenever they are in town.
They get your Congressperson on the phone for a chat whenever they feel the need.
They urge us to drink responsibly while pushing every irresponsible button in our brains.
And they have little or no conception of what it means to be hungry without the prospect of eating, ill without the prospect of receiving medical care, cold without the prospect of getting warm.
They are the most successful people in our society. We are taught to see them as role models, as the ideal to which we should strive. And they are, in so many ways, monsters.
At least that's what rationality leads me to believe.
Sunday, February 18, 2007
"Party in a box"? What irresponsible marketeers!
http://abclocal.go.com/kgo/story?section=automotive&id=5018164
Then check out this link (text below in case the link dies):
http://www.chicagotribune.com/news/local/chi-070211oswego,0,5584278.story
There is a growing realization that young men behind the wheel of a car are a particularly high-risk group for driving accidents. Gee, what a surprise. Testosterone coursing their veins like never before, advertisements shouting at them every way they turn about the sexiness of alcholol, the excitement of the "fast life"....of course teen drivers will be a menace to themselves and others.
States are now even passing laws restricting the number of teens allowed in cars when a teen is driving. Good idea, though how much any young buck will pay attention to this is another matter.
So given that state of affairs, I am outraged and appalled to find that Toyota and their super-hip Scion line are promoting one of their vehicles as a "party in a box."
I hope they catch lots of flak for this, publicly state their apology, and urge sensible driving.
Cars are not toys and they are not a good place for parties. In fact, I think Scion should drop their whole marketing line which is all about promoting their cars and things in which to strut and demonstrate one's superior coolness. Bad news all around.
Four teenagers killed in
By Jeff Long, Jack McCarthy and Andrew L. Wang
Published February 12, 2007, 12:04 AM CST
Four white crosses jutted from snow-covered ground along a road in
Andrew Allseitz, 15, visited the makeshift memorial by Illinois Highway 31 to pay respects to the girl who last week had asked him to her high school's "turnabout" dance. Jessica Nutoni, 15, never got to give her date the gifts she had bought: a chocolate heart, a teddy bear and a Valentine's Day card.
Allseitz received the gifts Sunday morning through Nutoni's family, said his older brother Matt, "but he hasn't been able to open the card yet."
On a cold, gray Sunday, dozens of teens—eyes full of tears, hearts heavy with grief—stopped to stand vigil before the crosses, one of which was affixed with the photocopied text of the 23rd Psalm.
Meanwhile, authorities charged the car's driver, Sandra Vasquez, 24, of
The crash made the weekend the third one in a row in the
The four teenagers killed were all pronounced dead at the scene. In addition to Nutoni, they were identified as Katherine Merkel, 14, Tiffany Urso, 16, and Matthew Frank, 17, said Kendall County Deputy Coroner Jacquie Marcellis.
Autopsies were not conducted because the cause of death—ruled multiple blunt force trauma—was apparent, she added.
Police did not release Vasquez's blood-alcohol level, though she was tested "and the results were high enough to charge her," said
He said the drunken-driving charge is a misdemeanor, but the
Vasquez and four other Oswego High students ranging in age from 14 to 16 were taken to Advocate Good Samaritan Hospital in Downers Grove or
Vasquez's father, Jesus, said he felt "real bad for the families" of the teens involved in the crash.
He said he did not know where his daughter was headed Sunday morning or why she was with the teenagers.
"As far I know, she was just giving them a ride home," he said, standing in the doorway of his
He said he spent most of the day in the hospital with his daughter but on doctors' orders did not talk to her about the crash.
"They said ... she is going to make it," her father said, but "they don't know about internal injuries."
Authorities said Sunday that the accident was still under investigation. Still unclear was whether any of the occupants were wearing seat belts.
"With nine kids there could have been only five that were wearing seat belts," Sherwood said.
Police said the car's passenger side struck the pole first, and the impact caused temporary power outages in the area.
Friday, February 16, 2007
An exciting day for Yours Truly
I am in Aliso Viejo, where Quest Software is headquartered. And today, at noon, PST, Quest Code Tester for Oracle 1.5.1 goes "GA", that is, becomes generally available.
In other words, Oracle technologists can now purchase and use the commercial version of the first automated testing tool for PL/SQL programs.
It's a big day, because I have worked very hard for a couple of years now to bring to fruition what was formerly just a vision. That vision was a response to this very hard reality:
We programmers will never have enough time to write all the test code needed to test our programs.
My vision:
To achieve comprehensive testing, we need a tool that will automatically generate the test code, run that test code and automatically verify the results.
In other words, let me focus on writing my programs. Let me simply describe the tests I need and then let someone else / something else do the "heavy lifting." Ah, that sounds sweet.
And the reality:
Quest Code Tester for Oracle 1.5
If you write PL/SQL code, if you manage a team of PL/SQL developers, you owe it to yourself to download the trial version and check out Quest Code Tester. I am convinced it will completely revolutionize how you test your code.
Lots of people have told me they really like my books and have learned a lot from me. That makes me happy. But I am convinced that in years to come, I will be remembered most not as the author of those books, but as the creator of Quest Code Tester. That's how excited I am about this tool.
Some other PL/SQL news that makes me feel good: I got an email from a developer complaining that registration for OPP2007, our two-day conference on PL/SQL, was closed. After a few calls and some hard work by the conference organizers, we opened registration again, but it sure is nice to know that we have so many people wanting to attend this intensive training experience. If you are doing PL/SQL programming, please check out the conference, and see if you can attend.
Saturday, February 03, 2007
Sharing the wealth (of knowledge and expertise)
I was pleased to see that everyone seemed to get along well, there wasn't any great reluctance to ask questions (that is, admit ignorance), and several attendees didn't hesitate to challenge my ideas and suggest other ways of doing things. Just the way I like it!
Yet, as with so many other organizations I'd visited, and developers I'd trained, they hadn't come up with any thorough and effective ways to share information, techniques and code among the various application teams.
I've always been surprised at this situation. In company after company, there will be dozens to even hundreds of PL/SQL developers working virtually side by side, yet also coding largely in isolation. Some companies will hold occasional, informal brown bag lunches, others might make some limited gestures at using Sharepoint or Lotus Notes or wikis to share some ideas. But it seemed that many developers would still end up reinventing the wheel, over and over again.
What a waste!
Now, I don't think this situation arises because developers don't want to share, or want to write everything from scratch. It can just be very hard to organize material, make it accessible, keep it current, create libraries or toolboxes of generic, reusable code, and so on. Everyone's busy and resources are limited.
I got to thinking about this on the plane ride home (yes, I am writing this at 37,000 feet) and realized that this situation is never going to change. Resources will always be tight. Time will always be precious. And expertise will reside largely in the brains of individuals, not written down on paper or deposited in some collaborative repository.
I had a revelation on the plane: if this is how it is going to be, why fight that? Why not accept reality and work with it?
So I came up with a simple idea that might actually help address this problem. For my full recording of thoughts on this topic, please visit my ToadWorld blog.
