Simply magical.
Design that inspires.

Graphics Programming

Leveraging the immense capability of the GPU with shaders written in portable GLSL, beautiful scenes have been built to run anywhere. The particle systems utilize a single buffer to initialize all the needed geometry and only require delta time in order to update the displacement function.


            
float tmpTime = mod(time, maxLife);
float timePercent = tmpTime / maxLife;

// displacement = initialVelocity * Time + .5 * acceleration * Time * Time
float displacement = (speed.x * max((size * 0.165), 1.) * tmpTime) + (.5 * speed.y * tmpTime * tmpTime);
vec3 velocity = vec3(displacement * cos(deltaAnglePercent), displacement * sin(deltaAnglePercent), 0.);
            
        

Front-End

Creating engaging user experiences across a wide variety of devices making software easier to use. And the people have spoken, giving "This WiFi Sucks!" 4.9 stars on the Apple App Store.


This WiFi Sucks! iOS App

Restful API

Each API is simple to use and responds with well structured JSON.


ryanberg.io/wifi/search?latitude=34.261555&longitude=-118.301857&radius=2


ryanberg.io/cat/search?category_name=Attachments


See a more detailed explanation here.

Back-End

The back end uses industry standards NginX and PostgreSQL. Routing is extremely efficient but the API Gateway is at its core compiled Lua using OpenResty.

            
function parseSort()
    local pageOffset = 0
    if ngx.var.arg_page then
        pageOffset = ngx.var.arg_page
    end

    if ngx.var.arg_sort_type and ngx.var.arg_sort_value then
        ngx.var.sort_query = " order by " .. ngx.var.arg_sort_type .. " " .. ngx.var.arg_sort_value .. " limit 80 offset " .. (80*(pageOffset-1))
    end
end
            
        

E-Commerce (source)

Landing Page

A* with Min-Heap (source)

Procedural Terrain (source)

Physics Sim (source)

Voronoi Shader (source)

Data Scraping

All the necessary data was collected using Phantom.js. Phantom is essentially a programmable Webkit browser without the GUI. Through direct access to the DOM and lots of fancy Regular Expressions, no data is out of reach.

See the documented source.

            
(function initialScrape(){
    if(cityList.length == 0)
        phantom.exit();

    var cityObject = cityList.pop();
    setTimeout(getHTMLContent, getWaitTimeAndLog(), cityObject, 0, function(totalPageCount){
        var currentPageNumber = 0;
        (function primaryScrapeManager(){
            currentPageNumber += 10;
            if(currentPageNumber < totalPageCount)
               setTimeout(getHTMLContent, getWaitTimeAndLog(), cityObject, currentPageNumber, primaryScrapeManager);
            else
                initialScrape();
})();});})();