Category: Geek

ChatOps: Snack Preview Script

November 15, 2015 » Geek

One of the things we’ve built at Pack is Snack, an iOS app which shows users five great dog photos every day.

Ideally, each Snack would be thematic, and curated. However, curation doesn’t always get done. Either no theme is apparent, or we just don’t get to it in time.

When there is no curated snack, we draw from our Editors Picks, a collection of the best dog photos available. This gives us quality content, even when we don’t have the chance to pick all five by hand.

There is a downside to this though. Some of our editors picks are specific to an event or time period. Like Christmas or Halloween photos. These wouldn’t be very good in a Snack in the middle of May.

So how do we balance the light editorial touch while making sure the random snacks are cohesive?

My solution was a preview injected into our chat. Every day a script grabs tomorrows Snack, makes a composite, and sends it into Slack for us to review. If we see something is off, we jump into the admin and fix it.

It’s fairly brute force, but a good example of centralizing tools around chat, which is something we try to do. First we get the photo information, then we download each photo. We take those and use ImageMagick to create a captioned composite. Finally, we upload that to S3 and send the link to Slack.

This first listing is pretty simple. We just send a request for tomorrows Snack JSON from the public API. You might wonder why we don’t just set day_requested to tomorrow, but the API doesn’t support that, and neither does the logic of the app. This runs on a cron job which mails failed runs to us using cronic, so we call raise_for_status() to explicitly fail on bad HTTP requests.

This next section shells out to download each image into a temporary file. Order matters in a Snack, so we use a counter instead of taking random filenames.

ImageMagick is a powerful suite of tools, and in the next block we use the montage command to stitch our photos together.

-title, as you might imagine, lets us write some title text onto the composite. -geometry specifies the size and spacing of each image, 300px square, with 20px of vertical offset from the title. Lastly, -tile lays out the images in a 5 by 1 grid instead of stacking them in the default method.

tinys3 is an awesomely light API to S3 uploads, and then we use the Slack Incoming Webhook integration to send the message to chat.

All in all a simple, effective piece code that drops needed information into our chat every morning. Here’s the whole listing for a complete picture.

And here is an example of a random Snack that needed correction. Problem solved!

Many thanks to tinys3 and requests.

$20 Android Dev Phone

October 6, 2015 » Geek

I’ve been doing a bit of Android dev work lately, just tinkering mostly, and I needed hardware to test on.

Following the advice of local Android guru Mark, I just went to Amazon and bought something cheap running at least 4.0. What I ended up with was a Verizon prepaid LG Optimus Exceed 2

The $20 Dev Phone

The hardware is decent, especially for a $20 phone. I’ve not used it a ton yet, but I would say this would almost be a tolerable daily use phone. Camera sucks, but who cares.

Here’s how I got it set up.

Skip Activation

Right after boot, you can skip activation with this sequence:

  1. Volume Up
  2. Volume Down
  3. Back Button
  4. Home Button

Source: XDA

Developer Mode

Go to Settings > General > About Phone > Software Information then tap Build Number seven times.

You should find a Developer Options in your main settings now.

There’s one more step though on OS X. When connecting to USB, you only trigger debug mode by choosing Internet Connection > Ethernet for the USB connection method.

Use ethernet.

Source: Stack Overflow

Root It

The internet would have you believe that rooting your Optimus Exceed 2 is super easy. For me, it was not. There is a one-click guide but I had to fall back on the original set of scripts to make it work, which took a couple tries.

But it worked!

Look! SuperSu!

Conclusion

I’ve not actually used it for a lot of development yet, but I’ve loaded up some apps with the Play store and it’s reasonably responsive. I like it.

Tags:

You Should Be Using Redis

September 10, 2015 » Geek

Today I gave a talk at HDC15 entitled, You Should Be Using Redis

It covered all the basic data structures and many commands, as well as replication, sentinel and cluster. I had a great time even though I was terrified.

Unfortunately, near the end of my talk Keynote froze and I lost the recording of the slideshow and audio, so I don’t have that to share.

Instead, here are the slides, as well as slides+presenter notes. Hopefully my notes don’t contain anything embarrassing.

You Should Be Using Redis
Download Slides | Download Notes

Here are some links I used to create this talk;

Thanks for having me HDC! If anyone else in Omaha/Lincoln wants to hear a ~45 minute talk about Redis, let me know.

ಠ_ಠ Keyboard Button

August 26, 2015 » Geek

The other day I was looking at keyboard stuff and decided to order some arrow keycaps for my keyboard. They also had one with the look of disapproval face on it, so I bought that too.

I popped it onto my Print Screen key, which maps to F13 in OS X, then I wrote an Automator service to copy/paste ಠ_ಠ when F13 was pressed.

I have never written AppleScript before, so the result was kind of wonky. It worked in some inputs, but not in others.

Then, Alex pointed out that Alfred workflows can be triggered by global hotkeys. What can’t Alfred do?

A quick workflow later and my ಠ_ಠ key was working like a dream.

ಠ_ಠ Workflow

You can grab the workflow here, if you want. I bet you could figure it out for yourself too though.

ಠ_ಠ

Updating S3 CORS With Boto

November 17, 2014 » Geek

Sometimes you don’t have access to the S3 console, but you do have keys for a bucket. If you need to change CORS for that bucket, it turns out you can. Boto has API methods for this.

Tags: , , , ,