Friday, December 19, 2008


After three extensions, and what I imagine was two weeks of running at risk, my executed contract extension came back today. It looks like I'm employed until next Thanksgiving.

Thursday, December 11, 2008

Hedging the Cost of Energy

What an exciting year for energy! If you were an investing genius like me, you bought high and sold low. All is not lost, however, because my investments in energy were (mostly) just a hedge, so they did exactly what they were supposed to do.

For example: my electric bill is about $100 per month, so in January I purchased $1200.00 in Dominion directly through Dominion DRIPS. Today, my stock is worth $1,020.98 (though I have more shares because of dividend payments). Even though the value of my stock went down, my energy costs went down, which should offset the loss. I'll be investing another $1200.00 next month.

Maybe you don't pay an electric bill, but you do put gas in your car. I decided to look at my last year of spending on gas, lined up against the average price of a gallon of gas in the US:

I spent an average of $119.02 every two weeks, or $2,856.42 for the year. This number is slightly inflated if you consider that I pay for gas with my American Express Blue Cash card, which rewards me 1.0% on gas for the first $6,500.00 per year I charge on the card, and 5% on gas after I pass the $6,500.00 mark. As of October's statement (11 months), I had earned $247.54 on $6,249.73 spending (including Gas,Grocery, & Drugstore).

So what does all this mean? If I spend roughly $3,000.00 a year on gas, I should be hedging that amount in an equivalent energy hedge. That way, if the price of gas goes up, the value of my hedge goes up as well. If it goes down, even though the value of my hedge is reduced, so is the amount I spend on gas. This way, I'm don't get it coming and going when commodity prices fluctuate (which they are expected to through 2010 as we ease out of the current recession).

Now, where do you park your money? You could buy stock in Exxon-Mobile (a company forged in the fires of hell from pure evil), Shell, Chevon, BP, or any other company with a big stake in US retail gas sales. You could invest directly in oil through an exchange traded fund (ETF) like USO. You could invest in the broader energy market through an ETF like Vanguard's Energy ETF.

However you decide to hedge, it's something you should put on your list of New Year's resolutions.

Friday, December 05, 2008


Next Mon/Tue and the following Mon/Tue/Wed, I'll be in iPhone SDK development training. By Christmas, I will have built my social networking War on Christmas app, putting that fat bitch Santa-Jesus on the unemployment rolls.

Cranky Friday

My cell phone has rung off the hook today.

I did something to hurt my lower back.

I had an incredibly annoying conference call this morning.

The only thing that will turn my day around is the french press I just made myself.

Friday, November 14, 2008

gforge hero

We use gforge for our software projects: tracking bugs and feature requests, storing documentation, and a bunch of other silly shit. Gforge is, in my opinion, somewhere between Jira (high end) and Bugzilla (low end) in the usability spectrum for this type of software. Likewise, beef bullion is somewhere between prime rib and feces in my choices for dinner tonight.

On November 6th, like a good project manager, I was cleaning up the enhancement tracker by removing choices from drop downs that aren't valid anymore (we renamed our 2.0.3 release 2.1, so 2.0.4 will now become 2.2), and accidentally deleted the entire enhancement request tracker. The error message doesn't tell you what you're doing (the cranky gforge admin didn't even blame me or say I fucked up), and I'm the fourth person to do this in as many years.

Our RFE tracker is 300+ items, collected over 4+ years, and includes notes, history, status, and all kinds of other information. This was a huge deal. Our system team, unwilling to restore a backup (which would punish everyone by obliterating their work for that day), restored a backup to our QA instance and told me to retype everything from there. I asked for access to the database and said I'd write the fix myself. I'm sure they were like 'whatever...project manager'.

My solution: archive tables and triggers on the 13 tables that hold tracker information (which I reverse engineered though my local backup/restore). Not only could I recover my shit this way, but the next fuckup won't be typing for days for a bad keystroke.

Unlike me -- who has used Oracle, SQL Server, Sybase, DB2, Informix, and MySQL -- gforge uses postgres. That meant I had to teach myself how to code for postgres (which, being based on Ingres, is 80% Oracle and 20% schizophrenic milk man). I could write 5 pages of the sillyness that is postgres (look: I'm Ada-like, but everything is a function, and triggers can't contain the trigger code, they must call a function that returns type trigger). Criminy.

I finally had a good backup and local copy of the db 11-NOV, had the archive table and trigger code written and debugged 12-NOV, and finished all the functions to restore and test by 13-NOV. I tested everything today, and all my codes without a single correction (and my test cases are tight as hell).

Now we just need to "delete" the data from QA, backup/restore the archive tables to production, and use my code to turn hamburger back into cow. I'm no expect, but I think I win.

-- Table: 1.) deleted_artifact_history
--DROP TABLE deleted_artifact_history;
CREATE TABLE deleted_artifact_history(
like artifact_history
ALTER TABLE deleted_artifact_history OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_history TO postgres;
ALTER TABLE deleted_artifact_history ADD PRIMARY KEY (id);

-- Function: fn_deleted_artifact_history
CREATE OR REPLACE FUNCTION fn_deleted_artifact_history()
RETURNS trigger AS
INSERT INTO deleted_artifact_history SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_history on artifact_history
--DROP TRIGGER deleted_artifact_history ON artifact_history;
CREATE TRIGGER deleted_artifact_history
ON artifact_history
EXECUTE PROCEDURE fn_deleted_artifact_history();
-- Table: 2.) deleted_artifact_file
--DROP TABLE deleted_artifact_file;
CREATE TABLE deleted_artifact_file(
like artifact_file
ALTER TABLE deleted_artifact_file OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_file TO postgres;
ALTER TABLE deleted_artifact_file ADD PRIMARY KEY (id);

-- Function: fn_deleted_artifact_file
CREATE OR REPLACE FUNCTION fn_deleted_artifact_file()
RETURNS trigger AS
INSERT INTO deleted_artifact_file SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_file on artifact_file
--DROP TRIGGER deleted_artifact_file ON artifact_file;
CREATE TRIGGER deleted_artifact_file
ON artifact_file
EXECUTE PROCEDURE fn_deleted_artifact_file();
-- Table: 3.) deleted_artifact_group_list
--DROP TABLE deleted_artifact_group_list;
CREATE TABLE deleted_artifact_group_list(
like artifact_group_list
ALTER TABLE deleted_artifact_group_list OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_group_list TO postgres;
ALTER TABLE deleted_artifact_group_list ADD PRIMARY KEY (group_artifact_id);

-- Function: fn_deleted_artifact_group_list
CREATE OR REPLACE FUNCTION fn_deleted_artifact_group_list()
RETURNS trigger AS
INSERT INTO deleted_artifact_group_list SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_group_list on artifact_group_list
--DROP TRIGGER deleted_artifact_group_list ON artifact_group_list;
CREATE TRIGGER deleted_artifact_group_list
ON artifact_group_list
EXECUTE PROCEDURE fn_deleted_artifact_group_list();
-- Table: 4.) deleted_artifact_extra_field_data
--DROP TABLE deleted_artifact_extra_field_data;
CREATE TABLE deleted_artifact_extra_field_data(
like artifact_extra_field_data
ALTER TABLE deleted_artifact_extra_field_data OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_extra_field_data TO postgres;
ALTER TABLE deleted_artifact_extra_field_data ADD PRIMARY KEY (data_id);

-- Function: fn_deleted_artifact_extra_field_data
CREATE OR REPLACE FUNCTION fn_deleted_artifact_extra_field_data()
RETURNS trigger AS
INSERT INTO deleted_artifact_extra_field_data SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_extra_field_data on artifact_extra_field_data
--DROP TRIGGER deleted_artifact_extra_field_data ON artifact_extra_field_data;
CREATE TRIGGER deleted_artifact_extra_field_data
ON artifact_extra_field_data
EXECUTE PROCEDURE fn_deleted_artifact_extra_field_data();
-- Table: 5.) deleted_artifact_extra_field_list
--DROP TABLE deleted_artifact_extra_field_list;
CREATE TABLE deleted_artifact_extra_field_list(
like artifact_extra_field_list
ALTER TABLE deleted_artifact_extra_field_list OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_extra_field_list TO postgres;
ALTER TABLE deleted_artifact_extra_field_list ADD PRIMARY KEY (extra_field_id);

-- Function: fn_deleted_artifact_extra_field_list
CREATE OR REPLACE FUNCTION fn_deleted_artifact_extra_field_list()
RETURNS trigger AS
INSERT INTO deleted_artifact_extra_field_list SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_extra_field_list on artifact_extra_field_list
--DROP TRIGGER deleted_artifact_extra_field_list ON artifact_extra_field_list;
CREATE TRIGGER deleted_artifact_extra_field_list
ON artifact_extra_field_list
EXECUTE PROCEDURE fn_deleted_artifact_extra_field_list();
-- Table: 6.) deleted_artifact_perm
--DROP TABLE deleted_artifact_perm;
CREATE TABLE deleted_artifact_perm(
like artifact_perm
ALTER TABLE deleted_artifact_perm OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_perm TO postgres;
ALTER TABLE deleted_artifact_perm ADD PRIMARY KEY (id);

-- Function: fn_deleted_artifact_perm
CREATE OR REPLACE FUNCTION fn_deleted_artifact_perm()
RETURNS trigger AS
INSERT INTO deleted_artifact_perm SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_perm on artifact_perm
--DROP TRIGGER deleted_artifact_perm ON artifact_perm;
CREATE TRIGGER deleted_artifact_perm
ON artifact_perm
EXECUTE PROCEDURE fn_deleted_artifact_perm();
-- Table: 7.) deleted_artifact_type_monitor
--DROP TABLE deleted_artifact_type_monitor;
CREATE TABLE deleted_artifact_type_monitor(
like artifact_type_monitor
ALTER TABLE deleted_artifact_type_monitor OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_type_monitor TO postgres;
ALTER TABLE deleted_artifact_type_monitor ADD PRIMARY KEY (group_artifact_id,user_id);

-- Function: fn_deleted_artifact
CREATE OR REPLACE FUNCTION fn_deleted_artifact_type_monitor()
RETURNS trigger AS
INSERT INTO deleted_artifact_type_monitor SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_type_monitor on artifact_type_monitor
--DROP TRIGGER deleted_artifact_type_monitor ON artifact_type_monitor;
CREATE TRIGGER deleted_artifact_type_monitor
ON artifact_type_monitor
EXECUTE PROCEDURE fn_deleted_artifact_type_monitor();
-- Table: 8.) deleted_artifact_query
--DROP TABLE deleted_artifact_query;
CREATE TABLE deleted_artifact_query(
like artifact_query
ALTER TABLE deleted_artifact_query OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_query TO postgres;
ALTER TABLE deleted_artifact_query ADD PRIMARY KEY (artifact_query_id);

-- Function: fn_deleted_artifact_query
CREATE OR REPLACE FUNCTION fn_deleted_artifact_query()
RETURNS trigger AS
INSERT INTO deleted_artifact_query SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_query on artifact_query
--DROP TRIGGER deleted_artifact_query ON artifact_query;
CREATE TRIGGER deleted_artifact_query
ON artifact_query
EXECUTE PROCEDURE fn_deleted_artifact_query();
-- Table: 9.) deleted_artifact_query_fields
--DROP TABLE deleted_artifact_query_fields;
CREATE TABLE deleted_artifact_query_fields(
like artifact_query_fields
ALTER TABLE deleted_artifact_query_fields OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_query_fields TO postgres;
ALTER TABLE deleted_artifact_query_fields ADD PRIMARY KEY (artifact_query_id, query_field_type, query_field_id);

-- Function: fn_deleted_artifact_query_fields
CREATE OR REPLACE FUNCTION fn_deleted_artifact_query_fields()
RETURNS trigger AS
INSERT INTO deleted_artifact_query_fields SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_query_fields on artifact_query_fields
--DROP TRIGGER deleted_artifact_query_fields ON artifact_query_fields;
CREATE TRIGGER deleted_artifact_query_fields
ON artifact_query_fields
EXECUTE PROCEDURE fn_deleted_artifact_query_fields();
-- Table: 10.) deleted_artifact_monitor
--DROP TABLE deleted_artifact_monitor;
CREATE TABLE deleted_artifact_monitor(
like artifact_monitor
ALTER TABLE deleted_artifact_monitor OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_monitor TO postgres;
ALTER TABLE deleted_artifact_monitor ADD PRIMARY KEY (artifact_id, user_id);

-- Function: fn_deleted_artifact_monitor
CREATE OR REPLACE FUNCTION fn_deleted_artifact_monitor()
RETURNS trigger AS
INSERT INTO deleted_artifact_monitor SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_monitor on artifact_monitor
--DROP TRIGGER deleted_artifact_monitor ON artifact_monitor;
CREATE TRIGGER deleted_artifact_monitor
ON artifact_monitor
EXECUTE PROCEDURE fn_deleted_artifact_monitor();
-- Table: 11.) deleted_artifact_message
--DROP TABLE deleted_artifact_message;
CREATE TABLE deleted_artifact_message(
like artifact_message
ALTER TABLE deleted_artifact_message OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_message TO postgres;
ALTER TABLE deleted_artifact_message ADD PRIMARY KEY (id);

-- Function: fn_deleted_artifact_message
CREATE OR REPLACE FUNCTION fn_deleted_artifact_message()
RETURNS trigger AS
INSERT INTO deleted_artifact_message SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_message on artifact_message
--DROP TRIGGER deleted_artifact_message ON artifact_message;
CREATE TRIGGER deleted_artifact_message
ON artifact_message
EXECUTE PROCEDURE fn_deleted_artifact_message();
-- Table: 12.) deleted_artifact_counts_agg
--DROP TABLE deleted_artifact_counts_agg;
CREATE TABLE deleted_artifact_counts_agg(
like artifact_counts_agg
ALTER TABLE deleted_artifact_counts_agg OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact_counts_agg TO postgres;
ALTER TABLE deleted_artifact_counts_agg ADD PRIMARY KEY (group_artifact_id);

-- Function: fn_deleted_artifact_counts_agg
CREATE OR REPLACE FUNCTION fn_deleted_artifact_counts_agg()
RETURNS trigger AS
INSERT INTO deleted_artifact_counts_agg SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact_counts_agg on artifact_counts_agg
--DROP TRIGGER deleted_artifact_counts_agg ON artifact_counts_agg;
CREATE TRIGGER deleted_artifact_counts_agg
ON artifact_counts_agg
EXECUTE PROCEDURE fn_deleted_artifact_counts_agg();
-- Table: 13.) deleted_artifact
--DROP TABLE deleted_artifact;
CREATE TABLE deleted_artifact(
like artifact
ALTER TABLE deleted_artifact OWNER TO postgres;
GRANT ALL ON TABLE deleted_artifact TO postgres;
ALTER TABLE deleted_artifact ADD PRIMARY KEY (artifact_id);

-- Trigger: deleted_artifact_update_last_modified_date on deleted_artifact
--DROP TRIGGER deleted_artifact_update_last_modified_date ON deleted_artifact;
CREATE TRIGGER deleted_artifact_update_last_modified_date
ON deleted_artifact
EXECUTE PROCEDURE update_last_modified_date();

-- Function: fn_deleted_artifact
CREATE OR REPLACE FUNCTION fn_deleted_artifact()
RETURNS trigger AS
INSERT INTO deleted_artifact SELECT OLD.*;
LANGUAGE 'plpgsql';

-- Trigger: deleted_artifact on artifact
--DROP TRIGGER deleted_artifact ON artifact;
CREATE TRIGGER deleted_artifact
ON artifact
EXECUTE PROCEDURE fn_deleted_artifact();

-- Test Case: I. Archive Deleted Records
-- Precondition 1) Deleted tables have 0 records
-- 2) Artifact tables have N records
-- Postcondition 1) Deleted tables have N records
-- 2) Artifact tables reduced by N records
-- Execution 1) In isolation (from SQL prompt)
-- 2) Through gforge GUI
-- Test Case: II. Restore Deleted Records
-- Precondition: 1) Deleted tables have X records
-- 2) Artifact tables have Y records
-- Postcondition 1) Deleted tables have 0 records
-- 2) Artifact tables = X + Y records
-- Execution 1) In isolation (from SQL prompt)
-- 2) Through gforge GUI
CREATE TABLE testRecordCount (
run_type varchar,
artifact integer NOT NULL,
d_artifact integer NOT NULL,
a_history integer NOT NULL,
d_a_history integer NOT NULL,
a_file integer NOT NULL,
d_a_file integer NOT NULL,
a_extra_field_data integer NOT NULL,
d_a_extra_field_data integer NOT NULL,
a_group_list integer NOT NULL,
d_a_group_list integer NOT NULL,
a_perm integer NOT NULL,
d_a_perm integer NOT NULL,
a_type_monitor integer NOT NULL,
d_a_type_monitor integer NOT NULL,
a_query integer NOT NULL,
d_a_query integer NOT NULL,
a_query_fields integer NOT NULL,
d_a_query_fields integer NOT NULL,
a_monitor integer NOT NULL,
d_a_monitor integer NOT NULL,
a_message integer NOT NULL,
d_a_message integer NOT NULL,
a_counts_agg integer NOT NULL,
d_a_counts_agg integer NOT NULL,
run_date date NOT NULL DEFAULT now()

CREATE OR REPLACE FUNCTION populateTestRecordCount (notes varchar, tracker_id int)
v_artifact int;
v_d_artifact int;
v_a_history int;
v_d_a_history int;
v_a_file int;
v_d_a_file int;
v_a_extra_field_data int;
v_d_a_extra_field_data int;
v_a_group_list int;
v_d_a_group_list int;
v_a_perm int;
v_d_a_perm int;
v_a_type_monitor int;
v_d_a_type_monitor int;
v_a_query int;
v_d_a_query int;
v_a_query_fields int;
v_d_a_query_fields int;
v_a_monitor int;
v_d_a_monitor int;
v_a_message int;
v_d_a_message int;
v_a_counts_agg int;
v_d_a_counts_agg int;
-- Artifact Tables
select into v_artifact count(*) from artifact; --where group_artifact_id=tracker_id;
select into v_a_history count(*) from artifact_history;
--where artifact_id in (select artifact_id from artifact where group_artifact_id=tracker_id);
select into v_a_file count(*) from artifact_file;
--where artifact_id in (select artifact_id from artifact where group_artifact_id=tracker_id);
select into v_a_extra_field_data count(*) from artifact_extra_field_data;
--where artifact_id in (select artifact_id from artifact where group_artifact_id=tracker_id);
select into v_a_group_list count(*) from artifact_group_list; --where group_artifact_id=tracker_id;
select into v_a_perm count(*) from artifact_perm; --where group_artifact_id=tracker_id;
select into v_a_type_monitor count(*) from artifact_type_monitor; --where group_artifact_id=tracker_id;
select into v_a_query count(*) from artifact_query; --where group_artifact_id=tracker_id;
select into v_a_query_fields count(*) from artifact_query_fields;
--where artifact_query_id in (select artifact_query_id from artifact_query where group_artifact_id=tracker_id);
select into v_a_monitor count (*) from artifact_monitor;
select into v_a_message count (*) from artifact_message;
select into v_a_counts_agg count (*) from artifact_counts_agg;
-- Deleted Tables
select into v_d_artifact count(*) from deleted_artifact where group_artifact_id=tracker_id;
select into v_d_a_history count(*) from deleted_artifact_history where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
select into v_d_a_file count(*) from deleted_artifact_file where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
select into v_d_a_extra_field_data count(*) from deleted_artifact_extra_field_data where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
select into v_d_a_group_list count(*) from deleted_artifact_group_list where group_artifact_id=tracker_id;
select into v_d_a_perm count(*) from deleted_artifact_perm where group_artifact_id=tracker_id;
select into v_d_a_type_monitor count(*) from deleted_artifact_type_monitor where group_artifact_id=tracker_id;
select into v_d_a_query count(*) from deleted_artifact_query where group_artifact_id=tracker_id;
select into v_d_a_query_fields count(*) from deleted_artifact_query_fields where artifact_query_id in (
select artifact_query_id from deleted_artifact_query where group_artifact_id=tracker_id
select into v_d_a_monitor count (*) from deleted_artifact_monitor;
select into v_d_a_message count (*) from deleted_artifact_message;
select into v_d_a_counts_agg count (*) from deleted_artifact_counts_agg;
-- Populate Test Table with Counts
INSERT INTO testRecordCount (
run_type, artifact, d_artifact, a_history, d_a_history,
a_file, d_a_file, a_extra_field_data, d_a_extra_field_data,
a_group_list, d_a_group_list, a_perm, d_a_perm,
a_type_monitor, d_a_type_monitor, a_query, d_a_query,
a_query_fields, d_a_query_fields, a_monitor, d_a_monitor,
a_message, d_a_message, a_counts_agg, d_a_counts_agg
notes, v_artifact, v_d_artifact, v_a_history, v_d_a_history,
v_a_file, v_d_a_file, v_a_extra_field_data, v_d_a_extra_field_data,
v_a_group_list, v_d_a_group_list, v_a_perm, v_d_a_perm,
v_a_type_monitor, v_d_a_type_monitor, v_a_query, v_d_a_query,
v_a_query_fields, v_d_a_query_fields, v_a_monitor, v_d_a_monitor,
v_a_message, v_d_a_message, v_a_counts_agg, v_d_a_counts_agg
$$ LANGUAGE 'plpgsql';

-- Test Deleting Records
CREATE OR REPLACE FUNCTION testRecordDelete (tracker_id int)
-- artifact_history, file, and extra_field_data have fk's to artifact
delete from artifact_history where artifact_id in (
select artifact_id from artifact where group_artifact_id=tracker_id
delete from artifact_file where artifact_id in (
select artifact_id from artifact where group_artifact_id=tracker_id
delete from artifact_extra_field_data where artifact_id in (
select artifact_id from artifact where group_artifact_id=tracker_id
delete from artifact_monitor where artifact_id in (
select artifact_id from artifact where group_artifact_id=tracker_id
delete from artifact_message where artifact_id in (
select artifact_id from artifact where group_artifact_id=tracker_id
delete from artifact where group_artifact_id=tracker_id;
-- group_list, perm, type_monitor, counts_agg are straight forward
delete from artifact_perm where group_artifact_id=tracker_id;
delete from artifact_group_list where group_artifact_id=tracker_id;
delete from artifact_type_monitor where group_artifact_id=tracker_id;
delete from artifact_counts_agg where group_artifact_id=tracker_id;
-- query_history needs query to turn hamburger back into cow
delete from artifact_query_fields where artifact_query_id in (
select artifact_query_id from artifact_query where group_artifact_id=tracker_id
delete from artifact_query where group_artifact_id=tracker_id;
$$ LANGUAGE 'plpgsql';

-- Restore Records
CREATE OR REPLACE FUNCTION RecordRestore (tracker_id int)
-- artifact_group_list (disable trigger before restore)
alter table artifact_group_list disable trigger artifactgrouplist_insert_trig;
insert into artifact_group_list select * from deleted_artifact_group_list where group_artifact_id=tracker_id;
alter table artifact_group_list enable trigger artifactgrouplist_insert_trig;
delete from deleted_artifact_group_list where group_artifact_id=tracker_id;
-- artifact_query & artifact_query_fields
insert into artifact_query select * from deleted_artifact_query where group_artifact_id=tracker_id;
insert into artifact_query_fields select * from deleted_artifact_query_fields where artifact_query_id in (
select artifact_query_id from deleted_artifact_query where group_artifact_id=tracker_id
delete from deleted_artifact_query_fields where artifact_query_id in (
select artifact_query_id from deleted_artifact_query where group_artifact_id=tracker_id
delete from deleted_artifact_query where group_artifact_id=tracker_id;
-- artifact_perm & artifact_type_monitor
insert into artifact_counts_agg select * from deleted_artifact_counts_agg where group_artifact_id=tracker_id;
insert into artifact_perm select * from deleted_artifact_perm where group_artifact_id=tracker_id;
insert into artifact_type_monitor select * from deleted_artifact_type_monitor where group_artifact_id=tracker_id;
delete from deleted_artifact_counts_agg where group_artifact_id=tracker_id;
delete from deleted_artifact_perm where group_artifact_id=tracker_id;
delete from deleted_artifact_type_monitor where group_artifact_id=tracker_id;
-- fish desired records out of deleted_artifact, restore, clean up
insert into artifact select * from deleted_artifact where group_artifact_id=tracker_id;
insert into artifact_history select * from deleted_artifact_history where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
insert into artifact_file select * from deleted_artifact_file where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
insert into artifact_extra_field_data select * from deleted_artifact_extra_field_data where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
insert into artifact_monitor select * from deleted_artifact_monitor where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
insert into artifact_message select * from deleted_artifact_message where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact_message where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact_monitor where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact_extra_field_data where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact_file where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact_history where artifact_id in (
select artifact_id from deleted_artifact where group_artifact_id=tracker_id
delete from deleted_artifact where group_artifact_id=tracker_id;
$$ LANGUAGE 'plpgsql';

Wednesday, November 12, 2008

iPhone App: Kitten Escape

It is a game that moves the block, and goes out of the kitten that has been confined. Kitten Escape is said "Daughter in the Box" of classical slide puzzle game.

Kitten reminds me of my old friend, CATS...

You have no chance to survive. Make your time. Haha!

Wednesday, November 05, 2008

CNN Now Projecting a Ratings Win for Themselves

Had you known before the polls closed, would you have voted for a Hologram instead of a human?

Fox News probably had to execute a terrorist live to get people to turn away from this marvel. It's like the advent of the talkies, only not-so-much.

Gizmodo has a write up if you're curious how it works.

Google's 'Relief' Gadget

Live here.


Tuesday, November 04, 2008

'Democracy in Action' does not mean 'hack our listservs'

A succession of three emails from the Provost of George Mason. First:

Date: Tue, 04 Nov 2008 00:41:05 -0500
From: Office of the Provost
Subject: Additional Info on Election Day

To the Mason Community:

I hear some troubling rumors, so here are a couple of facts: 1. The election is Nov. 4, for all political parties. The notion that one party votes Nov. 5 is UNTRUE. 2. It is also UNTRUE that any student jeopardizes financial aid by voting.

Peter N. Stearns


Date: Tue, 04 Nov 2008 01:16:42 -0500
From: Office of the Provost
Subject: Election Day Update

To the Mason Community:

Please note that election day has been moved to November 5th. We apologize for any inconvenience this may cause you.

Peter N. Stearns


Date: Tue, 04 Nov 2008 08:08:21 -0500
From: Office of the Provost
Subject: Urgent Voting Information

Dear Colleagues,

It has come to my attention early this morning that a message was hacked into the system fraudulently stating that election day has been moved. I am sure everybody realizes this is a hoax, it is also a serious offense and we are looking into it. Please be reminded that election day is today, November 4th.

Peter N. Stearns

I spent exactly 30 seconds looking at the headers of the second message and found:

Received: from ([])
by with ESMTP; Tue, 04 Nov 2008 01:16:42 -0500
Received: from [] ([]

Apparently someone at Democracy In Action in DC wants to keep our browner students away from the polls today? Don't they know Mason is a commuter school?

Friday, October 24, 2008

Google News, Finance need to stop ignoring each other

I found yet another bug in Google News. To give some content, the stock market is down a shit-ton right now. I head over to GNews and see:

That the DJ closed UP 172 points? But it's the middle of the trading day, and doom is everywhere. Let's ask Google Finance:

Oh nevermind, it's DOWN 373 points!

Honest mistake for 3 year old betaware.

Friday, October 17, 2008

You piss me off real good! I no talk to you.

Kristin: um, again, chick question... but are you mad at me about something? Or is the shortness cause you're wicked busy and I keep interrupting
theAlphaJohn: haha
theAlphaJohn: im on a conference call
theAlphaJohn: just working on stuff in the background
theAlphaJohn: not mad at you at all
Kristin: ok... whew
Kristin: well... I hope you come out tomorrow night
Kristin: haven't seen you in 100 years
Kristin: would be nice to shake it on the dancefloor with you
theAlphaJohn: yeah it's been a while
theAlphaJohn: are you still white?
Kristin: lmao
Kristin: as far as I know
Kristin: I'm still a chick as you can tell
theAlphaJohn: im all asian now
Kristin: really...
theAlphaJohn: i hear yellow fever is the new black
Kristin: LMAO
Kristin: alrighty!
Kristin: does that require surgery?
theAlphaJohn: not much
theAlphaJohn: it's all outpatient
Kristin: oh good...
Kristin: as long as they don't have to remove you nipples and reattach them
theAlphaJohn: then hair dye, spray on tan, and lots of anime / graphic novels (read: comic books for people with masters degrees)
Kristin: omg
theAlphaJohn: would you like me to go back to being terse?
Kristin: NO!
Kristin: that was not a complaint

McCain Hilarious at Al Smith 2008 Dinner

Seriously. I was laughing my ass off in the car last night. C-SPAN has the entire dinner, McCain's speech starts at 7:10 ::

There are signs of hope, even in this room full of proud, Manhattan Democrats. I can't shake that feeling that some people in here are pulling for me. I'm delighted to see you here tonight, Hillary. Where's Bill, by the way? Can't he take one night off from his tireless quest to make the man who defeated his wife the next President? The man is a relentless advocate for the Obama campaign, and he has a subtle approach to making the case. When a reporter asked him if Senator Obama was qualified to be President, Bill Clinton pointed out, "Sure. He's over 35 years of age and a US citizen". He was pandering to the strict constructionist crowd!

The entire transcript is here.

For serious, where has this speech writer been hiding?

Friday, October 03, 2008

The Real VP Debate

From Jared:

In Kung Fu Election, Michelle can battle Cindy.

Thursday, October 02, 2008

Found a Bug in HSBC Online Banking

I bank with Bank of America, but my savings is with Citibank because (1) better interest rate, and (2) there is a branch close to my house. With my savings, I prefer to swing by the branch and make my deposits (it's like putting money in a piggy bank...oink). With the exception of savings and my safe deposit box, I do everything else online.

In August, I opened up an HSBC credit card to pay for the deck: it's 0% interest for 12 months, so I figured I'd passively do some credit card arbitrage and make interest for a year on the balance.

Since a brand new HSBC branch opened about a mile from house this summer, and their savings rate is about a point higher than Citibank, I decided on 26-September to open an online savings account and a CD.

I actually have three (3) checking accounts at BofA, with the so-called primary account just trafficking my mortgage (money in, payments out). I indicated on the application for HSBC to fund the initial deposit from my 2nd BofA account, and to verify online (instead of a trial deposit). This lets you enter your online banking credentials so it can make sure you're who you say you are (much like Quicken or MS Money, both of which suck).

I clickity-click in my bank information, and it fails twice, then tells me it's going to go ahead and do trial deposits. Yesterday, I receive an email that my trial deposits are there, and to verify them so it can fund my new accounts.

I log in to BofA, and the trial deposits aren't in account #2, they're in account #1. It failed b/c the account I request to use in the online verification is not the primary for my online banking account.

I sent an email to HSBC this morning, but I have not received a response. I called their 800-number (which sounds to be in Bangalore), and was told I entered the wrong account number. I described what happened in exacting detail, but the rep kept arguing that I put in that account number (yes, you're right, I typed in an account number I don't know, instead of the one I use all the time). My options were to mail in a check, or have my application deleted and start over.

As you can imagine, I had the application deleted, but I won't be starting over (with them).

Wednesday, October 01, 2008

Tuesday, September 30, 2008

Thursday, September 25, 2008

Return to London: 10/8-10/12


* I haven't been since Spring of 2005.

* My favorite club, Fabric, opened a new club at the O2 arena called matter.

* Flight + hotel was cheap ($300 less on Orbitz than booking on the airline and hotel sites separately).

* A break from the political news cycle, and CSPAN overload.

* Because I can.

Thursday, September 04, 2008

If my grocery list were the RNCC

today after work
Milk / butter
Maverick and goose
::hoot and hollar::
Tampons (See: yay no baby)
::6 minute standing ovation::

What the fuck? I know that political conventions define glad-handing, but is this a kindergarten play?

Tuesday, September 02, 2008

Palin Place (or: Bristol and her boo Levi)

To get in the spirit of McCain-Palin, I made a custom tee shirt help us discuss those awkward, pesky social issues:

Please, for the children, head over to Zazzle and order yourself a couple. All my profits will be donated to (Un)Planned Parenthood.

Tuesday, August 12, 2008

The Washington, DC Mirror Universe

From the Washington Post:

Mayor Adrian M. Fenty said today that the director of the Department of Employment Services has resigned after weeks of turmoil in the city's summer jobs program, which blew its budget by more than $30 million dollars and has been plagued with organizational problems.


The inspector general initiated an audit of the program last month at the request of Council members Carol Schwartz (R-At Large) and Marion Barry (D-Ward 8). That report is not expected until September.

In the meantime, council members haven't hesitated to express their disapproval and frustration.

Barry, who started the 29-year-old program in his first year as mayor, has spoken out.

"From all accounts . . . this year is the most mismanaged programmatically and financially in the history of this program," Barry said last week.

Also in this alternate universe: Hizzoner doesn't smoke crack with hookers, he does outreach to get them to change careers.

Obama RSVPs

You may recall that I invited Barack to my graduation party. His response?

Dear John,

Thank you for contacting Obama for America and for inviting Senator Barack Obama to your event. Over the course of the campaign, Barack has met with or spoken to hundreds of thousands of Americans at kitchen tables, large rallies, small town hall meetings, and other events in every part of the country. He appreciates the outpouring of support he has received at every stop.

The unprecedented level of campaign activity since early last year speaks to the strong desire of the American people to reclaim their government. We consider every invitation, and Senator Obama values your interest in his candidacy. Due to time constraints, he must decline a large majority of invitations. After careful review, we have determined that Senator Obama will not be able to participate in your event.

We hope that you stay involved and engaged with the campaign, because we need your help. As Barack has said, “if we are willing to work for it, and fight for it, and believe in it, then I am absolutely certain that generations from now, we will be able to look back and tell our children that this was the moment when… we came together to remake this great nation so that it may always reflect our very best selves, and our highest ideals.”

Thank you again for your interest and your understanding, and please accept our best wishes for a successful event.


Team Scheduling
Obama for America


Monday, August 11, 2008

A Tale of two (ssh) iPhone Apps: pTerm vs Touch Term

As far as I can tell, there are only (2) ssh apps for the iPhone right now: Touch Term ($2.99) and pTerm ($4.99). Since I don't know anyone who has tried either, I decided to download both and kick the tires.

Besides basic terminal support, I want an ssh client that allows you to configure ssh tunnels. Since Safari on the iPhone supports proxies, there's no reason ssh shouldn't be able to listen on a port and redirect to a remote host (-D) so I can tunnel my http traffic when I'm someplace sketchy (or someplace I don't want to be snooped, like work).

First, Touch Term:

Touch Term requires you to specify your username and password in the connect screen, which (1) makes me paranoid that my user and password are being shipped back to the author, and (2) makes you setup multiple connect profiles for multiple users on the same box.

Touch Term eats the initial ssh connect dialog, so you don't get to initially accept the host as known or not. I was not able to test with either client what happens if the host signature changes (man in the middle attack).

Touch Term also does not support ssh tunnels. It does let you hide the keyboard, and does support horizontal and vertical, but does not support multi-touch to zoom in and out.

As for pTerm:

pTerm requires you to setup a connection first, but asks for username and password at login. The initial connect dialog tells you that the host is unknown, and do you want to accept the key.

pTerm does not let you hide the keyboard: you get about 1" viewable, or 6 lines. You can use multi-touch to pinch/pull/scroll, but whatever text you have can only be viewed in that 1" area. It also supports both horizontal and vertical viewing.

pTerm does not support ssh tunnels, but I did submit a feature request. Since it's based on putty, I hope that feature can be ported pretty quickly.

Both apps have their strengths and weaknesses, but neither supports everything I'm looking for. I'll have to wait and see what the next few updates bring, or just roll my own.

Sunday, August 10, 2008

iPhone 3g, new TV

I became upgrade eligible on Thursday, so Saturday morning at 7:30am I lined up at the Apple store. After a minor issue removing my AT&T discount, I was able to get my 16GB Obama (as opposed to McCain) iPhone.

After I got home, I took my new TV out of the box, and hooked everything up. The new TV stand and furniture come next week. I had to run out and get an HDMI cable for the PS3, but everything is hooked up and working.

I download the iTunes remote app for my iPhone, hooked my laptop to the XBR, then used the iPhone to watch an episode of Aqua Teen Hunger Force I bought on the iTunes store.

As much as I love the new phone, Playstation (and thus, Blue ray) + new TV = amazing. 1080i and 120hz is spectacular.

Friday, August 08, 2008

Mayor Kwame Kilpatrick: A Real Dee-troit Pimp

If you have not been following the news about Detroit Mayor Kwame Kilpatrick, you have been missing some shizzle.

Wikipedia has some nice background:

1) Manoogian Mansion party
Kilpatrick's first controversy started as rumors of a wild party in the fall of 2002 involving strippers at the official residence of the mayor—the city-owned Manoogian Mansion. It is alleged by former members of the mayor's Executive Protection Unit that the mayor's wife, Carlita Kilpatrick, came home unexpectedly and upon discovering Kwame with the strippers began to attack one of the women.

2) The murder of Tamara Greene
Tamara Greene was a 27-year-old exotic dancer who went by the name "Strawberry" and who claimed to have performed at the Manoogian Mansion party. While sitting in her car with her boyfriend, Greene was shot multiple times with a .40 caliber Glock handgun. Although official statement by Detroit Police Department claims that Ms. Greene was shot three times, sources from Homicide Division of DPD have claimed that she was shot 18 times.

3) Motorcycle Squad Harley Davidson
In July of 2003, WXYZTV reported that Kwame Kilpatrick was seen riding the streets of Detroit on a Harley-Davidson Electra Glide police motorcycle which was taken from the Detroit Police Motorcycle Squad by Kilpatrick. The report indicated that he at times was riding alone without security, placing himself at risk and that the cycle had been taken by the mayor for his personal use and pleasure.

4) Whistleblower trial
In 2003, a civil lawsuit was filed against Kilpatrick by his ex-bodyguard Harold Nelthrope and former Deputy Chief Police Gary Brown. The police officers claim they were fired because of an internal probe into the mayor's personal actions and that the firing was a violation of the whistleblower law.[37]

The trial began in August 2007 with Kilpatrick and his chief of staff, Christine Beatty both denying they were involved in an extramarital affair.

5) Text-messaging scandal
In January 2008, The Detroit Free Press examined and revealed the existence of more than 14,000 text messages exchanged between Kilpatrick and his chief of staff Christine Beatty on their city issued SkyTel pagers between September–October 2002 and April–May 2003. The dates are of importance because they encompass the time periods of the alleged Manoogian Mansion party and the ouster of Gary Brown respectively.[54]

The text-messages are the nucleus of an $8.4 million secret deal settlement by the city of Detroit. The attorneys for the city had tried since 2004 to keep the text messages hidden on the basis that they were personal and private communications.[54] However, a city directive re-authorized by Kilpatrick during his first term as mayor indicates that all electronic communication sent on city equipment should be "used in an honest, ethical, and legal manner" and cautions, "is not considered to be personal or private."[55] The mayor's spokesman said the policy only applies to city-owned equipment and the text-messages are exempt since they were sent on a city-leased device.[55]

Kilpatrick and Beatty, both married at the time, did discuss city business; however, many of the series of messages describe not a professional relationship but an extramarital sexual relationship between the two, often in graphic detail. The text messages further describe their use of city funds to arrange romantic getaways, their fears of being caught by the mayor's police protection unit, and evidence the pair conspired to fire Detroit Police Deputy Chief Gary Brown.

6) Criminal charges
On March 24, 2008, Wayne County Prosecutor Kym Worthy announced a 12-count criminal indictment against Kilpatrick and former Detroit Chief of Staff Christine Beatty, charging Kilpatrick with eight felonies and Beatty with seven. Charges for both included perjury, misconduct in office and obstruction of justice. Worthy also suggested that others in the Kilpatrick administration could also be charged.

7) Red Lincoln Navigator
In 2005, WXYZ-TV reporter Steve Wilson reported that the city had entered an expensive one year lease for a luxury SUV. It was to be used to chauffeur the mayor's family. The lease was for $24,995; five dollars under the amount that would have required the approval of city council. Kilpatrick, chief of staff Christine Beatty, police chief Ella Bully-Cummings, and other members of the mayor's staff all denied that the red Lincoln Navigator was intended to be used by the mayor's wife and children. Eventually, Kilpatrick admitted the Navigator was for his family, claiming he had told the police chief that it was "too much" and to take it back.[64] Media coverage of this story was best known for a situation involving the mayor and his security team. Wilson had tracked Kilpatrick down in Washington, D.C., where he was attending a mayor's conference. When Wilson tried to question Kilpatrick about the Navigator lease, a member of the mayor's security team is seen on camera shoving Wilson against a wall.

8) Civic Fund
On May 8, 2007, WXYZ reported that Kilpatrick used $8,600 from his secret Kilpatrick Civic Fund to take his wife, three sons and babysitter on a week long vacation to a five-star California resort, the La Costa Resort and Spa.[66] The fund, controlled by Kilpatrick's sister and friends, was created to improve the city of Detroit through voter education, economic empowerment and crime prevention. Tax and accounting experts said Kilpatrick's use of the fund was a violation of IRS regulations.[67] The story was also compounded after WXYZ's cameras caught Kilpatrick in a fit of rage grabbing the microphone out of the hand of reporter Ray Sayah and throwing it hard across the room such that it hit a wall, while Sayah tried to question him about the situation.

9) Slander suit
Kilpatrick was named in a slander lawsuit along with Christine Beatty and police chief Ella Bully-Cummings. The lawsuit was brought about by two police officers that claimed to have been slandered in the media by city officials.[68]

The lawsuit stems from a 2004 incident in which the two police officers pulled over Kilpatrick's chief of staff Christine Beatty for speeding. Beatty was irate at being stopped and bluntly asked the officers, "Do you know who the fuck I am?" when the officers came to the vehicle.[68] While stopped, Beatty called Police Chief Bully-Cummings to have the officers called off, which the officers allege they were ordered to do. When reports of the incident started to surface in the media, Kilpatrick, Beatty and Bully-Cummings all claimed that the traffic stop was some type of "set-up" to harass Beatty.

10) Recall campaign
The Wayne County Election Committee approved a recall petition to remove Kilpatrick as mayor based on the multi-million dollar settlement ($9,000,000+) in a whistle-blower lawsuit against the city, and the accusation that Kilpatrick misled the City Council into approving the settlement. The recall petition was filed by Douglas Johnson, a city council candidate.[71] Kilpatrick has appealed to the commission to reconsider its decision on the grounds that Johnson is not a resident of Detroit.[72] Johnson also requested that Jennifer Granholm use her power as Governor to remove Kilpatrick from office.

On March 12, 2008, at the request of the Mayor's office, Wayne County Election Commission rescinded its earlier approval for the recall. The Mayor's office argued that there was not any evidence that the organizer, Douglas Johnson, actually resided within the city limits of Detroit. Johnson stated that his group would refile using another person whose residency would not be an issue. [73] On March 27, 2008, a second recall petition was filed against Kilpatrick by Angelo Brown. Brown stated in his filing that Kilpatrick is too preoccupied with his legal problems to be effective. Kilpatrick's spokesman James Canning again dismissed this latest recall by saying: "It’s Mr. Brown’s right to file a petition, but it’s just another effort by a political hopeful to grab headlines."[74]

On May 14 the Detroit City Council voted to request that the governor of Michigan, Jennifer Granholm, remove Kilpatrick from office.

And now, breaking news from the New York Times:

DETROIT — Mayor Kwame M. Kilpatrick, already fighting eight felony charges including perjury, was charged Friday with two felony counts of assaulting or obstructing a police officer. The officer, a sheriff’s deputy, was attempting to serve a subpoena.

Michigan’s attorney general, Mike Cox, announced the new charges one day after Mr. Kilpatrick was sent to jail for violating the terms of his bond by traveling to Canada in July on city business. Each count carries a penalty of up to two years in prison or a $2,000 fine upon a conviction.

“It’s a very straightforward, simple case,” Mr. Cox said. “I cannot recall ever seeing — let alone hearing of — a situation where a police officer trying to serve a subpoena was assaulted.”

Moments before Mr. Cox’s announcement, a circuit court judge, Thomas E. Jackson, allowed the mayor to be released from jail after posting a $50,000 cash bond. He also took away the mayor’s travel privileges and ordered him to wear a global-positioning tether.

But Mr. Kilpatrick, 38, who is in his second term as mayor, could soon be headed back to jail, as assault charges would be another bond violation.

The incident that prompted the new charges happened July 24, a day after Mr. Kilpatrick traveled across the Detroit River to Windsor, Ontario, on city business without court approval, a violation of the terms of his bond in the perjury case. That violation is what prompted Judge Ronald Giles of the 36th District Court in Detroit to have Mr. Kilpatrick sent to the county jail Thursday.

Just look at Google News to see why I'm nominating Marion Barry for Pope.

Thursday, August 07, 2008

Boxing Day Premier

My cousins and a couple friends attended the premier of Boxing Day at the AFI Silver Theater in Silver Spring, MD.

The movie was shot on a $2,000 budget, and in many parts it looked like it. It really exceeded my expectations, and I laughed all the way through.

I think they should enter it in Sundance. I don't think it would win, but I think it would do really well.

Wednesday, August 06, 2008

Richard Bruce Cheney, 46th (Vice) President

Dick Cheney is a mysterious figure. He could just as easily be a villain who was lifted from the pages of a comic book. (Side note: how is it that both Bush and Cheney were arrested for DWI, and MADD isn't protesting in front of the White House every day?)

The Washington Post did an excellent, 4 part series on "the most influential and powerful man ever to hold the office of vice president."

A few snippets from the first part...

On his role as VP:

In his Park Avenue corner suite at Cerberus Global Investments, Dan Quayle recalled the moment he learned how much his old job had changed. Cheney had just taken the oath of office, and Quayle paid a visit to offer advice from one vice president to another.

"I said, 'Dick, you know, you're going to be doing a lot of this international traveling, you're going to be doing all this political fundraising . . . you'll be going to the funerals,' " Quayle said in an interview earlier this year. "I mean, this is what vice presidents do. I said, 'We've all done it.' "

Cheney "got that little smile," Quayle said, and replied, "I have a different understanding with the president."

"He had the understanding with President Bush that he would be -- I'm just going to use the word 'surrogate chief of staff,' " said Quayle, whose membership on the Defense Policy Board gave him regular occasion to see Cheney privately over the following four years.

Expanding the law:

In expanding presidential power, Cheney's foremost agent was David S. Addington, his formidable general counsel and legal adviser of many years. On the morning of Sept. 11, Addington was evacuated from the Eisenhower Executive Office Building next to the White House and began to make his way toward his Virginia home on foot. As he neared the Arlington Memorial Bridge, someone in the White House reached him with a message: Turn around. The vice president needs you.

Down in the bunker, according to a colleague with firsthand knowledge, Cheney and Addington began contemplating the founding question of the legal revolution to come: What extraordinary powers will the president need for his response?

Before the day ended, Cheney's lawyer joined forces with Timothy E. Flanigan, the deputy White House counsel, linked by secure video from the Situation Room. Flanigan patched in John C. Yoo at the Justice Department's fourth-floor command center. White House counsel Alberto R. Gonzales joined later.

Circumventing the process:

Three days after the Ashcroft meeting, Cheney brought the order for military commissions to Bush. No one told Bellinger, Rice or Powell, who continued to think that Prosper's working group was at the helm.

After leaving Bush's private dining room, the vice president took no chances on a last-minute objection. He sent the order on a swift path to execution that left no sign of his role. After Addington and Flanigan, the text passed to Berenson, the associate White House counsel. Cheney's link to the document broke there: Berenson was not told of its provenance.

Berenson rushed the order to deputy staff secretary Stuart W. Bowen Jr., bearing instructions to prepare it for signature immediately -- without advance distribution to the president's top advisers. Bowen objected, he told colleagues later, saying he had handled thousands of presidential documents without ever bypassing strict procedures of coordination and review. He relented, one White House official said, only after "rapid, urgent persuasion" that Bush was standing by to sign and that the order was too sensitive to delay. [Read the order]

I'm about 2/3 of the way through Scott McClellan's book, and I have the same sinking feeling about Bush that I had about Reagan: he is not evil, but he surrounded himself with evil people.

The WaPo series is a fascinating read. I highly recommend you read it all the way through.

Tuesday, August 05, 2008

Starbucks: Same Day Discounts for Junkies

This morning, I picked up my usual iced, decaf, venti Americano (read: decaf, iced coffee) at SBUX, and they stamped my receipt and told me to come back this afternoon for a $2 iced, grande anything. Apparently, it's some new marketing campaign:

NEW YORK (AP) -- Looking to bring more value-seeking consumers through its doors for a late afternoon caffeine fix, Starbucks Corp. said it will now offer its morning customers any iced grande beverage for $2 after 2 p.m.

The price is a big cut from the normal price of most grande-sized iced drinks. A grande iced latte, for example, costs about $4. To get the discount, customers must present a receipt from their morning Starbucks (SBUX, Fortune 500) visit.

The promotion was previously only offered in Seattle, Chicago and Miami. The company said it is taking it nationwide beginning Tuesday to answer consumers' calls for more value at the chain, which has seen traffic drop as gas prices rise and consumer spending falters. It runs until Sept. 2.

"I think we've kind of hit the nail on the head," said Brad Stevens, vice president of customer relationship management. "It's easy for baristas to implement and it's easy for customers to understand."

Because a free, tall, iced coffee on Wednesdays was a veritable differential equation to solve.

Perhaps Brad is casting aspersions at the Starbucks card rewards?

Either way, I'm going to lunch now to save $0.35 on my junkie-treats.

Sunday, August 03, 2008

Review: DJ AtomX Live at Palma

As mentioned Friday, DJ AtomX played a set at the new Club Palma in Baltimore.

How was it? Let's ask the DJ:

My DJ Event At Palma Club In Baltimore:Music,Fights,Cops,And Corruption.+Pics.

So i DJ'ed at the new Palma nightclub here in baltimore this past saturday.The event was being put on by a friend of mine.The party was an asian party(although anyone was allowed to come)and i am to dj from 9 to 11pm.No problem.I arrive at 7:30 to check soundlevels and to see if their is any problems with the equipment or learn how to work the mixer if need be.

I arrive and they are just starting to work on the speakers,wiring then in and such.Why they didnt do this days ago is beyond me but whatever.Shoudnt take long these guys are pros right? 7:30 turns into 8:30.Then 9.Now were open.People are starting to come in.Then 9:30.Uh oh.Finally at 9:40 they figure it all out and i go on.

Now,i have been promised a 2 hour set no matter what.So i figure im playing from 9:40 to 11:40.Well one of the other promoters wants the hip hop dj to go on at 11.My friend steve tells me this and although im not happy about it,i can always leave here and go see Blank and Jones in D.C.The friends i brought all want to do this so im like screw it lets go.I tell steve if im not spinning im leaving. Were getting ready to leave....

Just one problem.The other DJ is a friend of steve and mine that steve brought in to play.He hasnt really done a show like this,hes completely nervous and he doesnt even think hes brought enough music for the event.Now I knew this would happen ahead of time(dont ask me how i just knew)so i took the liberty to bring more then enough hip hop music to give steve to give to him if this happened.I also brought him a set of headphones(once again dont ask!).

Now i really dont want to leave any of my music or equipment behind but i dont exactly want to stay either.My friends are ready to go.Am I comin? Whats the holdup?Decisions,Decisions.Well before i can make up my mind about it my friend turns to me and says:"Dude you GOTTA stay man!!I dont know what im doing just yet,and i dont think i have enough music.""You gotta stay and help me!!"

*SIGH*.I mean, i cant exactly leave after a speech like that now can i?So i tell my other friends im staying and some leave and some stay.I tell my main friend and roomie im gonna stay and help the other dj out,so lets just get drunk on the free bar tab i have till we can barely stand!So now,ive become hip hop dj AtomX.WORD.

Not that i dont like hip hop ive Dj'ed it in the past at partys as a favor to some people but i play dance music.But the crowd is getting really strong and theres 3 half naked go go girls dancing on the dj booth speakers so might as well have some fun with this!

Now Heres where staying starts to become worth it(if your in to chaotic scenes like i am)A guy steve and i know is so drunk he can barely stand.They try to get him to leave and hes not going.Security from upstairs shows up and they want to try to throw him out the old fashioned way.With brute force.

What these guys dont realize is that their only making it worse.Let asian friends throw out asian friends(and me the token white guy since i know him).Only if a brawl breaks out if when we would need these guys.Plus they are far outnumbered by about 200 asian guys who will stomp them into the ground if they touch this guy.I try to explain that well take care of it and their giving me an attitude about it,but all the while were getting him out of the club.At this point im now AtomX the bouncer.GRR.

We get him out in to the street and he starts bumping into everybody outside and almost falls into traffic.Well obviously the police are outside and they show up and call for backup.The cop is like"GET HIM OUTA HERE OR HES GOING TO JAIL"I told the officer do what they had to do because at this point he was starting to get out of control.

Just as i figure hes going to jail a car pulls up and the back door opens.We toss him in head first and slam the door and the car roars off.Problem solved.Still not a bad night.Only one little skirmish.Its now 2am.Im told to get on the mike and tell people were open till 3.Keep partyng!

All of the sudden at 230am the bouncers come downstairs and say to me "SHUT IT DOWN NOW!"SHUT IT DOWN WERE CLOSED!" And start ushering everyone out.My friend steve doesnt know whats doing on,i dont know whats going on,No one knows.We were told 3am.What gives???

Well What gave is that some retired punk from the liquor board showed up drunk and expected to get his drinks comped.When he was refused and asked to leave he demanded to see The security's staff paperwork along with other paperwork the club is supposed to have.When they refused he called the police.Apparently he was well connected with the corrupt politicians in baltimore(which is pretty much all of them) and about 10 cops showed up.This guy says"I WANT YOU OFFICERS TO GET EVRYONES NAME AND LICENSES IN THIS CLUB RIGHT NOW".Unbelievably the cops started doing it.He was in complete control.(Of course i gave them nothing.I simply walked past them and out the front door.NO INFO FOR YOU!

The guys who run this club are from D.C.And while im sure theres a whole different kind of bribing that goes on there,its nothing like the corruption levels that baltimore has.Trust me.If you dont give someone what they want here they will shut you down.And you have no say in it.

WELL! All in all it was a fun night and Palma actually is really nice inside.But i dont know how long this club will last unless they get more people to come out.They need to start promoting more in dc and the surrounding locations for sure.But they do have a nice line up of famous dj's coming so lets hope that on top of getting more patrons they grease enough palms and bribe enough losers down here to stay open!Thanks for reading.

I talked my way on 2 guests lists, so I have no complaints. Club is nice, Feelgood spun a great set.

I took this pic of Rob:

Download the preshow set he did, it was incredible.

Friday, August 01, 2008

DJ AtomX Live at Palma

My buddy DJ AtomX will be spinning tomorrow night at Palma in Baltimore from 9:00pm to 11:00pm. It's an early set, but can easily be followed by a visit to Glow for Blank and Jones.

Particulars are on the EDM calendar. See you there.

It's recess, turn out the lights

According to Politico, the House Democrats apparently turned off the lights and microphones on the House Republicans:

House Dems turn out the lights but GOP keeps talking

Speaker Nancy Pelosi (D-Calif.) and the Democrats adjourned the House and turned off the lights and killed the microphones, but Republicans are still on the floor talking gas prices.

Minority Leader John Boehner (R-Ohio) and other GOP leaders opposed the motion to adjourn the House, arguing that Pelosi's refusal to schedule a vote allowing offshore drilling is hurting the American economy. They have refused to leave the floor after the adjournment motion passed at 11:23 a.m. and are busy bashing Pelosi and her fellow Democrats for leaving town for the August recess.

At one point, the lights went off in the House and the microphones were turned off in the chamber, meaning Republicans were talking in the dark. But as Rep. John Shadegg (R-Ariz..) was speaking, the lights went back on, and the microphones were turned on shortly afterward.

But C-SPAN, which has no control over the cameras in the chamber, has stopped broadcasting the House floor, meaning no one is witnessing this except the assembled Republicans, their aides, and one Democrat, Rep. Dennis Kucinich (D-Ohio), who has now left.

History will remember this act of awesomeness through iReporter Rep John Culberson (Asshat-R-TX)'s tweets and camera phone video

Thursday, July 31, 2008

The Secret that Everyone Knows

Since Mason is a state school, employee salaries are public record. Most people only work there a couple weeks before they find Roblink, a website run by a disgruntled former employee. Every year, he makes a state FOIA request for everyone's salary, loads them into a database, and puts a few search forms in front of them.

This year's number are posted. Jim Larranaga's move to #1 at $525,000 stood out (a deal considering he had an offer for $1 million, and President Merten told people we were going to miss him). More interesting, especially in these tough economic times, was to pull down all the full time employees and add up their salary:


That's Mason's 2008 salaried payroll overhead.

I guess with every square inch of campus under construction, someone needs to fill up those parking lots (that are over subscribed by 130%).

What's Funnier than a Racist Presidential Candidate?

Why, three racist presidential candidates and a newspaper!

According to the NY Times:

McCain Campaign Says Obama Is ‘Playing the Race Card’

Updated RACINE, Wis. – Senator John McCain’s campaign accused Barack Obama of playing “the race card’’ on Thursday, citing his remarks that Republicans would try to scare voters by pointing out he “doesn’t look like all those other presidents on the dollar bills.’’

“Barack Obama has played the race card, and he played it from the bottom of the deck,’’ Rick Davis, Mr. McCain’s campaign manager, said in a statement. “It’s divisive, negative, shameful and wrong.’’

Mr. Davis was alluding to comments that Mr. Obama made Wednesday in Missouri when he reacted to the increasingly negative tone, and negative ads that have been coming his way from the McCain campaign in recent days.

“So nobody really thinks that Bush or McCain have a real answer for the challenges we face, so what they’re going to try to do is make you scared of me,’’ Mr. Obama said Wednesday in Springfield, Mo., in remarks that he echoed throughout the day. “You know, he’s not patriotic enough. He’s got a funny name. You know, he doesn’t look like all those other Presidents on those dollar bills, you know. He’s risky. That’s essentially the argument they’re making.’’

So who made race the issue first? Certainly not the times with this progressive analogy:

The McCain campaign’s decision to make the charge now that Mr. Obama was playing the “race card” comes as it has adopted a far more aggressive, negative posture towards Mr. Obama in recent days, trying to tar him as arrogant, out of touch and unprepared for the presidency with a series of statements by Mr. McCain and a series of negative ads – some of which have been condemned as misleading.

Interesting. For more on that, let's turn to former presidential candidate (and all around friend to negroes everywhere) John Kerry:

What an interesting euphemism. Now, how to work tar baby into casual conversation myself...

Wednesday, July 30, 2008

EA Sports: Gunston is 18th Lamest Mascot

According to an EA Sport's poll, George Mason's Mascot Gunston is 18th lamest:

Wow. Who cares?

Tuesday, July 29, 2008

Guest List

I invited Barry Hussain Obamawitz to my graduation party:

Senator Obama is invited to join our friends and family to celebrate my college graduation, an event 12 years in the making. Senator Obama might enjoy a different perspective of urban America: a man who moved to the DC region at the age of 20 to work full time and go to school part time. Sometimes, the American dream means contracting in the Office of Administration during the Clinton Administration, and several other high tech jobs to afford a home at the top of the housing market, only to watch it lose 30% of its value in two years. Despite that, one can work full time, go to school part time, and live the American dream just outside the beltway in Tim Caine's Virginia.

Republicans (especially those indicted for accepting bribes or whom violated US civil service laws) will not be admitted.

Check out the awesome autoreply I got back:
Dear John:

Thank you so much for your invitation. Your scheduling request is now in our system and you will be contacted as soon as we know more about Barack's availability.

Please keep in mind that the scheduling team may not be able to determine his availability until 1-2 months before the date of your event. We understand the difficulties this may cause and certainly appreciate your patience.

If you need to follow-up on your invitation before you hear back from us, please call 312/819-2419. Please do not submit follow-up inquiries through the online form or via email.

Thanks again for including Barack in your plans. We'll be in touch!

Team Scheduling
Obama for America

Just like you fools, if he comes, his ass needs to fill out my Google Docs RSVP form.

Lady Justice: Was Sighted and Partisan, Now Reactionary and Liberal

Alaska Senator Ted "It's a series of tubes" Stevens was indicted today, so saith the filthy, liberal, New York Times:
WASHINGTON — Senator Ted Stevens of Alaska, the longest-serving Republican senator in United States history and a figure of great influence in Washington as well as in his home state, has been indicted on federal charges of failing to report gifts and income.

Mr. Stevens, 84, was indicted on seven felony counts related to renovations on his home in Alaska. The charges arise from an investigation that has been under way for more than a year, in connection with the senator’s relationship with a businessman who oversaw the home-remodeling project.

They could not have indicted a better tool. Enjoy your bridge to nowhere, Teddy!

This must be DOJ's attempt to make up for yesterday's findings that they ILLEGALLY allowed politics to influence hiring decisions:
Senior aides to former Attorney General Alberto R. Gonzales broke Civil Service laws by using politics to guide their hiring decisions, picking less-qualified applicants for important nonpolitical positions, slowing the hiring process at critical times and damaging the department’s credibility, an internal report concluded on Monday.

A longtime prosecutor who drew rave reviews from his supervisors was passed over for an important counterterrorism slot because his wife was active in Democratic politics, and a much-less-experienced lawyer with Republican leanings got the job, the report said.

Another prosecutor was rejected for a job in part because she was thought to be a lesbian. And a Republican lawyer received high marks at his job interview because he was found to be sufficiently conservative on the core issues of “god, guns + gays.”

Wherever Ann Coulter is right now, her cock just fell off.

I am in liberal ecstasy right now.

Tuesday, July 22, 2008

My New TV

Once I finally got furniture for the living room, it (the furniture) wanted more reasons for me to sit on it.

I haven't owned a game console since the original Nintendo, so I used my stimulus to buy a PS3 (and GTA IV).

The PS3 has been asking for a new tv. It says, "I know I should be happy to have a home, but this 36" Sony WEGA makes my Blu-ray player cry in shame. You don't even have HD!"

I've been shopping for a new tv for about 4 months now. I decided that I wanted the Sony 46" XBR4. The new models (XBR5 and XBR6) have started arriving, and the only difference between the old and new model at 46" is the warranty (goes from 12 to 18 months) and an additional HDMI input (2 to 3). That said, I'm willing to save $900 or so and slum it with last years model, since this is the picture that I want.

I decided not to do anything about the TV until school was over. Earlier today, I was preparing for tv shopping by scouring the internet(s) for coupons or other deals, and I saw that Best Buy had their XBR4s on unadvertised clearance. I decided to stop at BB Tysons on my way home (to meet my study group), and found out there were only 2 left in the entire district. Since BB has 0% interest for 24 months (Circuit City is 18 months and Sears is 12 months), I really wanted to get it there. I drove out to Bailey's Crossroads, where the last remaining TVs were: one was new, one was open box, both were buried back in the warehouse.

Earlier than expected, I bought my new TV. I haven't brought it home yet, or told the PS3. I need to decide on a tv stand, and I need to get an HD receiver. That said, I'm glad I don't have to worry now about it selling out.

So Close...

Paper and presentation went well, now for the final.

Thursday, July 17, 2008

Hi. Remember Me? I'm Your Blogger?

Instead of the usual "woe is me"...

I had been extremely busy at work and at school. Last night, we submitted our group project and gave our presentation (I'm pleased with both), so the bulk of my school work is done. I'm less than a week away from graduating. Party planning and deck replacement are in progress; if you did not get an invitation, let me know.

Work has also calmed down a little, so you might actually see some blog posts from me. Who knows, I might even update my website that's been "under construction" for 18 months.


Tuesday, July 15, 2008

iPhone 3g - The Lost Commercial

Kudos to Barry for finding this: