Monday, December 30, 2019

PRTG: solving your problems

So you wrote a nice custom script to monitor you Next Cool Thing, and it doesn't work.  Not only does it not work, you can't figure out what is wrong with it.

So how do you solve it?

First, turn on sensor debugging. 

Go to the sensor in question, then Settings.  Scroll down until you find this bit. 

Turn that on.




Got that?   Good.

Now the interesting part.  Where are my readings? 

C:\program data\Paessler\PRTG Network Monitor\Logs (Sensors)\

So there you have it.

Kind of.

You get two files for every sensor.   One file indicates all the stuff that was sent to the sensor via PRTG.  That's the file with the name "Result of Sensor XXXX.Data.txt"

The other file is the output after the script has been run.  That's "Result of Sensor XXXX.log"

From there, it's time to go read that second log file and try to figure out what the problem might be.  The big problem I have with troubleshooting Python scripts is the lack of an Idle interpreter in the default installation of PRTG. 

That's survivable.  Notepad is there.  It's just more annoying. 

The second part of reference is that the interesting bits about what failed is generally at the very end of the script output. 

Is this the perfect debugging scenario?  No.  But it does provide the information you need to figure out why your script isn't working.

You did write the script on a machine with better debugging utilities to try and make a good proof of concept, right? 

So best practice in my eyes: write the entire script except the output bits on a separate machine before transferring it to the remote probe and/or primary server.

So...   Have fun, and go squash some bugs.

Thursday, December 5, 2019

PRTG: Making Custom Sensors to monitor strange things with Python


#verion 1.0
#last modified 12/2/19
#
#v 1.0   initial revision / prtg integration
#
import sys
import json
import urllib.request

from paepy.ChannelDefinition import CustomSensorResult


if __name__ == "__main__":

    location = json.loads(sys.argv[1])
    
    parsed = "http://" + str(location['host']) + "whatever else in the url"
    
    page = urllib.request.urlopen(parsed).read()
    

    #data comes out as binary type.
    #convert from binary to normal string
    np = page.decode('utf-8')

    scrip = np.split('



    for lines in scrip:


    result = CustomSensorResult("OK")


         result.add_channel(channel_name="channel1", unit="Custom", value=status_value1, is_float=True, primary_channel=True, warning=0, is_limit_mode=True, limit_min_error=0.5, limit_max_error=1.5, limit_error_msg="channel1 failed") 
         result.add_channel(channel_name="channel2", unit="Custom", value=status_value2, is_float=True, is_limit_mode=True, warning=0, limit_min_error=0.5, limit_max_error=1.5, limit_error_msg="channel2 failed")


    print(result.get_json_result())


Base code for a python script sensor for PRTG.   

Using this method, you write a script to scrape a web page, and then present the information to PRTG as a JSON file.

The limits are used to define up/down/warning status.

In this case, I have outputs of a binary 1/0 for working not working.

So how does that work?   

Notice this bit.

result.add_channel(channel_name="channel1", unit="Custom", value=status_value1, is_float=True, primary_channel=True, warning=0, is_limit_mode=True, limit_min_error=0.5, limit_max_error=1.5, limit_error_msg="primary connection 

And breaking that apart, the section here
is_limit_mode=True, limit_min_error=0.5, limit_max_error=1.5, limit_error_msg="channel1 offline"

Let's break these down.

Note: these names aren't the same those expected or presented for EXE/Advanced sensors on the PRTG custom sensor page.

is_limit_mode = Sets PRTG to know that the output has acceptable ranges of input.   
limit_min_error  = This sets the lower limit that defines an error.  Depending on your output, there may not be one.  I'm using outputs of binary 0/1 in this case, so I set it to .5.   Therefore, a 0 output is defined as error state.
limit_max_error  = This set the upper limit that defines an error.   Depending on your output, there may not be one.  In my case, there is never an upper maximum error.   So I set it to 1.5.   
limit_erro_msg = The message you want on PRTG for any device that may be not working.


So, with these setting set correctly, PRTG will report an individual sensor is down based on the values you assign to status_value1 and status_value2.  So now, you can alert based on those settings using normal PRTG alerting.


What this base script doesn't currently do:
  1. Parse anything.  Parsing the web page is based entirely on what you are looking for.  The page I was looking at was all table based, so splitting the data into tables made sense.  You will have to handle that portion.
  2. Deal gracefully with urlib.urlrequest.open() errors.   You will get a JSON error in PRTG when you try to pull a web page you can't get.  That's a simple try/except statement.  Use this message in your except portion to report failure gracefully.

            result.add_error("Your Error Message Here")



Secondary important thing...   probably the most important.  

See this block? 

 location = json.loads(sys.argv[1])
    
    parsed = "http://" + str(location['host']) + "whatever else in the url"

This block accepts json data as input to the script.  
The second part location['host'] pulls the IP address setup on the sensor to feed that data into the script.   So this script can be written once and run on multiple devices.  That's what makes this script extendable.

Now...   

So, you've got the initial script working.

How in the world do I troubleshoot this thing when I suddenly get a bunch JSON errors when I deploy it?   

That's the subject of another discussion.

Sunday, July 21, 2019

Thoughts in consideration


Judge success not by reaping but by sowing.  
Focus on something for 30 minutes and think of nothing but that thing.
Creating an iron will based on creating and following rigid systems 
Hard work isn't the answer.  Impact wasn't improving.  Figure out what works.
-What am I required to do?
-What gives the greatest return?
-What gives me the greatest reward?
Focus your attention on (1) what you must do, (2) what you ought to do, and (3) what you really want to do.
Subjects I need to study and understand:
[]Restraint
[]Generosity
[]Hard work
[]Motives
[]Honesty
[]Patience
[]Humility
[]Productivity
[]Dependability
[]Temper
[]Attitude
[]Facts
[]Goals
[]Planning
[]Boundaries
[]Proper Thinking
[]Common Sense
[]Prosperity
[]Emotions
[]Sowing
[]Direction
[]Correction
[]Conflict
[]Pressure
[]Criticism
[]Judement
[]Confrontation
[]Forgiveness
[]Ethics
[]Ownership
[]Ambition
[]Listening
[]Co-Signing
[]Responsibility
[]Debt
[]Saving
[]Developing People
[]Understanding People
[]Inspiration
[]Influnence
Measurement leads to success.  If you can't measure it, you can't control it (notes)
Effective system include application (notes)
What looks like a people problem is often a situation problem (notes)
To change, you have to change the persons situation
self-control is an exhaustible resource
What looks like laziness is often exhaustion
What looks like resistance is often a lack of clarity.
To change you must provide crystal clear direction.
Mis-allocation in abundance leads to scarcity. (notes)
Scarcity requires being right all the time and the consequences are devastating.
Pain and pleasure are the driving factors of all change



Links to all notes are private.  Should the notes become interesting, those will be posted at some other point. 

Wednesday, April 10, 2019

monitoring applications

Part of a decent monitoring scheme is making sure business critical things are running all the time.  PRTG and powershell are a great way to do that.

$errorFound = $false


try
{
    if( -not (get-process -ProcessName "blah" -ErrorAction 'silentlycontinue' ))
    {
        throw 
    }
    $textVal = "OK"
    $errorFound = $false
}
catch
{
    $errorFound  = $true
    $textVal = "blah Not Running"
}



write-output ""
write-output ""

write-output "blahProcessRunning"


"Status"
   

"1"
"1"
"
"     



if($errorFound)
{
    write-output "0"
    write-output "1"
    $textVal = "blah Process not running." 

}
else
{
        "0"
        $textVal = "OK"
        "1"
    
}

"" + $textVal + ""
write-output ""
write-output ""
write-output ""

write-output "BlahProcessRunning"


"Status"
   

"1"
"1"
"
"     



if($errorFound)
{
    write-output "0"
    write-output "1"
    $textVal = "blah Process not running." 

}
else
{
        "0"
        $textVal = "OK"
        "1"
    
}

"" + $textVal + ""
write-output "
"

Note: Blogger as far as I know is doesn't have a good way to post full code.  So there's a bit more to it than this, but it's all opening and closing brackets. 

Ok, so there's all the code.  Most of it is pretty dull.

The heavy lifting is done by the get-process ProcessName "blah" section.  Which is pretty self explanatory.  Works great when the process happens to be running.  The problem is what happens when the process doesn't run.

When it doesn't run, you get red powershell text.  Which is what we don't want. Adding -erroraction "silentlycontinue" gets rid of the error text.

But now it fails and doesn't tell us anything.  Also not what we want.

So try-catch.

Which doesn't quite properly work.  It doesn't give any output at all.

The answer was the if(-not ((process)) ) bit followed by the {throw}

So, if you get some sort of failure, silently continue and throw an error.
Which the catch picks up.

And now we've got some nicely formatted text that changes based on whether the process is or is not running.  And with business critical processes, that's what you need.

Now, get-process dumps a lot of interesting data that you could feed back to PRTG.  Frankly, I wasn't that concerned.  I just wanted to know whether the process was running.

As for install procedure, let's not skip that.

Install a PRTG remote probe.
Drop this file in the CustomSensors\EXEXML directory.

Change the policy for the x86 version of powershell to unrestricted.
Or sign the code with your own code signing cert.  I don't know how to do that.  So  I go with the first.

That's in c:\windows\syswow64\windowspowershell\1.0\powershell.exe

Not the same one as opening a command prompt or searching for powershell.exe.

So there you go.  Alert as your company dictates and or want.

Saturday, February 16, 2019

Thoughts on the c-store

So as working in a c-store is vastly more complex than you'd think, I guess it's time to cover the technological fun of dealing with what's in a c-store.

The primary things everyone thinks of is the point of sale.  Point of sale is an important point, but not the only thing.  In general, most point of sale systems end up having a server, and 1-2 terminals.  On top of that, you have some sort of device to handle the fuel controller.  Sometimes those are IP based, sometimes not.

In the modern arena, you also end up with network connected pin pads...   If we were making a list, we'd have..
1 )POS router
2) POS switch
3) POS controller
4) POS terminals 1
5) POS pin pad 1
6) POS terminal 2
7) POS pin pad 2
8) Fuel Controller

I'd always recommend 2 POS terminals.  Why?  Because if one goes down, all your in store sales are down.  And most of the money made in a C-Store is not out at the gas pump.  The gas pump is just a driver to get the customer inside the store.  In any situation, 2 is 1 and 1 is none.  Redundancy, redundancy, redundancy.

So, we've got the money maker down and out.  Problem is, you still don't have a primary network connection for all the rest of the stuff.

Now, people have tried to merge the POS router into the site level router.  That's a bad idea.  The purpose of the point of sale router is to segment all the money making from the rest of the system.  It's not good to try and merge all that together to save a marginal amount of money.  Don't scrimp on the main things.  Get a good router/firewall and probably the vendor specific point of sale router.

While we're talking about site level routers, you need a backup credit card solution.  I recommend cellular.  Phone dial-up has grown worse and worse, and is generally unsupported decently.  Cellular signal is generally pretty okay, and running a small 300 MB data plan just for backup credit card traffic is well worth the cost.

The cell backup might run you $100 a month.   Realize in one network outage that lasted 3 hours, a large size store can run $500 in credit card traffic.  One outage more than pays for the cell backup for the next several months.

So, we're also going to need a site level switch.  That's to plug all those other devices in that have nothing to do with processing money.  It's all in the automation and scaling.

9) Site level router
10) Cellular backup device
11) Site level switch
12) Site broadband connection

I glossed over the site broadband connection because that generally depends on what you've got in the location.  Large cities will have a great cable modem system.  Small ones you deal with what you can get.  Your needs dictate.  Other than AT&T DSL, I've never had any real issues.  All generally run the same tech and have the same stuff.

My problem with AT&T DSL narrowed down to the inability of them to provide a static IP with unfiltered network to form VPNs.  It's home service for home users.  Anyways...

Now that we've got the primary network setup and the POS running, we've got a system that will work. 

Now all the other things in the store that have nothing to do with making money, but do.

13) Alarm system.
Assuming your store is going to close, you're going to need one.  Most of the one's I've dealt with borrow a port on your network so they don't have to pay for their own.  Cuts your cost a bit.

14) HVAC system
The modern HVAC system is nice and network connected.  So the maintenance team can get alerted when those pesky coolers fail.  And that gets expensive when you lose all that product.

15) Remote power systems (multiple)
I'm primarily talking about devices made by Digital Loggers, Inc.  They are a great company, and make a great product.  So what's the purpose of this thing, and why do you put one (or more) in your locations? 

Ever had to drive several hours just to pull the plug on a device?  Ever hated that?  Ever wanted to do it from the comfort of your desk?

Buy one of these things.  Or more than one.  I put one on every single terminal out of town.  Rebooting a device once generally pays for the travel/time cost of one of these devices.

16) Back office computer
This might be the only traditional computer on site.  Purposes are handling paperwork and ordering.

17) Side bar devices
These are all those stupid little terminals to implement things the point of sale doesn't.  Checks processing, food stamps, money orders, and gift cards.  They junk up the counters and make small amounts of money.  But everyone has them.

18) Printer
A good multi-function network printer is well worth it.  Outsource this sucker as best as possible, and save your IT.  Printers are a mess.

19) NVR/DVR
The device I don't like the most.  Probably because of the expectation of what the DVR is good for.  The purpose of the DVR is for after event examination.  It's not for stopping some kid stealing candy.  You are not going to stop that kid by staring at a tiny screen.

20) DVR POE switch
To power all those cameras that cover everything from the fuel island to the junk isle.

21) Tank Level Sensor
Used to monitor the underground fuel tanks.

22) ATM
In the c-store world, you need to be in the ATM business.  It's not complex, it's not expensive, and it makes decent money.  Throw it on cell backup, and then when the rest of the world is down you can still have people pulling their money out at $2-4 dollars a hit.  Fill the ATM with $20s out of your deposit, and you don't even have to pay separately to fill the ATM.  It's win-win-win. 

23) Battery backup
You need a network connected battery backup.  It doesn't do any good to have a battery backup on your major system and then not even monitor it.  Crazy.  But that's the mentality of many people.  We'll go into that one on a later date. 

24) In store music
Those blaring, pre-built playlists interspersed with your own custom ads make for interesting stuff.  It can either be great or horrible.  It also lets you control the type of music that is played in your store.  Don't like country? Then you'll probably hire an employee that brings a boom box and plays it way too loud.  The same can be said for any type of music or talk radio.  Pay for in store music and control the experience.  It's probably not going to make you much money, but it will give you a unified experience across your chain.

25) In store media
Paper menus are out-dated.  You can do it all with a raspberry pi, piSignage, and a TV.  It's also dirt cheap in comparison to some of the other options. 

26) Gas price signs
These generally don't have a network connection, and integrate directly with the point of sale.  But it's another piece of electronic that needs to be considered. 

27) Safe
I hate safes.  I really do.  I don't think they should be managed by IT departments.  But I do, and I hate them.  They are a necessary evil of the system.  It's the best way to store the money prior to pickup by armored car or before it goes to the bank.  Even if the IT department doesn't manage the device, it's likely the thing has a network jack.  Which means you need to network it and fight with the safe tech that doesn't know the difference between DHCP and DNS. 

Come to think of it, that's most point of sale techs as well. 

Anyways.

That's a separate argument.

So I think that about covers what is in the normal c-store.  Realize that's 27 devices, but could easily be 35-40 without IP cameras. 

How?  I put at least 4 WebPower switches in every out of town location.  So there's 30.  Add another few side bar devices (checks, money order, food stamp, gift card) and you're up to 35 and quickly.

Add the IP cameras, and you've got 60+ network connected devices in one location. 

That's a lot of network for a place that sells cigarettes, beer, and gas.

Monday, January 28, 2019

Waffles

Waffles. 

So...  At some point in my life, I picked up the connotation that a waffle was a person who couldn't make a decision.  I have no idea where that came along.  I think I've also added a secondary meaning in that a waffle is a person who won't get to the point. 

Generally, I use it as a verb. 

Usage: Bob needs to quit waffling.

Urban dictionary agrees with me.  So I must have not been the only one who came to that conclusion.  Either that, or I picked it up somewhere. 

So I've been listening to a lot of Librivox as of late.  Librivox is a collection of copyright free books read by people.  Some are good readings, and some are terrible.  It's a crap shoot, really. 

I've been going through "The Book of the Damned" by Charles Fort.  Generally, I'm okay with listening to strange stuff.  But this guy just won't get to the point.  He basically goes on and on about nothing.  He waffles with the best of them.

I'm going to finish it.  But I'm going to do it at one chapter a day, but his "nothing is truth" spiel gets real old real quick.  On the plus side, the reader isn't a monotone. 

It's humorous, though.  People like him populate the work force and life.  The Internet is full of discussions like this.  Firefox pocket seems to be full of them.  Maybe their just the right level of click bait to get hits without ever purporting to solve the problem. 

I read one a few days ago about someone saying people should eat more meals earlier in the day.  And the end result was the suggestion that big government intervention was the solution.  "Solve poverty, and all these solutions solve themselves." 

No.

No they don't. 

Because poverty as currently defined is not "solvable". 

The current definition of poverty says the bottom X percent live in poverty.  So if you are in the bottom X percent, you will always be in poverty. 

You may have a million in the bank, and be eating high class meals every single day.  But because you are at the bottom in comparison to everyone else, you are in poverty.  No matter what you do, there will always be a bottom X percent. 

The answer "solve poverty, and you solve the other issues" is also in direct contradiction to the work done in Switch by Chip and Dan Heath.  They suggested that throwing money at the problem wasn't going to solve anything.  The best answers are small answers. 

The size of the solution doesn't have to match the size of the problem.  A good solution is almost always well smaller than the problem we perceive. 

Rearranging the diet of a bunch of Vietnamese solved their malnutrition issues without large amounts of government subsidies and financial spending.  There was no multi-million dollar solution with a super giant government study. 

Just a guy with a clip board and some questions, asking where things were succeeding.

That answer is too simple.

See... many solutions are like that. 

Me?  I'm opposed to a so called "living wage".  Not because I think people should be broke.  It's because the inbred fallacy that assumes if you start paying people more they will start making better decisions with their money.  A person broke at $8 a hour will be broke at $80 an hour.  The person didn't change.  Just some number that values their work.

The problem is not the amount.  It's the person. 

The wants of any individual are infinite.  The income of any individual is finite. 

All of your wants are not going to be met.

No matter how much you make.

Period.  End of story.

Even billionaires have limits to their wants.  They may be trying to solve bigger, more complex problems.  But their is a limit to what they are capable of solving.  It's simple math. 

Elon Musk is a billionaire.  Still can't do everything he wants. 

Maybe a lot of cool stuff.

But wants are always infinite.  And they always will be.


Thursday, January 24, 2019

Can't Commit: a short story about dating


It's a bit dark.  The teachers always said don't start your work with weather, but I'm going to anyways.  Does dark constitute weather?  It's definitely a condition.  Like maybe they didn't want you to start with weather because it's easy to evoke emotions.  And yet they do the exact same thing most of the time in their school work.  It's all pain and misery and dark and stormy nights.  

Maybe it's a trope, but let's face it: most people don't read anyways.  Like half the world can't read in any language.  And the other half hasn't picked up a book since they left the public education system.  So really, you're dealing with about 30 people declaring what you should and shouldn't do in writing, because they are tired of reading "that kind of book".  It's such a terribly small portion of the population, you might as well do what you feel anyways.

Of the people that are left, and there's maybe a couple of million of them out of the trillions in the world, less than one percent are going to buy your book.  So we've gone from a trillion people down to a million, now down to 10,000.  Of those, only about 25% are actually going to make it past the first chapter.    So now we're down to about 2,500.  Of those, 85% are book critics.  They are the kind of smarmy people who declare in worlds what the rest of us should do.  They make dictates on high about what should and shouldn't be done.  And it's not like they are any better people than those 375 that are left.  They are just people.  

Unless they've had the book judging app added to their brain stack.  If they've got that, then they are different.  And not in a good way.  Straight up weird people who should probably quit buying major app enhancement stacks for their brain and, you know, do something.  But that's a lot of people.  And these are just the critics in the world.  That's what they do.   

But of those 375 left, I'm sure they don't care.  They didn't spend that extra 20 large on a book judging app for their brain stack.  They just want to kick back and enjoy the story.  And they are willing to give you at least a part of their day.  Maybe some.  But then is it the right genre?  Because you can have hard science fiction and that's only going to appeal to those hard science fiction people.  Those science fiction camps like to stay apart and fight giant meaningless flame wars on the Internet about how one genre is better than the other.  And then most of them are now gone.  Who's left? 

Just my editor.  And frankly, they stick around because they are getting paid.  And that's just as good a reason as any to stick around.  Except my editor is now getting up...  and giving me the middle finger...  because she hasn't gotten paid.  Because I'm an author, and she only gets paid when I get paid.  And I haven't gotten paid, because I haven't finished the story.  So now that there is no one left to care about how I start a story, I'm going to start it how I want.  I'll show them.  They'll see.  

It was a dark and stormy night.  Upgrade nights always are.  For some reason, when you need to do some complex task it seems like the world decides it's the best time to find a big slopping pile of mud to throw at you.  You know the kind of night where you'd rather lie in bed and wait for it to all be over?   No.  Guess my bed is more comfortable than yours.  Maybe you should think of getting a new bed.  

But then, my bed isn't that new anyways.  Had that thing since the end of college.  It's worked it's way through a good many nights, let me tell you.   And quite a few girlfriends.  Probably two dozen of them if I had to guess.  Which isn't a bad number.  But the bed is a bit used.  Maybe I should think of getting a new bed.  Especially after that one girl.  She used to use the thing like a trampoline.  Maybe that's why there's a spring starting to point through and poke me in the back.  

On second thought, my bed isn't all that good.   But I'd still rather spend time there rather than go out in the middle of the night during a rain storm to upgrade a firewall.  It's just the way it goes.  At least there wasn't any lightning.   I was on an upgrade one night and lightning hit the transformer next door.  So after my heart landed back in my chest following the gigantic explosion I sat there and watched as a all the equipment in the room slowly died as the battery backups failed.  It was a sad little symphony of beeps and boops, slowly fading away until you have this one final battery backup that just won't give up the ghost.  It was doing it's best to keep the system running, but it was just not making it.  The beep got sadder and sadder, and then finally gave up.   

And I decided I had to pee.  And realized I was behind mag-locked doors that failed closed.  So I couldn't leave the server room to go pee because the power was out.  I would have liked to go home, but that was not going to happen.  Luckily, I made a few calls and got the maintenance team to figure out what was wrong with the emergency generator.  Once they had that thing fired up, the lights on the room turned back on and I made a run for the door.  It was like the pee of the gods.  It lasted forever, and felt like I was losing a bit of my soul down the commode.  But I did feel a lot better after that. 

My girlfriend was mad because I told her it would probably only take an hour to get all this stuff back to working, and I didn't get back home until quitting time the next day.  Electronics get mad at you when you turn them off in the middle of an upgrade.  They do not like it at all.  It took me a good bit of finagling to get that one back in operation.  I kept running into some weird "can't commit" error.  I don't remember the whole thing.  Just that part.  We rolled back and forth between different versions and different configurations probably fifteen times before I finally stopped and started looking at different stuff. 

Even the remote support guy was confused.  He didn't really want to tell me there was a bug in the system but I'm pretty sure there was a bug in the system.  And it was a nasty bug.  I guess I was the guy who found the nasty bug, as well.  So they kept having me try various things to hopefully get this broken box back to working.  And I was getting mad because I was camped out in the server room with a laptop, having to type all these commands.   Typing is so much work.  I mean, VR interfaces are so much better than typing.  And it was a bunch of "show interface all" and no GUI and handles to torque and adjust in the v-space to make things work.   No nice green lights and red lights and checklists.  It was all "show interfaces status" and reading long lines of cryptic output, trying to figure out why the system had decided it didn't want to do what it wanted. 

And the darn thing gave me a so many random errors that meant nothing.  "Instance of an object could not be referenced" doesn't even mean anything.  It's just a bunch of words all crammed together, pretending to be English and not really saying anything.  It's like the people who wrote this stuff live in some strange archaic world with their own words and the rest of the world doesn't mean anything to them.  They're so obsessed with writing their code and keeping their language separate and out of the light that they make sure everything has about fifty different references to things only they understand.  I mean, where in the world did I learn about pointers other than grade school?  No wonder them programmed types are all so weird and squirrely and don't have any good relationships with the rest of the staff.  

But it was always the same error with that firewall.  "Commit failed" over and over again, with no real indication as to why.   Maybe if someone had said "look, you: we redefined how we reference the pan global networks, so your old IP version 6 address  scheme isn't going to work anymore. Don't you think it's about time you moved to IP version 9?"  But no... just "commit failed" and "object reference not set to the instance of an object".  Just some random collection of errors that mean nothing to no one and cause the rest of the world to pull their hair out.  

And don't get me started on IP addressing.  I mean, why do we have an IP version 4, version 6, and version 9.  Whatever happened to version 1, 2, 3, 5, 7, 8, and 9?  No one knows.  All the data in the world stored all over the place in blazing fast networks that can pull down the entire Library of Congress in less than a minute, and you can't tell me what happened to all those different versions of IP?  Not a single person in the world could tell you.  They just disappeared into the aether.  

Yeah, my girl was pissed after that night and a day at work.  She was mad at something or other before I left.  Said I wouldn't show up for her functions to save my life, and she was probably right.  Her functions started off as interesting.  We'd go clubbing and then out for a few beers and it would be great.  We'd dance and have fun and have a few laughs.  And then those parties left and it became wine and cheese tastings with "good and proper" people who talked it super pretentious accents and talked about their 401k's and the state of the global pan-dynamic movement.  I have no idea what the global pan-dynamic movement is.  I think it has something to do with people who are bored at wine and cheese parties.

But anyways I made it home and she started yelling at me because I had to work.   And I tried to tell her it was a dark and stormy night, and nights like that aren't good for upgrades.  And she just yelled back and told me to quit worrying about stupid cliches.  She kept droning on about needs and responsibilities and all sorts of nonsense like that.  And I was not fulfilling her needs as a fully expressed woman.

And I kicked back on the couch with a beer and told her I don't know what a fully expressed woman was.  And as far as I could tell, there really wasn't much difference between a fully expressed woman and whatever the opposite was.  Maybe I should have waited for her explanation was about a fully expressed woman, because that sent her on some sort of other tirade that didn't mean anything.  

She kept using these words that mean absolutely nothing but sound interesting when you drag them all together.  And she kept droning on, and droning on.  So I got another beer.  And another.  And then she asked me a question and I didn't hear her because I wasn't sure if she was still talking to me or to someone on the phone, so I had turned on the TV and started watching the game.  

And she finally looked over at me, and started screaming and stormed out.  Guess I'm glad we never completed the full move in thing with her.  Not with her droning on and screaming while I'm trying to have a beer and watch the game.  It just wouldn't work.  Too noisy.  So that was the end of that relationship.  I tell you, it just doesn't work like that.  So much for that relationship.  I decided it was just about time to move on with that girl.  She decided she needed to be a fully realized woman.   I still don't know what that means.

A few weeks later, I was dating some girl I met at the bar who happened to be a friend of a friend of someone I didn't really remember.  Which was great, because I got to bring up random stuff to try to remember who this person was, and the girl would fill in all the details I needed.  I asked her what a fully realized woman was, and she couldn't tell me either.  She talked about a lot of stuff, but pan-global dynamics and fully realized people was not them.  It was great, except she didn't like upgrade nights either.  

About that time, we changed out some servers and had to get them up and running.  And these servers were quite possibly the most cantankerous servers I've dealt with in years.  Something about the IPv9 stack they coders had written.   Coders!  They still drive me up the wall.  And this time they kept adjusting the stack range and size.  I'd drop a DLL in, reboot the system, and she'd crash.  So the developers blamed the firewall, and the firewall guys blamed the server guys, and it was some giant 15 way circle jerk that never went anywhere.  And some point in there, the girl who knew someone called because she was bored at home.  So I decide it's time to finish this thing off.  So I did what any logical person would do: vendor thunderdome.  I got them all on the same party line, and then they got to argue with each other instead of me.

Now I have to admit: vendor thunderdome is just about the most fun you can have in this job.  After hours and hours of people passing blame and telling you how the entire thing is your fault and not theirs, they get to argue with the guy who they were blaming the problem on.  And suddenly that air of "it's not my fault it's yours" leaves and you end up with some amazing conversation as people work through the strangeness of their own systems.  

And while these vendors were arguing between each other and actually starting to solve the problem, the girl kept calling.  So I added her to the line.  And it got really awkward there for a few minutes as she went on a tirade.  And these vendors were all just awkwardly talking to each other trying to solve the problem.  And the girl finally hung up the phone.  And the vendors got back to jabbering along as I pressed buttons and told them results.  I broke up with that girl once I got home.  

She started giving me an earful about how I made her look stupid and why was I being such a jerk and all sorts of other things.  And I told her she was a crazy and needy and I needed some space.  Which was my polite way of saying get out of my apartment.  But she didn't get that, so I told her we were through.  She ignored what I said for a good ten minutes.  Then I started chunking her stuff into the hall.  Sorry, I'm not dealing with some crazy lady that can't let me work when I need to work.  I've got bills to pay, and when it's time to fix a problem I'm on the job until the problem is fixed.  Otherwise they fire me and then I don't get to buy beer and watch the game.  And that's just not going to happen.

So yeah.  That one was over.  About that time, the company decided to put in a new phone system.  Probably the most complex over wrought thing I've ever seen.  Took four servers just to run it all.  Considering the complication of it all, it probably should have cost us about nothing.  But that didn't happen.  It was huge, and expensive, and complex.   And the company hires these people to come in and run all the cable, because hey, we've got better things to do that run cable.  Except they were terrible at the job.  Just terrible.  I may not be the most motivated person in the world, but I like to at least do a decent job.  Prevents me from having to do the same job over again when I go ahead and break what I did the first time.  I like doing things once, and then leaving.  One night stands are the best.

So, when I could have done the job myself instead I spent my time chasing these cable people around.  I had plenty of other things I would rather do, but this one girl they had was pretty cute.  Purple hair and big boobs, and sure, she was a bit chunky.  But not badly.  She was good to look at, and she liked to laugh.  So while I was teaching them how to run cable and do it the good and proper way, she and I kept talking.  And we talked a lot.  Somehow, I kept ending up one the group with her.  We had plenty of time to talk, and the more I talked the more she seemed like a pretty decent girl.  So near the end of the job, I got her number and asked her out on a date.  I got some job about how she wouldn't date anyone she'd ever met on the job.  And I told her that was fine, but she needed to lower her standards or tell me where she hung out and we could meet there.  

So that line worked great.  It's not the fanciest line I've used, but I have to admit it got her to give me the address of her favorite bar.  So we ended up there.  And we talked for a bit, but there wasn't much of a game on.  And we tried to play pool, but I'm terrible and she's like the shark at the game.  Either that or I'd had way too much beer.  Probably too much beer.  But I digress.  I think it was half price pint night, and I'm a sucker for half price pints.  I can buy twice the amount for the same amount of money.  Whoever came up with this plan was either completely loaded or a genius.  Either way, I spent a lot of money buying beer.  But I would have spent a lot of money on beer anyways.  

At some point, we staggered home and fell asleep on the couch watching old TV shows.  We didn't even do anything!  It was crazy.  But then we woke up in the morning with terrible hangovers and no good excuses, so we gave ourselves one.  And from then, we were pretty inseparable.  She was fun to be around, and liked to drink beer and watch the game.  What could possibly be wrong with a woman like that?  And then I ended up with a triple on call and she never went crazy when I didn't call her.  It was the strangest thing.  I've never met a woman like that.  It was weird. 

After a few months, all this crazy talk started going through my head.  Like this girl was the one and I was going to marry her and we'd settle down and have a beer and watch the game and have some children and do all the normal family type stuff.  Maybe it wasn't so back.  But my mind went back to that stupid firewall that kept saying "can't commit".  Here I finally had a girl who wasn't a bunch of strange commands and lines of stuff that doesn't make any sense.  Here was a girl that actually made sense.  Why not?   Why not hit the button one more time and see if it finally commits?

Sunday, January 13, 2019

New year, new something?

So much for the new year, new something or other stuff.

I'm still here. 

Still being the same person I was last year. 

Is that a bad thing?  I don't think so.

Who knows?