fortyseven

The Worm Is Back!

2020-04-02 

NASA says the worm is back!

The original NASA insignia is one of the most powerful symbols in the world. A bold, patriotic red chevron wing piercing a blue sphere, representing a planet, with white stars, and an orbiting spacecraft. Today, we know it as “the meatball”. However, with 1970’s technology, it was a difficult icon to reproduce, print, and many people considered it a complicated metaphor in what was considered, then, a modern aerospace era.

Enter a cleaner, sleeker design born of the Federal Design Improvement Program and officially introduced in 1975. It featured a simple, red unique type style of the word NASA. The world knew it as “the worm”. Created by the firm of Danne & Blackburn, the logo was honored in 1984 by President Reagan for its simplistic, yet innovative design.

NASA was able to thrive with multiple graphic designs. There was a place for both the meatball and the worm. However, in 1992, the 1970s brand was retired – except on clothing and other souvenir items – in favor of the original late 1950s graphic.

Until today.

The worm is back. And just in time to mark the return of human spaceflight on American rockets from American soil.

This excites me to no end!

Now, okay, I’ll admit, I’m probably biased towards the ‘worm’ design because it’s the one I grew up with. And I know “the meatball” — the older style logo — has just as many fans. Enough to bring it back in the 90s.

I never understood that roll back.

NASA!  Space! The Future!!

The “worm”, to me, embodies that spirit. It’s a simple, yet futuristic logo. It used to fill my mind with amazing visions back then.

When I see the “meatball”, I think… backwards. Old. A lack of progress. Quaint sci-fi rocket ships. Black and white footage. Pre-moon landing era.

But! I know the “meatball” means a great deal to other people, too. So I thought, why not merge them? Put the “worm” on top of the “meatball”? Best of both worlds!

And, as usual, that means it’s already been done.πŸ˜‰

Check out the “New Heritage” design:

Wow!

I don’t know who the creator is that did the edit (hit me on Twitter if you know and I’ll update this), but it’s exactly what I’d imagined. This fusion would be perfection to me. It pays tribute to the past, while integrating the future.

But, in the meantime, I’m going to giggle excitedly to myself now that they’re moving… back to the future. πŸ˜‰

Prenatal ACF Data Insertion (…or “that’s the most boring title I’ve ever written.”)

2020-02-02 

Just wanted to document an interesting issue I had with Advanced Custom Fields recently…

Don’t get me wrong, I swear by ACF on all of my WordPress projects. I consider it an absolute necessity. It’s powerful, easy to use, and is priced reasonably.

It’s when you go outside the standard usage of ACF that things get a bit… thorny…

Into the weeds

Normally, you’d create a field group. And you’d assign that field group based on a set of criteria (a particular page template, or a custom post type, etc.).

Then you create a new post, and you’re presented with your custom fields. You enter your data, and it’s attached to the post when you save. And accessing that data is trivial from templates.

But what happens if you create a post with custom fields, but you’re doing it from inside a PHP function, using wp_insert_post?

What if you want to add content to a field in that post immediately afterward? Surprise! Your standard update_field or add_row code will silently fail. According to the documentation, you need to reference the field name using the field key in that situation.

The field’s key should be used when saving a new value to a post (when no value exists). This helps ACF create the correct β€˜reference’ between the value and the field’s settings.

Let’s unpack that

ACF stores all of it’s custom field values inside standard WordPress meta fields inside the post. In fact, you could just as easily use get_post_meta to retrieve ACF field values under many circumstances. Or even write it back.

But ACF is much more than just a key/value pair, of course. Each field has a whole host of information associated with it. Label name, conditional display logic, field type, etc.

In the post’s meta data, ACF creates two different values: the field name, and a field key reference.

Let’s say I have a custom, basic Text-type field called “Title”.

Inside the post, there will be a title meta data field; this holds the actual value of the field. And then there’s a _title field. The underscore means it’s a field key reference. The value of that looks something like field_123456. Each field group entry gets it’s own unique field key name that looks like that.

Internally, when you call get_field('title') ACF looks up the post meta with an underscore — _title — and uses that to pull up the details in the custom field group entry.

If you call get_field('field_123456'), in fact, it will work as well. ACF will reference the field group info, and return the appropriate post meta that way.

Both are valid ways to work with ACF field content.

A brand new post, inserted with wp_insert_post is completely blank. It has no post meta data, outside of the usual timestamp and creation info.

So if you try to run update_field('title', 'My Title', 9999), it does nothing. As if it doesn’t exist. Because as far as ACF is concerned, it doesn’t.

Not yet.

There’s no _title for it to reference for guidance.

But if you update_field('field_123456', 'My Title', 9999), it WILL work. ACF knows right where to go to get it’s field details, and it works as normal.

Now here’s where it gets tricky

That’s all well and good for a simple Text field type.

But what if I have something more complicated? What if I have a Group type, with a Repeater inside that?

Let’s say I have a Group called “Vehicles” and a Repeater inside that called “Trucks”. (And presumably a “Cars”, “Motorcycles”, etc, but let’s keep it simple!)

And each row inside “Trucks” has a “Model” Text field, and a “Mileage” Number field.

Under normal circumstances I could do:

add_row('vehicles_trucks', ['model'=>'Bigfoot', 'mileage' => '50000'], 9999).

(Note the special, barely documented vehicles_trucks underscore selector notation for these nested fields.)

But if I’ve just inserted the post, none of those key field references exist!

The vehicles_trucks selector doesn’t work. But the previous fix, using the raw key field reference… say, add_row('field_902100'..., well, that doesn’t work either! Because which field key reference makes sense in this situation? The one for Vehicles? The one for Trucks?

If you use the key_ field key for Vehicle, it fails. Vehicle is a Group type. Nothing happens.

If you use the key_ field key for Trucks, however, something weird happens. Instead of creating a _vehicles_trucks key reference, it creates a _trucks reference…

At this point it’s important to note that ACF is smart and slick… right up until the point it is not.

From what I’ve discovered, there is no shortcut to adding a new row to a Repeater field nested inside a Group if you’ve created the post inside PHP, before someone had a chance to hit ‘Save’ on it from the admin.

If you try to get clever, you might fairly think that underscore notation might apply here. Maybe stick the two together, like field_111111_ field_22222.

But you’d be wrong

No, we have to manually create all of ACF’s key references ourselves before we can do anything:

 update_post_meta(9999, '_vehicle', 'field_111111');
 update_post_meta(9999, '_vehicle_truck', 'field_222222');

THEN we can add_row('vehicles_trucks', ... and insert our data programmatically as expected.

This holds true for even deeper nested content, but at that point maybe you want to rethink what you’re doing. πŸ˜‰

I was surprised by just how little information about this specific use case exists. Hopefully this helps somebody out there!

Hit me up on Twitter if I’ve made an error anywhere in here.

Conspiracy Guy Recounts Area 15 Encounter

2019-07-16 

In a private tape recorded interview unearthed circa 2016, an emotionally exhausted Conspiracy Guy recounts his harrowing experience at Area 51 back in the 1940s.

(Actually, this is just some lame improv I recorded from 2016. Felt like the right time to clean it up and finally post it, considering the pending Area 51 invasion!)

Sectional PHP Highlighting in VSCode

 

So, my eyes were glazing over some WordPress PHP in my editor of choice, VSCode.

The weaving in and out of <?php, <?= and ?> tags, bouncing between PHP and HTML contexts was making my head spin.

I kept having fantasies of a time when I could highlight the PHP (or HTML) context using a different background color… but there didn’t seem to be anything like that for VSCode, at least. It’s possible I was thinking of PHPStorm, but that was a lifetime ago.

So I powered through, cleaning up the twisty templates, trying to make them as readable as possible. But I finally hit my breaking point and started looking around… and I think I found a good solution. Whether it’s a good long term solution, well, that remains to be seen.

The Highlighter extension for VSCode is where the magic happens.

This extension allows you to define custom highlighting rules to regex matches in your code.

You can probably see where this is going.

After some futzing around, I wound up with these rules in my VSCode settings config:

"highlight.regexes": {
&lt;a href="https://clips.twitch.tv/JoyousEnthusiasticSpaghettiVoHiYo"&gt;https://clips.twitch.tv/JoyousEnthusiasticSpaghettiVoHiYo&lt;/a&gt;    "(&lt;\?php)((.|r|n)+?)(\?&gt;)": [
        { "color": "#FF00FF", "backgroundColor": "#FF00FF40" },
        { "backgroundColor": "#FF00FF40" },
        { "color": "#FF00FF", "backgroundColor": "#FF00FF40" }
    ],
    "(&lt;\?=)((.|r|n)+?)(\?&gt;)": [
        { "color": "#FF00FF", "backgroundColor": "#FF00FF40" },
        { "backgroundColor": "#FF00FF40" },
        { "color": "#FF00FF", "backgroundColor": "#FF00FF40" }
    ]
}

Your color preferences will vary, of course, but do at least note that I’m using the extended alpha value in the hex (the final octet), so you can blend your background color into your theme’s existing color!

(And yes, you can combine that down into one regex. Go ahead and do that.)

(IMAGE MISSING; SORRY…)

(The rainbow colored indents are part of the terrific indent-rainbow extension!)

I haven’t bounced on this very hard, so you might find some quirks here and there.

For instance, if you don’t include the closing PHP tag, ?>, it won’t match the regex. You could make the closing tag optional, but that might be undesirable…

But in any event, this seems to get me 9/10th of the way to the functionality I want, so I’m pretty happy. 😏

Reincarnation

2019-07-15 

I don’t have a link to it, but I remember reading about how some people essentially “reinvent” themselves multiple times over the course of their lives. They are constantly learning new things and switch careers to some other focus every decade or so, in an attempt to live a rich, varied life free of stagnation.

An interesting idea, if you can pull it off. After all, typically, people are married and have a family to take care of. And if not for a family, one’s own finances need to be secure.

Now, I’m not planning on quitting my job any time soon, mind you (I love it quite a bit), but I think the basic idea could at least be applied to one’s hobbies…

Since I was in high school in the 90s, I’ve always had a thick interest in game development. Skipping past the boring self-analysis, I came close to doing it professionally a couple times in the last decade, but otherwise it’s mostly stayed a hobby. But it was one I actively participated in during my off hours… I could cite various reasons, but suffice it to say that despite my dreams of ‘going pro’, it never took off.

Other, recent events have soured the milk on game development even further. It was probably for the best, though. All it ever did was remind me of unfinished projects, and planning for a future that wasn’t going to exist. Never mind the increasing number of horror stories from inside the industry, as people begin to feel safe about opening up about corporate abuse and general misery.

So, over the last couple months I’ve decided to pack up my game development hobby and put it into a little box in the closet. Sure, I’ll still keep tabs on industry news and people’s fun indie projects and stuff, but it’s no longer a primary interest.

What will fill the void?

Well, over the last couple years I’ve been, off and on, attending the B-Sides information security conferences along the east coast. I always had fun, but felt a bit weird going to them. It wasn’t my field. I felt like an outsider, even though it was stuff I could potentially apply to my day job. But as time went on, the wheels of further interest started turning…

Network security has always been a major weak point in my computer education. Compiler internals, hardware, software development? Sure, I love that stuff. But network administration? Server security? Subnet masks? OSI layers? I’ve had, more or less, only a scattered, surface level understanding. (No worries — I had a good handle on what to do, and what not to do, when it comes to security when working on software projects, so no worries there at least …mostly. I mean, as far as I know. Oh god, now I’m paranoid.)

So, I’ve been taking courses. I’m going all-in on educating myself about all of it. Taking part in CTF challenges. Pentesting my own internal network. Breaking into vulnerable virtual machines. (Already taught me a ton about WordPress security. Cough.) And I’ve been taking extensive notes as I go.

And you know what? I’m addicted. This is seriously fulfilling stuff. And my interest has only increased the further in I get. It’s like an infinite box of puzzles that keeps my brain active.

So now I have a primary hobby that is not only good for me, good for helping others, but also helps my day job.

I don’t want to say it’s goodbye forever to game development, but it’s going to be a long time, if ever, before that flame is reignited. And hey, maybe I’ll write up some more educational stuff here and there to help others, like me, along the way. I’d be down for that. 😎

Kali on the Acer Spin One

2019-07-09 

The Backstory

I’ve been on the hunt for a decent, small netbook for a while. I’d hoped to wipe ChromeOS off of the Samsung Chromebook Plus that I’d acquired — a decent little device in it’s own right — but the effort required to do it properly was simply not worth it.

(TLDR on that: there’s no ‘write-protect screw’ like other Chromebooks; instead you have to remove the battery, among other things. I’d rather keep it as is, preserve the value, and sell it in trade for a more traditional laptop!)

I went through a couple other laptops all with various concessions that I wasn’t too happy about.

My demands:

  • Small (11.6″ or so)
  • Light
  • Decent battery life
  • Peppy speed
  • Runs Linux without any fuss
  • Is under $300 — cheaper the better, but I don’t want immense remorse if it’s broken, unlike a $900 (or more) beast

In my half-hearted on again, off again search you could hit most of these if you were willing to void the warranty of a Chromebook, or were willing to sacrifice any kind of aforementioned pep. It’s the ol’ “small/fast/cheap — pick two” kind of thing.

I’d been eyeballing the Acer Spin One (SP111-33) at Walmart for a while. Not exactly the place to pick a winner, I confess, but I kind of liked how it looked and felt; it was solid as hell, with a sturdy aluminum frame. But at almost $400, I wasn’t sure if it was worth gambling on.

So I hit Walmart.com and I see there’s actually two entries; one is the Acer Spin One at the expected price. But then there’s another SKU with a slightly different model number.

As it turns out, it’s a slightly faster model, but about $100 cheaper. And it’s not solid aluminum. And it’s all black. But it’s still a super light 2-in-1 convertible laptop. They saddled it with Windows 10 S (the one you can only install from the Windows app store from). And it’s a lower res screen instead of the full HD of the more expensive model.

I get in the store, and I see them mostly side by side. The more expensive one SURE IS PRETTY in comparison. And the screen is definitely brighter and nicer to read.

They’re both locked, but that wasn’t a problem. The password was the store number, which is on the login screen.

Once I’m logged in, I load up Edge and pull up an online JS speed test. It won’t be comprehensive, but it’ll at least give me a ballpark.

The two churn through the test, neck and neck. I get some side-eye from the clerk, but I ignore him. I’m shopping, damn it!

By the end, it turns out the uglier, cheaper one actually beat the hell out of it’s more expensive brother.

Some quick googling showed people WERE installing Linux, but one guy said he had trouble with most distros except Kali (and some other one). Hey, that’s fine by me: that’s exactly what I intended to install! 😏

Maybe it didn’t QUITE hit the sub-$300 mark, but it came really close. And considering it hits the rest of the bullet points…

So I bring it home. Cortana’s happy greeting is cut short by a reboot after I insert a bootable USB stick.

There were some issues, so I’m going to outline them here for future users.

Installation

Use F2 at the boot screen (don’t hold Fn) to enter the BIOS.

Here’s what I did in there:

  • Disabled all of the secure boot stuff.
  • Set the boot drive to the USB stick (for the install; throw it back after)
  • Internal KB Numpad: Disabled (preference)
  • Function key behavior: Function Key (preference)
  • Lid Open Resume: Disabled
  • Reboot

I kind of shotgunned my way around this whole area, so YMMV. But I think if I took the path I outlined here, first, I’d have had more immediate success…

At this point, you should have the Kali boot screen; perform a full install.

Since there’s only 64GB on the internal EMMC drive (which is enough for my purposes), I instructed the installer to wipe the entire drive. You didn’t want Windows 10 S anyway. 😎

Hardware Surprises

There’s a couple gotchas with the hardware, but most of it can be fixed easily.

Screen Rotation

During the installation process, everything is fine. But once you boot into the desktop, you’ll find yourself craning your neck sideways. The driver for the accelerometer is reporting the wrong orientation information, so the screen is rotated improperly. And if you rotate it into portrait mode, woosh, it’s in landscape.

The Quick GUI-based Fix

Turn the device on it’s side, giving a portrait orientation. It will render the desktop in a landscape orientation. Turn your head sideways and tap the user menu on the far end of the system bar along the top… (…er… right?)

Then tap the second icon on the bottom; the one right next to settings, to lock the orientation as ‘landscape’. Then you can flip the device back to it’s normal landscape orientation and it will stay in place.

Alternatively, you can run xrandr -o normal on the command line to force the rotation. You can view the current rotation state, as reported by the accelerometer, with monitor-sensor.

The Real Fix

The more involved fix goes like this (thanks to CupOfTea over on the Acer Community Forums):

Create /lib/udev/hwdb.d/61-sensor-local.hwdb

Inside that file, add:

sensor:modalias:acpi:BOSC0200*:dmi:*svn*Acer*:*pn*Spin*SP111-33*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1

Note the single space before ACCEL_!

The Nuclear Option

Disabling the accelerometer entirely is another possibility, but that is left as an exercise for the reader. 😏

WiFi

Wifi works great. It’s an Intel Wireless-AC 9560 that can be used for various things. Nice!

Bluetooth

As of this writing, I still haven’t gotten Bluetooth working. But I’ve had it for about half a day at this point, poking at other problem areas, so we’ll see how that goes. I’ll update this when I get it fixed.

I don’t know where the trouble lies, but the service just isn’t running on boot. Here’s what I did to start it up by default. First, call systemctl enable bluetooth.service to set it to load on boot.

After this, I was able to reboot, and my mouse connected on login. Good times. πŸ‘Œ

(If you’d rather not have it start automatically, you can just use systemctl start bluetooth.service to start it manually.)

Other hardware with no obvious issues

  • Audio
  • Touch screen
  • Micro SD card reader
  • On-board video – There’s some brief black and white glitching on the very top of the login screen, but you don’t see it anywhere else.
  • HDMI – worked as second monitor on a 4K display; didn’t DPI scale out of the box of course.

Sweet.

So yeah, I’m pretty jazzed about this little guy. It’s about as close to perfect as I’ll probably get for now.

I guess I’ll keep it. 😏

Stickers account for 23% of it’s weight.