Fade to Black (A Ramble)

Throughout my life I’ve been strangely attracted to dark humor.

Before I wrote software I was a cartoonist, and back then I’d wonder what humor was and why people laugh.

I decided it was madness escaping.

We’re all a little bit insane, doing and believing whatever it takes to avoid the horrible truth that one day we’ll die of old age unless something bad happens first, and when we’re gone the universe will quite clearly continue on just fine without us. Laughter is the sound of that pressure escaping. In a group, it enables us to shed our differences and admit we’re all fucked.

Given that rather bleak perspective, it’s perhaps no surprise that I lean towards dark humor. Not the mean-spirited kind, but instead the kind based on hope.

This is where I start to ramble.

There’s a thing called “middle age settling,” where as you approach middle age you realize you’re not going to change the world as much as you thought you would when you were younger. So you settle on changing a smaller part of the world instead.

In order to do that, you still need hope. Hope that the world is still worth changing, hope that you can at least make things better for the people you love (and maybe even the people you don’t love).

Hope, unfortunately, can be hard to hold onto the more you learn about the world. That seems to have been a problem for some of the dark humorists I’ve enjoyed. As they got older they stopped sounding like disappointed idealists and started sounding like cranky cynics. They faded to black.

That’s something I may struggle with, but so far I haven’t given in to cynicism (of course, I’m a spry young 47, so there’s still time). I continue to laugh at the unpleasant things that bind us, like the universal truth that nothing is funnier than an improperly stifled fart in the middle of a church service. The fact that others laugh with me despite our differences gives me hope.

Fade to Black (A Ramble)

The Programmer’s Dream (A Ramble)

Programmers dream of new code.

We spend a good deal of our time working on code we didn’t write for software we didn’t create, much of which we believe is horribly written (or, at least, could be done much better). We dream of a chance to start fresh, working from scratch on a brand new piece of software that will eventually become something someone else has to work on and believes is horribly written.

If we’re lucky our software will look pretty solid from the outside. It may do weird things from time to time or very occasionally crash, but on the whole end users will think it’s stable and well thought out. Those of us who can look at it from the inside are amazed by this because we see a house of cards just waiting to come tumbling down. I think one of the benefits of open source is that we can see more clearly that everyone else’s code is just as frightening as our own is.

This situation reminds me of how I used to look at our culture when I was much younger (it’s a tenuous connection, but as I said, this a ramble).

I used to assume there were people in charge who knew what they were doing, who planned how things in society should work. As I got a little older I got more cynical, believing these people were trying to keep the rest of us dumb with shoddy schooling and mind-numbing entertainment, in the hopes they could get away with whatever it is powerful people are always trying to get away with.

Then as I got even older I realized that the people in charge are as clueless as the rest of us. Like our software, our society just kind of happened over the years and it’s always on the verge of coming tumbling down. Nobody really knows what they’re doing or what they’re talking about.

If you can get over the sheer terror of that thought, it’s actually quite liberating.

The Programmer’s Dream (A Ramble)

Mobile Apps Are Scary

In 2006 I wrote about how the fear of installing desktop software accelerated the move to the web. Security warnings, firewall alerts and antivirus popups made installing software feel like an incredibly risky thing to do.

We’re seeing a similar situation with mobile apps now. The seemingly simple act of installing an app requires you to first approve a scary list of permissions, and while some may approve them the same way they dismiss a EULA, others find them daunting. Add to that the spammy notifications and addiction-feeding of popular games plus the privacy violations of popular social apps, and it feels like I’m watching a rerun from eight years ago.

If this trend continues, the whole debate about mobile apps vs. web apps will be pointless: users will feel safer with web apps so that’s what they’ll choose, and developers will follow.

Mobile Apps Are Scary

The End of Glassboard

Justin Williams brings the unfortunate but inevitable news about the end of Glassboard:

Over the last year we have tried a variety of different methods of converting Glassboard into a sustainable business. The reality is that we failed to do that.

Starting next week, we will be converting everyone’s account to a premium account for the remaining few weeks so that you can export your boards and keep an archive should you desire.

I’m sad to see Glassboard go away. It was the first Android app I wrote, and I have great memories with the team of friends I worked with at Sepia Labs. I feel bad for Justin that he invested so much time and money in keeping Glassboard alive only to see it fail to gain traction.

For me personally, Glassboard was a reaction to the whittling away of online privacy. I’m proud to have worked on something that said “privacy is important” at a time when so many other apps were sharing, leaking, and even stealing, your private information. None of us foresaw Edward Snowden, of course, but we did foresee a backlash against the loss of privacy which I believe is still in its infancy.

It would be easy to blame Glassboard’s failure on users’ lack of concern for their privacy, but I think it had more to do with our flawed initial experience and downright terrible business model.

Our initial user experience made it hard to get started with the app, which killed any chance of the viral growth necessary to build a large user base. And we did so little to promote our premium version that very few Glassboard users knew we even had a premium version (and those that were aware of it saw little reason to upgrade).

There’s certainly no guarantee Glassboard would’ve succeeded had we not made those mistakes – as Brent Simmons points out, an app like Glassboard “is going to be a challenge no matter what” – but I do think those mistakes guaranteed it wouldn’t succeed.

The End of Glassboard

I Hate the Command Line

mac-terminal

Back when I was a Windows developer, I learned all sorts of arcane things about the platform. I felt I had to in order to be a good developer, and much of it was necessary to support customers running into problems.

Four years ago I bought a Mac, and three years ago I ditched Windows entirely and started learning Android development on my Mac.

I decided I really didn’t want to learn all the innards of the Mac. I never liked dealing with all that on Windows, and since I wasn’t a Mac developer I figured I could skip it.

Which means, of course, that I’m totally useless with the command line. Terminal? No thanks. Bash? Forget it. Git? I’ll use SourceTree instead. If it doesn’t have a GUI, I don’t want to touch it.

Sure, there are probably a ton of cool things I could do from the command line. But I’m happier not feeling I need to know all that stuff.

I Hate the Command Line

Test Driving Employees

From the NY Times:

“Employee trials work best for people in support, design and developer positions, said Matt Mullenweg, founder and chief executive of Automattic, the creator of WordPress, the blog and website tool. Still, every hire, without exception, goes through a two- to six-week contract period, and is paid the standard rate of $25 an hour.”

Employee trials are daunting, and downright impossible for many people. For some companies they’re completely unrealistic.

But the fact that Automattic had trials is one of the things that convinced me I wanted to work with them. I wanted to work alongside people who believed so much in what the company was doing that they’d go through the pain of a trial period.

The trial period was certainly painful for me. At the time I was working 60-80 hours a week at a job I wasn’t fully committed to, and I couldn’t imagine how I’d fit a trial period into that. But somehow I did it, and I’m glad I did because now I get to work with people totally invested in a shared goal.

PS: We’re hiring.

Test Driving Employees

Using Android’s ViewPager PageTransformer

A recent addition I made to the Reader in WordPress for Android is the ability to swipe through articles, which is a pretty standard thing on Android thanks to the ViewPager.

But after using it a while, I decided I wasn’t happy with the default swipe animation, so I created a custom PageTransformer to provide a different one.

I then added the ability to swipe through photos in an article, and again I wasn’t happy with the default animation. Rather than create another PageTransformer, I changed the one I’d already coded so it could provide a number of different animations.

Here’s a video demo:

The source code for this custom PageTransformer, which is part of the open source WordPress for Android app, is below.

package org.wordpress.android.ui.reader;

import android.support.v4.view.ViewPager;
import android.view.View;

/*
 * ViewPager transformation animation invoked when a visible/attached page is scrolled - before
 * changing this, first see https://code.google.com/p/android/issues/detail?id=58918#c5
 * tl;dr make sure to remove X translation when a page is no longer fully visible
 *
 * Usage: viewPager.setPageTransformer(false, new ReaderViewPagerTransformer(TransformType.FLOW));
 */
class ReaderViewPagerTransformer implements ViewPager.PageTransformer {
    static enum TransformType {
        FLOW,
        DEPTH,
        ZOOM,
        SLIDE_OVER
    }
    private final TransformType mTransformType;

    ReaderViewPagerTransformer(TransformType transformType) {
        mTransformType = transformType;
    }

    private static final float MIN_SCALE_DEPTH = 0.75f;
    private static final float MIN_SCALE_ZOOM = 0.85f;
    private static final float MIN_ALPHA_ZOOM = 0.5f;
    private static final float SCALE_FACTOR_SLIDE = 0.85f;
    private static final float MIN_ALPHA_SLIDE = 0.35f;

    public void transformPage(View page, float position) {
        final float alpha;
        final float scale;
        final float translationX;

        switch (mTransformType) {
            case FLOW:
                page.setRotationY(position * -30f);
                return;

            case SLIDE_OVER:
                if (position < 0 && position > -1) {
                    // this is the page to the left
                    scale = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR_SLIDE) + SCALE_FACTOR_SLIDE;
                    alpha = Math.max(MIN_ALPHA_SLIDE, 1 - Math.abs(position));
                    int pageWidth = page.getWidth();
                    float translateValue = position * -pageWidth;
                    if (translateValue > -pageWidth) {
                        translationX = translateValue;
                    } else {
                        translationX = 0;
                    }
                } else {
                    alpha = 1;
                    scale = 1;
                    translationX = 0;
                }
                break;

            case DEPTH:
                if (position > 0 && position < 1) {
                    // moving to the right
                    alpha = (1 - position);
                    scale = MIN_SCALE_DEPTH + (1 - MIN_SCALE_DEPTH) * (1 - Math.abs(position));
                    translationX = (page.getWidth() * -position);
                } else {
                    // use default for all other cases
                    alpha = 1;
                    scale = 1;
                    translationX = 0;
                }
                break;

            case ZOOM:
                if (position >= -1 && position <= 1) {
                    scale = Math.max(MIN_SCALE_ZOOM, 1 - Math.abs(position));
                    alpha = MIN_ALPHA_ZOOM +
                            (scale - MIN_SCALE_ZOOM) / (1 - MIN_SCALE_ZOOM) * (1 - MIN_ALPHA_ZOOM);
                    float vMargin = page.getHeight() * (1 - scale) / 2;
                    float hMargin = page.getWidth() * (1 - scale) / 2;
                    if (position < 0) {
                        translationX = (hMargin - vMargin / 2);
                    } else {
                        translationX = (-hMargin + vMargin / 2);
                    }
                } else {
                    alpha = 1;
                    scale = 1;
                    translationX = 0;
                }
                break;

            default:
                return;
        }

        page.setAlpha(alpha);
        page.setTranslationX(translationX);
        page.setScaleX(scale);
        page.setScaleY(scale);
    }
}
Using Android’s ViewPager PageTransformer

Tech as the Teen Common Ground

I was born in England in 1967. Two years later my family moved to the USA. Since then, many of my relatives have scattered across the globe.

When a cousin visits me in the USA – which happens maybe once every five years – we seek some common ground, and invariably it turns out to be music or some other form of entertainment. We start talking about the music and movies we like, and from there we find other things to talk about.

By when their kids interact with my kids, the common ground is tech.

My cousin from Germany visited us last week, and we wondered if our sons – who had never met – would have much to talk about. But it turned out they’re both avid users of Instagram and Snapchat, and they both run Minecraft servers and have YouTube channels where they talk about their gaming addiction.

Their common ground in tech was the starting point for their relationship, and that relationship continues even after we said our goodbyes thanks to the tech they use to communicate.

Tech as the Teen Common Ground