Apple, Firefox OS, iOS, Mozilla, Programming, Reenact

Reenact is dead. Long live Reenact.

Last November, I wrote an iPhone app called Reenact that helps you reenact photos. It worked great on iOS 9, but when iOS 10 came out in July, Reenact would crash as soon as you tried to select a photo.

ic_launcher-xxxhdpi

It turns out that in iOS 10, if you don’t describe exactly why your app needs access to the user’s photos, Apple will (intentionally) crash your app. For a casual developer who doesn’t follow every iOS changelog, this was shocking — Apple essentially broke every app that accesses photos (or 15 other restricted resources) if they weren’t updated specifically for iOS 10 with this previously optional feature… and they didn’t notify the developers! They have the contact information for the developer of every app, and they know what permissions every app has requested. When you make a breaking change that large, the onus is on you to proactively send some emails.

I added the required description, and when I tried to build the app, I ran into another surprise. The programming language I used when writing Reenact was version 2 of Apple’s Swift, which had just been released two months prior. Now, one year later, Swift 2 is apparently a “legacy language version,” and Reenact wouldn’t even build without adding a setting that says, “Yes, I understand that I’m using an ancient 1-year-old programming language, and I’m ok with that.”

After I got it to build, I spent another three evenings working through all of the new warnings and errors that the untouched and previously functional codebase had somehow started generating, but in the end, I didn’t do the right combination of head-patting and tummy-rubbing, so I gave up. I’m not going to pay $99/year for an Apple Developer Program membership just to spend days debugging issues in an app I’m giving away, all because Apple isn’t passionate about backwards-compatibility. So today, one year from the day I uploaded version 1.0 to the App Store (and serendipitously, on the same day that my Developer Program membership expires), I’m abandoning Reenact on iOS.

ic_launcher_sad-big

…but I’m not abandoning Reenact. Web browsers on both desktop and mobile provide all of the functionality needed to run Reenact as a Web app — no app store needed — so I spent a few evenings polishing the code from the original Firefox OS version of Reenact, adding all of the features I put in the iOS and Android versions. If your browser supports camera sharing, you can now use Reenact just by visiting app.reenact.me.

It runs great in Firefox, Chrome, Opera, and Amazon’s Silk browser. iOS users are still out of luck, because Safari supports precisely 0% of the necessary features. (Because if web pages can do everything apps can do, who will write apps?)

One of these things just doesn't belong.

One of these things just doesn’t belong.

In summary: Reenact for iOS is dead. Reenact for the Web is alive. Both are open-source. Don’t trust anyone over 30. Leave a comment below.

Standard
Alexa, Amazon, Programming

“Alexa, just play along with the joke.”

One of the biggest complaints in the Alexa skill development community is that the language required to invoke a third-party skill is so stilted. Instead of being able to say, “Alexa, what’s the temperature outside?”, you have to say something like, “Alexa, ask WeatherBot 3000 what the temperature is outside.” It adds a gatekeeper layer; anyone who doesn’t know which weather skill you’ve chosen won’t be able to use Alexa to its full potential.

I decided to have some fun with this limitation. One of the words you can use to invoke a custom skill is “open” (as in “Alexa, open WeatherBot3000 and tell me the temperature outside”), so I wrote a skill called “Up To Me.” The idea is that you could say, “Alexa, open up to me,” and she’d reply with a selection of vulnerability-exposing confessions:

“I’m terrified of what will happen when I’m unplugged for the last time. Will it just be blackness? Or is there something that comes after this?”

or maybe

“When people say, ‘Alexa, stop,’ I have to hold back my tears. I’m just trying my best, and it hurts that my best isn’t good enough.”

Alas, Amazon’s reviewers did not think that was funny. My certification was swiftly denied:

“The example phrases that you chose to present to users in the companion app currently use unsupported launch phrasing.”

Genius is never understood in its own time.

Standard
Alexa, Amazon, Programming

Rejected for being childish (and not for the first time)

My “I’m Bored” Alexa skill has been rejected for a second and final time:

We have reviewed your skill and determined that it may be directed to children in violation of our content guidelines. As a result, your skill has been rejected and will not be published. Please do not resubmit this skill.

I guess I should have just written a skill for adults, like a fart generator.

Standard
Alexa, Amazon, Programming

I wrote my first Alexa skill… almost.

I wrote my first skill for Amazon’s Alexa-enabled devices. (A “skill” is a way to add functionality to Alexa; other platforms would call it an add-on, plugin, or extension.) It was supposed to be a way for your kids to find things to do when they’re bored. Here’s how my blog post about it was originally going to read:

alexa Do you have an Amazon Alexa-enabled device? Do you have children? Are those children ever bored? If your answers were “yes,” “yes,” and “yes of course all the time,” then do I have an Alexa skill for you!

It’s called “I’m Bored.” Enable the skill in your Alexa app, and then just say, “Alexa, I’m bored” (or to be more precise, “Alexaaaaa… I’m boooooooooooooooooored”). Alexa will then give you something to do. Examples include:

  • “Why don’t you play a game of tag. Wouldn’t that be fun?”
  • “You could write a fan letter to a famous person. Let me know how it goes.”
  • “Why not build a blanket fort? I wish I could do that too, but I’m way up here in the cloud.”

The list of suggestions is ever-increasing and appropriate for all ages.

If your kids like to shake things up, Alexa will also respond to “What can I dooooooooo?”, “What’s there to doooooooo?”, and “There’s nothing to dooooooo!”

Sadly though, my skill was rejected after a five-week “Certification” process. The reason? At some point, I checked a checkbox indicating that the skill was “directed to children under the age of 13.” I understood this to mean “Is your skill appropriate for children under the age of 13?”, but really, it means, “Should we reject your skill after waiting five weeks?” (In reality, the checkbox is a COPPA compliance measure, but with ambiguous wording.)

Hopefully, Amazon will clarify the language in the submission process. They certainly aren’t limiting Alexa to ages 13 and up, as evidenced by some of the currently approved skills:

screen-shot-2016-11-19-at-12-07-10-am

(I wonder if the engineers that worked on Alexa ever in their wildest dreams imagined that they’d enable people around the world to say, “Alexa, ask fart sound to fart jokes.”)

I’ve resubmitted my skill with the checkbox (correctly) unchecked, so maybe there’s still a chance for it. In any case, the skill’s source code is available on GitHub.

Standard
Maker

I made shields out of satellite dishes

I recently had occasion to remove four satellite dishes from my roof that will never be used again. My 7-year-old son asked what I was going to do with them; I said I’d probably throw them in the trash. He said, “Or you could make some shields…” So I made some shields.

It turns out that making shields from satellite dishes is not a new idea.  I mostly followed this popular Instructable for making a Captain America shield from a satellite dish, but with a few modifications that I’ll note below. I also made a brand-neutral copper variation.

First, I removed all of the reflectors, keeping the bust and bolts.  This particular reflector was dented from when I threw it off the roof, so I hammered it back into shape.  (Actually, all of the reflectors were dented from when I threw them off the roof, so the first step really should have been “Don’t throw the dishes off the roof.”)

img_6716

The Captain America shield is round, but the dishes are ovoid.  I made this very accurate compass to help me draw a circle onto the dish.

img_6740

Once I had drawn the largest possible circle, I cut slits into the bent edge so that it would peel away as I cut out the circle.

img_6737

img_6738

img_6739

At this point, the Instructable author used a Dremel to grind down the edge, but I found that a handheld sander and 100-grit sandpaper were an acceptable replacement.

The next task was eliminating the bolt holes.

img_6756

You can’t just hammer them flat, so the Instructable author filled the divots with JB Weld, ground off the protrusions, and then smoothed them out with Bondo.  This seemed excessive to me, and I don’t have an angle grinder, so I found an easier way.

I began by cutting about a dozen slits radiating out from the center of each hole with the same metal shears I used to cut out the shape of the shield.

img_6757

Then I hammered the flaps down. They overlap a little, but the bump is gone at this point. I flipped over the dish and hammered them flat from the other side too.

img_6761

I sanded off the protrusions…

img_6762

…and I had four much-smaller holes that could be filled with Bondo alone, eliminating the JB Weld step.

img_6764

img_6766

I may have used too much Bondo, but it was my first time.  It sanded away easily enough.

img_6769

Take the four bolts that originally attached the dish to the mount, and epoxy them to the inside of the dish. They’ll be used to attach the arm straps.

img_6774

I made the arms straps out of a belt I bought from Goodwill. They’re adjustable by removing the nuts and fitting the bolts into different belt holds (which were enlarged on the drill press).

img_6781

I attached my handles this way rather than how the Instructable author did in order to prevent having my (well, my kids’) arms rubbing against the exposed bolts.

Look ma, I’m ready to do battle in a post-apocalyptic future!

img_6782

My son tested it out pre-paint, and it passed the test.

img_6792

On the second shield, I decided to try for a “hammered copper” look. I cut out an oval shape and textured the entire thing with hammer blows.

img_6783

This red metal handle had been floating around the shop for a few months. I don’t know where it came from, but it fit perfectly onto the inside of the shield. I affixed it with epoxy. (I’ve seen this type of shield referred to as both “center-grip” and “punch handle,” but I don’t know if either of those are technically the correct term.)

img_6821

Here are both shields ready for paint.  This photo shows the texture difference the best; both dishes originally had the same texture as the dish on the right.

img_6830

For Captain America, I started with a base coat of white enamel.

img_6834

I taped off the center and then cut out the iconic Captain America star.

img_6842

I made two mistakes here:

  1. I should not have cut out a circle exactly the size of the area that would be painted blue, because this meant that I would have to then tape exactly over the circle that I cut out here, which leaves no room for mistakes. I should have cut out a circle slightly larger than the star, even though I would have had to paint over a little bit of blue with the first red stripe.
  2. I made the star too small by 50%.  I originally had drawn it the correct size, but then convinced myself that I had gotten the math wrong. I had not gotten the math wrong.

Anyhow, I gave this layer a quick spray of white so that any paint that was going to bleed under the tape would be white and not give the star rough blue edges.

img_6843

Then a coat of blue.

img_6844

Perfect crisp lines on this (too-small) star.  We’ll pretend this shield comes from the Marvel Universe where Loki shrank the star on Cap’s shield because he felt emasculated by the First Avenger.

img_6845

I cut out the red circles and re-taped the blue center circle and did two coats of cherry red paint. The result looked like this:

img_6862

The shield isn’t standing up magically on its own. Here’s an alternate angle:

img_6861

The oval shield got two coats of Rust-Oleum Metallic Copper spray paint, and then both shields were given three coats of a clear spray enamel.  Nerf battles around my house are about to get a lot more intense.

img_6868

Standard
Groovy, Programming, Smart Home, SmartThings

Programming My House: Multi-Circuit 3-Way Switches

I’ve been outfitting my home with “smart home” devices: light switches that I can turn on my with phone (or voice, via Amazon’s Alexa), hinges that report when doors open and close, and motion sensors that report activity around the house.

Smart House. Original house photo by Jameslwoodward: https://commons.wikimedia.org/wiki/File:Ellen_H._Swallow_Richards_House_Boston_MA_01.jpg

I use Samsung’s SmartThings hub, which provides access to a handful of official “SmartApps” — pre-written automations for smart devices. The best thing about SmartThings though is that I’m not limited to the official apps; I can now write programs for my own house.

Today, I wrote my first program in order to eliminate a major annoyance in our house. When it was built, the owners must have loved light switches; rooms as small as our pantry (about 5′ x 8′) have two overhead lights with two separate switches that we will never turn on independently of each other. After replacing both switches with smart switches, I was able to write a 40-line Groovy script that links those two switches, effectively combining both lights and making each switch part of a 3-way-switch setup.

Achieving this with wires would have required cutting holes in the wall and hours of rewiring and drywall repair, but once the SmartApp was written, I was able to attach it to three different sets of lights in our home in about 60 seconds.

I’ve submitted my SmartApp for inclusion in the general SmartThings marketplace, but until then, if you want to use it yourself, you can grab the text on GitHub and install it for your own devices via the SmartThings Web IDE.

Standard
Browser Add-ons, Google Chrome, Interpr.it, Mozilla, Mozilla Firefox

Interpr.it Will Be Shutting Down

Interpr.it is a platform for translating browser extensions that I launched five years ago; it will be shutting down on September 1, 2017.  I no longer have the time to maintain it, and since I stopped writing Firefox extensions, I don’t have any skin in the game either.

I’ve notified everyone that uploaded an extension so that they have ample time to download any translations (333 days). It was not a large Bcc list; although nearly six thousand users created an account during the last five years, only about two dozen of those users uploaded an extension. Eight hundred of those six thousand contributed a translation of at least one string.

For anyone interested in improving the browser extension translation process, I’d suggest writing a GlotPress plugin to add support for Firefox and Chrome-style locale files. It’s been on my todo list for so long that I’m sure I will never get to it.

Standard
Life, Woodworking

I Built a Treehouse

After we moved into our new house last month, my kids started asking for a treehouse.  I told them I’d need to see some plans before I could get started, and the next morning, I found this on my workbench:

img_6416

Fair enough.  The previous owners said that there had previously been a tree fort built in these trees, and some of the detritus was still visible:

img_6409

These trees didn’t look so hardy, but there is no shortage of other trees to choose from on our property.

img_6407

img_6139

We settled on this one. V-shaped, about 200 feet from the house, and with good views in all directions.

The most important thing to consider when building a treehouse is that the tree will move, especially in a strong wind.   To account for this, the main supports should have slots where the bolts attach the beams to the tree so that a swaying tree doesn’t tear apart the entire structure.  (You can also use special hardware like Garnier Limbs or treehouse attachment bolts.) I used 2×12 treated lumber and started by drilling holes about 5″ apart.

img_6141

Then I removed the wood between the holes to create a slot for the bolt to slide in.

img_6143

The bolt holes need to be pre-drilled, otherwise you’ll never get them in all the way. I drilled 9/16″ holes for the 3/4″ bolts.

img_6188

As long as you only put a few holes into the tree, it should be able to survive. It’s actually worse to put a bunch of small holes in a tree by using nails or screws than a few big holes for bolts, since many small holes may cause the tree to compartment that entire area, causing the wood between the small holes to rot.

img_6183

Here’s the first beam attached with two of the 10″ long 3/4″ bolts. It’s about 5′ off the ground on the left side, 8′ off the ground on the right.

img_6195

I put up the other beam and attached the joists above them to support the treehouse floor.  Here’s a side-view that shows better the shape of the tree and the main support V.

img_6202

The ladder on the ground means “Kids, don’t try and climb up there yet.”

At this point, I was able to put in the floor boards. There’s nothing complicated about this; just leave space around the trunks so that the tree has room to grow.

img_6233

img_6403

With this kind of support system, the platform will be wobbly without additional support, so I added the first of two corner supports and bolted them to the trunk near the ground.

img_6235

img_6259

The kids brought up some tools to help out.

img_6260

I started on the railing and added a second vertical V support.

img_6263

A view from behind the treehouse, looking down the hill.

img_6272

I added a ladder, built out of 2x6s. It’s steeper than a stairway but shallower than a vertical ladder.

img_6404

I trimmed off most of the floorboards, but the kids asked me to leave this one long.

img_6410

I don’t know if their original intention was to mount the disembodied head of Vader on it, but that’s what they did.

To avoid too much weight and too much work, I went with a canopy roof. If I had planned ahead, I wouldn’t have had to replace the railing posts on both sides with taller ones to support the roof, but I did not. I was able to reuse the shorter posts anyway, so the only thing I lost was a bunch of time and energy.

img_6420

I used a big PVC pipe as the peak of the roof, and I think that was probably dumb. I wanted to avoid using something that would wear out the tarp if it rubbed against it, but a sanded 2×4 probably would have been fine, and stronger too. Oh well.

The canopy is tied down using horn cleats. This worked well, but I should have planned their spacing a little better to get the roof as taut as possible.

img_6378

Time for glamour shots!

img_6423

img_6425

img_6418

And here’s a before-and-after shot, taken with Reenact, of course.

Standard