Friday, December 30, 2011

Which one sucks? UPS or Wine Country Gift Baskets

This is just a little noise to vent some frustration about a gift that was sent to me via UPS by Wine Country Gift Baskets.  Two of the numbers in the address were transposed (2345 was supposed to be 2354) and that little error caused the entire delivery to fail.  That part was a failure of UPS to hire a driver with any common sense. 

UPS then sent a post card to the same address they failed to find for delivery, which makes sense to only in a parallel universe where the US Postal Service hires people who are smarter than the staff at UPS.  The post card was delivered (I assume randomly) to one of my neighbors.  Everything but the street number was correct so I guess the postal service just approached the inaccuracy with more apathy than UPS.

My neighbor, who is apparently smarter than the UPS driver or the USPS, found us by looking for the nearest permutation of the address number, and matching that to our last name in the phone directory.  I wonder why these investigation techniques are well outside the grasp of someone who is hired for the sole purpose of getting a package to its destination.

The postcard said UPS was holding the package at their facility until they received a corrected address from the sender or the package was picked up at my inconvenience and expense.  It didn't say exactly that, but that's what it meant.  My wife tried to call UPS but was treated very rudely by the sullen UPS phone operator who really should be replaced by someone who actually cares about the work they do.  Apparently I'm not alone in dealing with the sudden failure of once-reliable UPS this holiday season.  Reports of UPS failing or refusing to deliver packages were all over the local news the past few day too.  Here's hoping Fedex or some other shipping company takes enough of the UPS market share over this fiasco that all the people responsible get fired and have to move into an apartment complex with poorly marked unit numbers so _they_ never get any packages sent to _them_.

But, UPS may not be the only failure.  In an attempt to help the brain-dead UPS driver complete his/her mission, I contacted Wine Country Gift Baskets (the sender) so that they could give UPS the corrected street number for the address.  That seemed to go well enough the first time.  They told me that UPS had been contacted and the package would be delivered a few days later.  That day came and went with no package, so I contacted Wine Country Gift Baskets again.  That time they said there was an "issue" getting UPS to re-attempt delivery of the package, and then I was abruptly cut off (online chat session).

So I called Wine Country Gift Baskets again and pressed a bit to learn that the "issue" with UPS was the Wine Country Gift Baskets agent never actually contacted UPS to correct the address and request a second delivery attempt.  During that call, I was assured that UPS had now been contacted and given the corrected street number.  The tracking information on the UPS site didn't change, so either UPS ignored the request or Wine Country Gift Baskets again didn't bother to _really_ contact UPS and make the request.  The Wine Country Gift Baskets agent was either lying to me so I would shrug and forget all about it, or they were just passing along the lie UPS told them.

At a week or so after the package should have been delivered, the "return to sender" deadline had arrived, and the tracking UPS information still said they needed the sender to correct the delivery addres, so I concluded that Wine Country Gift Baskets had once again failed to fix the UPS issue.  Since I needed to run other errands in the area where UPS was holding the package, I just gave up and took the postcard in to claim the package.  Nothing had changed from the original status.  There were no notes in the UPS system indicating that the sender (Wine Country Gift Baskets) had contacted them or that the address had been corrected.  The package was still sitting on a shelf waiting to be sent back to Wine Country Gift Baskets.  In retrospect, I should have just let UPS send it back so that Wine Country Gift Baskets would have to start over (at their expense), or refund what they charged for the unfulfilled gift order, or at least add another count to their own UPS failure rate statistics.

The two conclusions I draw from this are, 1. UPS hires morons that cannot be expected to take even the simplest steps to figure out a small error in a delivery address.  2. UPS probably has apathetic, useless people in their call center who don't really bother themselves to correct an addressing error when the sender requests it, or maybe Wine Country Gift Baskets hired those people instead, or maybe both.

Based on this experience, whenever I have a choice, I won't use UPS for shipping, and I won't order anything from Wine Country Gift Baskets.  I recommend others do the same unless they just like to be treated poorly.  If Wine Country Gift Baskets reads this and cares, I'd love to hear that they've cancelled their contract with UPS for shipping.  I might even consider ordering something from them if they bother to fix the problem.  Not holding my breath though.

Sunday, December 18, 2011

LG TV Quirks

After reading the manual for my LG 55LW5700 (Costco's model number that is roughly the same TV as the 55LW5600 sold elsewhere), searching LG's web site, and the Netflix web site, and finding no help, I thought it might be worthwhile to post what I finally discovered by accident.

The problem was that the Netflix app on the LG TV would load, and would show my "watch instantly" queue, and would let me select something to watch, but then no matter what I picked, it would show an error message saying "We're having trouble playing this title right now.  Try again later or try a different title." (or something along those lines).

Called Netflix and they gave me the old reliable "Unplug the TV and plug it back in."  Not surprisingly, that didn't work.  Then they launched into a "Deactivate Netflix" procedure that must apply to older LG televisions, because it bore no resemblance to the buttons, menu options, or features on the LW5700 ( LW5600).  They offered to deactivate ALL of the Netflix ready devices on my account (meaning I'd have to type in an email and password again on all the others that were still working fine... a painful process at best, using the on-screen scroll and click "keyboards").  So I declined and continued searching for how to deactivate Netflix only on the LG TV.  Incidentally Netflix, couldn't you set up a way to deactivate only one device from the Netflix end???  Obviously you have a record of which individual devices are activated.  Why do you offer only the "nuke 'em all" option??? That's weak!!!

So after fumbling around and looking under every proverbial rock in the menus on the LG TV, I finally found the option to deactivate / unregister the Netflix account, only on that device, and without resetting the entire set of custom settings on the TV (which would have also been painful to set up again from scratch).  So for anyone else who is looking for it... here's how...

  1. Push the "Home" button on the remote.
  2. Scroll around to the "Setup" button on the screen - click it.
  3. Scroll down to the "NETWORK" (Globe Icon) - click it
  4. Scroll down to the "Smart TV Setting" item in the list - click it
  5. Scroll down to the "Reset" button - click it
  6. Scroll down to "Netflix Deactivation" - click it
  7. Push the "Exit" button on the remote.
  8. Push the "Premium" button on the remote.
  9. Scroll around to the "Netflix" icon - click it.
  10. Re-enter username and password using the lame on-screen "keyboard."  (but don't pause for very long because the LG TV might time out and make you start over).
  11. Cross your fingers and hope that Netflix is working again and that it doesn't flake out again and force you to do the whole thing again.

Thursday, July 21, 2011

Dell 410 UWB Bluetooth + Windows 7 64 bit

I'm sure I'm not the only one who wanted to make the Dell Wireless 410 minicard hardware work in Windows 7, so I'm posting this to share what I already figured out on the subject.

Dell's support site lists drivers for the Wireless 410 minicard for Vista, XP, and other operating systems / operating system versions but the driver is curiously missing from the list of drivers that are intended for Windows 7 (32bit or 64bit). Vista was the original OS on my m6400 precision mobile workstation, but as everyone knows by now, Vista sucks, and Windows 7 is tolerable. So, as of July, 2011, Dell provides Windows 7 drivers for just about all of the other hardware, but the "Dell Wireless 410 Bluetooth" device driver is still missing.

The 410 minicard apparently combines Bluetooth and WUSB "Wireless USB" (i.e. UWB "Ultra Wide Band") devices on the same card. Under Windows 7, it seems only one of those devices can be enabled at a time. The UWB/WUSB "side" of the card can be enabled by installing the Vista (64bit or 32bit depending on OS version) driver using Windows 7's "compatibility mode" to run the installer (setup.exe) but having that driver installed prevents Bluetooth devices from connecting, even if a Bluetooth driver is installed. The Bluetooth "side" can be enabled by installing the Windows 7 "Wireless 370 Bluetooth Minicard" driver, but that leaves the UWB/WUSB "side" of the device showing as "Unknown Device" (VID_413C&PID_8149) in device manager.

In my case, I needed the Bluetooth device, but have no real use for the WUSB/UWB device, so I just installed the "Wireless 370 Bluetooth Minicard" driver, and I'll have to ignore the "Unknown Device" in device manager. Incidentally, when the "370" driver is installed, the hardware is still recognized and listed in device manager under "Bluetooth Radios" as "Dell Wireless 410 Bluetooth Device" (VID_413C&PID_8152 / last 2 digits different from the UWB device).

Also, after finally getting a driver installer to detect the correct device and make it show up in Device Manager, the power management defaults to an annoying setting which may cause the Bluetooth radio to intermittently switch off. Right click "Dell Wireless 410 Bluetooth Device" (under Bluetooth Radios in device manager), select "properties", switch to the "Power Management" tab, and UN-check the option labeled "Allow the computer to turn off this device to save power"

Sunday, May 8, 2011

Bacula Disk Storage Maintenance

A little over a year ago, I set up Bacula to do backups for the various laptops, netbooks, desktops, and servers in our home network. A few months ago, the backup jobs started failing because the 500GB external drive that holds the disk based backup media files filled up. The issue of not having recent backups was bothering me, but other things were bothering me more, so I hadn't done anything about it yet. Then something crashed, and a file got corrupted, and there was no recent backup to restore, so getting the backups running again started bothering me enough to figure out how to fix it.
The problem is that Bacula is designed around a tape backup system where the physical media does not actually get destroyed, but is simply overwritten when it contains no un-expired backup files. The latest version of Bacula (version 5.0.1 or later) has a new directive to solve part of the problem by truncating the media file associated with a volume when its status changes to "Purged." However, upgrading Bacula seemed like it would take more effort and wouldn't solve the other part of the problem, which is that I had set things up such that the media file name (label) included the job name and the date/time so I could tell what was in each of the files simply by listing the files on the disk. If those volumes are just truncated and "recycled" they end up having stuff in them that doesn't match the media file name.

So before going on with an explanation of how I fixed it, here's a review of the relevant Bacula terms and concepts.

media-file - Instead of a physical tape, disk based backups use a file, on a disk (go figure) so instead of referring to these as Media, I'll call them media-files. (Try not to get stuck on the singular vs. plural thing here.)

backup-job - in this context, this is the record in the Bacula catalog that represents a backup job instance that has already run, has an associated retention-period, and is associated with one or more "volumes."

backup-file - in this context, this is the record in the Bacula catalog database that represents a backup of a file, has an associated retention-period, and is associated with a "backup-job."

volume - in this context, this is not the actual media-file, but refers to the record in the Bacula catalog database that keeps track of a Media File, links to the backup-jobs (and indirectly to the backup-files) for which the media-file contains data, and stores the volume's status, retention period, last-written date, etc.

pruning - The process of removing backup-job and backup-file records associated with a volume, once they're past their expiration date.

volume-delete - removing the volume record from the Bacula database. If the volume were associated with a physical tape, the tape could be reused, but if the volume is associated with a media-file on a disk, the media-file is NOT deleted.

media-file-delete - using and operating system command (rm) to remove the physical media-file from the disk. This should only be done AFTER the volume-delete has been completed.

volume-status - This isn't a complete list, but the relevant ones here are Full, Used, Append, and Purged. Volumes in one of the first three are candidates for pruning. Volumes in the last status, Purged, are candidate for volume-delete.


So, what was the problem that caused the backup storage disk to fill up? Bacula doesn't automatically delete the media-files when the volume status changes to "Purged." Also, if volumes are not set to auto-recycle there is never an event that would auto-prune a volume and change its status to "Purged" anyway. Both of these things have to be done by a scheduled process (e.g. cron) outside of the Bacula daemons (or they could probably also be implemented as Python scripts that run within the Bacula director daemon, but I've set that ambition aside for another day.)

So then, what's the solution? There is no single solution of course, but my solution was to write a shell script (BASH on Linux in this case) and schedule it as a cron job (weekly seems be often enough). First it invokes the prune command on each volume in the Bacula catalog which will mark the volume-status as "Purged" if all of the backup-jobs (and backup-files) associated with the volume have expired. If not everything has expired, the volume will not be marked as "Purged" by the prune command, so the volume-status will stay as it is. Then, for each volume that has a "Purged" status, volume-delete it to get rid of the record in the Bacula catalog database, and then media-file-delete it to release the free space on the disk.

Pseudocode for the script is:
  1. Invoke Bacula's bconcole list volumes command to list all volumes
  2. Pipe the output through grep to filter down to the volume info lines that indicate a status of Used, Full, or Append.
  3. Extract the volume name from each line and invoke Bacula's bconsole prune volume={volume-name} command to cause the status of each eligible volume to change to "Purged."
  4. Invoke Bacula's bconsole list volumes command again to list all volumes
  5. Pipe the output through grep to filter down to the volume info lines that indicate a status of Purged.
  6. Extract the volume name from each line and...
    1. Invoke Bacula's bconsole delete volume={volume-name} command.
    2. Invoke the operating system's delete (rm) command to remove the media-file associated with the volume.


Script 1: prune-all-volumes.sh

#!/bin/sh

temp_dir=/var/lib/bacula/maint_tmp

temp_file_all_volumes=`mktemp -p $temp_dir`
temp_file_volume_lines=`mktemp -p $temp_dir`

# use bacula's bconsole to list volumes and calculate which ones
# to run the prune command on based on the retention
# vs. last written date.
/usr/sbin/bconsole > $temp_file_all_volumes <<END_OF_DATA
list volumes
quit
END_OF_DATA

cat $temp_file_all_volumes | grep -E "\| Full|\| Used" > $temp_file_volume_lines
while read volume_info_line
do
  # Note: The sed part just trims leading and trailing whitespace
  # echo "line = '$volume_info_line'"
  volume_name=$(echo "$volume_info_line" | cut -d"|" -f3 | sed 's/^[ \t]*//;s/[ \t]*$//')
  retention=$(echo "$volume_info_line" | cut -d"|" -f8 | sed 's/^[ \t]*//;s/[ \t]*$//')
  last_written=$(echo "$volume_info_line" | cut -d"|" -f13 | sed 's/^[ \t]*//;s/[ \t]*$//')
  last_written_year=$(echo "$last_written" | cut -d"-" -f1)
  last_written_month=$(echo "$last_written" | cut -d"-" -f2)
#  if [ $last_written_year = "2010" ] && [ $last_written_month = "04" ]; then
echo "volume_name = $volume_name, retention = $retention, last_written = $last_written, year=$last_written_year"
/usr/sbin/bconsole <<END_OF_DATA
list volume=$volume_name
prune volume=$volume_name
yes
list volume=$volume_name
quit
END_OF_DATA
#  fi
done < $temp_file_volume_lines

Script 2 - delete-purged-volumes.sh:
#!/bin/sh

temp_dir=/var/lib/bacula/maint_tmp
log_dir=/var/lib/bacula/maint_logs
bacula_storage_device_dir=/mnt/wdmybook/bacula_data/storage_device_dir


datevar=`date +%Y-%m-%d-%H%M%S`
delete_script_log_file=$log_dir/delete-purged-volumes-$datevar.log
temp_file_all_volumes=`mktemp -p $temp_dir`
temp_file_purged_volume_names=`mktemp -p $temp_dir`

# use bacula's bconsole to list purged volumes
/usr/sbin/bconsole > $temp_file_all_volumes <<END_OF_DATA
list volumes
quit
END_OF_DATA
cat $temp_file_all_volumes | grep -E "Purged" | awk '{print $4}' > $temp_file_purged_volume_names

echo "Delete all 'Purged' Bacula Volume records"
echo "and the corresponding disk files."
echo "Remember to run maint-prune-all-volumes.sh first."
echo "or this may not do very much."
echo "For results/messages, review log file: $delete_script_log_file"

while read volume_name
do
echo '' >> $delete_script_log_file
echo Using bconsole to delete purged volume record $volume_name >> $delete_script_log_file
/usr/sbin/bconsole >> $delete_script_log_file <<END_OF_DATA
list volume=$volume_name
quit
END_OF_DATA
/usr/sbin/bconsole >> $delete_script_log_file <<END_OF_DATA
delete volume=$volume_name
yes
quit
END_OF_DATA
/usr/sbin/bconsole >> $delete_script_log_file <<END_OF_DATA
list volume=$volume_name
quit
END_OF_DATA
echo removing physical file $bacula_storage_device_dir/$volume_name >> $delete_script_log_file
ls $bacula_storage_device_dir/$volume_name >> $delete_script_log_file
rm $bacula_storage_device_dir/$volume_name >> $delete_script_log_file
ls $bacula_storage_device_dir/$volume_name 2>> $delete_script_log_file >> $delete_script_log_file
done < $temp_file_purged_volume_names

Wednesday, April 13, 2011

Stop the Verify Email Address Web Form Stupidity!!

I'm not sure when this trend started to put a second field on a web form to "verify" your email address the same way you type in a password twice, but it is moronic. It is CLEAR TEXT. The person filling out the form can READ what they've entered to confirm it is correct. There is absolutely no improvement to reliability achieved by forcing the same clear text information to be entered twice.

Passwords are different. Someone entering a password into a field that is masked with asterisk characters cannot see what they have typed. Entering a password a second time reduces the possibility that something incorrect was typed into the first password field, BECAUSE the person typing it CANNOT SEE WHAT THEY'VE TYPED!!

Perhaps the same idiots who think it is useful to type in an email address twice should consider forcing the user to enter every element of the form twice, just to be sure. It wouldn't help any more than typing the email address two times, but it would sure increase the annoy-the-user factor, which is the only plausible reason for requiring an email address the second time. Soon we should see forms with fields for First name:, Verify first name (that you just typed in clear text):, Last name:, Verify last name (that you just typed in clear text), etc. etc.

Maybe someone thinks there is something magical about having an '@' symbol and one or two '.' characters in something that is typed in clear text into a form. I guess someone must have a nutty theory that all those other fields on a form must be easier to visually review in a single entry box because they don't have any "special" characters in them. What if someone had an accent mark in their name somewhere? Wouldn't that be just as likely to be typed in incorrectly? Shouldn't that be entered twice too?

I'm sure somewhere, someone is making the excuse that the email address is more important because it must be correct in order for an actual electronic communication to succeed. I'd answer that with, "Sure it does, BUT YOU CAN STILL SEE WHAT YOU'VE ENTERED!!" If it's wrong, it's wrong twice. If it's right, it's right. If it's wrong and the form hasn't been submitted yet, the user CAN SEE THAT IT'S WRONG and correct it in ONE FIELD.

As much as this useless technique seems to be used on web forms, I'd bet there is a book or two in print that suggests this irritating web-form feature serves some purpose. And I'd bet there is a group of people who would defend it with all kinds of fabricated statistics from some ill-conceived usability study involving web aware howler-monkeys and internet-users over the age of 87. But really, I hope web form designers everywhere will finally get a clue and stop doing this.

I guess until sensible behavior is re-introduced into the world of web forms, I'll just enter my email address once, LOOK AT WHAT I'VE TYPED, select what I've typed, copy, click the other email field, and paste. I'll also try to convince myself that someone in an over-authorized marketing department somewhere forced an otherwise reasonable person to include the "Confirm email:" field on the form.

Thursday, February 24, 2011

Problems creating SAAJ object model

Getting wsse enabled in Oracle WebLogic 10.3.x (11g) using CXF as a web service engine and Maven as a build tool proved to be a bit of a challenge. After many Google searches that came up empty, the solution included the following elements.

1) Do not package saaj-api.jar or any saaj-impl.jar with a war or ear deployed into WebLogic.

This requires a bit of work in the pom.xml files that build your project. Many of the CXF libraries have dependencies on saaj-api.jar and saaj-impl.jar so in the in all places where there is a direct or transitive dependency on a CXF library, those need to be excluded.

Example:



<dependency>
<groupid>org.apache.cxf</groupid>
<artifactid>cxf-rt-frontend-jaxws</artifactid>
<version>2.2.9</version>
<exclusions>
<exclusion>
<!-- Remove SAAJ (soap attachment) lib version that conflicts
with Weblogic Built-In version. -->
<groupid>javax.xml.soap</groupid>
<artifactid>saaj-api</artifactid>
</exclusion>
<exclusion>
<!-- Remove SAAJ (soap attachment) lib version that conflicts
with Weblogic Built-In version. -->
<groupid>com.sun.xml.messaging.saaj</groupid>
<artifactid>saaj-impl</artifactid>
</exclusion>
</exclusions>
</dependency>


2) Explicitly set the Soap MessageFactory class in a JVM startup parameter on the WebLogic container's JVM.

-Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl


REFERENCE: http://blogs.sun.com/fintanr/entry/saaj_classcast_error_with_jdkhttp://blogs.sun.com/fintanr/entry/saaj_classcast_error_with_jdk

Friday, February 18, 2011

Oracle JDBC Connection String Nonsense

After spending several hours trying to sort out the cause of a cryptic message from Oracle's JDBC driver I finally tried something that worked, but the cause, as is often the case with Oracle error message, was completely absent from the error message text. I'm posting this because it was also completely absent from any Google results.

I had a DataSource set up with a connection string as follows:

jdbc:oracle:thin:@//10.0.50.1:1521/mysid

Any attempt to open a connection using that DataSource resulted in the following, completely useless error message:

java.sql.SQLException: Io exception: Got minus one from a read call

Changing it to a slightly different JDBC URL string format made it work.

jdbc:oracle:thin:@10.0.50.1:1521:mysid

The only differences are that // just following the @ has been removed, and the "sid" is delimited at the end by : instead of /

I hope having this matched up with the error message gets someone past all the noise about the number of processes or the number of connections in the listener. At least in my case, that stuff had absolutely nothing to do with it.

Wednesday, February 9, 2011

Colorado Capital Bank - Irresponsible

This evening I opened a letter from a "Senior Teller" at Colorado Capital Bank which stated that they did not have an "updated signature card" for my account. Enclosed was the "signature card" form with boxes highlighted where my wife and I were to sign and return the form in a postage paid envelope, also enclosed. I wish the only thing about this letter to be irritated about was the wasted postage and the absurd notion that our signatures would need to be updated (since they haven't changed much in nearly 20 years).

Here's a link to their Privacy Policy, which is nothing but a bunch of empty words that have absolutely NO bearing on the behavior of Colorado Capital Bank employees.

http://www.coloradocapitalbank.com/Privacy.aspx

There were a few small problems with this signature form that added up to one gigantic problem. The form included a few pieces of information in addition to the signature boxes. First, it had our entire account number (no part masked, no part truncated). That alone might have been forgivable. But wait there's more. The form also had my full name as it appears on the account, my full social security number, my date of birth, my drivers license number, my mother's maiden name, my full phone number, and my complete home address. Granted, anyone stealing this document from my mailbox could figure out the home address part, but it didn't end there. The form ALSO had my wife's full name as it appears on the account, her full social security number, her date of birth, her drivers license number, and her mother's maiden name.

There it was, all on one page, EVERYTHING anyone would need to steal our identity without making any effort at all. No social engineering would have been required, because ALL of the typical information ANY bank, utility, insurance company, credit card company, or numerous other identity dependent organizations might ask in order to verify our identity was offered up by Colorado Capital Bank on a single sheet of paper, sent to us through the U.S. mail, and expected to be returned to them through the U.S. mail.

If you have an account at Colorado Capital Bank, you should do what I intend to do and close the account immediately and demand that they destroy or secure ALL records related to the account. They are grossly irresponsible in the way they handle the vital information they have on file. If you are considering opening an account at Colorado Capital Bank, I urge you to take your business almost anywhere else. Allowing Colorado Capital Bank to mis-handle your personal information in the first place would be a VERY bad decision.

Unfortunately, I probably can't force them to be responsible with the information they already have on file. I can only close my account and hope that that removes any reason they would have in the future to send EVERY SINGLE THING required for an identity thief to make a huge mess of my financial life. A bank that acts so irresponsibly should NOT be trusted with your money, your identity, or anything else.

This is a warning for others who might find this before it is too late.

STAY AWAY FROM COLORADO CAPITAL BANK!!

Tags: complaint review bank colorado Castle Pines Castle Pines North Castle Rock South Denver irresponsible identity theft privacy policy