I've been playing with the ESP8266EX modules that include WiFi, CPU, RAM, and Flash all in one. The ESP-01 variant is by far the cheapest and easiest to find, but it's pin layout is awkward to say the least. I built this motherboard to make it easy to power and program from a standard FTDI USB/Serial-TTL programmer and then put together a writeup to make it easy for others to follow.
Portfolio Part 2
I was invited to speak at the RoboUniverse 2015 conference; I hosted a workshop titled "Knowledge Engines – Building Smart Applications that Learn":
The field of robotics is closely aligned with the work in Artificial Intelligence or AI. The brains of a robotic system can be cloud based and used in the operation of a robot, or could become an independent, stand alone system itself. The knowledge engines acquire information from natural language interfaces, perception, haptic interfaces, non-structured data and more. Knowledge Engines collect, organize, filter, and perform predictive analytics to provide guidance for future actions. In this workshop you’ll learn:
- Research work in building generic Knowledge Engines with broad applicability to a variety of robots and intelligence systems
- How to get started with Knowledge Engine tools to build your own Intelligence Systems
- How the digital brains are used to connect with the physical world of robotics
My portion of the workshop covered a number of IBM Watson Services, and focused on showing demos and real-world use cases. The slides are on slideshare.
My second Watson/IoT demo, this one uses an Arduino Yún to pull my recent tweets, run them through the IBM Watson Personality Insights service, and display the "Big 5" personality traits on a LCD.
The Arduino calls a Python script on the Linux side of the Yún to connect to Watson and Twitter (mainly for https support), and then cycles through the results on the screen.
Can be powered from battery and tethered to a cellphone for complete portability.
My first in a series of Watson/IoT demos, this one employs a Raspberry Pi that announces the current time and weather over the system speakers at the press of a button. Uses Node.js and the newer Linux userspace GPIO support to avoid needing to run as root.
This design focused on energy and bandwidth efficiency: it uses interrupts rather than polling the GPIOs, it uses omxplayer to ensure the audio is decoded in hardware, and it caches the audio files to disk for potential reuse later.
I needed a simple rate-limiter for a project and I didn't see anything that fit the bill, so I put this one together.
It's fairly flexible, however it does not share any state across processes/servers due to the complexity that adds.
I used an Arduino and an IR Shield to fix a major annoyance with my TV: it would turn the sound bar off but wouldn't turn it back on. Now the Arduino is powered up whenever the TV comes on, and it in turn signals the sound bar to turn on.
I later rebuilt it with a Digispark to reduce free up my Arduino for other projects.
Fun little browser-based game, sort of a cross between Doodle Jump and Moon Lander. I put it together over my Christmas vacation with the primary goals of having some fun and getting more experience rendering 2d graphics.
The background image is from NASA; all graphics are either hand drawn or prodecuraly generated. The levels themselves are procedurally generated.
On a desktop browser, the game uses arrow keys to navigate. However, on a mobile device, it use touch + tilt controls via the HTML5
Renders at a smooth 60 FPS on every device I've tested on.
I simplified the app, switching from Ruby on Rails to single-page app and from a complete breakdown of every detail to a no-nonsense identification of the browser and OS. I also updated the design to use the Bootstrap CSS framework.
So far, the new site has achieved 2x and then 2.5x year-over-year growth, reaching the top position in Google for "whats my user agent", and third place for "user agent".
In early 2017, I sold the original url (whatsmyua.com) and moved the site to it's current url: user-agent.io
~Converts large numbers into a more human-friendly format, similar to
ls -lh or Stack Overflow's reputation numbers. For example, 123456 becomes '123k'.
Can be used in Node.js, in browsers, or as a command-line utility.
I needed a scribble
zip command that worked both on Windows and Mac.
Windows has no native
zip command, so
bestzip uses a Node.js implimentation there.
However, Mac OS X includes a native
zip command that is both faster than the Node.js implementations and produces smaller files,
bestzip will use that one whenever possible.
Imports a collection of documents from a MongoDB collection to a DocPad collection.
Written in CoffeeScript and tested with DocPad's built-in test tools on Travis CI.
WDC Website Management Tool
A tool to make life easier for our documentation writers and translators - automates website deployment, including internal builds from different branches/content sources.
Also automates most of a public deployment, and performs extensive logging for later auditing.
My first project at IBM was getting the WDC website ready for launch. This included some design changes and a range of enhancements for performance, usability, accessibility, analytics, etc.
The site was a multi-page AngularJS with significant performance issues when I arrived.
My initial improvements to launch the site included script bundling and minification, a custom AngularJS directive for analytics, syntax highlighting, and automatic ToC generation.
Post-launch on I was able to use DocPad to statically generate the entire site, making it both more flexible, and significantly faster to load.
I occasionally take on side projects via Elance, and their payment system is really great at reliably getting funds into my Elance account. And then they just sit there until I remember to withdrawal them to my bank. So, I built this bot.
The bot uses CasperJS to log into the site as me, check if I have any available funds, and immediately transfer them to my bank if I do.
It runs on Heroku once per day and gives me one less thing I have to remember to do.
True Tile is a local (Dayton / Troy, Ohio) tile installation service. They wanted a website where they could show off their work and also have a centralized source for services and contact information.
I assisted the owner in building the website and setting up email at the domain. We designed the site to be to be fast and responsive, optimized for both humans and Search Engines, and easy to maintain. After building the initial site, I handed it off to the business owner who filled in additional content and now maintains it.
Built with Bootstrap & Bootswatch, hosted on GitHub Pages.
The little town that I live near closed their Police Department a few years before I moved in. I ended up with the old non-emergency phone number as my new home phone number :(
So, I set up a quick little website to help people searching for the number get the correct information for local services.
The Bloko Sports Proxy allows you to browse the internet without fear of "spoilers" telling you the final score of a game you were looking forward to watching later.
I was brought into the Bloko project a little late into the game. Most of the functionality was built, but it was extremely disorganized, very slow, and full of bugs. The back-end was built around Sails.js + my node-unblocker project, and the front-end was a single gigantic "spaghetti code" file of jQuery selectors, repeated AJAX calls, multi-purpose methods, and unmanaged global data structures.
I set to work fixing a large number of broken / unreliable features. In the process, I added some basic testing and code quality checks, organized the front-end into a Backbone.js app split into logical components, automated the deployment process, removed a ton of dead code and unused libraries, and made the entire project considerably more reliable and performant.
A little web app that I put together one morning to annoy myself into having better posture. It asks how your posture is every so often. If it's good, then it waits a little longer before asking you again. But if your posture isn't so great, then it asks you much sooner the next time.
Built with jQuery, Bootstrap, Bootswatch, and Font Awesome. Hosted on GitHub Pages, Bootstrap CDN, and CDNJS.
A low-frequency trading tool, taking the principles from The Intelligent Asset Allocator and applying them to Bitcoin and altcoins. Currently running on Heroku: it checks the markets every 10 minutes and trades coins every day or two.
Currently supports only the Cryptsy exchange, however it was designed to be able to easily support additional exchanges in the future; I'm planning on adding BTC-e when I have time available.
Coin-Allocator can be run via the command-line, or included as a Node.js module to build larger projects on top of (I'd like to build a web interface.)
Continuously integrated & deployed with JSHint and a suite of Jasmine tests that are executed after each GitHub push via Travis CI. If the tests pass, it is automatically deployed to my personal instance on Heroku. Tagged commits are also published to NPM automatically.
I built this to look up ODB-II diagnostic codes from my phone. (And also because I wanted to learn Meteor a bit better.)
The tool searches through a database of codes as you type and also gives some general information about ODB-II and how to acquire the tools.
Continuously integrated with a suite of CasperJS (PhantomJS) tests and continuously deployed to Meteor's infrastructure after each GitHub push via Travis CI.
I built Gatling to abstract some of the repetitive work I saw myself doing with each Node.js project I deploy: setting up a cluster server to use all available CPU cores, adding domains to prevent errors in one request from killing other request, setting up monitoring, and a few other small things.
It's designed to play nice with Connect / Express-style apps as well as simple
http.createServer(myServer) sort of applications.
Runs a Mocha-based suite of unit tests on every git push.
I rebuilt my personal website from scratch with a state of the art mobile-first design made for speed and usability. I like to say that I have more taste than skill when it comes to design, so I'm really happy with myself when I can build something that I think looks good, and I think I did that here.
The homepage starts out with a photo I took of my grape arbor in my back yard; this photo is the basis for the color scheme on the rest of the site. I put a lot of time into choosing the fonts - I wanted something that is easy to read and light-weight, but doesn't stand out too much, and I think the Raleway / Nobile combination did a great job. Also, check out how the footer appears when you scroll down (the effect is only enabled on modern browsers with relatively large displays.)
On the technical side, I actually simplified things a lot compared to the last version of my site: It now uses DocPad to convert markdown files to html for the blog and portfolio, and the site's completely static, allowing it to be hosted on GitHub pages and cached by Amazon CloudFront. Every git push causes the site to be re-generated and deployed (courtesy of Travis CI), and then CloudFront gets the changes within 6 minutes. The site pulls in a little bit of live content from GitHub and Instagram on each visit.
Open Source Contributions
I frequently make small improvements to Open Source projects that I work with. Here's a not-quite-comprehensive list:
AwsSum: Added support for streaming uploads to Amazon S3.
base64codec: Fixed an error when used client side with jam.js / require.js.
connect-memcached: Improved documentation.
curated-hn-hiring: Added source link.
DocPad: Several feature enhancements, bug fixes, and documentation improvements to both DocPad core, and plugins including:
ejs-mate: Added support for blocks and improved the documentation.
Firefox: Supplied bug reports with narrowed-down test cases.
generator-node (Yeoman): Fixed a bug when generating CLI modules.
grunt-browserify2: Improved documentation.
Jasmine: Improved documentation.
jQuery.highlightRegex: Fixed a couple of bugs to allow it to work cross-browser and support multiple runs on the same text.
Masonry: Fixed some accidental global variable references.
Node.js: Fixed several issues in REPL, HTTP, tests, etc.
node-memwatch: Improved documentation.
Prism: Added Ruby support to the File Highlighter plugin.
request: Fixed a filename/mimetype bug.
require-handlebars-plugin: Modified plugin to be compatible with the jam.js package manager, improved i18n code.
sitemap.js: Fixed a bug with URLs that contain the string 'http', added unit tests, improved performance by ~4%.
string.js: Added suport for padding with numbers and associated unit tests.
I Joined Sociable Labs in 2010 as one of the first engineers and went on to lead the front-end engineering team. I worked on every layer of the technology stack and helped the system grow to handle billions of requests, peaking at nearly 10,000/second.
- Leading a team of ~5 engineers building and supporting the front-end framework and apps
- Extensive analytics, A/B testing, and data analysis
- Setting up automated code linting and unit testing
- Recruiting, training, and mentoring team members
- Supporting customer deployments written in Node.js, C#, Java, Ruby, Python, etc.
Sociable Labs joined forces with Viral Ninjas, and I began working on their node.js / AngularJS application.
Initially I was on the Apps team doing customer-driven feature development, and then I later transitioned to the Optimization team where I did data-driven enhancements and development.
Creates the static equivalent of 301/302 redirects for static websites (0-second meta refreshes) via configuration.
One of my major goals for v5 of nfriedly.com was a completely static website. This meant that all of the dynamic portions of my website had to be moved offsite (heroku was a big help here). At the time, DocPad didn't have a plugin to redirect certain urls to offsite locations, so I built one.
Written with CorreeScript and Cake and tested with Chai and DocPad's built-in test system (standard DocPad conventions).
Buit to help me debug some things in IE 8 where turning on developer tools changes the behavior of the page in subtle ways.
Website is a mobile-first design that opens with some fun CSS animations if your browser supports them unprefixed.
Facebook broke part of their website a while back such that app admins could no longer edit events that were created by their apps. We reported this to them and they admitted it was a bug, but decided not to fix it.
After going through several rounds of manually updating events via
curl, I put together this little web app to make the job easier.
Built with jQuery, Bootstrap, Bootswatch and Font Awesome. Hosted on GitHub Pages, Bootstrap CDN, and CDNJS.
I've given a variety of presentations at these and other meetups, including:
- Intro to Node.js
- Unit testing with Jasmine
- Controlling physical hardware with Node.js (both RaspberryPi and Arduino)
- Building RESTful websites with Express.js
- Building interactive websites with Meteor
- Dependency management with require.js
- Better CSS with LESS
- Intro to CoffeeScript
- Building static websites with DocPad
A digital thermometer that varies the color of the backlight from green for "just right" to blue for cold and red for hot. This allows for users to get a rough idea of the temperature from across the room.
Built with an Arduino-clone that I put together to learn how it works.
A Google PageRank tool uses my node-pagerank library. Allows the visitor to lookup the PageRank of one or more sites and stores the results for later use. Also includes a bookmarklet for easy access. This node.js version replaces my previous php-based app.
Built on the Twitter Bootstrap CSS foundation and Backbone.js and Browserify for the front-end. Uses node.js Express.js, and Redis for the back-end. Static assets are served through Amazon's CouldFront CDN while the dynamic portions are hosted on Heroku. Uses Stripe used for paid accounts.
Takes an HTTP GET request such as
GET /foo/1234?method=PUT&data=... and causes the rest of the system to
treat it as if it were the method named in the querystring (PUT in this case).
Super-simple service I built to inform visitors what their internet-facing IP is. Supports HTML, Text, JSON, JSONP, and CORS (Cross-Origin Resource Sharing).
Also shows a fun CSS Animation when you first open the page. Hosted on Heroku.
PicSync automatically uploads photos you take on your Android phone to a private album. It will then remind you about the photos the next time you log into Facebook allowing you to review and post your favorites.
Sociable Labs encryption and signing examples
We accept signed and/or encrypted data from our customers and we provide example code in a variety of languages. I Wrote example code in C# and Node.js, and also published a SLSignPageData library to NPM to enable easy data signing in node.js projects.
I built a custom Drupal module and an Actionscript 3.0 flash loader for the Rookie Arcade section of BYS's new website. These worked in concert to bring together a series of minigames written in Actionscript 1.0, 2.0, and 3.0, record the scores, and display the high scores at the end.
I worked with two different studios on this project to bring the new site and games online in an extremely tight schedule. This included learning all three versions of ActionScript in a single week.
Launched a WordPress site with a customized template for the Turtle St. B & B to use as blog and contact site advertising their Bed and Breakfast and Extended stay offerings as well as other attractions local to Syracuse, NY.
Site included information for both business and tourists, a Google map with directions to their location, and a blog that receives frequent updates about local events.
I assisted in the sites development, providing various tweaks, bug fixes, and performance optimizations.
I built the Veryfine product database and search system including the Nutrition Facts CSS. I also enhanced the site's design to include support for older browsers.
My second web proxy, this one built in Node.js and designed from the ground up to be faster and compatible with more sites - try out Google Instant Search for an example.
It uses Node.js Streams to modify the data on the fly and store almost nothing in buffers. This is considerably more performant than the traditional method of downloading the entire page before parsing it and passing it along to the user.
Cookies are stored in a Redis database to prevent different sites from clobbering each other.
Was originally built on Node.js 0.4, and has since been updated to take advantages of changes introduced in 0.6, 0.8, 0.10, and soon 0.12.
Continuos Deployment: After each GitHub push, Travis CI automatically runs the tests and deploys to Heroku if everything passes. Application is then monitored by New Relic, and reportedly serving upwards of 1200 requests per minute on a single Heroku instance.
I built their backend to record user submissions and made the front-end display a printable form with the user's information pre-filled.
We needed this for one of my projects and I was surprised to find that no such library already existed. So I created it and, with my employer's permission, released it under an MIT license.
Runs a suite of Jasmine-based tests on more than a dozen browsers after every GitHub push via Travis CI and Selenium:
I worked with the MaxMind GeoIP service to customize the Elations home page based on your location. Also built a store locator that integrates with Google Maps.
Reports the visitors UserAgent string and also breaks it down and explains each portion of the string. The site also provides simple, user and search-engine friendly links to view or share the breakdown of other UA strings.
Designed to be friendly on mobile browsers and other small screens. Built in two days using Ruby on Rails and the Blue Trip CSS framework.
Joel's personal website that I assisted with polishing. Built with WordPress and a few plugins including WP Super Cache and BackUpWordPress.
Embeddable Twitter & Facebook Posting and Interaction Tool
I built a tool for updating Facebook and Twitter pages that also helped find and respond to posts from fans. It has been used by several businesses and sports teams.
Google Pagerank Lookup Tool v1
The tool stores results in an SQLite database to avoid repetedly hitting Google's servers and keeps a "recent history" in the user's session.
An OpenSearch plugin that allows visitors to add option to their browser's built-in search bar that uses Google Suggestions but performs the searches on Duck Duck Go.
It also supports encrypted searches, and has a proxy built with node.js that corrects !bang's that Google removes from it's suggestions.
The proxy originally sat behind a high-performance Nginx server, but has since been moved to Heroku.
I created the MySQL database and updated the PHP / AJAX registration process for the Football 2010 GameStop promotion. Includes some very slick jQuery / ThickBox popups.
We built a new website for Wealth Innovations using embedded OpenType fonts (.otf & .eot), AJAX navigation, and an animated user interface to create a standards-based experience on par with flash websites.
I updated their Flashed based header and image-rotator to a Search-Engine-Friendly, easier to manage version build with jQuery, HTML, and CSS.
I worked with Apache mod_rewrite and Pinnacle Shopping Cart to give the site search-engine friendly urls. I also edited the WordPress template.
I built the previous version of my website with a PHP/CodeIgniter core and a custom theme designed by Charley Skira.
The site served to introduce and support myself and my freelance business. Features included:
- Accounts management system where clients could view past and current invoices and pay any balance due via a fully secured and PCI-compliant credit card processing system.
- WordPress-based technical blog with a custom theme and a small plugin that I built to seamlessly unite it with the rest of the site.
- Portfolio and several SEO-optimized pages highlighting the various services I offered.
- YUI-based "Instant Estimate" form that gave a hassle-free way of estimating a project's cost.
- Spam-proof contact form
- Technical demos of working with various APIs from Google, Twitter, Facebook, etc.
A design I put together (with a bit of help from a tutorial.) Free for anyone to use, although I do request that a credit link is kept.
A service I put together to monitor the user's @mentions and forward them to the user as a Direct Message (DM) for faster notification. Built using Ruby on Rails and Twitter's OAuth authentication.
Taken down and released as Open Source after twitter added the same functionality - https://github.com/nfriedly/Twitter-Mention-Monitor
I created a web app for customized orders that included an index of what was available, pricing options, and images. Also included a back-end inventory management system.
I took his photoshop design and coded it into clean XHTML & CSS
I created a complete end-to-end system for managing agent->client business emails. AJAX-driven interface loads templates and sender information, allows you to modify the template, then sends the email.
Includes a modified Rich Text Editor that recognizes existing template variables and provides a live preview of what the email will look like.
Manages images and other attachments and tracks opening rate when possible. Also supports schedule e-mails to be sent in the future, including pre-packaged series of emails.
Try it out at http://my.iboomerang.com/email
I built this website from scratch. The home page imports the owners twitter and blog RSS feed. The site also features a complex menu, integrated google search, an amazon.com library, and a client area where the owners can provide private information.
The automatic setup system I built for iBoomerang. When a customer signs up for a new tool, if they are a current customer, it adds the tool to their account, otherwise it creates them a new account.
You can see it live, but only if you buy something.
I oversaw a five-man team that rebuilt the shopping cart and database of a major clay products website.
The cart was built as a front-end to the Cart32 shopping cart system. It was designed from the ground up to handle their catalogue of over 10,000 products. It included a powerful meta-data based search engine, automatically generated navigation, and a full-featured administration area.
During construction we upgraded the servers from IIS 6.0 to IIS 7.0 to enable clean urls with Microsoft's URL Rewrite module 2.0.
A comprehensive agency management system with extensive sales tracking and reporting. The sales numbers are also used regularly for contests and rewards.
Searches as you type. Uses an in-house lookup system, but could easily be adapted to a 3rd party API.
Zen Cart based website with a customized template. I handled instillation, security, and maintenance and also moved the site from it's original Linux/Apache server to a Windows/IIS for the client.
Rack n More
Racn n' More sells new and used industrial shelving and storage equipment including pallets and forklifts. I did marketing and SEO consulting.
Youman's Construction Services
YCS does customized new home construction preforming some of the work directly and overseeing contractors for the reaming portion. I supported their email and contact form.
Shopping cart and email instillation and maintenance. Site was based on the Zen Cart open source shopping cart system with a custom theme.
I designed and built a custom Content Management System (CMS) for OfA that included rich text editing, a Lightbox Photo Gallery, and a shopping cart with Paypal integration.
I also added some animations to the existing design with the Prototype.js library.
I set up and managed the blog for the ministry/mentoring/leadership training program I was a part of during 2008-2009.