Reolink, the manufacturer of several IP camera and Network Video Recorder (NVR) products, recently released a firmware update for their line of IP cameras enabling the ability to view the camera streams through HTML 5 enabled browsers like Chrome, Firefox, Safari, and Edge.

It feels a bit odd to be excited about an IP camera that doesn’t require a browser plugin in 2016 considering browser plugins like Flash, Silverlight, and ActiveX components have died out across most parts of the web, but this is the sad reality of IP cameras where custom plugins, ActiveX components, and custom Chrome Apps are fairly standard. Mind you, if you are using your mobile phone you are probably going to prefer to use a mobile app from the vendor or even a third party app like TinyCam Pro or Blue Iris, but it’s nice to be able to pull up a browser and access your camera without having to install anything.

I’ve working on porting SharpTools, my Android home automation app, to Amazon Fire TV and Android TV using the Google Leanback library and ran into a snag today. After building a GuidedStepFragment, I was getting the error “Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: You must supply a layout_width attribute.

At first, I was a bit baffled as the developer guidelines clearly state that GuidedStepFragments should be added programmatically and not via XML files and there weren’t any clear references to our control over the XML file. I took a quick peek at the manifest from the androidtv-Leanback example and quickly realized the difference – they were explicitly specifying the theme in the activity declaration. In their example, they were using a modified theme, but in my case I simply added the theme attribute with the default Theme.Leanback.GuidedStep and everything started working as expected.


What is an Azure Queue?

Azure Queues allow you to store a large number of lightweight messages leveraging Azure Storage. Typical use cases for queues include buffering a set of data or actions for processing. And since the Queues are part of Azure Storage they are super cheap. As of writing this, each queue message can be 64 KB in size and a queue can hold millions of messages (up to the capacity of the storage account).


Scott Hanselman has a post showing how an Azure Queue can be used along with Azure WebJobs to offload processing of images. This is a great example as it shows how a real application might accept images from a user in real-time, then use a queue as the hand-off for another service to actually process the images.

As another example, I have used Queues as a temporary staging ground for incoming IoT data from my connected SmartHome where a WebJob then took care of properly sorting the data and moving it to the destination Azure Table Storage location. This allowed me to take advantage of the massively scalable architecture of Azure Queues instead of having my logic running on a Web App where I would have had to take care of scalability.

I was just cleaning up my desktop and came across a snippet I had saved which removes a specified folder from a Git repository including removing it from the history of the repository. In general, if something was committed to a repository, you shouldn’t remove it from the history, but there are cases where it makes sense – perhaps a sensitive password or key was unintentionally commited.

The command is pretty simple, but be warned that it can have grave consequences if you remove the wrong thing:

git filter-branch --force --index-filter \
'git rm -r --cached --ignore-unmatch .idea' \
--prune-empty --tag-name-filter cat -- --all

git push origin master --force

In the example above, I removed the default .idea folder that is included with JetBrains IDEs like IntelliJ and Pycharm.

About Me

Josh Lyon Profile Picture

Name: Joshua Lyon
Birthday: August 8, 1985
Location: Valley Ranch (Irving), TX
E-mail: This email address is being protected from spambots. You need JavaScript enabled to view it.
ProfilesGoogle, Twitter