My Delayed Migration to Authy (and Google Chrome Password Manager)

For years I was an enthusiastic 1Password user. Then I became less enthusiastic.

Around the time I decided I wasn’t going to pay for any more 1Password updates, I began to research alternatives. Many shared the aspects with 1Password that made me want to leave it.

I decided to try Google Chrome’s password management. Because it is part of the browser, its browser integration is excellent. And it’s free. But it lacks support for One-time Passwords (OTP). Of course, Google offers the Google Authenticator app, which I used before 1Password added support for it. But Google Authenticator has no cloud syncing.

Authy only stores one-time passwords, and it offers cloud syncing. Perfect, right?

Initially I added my Twitch account — which seems to have a specific integration with Authy — and Twitter. I tried to add my Nintendo account OTP to Authy, but it had two problems:

  1. It never worked. It didn’t match the code in 1Password, which did work.
  2. Depending on the device on which I was using the Authy app, Authy would repeatedly insist that I decrypt it. I’d type in the password I believed was correct, but it wouldn’t work.

The second point scared me: Was this my future if I embraced Authy? Codes that don’t work and failed decryption?

More than seven years after creating an Authy account, I had gotten very tired of needing 1Password on my phone to access my OTPs. I decided:

  1. I wanted to move all my OTPs to Authy and
  2. That meant first I was going to have to sort out the problem with my Nintendo account and Authy.

I again tried to decrypt my Nintendo OTP in Authy; No luck. I could see it on my iPhone, but it never worked. So I decided to delete it. I have cloud sync turned on for Authy. I deleted the account on my iPhone, and Authy told me it would take two days before it was gone for good. The account was still visible — but unusable — on my Windows PC, so after a day I deleted it there, too.

I gave it another day or so. Then I tried to copy the working OTP for my Nintendo account from 1Password to Authy. 1Password allows you to edit an OTP (this is handy; 1Password does have some good features). In 1Password, on the screen for my Nintendo account, I clicked edit and then copied the entire string shown for the OTP field. I pasted this into Authy, but it didn’t match the code in 1Password, and wouldn’t let me log in.

I did some Googling, and found this post on Reddit: Move one-time passwords out. The trick is to grab the value after secret=. I tried it and it worked.

I quickly copied all the OTPs that I could remember needing. I then installed Authy on my devices.

Today I’m much closer to retiring 1Password once and for all. It’s a good feeling.

This is a happy ending, but it’s not perfect. Authy isn’t perfect.

I’m currently forced to use Authy’s Android app on my Chromebook. I don’t like Android apps on ChromeOS, and I avoid them. I spent an hour or so trying to get the Authy’s Linux app installed on my Chromebook, and the install appeared to work, but the only Authy I can find on my machine is the Android app.

Authy’s security measures are confusing. There is a backups password, a master password, and a PIN. This is too much. 1Password has a master password and, if you use it on a mobile device that doesn’t have biometric authentication, a PIN. I can think of no good reason why Authy’s backups password — for attaching the Authy app on a new device to your Authy accoung — and master password — for unlocking the Authy app when you unlock your computer or launch the app — could not be combined.

So there are two things about Authy that annoy me. And if Google every combined Google Authenticator with Google Chrome’s password manager, I’d probably ditch Authy. But for now, it’s a free OTP manager with Cloud syncing, and that’s exactly what I was looking for.

My Delayed Migration to Authy (and Google Chrome Password Manager)

PC Build Diary Day 2

I forgot about this yesterday.

The Sliger SM550 manual says it comes with three types of screws. Mine came with four (or five).

Normally I’d say “Extra screws are better than not enough screws.” And maybe Sliger ships the same multi-compartment baggy of screws with all their case models.

But the problem is, there’s at least one screw in the manual that matches no screw in the baggy. And that’s a problem.

Apparently other boutique PC cases have similar problems with incomplete or out of date manuals. If that’s true, Sliger gets no points for standing out from the crowd.

PC Build Diary Day 2

PC Build Diary Day 1

My Sliger SM550 case arrived today. All that’s left is the processor, but I finally have enough parts that I can do step one of the build.

Step 1 is: install fans in the case.

I got two Noctua NF-A12x25 PWM chromax.Black.swap case fans. Research indicates that the A12x25 is the Rolls Royce of PC case fans. And I like black. After installing these in the SM550, I’ve decided the thin version of the A12 — the Noctua NF-A12x15 PWM chromax.Black.swap (15mm thick rather than 25mm) might have made more sense in this case. And I say that even though Sliger shows 25mm fans in their gallery and the manual — and will sell you two NF-A12x25 fans (in traditional Noctua brown) to go along with your SM550.

I also purchased two fan grills, but they’re not attached right now. If I do end up putting them in, they’ll be a tight fit. They form a concave — probably to keep wires even farther away from the fan blades. They won’t fit in the SM550 like that — at least not under the motherboard. If I flip the grills they might fit. I tested and it looks like I can install them later without taking the fans out, so I’ve got that in my back pocket.

When I screwed the fans into the bottom of the case, I stripped the hell out of one of the screw holes on one of the fans. (Lotta plastic shavings on my table.) The problem was that the screws were catching on both the case and the fan. I believe this could have been prevented if the case’s holes were just a bit larger — still small enough to hold the screw head, but not so small that the screw catches the case.

Finally, I’m confused about the routing of the PCIE riser cable. At the bottom of the metal sheet that divides the motherboard side of the case from the graphics card side of the case, there’s a cutout that’s just about the perfect width for the riser cable. But the riser cable starts on the graphics card side and stays there (at least until it gets to the top of the case).

There’s also a lip on the graphics card side of the divider sheet that the riser card has to press up against.

I checked several sources, and my case is not the only one with the riser cable routed this way.

PCIE riser cable in Sliger SM550 case
Why not route the riser cable to this side of the case?
Routing the riser cable on this side makes for a tight fit, and pushes it against the lip.

Why do it this way? Is there concern that the riser cable will jut out and put pressure on the bottom of the motherboard? (Edit: Maybe the concern is the CPU cooler’s hardware that mounts on the back of the motherboard.) Or maybe it’s more important to insulate the back of the graphics card from the metal divider than it is to insulate the motherboard. (The motherboard does have standoffs. And a thick video card might be pushed in by the outer wall of the case.)

So maybe that’s it. To insulate the graphics card. But why leave the cutout at the bottom of the divider?

For now I’m leaving the riser where it is. I assume it was done this way for a reason. And for me to move it now I’d either have to unscrew 8 fan screws and then re-screw 8 fan screws, or try unscrewing two screws between the graphics card “platform” and the fan under it — and I’m not certain that would let me make the move.

As for other aspects of my first impression of the SM550, it wobbles a bit — the way a table in a restaurant might. The legs can be unscrewed and I assume it’s to resolve this issue. But it’s a little disappointing for such an expensive case.

And the piece of metal the power supply will screw into is a bit warped. I’m guessing once I’ve got the power supply attached to it, it will straighten out, and the power supply will be straight. But I won’t know until I get there.

That’s probably all I’ll do on the build until the processor gets here. I plan on writing at least one more post on the process.

PC Build Diary Day 1

College Conference Names Suck

As we move deeper into the latest round of college athletic realignment, I am reminded that many conference names are bad. They suck, even. Not all, but many.

Take Conference USA, for example. Bad name. And the American Athletic Conference. Did no one tell them that AAC sound a lot like ACC? Or was that the point?

And why didn’t anyone tell the Big XII that the Big Ten had taken the word “big” already?

It’s branding, people. So let’s make some rules for naming (or renaming) your new/existing/picked over college athletics conference.

  • Don’t use “America” or “American” or “USA”. These are just too general and vague. They sound generic and so far have been used for generic conferences. They contribute nothing to the brand. I wouldn’t recommend “National” but I’d at least consider it.
  • Don’t use the word “Big”. It’s been used to death (literally, in the case of the Big East), and any conference using or considering it in the 21st century certainly isn’t the biggest conference.
  • Don’t use a number. The Big XII laughably has had fewer than 12 teams for the last decade, and the Big 10 decided that consistency was better than numerical accuracy. The Pac 10 (admirably) changed its name to the Pac 12 when it added two teams, but that makes me wonder if it’s gun shy about further expansion due to the hassle of updating trademarks and signage.

So let’s suggest new conference names, where necessary, starting with the most successful conferences:

  • Southeastern Conference (SEC): No change necessary. Doesn’t break any of the three rules.
  • Atlantic Coast Conference (ACC): No change necessary.
  • Big Ten Conference: Uses the word “Big” so I don’t like it. Some options:
    • Rust Belt: Geographically appropriate, but has negative connotations
    • Steel Belt: Outdated
    • Midwest Conference: Sounds like some other conferences
  • Big XII Conference: The other Big conference. Where do we go with this? Becoming geographically spread out.
    • Mississippi Conference: Kind of like calling it the American Conference without calling it the American Conference
    • Big Hat Conference: Shit, has the word “big.”
    • Great Plains Conference: Apparently Methodists have taken this name
    • Continental Conference: Hey, doesn’t have “America” in the name
  • Pac-12 Conference: Has a number.
    • Pacific Athletic Conference: Maintains the PAC. Basically a bacronym.
  • American Athletic Conference (AAC): Losing and gaining teams. Becoming more of a southern (including Texas) conference
    • Appalachian Athletic Conference: Shit, is taken
    • Gulf Coast Conference: I know, Gulf Coast Athletic Conference is taken. This might lead to a lawsuit, but hey, that’s what that Tulane money is for.
  • Conference USA (C-USA): Um …
    • No, I’m not avoiding you. I’m not avoiding eye contact. I definitely invited you to my party.
    • When the Sun Belt starts picking at your corpse, well, it’s over.

College Conference Names Suck

Wemo and a New Router

Cliffs Notes: Delete the Wemo app. Reboot your iPhone. Reinstall the app and go from there.

I got my first Wemo devices at least as far back as 2015. I’ve been happy with them. They work. Yes, they can be occasionally stubborn — but I think that’s mostly due to wifi dead spots in my home. A built-in ethernet port would be a nice option. And yes, the Mini Smart Plugs that never stop broadcasting their setup wifi network? Also annoying, but hardly a dealbreaker.

Today I considered getting rid of all my Wemo devices in favor of a competitor. It didn’t matter which competitor. I was frustrated. I couldn’t get any of my Wemo devices to connect to my new wifi network. (I have entered the world of mesh wifi with a pair of Nest Wifi routers.)

I did some research before I created the new network. Based on what I found, I would have to factory reset each Wemo device in order to get it onto the new wifi network. Fine. Not ideal, but fine.

Wemo devices, like many smart devices, broadcast their own wifi network in order to perform initial setup with help from another device like a phone or tablet. It makes a lot of sense — modern phones have a screen. Things like light switches or doorbells or speakers tend not to.

I was able to get each of my Wemo devices to broadcast its setup wifi network. I was able to get my iPhone to connect to each of these devices (though not always on the first try). But that was where my progress stopped. For each smart plug, I was prompted to use my phone’s camera to snap/scan the plug’s Homekit code, or type in the code manually. But none of my plugs are new enough to have Homekit codes printed on them. For the light switch, I was just shown basic instructions about installing the hardware in wall. Not what I was looking for.

I gave up and moved on. I got every non-Wemo smart device in my house connected to the new wifi network. Then I did some more Googling, and found this on Reddit: Wemo Smart Plugs do not play well with SSID name change The crucial advice? Delete the Wemo app from you iPhone. Reboot your phone. Go from there.

What do you know? It worked. For devices that I didn’t factory reset, the name and ID photo were still stored. So the factory reset didn’t help anything, and actually lost my customization.

You would think a line of devices that depend on wifi would walk users through the process of moving devices to a new wifi network. For contrast, the Ring Doorbell app has a Device Health screen with an action called “Change Wi-Fi Network.” In the Alexa app, the screen for each Echo device shows the wifi network it is currently connected to, and a “Change” action.

User flow shouldn’t lead to a dead end. Users shouldn’t have to delete and reinstall an app to get back to a setup phase. And an ecosystem like Wemo shouldn’t have a massive blind spot for moving devices to a new network.

Wemo and a New Router

iTunes, Movies Anywhere, and SD

There was a time when I had not yet embraced our digital-only future.

I still bought Blu-ray discs. Like a caveman, I would search through my mostly organized Blu-ray and DVD jewel cases, find a movie I wanted to watch, open the case, take the disc out, open the Blu-ray player, put the disc in the tray, close the tray, and wait.

When I put The Bourne Legacy’s disc into our Blu-ray player, it didn’t work. It wouldn’t play.

My wife wanted to watch The Bourne Legacy.

Our hero

The disc wasn’t playing.

I grabbed the jewel case, walked to the basement, opened iTunes or whatever obscure URL the coupon in The Bourne Legacy’s jewel case wanted me to open, and redeemed the code for the digital copy of The Bourne Legacy.

Then I walked back upstairs, changed the TV input to the Apple TV, and played the movie.

It was as if the disc worked.

But I could watch it on my phone. I could watch it in the basement without lugging the disc around (like a caveman).

A short time later, I went through all my DVDs and Blu-rays, looking for digital codes to redeem. Some had expired. Some had expired but worked anyway.


As I looked over my new iTunes movie library, I noticed that some of the films were HD and some were not. This was annoying and disappointing and would cause me to re-purchase some films in HD.

I believe I owned the following films on iTunes in SD format:

    Cowboys and Aliens
    Inception
    Jurassic Park
    Jurassic Park III
    Limitless
    The Lost World: Jurassic Park
    Mission: Impossible – Ghost Protocol
    Predators
    Prometheus
    Rise of the Planet of the Apes
    Super 8
    Terminator Salvation
    The Town

Now, as of April 2018, I can only find the following SD films in my iTunes library on my up-to-date gen 3 Apple TV and on my up-to-date iPhone 7:

    Limitless
    Mission: Impossible – Ghost Protocol
    Super 8

In iTunes on an up-to-date Mac, these films appear to be SD:

    Limitless
    The Lost World: Jurassic Park
    Mission: Impossible – Ghost Protocol
    Predators
    Super 8

The fact that two films are HD on two devices and SD on one seems like a bug to me.

(Technically I can find Inception in SD, but I later purchased it in HD. It appears twice in my library. I upgraded Prometheus, too, but the SD copy is no longer in my library.)

Limitless was distributed by Relativity Media. Mission: Impossible – Ghost Protocol and Super 8 were both distributed by Paramount. What do these two film studios have in common? In what way would they be linked that is relevant in the 2018 digital film library landscape?

Movies Anywhere.

Name two film studios that aren’t participating in the Movies Anywhere initiative as of April 2018. Relativity and Paramount. Sure, there are others. I just don’t own any of their movies.


This makes me extremely curious. This is too much to be a coincidence.

The first thing I wonder is: If I were to buy an SD film on iTunes that is available in Movies Anywhere, would it show up in Movies Anywhere? Would it upgrade to HD in my iTunes library? Seems unlikely. Apple wouldn’t leave a loophole that big.

Are SD films upgraded to HD only if they were in a user’s iTunes library before Movies Anywhere started?

Here’s what I think is most likely: Apple/iTunes keeps track of which films a customer purchased on iTunes and which films a customer redeemed with a code. If a code redeemed an SD copy and that film becomes available in Movies Anywhere, it is upgraded to an HD copy.

If my theory is correct, the moment that Paramount or Relativity join into Movies Anywhere, I should have fewer SD films in my iTunes library.

iTunes, Movies Anywhere, and SD

The Passion of the Comcast: Cutting the Cord

This is an ongoing story.

In late 2014, my wife — the primary person on our Comcast account — got a call that we could get new cable boxes, more channels, faster internet, and phone service, all for less than what we were paying at the time. A technician came to our house and hooked up a primary X1 box in our living room, a smaller X1 box in our bedroom, and a new combination modem/router. The X1 interface is a vast improvement over what came before it. Our internet speed went from 25 mbps to 100 mbps. Things were good. We even added two digital adapters.

Fast forward two years, and I watched as our monthly Comcast bill got larger and larger. It got as high as $236.43 on May 1, 2017. Our two year contract had ended and the steep discount with it.

In that two year span, Google Fiber had announced plans to bring its service to Atlanta, and more specifically, Brookhaven. It’s not available at our home as I write this, but I operate under the assumption that it could become available at any moment.

So I don’t want to sign any contracts. But that’s the only way to get a discount with Comcast.

So I started looking at streaming tv providers. I went in thinking I might go with DirecTV Now — I already have AT&T cell service. But Sling had the features and channels we wanted. I tried it out, bought a couple Apple TVs (and an antenna and a Tablo) and turned in our cable boxes at the local Xfinity office.

Of course, to stream anything, you need internet. I didn’t cancel our Xfinity internet service, but I did drop the speed from 100 to 25 mbps. That alone cost $65/month.

Everything was going fine. Between Sling and the antenna, we got every channel we cared about except two: Ion, a channel that shows Law & Order reruns that broadcasts over the air out of Atlanta but not with a strong enough signal for us to pick up; and HBO. I was leaning toward HBO Now because getting HBO on Sling was the same price — $15 — but lower video quality.

But I noticed some weirdness when I logged into my Comcast account. It showed that we had made an automatic payment on May 21, 2017 and that our next automatic payment was scheduled for May 22, 2017 — which was in the past.

I talked to Xfinity support via browser-based chat. The rep told me not to worry about the bill – we would be charged the correct amount — but that hey, we could get faster internet — 75 instead of 25 mbps — for less money — $40 instead of $65. And oh by the way, we’d also get Stream TV — including HBO. Great!

So of course the first thing I tried to do was log into HBO Go. Couldn’t do it. The next day I talked to support chat again. No HBO Go.

A day or two later I did some research and found this Xfinity support article. Among other things, it says that Stream TV customers get HBO Go.

A few days later I called Xfinity support. I spoke to four different people. Each of the last two told me I couldn’t get HBO Go, gave me the link to the Stream FAQs article, and then was surprised when I pointed out that the FAQ article says I should get HBO Go. The last person said the article was in error and would be updated.

About two weeks after that I looked at the Stream FAQ article again. Some text and formatting had changed, but it still said that Stream TV customers get HBO Go. So I tried to log in … and it worked.

HBO was the final piece of the puzzle. By eliminating (mostly) my Xfinity TV service, I had saved around $135 per month.

The Passion of the Comcast: Cutting the Cord

Windows 10 Creators Update Disabled My Touchscreen

Really strange.

I’ve had my Lenovo Yoga 11e for about eight months.  It’s not a powerhouse, but it’s a really great couch laptop.  And it has a touchscreen that can swivel all the way around to make it a bulky tablet.

When I got it everything worked, but there was some bloatware.  So I formatted the hard drive and did a clean Windows 10 install.  The touchscreen was not recognized by the OS.  After reading a lot of Lenovo forum posts, I found an Intel driver, installed it, and voilà.

Then Microsoft released the Windows 10 Creators Update.  I initiated the update rather than wait for it.  Booted up and … the touchscreen was not recognized by the OS.  I ran the Intel driver that worked before.  It had two choices:  remove or repair.  I chose repair.  It didn’t work.

I read some Lenovo forums — probably forums I already read eight months ago.  I tried one other driver but no improvement (Windows said I already had the latest driver).

I decided to try the driver installer that worked before, except I’d try the remove option and then run it again to install.  I did it, along with a reboot in between for good measure.

The touchscreen works!  Strange.  Maybe this is a fluke?

PS – I can’t find the driver anywhere online that I describe above.  I’ve had it in my Dropbox since I discovered that it fixed my problem, but what about other people who might need it?  The filename is IO_Win10_99.16.55518.zip and I’m considering posting it here.  But would I want to download my touchscreen driver from some random guy’s blog?

[Update 2018/02/07] I decided to create a download link for the driver. I did a few minutes of research to find a site to host it.

http://www.filehosting.org/file/details/723813/IO_Win10_99.16.55518.zip

Windows 10 Creators Update Disabled My Touchscreen

Don’t Use jquery-latest.js!!!!!!!1

I’m guilty.

So guilty.

For years I have pointed pages to jquery-latest.js. Of course, I don’t think anyone would classify hack.premo.biz as a “production site.” I just want the latest damn version of code. I like to experiment with new features.

But I hate babysitting blogs, downloading point releases, and uploading them to my web server. So I used jquery-latest.js.

But now jQuery has taken this away. Sort of. jquery-latest.js is now frozen in time at version 1.11.1.

Well that’s no good. I can’t putter around on an old version for the rest of my life. But I hate babysitting blogs. And downloading point releases. And uploading them to my web server.

What’s a modern coder to do?

Scrape that s.

I made a two part solution. Part one scans the file structure on includes.premo.biz for files that look like jquery 2.x and returns the newest one it finds. It also sends a custom header so the browser reads it as JavaScript. I’m not going to give the URL here because I don’t want to be the next jquery-latest.js. But here’s the (PHP) code:


header( 'Content-Type: application/javascript' );
$contents = scandir( './' );
foreach ($contents as $file) {
if ($file !== '.' && $file !== '..') {
$ext = '';
$parts = explode('.', $file);
$ext = $parts[count($parts) - 1];
if ($ext == 'js') {
if ($parts[0] == 'jquery-2') {
include $file;
}
}
}
}

The second part is more complicated. It pulls in the jQuery Blog RSS feed, looks for a post about a new release, reads the version number, determines if it is newer than the version my server already has and if so pulls it down, then archives the older version. Here’s the PHP for that:


// run on cron.
// check jquery blog rss for updated version news
// http://blog.jquery.com/feed/
header('Content-Type: text/html; charset=UTF-8');
// what's the latest version we've got? (current?)
$ourVersion = '0';
$contents = scandir( './' );
foreach ($contents as $file) {
//if( strpos( $file,'.' ) !== 0 ) {
if ($file !== '.' && $file !== '..') {
$ext = '';
$parts = explode('.', $file);
$ext = $parts[count($parts) - 1];
if ($ext == 'js') {
if ($parts[0] == 'jquery-2') {
//include $file;
$ver = $file;
$ver = str_ireplace('jquery-', '', $ver);
$ver = str_ireplace('.min.js', '', $ver);
$ver = str_ireplace('.js', '', $ver);
$ourVersion = $ver;
}
}
}
}
echo 'ourVersion : ' . $ourVersion;
$rssString = file_get_contents('http://blog.jquery.com/feed/');
$xmle = simplexml_load_string($rssString);
//print_r($xmle);
$articles = $xmle->channel->item;
foreach ($articles as $article) {
$titleLength = strlen($article->title);
$check = trim(substr($article->title, (strlen($article->title) - 8)));
if (trim(substr($article->title, (strlen($article->title) - 8))) == 'Released') {
if (strstr($article->title, 'RC')) {
continue;
echo 'release candidate. BOO!';
}
if (stristr($article->title, 'beta')) {
continue;
echo 'beta. BOO!';
}
echo 'RELEASE POST';
echo $article->title;
// find '2.'
$words = explode(' ', $article->title);
$ver = '0';
foreach ($words as $word) {
if (substr($word, 0, 2) == '2.') {
$ver = $word;
if (strlen($ver) == 3) {
$ver = $ver . '.0';
}
echo 'version : ' . $ver;
if ($ver > $ourVersion) {
echo $ver . ' is greater than ' . $ourVersion . '!';
$jqFilename = 'jquery-' . $ver . '.min.js';
$jqUrl = 'http://code.jquery.com/' . $jqFilename;
echo $jqUrl;
// http://code.jquery.com/jquery-2.1.1.js
$jqueryContents = file_get_contents($jqUrl);
file_put_contents($jqFilename, $jqueryContents);
// move old version
rename('jquery-' . $ourVersion . '.min.js', './jquery_archive/jquery-' . $ourVersion . '.min.js');
break 2;
} else {
echo $ver . ' is NOT greater than ' . $ourVersion . '!';
}
}
}
echo '----------';
}
}

And that’s that. My very own jquery-latest.js.

Don’t Use jquery-latest.js!!!!!!!1