mellowtigger: (Default)
injury on day 2My wound from being a dork at the Science March is not healing very quickly.  I stopped at a local clinic today, just to have someone look at it for me.  The doctor said that I was treating it appropriately, but to come back and see her if the swelling at the edges starts to spread outward.  She said for this type of injury that Bacitracin often works better than Neosporin, and she gave me some samples to use.

I was convinced at the Science March by speaking to some people more knowledgeable than I am on matters of property status that I should call to ask why I lost my Homesteader status on my property this year.  I assumed it was because I failed to fill out an annual form because mail delivery here is very bad, and I often get letters for people all over my block.  They told me that there is no annual renewal, though, so I called today.  It turned out that they didn't receive a form last year, even though I filled it out and turned it in at the Hennepin County office listed on the form.  The lady last year told me that it should be delivered elsewhere (even though it had the Minneapolis office address right there on the form where I delivered it), but they would sent it to the correct office.  All done... or so I thought.  The lady on the phone today from the Minneapolis City Assessor's Office said they never received it, but she'll mail another one today.  That's good, since my taxes were going up a very large amount (for me) because of that status loss.

My taxes were done months ago, and I earned just under $30,600 in 2016.  It doesn't sound like much, and it isn't, but it's a lot more than I earned working at the local animal shelter for years.  It doesn't allow much of anything for savings, but I'm still getting by "easily" in my house.  To buy my house last year, I relied entirely on the savings that I quickly acquired while working for Dell for one year.  Life would be easier if I could tolerate long commutes and for-profit corporate life, but it's just not worth the toll on my well being.  I'm better off poor at non-profits, and I don't regret it.  :)

Speaking of taxes, my property taxes were going up a LOT this year as a result of the assessment increase and the loss of homesteading.  Luckily, I've been overpaying just enough each month that I could absorb that increase, but hopefully I can get the tax reduction from homesteading back onto my property.  Meanwhile, my assessment went up from $57K to $65.5K.  That's still a lot less than the value I'm paying on insurance, since that's a full replacement cost of $150K.  But... I mentioned being poor, right?  Lower taxes are good for me.  I plan to continue volunteering to help make a difference in the local crime in Jordan community of Minneapolis, so hopefully I'm contributing a commensurate benefit with my time instead of my cash.

My parents left me a gift last year that will cover the nice fencing that I want for the yard.  I got the quote from the company if I do all the work myself.  I need to give them the okay to order the materials, since the ground is now thawed.  I'll have to install the fence myself for the cheaper price, which will still be over $3.5K for everything.  I think that I'll "feel" a lot better about living here, though, once that's done. I've been woken up a few times already this month by gunshots, so adding a small sense of security would be a good thing for me.  And with a fenced back yard, I could easily get a dog for additional peace of mind.

I'll soon be facing some new stress at work (a coworker taking a very long leave of absence for a worthwhile cause), but that's the only added stress that I anticipate for 2017.  If that's all I have to worry about, then this year will be a good one.
mellowtigger: (gardening)
I was planning to attend the Science March anyway (more on my reasons in a different post on another day), but this march was unusual in that my employer was also participating as an official Partner. So I got to join my coworkers on the march. The weather cooperated, and it was a beautiful day. The count of how many people attended is under dispute. Even the earlier Kids' March had over 800 RSVPs, so you'd expect the main march to be heavily attended. The count showing up in local newspapers is only 10K people (with some great photos at that article). The march organizers, however, are estimating 48K people. If they were the ones operating the drone at the march staging area, they should have some good evidence for their estimate.

I made a sign to carry on the march. It didn't occur to me that I wouldn't be able to easily take photos. That oversight has consequences: fewer photos, poor quality photos/videos, and getting separated from my group for a long time so I could steal "a moment" to take photos.

Here's the pre-crowd assembling early for the march.

ScienceMarch St.Paul premarch at churchScienceMarch St.Paul droneScienceMarch St.Paul street gathering

We even had a band playing appropriate Earth Day music.

(embedded video is breaking the post, so here is the YouTube link)


I joined my coworkers for the march, and I even made it into their Twitter posts.  These 3 photos are not my own, of course.

ScienceMarch StPaul the whole TNC groupScienceMarch StPaul poster TNC united by nature guided by scienceScienceMarch StPaul me taking a photo

I eventually left my group to climb a bridge wall to try to get a video of the massive crowd. I never could see all of it at once, so the attendance was much higher than what you can see here.  After I took these photos, it probably took me 20 minutes to find my group again, even with multiple phone calls and texts.  I had the same disorganization leter while trying to find my former landlord and his group amongst the throng.

ScienceMarch StPaul crowd 1ScienceMarch StPaul crowd 2


(embedded video is breaking the post, so here is the YouTube link)

Then I got down from the fence that I was standing on. I'm a klutz, though, even on a good day, and I was wearing new glasses from 2 days earlier, so my depth perception is very bad. I ended up meeting the pavement harshly. Much later, I made my way to the Nurse station at the rally. They said I was their biggest accident so far. Typing this post on Sunday, my leg is still bleeding a bit. I won't be doing the gardening today that I had planned.

ScienceMarch StPaul my injured legScienceMarch StPaul nurse station

The rally was attended quite well. I could never get close enough to the capitol steps to hear the speakers well. I never did spot a single news station van or camera (although local stations did have coverage on the 10pm news). I also never saw one of the portable overhead 360 cameras that the police use.  It was the state capitol, after all, so maybe they already have plenty of security cameras everywhere.  It seemed like every third person carried a sign, so the crowd was very engaged. It was also unusually "pale", even for Minnesota. Where are we losing our minority kids in the science classrooms?

ScienceMarch StPaul rally at capitol stepsScienceMarch StPaul dinosaur costume
ScienceMarch StPaul woolly mammoth contraption side viewScienceMarch StPaul woolly mammoth front view


The woolly mammoth was an impressive mechanical contraption.

(embedded video is breaking the post, so here is the YouTube link to video 1 and video 2)


And, in no particular order, a collection of the few posters that I was able to capture on my sunscreen-smudged cell phone camera.


ScienceMarch StPaul poster Blinky SimpsonsScienceMarch StPaul poster Rosie the Riveter
ScienceMarch StPaul USA flagScienceMarch StPaul poster future scientist
ScienceMarch StPaul poster good science makes good judgementScienceMarch StPaul poster no science no beer
ScienceMarch StPaul poster resist ignorance
ScienceMarch StPaul poster science isn't liberal pollution isn't rightScienceMarch StPaul poster science lab labrador
ScienceMarch StPaul poster quote Carl Sagan science is a way not to fool ourselvesScienceMarch StPaul poster stand with Data Star TrekScienceMarch StPaul poster science is important muppets
ScienceMarch StPaul poster science based policy not policy based science

I think it was an Earth Day well spent.

#ScienceMarch #ScienceMarchMN #MarchForScience #NatureUnitesUs
mellowtigger: (Pride)
I came out at work this morning to the whole tri-state chapter where I work.  It was no small feat, since it was even my normal day off.

They were having their monthly staff meeting, but it was pre-empted this time by a planned discussion of recent emotional news.  Since our last staff meeting, there was the mass shooting in Florida, we had another black man die by police last week in our Minneapolis/St. Paul metro area, then there was the sniper in Texas shooting at police, the Bahamas issued a travel advisory to their citizens that warns about travel to the USA and police ruthlessness there.  And finally... 4 blocks north of me on Friday morning, 2 children were shot and 1 killed in just another daily shooting here in the #WarzoneInMinneapolis where I live.

So... we were sharing our thoughts at work on these emotional events.

I came to work on my day off because I was expecting to help give a presentation on our move to Skype For Business as a communication tool.  Instead... I shared the story that I was one of those people for whom the police are not always and automatically "the good guys".  I explained that I am gay, and I am just old enough to remember when the police would come into a small-town Texas gay bar for no good reason.  The music would shut off, the house lights would come up, and silence would permeate the air.  Then several cops would walk into the bar, walk around the entire place, with not a sound uttered by anyone... until they walked back out and life would resume in the bar.

I never really hide it, but I am now officially "out".

I mentioned that the police on campus at Texas A&M University once successfully changed how they are perceived.  They simply separated the car ticketing staff (gave them different uniforms too) from the other police staff, and suddenly detectives on campus were able to get cooperation as they sought public help in solving thefts and other crimes.  There was so much built up hostility to police prior (because of rampant parking fines) that the community wouldn't cooperate for any issue.  The police learned a better way to manage themselves, then the community cooperated.

I also mentioned that I live in one of the dangerous parts of the USA, and I've been woken up at night by gun shots, including death threats issued at the neighbors outside my bedroom window.

I'm still not sure what to do about the violence here and elsewhere throughout the USA, but I feel reassured that other people are committed to the idea of de-escalation rather than the spiral of threats and violence.

For once, I don't worry about any retaliation at work because of coming out.

Know that change is possible.  I've seen it happen before.  We can make it happen again.
mellowtigger: (Terry 2010)
I attended the Black Lives Matter protest in Minneapolis yesterday.  It was the most convenient political activity that I've ever joined.  My employer's building closed early that day since the protest was happening across the street from the front door at the Gold Medal Park.  All I had to do was walk outside and join the event.  It couldn't be any easier.

Here are photos and brief video clips that I took. The crowd grew to about 1,000.  I can vouch for that many, at least, although I saw one news report that guessed as high as 1,500. What did not appear in any of the news accounts, though, is the observation that it was a very pale crowd. I think it was about 85% caucasian. The minority clearly has the support of the majority here, which should be encouraging for all of us who expect improvements to be made.  Unfortunately, I didn't know the schedule and had another event to attend, so I left apparently just minutes before they started marching.  I missed the main event.  Oops.

extra security at my work buildingpark's sign with early crowdpark's sign with tv crews assemblingpolice surveillance camerapolice unmarked vehiclesposter easy to hold up smart supportsposter from lady in wheelchairpostersposter at bus stop downtown Minneapolis

Here is a series of shots that show how the crowd grew over time.

time 5:05pmtime 5:33pmtime 5:38pmtime 5:45pmtime 5:52pmtime 5:54pmtime 5:56pmtime 6:03pmtime 6:07pm

I don't pretend to be good at video either, but here are two pans of the crowd that I took.
crowd chanting at 5:48pm (avi, 111 MB)  "No justice, no peace, prosecute the police"
crowd at 6:09pm (avi, 37MB)

I was featured in cameo for several seconds during the 6pm CBS news from local tv station WCCO. You can watch the video here.
http://minnesota.cbslocal.com/video/11442633-blacklivesmatter-protesters-rally-at-gold-medal-park/

I'll write soon about the issues at hand. I land solidly in the "we can do better" camp, but I have a lot of evidence to offer and thoughts to consider. I need more time to organize my thinking. I'll try to be concise. :)

#BlackLivesMatter
mellowtigger: (snow)
We finally have cold weather and snow. That polar vortex is back too. This morning is barely "subzero" (-1F/-18C, windchill -14F/-25C), but it's been a lot colder recently.

I spent this week a little farther north than usual. Where I work (with The Nature Conservancy), they have a conference once every three years that brings together employees from Minnesota, North Dakota, and South Dakota. We met at a location close to all of us, a small resort in Ottertail, Minnesota. Unfortunately, the weather there reached a low of -13F/-25C (windchill -30F/-34C), so I never went outside during the event. The weather didn't cooperate, so they cancelled the sleigh ride, cross-country skiing, ice fishing, and even the evening campfire.

The experience was good, though. I have a much better sense of what my coworkers are doing. I learned some cool stuff too. The state of Minnesota makes available some great datasets from LiDAR surveys. They are very detailed, and they can detect both tree canopy and ground level. I also learned that North America's grasslands are useful as carbon sinks, storing several tons per acre under the roots of those grasses. Unfortunately, we're losing grasslands at a faster pace than the world is losing rainforest. Meanwhile, I gave a presentation with my tech support coworker on what to do when your email inbox reaches its quota. It's not a particularly exciting topic, but people seemed to take away tidbits that they thought were useful to their own work life.

drive in snowWe heard the bad weather forecasts, so organizers sent the South Dakota people home early to escape the expected bad driving conditions. The next morning, however, it seemed that South Dakota escaped the snowfall while the rest of us were just beginning to receive it. Instead of a final buffet lunch, we got boxed sandwiches so we could get in our carpools and head home immediately. No luck, though, because the weather system was already covering our route. It took much longer than usual to get back.

I took this photo while we were traveling slowly along the interstate highway back to Minneapolis. We saw several accidents and near-accidents, but I was delivered by my carpool safely back home.

We're forecast for above-freezing days soon, so we'll get more thawing in January.  Winters here are getting easier each year.  Normally, we'd have an arctic landscape outside, with boring snow cover from first snowfall (November or December) until thaw (around April).  Now, though, it seems that we will have "punctuated" winters where the snow actually melts between downpours.

Climate change is interesting, at least.
mellowtigger: (twitch)
A near-constant twitch under my left shoulder blade prompted my post this morning. I haven't written much about twitchiness this year. It's definitely better since metronidazole day nearly two years ago. My nerve problems have not disappeared though.

I still get painful muscle cramps, usually in my right foot where this all started so long ago. A few weeks ago during the commute home from work, it got so bad that I crossed my legs and used my left foot for both the accelerator and brake in my car. And, of course, I'm still tired of being tired. I might someday experiment with marijuana to see if it can control the muscle twitch symptom as anecdotal stories continue to assert.

The new job is still a mixed bag. The nausea during the commute is much better but still there. I feel much more confident about the day-to-day work, but less so about the larger project that somehow is my responsibility even though I'm the newcomer and less qualified for it than someone already there.

Still hoping for better days ahead. It's currently -25C/-13F this morning. I should add warmer days to my wishlist.

two months

Nov. 24th, 2013 08:38 pm
mellowtigger: (Terry 2010)
I thought maybe I should give an update after another month at the new job. I'm doing slightly better. That's progress, I suppose. I still haven't ruled out the option of simply running away, though.

The details of the job aren't quite what I was expecting, so I still feel out of my element until I spend more time at it. I would worry that they're not getting their money's worth yet, but then I remember that other places do far more training before turning people loose on their systems. I think I'm "holding my own" at this point. We're supposed to do a 3-month review, so I guess I'll get a better sense of my objective performance at that point.

Then I can run away. :)

one month

Oct. 19th, 2013 09:05 am
mellowtigger: (Terry 2010)
I finished my 4th week at my new job.  It's a mixed bag for me, with both prominent highs and lows.

The High:
There are actual jobs that pay actual money for permutation exploration?!  I was built for that stuff!  How did I miss discovering this career path after all those years I spent programming?  When I left programming a decade ago, I could have been doing this kind of work instead of tech support.  I guess I never thought of it because I never programmed at any place large enough to have a separate test group.  Instead, programmers did all of their own testing.  Yes, absolutely, I can go exploring every possible use of a program just to see if it works as intended.  That's not a job, that's an adventure.  :)

The Low:
Unfortunately, self-directed testing is what the job requires only between the episodes of intense regression testing.  The regression testing uses predefined "scripts" (as in food recipes, not computer programs) that define explicit scenarios that must work properly.  You'd think that these scripts would make testing easier, but I'm finding the opposite.  Each script requires a new "setup" to create an environment of hardware and software versions that a customer might find themselves using.  But no script exists to explain the setup, and I'm finding that I have vast fields of ignorance over most of these very important details.  I can't test if I can't set up. It becomes permutation explosion where I can't even understand a specific trail that I'm following.  I'm easily flustered when confronting my own ignorance under important deadlines.  Nearly everybody is, I would guess, but unfortunately that's what regression testing is all about.  As I was leaving work on Friday afternoon, I got a long list of assignments that will help me simulate the experience before my first real regression test.  I asked for more concrete examples, so I'm getting exactly what I needed and wanted.   I may, though, end up running away in terror... and that's bad.  I'm not convinced that I can do this particular job.  I think maybe I should have "cut my teeth" on this new career path (which is great!) with a much less complex product.  :(  Stay tuned.

The Other Low:
I'm surprised at how little information I can find on research into what exactly trips the stress sensors in autistics who drive vehicles. I'm not holding up well on my commute.  I've spent about 1/3 of my morning commutes feeling nausea.  It fades away almost immediately after I finally sit down in my chair at work, but it's a very bad start to the work day.  While the evening commute holds much more traffic and my stress level is high then too, it never leads to nausea.  I don't know if it's because of the sunlight (which makes it easier to see everything) or the slower speeds of travel (which makes it easier to scan for traffic).  It's almost 22 miles from home to work, and I can't remember ever driving so far in metro traffic for any job.  If I focus now (sitting silently in my bedroom during the weekend) on the nausea, I sense memories of my time in Houston in 1987 when I worked at IBM.  Maybe I experienced similar problems there, but it certainly was not as strong as now.  I'll write a new post about "autistics and driving" after I've pondered the topic some more.

Alternatives Exist:
I've noticed in recent weeks that some tech companies focus only on hiring adults with autism diagnoses to do quality assurance testing of software products.  Two mentioned in this article specifically offer long formal training (which addresses my Low #1) and working only by telecommute (which addresses my Low #2).  I've already fired off an email to ask about these opportunities, but I haven't heard anything back at all.  I'm disappointed by the silence.  Obviously this career path is a good fit for a mind like mine, since entire companies are springing up to develop this mutual benefit.  My current employment, though, may not be ideal for me in other ways.  It's a good thing that my boss was on vacation last week, because I was prepared to leave before any important deadlines loomed.  I've already given him contact information for the person they should hire to replace me, if it comes to that.  This other guy has spent years using this product, so he already knows the many things that I still need to learn.  I can also be stubborn, though, and I think simple curiosity (the motivation to explore many new tech details) can help me through my current flight instinct.
mellowtigger: (Terry 2010)
I finished my first week at Dell Compellent.  Like most jobs (or at least technology jobs), new employees face a veritable tidal wave of information to learn.  I think I did okay, though.  The product is certainly interesting, and I'm getting to see both the hardware and software needed to set it up.  I cabled my first system and configured it so that that someone else on my team was able to establish a virtual hard drive on it.  Not bad for a first week, I hope.

The bad part of this job, though, has nothing to do with Dell.  It's the commute.  I drove out there this morning while there was no traffic to interfere, and it took me 27 minutes to get from one parking spot to the next.  Not a terrible drive.  Unfortunately, the rush hour commute is a very different experience.  I average less than an hour on the morning trip and more than an hour on the afternoon trip.  I really don't want to spend 2 hours per day on commute, since that means living in my car for 10 hours a week.  That's bad enough, but the stressful driving makes the overall experience even worse.

Dell is flexible with start times.  They asked me to show up on my first day at 9am, but I experimented with moving my start time earlier in the morning as the week progressed.  The hassle is getting slightly better with an 8am start time.  I'll aim for arriving at 7:30am on Monday to measure that commute time.  If it doesn't offer a big payoff, then I'll probably just settle for 8am.

Meanwhile, I used the time this morning while I was in the area to scope around for cheap housing.  I don't know that there's such a thing as cheap housing anywhere in the Twin Cities, but I did make one interesting find.  A decade ago or more, back when I was still a programmer, I pondered buying a home.  I went by this house several times before I decided to spend my money buying a new car instead.  A "For Sale" sign caught my eye while driving around today, and I was surprised to recognize that house.  I'm wishing now that I had bought it... or that I had $130K laying around somewhere to throw at it now.  It's only 5.5 miles from my new workplace, and I wouldn't even have to drive onto a busy highway to get there.

I'll probably end up calling the small apartment complexes that I saw in that area to see what prices are like.  I still don't have my first paycheck from Dell yet, so I'm not sure what net income I have available to use for housing each month.  I realize that I'm still thinking like a poor person, since I spent half a decade at a non-profit and exhausted my already meager savings.  It may be nice for things to change finally.

black mold

Sep. 17th, 2013 01:00 am
mellowtigger: (coprolite)
Good news, it's not psychosomatic. I have actually been getting sicker at work during the last month, in spite of the massive amounts of allergy medications that I've been taking.

They found black mold in our office space today. Yay!

And Hope is being unusually energetic tonight. I gave up trying to sleep around midnight, and she's still at it an hour later. She'll eventually tire out chasing imaginary beasts and vicious plastic toys.

I guess Tuesday will be a caffeine day for me at work.
mellowtigger: (wild things)
I have my exit interview with Human Resources on Monday, and Wednesday is my last day. My thoughts are on the great things that could be done at AHS but that I won't be around to see them done.

I was intending to write in detail about a few complaints that came to mind. 1) Our job webpage shows 19 openings today, but the job webpage for the slightly smaller Oregon Humane Society only shows 4 openings. 2) Management never released the results of last year's employee survey. That omission sounds bad in itself. 3) I keep insisting that AHS needs a data integration specialist, but it must be in a work group that devotes long spans of uninterrupted time to its tasks. 4) Our data sources are poor quality, and the market seems unable to create a great solution for our needs. I have suggested for years that we form a coalition with other large humane societies and devote effort to creating an open-source solution that all of us can use.

Instead, though, I'll focus on my realization that AHS is a primary source of vast amounts of data. They aren't using it or seeing any potential uses, and their myopia makes me sad. The AHS mission is to "engage the hearts, hands, and minds of the community to help animals." We could do so many things to fulfill this mission.
  • Collect animal blood types, then offer a service to notify owners of animals with specific blood types if someone needs blood donated for surgery for their animal.
  • Publish long-term statistics on lost animals, so we know what seasons are most likely to see animals wander (and owners can take precautions). We would also know what typical quantity goes missing each year and in what regions, so we could immediately dispel false tales about people seizing animals for food or for combat.
  • Collect information on injured wildlife, so we can identify potential changes (posted signs on roads?) that would reduce animal suffering. Are there long-term trends of urbanization or climate change that affect wildlife injury rate or severity?
  • Offer to collect information submitted by vets (no government agency does this service, I think) so we can post bulletins if a contagious disease cluster is showing up near particular dog parks. People could exercise their dogs solo for a week or two instead of using the park.
  • Mine data about surrendered animals to look for cycles and changes. For instance, does data support the opinion that global warming in Minnesota has changed the cat breeding season here? Is one animal breed (or gender) more likely to escape the house, defend its territory, or develop health problems? How do economic times affect surrender rates or abuse rates?
  • Mine data about adopters to look for patterns. Are ethnic or financial groups adopting particular breeds? Maybe we need to launch education campaigns that expand human behaviors.
  • Mine data about euthanasia for behavioral problems. Are there any commonalities that could be addressed with education campaigns for owners that could prevent their pets from reaching the point of being nuisances or dangerous?
  • Mine data about our spay/neuter surgeries for patterns. Are there any complications associated with particular breeds, ages, or weights?
All this and more. We have databases focused on animal surrenders and adoptions, volunteer management, humane investigation, animal training, classroom education, call center counseling, animal boarding, and the phone system itself. We should be tying all of these resources together into a cohesive whole that we can use to query for patterns too large or small for us to see as individual humans.

Management sees value only in those evaluations that might increase the dollars raised from donations. I told them that data is valuable, but they misinterpreted my use of that word. They recently moved a database person to the Marketing group, so this trend will only worsen. I notice, for instance, that the data privacy statement that I created was never posted on our webpage. Without me advocating for it, I doubt that it ever will be used.  Now that I'm leaving, they don't have anyone who can tie the various connections between databases that have nothing to do with fundraising... that instead are related to the welfare of the animals themselves and the human community. It makes me sad.

Before I go, I hope to leave a parting gift to the employees of AHS.  Earlier this year, I analyzed 4 months of phone data and found that at my site location, we listened to 3,922 public announcement pages totaling 10 hours of time.  I suspect that for a whole calendar year, those annoying pages would amount to more than 10,000 interruptions to daily work routine and more than 3 whole work days of lost time.  Maybe some hard numbers will convince management to crack down on this wasteful use of the p.a. system, since employee complaints have fallen on deaf ears.

Data, as I keep insisting, is valuable.
mellowtigger: (we can do it)
I've once again joined the ranks of those rare, debt-free Americans!

I went into debt when I got slammed with two major life problems at the same time.  I went to the hospital and got some medication that together cost me a few thousand dollars, and my car died.  My parents helped me with the car problem, and I slowly worked off the healthcare debts through extra hours at work in recent months.  I paid off my hospital and doctor visits last month, and this month I paid my landlord for the loan that let me get the nearly-$1000 medication (that I only used half of before the doctor told me to stop).

I guess I can finally announce that I'm leaving Animal Humane Society for a job at Dell.  I gave my notice at AHS last week, and Dell was very nice in giving me a month before needing to start the new job.  We need that time at AHS so the remaining IT Staff doesn't have to run the shop alone.  I really hope they have at least 1 new person by then, maybe 2.  I wasn't fully ready to leave AHS yet, and I'll miss working there.  It's hard, though, to focus on data issues when I'm constantly distracted by other things (especially that demanding phone system).

I'll be doing Q/A testing at Dell.  I've haven't had this specific job before, since all of my programming jobs have had me running solo as programmer, tester, and support staff for my systems.  It'll be interesting to focus specifically on the Q/A role.  This particular group needs me for my PowerShell scripting.  I'm looking forward to giving more focus to that platform than I can at my current job.  I don't normally motivate for money, but I'll be earning more than twice my current hourly wage for the work.  My recent financial escapades into debt left me appreciating the value of higher wages.

It'll be nice to not be poor any more.  Now, though, I won't be able to discover firsthand what happens to poor Americans if they don't have health insurance.  I'm sure I can cope without that particular adventure.

warfarin

Jun. 13th, 2013 11:03 pm
mellowtigger: (possum)
I've been forgetful lately. I haven't been eating my rat poison like I'm supposed to do.

I'm taking warfarin (aka coumadin) on prescription. It's named after the Wisconsin Alumni Research Foundation which funded the research into what substance was causing some cows in northern farms to bleed to death in the 1920s after having their horns or testicles cut off. It turns out that ranchers in areas like Wisconsin were using sweet clover to make food for their cattle. Sweet clover (like sweet grass and sweet woodruff) produces large amounts of coumarin which gives off a sweet smell when the plant is cut. Coumarin also happens to be an anticoagulant. The cattle were eating lots of it, and it prevented normal clotting of their blood. They bled out when injured, and if they ate enough of it then they died spontaneously of internal hemorrhaging.

Vitamin K cycleWarfarin does not dissolve existing clots; it just helps to prevent the body from growing a clot. It is prescribed by doctors to people like me for many months while we wait for our body's immune system to naturally (but very slowly) disassemble the clot. It's also used in larger quantities as a poison to induce internal hemorrhaging in animals like rats. So, yes, I am technically eating rat poison. Or, at least I'm supposed to be.

I've mentioned before that my memory and concentration do not work nearly as well when I'm stressed out. I've already had to change my diet suddenly to eliminate all of those healthy green leafy vegetables that I was training myself to eat more of. Those foods happen to be high in Vitamin K1. The human body uses that vitamin in the production of molecules that promote blood clotting, then those molecules are later recycled back into Vitamin K which can be used for additional clotting. Warfarin works by stopping that recycle process, slowly draining the body of its vitamin supply. By adding more vitamin K to my blood stream, those foods would negate the usefulness of warfarin. So I have to avoid them. I saw a salad at work today, and I started to crave it. I keep wondering if it would it be okay to add greens back to my diet if those greens were sweet clover.  Wait... I was talking about stress, wasn't I?

In addition to diet change due to health problems, I've also had medical debt, car loss, and the joys of public transit to contend with. Then on Tuesday last week, my employer fired a coworker so now I've also been working longer hours on no-longer-familiar tasks. My sleep and eat schedule have changed a lot in response to these new demands. I'm not surprised that I forgot my medication on 3 out of 7 days. Bad mistake, it turns out.

I can tell when my rat poison levels have dropped. I suddenly can feel the clots again. I say clots, plural, because I can feel both the original muscle injury site in my calf (a sharp knife sensation) and the spot underneath my knee (the broader press-on-nerve sensation where the pain got so bad that it motivated me to visit the hospital emergency room back on April 18th). I'm guessing that the clot in my calf broke off and floated up the vein where it got caught in the joint under my knee. It was lucky for me that it stuck there, since it didn't flow higher to reach my lungs, heart, or brain. In theory, it still could break off again, but assuming that I stay properly medicated and don't easily permit additional clotting, then I might be off of my warfarin medication in October.

I need a vehicle. It would make my life a lot easier right now, and I could use a good break in what has been a not-so-great year.  I think I've had enough of "change" for a while.

Yes, I did eat my rat poison this evening.
mellowtigger: (penguin coder)
I found a good solution for loading a music playlist loop beginning at boot.

A quick comment for some good news, though. Do you remember when I told you that audio is borked on the pi? Well, the Raspberry Pi Executive Director agrees. He posted on January 1st a job position specifically for work on the ALSA audio driver. I look forward to some fixes in future Raspbian builds. Now back to the fun stuff.

It takes a small amount of setup mojo to get it working, but I like the mpd server and client software for the usage that I envision. In my case, we need a continuous audio feed for our phone system. It will play the music-on-hold that you hear while waiting for your phone call to route. We could also use a similar system to play the audio enrichment music for dogs, cats, and other critters in our shelters. We want the audio files to play continuously as long as the pi is powered up. Here are the commands that you will need to get your pi working.

sudo apt-get install mpd mpc
mkdir -p /home/pi/.mpd/playlists
mkdir /home/pi/Desktop/music
touch /home/pi/.mpd/{mpd.db,mpd.log,mpd.pid,mpdstate}
ls -al /home/pi/.mpd
sudo vi /etc/mpd.conf


You are now editing the default global config file for mpd. (Don't use a local version. It causes lots of file permission pains. I wasted hours before finding this global file.) It needs to contain the server configuration variables. Here is the info that worked for me. You should be able to use the same text. Either modify the lines that are already there, or delete the contents and insert just these lines.

music_directory "/home/pi/Desktop/music"
playlist_directory "/home/pi/.mpd/playlists"
db_file "/home/pi/.mpd/mpd.db"
log_file "/home/pi/.mpd/mpd.log"
pid_file "/home/pi/.mpd/mpd.pid"
state_file "/home/pi/.mpd/mpdstate"
audio_output {
type "alsa"
name "mpdaudio"
}
bind_to_address "127.0.0.1"


That last line is necessary as a hard-coded ip4 address. Most tutorials suggest that you use "localhost" instead. I did, but I kept getting errors. Apparently the Raspberry Pi network setup has both ip4 and ip6 assignments for localhost, but mpd gets confused by the duplication. Hardcode the ip4 address as listed above, and you're good. You have mpd working as a system service at startup.

Copy your .mp3 files into your Desktop/music folder. The server will see whatever files are in it. Keep the filenames in alphabetical order, so it simplifies your playlist ordering. Now we need to use the client to make sure the server is playing at the proper volume and in a repeat loop. We want it to check for updates daily.

cd /etc/cron.daily
sudo touch mpdrefresh.sh
sudo chmod 755 mpdrefresh.sh
sudo vi mpdrefresh.sh


Insert these commands into the file.

# Refresh the mpd music database
mpc volume 100
mpc repeat on
mpc update
mpc clear
mpc add /
mpc play


If you want, you can see when these daily scripts will execute.  Use "more /etc/crontab" to see the listing.  Notice that scripts in the cron.daily folder are executed every day at 06:25.  We also want to run the update at boot time, just for our own peace of mind.  We'll need to update the startup script.

sudo vi /etc/rc.local


The last line of the startup script should be "exit 0". Before that line, insert this command.

# Refresh the mpd music database
/etc/cron.daily/mpdrefresh.sh


Save and exit. If you want to test immediately, you can use these commands to place a soothing river sound for playback.

cd ~/Desktop/music
wget http://www.soundjay.com/nature/river-4.mp3
sudo reboot


If all goes well, you are listening to your music files play in a continuous loop soon after your pi powers up. If you need to do any troubleshooting, these commands should help you stop the server daemon.

ps -ef | grep mpd
sudo service mpd stop
sudo pkill mpd


If you need additional help, then check out this extensive mpd guide.
mellowtigger: (penguin coder)
phone operatorThe more I learn about phone system technology, the more I wonder how anything ever works (successfully).

Among the hodge-podge of responsibilities I have at my job, I also manage 6 PBX phone systems of the Mitel / Intertel CS-5000 family. Thanks to a useful hint that my boss found in a Perl script via Google, I was able to establish phone system logging using Powershell. My programming will save us over $10,000 that we would have been charged by our vendor. That's half my annual salary, so I've earned my keep for a while. :)

I've redacted some of the details from my code for security reasons, but I wanted to make the source code public so it's easier for the next person to find useful material through a web search engine.

# log-smdr.ps1
# This Powershell script connects to a Mitel/Intertel CS-5000 series phone system, 
# directs it to open its SMDR stream, then logs the results to a text file.
# Station Message Detail Recording (SMDR) is a system feature that provides 
# a detailed record of outgoing and incoming calls.
# This script is intended to be restarted at midnight each night.

# Turning on SMDR reporting is a two-step process in DbStudio Session Manager.
# 1) System / Maintenance / SMDR, set "SMDR Output Active" to yes
#    ("Output Port" should already be set to "NONE")
# 2) System / Sockets / SMDR, set "Enable" to yes
#    (System / Cabinet / Sockets / SMDR, in some older systems)

# http://technologyordie.com/mitel-5000-smdr-script (example perl script)
# http://www.codeproject.com/Articles/12893/TCP-IP-Chat-Application-Using-C

param ([string]$site='needparm', [string]$logdir='C:\script\log\', [boolean]$debug=$false)

# convert $site parameter into ip/port combination
switch ($site) {
    'S1' { $ip='192.168.0.1'; $port=4000 }
    'S2' { $ip='192.168.0.1'; $port=4000 }
    'S3' { $ip='192.168.0.1'; $port=4000 }
    default { $ip='192.168.0.1'; $port=4000 }
}

# find a new filename for logging this session
$scriptps1 = $MyInvocation.MyCommand.Name
$scriptname = $scriptps1.substring(0,($scriptps1.length - 4))
$datelog = get-date -f 'yyyyMMdd'
$version = 0
do {
    $version += 1
    $filelog = $logdir + $scriptname + '.' + $datelog + '.' + $site + '.' + $version + '.txt'
} while (test-path $filelog)
set-content $filelog $null
if ($debug) {write-host 'logfile:' $filelog}

# create a tcp socket and a destination
# fyi, the TcpClient object did not work with SMDR (perhaps some default values interfered?)
# so I took it down a layer to the Socket object which works nicely
$sockfam  = [System.Net.Sockets.AddressFamily]::InterNetwork
$socktype = [System.Net.Sockets.SocketType]::Stream
$sockpro  = [System.Net.Sockets.ProtocolType]::TCP
$socket   = New-Object System.Net.Sockets.Socket $sockfam, $socktype, $sockpro
$ipaddr   = [System.Net.IpAddress]::Parse($ip)
$ipdest    = New-Object System.Net.IPEndPoint $ipaddr, $port

# establish the connection
if ($debug) {write-host 'connecting:' $ip ':' $port}
$socket.Connect($ipdest)
if ($socket.Connected -eq $false) {
    if ($debug) {write-host 'connection: FAILED'}
    return
}
if ($debug) {write-host 'connection: OPEN'}

# send the SMDR command ASCII character string (no password)
#     2  	002	02	00000010	STX	Start of Text
#     0  	000	00	00000000	NUL	Null char
#     132	204	84	10000100	„	Double low-9 quotation mark
$cmd = @([byte]2,[byte]0,[byte]0,[byte]0,[byte]132,[byte]0)
$socket.Send($cmd)
if ($debug) {write-host 'connection: CMD SENT'}

# the socket's .Receive() will Block, causing the program to freeze until bytes are received,
# so set up a stream which provides the useful .DataAvailable property instead
# incoming records are always 86 bytes long
$bytes = new-object System.Byte[] 86
$stream = new-object System.Net.Sockets.NetworkStream($socket)

do {
    start-sleep -m 1000
    if ($stream.DataAvailable) {
        $socket.Receive($bytes) | out-null  # script hangs here until bytes are received
        $result = [System.Text.Encoding]::ASCII.GetString($bytes[0..84]) # ignore trailing CR/LF
        if ($debug) {write-host $result}
        add-content $filelog $result # append data to text log file
    }
    $datetest = get-date -f 'yyyyMMdd'
} while ($datetest -eq $datelog)

if ($debug) {write-host 'connection: CLOSING'}
$socket.close()
if ($debug) {write-host 'connection: CLOSED'}
$socket = $null
You turn on SMDR by using the DbStudio Session Manager software that comes with your PBX system. That application directory also contains \DiagMon\Diagmon.exe, a program that can also be used to monitor (but not log, that I can tell) SMDR output from your phone panels. I intend to use DiagMon with packet sniffing software to reverse engineer the protocol for handling password-enabled SMDR. It's really hard to come by programmer-focused PBX documentation. I even contacted Mitel, but they defer to local vendors who have a financial disincentive to provide such documentation. :(

Here's a redacted version of the debug output from this script:
connecting to 192.168.0.1 : 4000
connection: OPEN
6
connection: CMD SENT
Q   Station Message Detailed Recording                          17:01:24 04-07-2012
Q    TYP EXT#  TRUNK DIALED DIGITS                START ELAPSED   COST  ACCOUNT CODE
Q
R   NET 1234  P0001 94567                        17:11 00:03:34 $00.00
R   NET 1234  P0001 95678                        17:16 00:00:09 $00.00
R   NET 2345  P0001 96789                        17:21 00:00:14 $00.00
R   IN  3456  90001                              17:19 00:04:56 $00.00
My next project will take these .TXT log files, parse them, and store the data fields in a SQL Server table. Then I can do lots of fun stuff like calculate the average length of time that people are spending in our phone tree before they reach a live person, or determine if people are hanging up in frustration before reaching any person.
mellowtigger: (penguin coder)
Good night, GracieI learned yesterday how to write SQL Injection attacks while learning how to code against them during data import. Vandalizing databases is surprisingly easy, as easy as writing email spam that pretends to be from anybody.

The mischief is similar to the old George Burns and Gracie Allen vaudeville act, where information that was intended as just a clause to a command is instead misinterpreted to be the actual command. The SQL Injection attack is constructed so as to cause a SQL database to misinterpret data in exactly the same way.

Here is the import data file that I constructed to cause the problem.

Name Addr
Trust Me .'); DROP TABLE TESTTABLE1; --

The single quote near the beginning is necessary so as to prematurely close the quotation that was intended to mark the end of a data field. The close parenthesis and semicolon finish out the proper syntax of the intended data import command. Next comes the new command that I want to "inject" as another valid SQL command. The double-dash at the end is also necessary, because it forces the database to ignore as a comment any additional text that comes afterwards, thereby masking the trailing characters from my original import command.

It really is that simple. Even xkcd made fun of the ease with which disastrous consequences can be implemented.

little Bobby Tables

Here is the Powershell code that I used to take advantage of the SQL Injection attack during data import.
# SETUP
$conn = new-object ('Data.SqlClient.SqlConnection') 'Server=DBSERVERNAME;Integrated Security=True'
$conn.open()
$cmd = new-object System.Data.SqlClient.SqlCommand
$cmd.CommandTimeout=30
$cmd.Connection = $conn

# SQL INJECTION
$input = import-csv g:\directory.path\sql1.injection.csv
foreach($row in $input) {
      $p1 = $row.name
      $p2 = $row.addr
      $sql = "INSERT INTO reporting.dbo.SampleTable (FullName, FullAddr) VALUES ('$p1','$p2');"
      $cmd.CommandText = $sql

      $out = $cmd.ExecuteNonQuery()
}

# CLEAN UP
$conn.close()
$conn = $null
And here is the code I used to replace the middle section so it is safe from SQL Injection.
# SAFE DATA IMPORT
$input = import-csv g:\directory.path\sql1.injection.csv
foreach($row in $input) {
      $p1 = $row.name
      $p2 = $row.addr
      $sql = 'INSERT INTO reporting.dbo.MasterID (FullName, FullAddr) VALUES (@p1,@p2);'
      $cmd.commandtext = $sql

      $p0=@{p1=$p1;p2=$p2}
      foreach($key in $p0.keys) {
            $cmd.parameters.addwithvalue("@$key",$p0[$key])
      }
      $out = $cmd.ExecuteNonQuery()
}
I used SQL Parameterization to separate the clauses (data fields) of my SQL statement from the actual SQL command itself. I used a powershell hash table to make the dictionary index for those data field values.

I tested it out, and it worked. The first coding sample caused the database to delete the test table. The second coding sample resisted the SQL Injection vandalism, and put the data values into the data fields as intended.
mellowtigger: (Terry 2010)
I just woke up from yet another multi-hour catnap this weekend. I've spent most of the last 2.5 days sleeping. It's been a useful recuperation from the recent few weeks at work. I feel marginally more energetic now than I did on Friday. I expect the stress level in December to be only slightly better than during November. There are still major projects that have to be finished in short time spans. Oh well. For now, at least it's a paying job during a bad economy.

As I woke from this recent sleep, though, I finished part of another dream...

I was living at a university. It was not a campus that I remember from real life. I was not a student there, and I didn't have a job there either. I slept in study rooms when they were unoccupied, and I read books that other people left in stairwells for reading during their cigarette smoke breaks. When daytime arrived and student activity increased for a few hours, I walked around campus among the other people, the actual students and administrators. I enjoyed learning there, even though I didn't belong.

If I ever win the lottery, I'm going to spend my money by becoming a permanent student on a college campus. I know, I know... I have to actually buy lottery tickets in order to win. It's just a pipe dream. I can't actually do work and school at the same time. I've tried that routine many times over the years. I just don't have the mental fortitude to attend to so many unrelated tasks at once, unfortunately.

This current job was my best hope at actually doing it, since it's only a part-time job. It just doesn't pay enough to keep up with price hikes in college costs over the last decade. And as long as a programming job (needing concentration for long periods of time) is housed within a facilities/I.T. department (needing multitasking on frequent new problems), then I won't have the attention to afford any class either.

Maybe someday I'll find a part-time programming job at a university that offers free tuition to its employees. Wouldn't that arrangement be nice?
mellowtigger: (tech support)
I just got home from a 15-hour shift at work. Time for a quick nap, and then back again tomorrow at noon. It's a big project at work. It's why I haven't been blogging much lately, and it's why I resigned from leading the Sanitation group at Occupy Minnesota earlier this month.

Last weekend, we moved our mail server from Exchange 2003 mailboxes to Exchange 2010. This weekend, we moved all of our pcs from a Microsoft Server 2003 domain to a Microsoft Server 2008 R2 domain. Almost all of them anyway. The other two guys were still working remotely on a few more machines at other cities when I left.

We have made lots of immediate improvements in how things work. The new infrastructure offers future improvements as we have time to learn about them and use them. I still think we need more people.  It's not just the number of hours that we have available to devote to projects, but also the number of brains that can warehouse specialized knowledge.  We need more.  More brains... mmmmm, brains.

I should get some sleep now.

Walk day

Apr. 30th, 2011 06:21 am
mellowtigger: (flameproof)
Today is Walk day.  It's important for raising a noticeable chunk of our operating budget.  It's important because it gives people a chance to see our main shelter and the many other things that we do besides animal adoptions.  It's important because it gets the local community involved in animal welfare.

I'm unthrilled.  I've enjoyed the event in years past, but not this year.  Many thousands of people (and thousands of animals) show up and mill about.  I don't want to be there.  At least this year there aren't many small critters at our site to freak out at all the noise and activity.  It's a high stress day when you're at the low end of the food chain.

I disapprove of the all-staff requirement year after year.  I don't want to be there today.

Time to get my shower, take an aspirin, and head to work.
mellowtigger: (penguin coder)
There was a moment at work today when I mentioned that a particular manual process could be automated.  The people involved responded that yes they agreed, and that's why they were looking forward to me moving into my new job position.  I'll start being a programmer again (for the third time) on Monday, May 9th.  I think.  I don't even know what my title is any more.  It's all very squishy and vague and confusing.  Nevertheless, the moment seemed to deserve a theme song, so ...

Twin Cities Code CampI went to Twin Cities Code Camp a few weeks ago on Saturday, April 9th.  I was curious about the event, since I'd heard about it before.  I also wanted to see the PowerShell presentation that day.  It's an event hosted by the University of Minnesota but attended by programmers throughout the local community.  It's a chance for people in the industry to present sessions, listen to a wide range of topics, and chat with other techies.  I stayed all day Saturday but skipped Sunday.

At the end of the day Saturday, they recorded video and audio of us shouting certain refrains from the theme song they created for the event.  I can be spotted three different places as a blur in freeze frames, but this image is the best I could capture.  I'm the shiny balding head in the orange frame.  *laugh*

Wanna learn somethin' new, don't wanna get complacent
Twin Cities Code Camp!
Your apps are nothing short of magnificent
Twin Cities Code Camp!

- http://kindohm.com/2011/04/28/TCCCThemeSong.html

You can find the YouTube video, full lyrics, and the audio download at that page.  Yes, I did shout the lyrics.  No, I didn't pump my fist.

Profile

mellowtigger: (Default)
mellowtigger

June 2017

S M T W T F S
    123
45678910
1112 1314151617
18192021222324
252627282930 

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 17th, 2017 05:24 pm
Powered by Dreamwidth Studios