Welcome!

Featured

My name is Steven Mark Leimberg, and this is my personal website.
QR Code Image Link
This is where I show the world what I can do and what I think. If you are looking to hire me, check out my resume. Otherwise feel free to peruse my posts, creations, videos and thoughts pages. If you wish to send me an email you can do so on my contact page.

If you would like to keep up with my posts here is a link to my RSS Feed.

Updates:

  1. As of March 23rd, 2012 I am currently the owner of SML Tech Services, LLC. I am currently taking on new clients and am working on building a new site at smlts.net specifically for the business. If you have any questions, or are in need of my services feel free to contact me via my contact page. The services I will be providing will include the following:
    • Website & MYSQL Database administration, hosting, and setup.
    • Dynamic DNS administration & setup.
    • Custom Computer Builds.
  2. As of January 12th, 2012, s.m.lemberg.com is no longer hosted by GoDaddy.com!

 

Building an Internet/3G/4G controlled RC Car/Telepresence Robot. Video 3

Feel free to visit smleimberg.com to see more of my creations. In this video I show the progress I have made in creating my Internet controlled Telepresence Robot. I have made a lot of progress since my last video. I have swapped out the chassis for a new smaller, lighter, and faster one. I have written a Java Desktop App to control the bot with a computer via an Android phone and application I which wrote. I still need to work out plenty of bugs, and get a hold of a phone with a front facing camera to truly make this bot complete. There is still plenty to do, but I am progressing much more rapidly these past few weeks. Feel free to comment with any questions you may have.

Arduino – Open Source Hardware

By: Steven Leimberg.

I love open source software. I use it, support it, love it, and contribute to the growth of the open source movement in every way I can. In support of this movement I would like to tell you about something I found in 2010. However, rather than telling you about a piece of software, I would like to introduce you to a revolutionary open source piece of HARDWARE known as Arduino.

Back when GNU/Linux OS was initially released in 1991, it was the driving force that paved the way for the freeware/open source software revolution. Today Arduino is this same driving force for the open source hardware movement. This simple, cheep, and readily available microcontroller makes it easy for hobbyists, artists and developers make their hardware concepts a reality. This platform has been so revolutionary that a 30min documentary was filmed in 2010 that covers the birth and development of Arduino and its many uses and takes a look into the future of open source hardware. I highly recommend watching it as I believe it gives a valuable insight into what our future might look like.

If you like to tinker and decide to purchase one of these amazing microcontrollers for around $30, you should know that the Arduino comes in many shapes and sizes. For example you can buy an Arduino Pro Mini which isn’t much bigger than a quarter, or you can buy the Arduino Mega which is the size of your average TV remote. You should also know that many Arduino accessories, known as “shields” are widely available and enable your Arduino to perform more complex functions such control a LCD screen, host USB devices, and connect to your Wifi network. These shields vary greatly in price depending on the function it performs. These shields are also “stackable” and can often be used in conjunction with one another to perform more complex operations. Multiple Arduino can even be used to crate complex machines such as the open source 3D printer known as MakerBot (which I REALLY REALLY WANT and would love to talk more about, like how it could change the world, but that would require an entirely separate post).

What makes the Arduino so amazing is:

  1. It’s very cheep for a microcontroller as you only pay for the hardware its composed of, which is about $30 US instead of $375 US for something like a CBC v2 .
  2. It’s open source.
  3. It’s easy to learn and use.
  4. It can do almost anything when paired with various shields.

In all I think the Arduino will continue to pave the way for Open Source hardware and will likely be very influential in creating an open source community that will be known around the world. So, once again, if you like to tinker, watch this video and decide for yourself if you want to be a part of the open source hardware revolution. If you like it, you can now buy Arduino at your local Radio Shack or various online retailers such as Sparkfun.

Autoplay Next Netflix Episode Bookmarklet!

By: Steven Leimberg

I love Netflix. It’s a convenient and cheep way for me to watch movies and TV shows. However when I am watching TV shows all snuggled up and comfy, I don’t like to unbundle myself to click “Play Next Episode” every 20min. I wanted a way to auto play the next episode.

So I searched the internet for a fix, and I found a JavaScript Bookmarklet written by one RTPMatt on his site Mostly Worthless. In addition to handling moving between seasons, it now also adds a little text below the movie to tell you that it is on. You can click this text to change the number of episodes it will play. Entering 0 for the number of episodes will turn this off.

  1. Drag the link below on to your bookmarks bar.
  2. Start watching a TV show on Netflix.
  3. Click the bookmark and enter then number of episodes you want to watch.

Netflix Autoplay Bookmarklet – With Multiple Season Support!

Note: [RTPMatt has] now tested this in IE. It does NOT work. But you wouldn’t use IE anyway, would you?

If you like this, go check out RTPMatt’s site and leave him a comment. I’m sure he would appreciate the traffic.

javascript:(function(netflix, undefined) {
	var seasonId = 0,
	episodeId = 0,
	numWatched = 0,
	numToWatch = 3,
	epIdRegex = /,EpisodeMovieId=\d*,/,
	idregx = /\d+/,
	done = false,
	sl,
	init,
	currrentEpisodeId,
	currentMovieId,
	seasons,
	showData,
	waitTimer,
	node;	

	if(!netflix || !netflix.Silverlight || !netflix.Silverlight.MoviePlayer || !netflix.Silverlight.MoviePlayer.getPlugin() || !netflix.Silverlight.MoviePlayer.getPlugin().settings.initParams) {
		alert('You do not appear to have a show playing, please start a show first');
		return;
	}

	//grab the things we need
	sl = netflix.Silverlight.MoviePlayer.getPlugin().getScriptInterface();
	init = netflix.Silverlight.MoviePlayer.getPlugin().settings.initParams;
	currrentEpisodeId = parseInt(idregx.exec(epIdRegex.exec(init)), 10);
	currentMovieId = parseInt(netflix.Silverlight.MoviePlayer.getPlugin().settings.movieId, 10);

	//Check if the user has already loded teh bookmarklet
	var autoplayElement = document.getElementById('NetflixAutoplay');
	if(autoplayElement) {
		alert('You have already loaded the autoplay bookmarklet, click the text at the botton to change number of episodes.');
		return;
	}

	//grab the metadata and decode it
	try {
		showData = JSON.parse(decode64(netflix.Silverlight.MoviePlayer.getPlugin().settings.metadata));
	} catch(e) {
		alert('Error processing data =(');
		return;
	}

	if(showData.Movie) {
		alert('This appears to be a movie not a TV show.  This bookmarklet only works on TV show.');
		return;
	}

	//set our pointest to match the episode we are currently on
	seasons = showData.Show.Seasons;
	for(seasonId = 0; seasonId < seasons.length; seasonId++) {
		for(episodeId = 0; episodeId < seasons[seasonId].Episodes.length; episodeId++) { 			if(seasons[seasonId].Episodes[episodeId].MovieId === currentMovieId || seasons[seasonId].Episodes[episodeId].MovieId === currrentEpisodeId) { done = true; 				break; } } if(done) { break; } 	} //check if we were able to find the episode the user is  on 	if(seasonId === seasons.length) { alert('Error: Already of final episode, or episode data could not be found.'); return; }//Prompt user for number of episodes function getNumberOfEpisodesToWatch() { 		var newNum; do { newNum = prompt('How many episodes would you like to play?', (numToWatch - numWatched)); } while (isNaN(newNum)); numWatched = 0; numToWatch = parseInt(newNum, 10); 		//set the text if(numToWatch > 0) { autoplayElement.innerHTML = 'Netflix autoplay on, Episodes left: ' + numToWatch;
		} else {
			autoplayElement.innerHTML = 'Netflix autoplay off';
		}
	}	

	//create the text that shows how many episodes left & insert it
	node = document.createElement('span');
	autoplayElement = document.body.appendChild(node);
	autoplayElement.id = 'NetflixAutoplay';
	autoplayElement.innerHTML = 'Netflix autoplay on, Episodes left: ' + numToWatch;

	//attach a click handler so people can change number of episodes
	autoplayElement.addEventListener('click', getNumberOfEpisodesToWatch, false);

	//prompt the user for number of episodes for the first time
	getNumberOfEpisodesToWatch();

	//handle when the episode ends
	sl.OnMovieWatched = function() {
		if(numWatched < numToWatch && !waitTimer) {			//Check if done autoplaying 			waitTimer = setTimeout(function() {				//Set our timer so we do not end early 				var epp, numLeft; 				//move episode/season counters properly 				if(seasons[seasonId].Episodes[episodeId+1]) { 					episodeId++; 				} else { 					episodeId = 0; 					seasonId++; 				}	 				//if there is a next episode, grab it 				if(seasons[seasonId] && seasons[seasonId].Episodes[episodeId]) { 					epp = seasons[seasonId].Episodes[episodeId]; 				} 				//if there is a next episode, play it and update the text 				if (epp) { 					sl.PlayMovie({movieId: epp.MovieId, episodeMovieId: 0, trackId: 0}); 					numWatched++; 					numLeft = numToWatch - numWatched; 					if(numLeft > 0) {
						autoplayElement.innerHTML = 'Netflix autoplay on, Episodes left: ' + numLeft;
					} else {
						autoplayElement.innerHTML = 'Netflix autoplay completed.';
					}
				}

				//cleanup
				clearTimeout(waitTimer);
				waitTimer = null;
			}, 2*60*1000);
		}
	};

	//This is just a bse64 decoder
	function decode64(input) {
		var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
		output = '',
		chr1, chr2, chr3 = '',
		enc1, enc2, enc3, enc4 = '',
		i = 0,
		base64test = /[^A-Za-z0-9\+\/\=]/g;

		input = input.replace(base64test, '');

		do {
			enc1 = keyStr.indexOf(input.charAt(i++));
			enc2 = keyStr.indexOf(input.charAt(i++));
			enc3 = keyStr.indexOf(input.charAt(i++));
			enc4 = keyStr.indexOf(input.charAt(i++));

			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;

			output = output + String.fromCharCode(chr1);

			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}

			chr1 = chr2 = chr3 = '';
			enc1 = enc2 = enc3 = enc4 = '';

		} while (i

Codecademy Discovery

By: Steven Leimberg

While reading my G+ feed a friend of mine posted a link to an article in the Washington post. This article poses the question are “computer programmers and coding experts are the new political elite?” It plays with the idea that “[i]f you can code, you can launch new movements, upend traditional campaign dynamics and pressure candidates in a low-cost, high-tech and highly effective way.” This is proving to be somewhat true as the events regarding SOPA and PIPA unfold and the collective Internet fights the government’s attempts to control and sensor it. I think the post is very insightful and could in fact be our political and technological future.

In order to teach and empower the people of the Internet community Codecademy has presented an experiment for 2012 called Code Year. After giving it a try I have to say that Codecademy is a pretty effective way to learn JavaScript. Codecademy also seems to plan on teaching Ruby/Rails and mongoDB which I look forward to learning.

I actually spent enough time on the site to finish the first four courses in a minimal amount of time. Since then I have finished each new course that Codecademy has released. Its pretty straight forward and instantly immersive. I really like the achievements and points and such. In fact I found them quite motivating. I wanted to get the next achievement, finish the next lesson & complete the next course. It pulled me in. I look forward to seeing more courses become available. Go try it out and Check out My Codecademy Profile while you’re there.