Cheap OAir Sucks!

tldr; Bought airline tickets on Cheap O’Air.  Wanted to pay for an extra bag (originally only paid for one bag), but Cheap O’Air said I had to talk to Spirit Airlines directly.  Spoke with Spirit Airlines and they said I couldn’t buy an additional bag for the flights.  In addition, had to pay even more money because Cheap O’Air had only charged me for part of the flight (1/2 way to final destination and 1/2 way back).  Months of conversations ensued.

To continue,  after reading this I realized the title should be more like, “Cheap OAir Sucks!  Spirit Airlines sucks, too!”  Perhaps Cheap OAir and Spirit Airlines Suck would have conveyed the same meaning to humans, but it wouldn’t be the same to Google.  Anyway, on with the story:

My wife wanted to visit Peru for Christmas, so I purchased a round-trip ticket for her in September 2018. At that time I also paid for one bag (luggage) to accompany her from Bradley airport to Lima airport and back.

Oct 6 – To surprise my wife for her birthday I called Cheap OAir to arrange for an additional bag as she was having great difficulty fitting everything into one bag. I was advised at that time, that I had to speak directly with the airline, and that they could not do so at Cheap OAir.

When I called Spirit Airlines, they said I could not purchase an additional bag. While speaking with the representative, I was informed that my wife’s baggage, that I paid for via the Cheap OAir site, was only booked for the first part of each flight (as the entire flight was considered two flights by the airline, and not a connecting flight). So, I had to pay an additional $100.00 so my wife’s luggage would make it to Peru and return with her to Hartford.

I immediately contacted Cheap OAir and asked:

  • What kind of service do you offer?
  • What kind of bungling mismanagement is going on there?
  • Why would I book a flight through your company and only want my wife’s luggage to go part of the way to her final destination?
  • What is wrong with you?

I ended the e-mail with: I will not be recommending your company, or be using your service ever again.

Oct 7 – Cheap OAir responded and said that I needed to send them the invoice (in pdf format) for the additional luggage fee that the airline required, so they could investigate it further.

Oct 8 – I contacted Spirit airlines to inform them that I needed an invoice, preferably in pdf format, for the required additional purchase.

Oct 8 – Received an automated response from Spirit airlines. No human involved.

Oct 10 – Must have contacted customer support directly as I received an e-mail expressing the hope that that contact was satisfactory, that I received Spirit’s signature service.

Oct 11 – Received another response from Spirit. I had submitted another request for an invoice. Taken from said e-mail:

I still require an invoice due to the debacle with Cheap OAir. I have asked for an invoice once before via your website, and the e-mail response was inadequate. I responded to the e-mail and have not received a response. I responded to the notification of the upcoming evaluation of the customer service, and have not received a response. I am asking here, once again, please send me an invoice for the purchase of the baggage accompanying my wife’s flight all the way to Peru and back to Hartford.

As a sidenote, I believe I should not have to ask for an invoice to begin with.

Oct 11 – Received automated responses, two of them. Wouldn’t it be delightful if human beings manned the customer service department?

Oct 11 – Evidently I complained via facebook, and someone human finally contacted me. I won’t go into the details, but suffice it to say, it was like getting blood from a stone (turnip) to get an invoice for the additional charges for my wife’s baggage. I mentioned in our correspondences that it should not be so difficult, in this day and age, to get a receipt, electronic or otherwise, for the purchase of services. Of course, they were extremely sympathetic even when they were doing nothing.

I finally ended the lengthy conversation by advising them I would be back should Cheap OAir not accept what they sent me, and could not “say that I will have anything positive to say about this experience or about your company.”

Oct 12 – Cheap OAir responded to my invoice submission (per their request) by trying to suggest that I might have been at fault. I’m sure by now, if you have any empathy for me in this situation, you could understand why I was livid.

Later in the day I received another e-mail requesting I wait while they investigate this situation further.

Oct 13 – Received an e-mail about how they were going to contact the airline themselves, and something about the “seat assignment team.” Not sure what that was about, but seemed typical for Cheap OAir.

Oct 14 – Received an e-mail from Spirit asking how my experience regarding:

I need an invoice for my baggage purchase.


Third request via form/e-mail. Two requests via phone (where they inform me that I have to request an invoice here).

Oct 15 – Spirit was still responding to me:

Thank you for getting back to us with this information. Xxxxxx’s out of the office right now, and your concern has been assigned to me.

Sorry that it took a while to get back to you. I see that you were already assisted by one of our Social Media Support Team members in regards to your baggage invoice request.

If there’s anything else I can help you out with, please feel free to let me know.

Oct 15 – Cheap OAir sent an e-mail asking me to verify if I was the one that made the changes directly with the airline.

Oct 16 – Cheap OAir was very sorry to hear of the problems I was experiencing, and that I would lose a lot of money if I continued with my flight cancellation. I guess I had pretty much had it by that point and had asked for a refund. Refund statement as follows:

We apologize for the inconvenience caused to you. We would like to inform you that, we have spoken to the airline regarding the cancellation and your refund. As per the airline, refund is not permitted. However, you can cancel the booking for the Future Credit of USD 582.47 valid for 60 days from the date of Cancellation.

Your travel has to be complete before 06th September, 2019. However, you have to use the future credit amount within 60 days from the date of cancellation. If passenger does not use his credit amount within 60 days then the airline automatically forfeit the entire credit amount.

Five hundred eighty-two dollars was a bit light, to say the least. The wife said, let’s grin and bare it. We’ll just remember never to use Cheap OAir or Spirit Airlines ever again.

Oct 17 – Spirit Airlines sent me an e-mail telling me I could still change my unfavorable review of the services I received.

Oct 22 – Wrote to advise that they were working with Spirit Airlines to get clarification with some details. I was advised that my case had been escalated.

Oct 24 – Received an e-mail from Cheap OAir: We would like to inform you that we already sent a refund request to the Airline for USD 100.00 and we are still waiting for the Airline response, as due to some technical error we are facing some system glitch while processing the refund back to your card. Hence, we are still coordinating with our refund department.

I guess it wasn’t my fault after all. Go figure.

Nov 14 – Received an e-mail from Cheap OAir stating that they could not return my money as I had closed the account that had been used to make the purchase. In that event they wanted to deposit the money directly in my bank account. Please give them all of my bank account info (via e-mail).

Nov 19 – I advised them that I did not feel comfortable giving out the information via e-mail, and would prefer a check (via snail mail).

Nov 20 – I was advised to call/contact Cheap OAir’s billing department directly, because a paper check is not guaranteed. Not sure what that’s supposed to mean, but okay.

Nov 26 – Notified that there were internal communications at Cheap OAir about using a check. Allow 24 – 48 hours.

Dec 1 – Wife went on flight to Peru. No answer about check.

Dec 5 – Another e-mail advising me that they are still checking whether they can send a check or not.

Dec 30 – I e-mailed Cheap OAir asking for an update as I had not hear anything from them in approximately a month.

Jan 4 2019 – Received an e-mail saying that I need to verify the billing address to receive a check.

Jan 7 – Cheap OAir contacted me and thanked for the information.

Jan 9 – Informed by Cheap OAir:

Due to circumstances beyond our control we may not be able to process your refund within the original time frame you were given. We are continuing to work diligently with the (Airline/Hotel/Car Company) to complete the refund. We will continue to update you on the status of your refund every 2 weeks until the process is complete.

The check finally arrived and was dated January 9, 2019.

And to be sure, I have all the original e-mails between Cheap OAir, Spirit Airlines, and myself. Should anyone wish to verify that I have not embellished this tale, I would be more than happy to provide proof.

Posted in Airlines, Complaints, Travel Agencies | Tagged , , , , | Leave a comment

Gripes About Amazon

Overall, for a giant of a company, I’d honestly have to say they do a good job. However, I do have a couple gripes.

  • If you have an issue with a delivery company, in my instance, LaserShip, and you complain, you can have them removed from your “preferred” method of delivery, but you cannot remove them as an option without paying for a better form of delivery.
  • If you wish to post a bad review for a product AND the company that sold it, you cannot do so. It does not matter if you are a verified purchaser or not. You cannot speak ill of companies that sell products via Amazon. So, in my opinion, you cannot rely on their reviews.
  • If you purchase an Amazon electronic device, such as a Fire or Kindle (Amazon tablet device), they do NOT warn you that the device is connected to your account, in such a way as it is obvious. As I am a web developer, I know for a fact that it would be easy to pop up a window that says something like, “This device will be automatically connected to your account. Hence, it will have the ability to make purchases via your account (and attached bank account/credit card).”
  • Also, if you gift a Fire device, say to a granddaughter, without hacking said device, I’m not sure how much it’s worth. It is pretty much locked into the Amazon market place, and by default CANNOT install apps from Google (android apps via Google Play).

As these are only my experiences, take them with a grain of salt. Just don’t say you weren’t warned.

Posted in Complaints | Tagged , , , , | Leave a comment

Another Bad Experience With Edge Browser

Microsoft has been trying really hard to jam Edge browser down everyone’s throats. Kind of reminds me of the old days with Internet Explorer. As a web developer, in the old days (really not too distant a past), we had to “make sure it works in Internet Explorer,” but now it seems we have to “make sure it works in Edge.”

Why, I ask? From what I’ve seen it’s not very popular, nor is I.E. for that matter. Supposedly it runs on the same engine as Firefox, but why isn’t it as good as Firefox (I’m a fan, btw)?

It’s supposed to be faster, but at the expense of what? I can tell you at least one thing it’s at the expense of, element redrawing when you’re updating data dynamically with javascript/jQuery. I know this issue has reared its ugly head in the past with other browsers, but in this day and age?

Why did my code TODAY work in Chrome, Firefox, and Internet Explorer, but not Edge? Think redraw/repaint.

The fix was easy enough, hide and show the element. However, why Edge, why?

Posted in Computer Stuff | Tagged , , , | Leave a comment

Looking For A Good Sports Tracker For Bicycling? So am I!

I did my homework via Google and web reviews, and tried the following: Garmin Vivosmart HR+, Fitbit Charge 2, TomTom Spark Cardio GPS, and Samsung Gear Fit 2.

Garmin Vivosmart HR+ – I chose this model because, c’mon, it’s Garmin, right? Built-in GPS, Move IQ: “automatically tell the difference between movements like walking, running, biking, swimming and even using an elliptical,” a quote from their site, and many other features. Turns out it’s not very bike friendly, so you’ll have to enter your miles into their tracking system manually.

When I contacted customer service, they told me their site never said anything about bicycling, and they don’t support power meters, cadence, etc., something which I never asked for, but whatever. I do have a copy of the correspondences between customer service and myself, should someone wish to see it.

Suggestions to Garmin: Make your device activities customizable – Bicyclists want to see their miles accrue, and their tracks, without having to manually enter them.

Verdict: Seemingly good tracking, except it doesn’t work for what I want (bicycling).

Disposition: Return!

Fitbit Charge 2 – Okay, here’s another famous company. To be sure they’re all famous, so I won’t repeat for the other two below. Anyway, thought that this would be a good one, because everyone knows that Fitbit is all about activity tracking, right? Yeah, not so much. Although it was not waterproof, irksome to say the least, it seemed to work right out of the box. It did rely on my phone’s GPS to do its tracking, but I’m a bicyclist, and I always carry my phone for emergencies, so not a big deal.

The first day it seemed to work okay. The second day I noticed that the device was having issues staying connected with my phone, thus losing GPS tracking. My rides started recording as ten cents on the dollar, so to speak (10 percent – an exaggeration to be sure, but you get the point).

When I started researching the issue, I encountered many people complaining of the same thing (mostly runners) on Fitbit’s own forums. Another issue that popped up is that it woke me from a sound sleep (around midnight ???) to tell me I had met a goal for burned calories. Seriously? You’re going to wake me from a sound sleep (it also does sleep tracking … for your health) to tell me about calories burned for the day? Wednesday, Thursday, Friday?

Suggestions to Fitbit: Fix your connection issues, and make sure they never raise their ugly heads again. Also, turn off notifications (by default) when someone is SLEEPING!

Verdict: Tracking is, how do I say it politely, for the birds. Unfinished UI app.

Disposition: Return!

TomTom Spark Cardio GPS – So, I ended up on their site (via some search agent), didn’t realize they had a newer model. Tried to place an order, and it was rejected because of a supposed bad CSV. I then tried to purchase the same item with another card, and it was accepted.

When I attempted to look at my order, it showed two orders outstanding. Note, this was on a Saturday, and you cannot call them on the weekends. So, I put in a support ticket, contacted support via e-mail, to make sure the bad CSV order was cancelled.

I later discovered the newer model on their site (let’s just say their site is not user friendly), and then put in another ticket to cancel both orders. There was no contact about either e-mail over the weekend.

Monday rolled around, and when I got home from work, I had a message on my answering machine from a shipping manager at TomTom. She suspected a duplicate order. I returned her call, and she said she would try to cancel the shipment. I asked why no one from customer service cancelled the order, or contacted me? She didn’t know, “they’re in India … although they are on the job 24 hours a day, 7 days a week.” The shipping manager said that if she could not cancel the order, I could always refuse the shipment (when the delivery was attempted).

I had some errands to run, and went out for a couple of hours. When I returned home, there was no message from the shipping manager, so I called customer service. The initial response was, the item had been shipped, the duplicate order was never completed, and thus cancelled, have a nice day. I asked why no one had contacted me, and he said he would have to look at each contact, speak with each agent that was dealing with my ticket, and then get back to me. He put me on hold for a short time, and when he answered again, he basically said it was due to call volume, and that he was closing all the tickets, have a nice day.

I asked if there was someone to whom I could complain. Was there a phone number or e-mail address, perhaps? He assured me that there was not, but that this was all noted in the system.

I would have liked to have spoken to him about their ticket system failure, vent my frustrations a bit, but his accent was so thick I could barely understand him. With that I decided to not have anything further to do with TomTom. I mean, if they don’t even care when you’re buying their product (and the service shows), how are they going to act once you have the item?

Suggestions to TomTom: Get better customer service, or maybe put the shipping manager in charge. At least she seemed to care enough not to just phone it in.

Verdict: Customer service is so bad, I just sent it back without opening the box. Not going to take a chance.

Disposition: Return!

Samsung Gear Fit 2 – Beautiful color screen, although it’s not viewable in bright sunlight. Can tailor the activity to bicycle – great! And then the issue of connecting to my phone reared its ugly head.

I guess Samsung is not really all that keen to support users when it comes to connectivity. This really sucks, because you cannot directly connect to it from your computer. Read that as “Hello, Samsung, we should be able to connect the activity tracker to our computer.” I wrote that out, because they don’t seem to be smart enough to have figured it out on their own.

Anyway, when I tried contacting customer service for a list of compatible phones, I was told that all Android phones that have Android 4.4 and above, 2 Gig of RAM, should work. When I asked about sites that had lists, including one of their own, I was told that different countries have different spec’s for phones.

I looked into upgrading my phone and found the cost prohibitive.

Suggestions to Samsung: Try to make your app more phone friendly. Also, crazy idea here, but how about making an app that tells a person if their phone is compatible with a given device or not. Maybe even suggest a potential customer download and run the app before considering a purchase. And if the app finds the phone lacking, suggests a list of alternatives. Wouldn’t that be wild?

Verdict: If you have a Galaxy S5 or higher already, you’re probably okay. Probably. If you don’t, you might not want to take a chance, unless a new phone is what you really want.

Disposition: Return!

I only touched on the highlights of my experiences, and although I fully expect you to ignore my post, perhaps there will be some of you smart enough to learn from my misfortunes. At this point I am going to stop pursuing this idea any further. I guess the market is just not mature enough to give me what I want for the price I’m willing to pay at present. Anyone who tells you different has either never really used one, or has very low standards indeed.

A shame.

Posted in Reviews | Tagged , , , , | Leave a comment

Doing Work While Playing

Taking a queue from Google, I have come up with an idea (that I’d like to get paid for) for doing work while playing: Put seeds (grass, tree, flower, etc.) in pellets/paintballs, so when people are playing (practicing war ???), they can at least be doing something useful, like planting food. The pellets/paintballs (depends on what type of weapon you’re using) can be biodegradable, and when coming in contact with water (can you say rain?), melt, yielding up the see contained within.

Posted in Useful Thoughts (as Opposed to Off Thoughts) | Leave a comment

Snow Crunches When You Walk On It Because …

It occurred to me that snow and leaves are similar in that they crunch when you walk on them. Why, I wondered. Why?

They both fall from the sky, albeit most often from different heights. Perhaps this is a clue, falling? Thinking on this a moment, I realized that maybe it’s not the fall that (kills you) causes said crunchiness, but what transpires during said descent. Maybe, unbeknownst to us, snowflakes scream as they plummet headlong toward the earth, and because their terminal velocity is so low (they fall slowly when compared to other objects), the scream, which lasts an eternity in the life cycle of a snowflake, causes their little voice boxes to go hoarse. And the crunch is representative of the hoarseness of the little creatures.

And while leaves do not fall anywhere near as long (distance or time), they are much larger, so their hoarseness is like a deafening roar when compared to a snowflake. The only reason you can hear snow at all, is there are just so many of them. So darned many of them!

Yes, yes, this must be the reason.

Posted in Off Thoughts (Off as in Not Quite Right) | Tagged , , , | Leave a comment

Quick And Easy Music Command Generator In PHP

I won’t go in to the convoluted reason why I needed to write this script, but I will tell you that I recently used it to convert over 540 music files (using FFMPEG) from wma to mp3. You see, when I ripped my CD’s I used the wma format (at the time a higher quality for smaller file size codec), and now I need them in mp3 format.

My first try was to do dir command (dir folderName /s > fileList.txt) from console, open the resultant text file in Notepad++, and search and replace (can you say REGEX?) to construct a list of commands to run as a batch file (again from console). This worked fine, but when I realized the scope of the project, I decided to resort to my favorite fallback, PHP.

Here is the script I generated, and it worked flawlessly (for me). Feel free to use it as you see fit. If you like it (my script), give my blog props or e-mail me.


function h_pr($array) {
    if (is_array($array)) {
        echo '<pre>';
        echo '</pre>';

$path = realpath('music/'); // realpath used to get whole pathway, not relative
//$path = 'music/'; // use if relative pathway is okay
$searchFor = '.wma'; // include leading dot
$replaceWith = '.mp3'; // include leading dot

try { // just in case there's an error - such as directory is empty
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
catch (Exception $e) {
    $msg[] = 'Error: ' . $e->getMessage();

if (isset($objects)) {
    foreach ($objects as $name => $object) {
        $fileNameListArr[] = $name; // let's put all the names (folder/files) in an array

//h_pr($fileNameListArr); // use for debugging

    $matchText = '~\\' . $searchFor . '$~i'; // should yield ~\.wma$~i
    // regex patten starts (and ends) with ~ followed by escaped . , wma, $ (at string end) case insensitive i

    foreach ($fileNameListArr as $kF => $vF) {
        if (preg_match($matchText, $vF)) {
            $wmaFileListArr[] = $vF; // let's put all our wma's in a new array

//h_pr($wmaFileListArr); // use for debugging

    if (isset($wmaFileListArr) && count($wmaFileListArr)) {
        foreach ($wmaFileListArr as $kW => $vW) {
            // replace wma with mp3 and add to new array
            $mp3FileListArr[] = str_ireplace($searchFor, $replaceWith, $vW);

//h_pr($mp3FileListArr); // use for debugging
        // command pieces put in one place so you can tweak to your desire
        $beginCommand = 'ffmpeg -i "'; // beginning of ffmpeg conversion command
        $middleCommand = '" "'; // middle joining/between input file and output file
        $endCommand = '"'; // end of conversion command

        if (count($wmaFileListArr) == count($mp3FileListArr)) {
            for ($i = 0; $i < count($wmaFileListArr); $i += 1) {
                // assemble commands and put in new array
                $commands[] = $beginCommand . $wmaFileListArr[$i] . $middleCommand . $mp3FileListArr[$i] . $endCommand;
                // could have skipped making mp3FileListArr and just done conversion on the fly here
                // ex: str_ireplace($searchFor, $replaceWith, $wmaFileListArr[$i])
        else {
            $msg[] = 'Something went wrong!  Counts do not match!';
    else {
        $msg[] = 'No files found.';
else {
    $msg[] = 'Nothing to display.  Not sure why.';

if (isset($msg) && count($msg)) {
    h_pr($msg); // print messages

if (isset($commands) && count($commands)) {
    foreach ($commands as $kC => $vC) {
        // print out commands with new lines only (will look cluttered but necessary for batch file)
        echo $vC . PHP_EOL;

That’s all there is to it. Change the folder location as needed, run the script, save the page as text. Now change the extension of the saved text file to .bat and invoke from the console. Assuming you have FFMPEG in the environment path (I do), it should start chugging away. After the batch file is done, verify the files are where they should be, and delete the unneeded (wma’s) if desired.

Posted in PHP | Tagged , , , , , | Leave a comment

MySQL Difference Between Dates In Days, Hours, Minutes

I was researching how to make a JavaScript countdown timer for a personal webpage, because that’s the only way to go if you want interactivity (client-side scripting at its best), and I thought, ‘how can I do this in MySQL?’ Researching that a bit, I ran into a lot of similar minded queries on forums. So, I decided to write some sql.

Below is one of the versions of sql that I came up with. Note that there are many ways to do the same thing in sql, so my script may not be consistent (even to itself). Hopefully, the comments are sufficient to explain what I was doing.

set @tOffset = TIMEDIFF(NOW(), UTC_TIMESTAMP); -- get time offset from UTC
set @tOffsetTrim = substring_index(@tOffset, ':', 2); -- trim off unneeded chars
set @@session.time_zone = @tOffsetTrim; -- set time zone or else date1 and date2 may be different tz's
set @date1 = UNIX_TIMESTAMP('2017-01-20 12:00:00'); -- Obama checks out
set @date2 = UNIX_TIMESTAMP(); -- now
set @dateDiffSecs = @date1 - @date2; -- difference in seconds between dates
set @oneDaySecs = 24 * 60 * 60; -- seconds in a day (86,400)
set @dtDiffDaysReal = @dateDiffSecs / @oneDaySecs; -- real number (float)
set @daysIntTtl = floor(@dtDiffDaysReal); -- convert to whole number
set @yearsInt = floor(@daysIntTtl / 365); -- will cause error (day/leap year) during leap years (not addressed here)
set @daysInt = floor(@daysIntTtl - (@yearsInt * 365)); -- days remaining after years subtracted
set @daysRemainder = (concat('.', (SUBSTRING_INDEX(@dtDiffDaysReal, '.', -1)))) * @oneDaySecs; -- remainder * seconds in day
set @hrsMinsSecs = SEC_TO_TIME(@daysRemainder); -- built-in func to convert seconds to time
set @hrs = SUBSTR(@hrsMinsSecs, 1, 2); -- get hours
set @mins = SUBSTR(@hrsMinsSecs, 4, 2); -- get mins
set @secs = SUBSTR(@hrsMinsSecs, 7, 2); -- get seconds

	if(@yearsInt < 0, cast((@yearsInt + 1) as signed), @yearsInt) as `yrs` -- signed, in case years are negative
	 -- , floor(@daysInt / (365.25 / 12)) as `mthAp` -- approximate number of months
	 -- , (((from_unixtime(@date1, '%Y') - year(now())) * 12) + from_unixtime(@date1, '%m')) - month(now()) as `mths`
	 -- counts actual months, adjust as necessary (plus or minus a month, depending on how you count)
	-- , @daysIntTtl as `daysTtl` -- days (without sutracting years)
	, @daysInt as `daysMYrs` -- daysMinusYears, days remaining after subtracting years
	, @hrs as `hrs`
	, @mins as `mins`
	, @secs as `secs`;
Posted in MySQL | Tagged , , , | Leave a comment

All Your Base Are Belong To Us

So, I was out riding my bike today and ran across this lovely little fellow:

Green multi-eyed creature with a long tongue wrapping around it's body.

This appeared to be painted on the utility box (not a decal). I have no idea who designed or painted this, but if you can prove it’s yours, I’m more than willing to give you credit. Fairly cool, by the way!

After thinking about it a while, I believe I’ve seen this on a sticker (or somewhere) before. However, this was hand painted, and not a mass produced sticker (or the likes).

Posted in Art | Tagged , , , , | Leave a comment

Cigarette Butts In The Wild

So it was pretty windy yesterday, and while riding my bike (undisclosed location) I noticed two cigarette butts (one white, one undisclosed color) running for their lives (as though the wind was chasing them). I wanted to ask them where they were going, but they were in such a hurry, I thought it best not to interrupt them. Born free …

Posted in Off Thoughts (Off as in Not Quite Right) | Tagged , | Leave a comment