In my spare time I built some cool stuff; it is always being improved, see the latest project stats.for everyone:
- 2048 5x5 is a clone of the famous 2048 game with larger board and two new tiles appearing at each turn. Makes the game very fast paced. source.
- slides-now is a stand alone slide presentation viewer implemented inside the browser without any server side components. Just drag and drop a Markdown (.md) file into the website page and it will play a stylish HTML5 presentation. I love the simplicity of editing my talks as pure text files, keeping versions using Git and playing them whenever I need without logging in / uploading / etc. It even works when I am offline, because the website is so simple it works from cache.
- read on paper is the simplest way to send readable article from PC to your tablet for easier reading. It saves your eyes and trees!
- Command line Boggle solver.
- d3-helpers are tiny functional utilities mostly to simplify callbacks for D3. Also could be used to chain method calls, property access and function applications anywhere.
- deps-ok quickly checks if any of the top level dependencies
are missing or out of date. Faster than using
npm ls. I also wrote grunt-deps-ok grunt plugin.
- grunt-nice-package is an opinionated package.json validator.
- grunt-npm2bower-sync is a fork of another project that copies main properties from package.json to bower.json
- changed is a command line tool that displays changes for a given nodejs package, so you don't have to hunt manually.
- next-update is a stand alone nodejs tool that can check if upgrading your module's dependencies to newer versions breaks any tests. Makes it a breeze to keep your module using the latest and greatest 3rd party tools. Even if you do not have tests, you can use next-update-stats service to check overall module upgrade success statistics (collected anonymously).
- A homebrew unit testing framework gt that follows QUnit syntax but adds better async testing and code coverage (via istanbul). There is agrunt-gt to run GT as a grunt task.
- There is static source complexity tool jsc that keeps my code nice and understandable
- I wrote lasso to instrument widget test pages on the fly, giving you insight into the code covered for by the unit tests. There is no setup necessary, and check out the list of unit test frameworks in the examples folder: everything just works!
- Well documented modules with lots of API examples are easier to reuse, maintain and develop. I wrote js API documentation tool xplain that takes an unusual approach of placing unit tests as examples in the API documentation. The specific test syntax is transformed into human readable format, producing documentation that looks hand-crafted, will always stay in sync with the code, and does not require any developer maintenance. I wrote grunt-xplain wrapper.
- risk-map is a cool way to visualize the entire project's code complexity and unit test coverage using D3 treemap layout. Shows high risk source files in a very obvious way as large red patches. I talk about my inspiration for the project in this talk. I am currently working on using risk-map and developer's vanity to improve software quality, see man-behind prototype.
- qunit-promises is a QUnit plugin that makes checking promises a breeze.
- qunit-once is a QUnit plugin adding module.setupOnce and module.teardownOnce functions.
- qunit-inject is a QUnit plugin for injecting variables from the module into unit tests by name.
- qunit-helpful is a QUnit plugin for automatically providing the entire failed expression. Magical.
- npm-utils is a set of promise-returning functions that run different NPM commands.
- jshint-solid tells how strict your .jshintrc file is. As project matures, you should tighten the Jshint settings. There is grunt-jshint-solid plugin for grunt.
- time-promise is a functional decorator measuring time for sync or promise-returning functions. It is among my four favorite functional adaptors.
- proud collects NPM downloads for all modules authored by a developer with given username. One can generate a proud-badge, even host a simple proud-connect server or use the deployed Heroku proud.herokuapp.com app.
- aged is tiny utility grunt helper for filtering files by last modified age. Allows to define separate sets of quality metrics for recently modified (fresh) and stable files. Read why I think this is important in Aged to Perfection blog post.
- es6-generators-example shows how to write EcmaScript6 code with generators and make them available to everyone, even to people who use EcmaScript5 on node.
- dotdot installs a hook into Node loader and allows you
to write shorthand
foo.bar.bind(foo, 'something'). You can also write
fn.bind(null, 'args')To make it compatible with build tools, I wrote gulp-dotdot that transforms `..` notation in the stream.
- node-hook is a simple way to hook into Node loader to transform the source before compiling it. There are multiple ways this is super useful.
- connect-slow is middleware for node Connect and Express servers. Allows to selectively delay serving some requests using URL RegExp. Used to polish user experience as described in give browser a chance. I wrote same feature for Koa server using generators, see koa-slow.
- console.json removes need to write
console.log(JSON.stringify(object, null, 2));
- console.html beautifies and prints HTML code or HTMLNode
- console.table adds a method to print array of objects as nice table in Node.
- status-gravatar changes your Gravatar profile image depending on the Travis-ci build status of your projects. Sometimes I look angry when my projects start to fail ;) Uses my set-gravatar module for Node.
- grunt-help runs given command, captures output and saves
to given file. Useful to include the program`s
--helpoutput directly in the README.md.
- iframeable is tiny CLI to check if given website could be iframed inside another website (and is susceptible to clickjacking attack).
- grunt-filenames is a grunt plugin to validate source filenames, for example require all filenames to be lower cased with dashes.
- grunt-blank finds all empty, blank or small files.
- console-pop buffers calls to
console.logand then returns a copy, useful for higher level testing.
- bare-objects adds
- lcov-filter filters coverage info for some files, useful to send accurate info to coveralls.io
- available-versions returns newer releases for a given NPM module.
- functional-pipeline is super simple chaining for property access, method and function calls. It is like _.invoke + _.pluck + _.compose in one function.
- post-merge-make installs a Node git hook that runs after a merge.
The hook executes
make post-mergecommand and is useful to install dependencies and run builds after new code is pulled. I also wrote pre-commit-make to run make before a commit. There is also pre-commit-make-parallel to run make with parallel tasks.
- lazy-ass is a lazy assertion function for node and browser. Do not pay a performance penalty if the condition is false.
- lazy-ass-helpful rewrites any function that uses
lazyAsson the fly putting the condition expression into the message. Super useful for unit testing because you can skip writing extra messages in each assertion.
- lazy-test turns testing inside out. You inject small testing framework and run the unit tests in production. Makes quick testing of code private to a closure possible, built on test-mole principle.
- scoreunder is simple function to make underscore or lodash libraries more functional by putting callback first, before data. Makes functional reuse a lot more elegant.
- quiet-grunt replaces grunt's output with dots if everything is going ok. If an error happens, all output is dumped.
- bunyan-gt makes end to end program runs easy to analyze as if they were unit test by inspecting JSON log output
- ng-q-timeout adds
.timeoutmethod to promises returned by angular $q service.
- bdd-tree transforms BDD (jasmine, mocha) spec source into syntax tree.
- ng-ast builds a graph of loaded modules and what they provide from a running Angular app.
- check-more-types is a library of predicates, modifiers and defensive programming helpers
- squint is a visual online tester for source code white space. It is a cool project because I implemented it while watching "Overkill" presentation by @kytrinyx at engineers4engineers conference, and thinking "a tool like this would actually be useful".
- quote safely adds quotes to given string without adding multiple ones.
- find-missing-directives detects empty tags in the page due to missing angular directives.
- stop-angular-overrides prevents silent and hard to debug angular module overrides.
- color-pusher is a widget geared towards real time website color tweaking. Allows anyone to change multiple page colors, including swapping an entire external palette. I created color-pusher to give graphic designers power to tweak live websites without making a round trip to a developer to deploy the new color scheme. There is a Chrome DevTools panel extension, source, that allows editing any live website.
- code-box is a lightbox for code blocks. Adds full screen lightbox to all code elements in your page with single call.
- progress-full-width is a progress bar along the bottom of the page, can be stacked or run on a timer.
- sticky-right-top-icon adds a sticky icon to any element, even if it has scrollable content inside.
- code-snippets are performance snippets for Chrome DevTools for debugging and fine-tuning application performance. Read how to use them in this blog post.
I worked at uTest for half a year, mostly bringing together and updating various front end technology stacks.
I worked for a year at MathWorks, helping to bring the power of MATLAB to the browser.
Earlier I spent four years as a researcher at EveryScape, writing panorama stitching and 3D modeling software. Before that I worked calibrating 3D laser scanners and developing white light scanners. Even before that I wrote distributed database access software that worked across Objective-C, C and Java systems.
Doctorate from Purdue University (West Lafayette, Indiana) working with Dr. Voice Popescu (adviser) and Dr. Mihai Mudure (fellow candidate), developing a novel scanning sensor. We were building 3D models of rooms in real time using a video camera and a bunch of lasers. If you were afraid of lasers, you could be anywhere else in the world, observing the results over the internet, as our system was smart enough to incrementally update the 3D model and send the results in real time.
Some of my github repositories are not up to date, while I am working on cleaning up the code.