Thursday, September 22, 2016

Getting a 500 Error When Trying to Access a REST API from C#?

This just might be the solution.

Here's the deal...  I need to write a simple C# client to access data from a REST API served up by an Apache Tomcat server.  Not a big deal at all...  should be pretty simple...

Should be...

For some unknown reason, my attempts generated nothing but '500' errors from the server.  Myself and our resident network wizard captured my traffic and we compared the headers of a successful GET using CURL and the non-successful attempt using my simple C# program.

After trying a few things with no success, I noticed the CURL capture showed an 'Accept: */*' header.  My C# program did not.  So, I added this...

request.Accept = "*/*";

SHAZAM!!!  No more 500 errors.

No search results from Google helped.  None mentioned this as being a possibility.  But, heck...  it worked.

By the way, this Apache server is what I like to call LegalWalled.  Yes, it's our server but if we touch it, or even log onto it using SSH without the guidance and approval of the vendor's support group, we could violate our support contract...  so opportunity to dig into why that specific error was generated.


Monday, September 12, 2016

Yes... I did that... Don't remember it, but did it...

I am a programmer (or is that obvious?).  Once in a while I will be tasked with researching or changing a program that I originally wrote.  I get the most recent code from our Source Repository System and start reviewing the code.  There is no doubt the program came from my brain, but it is certainly not familiar.  Why did I put these functions into a DLL?  What was I thinking when I designed this junk table?  OMG, WHY did I use singe letter variables???  WHY?!?!?!?!?

Maybe this happens with people in other professions...  read this to mean I hope sincerely that any doctor, dentist, commercial pilot or member of law enforcement who feel a similar temporary disorientation should firmly consider taking the day off!

Does a mechanic one day, look at a half-rebuilt carburetor that they have been working on for a month and wonder what motorcycle it came from?  Does a blackjack dealer in Vegas pause and wonder what those cards with an "A" printed on them mean?  Does a baseball umpire call "STRIKE!" before the pitcher throws the balll?

Anyway...  Walter Bishop from Fringe may never have said this, but maybe he could have...

Friday, August 26, 2016

"We WANT to Protect You..."

Imagine this, if you will...

Your daughter and yourself own and operate a small jewelry repair and gift shop in an old brick building on a busy old street.  Most of the business have been there for decades.  There's the deli and coffee shop, and the used book and curio shop, and the pharmacy, and the motorcycle repair and accessory shop, and the sporting goods store, and the small bank branch on the corner.  The town has a bustling core of tourist traffic that supplies ample amount of financial support.  This tourist business is solid but does cause a few issues with fraudulent credit cards and so forth.  The merchants do what they can but accept this as a typical danger of being in business.

You notice one day, some merchants are installing these new loss-prevention machines that really seem to be stopping all credit card fraud.  Unfortunately they are hesitant to discuss the details and are somewhat unhappy, saying foot traffic is down significantly even though the number of tourists in town is increasing.

One day a couple of fellows come into your store and offer this new system to you.  They offer to place a detector and door lock on your front door free of charge.  All they ask is that all purchase transactions you make go through them, 'for security purposes.'  They will hold all money for three days in their bank account for transaction validation, then release the funds to your bank account.

Here's the big catch...  only people who have registered with their service can enter your store.  Sure, they can look in your window, and if they ask, you can let them in if they haven't registered, but they don't recommend it.

"Everyone else on your street are using our system and LOVE it!  No one has had a fraudulent purchase since our systems have been installed," they say.  You tell them you will think about it.  They give you their card and leave.

One month later you are balancing your books and realize fraud is up by 20%!  Generally foot traffic and cash flow has increased but not enough to cover the new fraud.  You call the two fellows selling the anti-fraud solution and have it installed.

That's what seems to be happening to E-Bay.  Buyers can look at the items but unless they are PayPal users with validated accounts or addresses or whatever, they can't even put a bid on items.  You aren't a PayPal customer, you are shit-outta-luck.

That's how it works...  There's fraud happening so E-Bay offers this great service to a few merchants.  It's a little shady and locks the buyer base but it works.  As more and more merchants use this service, fraud becomes focused on those merchants who don't use it.  So, those merchants are pressured into using the service for 'protection'.

Here's what I did.  Yesterday I browsed E-Bay looking for deals on used lenses for my Canon Rebel.  BINGO, I find a lens and try to put in a bid.  I don't use PayPal so...  BZZZZTTTTT...  I can't even enter a bid.  I try entering a bid for another lens.  BZZZZTTTTT... same thing.  Another?  Same thing.

WTF???

Here's what will probably happen in the future...  Customers will not like this requirement to be 'verified'...  Foot traffic in E-Bay will start declining...  E-bay will need to change their validation.

Just my half-asleep $0.02 worth.

Wednesday, August 17, 2016

Webcollage bug/irritation repair

So, I am enjoying my little Linux build with that little AMD APU detailed in my last post...  Something is missing...  YES!  A good screensaver.

Oh...  Yes it has been a while since my last post, so what?  I've been boating and working on the house and generally enjoying the outdoors while the weather is agreeable.  So...  pfft...

Anyway, I installed the XScreenSaver package with several additional screensaver packages.  One looked intriguing...  webcollage by Jamie Zawinski.  Webcollage uses dictionary files (just lists of words) to seed simple searches on several internet search engines.  When the screen saver is activated, a random image (or part of an image) from a random webpage from the results of searching a random word is placed on a the screen like a collage, one image over the other.

Needless to say there is a lot of online bitching about this because quite simply, it can display porn and other NSFW images.  OK, so some people don't like it.  Personally, I find it intriguing.  But...  occasionally the following text would show up on the screen...  sometimes several times before a screen redraw covered the text:

Use of uninitialized value $vals in index at /usr/share/perl5/HTTP/Headers.pm line 264
Use of uninitialized value $vals in concatenation(.) or string at /usr/share/perl5/HTTP/Headers.pm line 267

After trying a few repairs to the webcollage Perl source, I just went into Headers.pm and fixed it there.  Here's the repair:

sub as_string
{
    my($self, $endl) = @_;
    $endl = "\n" unless defined $endl;

    my @result = ();
    for my $key (@{ $self->_sorted_field_names }) {
next if index($key, '_') == 0;
my $vals = $self->{$key};
if ( ref($vals) eq 'ARRAY' ) {
   for my $val (@$vals) {
my $field = $standard_case{$key} || $self->{'::std_case'}{$key} || $key;
$field =~ s/^://;
if ( index($val, "\n") >= 0 ) {
   $val = _process_newline($val, $endl);
}
push @result, $field . ': ' . $val;
   }
}
else {
          if ( defined $vals ) {
   my $field = $standard_case{$key} || $self->{'::std_case'}{$key} || $key;
   $field =~ s/^://;
   if ( index($vals, "\n") >= 0 ) {
$vals = _process_newline($vals, $endl);
   }
   push @result, $field . ': ' . $vals;
          }
}
    }

    join($endl, @result, '');
}

My changes are in red.  Not sure if the bug is in webcollage or if it is in Headers.pm but here ya go.  This is the fix.  Damn, I love open source!

**Disclaimer:  I am NOT a Perl programmer, I only know enough to successfully poke around Perl source and figure things out.
**Suggestion: Anyone running webcollage might want to consider two things: 1) it uses internet resources to perform searches and retrieve images; 2) some of the images shown on the screen could really get a person in trouble at most companies, not to mention what might happen should certain significant others see certain images.

Wednesday, June 8, 2016

New Minimal Linux Box Up and Running

Long Time No Post

Quite a few things have happened since my last post.  One of the most important, of course, is the completion of my little new Linux box.  Here she is...

Silicon Power Slim 60 GB SATA3 SSD drive.  It is only 2.5 inches wide, offers SATA3 6Gbps connectivity, and very energy efficient.  I selected this SSD because it was inexpensive, fairly fast, and rated as quite energy efficient.  Formatted this as ext2 and used it as my OS and swap drive.  Spent $30.




Toshiba 500 GB 7200 RPM hard drive.  It is your basic 500 GB 7200 RPM SATA3 hard drive.  It offers SATA 3 6Gpbs connectivity and a 32 MB cache.  I selected this drive because it was inexpensive, had good reviews and was the right amount of storage for my needs.  Spent 45$



ASRock C70M1 Motherboard with AMD Dual Core Ontario C-70 APU.  This mini-ITX motherboard/CPU combo offers very low power consumption, no unneeded video capability (I only needed basic VGA), up to 16 GB RAM, 64 bit processor/data bus width, four SATA3 6Gbps connectors and a host of other things.  No, this is NOT a gaming or server mobo/CPU.  The C-70  APU is only dual core and runs at about 1GHz but this board is extremely quiet, energy efficient and seemed to fit my requirements.  Total price of this board was $40 - not bad for motherboard and CPU.

I added a couple of Mushkin 2GB DDR3 RAM sticks for $22 and a basic APEX 250 watt power supply for 19$.  I tied it all together in an old Dell computer case and installed Debian Jessy.  The only little issue I had was the fact my little USB WiFi dongel wasn't supported natively.  Really, it was a minor issue.  After some research, the driver source was located on GitHub, it was easily compiled and installed.

So, for a total of about $156 I have a new little Linux box.  ( had an old flat screen VGA monitor just wasting space so used that).  Pretty happy so far.

More details and maybe a benchamark or two.

Tuesday, March 29, 2016

OMG .NET, You Are Crazy!!!

OK, so I am doing something simple...  adding a ControlParameter to a SQLDataSource.  I just want to add it as an optional filter.  The ControlParameter points to a TextBox.  Like this...

<asp:ControlParameter ControlID="txtFiltCC" Name="TCity" PropertyName="Text" Type="String" DefaultValue=""/>

Not only does the result return nothing, according to the Microsoft SQL Server Profiler, the query is never even sent to the server!!!  

What the HELL!?!?!?!?

I change the SelectCommand to not use the @TCity paramater and still...  no query sent.  The GridView bound to the SQLDataSource reports that no records were retrieved.   Hmmm...  makes sense since according to SQL Server Profiler, no query was sent.

Then I find the ConvertEmptyStringToNull property on the ControlParameter.  It's default is 'True'.  Hell, I don't want it to be null, so I change it to False.  Friggin SHAZAM!  The SQL query is sent and I get a result set.  Why the HELL would the ConvertEmptyStringToNull cause a query to not be sent, especially if the parameter isn't even used in the query????  This works fine...

<asp:ControlParameter ControlID="txtFiltCC" Name="TCity" PropertyName="Text" Type="String" ConvertEmptyStringToNull="False" DefaultValue=""/>

Really, Microsoft...  This is a crazy little piece in ASP.NET

So...  For anyone scratching their head about a GridView not being populated from a SQLDataSource that is using a ControlParameter pointing to a TextBox, this just may be the solution.

Thursday, March 24, 2016

Just a Little Old

So, using a five year old PC is 'sad,' eh?  According to Apple's Senior Vice President of Worldwide Marketing, Phil Schiller, about 600 million people are using PCs that are over five years old... "This is really sad."

Sad, eh?  A computer is a tool.  If that tool suits the user's need, why change?  Ya, I am a high-tech, hip, cool, well-informed geek of fifty years old but have been using the least expensive cell phones on the least expensive plans I could find; that is, until two years ago.  That was when we moved out to our little rural house on the lake, with barely any cell signal.  That was also when my personal interests turned to landscape and documentary photography.  My main camera, a Canon EOS Rebel T3i doesn't support geo-tagging, so I specifically bought a phone that had good RF power, supported geo-tagging photos and was on a carrier with proven coverage in our rural little hideaway.

And...  after 35 years of using computer screens, my eyes tend to strain with small screens, so I opted to get a 'new & improved' Android cell phone with larger screen.  And, I am happy I did.

In my garage there exists a hammer; a tool.  It is likely 20 years old.  It fits my key requirements: hammer a nail while allowing my hands to grip it properly and not cause undue strain on my wrists.  Why would I want to purchase a new tool if this one works?

My philosophy of PC upgrades is the same...  If the PC fits the requirement, why upgrade?  Only this year did my little HP Mini-110 stop working.  I didn't upgrade because it suited a certain purpose: small size, fully functional for web browsing, would run a word processor and was incredibly easy to throw in my motorcycle's saddle bag or car's trunk when going somewhere.  It was six years old this year.

We have a six year old desktop running as a media machine - it plays DVDs, streams video and music, and functions as a data-backup computer for the other PCs in the house.  Ya, it's six years old but why change???  It works fine!  A newer computer would offer nothing more given these required functions.

I have an old HP desktop from the early 2000's running Debian Linux.  That old fella is used for things like learning C++, ImageMagick and Python and experimenting with the wild side of Linux's low performance world.  It is perfect.

Why is the action of not upgrading a computer more than five years old "...really sad?"  Simple...  The person who make that statement receives a paycheck at least partially based on people upgrading more frequently than every five years, whether they need it or not.