Sam Merrell Tinkerer. Parent. ADHD. Developer.

Posts

Discovering Podcasts

I’ve never paid much attention to podcasts. Up until a few months ago I was commuting to work by train and used that time to either read books, or play games. All of that has been great and I’ve enjoyed the time I have had to read, relax, or learn something new. Recently, I’ve had to begin commuting to work which completely threw the routine I had developed.

Since I can’t really read or play games commuting, I had to find another alternative. I remembered my iPhone has a Podcasting app built in so I decided to dive in. After a bit of Googling, I came across Developer on Fire and decided to give it a spin. The very first episode I listened to was with Woody Zuill. By the time I had pulled into the parking lot, I had an idea I had learned from the podcast I wanted to share with my team.

That experience hooked me on how useful a Podcast can be. I spend so much time commuting each day and I don’t want to be wasting that time only driving. Since then I’ve been searching for a range of podcasts to listen to. Here are the podcasts I’m currently listening to.

  1. .NET Rocks!
  2. Another Round
  3. CodeNewbie
  4. Developer On Fire
  5. Developer Tea
  6. Edit Your Life
  7. Hanselminutes
  8. New Rustacean
  9. The Psychology Podcast
  10. This Developers Life

Not Just Development Podcasts

At first, I was just listening to Developer on Fire and Developer Tea but it has been great to expand that list with a few podcasts on other topics I’m interested in. For example, The Psychology Podcast with Dr. Scott Barry Kaufman is a great podcast that focuses on a range of topics in psychology. Some great episodes have been on understanding and supporting people with ADHD and learning about the concept of Grit.

Edit Your Life is also a great podcast about simplifying and decluttering your life. Hosts Asha Dornfest and Christine Koh have episodes on varying topics from parenting, personal finances and general relationship tips. I’ve found their episodes to be fun and very informative.

Really branching out and listening to more than just podcasts has been a really great and informative time. I’ll wrap this up now, but if you have any podcasts you enjoy, please let me know on Twitter!


Keeping up with JavaScript

I like JavaScript, I really do, but I just haven’t been able to keep up with the insane change that is going on in that world. Over the last several months at work I’ve been building out a project that is mostly back end work. When I have been able to do any sort of front end work, it has been in a desktop Windows application using WPF.

While working on this application I started to realize I don’t have my finger on the pulse of the JavaScript world like I once had several years ago. Things have changed since Node and NPM made it incredibly easy to write JavaScript on both the server side and client side and to distribute that code. I’ll be honest, I got a little scared when I realized I just don’t know what all the latest and greatest changes in the world of JavaScript. What’s going to happen if people find out I don’t know what the next great Flux framework is? Or that I don’t really know what all is going on with the next version of JavaScript? Is it called ES7 or is it ES2016?

All of that got me pretty worried until a co-worker of mine dropped this statement:

It doesn’t matter if you step away from JavaScript for a while. As soon as you pick it back up, the next big thing will have come out just yesterday anyway.

I still think it is silly how much things are changing and how much churn is happening, but I can take comfort in one thing. Everyone else will basically be working on the next new awesome JavaScript thing for as long as I have.


Using qDslrDashboard with the Sony a6000

Most of my posts are going to be something technology related but I do happen to have other interests. For a while now, I’ve had a Sony a6000 that I’ve been very happy with. I’m very much an amateur at photography but I find it fun and I like the images I get of my family more than the ones I can get from my iPhone. So I’ve been slowly trying to level up my photography skills. I’m definitely not over 9000 yet, but maybe one day I’ll get there.

This Christmas, I finally got a tripod and it has gotten me interested in trying to do some time lapse photography. Sony has a time lapse app but I wanted to see what other options were out there. After a bit of Googling, I came across DslrDashboard. Confusingly, the apps have been renamed to qDslrDashboard, but there is an app for just about every platform.

Since I own two iDevices, I went ahead and threw down the $10 it cost for the iOS app. At first, I was hoping to find a free option to do time lapse, but I definitely feel better giving a developer my ten dollars instead of just throwing it at Sony. Since I didn’t have my iPad right on hand, I started trying things out with my iPhone. It took me a while to figure out how to get the app to work with my phone, and honestly, I’m still not 100% sure how to get the thing to work consistently every time. Here’s what it took me to get my camera and my iPhone running the qDslrDashboard app running.

  • Go to https://www.playmemoriescameraapps.com/portal/
  • Create an account (PlayStation Network account, ugh.)
  • Go to Menu -> Applications

    Application list on the a6000

  • Select PlayMemories Camera Apps

    Application select PlayMemories Camera Apps on the a6000

  • Find Smart Remote Control app
  • Install it

I still feel pretty gross about having to create a PlayStation Network account, but there you go, all the steps to get the Smart Remote Control updated.

Getting qDslrDashboard and the a6000 working together

To get the a6000 to be controlled remotely, you have to open the Smart Remote Control application. This is as simple as going from Meny -> Applications -> Application List -> Smart Remote Control. Once you open the Smart Remote Control app, the a6000 will create a WiFi network. Simply connect your device to that network using the SSID and Password from the screen and the camera will start in remote control mode.

This is where it gets a little odd with the qDslrDashboard app.

Tap the button until it works

The first tap of the Sony Wireless button has not worked for me, I often have to press multiple times until it works. A little weird, but it does eventually work!

Once you’ve tapped the Sony wireless connection button enough times, you’ll be greeted with this screen of buttons. I don’t know for sure if qDslrDashboard defaults to using a live view, but if it does you’ll see what the camera is seeing as well. Otherwise you can tap the little Lv button in the top left corner.

To get to the time lapse portion, you need to tap the time lapse button on the right.

The time lapse button

The time lapse screen has a whole bunch of options to choose from. In the image below, I captured a sample, it then displays a bunch of information about the image you took to help you figure out what settings you’ll need to make the time lapse. I don’t know what much of that means, but one day I will!

The time lapse screen

At the most basic level, you really just need to scroll down and click the stopwatch icon. The stopwatch icon will let you configure the interval timer which is the heart of doing the time lapse.

The time lapse interval timer screen

Setting the interval timer is pretty simple, but you do have to think a little bit about it. When I first set it up, I wasn’t really reading what the screen was trying to tell me. I set a frame count and then set the interval to 20 minutes. In my mind it was going to take pictures until the 20 minutes ran out. When nothing happened for a minute or two, I realized my mistake.

The time lapse interval timer setup

If you want to have a time lapse go for a specific amount of time, you need to factor in two things. The interval, which is how long to wait between shots, and the frame count. The frame count is exactly what it sounds like, the number of frames to capture. So, if I wanted to shoot for an hour and I was taking a frame every second, I need to work backwards to get the number of frames.

If I have an interval of 5 seconds, it is going to look something like this:

(60 seconds / a frame every 5 seconds) * 60 minutes = 720 frames

So to capture an hour of time at 1 frame every 5 seconds, I need 720 frames total. This will capture an hours worth of time, I do wish qDslrDashboard had a way to say how long to capture as well, but it isn’t too difficult to figure out on my own.

After that you simply press start and the camera will start taking pictures at the interval. Easy! So how about after you’ve taken the pictures? Well, after some Googling and playing around I’ve found two different ways to use the time lapse. One is by making a gif and the other making a movie.

Resizing the images

Since the a6000 takes 24 megapixel (roughly 6000x4000), I resize the images first. This is where ImageMagick comes in handy. The script below will find all the images and use ImageMagick’s mogrify command to resize the images in place.

for file in *.jpg do;
  mogrify -resize 3840x2160^ -gravity center -crop 3840x2160+0+0 +repage $file
done

I got this from this great post.

Note: This script resizes images in place, I do this because I export the pictures from Apple Photos. If you don’t want to resize the actual image, you can add -write resized/$file before the last $file. This will write out all the images to a resized folder.

Depending on how you want the images cropped, you might want to play with the -gravity setting. This script will crop all the images directly in the center of the image. The 3840x2160^ resizes the image to a 4k resolution but will preserve the smaller of the width or height.

I’ve played around with resizing images with ImageMagick before, but the credit for this script goes to Dan Loewenherz’s great blog post Making a time-lapse on the command line using FFmpeg and ImageMagick. There are many great tips from his post, so you should go read it.

Turning the images into a gif

If your time lapse is pretty short, you can convert to an animated gif quite easily using ImageMagick. The command looks something like:

convert *.jpg -set delay 1 my-time-lapse.gif

This is the most basic way to create an animated gif from a series of images. This only works if the Jpeg files are ordered. You can play around with the -delay time and see how it turns out. ImageMagick also has a million other things you can do so take a look at the docs.

Turning the images into a movie

Once you have the images resized how you want them, converting to a movie using ffmpeg is pretty simple.

ffmpeg -framerate <some number> -start_number 1 -i image%04d.jpg -c:v libx264 -pix_fmt yuv420p <filename>.mp4

This command will take the series of images and put them together into an MP4 video file. The -c:v libx264 command tells ffmpeg to encode the video using the libx264 codec. This will encode it as an h264 video. The -pix_fmt option sets the pixel format of the video. This is the color format of the video, video players will use it to know how to display the video properly.

And with that, you will have the final product! Ffmpeg has a ton of option and is a very powerful tool, I’m certain I will have more to write about using ffmpeg to convert or create videos.

End Result

Edit: Feburary 6, 2016:

Here is a sample video I made of a sunset.


Learning Rust as a C# Developer

Choosing a new programming language to learn is difficult. What do I want to focus on? Do I want to learn something low level like C? Do I want to go all out functional and learn Haskell? What about Go? Everyone seems to be glowing about that language. Elixir? I hear Rubyists are really digging on that language, and it is built on top of Erlang! So many choices!

As you’ve probably guessed from the title, I ended up picking the Rust programming language as the language I’d like to focus on and learn about. So lets take a little bit of time to talk about why I made that choice.

A way to delve into “systems programming”

“Systems programming” feels like this mythical place of expert developers writing bare metal code to do things I can barely even understad. It is so different from my day-to-day job that it feels almost unattainable. I’ve never written anything in assembly, I can’t really read hex, and I’ve only barely tried to write anything in C. It really feels like such a daunting task to get into what seems like such a complicated topic.

Fortunatly, Rust really feels like an accessible language that could get me learning about systems programming. I can learn how to manage my own memory, how to write performant code, how to work safely with pointers and many other “low level” bits of code. For whatever reason, Rust just feels like I can jump in and actually do something. I haven’t felt that way with C or C++.

A C replacement

I swear, one day I actually am going to get around to learning C. When I do I’m going to do it the hard way. But until I do, one of the reasons I picked Rust is that it is explicitly aimed at replacing C and C++ as the programming language of choice for prople writing performance critical or low level code. I’ve started and quickly stopped learning C and I haven’t found the motivation yet to stick with it and really learn the language. I’m sure I will eventually, but I think the barrier to entry has still been too high for me.

With Rust, I have been able to get going pretty quickly in the language and start to learn bits and pieces about Rust while doing interesting things. I’m sure I could also do this with C, but so far I just haven’t had the willpower to stick with it. Rust, on the other hand, has kept me very interested and very motivated to learn the language.

No GC

Another specific reason I chose Rust was that I wanted to try out a language that does no garbage collection for me. Throughout my career as a developer I’ve worked in a garbage collected language, and honestly it is pretty awesome most of the time. But, since it is the only thing I’ve used before and I want to learn lower level programming skills, I have to learn how to walk away from garbage collection and learn how to manage memory myself.

Modern language features

As a final deciding factor, the language features that Rust provides are very compelling to me. Generics are available and I am familiar with how to use them in C#, Traits (i.e. Interfaces for C# people), pattern matching, etc. are all language features that feel very compelling and interesting to use.

So there you have it, a few of the reasons that I’ve decided to spend time really trying to dig in and learn the Rust programming language. I have much to learn and will likely be sporadically sharing what I’ve come across so far here on this blog.