Dear Automattic,

I know it’s been 3 years since we split up, but I wanted to reach out to say that I’m sorry for all of the pain I caused you.

You see, back in 2010, I was on top of the WordPress world. I had great clients, was making OK money, and was making a move away from a city that hated me (Miami) to a city that might hate me less (Providence.)

I gave up my clients and my money to pursue you. I switched from Qwerty to Dvorak for you. I even tried new things I knew I would hate to try and make things work between us. I gave you my best ideas about Jetpack, Reblogs, Followers & Likes, but once I had you, you weren’t what I expected you to be…

That was my fault, for putting you on a pedestal. I set expectations you weren’t setup to meet for me.

When you asked me to join you as part of your distributed workforce, I asked if I would have to wear pants. That quip echoed through the company culture enough where The Year Without Pants was the popular vote for a book where I’d only be mentioned a few small times amongst a team of top-tier Automatticians.

When you asked me to work on Jetpack, I wanted to work on WordPress.com Profiles. I still think user profiles are a live cavity that desperately needs filling to make WordPress.com more enjoyable, but you didn’t agree. I know now that that’s okay, but back then I was pretty deflated… lost… really just aimless for a while.

When you asked me to try out VIP, I was excited to try out anything new (because back then changing teams wasn’t really a thing) but we both knew I’d be miserable in ZenDesk all day, so it was really just a kind way to force a mutual decision, and that’s okay too.

Looking back at our time together, there are some things I’d do differently, and some things I wish I had the opportunity to see through. I joined you with an agenda, which wasn’t fair. I wanted a very specific role that I felt entitled to; that I had earned; that I proved my worth a hundred props over. I wanted a role where I could experiment and set trends and feel like I was trusted to make decisions and change you for the better.

I guess I was pretty terrible to you. I mean… I never talked bad about you, or put you down, or made you feel less-than. But I wasn’t giving you my full effort or attention, because I felt like the open-source WordPress.org community work was more rewarding than the WordPress.com for-profit work. I felt entitled to work on BuddyPress & bbPress the way Andy & Sam had before me. I felt like there were things I wanted to accomplish that I expected you to support me in, and when I didn’t get my way, I wasn’t happy about it.

I like to think that in 3 years time, I’ve learned a bit, changed a bit, maybe grown a bit, and spent a few minutes here & there deep-in-thought about our time together, trying to unwind it and learn everything I could from it. There’s good memories & bad, ups & downs, but my personal takeaway is that I wasn’t a very good employee, as far as employees go.

You gave me all of the things that, on paper, make a great career and environment. You gave me freedom and liberty to work at my own pace and learn — I mean really learn — how to work within a complex environment of systems, people, interests, wants & needs. I could have probably been happy with you for a very long time, and I think you would have been happy with me too, but I let my pride & vision of what I wanted for myself prevent that kind of relationship from ever really maturing.

So, Automattic, I’m sorry. I’m really proud of what you’ve become since I left. It’s exciting for me to watch you grow, knowing that deep in the commit logs & company lore are a few of my fingerprints. I’m really happy that you’re branching out with WooCommerce, Calypso, and all the other neat little secret stuff that no one is supposed to know about but everyone kinda sorta knows about. It’s great that you continue to employ hundreds of people, give great benefits, and try to treat everyone fairly.

I’m not sure if you’re the one that got away, but I hope that no matter what happens with this whole WordPress thing, we can always be excellent to each other going forward.

Thanks for the memories,

-JJJ ❤️

Upgrading MariaDB Ubuntu Server from 14.04 to 16.04

First, I needed to remove the old apt repository and signing key. (This prevents do-release-upgrade -d from stopping halfway through.)

Remove repos:

cd /etc/apt/sources.list.d
sudo rm maria*

Remove old key:

# List the keys
sudo apt-key list
# Remove the correct key, which is the second half of PUB STRING1/STRING2
sudo apt-key del STRING2

Second, I needed to add the new apt repository and signing key:

# Probably is already installed
sudo apt-get install software-properties-common
# Get the key
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# Add the xenial repository
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.accretive-networks.net/mariadb/repo/10.1/ubuntu xenial main'

Now you are safe to run do-release-upgrade -d without any halts!

You’ll probably want to backup your `my.cnf` file too. The upgrade process will ask you to keep or overwrite your old one, and neither of those options are usually very desirable if you have tuned your MariaDB configuration at all.

Back to Twenty Sixteen

Yesterday I switched my blog’s theme back to WordPress’s current default theme, Twenty Sixteen. I’m really enjoying the simplicity of a traditional layout again.

Screen Shot 2016-07-13 at 06.59.41.png

I also like being able to rotate small header images between page views. This current batch of images is from some screenshots I took while playing the very pretty and fun iOS game Monument Valley.

Since the About.me sidebar widget was retired from WordPress.com starting July 1st, I decided to try putting a Patreon link over there instead. If you’re reading this and happen to enjoy using any of my WordPress plugins, give that link a click and let me know what you think about it here in the comments.❤

Good and Evil

This past Friday, my car got hit by a motorcycle. There’s a story there, but this post isn’t about that. Rather, it’s about people’s perception of the rider.

He must have been speeding.

He must not have been paying attention.

He must not know how to ride.

None of this is actually true, though. He wasn’t speeding, he was paying attention (mostly) and is a veteran rider with about 25 years experience.

Generally, I think for “most people”, it’s maximally convenient and efficient to categorize things (and people, and ideas) in the most extremely polarizing way, and then work inwards towards an understanding or acceptance of that thing.

I also think this is why I have hard time navigating the world; I think of everything as inside-out vs. outside-in. My starting line is in the middle, and my Good-o-meter(TM) swings based on whether I found joy or pain in that thing.

There are currently a few members of our local village government that have reputations for not being very friendly, for having ideas & beliefs that go against the grain, and for being a bit confrontational. And that reputation has glorified them into villains, which is pretty silly if you stop and think about the individuals.

There is no Good and there is no Evil. There is no right and there is no wrong. There is only circumstance and action, or a lack of either or both.

Everyone chooses how to act or feel based on their awareness of what’s appropriate, what’s possible, and what their level of maturity is in dealing with those situations. The circumstances for this motorcyclist are different than mine with my car are different than the eyewitnesses.

It’s easy to feel like someone closing your issue on Github makes them a terribly stupid person who does not understand the importance of the issue you’ve raised. It’s easy to think your WordPress core ticket sitting around for 5 years means no one cares. It’s easy to say someone sucks because of something they’ve said or done you don’t agree with.

It’s easy to assume that mass shooters are crazy, that they’ve snapped, or any other extreme set of rules that polarize the perpetrator. Who knows, and the why almost doesn’t even matter, because it doesn’t change the outcome, and not much will be done to prevent similar outcomes in the future. What if someone broke his heart, and he couldn’t cope? Do we suddenly try to prevent all future heartbreak?

There will always be unpredictable terrible circumstances created by human-kind, and it requires collective bravery and awareness to reduce the consequences of those harmful decisions. (And full disclosure, it’s my experience in my own life that “most people” are neither aware nor brave, meaning my outlook on the pool of resources available to make positive change is, honestly, bleak.)

It’s equally easy to say homosexuality is evil. Or being pro-life is evil. Or white-dudes are evil rapists. These are all obviously incorrect assessments; and… think of all the times you’ve identified something as bad (or felt wrongly profiled by someone) and imagine that there are millions of people that find genuine joy in that thing without you.

Instead of starting with good or evil, please train yourself to start from the middle and let the circumstances steer your assessment about the variable value of a thing in your life. Actively avoid extremes, and politely remind others that people are people, and heroes & villains are figments of their imaginations.

Be objective. Be sincere. Be better.

XDebug, Laravel Valet, NetBeans

Screen Shot 2016-05-10 at 11.09.35.png

To get XDebug working with Laravel Valet & NetBeans, I needed to do the following:

  1. Install XDebug via Homebrew:
    brew install homebrew/php/php70-xdebug
  2. Enter NetBeans’s Preferences > PHP > Debugging:
    1. Change the port from 9000 to 9001.
      (This is because Valet runs on 9000 by default.)
    2. Uncheck “Stop at first line”.
      (This is because Valet is listening to all requests, and server.php will get hit a bunch of times in the same page refresh.)
  3. Edit /usr/local/etc/php/7.0/php.ini
  4. Add this bit to the end:
    [xdebug]
    xdebug.remote_enable=on
    xdebug.idekey="netbeans-xdebug"
    xdebug.remote_port=9001

    This turns on remote debugging, and tells XDebug to look for NetBeans’s IDE key.

  5. Restart Valet with valet restart in your favorite terminal app.
    Note that brew services restart php70 isn’t enough here; you need to restart Valet entirely.

Also…

Live debugging using XDebug will severely degrade Valet’s otherwise snappy performance. Composer will even tell you this:

You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug

This is normal. XDebug is a hugely powerful realtime interpreter, debugger, and profiler, and it’s going to slow things down while it’s listening to all that PHP chug along. (You may be able to tune this a bit using all of XDebug’s extensive settings.)

If you’re worried about battery life, most IDE’s (like NetBeans) will let you turn debug sessions on and off. So debug, do your thing, find the bug, kill the bug, and turn it off.

2016 MacBook

A few weeks ago, I upgraded from an 11″ MacBook Air to a 12″ MacBook. This is my review, my experience, and a few of my opinions & critiques.

The MacBook is the perfect successor to the 11″ Air.

Prologue

I loved my 11″ Air. It was the first Mac I’ve owned that didn’t suffer some sort of epic hardware failure that required it going away for several days. It traveled well. It aged well (enough) and with the i7 processor, it was plenty powerful for all of the work I needed it for.

But, it was the last of my non-retina screens, and it’s screen was surrounded by a thick faux-aluminum bezel that served as a constant reminder that it could have been bigger, better, and brighter. And it stood out as my only remaining silver Apple product, which triggered my OCD every time I used it.

My only real problem with the 11″ Air was a social one, needing to constantly justify it’s existence to colleagues & friends that have always had MacBook Pros. After a few dozen repeats I got my schtick down to a smooth pattern:

  • Great battery life
  • Super portable
  • Lack of screen real estate forces me to maximize my productive time
  • Great keyboard
  • Super fast & capable
  • Enough ports to still be useful as an octo-charger

The 12″ MacBook, as we all know by now, has only 1 port, and it’s not a problem in everyday life as much as it is when you’re just trying to get started using it.

Getting Started

Like any good Apple toting citizen, I back everything up to a Time Capsule (2 actually, at home and at my office.) If you’ve ever tried to restore from a Time Capsule over wifi, you’ll know that it feels like it takes a lifetime to move an entire machine’s worth of data over the air. I don’t really understand why this is, because it’s all local to the LAN, but after 14 hours of waiting to move over 180Gb, I decided to stop it mid-restore, format, and start from scratch instead.

This is a pain because the only port on this machine is USB-C, and it doesn’t come with a USB-C to ethernet adapter, and I wasn’t going to pony-up the extra $20 for a 1-time-use landfiller, so I couldn’t easily & quickly transfer my old data via a cabled connection.

I’ve reinstalled OS X and all of the tools I use to work enough times, that this entire process only took about 3 hours. I was up & running, did some actual work, and went to bed. The next morning, I commuted to the office, and opened by new MacBook only to be greeted with GPU-style artifacting on certain UI elements inside of various default OS X applications, like Safari, Messages, Mail, and Finder.

I’d seen this happen before, on my 2010 Mac Mini, so I performed the following trouble-shooting measures:

  • Logged into the Guest account, Safari worked okay
  • Created a new Admin account, everything still broken
  • Rebooted in Safe Mode, everything worked okay
  • Reset NVRAM, everything still broken
  • Reinstalled OS X, everything still broken
  • Reset SMC, machine would not reboot

Yeah… after attempting to reset the SMC, my brand new MacBook would not turn on. So, I assumed a trip to the Apple store was in my future, packed up for the day, came home, and gave it one last go. I held the power button down for what felt like a full minute, and low-and-behold, it chimes to life.

I log in, still broken.

Command-R restart, secure erase the drive (again) but this time… this time, I’m not encrypting the disk or turning File Vault on (gasp!) Why not? Because, in my experience, it’s just not reliable, which is the real value that Apple and OS X provide me in my daily life. So I reinstall everything (again) and it’s been right as rain ever since.

One time, my 2013 Mac Pro (ya know, the trash-can one) stalled halfway through the process of turning File Vault on. On reboot, it blew a GPU. (How these two actions could possibly be related, I have no idea.) Maybe the GPU was already bad; maybe me force-rebooting a locked-up machine caused the GPU to pop; whatever happened, it wasn’t worth another week in the shop for this brand new MacBook.

My frustrating experience getting started is maybe unique to me; I have high expectations from the machines I use (the heck out of) to pay my mortgage & help support my employees, but it pretty easy to get stuck quickly without much recourse. There is no USB port to, say, make a boot disk, or more quickly transfer your files without the use of an additional adapter. It requires placing a lot of trust in a convoluted process.

Review

The 12″ MacBook itself  is very pretty. It’s smaller than both the 11″ Air and the 12.9″ iPad Pro, but still manages to have a very usable keyboard, trackpad, screen, and enough processing power to not feel sluggish or bogged down.

Finish

Let’s start at the finish. I chose Space Black because it matches all of the other Apple devices I have (including the Apple TV remotes) and it replaces the last raw aluminum Apple product in my fleet. Just like every other Apple laptop, oil from your skin transfers to the case pretty quickly, resulting in somewhat unsightly wear marks. Unavoidable, really, but worth noting the anodizing hasn’t circumvented this at all.

And I like that the Apple logo doesn’t light up on the back of the screen. The new polished logo is subtle and unobtrusive, but still catches enough light from any angle to be distinctive and identifiable.

Keyboard

The keyboard didn’t take nearly as long to get used to as the rest of the web made it sound like it would, and I like that Apple used San Francisco on the key-caps. The back-lighting is subtle, with very little bleed between the keys, and it’s the first time since switching to Dvorak that I haven’t relocated the keys to their rightful Dvorak locations. I bought the tools to squeeze under the keys, but it hasn’t felt necessary for some reason (maybe I’m finally getting comfortable with touch typing Dvorak?)

My only gripe with the keyboard is that the left and right arrow keys are now full-height, and I get them confused with the “Option” and shift keys because there’s no discernible tactile difference. I spend an awful lot of my day navigating code, which means I reach for those keys relatively frequently. Instead of hanging my fingers off the left/right keys, I now need to search for the break between the up/down keys, and adjust from them.

Screen

The screen on the 12″ MacBook is pretty great, and even though it has less of a bezel than the 11″ Air (and what bezel there is, is black) I wish the screen were more edge-to-edge. I find the colors to be true to what I expect from Apple, and it’s nice to be fully converted to retina after only a few years worth of transitioning.

The bezel that is there, is part of the screen layer itself, so it’s easy to smudge it with your fingers while trying to adjust the display angle. I’m not sure how you fix this issue without an oleophobic coating or going back to the aluminum surround of the Air.

Hinge

The hinge that connects the screen-half to the keyboard half, is a bit wobbly. If you pay attention to any of the review videos online, you can watch the top-half wiggle around. I haven’t heard anyone mention this, but compared to the 11″ Air, this hinge feels less stiff, which has resulted in my treating this machine a bit more tenderly.

Processor

The m7 processor is adequate for my daily needs. There is no fan, which has the interesting psychological effect of never really knowing (or caring) what’s going on in the background anymore. Arguably, whatever little time I previously spent trying to clean-up after myself and the apps I use, I now spend doing other things.

The only time anything beachball’s is when there’s a problem. My most common problems are apps crashing, and they’re almost always apps that have some other huge dependency, like from Adobe or Java. It doesn’t seem like these are related to the hardware, but I mention them here to show that even a new machine has the same old problems.

Trackpad

The trackpad is nice. I don’t deep click very much, which could be a usage pattern of mine or could be Apple not making it compelling enough, but it’s nice to have edge-to-edge clicks. I am a drag-lock user (something I picked up from my Sony Vaio days) which continues to work nicely. If anything, the trackpad is maybe a bit large, and it’s happened a few times where my thumbs gently tap the pad enough to cause a touch-tap in OS X, but it’s a behavior that’s easy trained out.

Battery

Battery life is perceivably excellent. I don’t like the phrase “all day battery life” because it makes me feel bad about how much time I spend unplugged and working. My day is never done before my laptop is, to the point where I’ve practically rearranged my day around when the battery dies and when to switch to a different device.

Charging

The USB-C charger lacks the orange-green indicator available on every MagSafe adapter, so I usually use my MacBook until it’s about drained, then plug it in and switch to a different device until it’s fully charged again.

And even though USB-C supports up to 100 watts, the charger that’s packaged with the MacBook is only 29 watts. This means it takes almost 5 hours to get from empty to full, which could be sped up with proper wattage. This also means Apple will no-doubt release a higher wattage USB-C charger, and charge $80 for it.

And the 29 watt charging brick doesn’t have the wings on it to wrap the 2 meter long cable around – it’s a bit of a drag to go back to having a loose cable again. I’d suggest buying a shorter USB-C to USB-C cable for travel.

USB-C

Apple does do a good job of introducing new ideas slowly (getting people acclimated to the new while systematically weening off the old) but this MacBook could just have easily used a Lightning port instead.

I don’t really think this is the kind of laptop that begs for an external display, and this version of USB-C doesn’t support Thunderbolt, so you can’t easily plug in any of Apple’s external displays.

It’s frustrating as a consumer to have this new port shape in an otherwise Lightning ported ecosystem. Heck, even the Apple TV remotes and Apple Pencil’s use Lightning now.

Why bother with USB-C? It’s a way for Apple to get familiar with the intricacies of a new batch of protocols and possibilities, and with a limited and targeted sample size. (And let’s assume a Mac Pro refresh will come in 2017 with a bevy of USB-C ports vs. mixed USB-A/B & Thunderbolt ports.)

Speakers

I am more likely to use headphones than built-in laptop speakers, but the few times I’ve needed to crank up the volume to share a video or play some tunes so I could hear them in another room, they’ve been adequate (considering it’s thinness) in both clarity and loudness.

The headphone jack is oddly placed on the side opposite the charging port. Technically, it shares a board with the microphone and ambient co-processor, so it needs a little bit of dedicated room, but it seems like a compromise due to size constraints more than the “great intention” that Apple usually designs things with.

Epilogue

The 12″ MacBook is the perfect successor to the 11″ Air, and probably the 13″ Air, and maybe even the 13″ MacBook Pro. The future of professional computing is the same as the past, and it isn’t just in the cloud – it’s having an adequate client machine that can push computationally complex work towards more capable & properly tuned machines. (You likely will not use this MacBook to render 4k 3D animations, but you can easily use it to produce them, and ship the rendering off to a Mac Pro.)

I spend most of my day in iTerm, Netbeans, Safari, Sequel Pro, Paw, Mail, Messages, Slack, 1Password, and iTunes, with Vagrant and VirtualBox in the background. I write a lot, both communication and code. I listen to music and have movies on in the background. I have large photo and music libraries. I subscribe to all the Apple cloud stuff. The 12″ MacBook handles all of this for about 8 unplugged hours at a time.

If it can survive the way my 11″ Air did, this MacBook has the potential to be the best Mac I’ve ever owned, both in it’s simplicity and tenacity. If you’re on the fence about this or a Pro device, remember that being a professional isn’t just about having the best tools, it’s about using the right ones for the job. In my experience, the 12″ MacBook is Apple’s best tool for writing code, and something like a Mac Pro or a nice iMac is a better tool for running entire integration test suites.

Here’s the overview, incase you’re sold and want one of your own.❤

Screen Shot 2016-05-10 at 08.47.06.png

 

Slow Vagrant?

Maybe you’re a file hoarder, like me.

I switched to using VVV a few years ago, when it became cool to use Vagrant and when unit testing became a must-have part of my daily WordPress development process.

Truth be told, I’ve missed the simplicity of MAMP PRO ever since, even if I do prefer Nginx over Apache these days.

And if you’re like me, you never really delete stuff, it just goes someplace else. Git enables this; I pack away repositories like a squirrel, thinking that I’ll clone something now and peek at it later.

I have a 6 core Xeon powered Mac Pro at my office. It’s usually sitting idle as a task runner for all sorts of client work that requires a bit of additional TLC. I push some code from my MacBook to Gitlab; Gitlab tells my Mac Pro to make sure everything is still green; I move on to the next task.

So lately, my Mac Pro has seen abysmal performance when it comes to Vagrant related tasks. Things like up, ssh, and box update would take several minutes to complete. Last night, it took 6 hours to vagrant up --provision so I finally gave up and decided to figure out what the heck was going on.

Screen Shot 2016-05-05 at 12.58.27 PM.png
73 seconds to vagrant ssh.

I guess it was my own fault. I keep a local mirror of plugins.svn.wordpress.org on my Mac Pro, which pulls down about 70k WordPress plugins, creating over 339,000 directories.

Screen Shot 2016-05-05 at 1.02.06 PM.png
This kills the VVV.

What I discovered is that the number of directories in your VVV’s www directory can have a severely negative impact on the performance of your vagrant commands, even if those directories are largely dormant and do not contain a relative vvv-hosts or vvv-init.sh files to treat them as actual sites.

I have a few hunches about what’s causing the slow down, but haven’t the time to dig much deeper:

  • Guest Additions might front-load the directory tree, in such a way that locks the rest of Vagrant from proceeding, maybe part of the vagrant-vaguest plugin?
  • Some other plugin feels the need to traverse the directory tree without a max-depth flag
  • VVV or Vagrant have internally optimized for traditional web directories that do not have hundreds of thousands of directories

Hope this helps, and if you figure out the rest of this, drop me a comment!❤