I’m super excited to write this blog post. I’m always interested in new mail clients (I miss Mailbox). When I found out Polymail dropped for both iOS and Mac, I jumped on it. Apparently so did everyone else, which lead to some problems.



If you’ve never heard of Polymail before, don’t feel bad. I didn’t hear about it until super recently, myself. Polymail has a super slick UI that doesn’t waste space with stuff you don’t need. It features killer email delegation and reminders (remember when Mailbox let you put off an email until a date in the future?), get information about the person you’re talking to, and keep all this organized and synced between all your devices.




Let’s talk about the follow-ups, first. I’m a huge fan of triaging tasks. If it’s not time-sensitive, it doesn’t need doing right now. Granted, if there’s nothing else that needs doing, that logic doesn’t apply. This is super helpful for those with noisy business inboxes where everyone and their grandmother is clamoring for your eyeballs to absorb their textual essences. Sorry grandma, I’ll take a look at that chain letter tomorrow at 4:30 PM.

You can choose to follow up on a conversation using one of the preset dates, be super noncommittal and say “read later”, or pick an arbitrary date in the future, because you’re a master of your schedule and you know you have sixteen time slots open right now between today and Christmas 2018. Those voids of sadness need filling!

DesktopFollowUpReminder.gifOn the flip side, you can remind yourself to follow up with someone else if they don’t read your email. This is a neat feature, but be careful. You can very easily become “that person” that everyone in your office hates. You know which person I’m talking about: “hey did you get my email?”

With great power comes great responsibility. Can I trust you to not abuse it?

Following Up



When you’re writing your digital prose to the person on the other end your email exchange, knowing who the heck they are is important. It’s even more important in cases like candidate screening or figuring out if the person is real, or not. Next time you get resumes for a job application, use their information Polymail will glean about them on your behalf.

The Downside of Cloud Sync

While writing this quick review and even attempting to use Polymail, I ran into two problems that I think are worth noting.

First, cloud sync is a very dangerous territory to enter if you’re not prepared. In the case of Polymail, I don’t think they were. The sign up process requires you give them access to your email accounts, which is fine. The problem here is, they do everything through their servers. The emails don’t go straight from gmail.com or outlook.com or your O365 account to the client. Nope. That’s too easy (or hard). I found this to be true when after about six hours, Polymail claimed I didn’t have new email. If only that was really the case.

That’s the tweet Polymail posted about the delays. Given I haven’t received more than one round of emails, I’d say it’s more than a delay.

My second problem is moving email accounts from one Polymail account to another. I wanted to use Polymail for work, too, so I created a work Polymail account. I also wanted to get my work email on my personal devices using Polymail. My routes were to use my work Polymail account everywhere else or move my work email to a personal Polymail account. I opted for the latter but ran into an issue.

My work email address is stuck in some sort of “account will be deleted” state that won’t progress. I didn’t think it’d take hours to delete an account, but I guess so. In the mean time, no work email via Polymail.

End of the Day

Originally I was pretty hesitant to jump in because of cloud syncing issues. This morning, I checked on it and everything seems to work well now and I was no longer getting the error in adding my work email account. So with all that being said, I’d definitely recommend Polymail.

You can pick up Polymail from polymail.io for the Mac and the App Store for iOS.

Live Streaming with Hardware Acceleration using a Raspberry Pi and RTMP/HLS

If you’ve been following my blog post series on the development of my ever so useful cat cam, powered by a Raspberry Pi, you’ll know I’ve made several attempts at a more stable and scalable streaming solution for my Cat Cam. As it stands today, I’ve been using Motion. While it’s a decent tool, Bandwidth has been my primary concern and I’d like to be able to stream real-time without sucking up what measly bits my ISP gives me if more than a few folks decide to show interest.

So far we’ve tried ffmpeg => ffserver and that turned out exactly how you probably thought it would. Next, I tried swapping ffserver with an Nginx-powered RTMP server. While not an entirely fruitless endeavor, there were some blockages that I just couldn’t get past.

I received a suggestion from a colleague to fire up the Raspberry Pi’s hardware encoder/decoder. Up until yesterday, I didn’t know this was a thing. Shame on me for not looking into it. So that’s what we’re going to cover in tonight’s post: taking some of what we learned from our first RTMP attempt and make the hardware do all the work. With any luck, we should see some real perf gains, possibly enough for live streams to start instantly (which would make web players happy).

Since I felt like including it here would deviate from the purpose of this post too much, I wrote up how to Add RTMP Support to Nginx if you installed it via apt-get like me. If you’re in that boat, take a moment to read over that post then come back to this one.

Setting up ffmpeg to use hardware H.264 encoding used to be a fat challenge, but they’ve since added support to the official codebase. If you followed my original ffmpeg post, you’ll have a recent enough version that includes this code, but we’ll still need to compile it.

What we’re looking for this time is the OpenMAX IL (Integration Layer) acceleration module.

[email protected]:/usr/src/ffmpeg $ sudo ./configure --enable-omx --enable-omx-rpi
sudo make
sudo make install

That’ll take some time, as I’ve said before. You’ll have enough free time on your hands to get make something to eat. Come back in an hour or so and it should be done.

From this point forward, we’ll be starting ffmpeg similarly to how we did it before but with a slightly different codec.

ffmpeg -i /dev/video0  -framerate 30 -video_size 720x404 -vcodec h264_omx -maxrate 768k -bufsize 8080k -vf "format=yuv420p" -g 60 -f flv rtmp://example.com:8081/hls/live

Running this, my Raspberry Pi was able to encode in REAL TIME which made me quite happy and only used roughly ~25KB per second of bandwidth.

I confirmed VLC is able to play the stream, which is excellent, and there are no lag or jitter issues. It’s about 10-15 seconds behind live, which is totally fine.

I was able to set up an HTML5 player using tools from Bitmovin. I’m not entirely happy with this setup, though, as the player isn’t free and only HLS is supported, right now1. In my next post I’ll cover a new idea that came to mind when looking into the coolness of Ruby on Rails 5: WebSockets.


It takes a lot for a movie to convince me to write a blog post about it. I generally don’t do movie reviews, and this isn’t one. What this is, is a reflection; a documentation of experiences and feelings. For the next few minutes, I want to pour myself out just a bit.

The Revenant was an impulse buy. I was strolling through Target and saw it on the shelf almost by happenstance. In the most ironic fashion, I quickly checked to see if it was cheaper on Amazon. To my surprise, it wasn’t, so I grabbed it. With my upcoming foray into 4K, I grabbed the 4K UHD + Blu-Ray + Digital HD combo pack for about $25 plus tax.

After grabbing some lunch to go, I promptly shuttled myself home and poped the disc into my PlayStation 4. I had heard good things about this movie and I wanted to obtain the highest quality experience I could muster with what I had. This meant grabbing my Bose noise-cancelling headphones and plugging them into my PlayStation4 remote and opting to pipe all audio through them.

Best. Idea. Ever.

(some mild spoilers ahead)

The Revenant | © 20th Century Fox
The Revenant | © 20th Century Fox

From the very beginning, I knew I was going to enjoy this movie. I will quickly get enthralled with any kind of atmospheric exprience and I feel The Revenant definitely delivered.

The last time I felt my emtions match that of the character on screen, I cannot recall. This film isn’t just about fur trapper in the vast and monolithic landscape that was the unexplored west of America. It’s not survival movie. Leonardo DiCaprio’s character isn’t battling nature.

This movie is a battle of man. The struggle between human nature and nature’s humans. As the song goes this land is your land, this land is my land, from California, to the New York Islands… except it wasn’t. This land was vast and untouched. Scar-free. Void of the cancers that man inflicted on it.

It’s also man versus himself. Man versus his inner corrupted soul. Man versus his desire for more at any cost. Man versus his bloodlust for alpha status.

Throughout the journey on which the film takes you, a feeling of sadness sets in and you start to feel overwhelmed with the chaos unfolding. The fight against (definitely not with) nature will take its toll on you, the viewer.

The Revenant | © 20th Century Fox
The Revenant | © 20th Century Fox

When you start to feel what the characters are feeling… when you find yourself frustrated and wishing for nothing more than for Hugh to pick himself up and keep going… you quickly realize that’s not how this works.

Fighting against man is something man will do forever. Man’s mind is narrow, shallow, and full of arrogance. If they’re not careful, man will consume itself.

You’re in a battle with yourself and the world around you (in a metaphorical sense); there isn’t an endless supply of energy and motivation. There’ll come a time when you feel defeated.

That’s when you choose what’s most important to fight for. Do you fight against one or fight for another? Where do you think your real hidden strength lies?

Coming back to nature for a moment, in this context, nature is the helpless victim in this battle. Nature will fight back, but can only fight for so long. The imfamous bear scene is a pure and gritty example of this. This isn’t a bear attacking the character, this is nature defending itself.

Until it can’t. Man has won… but at what cost?

The Revenant | © 20th Century Fox
The Revenant | © 20th Century Fox

Weaved into the major story is a minor story about personal loss. Imagine what it would be like to lost the ones you loved to such savagery with no way to stop it. Just watching the world around you fall to pieces is enough to make anyone lose their shit. The commentary on this is: it’s real. Those who are closest to you have the most profound effect on you both when they’re by your side and when they’re gone.

By now you’re probably thinking I’m out of my damn mind. Being unaware of the complexities is one thing… to pretend they’re not there is another.

The Revenant | © 20th Century Fox
The Revenant | © 20th Century Fox

The larger message of this film is how man took over the land we call America. It was gritty, chaotic, violent, and fucking selfish. The White Man was a savage beast that stopped at nothing to get what he wanted, all the while thinking the natives were the savage ones. The hubris was overflowing. The amount of blood, tears, sadness, and anger this country was built on is enough for millions of lifetimes. The expense? Heartache. Loss. Sadness.

Director Alejandro Iñárritu is a master crasftman. The visuals are pristine, as was the land before. The entirety of the film1 was shot with all natural light. If it’s dark, it’s dark. If it’s light, it’s light. The absense of artificial atmosphere will pull you in. You’ll be in awe of the landscapes, shot mostly in Canada and Montana. The crispness of the air, the ice-cold flowing rivers, and the crunch of the soft-packed snow will stimulate your senses.

On top of the visuals, Ryuichi Sakamoto’s soundtrack does an amazing job of hitting home the feelings described above and experienced throughout the movie. I’d be surprised if you don’t feel like you need a hug after witnessing what it’s like to be alone, clinging to life, with only yourself and what drives you to keep motivation at least sub par.

But don’t take my word for it. Don’t take my word for any of it. Go watch it, yourself. Go experience it, yourself. You’ll thank me.

  1. Except for one scene around a campfire that involved some lamps to add to the fire’s light. 

Add RTMP Support to Nginx Installed From Apt

In the process of trying to figure out the best streaming solution for my cat cam, I had to deviate a bit. I combined my RTMP server for my cat cam and Web server for johnathanlyman.com into one and the latter didn’t have the RTMP module installed. This module is required for my attempts to push H.264 video and have Nginx relay it to whomever is watching, cutting down on the bandwidth of my one-to-one reverse proxy setup I have, now.

It’s a pretty straightforward process to re-compile Nginx, but there are a couple extra steps involved if you installed Nginx from a package repo. I’ll be sure to cover these. What we’re doing here is re-compiling a deb package. By going that route, we’ll adhere to the same methods in which Nginx was installed in the first place so we don’t have two competing installs.

Like my other RTMP/Nginx-inspired post, I’m using Ubuntu 16.04 (xenial), so everything will revolve around that.

Before we begin, we’ll want to make sure we’re updated and ready to go:

apt-get update
apt-get upgrade

Next, install software-properties-common if needed then add the nginx/stable ppa.

apt install software-properties-common
add-apt-repository ppa:nginx/stable

Now we’ll be able to grab the source files from the repo.

cd /usr/src
apt-get build-dep nginx
apt-get source nginx

Whatever directory you run that in is where the source and dependency files will appear. I chose /usr/src as that’s where we’ve been working in these previous posts. Mine looks something like this:

[email protected]:/usr/src# ls -al
total 1888
drwxr-xr-x  4 root root    4096 Jul  8 17:20 .
drwxr-xr-x 10 root root    4096 Apr 21 09:56 ..
drwxr-xr-x 10 root root    4096 Jul  8 17:20 nginx-1.10.1
-rw-r--r--  1 root root 1000448 May 31 19:05 nginx_1.10.1-0+xenial0.debian.tar.gz
-rw-r--r--  1 root root    2765 May 31 19:05 nginx_1.10.1-0+xenial0.dsc
-rw-r--r--  1 root root  909077 May 31 19:05 nginx_1.10.1.orig.tar.gz

Let’s move into the source folder and download the RTMP module:

cd nginx-1.10.1/debian/modules/
git clone https://github.com/arut/nginx-rtmp-module

Back up one directory and open rules in a text editor. I’m using nano. Add the module to the end of the --add-module list under the common_configure_flags or full_configure_flags1 like so:

[common|full]_configure_flags := \
                        $(common_configure_flags) \
                        --add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
                        # NEW MODULE BELOW #

Now that the module is in, let’s re-compile!2

cd cd /usr/src/nginx-1.10.1
dpkg-buildpackage -uc -b

Depending on how powerful your server is will determine largely how long this takes. I say go get a beverage and come back in a few minutes.

Once it’s done, you’ll get your set of .deb packages:

cd /usr/src
[email protected]:/usr/src# ls -al
total 16088
drwxr-xr-x  4 root root    4096 Jul  8 17:52 .
drwxr-xr-x 10 root root    4096 Apr 21 09:56 ..
drwxr-xr-x 10 root root    4096 Jul  8 17:20 nginx-1.10.1
-rw-r--r--  1 root root   23788 Jul  8 17:52 nginx_1.10.1-0+xenial0_all.deb
-rw-r--r--  1 root root    3756 Jul  8 17:52 nginx_1.10.1-0+xenial0_amd64.changes
-rw-r--r--  1 root root 1000448 May 31 19:05 nginx_1.10.1-0+xenial0.debian.tar.gz
-rw-r--r--  1 root root    2765 May 31 19:05 nginx_1.10.1-0+xenial0.dsc
-rw-r--r--  1 root root  909077 May 31 19:05 nginx_1.10.1.orig.tar.gz
-rw-r--r--  1 root root   43932 Jul  8 17:52 nginx-common_1.10.1-0+xenial0_all.deb
-rw-r--r--  1 root root   35342 Jul  8 17:52 nginx-doc_1.10.1-0+xenial0_all.deb
-rw-r--r--  1 root root  746780 Jul  8 17:52 nginx-extras_1.10.1-0+xenial0_amd64.deb
-rw-r--r--  1 root root 6627998 Jul  8 17:52 nginx-extras-dbg_1.10.1-0+xenial0_amd64.deb
-rw-r--r--  1 root root  471502 Jul  8 17:52 nginx-full_1.10.1-0+xenial0_amd64.deb
-rw-r--r--  1 root root 3806376 Jul  8 17:52 nginx-full-dbg_1.10.1-0+xenial0_amd64.deb
-rw-r--r--  1 root root  333962 Jul  8 17:52 nginx-light_1.10.1-0+xenial0_amd64.deb
-rw-r--r--  1 root root 2428032 Jul  8 17:52 nginx-light-dbg_1.10.1-0+xenial0_amd64.deb

We’ll need to remove Nginx3. As long as we don’t purge, the config files will stay in place. It never hurts to get a backup, anyway, though.

apt-get remove nginx [nginx-core]

Now let’s install our newly compiled version of Nginx4:

dpkg --install /usr/src/nginx-[common|full]_1.10.1-0+xenial0.amd64.deb

If it didn’t blow up, we’re in decent shape. To be in even beter shape, make sure your moduler was installed by running nginx -V. You should see something like the same line you added to the rules file from earlier (probably at the end):

[...] --add-module=/usr/src/nginx-1.10.1/debian/modules/nginx-rtmp-module

Since we tinkered with Nginx, mark it for version hold5 so apt-get upgrade doesn’t wipe out our changes:

apt-mark hold nginx-full

That’s all you need to do. Happy sysadmin-ing!

  1. Whichever you pick will dictate which you install. 
  2. Word of the week, it seems. 
  3. I had nginx-core installed, so I had to remove that, as well. 
  4. Pick the flavor depending on where you put the module in the rules file from earlier. If you choose a different flavor, your module won’t be installed. 
  5. To undo this, use apt-mark unhold 

The Taste of Reckoning

I’ve been waiting to review Appletieser for some time and now that sometime is Friday afternoon. In the past, I’ve been blocked by cost-prohibition and the fact that the first time I tried ordering it, Amazon sent me Grapetiser. If you haven’t read that post, yet, go do it. Now.

I found a shop in Los Angeles that sells Appletiser by the can at $2.95. That doesn’t seem like a lot, and in reality it’s about on par with some of the other beverages I purchased. The downside was shipping. It was $12 to send the can roughly 400 miles up the coast of California. I suppose this was still cheaper than driving down there and buying it in person.

When it arrived, I had to let it chill for a bit. UPS trucks don’t have A/C so I hope the fact that it was rather warm when it arrived hasn’t spoiled it.

At first smell, I notice the plesant apple scent followed by… pasta? It’s super subtle, though and might be something else masquerading as something starchy.

At first taste, I’m plesantly surprised. With how Grapetiser turned out, I was expecting Appletiser to fall somewhere in the tastes like cat litter spectrum. I’m sorry I doubted you, Appletiser.

The flavor is subtle and definitely doesn’t match the intensity of an American sparkling apple juice. This likely has to do with the different and less added sugar. I’d bet they use green apples in this beverage and if you’re an apple eater, you know they’re not super sweet but rather tart. It’s as if they took straight pressed apple juice and carbonated it. Nothing fancy.

Plus, there’s no aftertaste. This was something I was genuinely worried about and am happy to know it’s not making an appearance.

Being crisp and fresh without looking gaudy or over the top in packaging is nice to experience. It’s fancy without being fancy, and it seems to be popular enough that people drink it in multiple countries. Judging the packaging by itself, there’s some room for improvement. The can looks very similar to Grapetiser and I wasn’t a huge fan in that camp, either.

Would I drink this again? Probably. Would I pay $12 for a can? Definitely not. If I ever travel to a country that sells it, I’ll definitely be sure to grab some.