On the Occasion of Turning 46

Will his beard fill in? Check back in a year… lol!

As far a memorable numbers go, 46 is pretty low on the list. I cant’ really explain why it seems so ordinary, but it truly feels like one of the blandest numbers in the gamut of years old to be.

This past year has been anything but bland, however. I managed to not catch Covid. I started a web comic. I lost 65lbs (and gained back about 50). I started a new job. Heck, it’s been one of the more eventful years in recent memory, and that’s not just because of the pandemic. In fact, it’s easy to get lost in the every day, and lose track of the amazing things that happen alongside “life”. (Perhaps as a part of life, but that’s picking nits)

There are plenty of not-so-good things that happened this past year as well. A dear friend died. Our health insurance is going through some unwelcome changes. Several friends have been diagnosed with cancer. That’s the thing about life, it sorta comes at you like a fire hose. The unfortunate part is that it’s often easier to focus on being all wet, and lose track of how refreshing a good hosing down can be. So as I begin this 47th lap around the sun, I strive to focus on the positive things along the way. That doesn’t mean ignore the negatives, but rather not lose track of the good things that are often overshadowed by doom. I think depression and anxiety often make the bad times seem worse than they might actually be, and the good times to seem more fleeting. Brains suck that way. But nevertheless, I have a few hopes and dreams for the coming year, and I’ll jot a few down here:

Continue My Webcomic

I can’t explain how much I enjoy poorly drawing a comic 6 days a week. Anyone who knows me realizes the adventures of Blue and Spot are really just my daily journal, using silly pictures to express the real things happening in my life. Much like therapists use dolls to make it easier to talk about personal issues, my squares in a round world make it easier for me to express myself. Even the scary bits. I hope I continue with the comic, because it’s not only enjoyable, but also I think very healthy for me.

Make More Videos

I’m no longer a trainer at CBT Nuggets. My videos are still in the catalog, and I still get messages from folks online about how much they enjoy my training. And I’m not gonna lie, those notes of thanks are so cherished. But I’m not actively making videos for a living anymore, and I miss it. I have a lucrative job that I love (Linux sysadmin, managing a bunch of servers in multiple datacenters), but I miss the creation process. So, my hope is that I start making some videos and posting them to YouTube more frequently.

I’m not sure training videos are what I want to create all the time, to be honest. But teaching is something I love, so I expect they’ll be a big part of my YouTube channel. The nice thing is, at least right now, the videos don’t have to pay my mortgage. That gives me a little freedom to do what I like, and not worry so much about monetization, narrowing my niche, etc, etc.

Add Some Revenue Streams

Yeah, this sorta goes against the last paragraph, but I had a little job scare this past year — and it really made me realize that having multiple income streams is a recipe for better sleep. I don’t need to be Jeff Bezos, but if my job were to end, I’d like to continue living indoors and eating on a regular basis. I don’t honestly know what those revenue streams will look like, or if they’ll come to fruition. I’ve decided that whatever I decide to “monetize” will need to be something I truly enjoy doing. That means something in the creative field, which means monetization will be difficult. But, like I said earlier, I currently have a good paying job, so it’s OK if I flounder a bit finding my feet.

Learn to Find Joy

This is the most vague of my plans. I’ll always struggle with mental illness, but that doesn’t mean I have to let it win all the time. Finding joy can mean so many things. Perhaps I’ll find joy serving in the Church again (my frustrations there are another whole post, or twelve). Maybe my webcomic will continue to scratch both a creative and therapeutic itch. If I manage to get into a groove and exercise more, perhaps fitness will provide those promised hormonal boosts I never seem to get. Honestly, I hope all of those things and more will contribute to some more joy in my life. It’s been a difficult couple years for the whole planet, and I’m no exception.

Anyway, enough about me. I have the day off today (thanks boss man!), and my plan is to enjoy it as much as I can. My birthday wish would be that you (yes YOU) have a wonderful day as well. And if you’re reading this after the actual day? Yes, it still counts. Today can be awesome for you. Have a great $CURRENT_DAY everyone. 🙂

Interns, and College, and Certs. Oh My.

I do not have a college degree.

I think it’s important to lead with that, because while I’ve built a fairly successful career, I’ve done it without actually attaining a degree of any sort. I did attend college — a major university for 2 years, and a community college for a year. But in all that time (and all that debt), I never managed to piece together a degree.

Part of the problem is that like most college students, I changed my major multiple times. I started as an Electrical Engineer major. They seemed to make a lot of money, and, if I’m honest, that’s about all the thought I put into it. Then, in Calculus 3, I decided Electrical Engineers did things with numbers that just didn’t need to be done. I was also a Technical Writing major, and English major, and once I shifted to the community college, a “Liberal Arts” major. (I still don’t know what that actually means)

Don’t get me wrong, even though I didn’t get a degree, my college experience did actually help me significantly. I found myself skipping engineering classes at Michigan Tech, and hanging out in the computer labs all day (and night). There was a brand new NeXT computer lab, and it make Unix sexy. In fact, it was probably partially that time in a terminal window when I was supposed to be in engineering classes that made me fall in love with Unix/Linux.

Should I go to College?

This is question I get a lot. A lot a lot. It’s also a question I’m very hesitant to answer. Because the answer is a resounding maybe, and that’s not what anyone wants to hear. Another problem with the question is that the answer keeps changing. For example, back in 2012, I was asked this question at CBT Nuggets, and colleges were just starting to offer more than C++ programming as their only Computer Science class. Here was my response then:

This is still solid advice (well, as solid as advice from me gets anyway), but if anything, the college angle has gotten more attractive. Yes, education lags behind the cutting edge, but if you go into a university computer science program today, you’ll actually get a well rounded education on networking, operating systems, and actual useful programming languages. That still doesn’t mean it’s the right answer for everyone though, because college is very expensive, and you might be served better with a combination of certification programs, internships, and just plain old experience. When I was college-aged, there simply were no computer networking classes. Now there are, but there are also plenty of vocational programs that teach networking as well.

When I was college-aged, there simply were no computer networking classes. Now there are…

Let’s focus on my area of expertise; sourdough bread. No, just kidding, my technical specialty is Linux. And it’s an area that continues to attract more and more employers. Linux Insider posted an article during the pandemic pointing out the need for Linux-savvy workers, even as the industry moves away from traditional servers and hosts everything in the cloud. (Because guess what makes the cloud run? Yep. Linux.) And while colleges certainly offer Linux classes, they’re still lagging way behind current needs when it comes to employable skills. If you get your college degree, you’re still going to need to get certifications to not only prove your worth — but also to fill in the gaps dated college curriculum offers.

So College is a Waste?

Again, maybe. Here’s the thing, college does a couple things really, really well:

  • Teaches foundational knowledge that makes for better equipped professionals
  • Is structured in a way to teach a well-rounded educational base, wider than the specific topic of study
  • Gives students an opportunity to see if they like a variety of subjects (remember my Electrical Engineer “career”?)
  • Looks really good on a resume

And that last one is a real kicker. The current hiring process is largely automated at the early stages. Many employers use a college degree as a litmus test to determine whether or not to even interview a candidate. A college degree shows that a person has the stamina and hard work to achieve a difficult goal. Even if it doesn’t prove they’ll be a good employee, it’s often the first hurdle to even getting an interview. I personally think that’s sad, but I’m sure it’s a statistically viable way to sort the wheat from the chaff. Unfortunately, companies miss out on some really good folks who chose a different path.

I won’t lie, having a college degree does open doors, especially when applying for a job. It’s not the only way to get hired, but it’s important to judge if the cost and years spend getting educated at a university is worth it. It might be, especially if someone else is helping pay the bill. But going into $100k of debt will take a lot of years to pay off, even if you land a great job.

So What Else Is There?

This is where it’s much better to do what I say, and not what I did. When I left college, I started a small business. It failed miserably. (Like, really bad. It was ugly.) From there I got a tech support job at the local community college answering phones giving support to dialup Internet users. My experience in the computer labs at Michigan Tech, and my experience as a “small business owner” gave me enough resume fodder to get an interview. From there, after a series of very unfortunate events, I applied at a K12 school district for the technology director position. I shouldn’t have gotten that job, but I wrote a very compelling cover letter, and interviewed well. I also got very lucky. Getting lucky isn’t something you can prepare for, but all is not lost if you don’t go to college.

If you decide not to go to college, or at least not head off to university for a 4 year degree, there are a couple viable alternatives that will make you employable (even if it makes it tough to get past the automated resume filters):

  • Get an Associate’s degree at a community college.
  • Study on your own and get tech certifications from places like CompTIA, LPI, Cisco, Microsoft, etc.
  • Apply for an internship. If you can afford it, unpaid internships are an easy way to get experience.
  • Apply for an internship. Lots of interns get paid, if crappy. More on this later.
  • Get involved with some Open Source projects, especially if development is what you want to do.
  • Create an online presence. Certainly GitHub for developers, but also YouTube, Twitter, and LinkedIn.

I know this was the “no college” list, but a couple years at a community college is probably affordable, especially if you can stay home and commute. Having a degree, even an Associate’s degree, will open some doors. Even if your major is Underwater Basket-Weaving — just having the paper will potentially get you an interview.

Internships are incredible. They can be at a college, or a business in the field you’re interested in. They come in two flavors: Regular and crappy. Seriously though, some internships are unpaid. It’s the pre-employment equivalent of doing work for the exposure. It sucks. But, if there aren’t any other options, it’s a viable way to get your foot in the door and get some serious experience on your resume. There are many companies who pay their interns though, so don’t assume you’ll have to work for free. You’ll probably make a pittance, but it might be enough if you can still live at home, or have lots of roommates.

Lastly, the old adage is that nothing beats experience. That’s still true, especially if you can get to the actual interview process. An internship is incredible to put on a resume, but if you contribute to projects on GitHub (even documentation! EVERY project needs documentation!), or have projects of your own, that counts. And if a YouTube channel seems like a silly thing to start in order to get a job — I assure you, if you get to the interview stage, interviewers will check out your YouTube channel before they interview you. Same with blogging, tweeting, facebooking, linked-inning, etc. Put yourself in the hiring committee’s shoes, if they can “see” you before they actually see you, they’ll likely do so. Just be genuine, and it will be like an extended interview that you don’t have to sweat through!

You Avoided the Question Entirely

Yeah, I know. That’s what I meant at the start — it’s all maybe. Rather than a one-size-fits-all answer, hopefully this has given you a bit of insight to help you think through what will work best for you. Some of the ideas are valid regardless of your decision on college. All those bullet points above will make you more employable, and a better tech nerd in general. Getting involved in the community you’re interested in will only help make connections that might get you a job. Most of my “best” jobs have been because I knew someone who knew someone who saw my stuff. Good luck, and whatever your future looks like, I encourage you to seek after something you enjoy. If you don’t like calculus, don’t be an electrical engineer. Trust me.

Silent Days are the Worst

Social media tends to be a glimpse into the highlights of a person’s life. Don’t get me wrong, I’m the same person I am online that I am in person, but some things don’t get posted not out of shame, but out of inability. I try to make it clear that mental health is a real issue, and that I’m not immune to the one-two combo of anxiety and depression — but it’s difficult to write about it in the moment, and reliving the moment for the sake of documentation is often unpleasant.

Yesterday was that day for me. I was depressed. Very depressed. Self-sabotaging depressed. I did tweet, but even that was a “clever” tweet combining politics and religion in a way that was bound to draw hate responses. (It didn’t, because I wasn’t actually hateful, and my online friends are actually my friends, so I rarely get nasty anything online. I truly love you all.)

Anyway. Yesterday was bad. Today isn’t great, but I’m dressed and working today, so it’s significantly better. But depression has a funny way of hyper-focusing you on all the bad things in your life. Financial struggles. Relationship problems. Societal shortcomings and our response to them. Mortality. It takes those issues, and then coats them with a layer of insecurity, self-loathing, inferiority complexes, and hopelessness. Brains are real jerks.

I don’t have any profound message here — just wanted to document some crappy times along with the silly things in my life. I too wonder if my career benefits the world, worry I’ll never be able to retire, fear I’ll be a burden on my children or society when I’m old. I have existential crises, and I’m not always a great person to be around. But today is a fresh new day, and tomorrow will be another.

I’m doing OK today. Really. Just wanted to share the bits that aren’t fun to share. <3

25 (some)things.

I hate resolutions. I hate when people say they hate resolutions. But, here I am, hating resolutions. I also hate that I gained over 40lbs during 2020. All this hatred has to be redirected…

I didn’t start a resolution on the 1st, because if I miss one day, my OCD punishes me fiercely. So I often start a few days later. Then it’s just a thing I’m doing, and not a resolution for the year. Is it different? According to my broken brain, yes. Lol.

ANYWAY, this year, I partnered with a friend and co-worker to do an exercise accountability thing. He offered to do “something” with me daily (we’re on opposite sides of the country, so “together” means virtually and just encouragement from afar). I didn’t want our “thing” go get boring, so I came up with the idea of “25 Somethings”.

Here’s the gist: Every day, we need to so 25 of something, and message each other when we’ve done it. The 25 things can be anything. 25 pushups, 25 jumping jacks, 25 eye blinks — whatever you have the time and motivation to do. But we have to do 25 of something and then message each other when it’s done.

Yes, we could message each other that we “ate 25 Doritos” — but we’re only hurting ourselves in that case, and it’s honestly a little embarrassing to send a message like that to someone who responds with “ran 25 miles”. So sure, shame plays a part, lol.

Anyway — it’s been really awesome so far. I’m grateful for an accountability partner, and the 25 things has been great for both of us. Some days the 25 things are less awesome than others. For example, I’ve had several “25 jumping jacks” days in a row. That’s kinda lame, but it’s something I can do quickly with limited room. And it’s SOMETHING.

So there you go, if you’re looking for a pretty simple exercise accountability plan, feel free to steal ours. 25 things is simple, flexible, and has been pretty great. Happy New Year!

The Family Dashboard

NOTE: This was originally published in Linux Journal, back in 2017. I noticed this morning that my script is still running every day, and I have over 1,100 Bing photos saved locally!

I’ve written a little about PHP before, because I think it’s a great utility language for writing quick things you need to do. Plus, it allows you to use a web browser as your interface, and everyone has a web browser. That makes it very convenient for my family, because I can make simple web interfaces for the various things I normally have to do from the command line. (This is extremely useful when I’m gone to a conference and the Plex server needs to be rebooted, or any of a dozen other things need to be done that are hard to explain over the phone.)

My “Family Dashboard” will look different from yours, but the concept is pretty simple. PHP allows you to execute local functions on the server, and so as long as you can create a bash script that does what you need it to do, it can be launched from the “dashboard” you create for your family. Here’s a sample dashboard file I’ve created, so you can see how simple it is to create a custom page that does what you need it to do (see Figure 1 for a screenshot of the dashboard in action):


<html><head><title>My Dashboard</title></head>
<body>
<h3>You need to enter some commands and possibly options, or just press a button:<br />
<button onclick="window.location='lj.php?command=weather&option=houston'">Weather</button>
<button onclick="window.location='lj.php?command=bing'">Bing Photo</button>
<button onclick="window.location='lj.php?command=uname'">Kernel Name</button>
<button onclick="window.location='lj.php?command=time'">Unix Time</button>
</h3>

<?php

$command = $_GET['command'];
$option = $_GET['option'];

switch ($command)
{
    case "weather":
        echo file_get_contents("http://wttr.in/$option");
        break;
    case "time":
        echo time() . "  <-- that's how I read time! I'm a robot!";
        break;
    case "bing":
        $json = json_decode(file_get_contents("http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US"), TRUE);
        $url = "http://bing.com" . $json['images']['0']['url'];
        echo "Here is the image of the day:\n";
        echo "<img src=$url />";
        break;
    case "uname":
        echo shell_exec("uname -a");
        break;
    default:
        echo "<h1>Press a button!</h1>";

}

?>
</body></html>

Figure 1. My dashboard is simple, but it’s just a front end for the code beneath.

First off, copy and paste that code into a file called lj.php and save it onto your local web server. The server needs to have PHP active, but I’ll leave that as an exercise for the reader to set up. I’ve written about installing a LAMP stack before, so it shouldn’t be too challenging to get a web server running with PHP support (see my article “PHP for Non-Developers” from the December 2014 issue) Also, naming the file “lj.php” is only important because if you look at the code, it references itself. If you name it something different, just change the references in the HTML/PHP code.

Before learning how the code works, test it out and watch it work. If you can’t host the file yourself, but want to see it in action, you can use my server for testing. Just head over to here, and it should redirect you to a hosted version of this file. Click the buttons, and see if you can figure out what’s going on. Can you get the local forecast for your area?

What’s with the GET and Switch Stuff?

It’s possible to create a separate PHP file for every action you need to accomplish. That is a lot of PHP files, however, and it still doesn’t give you the ability to receive input to use in the PHP file itself. I want my family to have a single URL, and I want all my code in a single file. It’s just easier that way. First I’ll explain what the $_GET variable does.

As you click the buttons on the page, you should look at the address bar on your browser. When you click on the weather button, for instance, you should see this in the address bar: http://your.server.here/lj.php?command=weather&option=houston.

That stuff at the end is how you tell the PHP script what information you want it to display. All the variables you assign are put into an array called $_GET. So in the weather example above, I’ve assigned two variables. To reference them inside the PHP script, you use the $_GET array. So in the URL above, these two variables are assigned:


$_GET['command'] = "weather";
$_GET['option'] = "houston";

And, you can use those variables in your PHP code. Notice that I’ve actually assigned those two variables to standard variable names, so that it’s easier to reference them later. You can change what variables are sent to the PHP script by changing the information in the URL. That allows the script to be dynamic and provide output based on the input you give it. In fact, the only reason pressing those buttons works is that it loads the page with the arguments already in place! See if you can get your local weather now by changing the “option” variable in the URL and loading the page. Cool, huh?

More Than Just Weather

Since you’re able to send your PHP script variables via the URL, that means your dashboard can do much more than just show the weather. Based on the variables, you can call different commands with the switch construct in PHP. It’s like a CASE statement in other languages, and the logic is pretty straightforward.

You run the switch statement on the $command variable assigned from the $_GET array. If the variable matches any of the options listed as a “case”, it executes the code in that section, then you break; out of the switch construct. If the $command variable doesn’t match any of the case options, the switch executes the default: section at the end. In this example, it’s a message to press a button.

Let’s look at each section to see what’s going on when you press a button (or manually enter the command in the URL).

The Part before the PHP

If you put standard HTML into a PHP file, and don’t enclose it between <?PHP ?> tags, it just sends it to the web browser as HTML code. So the top of the lj.php file is just plain HTML. The text is shown in <h3> tags, and the buttons are created with a little bit of JavaScript that allows them to load the URL specified. If the buttons and JavaScript make you uncomfortable, it’s okay to make standard text links that point where you want them. I just like buttons because they look cool.

It’s important to realize that the buttons aren’t doing anything other than loading the page with $_GET variables assigned in the URL. The buttons themselves don’t execute code, and aren’t anything fancy. You can type the URL out by hand and achieve the same thing. Your family will appreciate it if you make them links or buttons though, because clicking is much easier than typing long, complicated URLs!

Weather

If you click the weather button, or enter the URL by hand to send the $_GET['command'] and $_GET['option'] variables to the script with weather as the command, the switch statement will execute the code inside the case "weather": section.

This is a really simple command that just echoes (prints on the screen) the results from fetching the web page. The file_get_contents function in PHP will get the contents of a local file or a file on the internet. In this instance, you create the URL with your $option variable. If you clicked the button, you’ll notice $option is set to “houston”, but you can change the URL by hand in order to get your local weather. It will accept city names, ZIP codes and even airport codes.

The weather section of the script is the only one that looks at the $option variable, but it’s possible to assign as many variables as you want from the URL. If you assign a variable and it isn’t used, there’s no harm, it’s just ignored.

The Time?

The “time” section doesn’t return what you’d expect for a time button to return. In fact, I labeled the button that loads that page “Unix Time”, because I used the time() function in PHP, which displays the number of seconds that have elapsed since January 1, 1970. That might not seem like a terribly useful number, but it’s very convenient when programming, because you don’t have to parse out hours, minutes and so on. You can click (or refresh) the page a few times, and you should see the number increment.

UNIX time (sometimes called Epoch Time) is fun to play with, and although this example isn’t terribly useful, I wanted to include it so you could see how the time() command works, along with the echo command. If you look, there is a single period after the time() function. That concatenates the two items into a single string and displays it all together. If you click the button, you’ll see what I mean.

Bing? How Dare You Load a Microsoft Page!

The Bing photograph of the day is always awesome (Figure 2). Really, Microsoft does a great job of procuring incredible photos, and I love to see them. Since the URL is always different, this was a great way to show how to load JSON into a variable and then extract an array element. Don’t let the scary looking code intimidate you; JSON is really cool. Basically, you load the JSON from that long Bing URL and put it into a PHP array. Then, you form the URL for the photo from the contents of that array. Here’s a snippet of code you can use to see the array in a more readable form:


<?php

$json = json_decode(file_get_contents("http://www.bing.com/
↪HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US"), TRUE);

echo "<pre>";
print_r($json);
echo "</pre>";

?>

Figure 2. The Bing photos are always so cool.

If you don’t have a server, head over to here to see the results of the PHP file. You can see where I got the information to build the URL for the image, and in the switch statement, you can see it just loads the image based on that URL. Isn’t JSON cool?

Local Scripts

This part of the switch statement is powerful, but also a little scary. If you click on the “Kernel Name” button, you can see it executes the code in the uname section of the switch statement. Using the shell_exec command, you can execute a file on the local server and show the results in the browser window. This is powerful because it means you can have your family execute local bash scripts by clicking on a button. But it’s a little scary, because you’re executing local commands on your server by clicking a button!

The script is executed with the permission of the web browser, so, for example, in Ubuntu running Apache, the www-data user would be executing the command. If that user doesn’t have permission to do something in the script, the script will fail. This is one of those “with great power comes great responsibility” things. It can be incredibly useful, but also incredibly dangerous, especially if your server is exposed to the internet!

Troubleshooting

Whenever I write PHP code, I make mistakes. Usually it’s a forgotten semicolon or a mismatched bracket. It can be very annoying when you load the page, and it’s suddenly just blank instead of showing you an error. In the last article I wrote about PHP, I showed how to turn on PHP errors so you could see in the web browser what’s going wrong. I don’t do that anymore, because it’s annoying to see PHP warnings when things are working fine. So what I do now is run php from the command line. If the code is broken, it will show errors on your command line, and you won’t have to worry about turning error logging on and off in your web browser. For example, in the example lj.php file, just go to the folder where it’s stored and type:


php lj.php

And the server will dump the HTML to your command line as if it were a web browser. If there’s an error, it will tell you what you did wrong. I like that method of error checking much more than getting error notifications in my web browser, but if you prefer to see them on the browser, look back to my PHP article from the December 2014 issue and see how to activate error logging.

Just like last time, I’m giving you only a taste of the sorts of things you can accomplish with PHP and a little ingenuity. If you come up with an interesting dashboard of your own, I’d love to see it, even if it’s just a screenshot. (Don’t expose your dashboard to the internet, especially if it controls your local server with shell_exec statements!) Feel free to email me at shawn@brainofshawn.com, but be sure to put “DASHBOARD” in the subject line, or I might assume it’s spam. I get so much darn spam!