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
OpenSCAD, Programming, Woodworking

I Built a Tilt-Out Trash Can Cabinet

Just looking for the plans to make this? You can get the PDF plans for this double tilt-out garbage can cabinet on Etsy or download the SketchUp file for free.

I’m going on a work trip later this month, and Christina asked me if I would be able to build something to hide the kitchen trash and recycling cans before I leave (and before her mom visits). Challenge accepted!

We brainstormed and came up with a tilt-out cabinet design.  The first thing I did was model the cabinet in OpenSCAD. We hadn’t bought any garbage cans yet, so I made it customizable; I could specify any number of cans of any size, and the model would adjust and print out a cut list for me to bring to the lumberyard.

The script is available at on GitHub, and as you can see, it can even animate the tilting mechanism:

garbage-cabinet

We settled on a two-can design (one for trash and one for recycling), but we did contemplate more… grandiose… ideas.

animated

The sides and bottom of the cabinet were cut from one sheet of sanded plywood. I don’t have a track saw, so I made do with a circular saw and a straight edge.

img_6311

After making these cuts, I finally ordered a dedicated fine-tooth blade for my circular saw to avoid tearout the next time I need to cut nice wood without a table saw.  A 24-tooth blade is fine for 2x4s, but not for any visible edges on furniture.

The first thing I built was the part of the tilting door that holds the cans to make sure that the spacing and measurements were right.

img_6312

img_6314

The spacing and measurements were right.

I cut the sides and center of the cabinet and then used a biscuit joiner to cut slots that will be used to attach the top with tabletop fasteners. This is similar to how I build our kitchen table, and this cabinet will be stained and painted to match.

img_6316

I used my 90º clamps to hold the boards in place while I joined them with pocket screws.

img_6317

img_6318

Oops. It’s been a while since I’ve used pocket screws, and I forgot that it matters how long they are.

The center divider was joined with regular 2.5″ screws straight up the bottom.

img_6320

img_6321

This is how the cabinet bases will sit in the box. They sit closer to the center board than the side boards because the face frame will take up more space on the ends (where the board is flush with one side of the plywood) than in the middle, where the board is centered.

The face frame is 1×2″ poplar and pocket screws.  I used poplar because it’s a cheap hardwood (although not too hard), and it takes paint well. It’s the same wood I built the apron of our kitchen table out of.

img_6322

img_6313

The cabinet top is made up of three red oak boards joined with biscuits and glue. These boards were left over from last year’s table build, so it will match exactly.  When we moved in, I inherited a powerful jointer from the previous owner, so I was able to use that to square up the rough side of each board rather than using a router and a straightedge — major timesaver.

img_6326

Here’s the top, cut to length and width and then sanded smooth. My new saw blade hadn’t come yet, so I had to cut these by hand. I should probably order a new handsaw too.  It’s about 18″x33″, and sanding went a lot quicker than the 40″x84″ kitchen tabletop. I would say 83% quicker.

I stained the tabletop with Varethane’s Kona stain.

img_6327

The cabinet doors are more 1×2 poplar with a groove on the inside to accept beadboard panels.  Here’s a shot from behind after I nailed and glued the cabinet doors to the tilting bases.  In the background, you can see a mystery bag, a computer desk, my shop treadmill, and a “telephone chair” that I’m going to refinish.

img_6360

img_6350

There’s 1/8″ space around each door, but I should have left an additional 1/8″ or at least 1/16″ on the bottom to allow for the space the hinges are going to take.  It worked out in the end though, just a little closer than I would have liked.

Here’s the top after two coats of polyurethane and the cabinet after the first coat of paint (Sherwin Williams Creamy White).

img_6363

img_6375

I attached the doors with hinges at the bottom and added a stop block to each side of the middle divider so the doors can’t fall all the way open. They stop at about 40º from vertical, leaving just enough room to remove the trash cans.

img_6376

These spacers in the back ensure that the doors sit flush with the face frame. Since the hinges aren’t mortised in, they lift the fronts of the cabinet up about 3/16″, so the backs needs to be lifted accordingly.

img_6369

Tada! The handles match the arts and crafts cabinet in the next room, so this piece really brings the whole house together.

img_6370

Double tada!

After using it for a couple of days, it’s clear that I’m going to want to add some sort of soft-close mechanism. Other than that, I’m very happy with how it turned out.  It was my first time building my own cabinet doors, my first time using a jointer, and the last time I’ll ever have to see garbage cans in my kitchen.

Update: Here’s a gallery of finished cabinets from readers like you. If you use my plans, send a photo of your finished project to me at cfinke@gmail.com so I can show it off here!

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Twist-In Shelf Supports

In today’s “shake it up baby” news, I’ve printed some hard-to-find twist-in shelf supports.

The shelves in our new living room have vertical metal tracks that don’t just accept a push-in support clip; the support must be turned 90º in order to interlock with the track. These supports aren’t sold at any of the national hardware store chains, and the only place I could find them was on another frustrated homeowner’s Shapeways account. I recreated them (and beefed them up a bit) so that I could share the model here.

img_6382

twist-in-shelf-support

The SCAD script is available on GitHub, and the part can be customized and downloaded on Thingiverse.

Standard
3D Printing, Maker, Woodworking

This is a post. It’s a post about a post.

We just moved into a new house, and the 20-year-old signpost is showing its age. It had deteriorated at the bottom, so it was no longer set in a hole and was just leaning against a tree.  I decided to restore it and make use of a gift that the previous homeowners had left us.

Here it is on my workbench awaiting some TLC.

IMG_6077

I planed the hanging board and the vertical post to clean up the faces. The horizontal post fell apart in my hands when I removed the bolts, so it went in the trash.

Here are the post and hanging board after being planed on each side.

IMG_6081

I used the wood from the old vertical post to make the new horizontal post (since the bottom 18″ was unusable, it wasn’t long enough to be reused vertically). I found an abandoned 10′ post in the backyard, so I recycled it into the new vertical post for the sign.

IMG_6092

I cut a lap joint in the post and sanded off all of the old paint. Here’s a before/after shot (taken with Reenact, of course).

IMG_6095

Here’s a shot of the lap joint in the horizontal post after I added some spar urethane to both posts.

IMG_6106

One last dry-fit before final construction:

IMG_6107

I chamfered the edges of all of the posts on the miter saw to match the original; this should help prevent water from soaking into the top of the vertical post, and it looks nice too.

IMG_6109

I removed all of the rust from the chain and eye bolts using a vinegar/salt solution followed by a water/baking soda solution. It worked way better than I expected.

IMG_6113

If I had known how well the rust removal would go, I wouldn’t have bought new bolts to join the posts.

IMG_6112

Chains attached.

IMG_6118

The previous owners of the home had bought some ceramic house-number tiles in Italy but had never been able to put them up. Rather than just gluing them to the wood, I wanted a method that would be reversible if I didn’t like the result or if I made a mistake, so I designed and printed some hold-down clips to attached the tiles to the hanging board.

IMG_6131

It was tight getting the tiny little galvanized nails tacked in without chipping the tiles, but half an hour with a nail set (actually a bolt with a concave point, since I couldn’t find my nail set) did the trick.  There is some space between the tiles and clips to allow for wood movement.

IMG_6135

I hung the numbers up and trekked down the hill to plant the post.

IMG_6136

Tada! Now the UPS driver will know where to bring our Amazon orders.

IMG_6138

Standard
3D Printing, Maker, OpenSCAD, Programming

Create LEGO-compatible Angle Plates with LEGO.scad

LEGO Angle PlateIn response to a comment here, I wrote the first OpenSCAD module for generating complex brick shapes using my LEGO.scad project.

LEGO.scad is great for creating bricks and wings of all shapes and sizes, but it isn’t suitable for making complicated shapes like angle plates. LEGO sells 90º angle plates (pictured); the new module can generate plates with orientations between 0º and 100º.

This is the default output: a 90º plate with both sides 2×2.

Here’s one with an angle of 45º and different size sides:

Here’s the underside of one with an angle of 100º, a 2×3 base, and a 4×1 overhang:

To generate your own plates, check out the LEGO.scad repository and call the angle_plate() module in OpenSCAD. Feel free to share your creations in the comments below.

Standard
PHP, Programming

Export iMessages and SMS conversations as HTML

A couple of years ago, I explained how to get instant message conversations exported out of iChat as HTML files. Now it’s 2016, and Messages has replaced iChat, and iMessages have replaced all interpersonal communication. So how do you get HTML transcripts of your iMessages and text messages? Here’s how: with my new OSX Messages Exporter script.

The script exports all of your text/iMessage conversations from Messages (including group chats) and generates HTML files for each conversation. Here’s a screenshot of the HTML file generated for a iMessage conversation between me and my brother:

Screen Shot 2016-06-20 at 10.15.35 PM

And here’s what a group conversation looks like:

Screen Shot 2016-06-20 at 10.22.55 PM

(For a look at the actual HTML, see the example.html file in the repository.)

I’ll admit that there are a number of existing solutions for exporting conversations out of Messages, but mine has some distinct advantages over them:

  1. It supports group conversations.
  2. It generates human- and machine-readable HTML.
  3. It saves all attachments.
  4. It uses contacts’ names, not just their phone numbers.
  5. I wrote it.

If you want to give it a spin, download it from GitHub and run

./messages-exporter.php --help

from the command line for the current usage instructions.

Standard
Unpredictable Image Filenames, WordPress

New WordPress Plugin: Unpredictable Image Filenames

I’ve written a new WordPress plugin to help protect uploaded images from being accessed just by guessing the URL.

Many cameras and smartphones number their images in a predictable format. For example, iPhones use the format IMG_0001.jpg. If you include IMG_0345.jpg in a blog post, an unsavory third party could start regularly trying to access IMG_0346.jpg, attempting to view the image before you publish a post containing it.

Or, maybe you have a private blog that you only allow family members to read. Not all “private blog” plugins are able to require authentication to load images from /wp-content/, so the same unsavory third party could just start guessing URLs like /wp-content/uploads/2016/05/IMG_0001.jpg, hoping to eventually get a hit. 9,999 requests would enumerate every possible image from an iPhone for each month, almost definitely allowing an unauthorized person access to your photos.

The Unpredictable Image Filenames plugin for WordPress renames image files to a sufficiently unguessable name when you upload them. For example, IMG_0345.jpg could end up as 334AB1E8-28AB-4BE1-882D-3C112E95F055.jpg, and IMG_0346.jpg could be renamed A67C9CF9-0BB5-4FB4-AD03-DCB294F853EC.jpg. Try and guess that!

You can install Unpredictable Image Filenames from your WordPress admin plugins screen, download it from the .org plugins directory, or view the source on GitHub.

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Baby Gate Support

In today’s “No, don’t go up there” news, I’ve printed a custom baby gate support.

IMG_4384

Based on a design by Thingiverse user Printed_Solid, this support allows a pressure gate to be used against a post without attaching a wall cup, which would leave a permanent screw hole. I updated the original design to have longer and thicker corners to prevent strong children from pulling it off of the post, and the entire part is customizable to fit your specific post.

The SCAD script is available on GitHub, and the part can be customized and downloaded on Thingiverse.

Standard
OpenSCAD, Programming

Animating the Solar System with OpenSCAD

OpenSCAD is my language of choice for designing objects that will be 3D-printed, but I just recently learned that it also supports 3D animation.

To familiarize myself with this feature, I decided to animate the movement of the planets in our solar system. Here’s a GIF excerpt of the animation generated by OpenSCAD; it covers about 2.5 Earth years:

solar-system

Neat, right? The axial tilts and orbital periods, speeds, and inclinations of the planets and moons are all accurate, but for visibility purposes, I scaled the size of the planets up 20x relative to the size of the sun and reduced the distance between them by 98%. The relative positions of the planets are also reasonably accurate for March 2016.

The script is available on GitHub; let me know in the comments if you’ve ever used OpenSCAD’s animation feature and what you made with it!

Standard
3D Printing, Games, Maker, OpenSCAD, Programming

Today’s Functional Print: Board Game Piece Bases

In today’s “do you think this is some sort of game?” news, I’ve designed and printed some boardgame piece bases.

These were printed specifically for my son’s “Thomas and Friends Tracks and Trestles” game, which was missing two of its bases, but the design is customizable to fit almost any size gamepiece.

The OpenSCAD script and STL file are available on GitHub, and you can customize your own gamepiece base on Thingiverse.

Standard
3D Printing, Maker, OpenSCAD, Programming

Today’s Functional Print: Stove Knob

In today’s “customizable knob” news, I’ve designed and printed a customizable knob.

When we moved into our current house, the knob to control the stovetop fan was missing:

IMG_4271

After six months of procrastinating and one hour of OpenSCAD, it now looks like this:

IMG_4274

Now I don’t have to turn on the fan with a pliers!

IMG_4273

The OpenSCAD script and STL file are available on GitHub, and you can create your own customized knob in Thingiverse.

Standard
3D Printing, Maker, OpenSCAD

Today’s Functional Prints: Train Track Repair Edition

In today’s “I choo choo choose to fix broken toys instead of buying replacements” news, I repaired two train track components:

IMG_4114

IMG_4112

The track connector is a Thingiverse design by mrbenbritton, and the filling station support is just a run-of-the-mill dowel.

Standard
3D Printing, Maker, OpenSCAD, Programming

Today’s Functional Print: Coat Rack Pegs

In today’s “I finally unpacked my 3D printer” news, I printed some pegs for a coat rack to replace the original pegs that we lost during a cross-country move.

IMG_4113

The base of each peg is flared to ensure a tight fit into the hole, but it also has a hole in the bottom to allow it to be attached with screws. (A screw could also be added to expand the base and tighten the fit, even if it’s not necessary to keep the peg attached.)

The OpenSCAD script is available at GitHub, or you can customize it on Thingiverse.

Standard