Geek gift ideas 2016

If you’re looking to buy yourself, I mean someone else some gifts for the upcoming holiday season, here are some items that I’ve found useful or handy around the house. It’s all stuff that I use and would recommend.

KMASHI 400A Peak 14.8V 800mAh Compact Car Jump Starter

It’s around $40. Our cars normally start without issue. Occasionally however, we’ve had a dead battery in an inopportune time or location and needed to call someone for a jump. Now, rather than carrying a giant jump battery in the car, we carry this.

More frequently, I use it to jump start our riding lawn tractor that often has a depleted battery (that I’ve not been able to successfully troubleshoot). I’ve had this for more than a year and used it more than 6 times without any trouble (thankfully, I haven’t needed it more than that). The convenience of it is awesome. It’s so small! Of course, it can also be used as just a USB charger. It charges with an included micro-USB cable.

Tripp Lite 1 Outlet Portable Surge Protector/Suppressor with Timer

Many Li-ion battery chargers for outdoor equipment do not recommend leaving the battery charging at all times. So, I bought this simple single outlet surge protector and timer combination from Tripp Lite.

It costs about $22. I plug a power strip into it and the chargers into the power strip and generally set it to 3 hours if I’ve used the battery powered equipment for very long. At the end of 3 hours, it automatically turns the power off (and to the entire strip) so I don’t need to worry about whether the batteries have charged too long.

Wago 221-413 LEVER-NUTS 3 Conductor Compact Connectors 50 PK

I didn’t know these existed until a year ago. While they’re a luxury item for sure, they make common electrical connections painless (for me at least). I’m sure some of you swear by the old traditional wire-nut. But, after I tried these, I’ll never go back. They make them in a few configurations that are worth looking into.


The price varies depending on what type you buy, but they average between 20 to 50 cents each.

I’ve used a lot of the 2 conductor version.

Bike Peddler Take A Look Cycling Eyeglass Mirror

Almost 1500 reviews on Amazon and nearly an average of 5 stars. These things are great. I’ve had one for 3+ years and if you wear glasses and ride a bike and haven’t liked whatever mirror option you currently use, … I love these. They’re simple and effective.

They’re around $12 usually (and you shouldn’t need to pay more than that).

Planet Bike Blinky “3H” 3-Led Rear Bicycle Light with Self Leveling Helmet Mount

PlanetBike Blinky 3H

Bike safety is very important to me. And it should be for you too. This novel little light attaches securely to the rear of your bike helmet and self levels so that it’s always pointing vertically in a reasonable direction. While you could attach it to your bike, there are better and brighter lights available for your bike that I’d recommend instead. Use this as a secondary bike light. It’s lightweight. I don’t notice its there. It’s about $20.

GMS Optical Premium Grade Comfortable Silicone Anti-slip Holder for Glasses, Ear Hook, Eyeglass Temple Tip

If you have sports glasses (I’ve got a pair of prescription Adidas sports glasses for example), you may have situations where you’d like to have a bit more confidence that your glasses aren’t going to hurtle off your face at some point due to unexpected motion, sweat, etc. I’d tried some of the bands that attach to glasses and found them distracting, especially when riding my bike (either too loose or too tight). These simple and inexpensive (around $6) holders give me the confidence to wear my glasses in situations where I was concerned about them falling off my face.

This was especially true while riding my bicycle. When I was looking down while riding (even for a moment to look at the GPS, etc.), I often had the distinct feeling that my glasses were sliding off my face. On hotter days, this was exacerbated by perspiration. No more! While I wouldn’t be brave (or dumb) enough to think that these would hold my glasses on while riding a loop on a modern roller-coaster, they perform well enough for more typical day-to-day sports. As you’ll see from their ratings, I’m not the only person that likes them.

They’re under $6.

Shacke Hidden Travel Belt Wallet w/ RFID Blocker

When traveling internationally, my wife and I always carry our passports on us while out and about (I know that some people leave them in the hotel room). I’ve tried a few different ways to carry my passport over the years, and this is my current favorite discrete carrying option. It’s lightweight and fits well in the front of one of your legs. Occasionally, you’ll notice it, but it’s not distracting. It’s got room for a few more things, but it’s not intended to carry everything; just stuff you don’t frequently need. I put spare cash, a paper map, and often our ATM card inside. Apparently, there were/are gray wallets of this, but unless you have a gray belt, it will show. By the way, this definitely requires that you wear a belt and is about $16.

Canon PowerShot G7 X Mark II (Black)

I’m sure many of you have decided that your phone takes great pictures and that’s all that you need. Fine. I accept that you’re missing out. OK, seriously. Your smart phone probably does take some great pictures. But, some images just can’t be captured by your smart phone. Occasionally, you’ll be able to walk closer to something you want to capture to emulate “zoom”, but often, you’ll find that the picture you captured isn’t the way you remembered it. This is where a nice point-and-shoot + more camera comes into play. I’ll take pictures when I’m on vacation with both this camera and my smart phone. I’m not going to bore you with a long list of features. That’s available on the web.

Here’s why I bought this model:

  • RAW mode + JPEG
  • Touch screen (tap to take a picture)
  • Size / weight
  • Pop-up flash
  • Good battery life (definitely buy spare batteries though)
  • Good bokeh (for a point-and-shoot)
  • 24-100mm zoom. Means I can take adjust zoom.
  • Can attach to my tripod (or mini-tripod) and my Really Right Stuff equipment
  • Easy to adjust f-stop/aperture, etc.

It’s by no means an inexpensive camera. However, I do not foresee any reason I’ll want or need to replace it any time soon. So, for now, I consider it a long term camera.

I would strongly recommend you buy a backup battery, regardless of the camera you choose. I bought some cheaper replacement batteries, not from Canon. I bought the DSTE NB-13L batteries. I bought 2 for 50% of the price of a Canon OEM battery. I’ll warn you, as does the camera when it detects these the first time, that these are not Canon batteries. You’ll need to acknowledge a warning that they are not Original Canon Batteries. They work fine though and I’ve not noticed any significant difference from the standard Canon batteries. They last a reasonable amount of time. Some combinations of extra batteries include an extra charger. Having lost a charger on my last trip to Finland, I was glad I’d brought a spare along.

Also, so that I could use a quick release plate with my Really Right Stuff tripod ballhead, I bought a quick release L plate from Desmond. (I usually buy from Really Right Stuff, but they didn’t have a great inexpensive option for this camera).

The model I bought fits the camera very well and is easy to attach and remove. It does make flipping the screen around more of a challenge, but I accept that limitation and rarely is it an issue (as I can always remove the L plate quickly).

SUNWAYFOTO Table Top Mini Aluminum Tripod T1A10 Tabletop Sunway

I attach my Really Right Stuff BH-25 Ballhead to this little tripod. It works really well.

It’s about $35 and fits nearly anywhere (from a small bag to a large pocket). I find a spot usually on a table, nature (like a rock), etc., snap the camera to it, and take a few pictures. It’s really handy and I take it on all trips where I take a camera other than my smart phone.

AmazonBasics Thermal Laminator

This $22 laminator is great. I had no idea how useful this would be. We bought it initially to protect a bunch of table-top board game cheat sheets we’d made or copied. We print them out on our inkjet on regular paper and then laminate them in a 3 mil thermal laminating pouch. The laminator takes 4-5 minutes to warm up at first so there’s no instant gratification that comes with it’s use. Once it heats though, you can feed sheets in with nearly wild abandon (there’s no reason to wait between sheets). In addition to the cheat sheets, we’ve protected copies of important travel and legal documents, copies of instructions (often that we want to hang near the equipment like our furnace or water filtration system). I’ve made small signs and placards for various events and even cleaning instructions for a few things around our house. The laminating pouches are often found in 3 and 5 mil. The 5 mil sheets are very thick and we don’t use them nearly as often.

I’ve also found that using our paper trimmer for items smaller than a full page works really well (rather than trying to cut with scissors). We’ve got something like this (although not this exact one as I can’t find the model we have). Just buy something with replacement blades in case they dull.

And, I just blogged about it a week ago, the Ecobee ecobee3 thermostat is also on my list.

Next time, I’ll post about some table top board games I’ve enjoyed recently.

Made in the USA Camera Bag Manufacturers

Below is the list I’ve gathered to more permanently record a list of made in the USA or made in America camera bags. There are a number of web sites that have attempted to list manufacturers, but they are often out of date and and worse, missing many options.

The current list is always here (opens in a new window).


I also need your help adding to the list (and keeping it up to date). It took me a surprisingly long time to collect this list and I’m sure I’ve missed some manufacturers. I’d really like to get them all!

For suggestions please use this survey.


Some code from SnugUp.Browser (an album browser for SmugMug)

I’ve been doing some tinkering recently with SmugMug again.

Through testing SnugUp for the past 4 years, I’ve made quite the mess of my SmugMug account. Literally hundreds of poorly organized and often completely junk albums. I’ve been wanting to clean it up, but SmugMug’s UI for that is so obnoxiously slow and tedious that I decided I wanted to write a tool to make it easier to manage.

Admittedly, given the amount of time I’ve spent on writing the tool (which I’m not yet finished with), I could have cleaned up my SmugMug account dozens of times. However, with my developer hat on, I thought, how fun would that be? Smile



So, I’ve started to create the SnugUp.Browser. It’s a bit of an interesting beast in that it is a Windows application that hosts a web browser to display its UI. I’d tried using WPF/XAML and just couldn’t get the look I was wanting in a reasonable amount of time and effort.

<RANT>WPF desperately needs a VirtualizingWrapPanel. Microsoft needs to ship it. </RANT>

So, I created a WinForms project to host the IE Web Browser. (Arrgh, the WPF WebBrowser sucks still. It’s not nearly as feature complete as the one from WinForms!). Internally, the web pages are served via an HttpListener.

try { int portSuggest = GetAvailablePort(); portSuggest = 40000; _listener.Prefixes.Add(string.Format("http://localhost:{0}/", portSuggest)); _listener.Start(); while (maxConnections-- > 0) { _listener.BeginGetContext(HandleRequest, _listener); } } catch (Exception ex) { Debug.WriteLine(ex); }

The HandleRequest method responds in two ways:

  1. Respond with JSON data (as if it were a web service). 99% of the code needed to access SmugMug’s APIs was already written in a C# library I wrote for SnugUp.
  2. Respond with binary data, providing a “proxy” to a service. This was needed to handle downloading images from the application. When the request was directly made from the WebBrowser to SmugMug, it was refused as the http-referer header was not a valid source apparently (SmugMug didn’t like “http://localhost:####” as the referrer.
resourceRequested = context.Request.Url.LocalPath.Replace('/', '.'); if (resourceRequested.StartsWith(".")) { resourceRequested = resourceRequested.Substring(1); } Debug.WriteLine(string.Format("Requested: {0}", resourceRequested)); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("SnugUp.Resources.{0}", resourceRequested))) { if (stream == null) { //context.Response.StatusCode = 404; if (url.LocalPath.StartsWith("/proxy")) { var proxyUrl = url.Query.Substring("?url=".Length); extension = Path.GetFileName(proxyUrl); try { WebClient client = new WebClient(); byte[] buffer = client.DownloadData(proxyUrl); context.Response.Headers.Add("Expires", DateTime.UtcNow.AddDays(30).ToString("R")); context.Response.ContentType = GetContentType(context, extension); context.Response.OutputStream.Write(buffer, 0, buffer.Length); } catch { context.Response.StatusCode = 404; } } } else { string contentType = GetContentType(context, extension); context.Response.ContentType = contentType; stream.CopyTo(context.Response.OutputStream); } // Close the Response to send it to the client. // } }

If the resource can’t be found as an Embedded Resource, it tries a proxy.

I built a tiny router for the web services so that I could easily plug-n-play new functionality:

public virtual object Route(string path, dynamic data) { if (path.StartsWith("/")) { path = path.Substring(1); } var paths = path.Split('/'); if (paths.Length > 0) { var controllerName = paths[0]; var controllerType = Type.GetType(string.Format("SnugUp.Controller.{0}Controller", controllerName), false, true); if (controllerType != null) { var instance = InitializeControllerInstance(controllerType); // default? if (paths.Length > 1) { MethodInfo method = controllerType.GetMethod(paths[1]); if (method != null) { try { object results = method.Invoke(instance, new object[] {data}); return results; } catch (Exception ex) { Debug.WriteLine(ex); } } } } } return null; }

It just looks up a request dynamically, maps to a method, and calls it (the response is eventually serialized as JSON).

For UI, I’m currently using Bootstrap (although that may be removed), Knockout.JS, and jQuery. I’m doing a bit of trickery to make sure that only what’s visible on the screen is loaded (even when the user scrolls up and down … it’s pretty smart).  I’ll likely post more about that in a future update.

The app is becoming larger… and bloated a bit when compared to my original needs. Smile



It now can show the images from the gallery as well. Smile


Adobe Lightroom and exporting to subfolders

For some reason, versions 1 – 3 of Adobe Lightroom cannot export images in a way that mirrors the original structure of your photo library. I can’t offer a reason why other than it was missed by the development and design teams. There’s been enough interest in it apparently that there are more than a few free and pay solutions to the problem.

I looked at a few of the options and for one reason or another, I decided that I didn’t want to use the plug-ins/extensions and came up with a simple solution using a bit of naming trickery. I use this technique for SnugUp.

Here’s what I did in Lightroom version 3.

  1. I selected the photos I wanted to export.  (I generally use the Quick Collection Feature)
  2. File > Export (CTRL + SHIFT + E)
  3. Adjust the Export To option to point to a specific folder of your choosing (in the example below, I set the folder as E:\PhotosBackupJPG
  4. You may optionally put them in a subfolder of your choice (I did not)
  5. Next click the Rename To option and select "Edit…
  6. Clear any value that may already be in the text box below the Example (just highlight the text and press delete).
  7. Then, edit the template to be Folder Name and then Original filename. Select those by using the Image Name grouping. Click the Insert button after each.
  8. Then, I added some text that I knew would be unique to be used as a separator (=-= equals minus equals). To add the text, just click with your mouse  between the two values you just inserted. I know that none of the file names in my library have this exact combination of characters in them. It’s important later. You can confirm this by using the search feature in Lightroom if you’re not sure.
  9. Click on the Preset (yours may say something else) and then click “Save Current Settings as New Preset
  10. Give it a name that you’ll remember (I called mine Folder-Filename) and hit Create.
  11. Adjust the remaining settings per your export needs and begin the process by clicking the Export button.
  12. Wait patiently. Then go do something else as you realize it’s going to take a lot longer than you had expected/wanted.
  13. Now, the next step is the simple trickery. What we’ve done is named all of the files so that they include the folder name as well. So, using a Powershell 2.0 script (Powershell is available for all modern versions of Windows as part of a package download here). So, download it now if you don’t already have it. (You can check for it by looking for Powershell ISE as described in the next step if you’re not sure. You probably have it if you’re using Windows 7).
  14. Start Windows Powershell ISE (in Vista and Windows 7, just type “power” into the Start menu search):
    imageThe reason I suggest the ISE (integrated scripting environment) is that it’s easy to just get stuff running without a lot of hassle.
  15. The ISE will start:
  16. I performed the move/rename in two steps so I could verify things between each step. If you’re familiar with Powershell, feel free to combine them into one step. It’s simple enough. First grab the entire script below and paste it into the top pane (under the tab labeled Untitled1.ps1):
    $root = #"E:\PhotosBackupJPG" $items = Get-ChildItem $root foreach($item in $items) { $path = [regex]::split($item.Name, "(=-=)") if ($path.length -eq 3) { $destPath = $root + "\" + $path[0] if (!(Test-Path -path $destPath)) { New-Item $destPath -type directory "New folder: " + $destPath } Move-Item $item.FullName $destPath } }

    I’ve intentionally left an error in the file so that you’re forced to make the change. Unless you have an “E” drive and the path, “PhotosBackupJPG”, the script needs a tiny modification to make it work.

  17. The first line of the script, $root = #”E:\PhotosBackupJPG” needs to be changed to match with the export location you selected earlier AND also the “#” needs to be removed (it’s a comment character in Powershell script). So, if you exported your photos to C:\Users\Steve\ExportedPhotos, remove the “#” and remove the text inside of the quotes on the first line and replace it with your photo location.
  18. After confirming the location points to where you exported your photos (and videos), hit the Run button (the green arrow in the screen shot below). Or hit the F5 key on your keyboard.


  19. The output (or any errors if you made a typo) appears in the light blue box in the center and when it’s complete, the word “Completed” appears in the status bar at the bottom of the application. It may take a few minutes to complete. I’d suggest looking at your export directory using Windows explorer to confirm everything looks fine before continuing. At this point, you should have some subfolders and all of the files should have been moved into the proper subfolder. Next, renaming.
  20. Click the “New” icon (first icon on left shown above) to create a new Powershell script file (or just replace the existing one, you won’t need it again for this process). In the new file, copy this Powershell script and paste it:

    $root = #"E:\PhotosBackupJPG" $items = Get-ChildItem $root -recurse foreach($item in $items) { $path = [regex]::split($item.Name, "(=-=)") if ($path.length -eq 3) { # $destPath = $root + "\" + $path[0] Rename-Item $item.FullName $path[2] } }

  21. Again, fix the $root to match with the export folder you created.
  22. Confirm it, and hit the Run button.
  23. All of your photos (and videos) will be renamed to only the original file name. The extra folder name and =-= are removed.
  24. Bask in the glory of Powershell and your file wizardy. No plug-ins necessary.

If you’d like to use something other than =-= as the delimiter between the folder and file names, you’ll need to fix the Powershell scripts. The delimiter is on the line:

$path = [regex]::split($item.Name, "(=-=)")

But, unless you understand how Regular Expressions in Powershell work, you may want to avoid this change … it’s not necessarily as simple as just replacing the text.

The scripts above do these things with each file:

  1. Check to see if it has the right pattern
  2. If so, grab the folder name and check to see if the folder exists.
  3. If it does not, create it.
  4. Move the file to the new folder.
  5. Rename the file name, removing the folder and delimiter

If you have questions, please leave a comment.

While this shouldn’t cause any harm, (especially if you just point it at a folder of exported photos and videos, which worse case you just re-export), you use technique and code this at your own risk. I can say I successfully used the script on over 30,000 exported photos without a single problem. Smile


It just rained for about 15 minutes at the WiredPrairie and the sun came out immediately after – producing an incredibly vivid rainbow (and a second more faint rainbow). Even violet is visible. What was cooler was that it was right across the street from our house!

After taking a few photos, we went went hunting for the pot o’ gold, but couldn’t find it. Darn.

Favorites-1 Favorites-1-2 Favorites-1-3 Rainbow