Ezekiel Chentnik

JavaScript Wiz Kid

Photo

Ezekiel Chentnik

About me

Profile

Known for creativity, innovation, flexibility, beating deadlines, and ability to learn new technologies quickly; talent to work well under pressure and to manage several issues concurrently with expertise in quick problem analysis. Awesome at integrating backend systems with front-end usability. Design savvy software engineer & Javascript wiz kid.

Contact Info

Work Experience

Senior Software Engineer

@Journal Communications (2013 - current) - Projects: JavaScript development, Mobile web apps, responsive web design, Single Page Applications, Client side MVC frameworks, Data APIs. Train, mentor, teach, & lead team of 10 software engineers. Technologies: JavaScript, CSS3, HTML5, Backbone.js, Zepto.js, jQuery, Marionette.js, Angular.js, Underscore.js, AJAX, JSON/P APIs, Phonegap, jQuery mobile, Rachet, Twitter Bootstrap, Foundation, Skeleton, Brightcove Video, Google Maps

Lead Software Engineer

@Journal Communications (2012 - 2013) - Develop data driven interactives, mobile solutions, data APIs, video interactives, photo galleries, and interactive maps/charts/graphs. Interacting with multiple technologies, APIs, Applications, and design practices (responsive, mobile first, progressive enhancement).

Lead Developer, Programmer Analyst

@Journal Communications (2010 - 2012) - Designed & Developed all Mobile Web Apps (wap, smart, tablet). Designed & developed article & blog comment system (ajax) 'facebook, google plus, disqus style'. Developed paywall system, redesigned/developed family of TV site(s) from ground up, building MVC framework for Clickability & Brightcove Video.

Front-End Engineer, Web Developer

@Milwaukee Journal Sentinel (2007 - 2010) - Web development for hundreds of enterprise level (high traffic) sites across multiple diverse nationwide media markets.

Skills

Coding / Programming

  • Javascript: Expert - 8 years
  • Mobile Web Apps: Expert - 3 years
  • AJAX/JSON/APIs: Expert - 7 years
  • PHP/MySQL: Expert - 7 years
  • HTML/HTML5 / CSS/CSS3: Expert - 10 years
  • jQuery/Zepto: Expert - 5 years
  • Node.js: Beginner - 1 year

Design

  • Responsive: Expert - 3 years
  • Mobile: Expert - 3 years
  • Web: Expert - 7 years

Web Technologies & More Languages

Google Maps, Leaflet Maps, jquery.flot.js, Raphael.js, SVG, Canvas, Backbone.js, Zepto.js, jQuery Mobile, dc3.js

Python, C#, ASP.Net, .Net 3.5 & 4.0, Classic ASP, SQL, Velocity Template Language, ActionScript 2/3 (Flex), Cold Fusion, XML, XSLT

Social Media APIs (twitter, digg, youtube), CMS Templating (Clickability, Wordpress, Drupal, Joomla, DotNetNuke, Community Server), BrightCove, vzaar

Latest Projects

Favorite Projects

  • nanocss.com - Responsive Web Design & CSS grid framework
  • mpctutorials.com - Streaming video tutorial membership site. Responsive Design, Wordpress templating, Youtube API, PHP, Javascript, Ad Design, Vzaar, Paypal integration, Sound design, Social media.
  • AJAX Commenting - High traffic Facebook style AJAX commenting system. Click on comment body and reply. AJAX, JSON API, Backend
  • Mood Map - Data interactive tool using google maps and JSON API for commenting and poll feedback pinned to map.
  • jsonline.com - Paywall system similar to the New York Times' (NYT cost 25 million USD) - completed in 3 days. Using Javascript, RPC, JSON API, .net, multiple web services integration, page blocking.

Simple JSONP Request Function

////////////////////////////////////////
//a simple jsonp request function
//dynamic script tag with generated functions for multiple instances of callbacks
////////////////////////////////////////
var oo = {};
oo.getJSON = function (options) {
	if (options['callback'] == null) {
		options['callback'] = function (data) {
			return true;
		}
	}
	//generate unique function name
	this.cb = 'jsonp_request_' + Math.floor(Math.random() * 1000);
	//enclose true callback function
	window[this.cb] = function (data) {
		options.callback(data);
	}
	//dynamic script tag
	var head = document.getElementsByTagName("head")[0];
	this.inject = function (url) {
		this.url = url+"&callback="+this.cb; //adjust depending on api requirements
		var script = document.createElement("script");
		script.setAttribute("type", "text/javascript");
		script.setAttribute("charset", "utf-8");
		script.setAttribute("src", this.url);
		var done = false;
		script.onload = script.onreadystatechange = function () {
			if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) {
				done = true;
				script.onload = script.onreadystatechange = null;
				head.removeChild(script);
				try { delete script; } catch (e) { }
			}
		};
		head.appendChild(script);
	}
	this.inject(options.url);
}
////////////////////////////////////////
//example usage
////////////////////////////////////////
oo.getJSON({
	url: "http://ezekielchentnik.com/sandbox/api/?command=get_users",
	callback: function(data){ 
		alert(data.users[0]);
	} 
});

Javascript Chained Processing function

////////////////////////////////////////
//function to process alot of items in a que, forcing each process to wait for the previous to finish before beginning next
////////////////////////////////////////
var oo = {};
var oo.spew(array, process, context){
	setTimeout(function(){
		var item = array.shift();
		process.call(context, item);
		if (array.length > 0){
			setTimeout(arguments.callee, 100);
		}
	}, 100);
}

////////////////////////////////////////
//example usage: append alot of elements to the dom and avoid freezing browser
////////////////////////////////////////

var chunks = [];// create que

//shortened version for example, this would be iterated over many records
for(var i=0;i < bunchOfData.length;i++;){
	//some code to concact html string to push to que
	chunks.push('add html chunks to append to dom');
}

//call buffering function passing que to process 
oo.spew(chunks,function(chunk){
	$("#your-container").append(chunk);
});

Basic PHP JSONP API

////////////////////////////////////////
// connect to db
////////////////////////////////////////
$connection = mysql_connect("example_host","example_user","example_password");
if (!$connection){
  die('Could not connect: ' . mysql_error());
}
mysql_select_db("example_database_name", $connection);

////////////////////////////////////////
// fetch & call command function
////////////////////////////////////////
$command_function_reference = array(
    'get_users' => 'get_all_users'
);
$command_function_name = "default_command_function";
if(isset($_GET['command']) && !empty($_GET['command'])){
	if(array_key_exists($_GET['command'],$command_function_reference)){
		$command_function_name = $command_function_reference[$_GET['command']];
	}	
}
if(function_exists($command_function_name)){
	$command_function_name();
}

////////////////////////////////////////
// commands
////////////////////////////////////////
function get_all_users(){
	$result = mysql_query("select * from users");
	$users = array();
	while($row = mysql_fetch_array($result)){
		$users[] = $row['display_name'];		
	}
	$users = json_encode($users);
	if(isset($_GET['callback']) && !empty($_GET['callback'])){
		echo $_GET['callback'] . '({"users":' . $users . '});';
	}else{
		echo '{"users":' . $users . '}';
	}
}
function default_command_function(){
	if(isset($_GET['callback']) && !empty($_GET['callback'])){
		echo $_GET['callback'] . '({"error":"Command does not exist, please try again!"});';
	}else{
		echo '{"error":"Command does not exist, please try again!"}';
	}	
}

Mobile Framework

Code

Javascript JSON API templating

Code

Data Interactives

Code

Responsive/Mobile First Grid

Code

Responsive/Mobile First Grid

Code

Screen Scraping

Code

Basic Widget Pattern

Code

Education

University of Wisconsin Milwaukee - BBA

Management Information System - Discovered my passion for web development, design, & javascript

Clickability

Velocity template language development training.

Omniture

Omniture integration & maximizing usage training.

SEO

SEO training & social media seminars.

Awards

EPPY

2011

mycommunitynow.com/ - Editor and Publisher's Magazine EPPY - Best Weekly Newspaper Website with under 250,000 unique monthly visitors.

Best news site

2010

livinglakecountry.com - Named best overall local news site in America.

INSPY

2008/2009

Journal Interactive Inspirational Performance award - employee of the year.