-
Making Progress
I'm starting to make progress with my ariel photography. The images and video are making me cringe less. I'm starting very basic and working up slowly. Instead of just cranking up fancy effects in LightRoom or adding some razzle-dazzle from Final Cut Pro. Right now it is about making something that works well as Desktop wallpaper. This blog is the new starting point for a gallery. The goal is more about progress instead of a store of available prints. (That's not to stay I won't sell out
-
Putting in the hours
One of the great advantages to sharing your beginner work is that you are able to see rapid progress. The initial learning curve is usually pretty quick. Making a Vimeo and YouTube channel and posting to reddit provide quick feedback. A lot of the feedback will be critical of what you are doing, but this is all part of learning. Once you reach a certain level of achievement you reach a plateau and growth levels off. This is usually a key area of attrition. The funnel tightens and many peop
-
Picking a new hobby and starting over
I'm trying out a new hobby, that has been a casual interest of mine. This year is going to be the year of GoPro photography. It is a kind of weird idea, but the idea is really simple. I've bought the Hero 4 Black so there isn't a better model I can blame for my shortcomings. There is also a wide enough group of users posting their content that I have a significant yard stick to compare myself to. What have I learned so far? I've learned that it is easy to have an opinion about what looks g
-
Talk at Austin Python meetup 10/08
I had the opportunity to speak at the Austin Python meetup again. This is my presentation on how we use Python at Eagle Eye Networks. I love speaking at these events and really appreciate all of the participation. Here is the video Here is my presentation
-
Translating text in Backbone.js templates
We recently added Japanese support to our webapp. When implementing it, we decided on the most straight-forward method of converting it at run-time by adding a helper method to the view. The first step was to extend Backbone.View to include a translate method (abbreviated as 't' to reduce noise in the template). It performs a simple dictionary lookup. It falls back to English if a suitable translation can not be found. BaseView = Backbone.View.extend({ t: function(str, skip) {
-
Talk at Austin Python Meetup 8/14
I had a lot of fun speaking at the Austin Python Meetup. My presentation was on the current options available to those who want use python with embedded hardware. It was a great group of people and I got the chance to bring some toys. Presentation is here
-
Tales of the install: analog vs digital
We installed some new digital cameras to replace an existing analog setup. The cameras are both similarly priced.
-
Using animated GIFs to answer support questions
Videos are great at demonstrating a feature, but they are a slow and clunky experience. Animated GIFs are quick and lightweight, and no voice narration. I used Licecap to capture these videos. Embedding them is as easy as an img tag How do I add a bridge? How do I add a camera? How do I get to camera settings? How do I change camera resolution? How do I view cameras? How do I create a layout? How do I resize a layout?
-
How I use Frontend build tools and Grunt.js
Build tools are traditionally the realm of backend systems. Recently, as frontend systems have gotten more complex, JavaScript specific tools have emerged. There are plenty of options and it would be impossible to keep up with them all. I wanted to explain how we make use of Grunt.js and what it does for us. What are Frontend build tools There are several tasks that need to be done before releasing a modern webapp. The JavaScript needs to be concatenated into a single file to improve page sp
-
First Demo of my RFID integration
In order to show off the EEN API I made an example access control system out of a Raspberry PI, RFID reader and Node.js Node.js was a natural fit for this project because of how easy it is to handle events from the RFID reader, add realtime support through websockets and pull data out of Eagle Eye Networks with the een module . All the important changes can be made from config.js in the root directory. From there you can define badges and doors. Each door has its own reader which is defined by
-
JavaScript Journal - Getting Started with Infinite Scrolling
Infinite scrolling is a really cool effect and a great use of AJAX. It also has some weird side-effects that you'll need to be aware of. This is the starting point I used in the event version of the Gallery Viewer. The major parts are throttling the scroll event and detecting the scrolling direction. Because I am loading images I want to get started on the request as soon as possible, or I would wait until they were close to the bottom of the page before loading. There is a also a little <d
-
Working with the API: getting previews
Introduction This blog post is an example of how you can use the Eagle Eye Networks API to embed the preview stream where ever you want. Background The API makes it very easy to get the preview stream for all the cameras in an account. The preview stream is a series of JPEG images and requires authentication. Our code today will show how to use the API to provide the images on a webpage without authentication. Step 1: We are going to use the code at mcotton/watcher to run a Node.js server that
-
Getting updated properties
Sometimes you want to get an updated property . In this case, I am animating an image to make it 10% bigger when I hover over it. I also have a slider that allows the grid sizing to change. $(img.currentTarget).animate({ 'position': 'absolute', 'height': (function() { return $('#slider').slider('value') * 1.1 + '%' })(), 'width': (function() { return $('#slider').slider('value') * 1.1 + '%' })(), 'z-index': '10', 'margin': '-15px -15px -15px -15px'}, 0, funct
-
New Library: Reactive.js
I had several hours this week as I drove from Austin to Ft. Worth and started thinking about reactive programming. I would like to be able to attach an event to the value of some other variable. I put together a little demo page along with the github repo .
-
Making a wireless security system
Our condo recently had some flood damaged and their are workers coming in and out to do repairs. My wife and I both work and do not feel comfortable with strangers in our house without us. We don't have the needed wiring in our hallway and my wife didn't want to see any wires run down the wall. So I made a wired camera wireless with parts I had laying around. First I needed a wireless to wired bridge. There are several specialty parts available that do this but one of the cheapest and easies
-
Really easy interview process
I absolutely love you can't javascript under presurre and will be using it next time I am interviewing someone. It is really just fizzbuzz with a couple really easy problems thrown in up-front. It isn't really about the total time the applicant gets, its more about how they approach the problems and then how they refine their solution when they are given more time. I approached them using a simple for loop but given more time I would refactor the code to use forEach and/or reduce.
-
Bootstrap menus with Backbone.js and Mobile Safari
Bootstrap is great. Backbone.js is great. Same with underscore.js and jQuery. These are all great things but there is a problem with clicking on dropdown menu items from mobile safari on iOS devices. There is an easy fix for regular jQuery and even Backbone.js. Old code: $('#userSettings').click(function(e) { e.preventDefault(); (new EditUserProfileView({ model: userList.getCurrentUser() })).render(); }); New Code: $('#userSettings').on('touchstart click', function(e) { e.preventD
-
Multi-threaded JavaScript (sort of)
[UPDATE: It turns out that we could make a simple change on the server and remove the need for this code to run client-side. There was nothing wrong with the approach we took in the article, but decided to do it on the server as an enhancement to our API] I just got through experimenting with web workers and pushed it out to production. Now its time to explain what I've learned. To see historicaly videos and events, we launch a new window called the history browser. It uses SVG to create tile
-
Install redis on osx
Since I had to install this on two different machines I thought I'd be nice and leave this for someone else to find. I store custom compiled stuff in ~/src but you can put it anywhere you'd like cd src curl -O http://redis.googlecode.com/files/redis-2.6.14.tar.gz tar zxvf redis-2.6.14.tar.gz cd redis-2.6.14 make cd /usr/local/bin ln -s /Users/cotton/src/redis-2.6.14/src/redis-server redis-server ln -s /Users/cotton/src/redis-2.6.14/src/redis-cli redis-cli Now you can start up the redis-server i
-
My Merging Strategy
This is my current merging strategy and workflow. I have the branch mcotton-next and when I make new features I git checkout -b mcotton-branch-name As I make changes I make incremental commits and run grunt. I use this command grunt && git status -s|awk '{ print $2 }'|xargs git add; git commit -m "<commit message>" && git push stage mcotton-branch-name Because I make a lot of little commits I use git merge mcotton-branch-name --squash so that I can make my own commit with a unified message. Af