• portfolio

    Recent Projects

    • Cummins© | PowerCommand Cloud Cummins PowerCommand Cloud is a cloud-based platform hosted in Microsoft Azure designed to provide remote monitoring of generators all around the world. The platform alerts stakeholders and technicians of power outages the moment they happen, and gives users the ability to update device configurations and send commands to their assets in the field. PowerCommand Cloud is also the backbone behind Cummins Connect Cloud, which allows consumers to manage their QuietConnect home standby generators online or from their phone. PowerCommand Cloud is scalable, giving it the flexibility to support hundreds of thousands of consumer and commercial generators connected and sending telemetry simultaneously. We utilized Orleans, Microsoft's open source actor model offering, to coordinate a cluster of servers capable of tracking thousands of devices at once. Role: Lead Developer Technologies: C#, ASP.NET, Microsoft SQL, Azure PaaS, Microsoft Orleans - Cummins Power Generation keeps the lights on with Azure IoT Suite - Manage your generator remotely

    • CRF© | Connect2Capital CRF's Connect2Capital Marketplace was developed as a matchmaking service to connect potential borrowers to mission-based, non-profit lenders all around the country. After filling in a simple form, the borrower is presented with a list of lender products that match their needs. If no matching product is found, a list of other helpful resources is displayed. The application is multi-tenant and brandable, allowing partnered banks to generate referrals for potential borrowers on the Connect2Capital platform, seemlessly guiding the user to nearby lenders which can help them with their needs. On the partner side, users are able to view detailed reports with extensive breakdowns and trending charts of the leads generated by Connect2Capital. The platform also allows 3rd party integration for both lending and bank partners to generate leads into existing CRM systems, from CRF's own Spark and Microsoft's CRM. Role: Lead Developer Technologies: C#, ASP.NET Core, Microsoft SQL - Connecting Small Businesses and Responsible Community Lenders

    • Ellie Mae© | AllRegs Market Clarity AllRegs MarketClarity provides lenders with a deep dive into the mortgage market, keeping their users abreast of thousands of mortgage products available in the United States. The application gives users powerful search tools to tailor reports to their exacting needs, and gives them the ability to tag several products for side-by-side comparison. The product library is updated continuously, and alerts users of changes to products they follow. The platform was built with speed in mind; indexing thousands of records allowing users to click through and filter their results instantaneously. Role: Lead Developer Technologies: C#, ASP.NET, Microsoft SQL - Market Clarity | EllieMae - AllRegs Market Clarity 3.0

    Contact

    Email: [email protected]
  • eoleary.me
    • Seed your Data
    • Creating a simple web application in Nim
    • Pushbullet
    • Nimrod ClibPP
    • Controllershell
    • The Templates Library

    Nimrod ClibPP

    08.09.14

    Wrapping C++ libraries in Nimrod

    Traditionally a tedious process. You have to go through each class and function you want exposed, and specify its header and all its arguments, working with ugly pragmas. Take the below C++ header file for example:

    // Header file
    #include <iostream>
    
    namespace pp {
    	class test {
    
    	public:
    		static void output();
    
    		int multiply(int value, int by);
    
    		template<typename T>
    		T max(T a, T b) {
    		    return a > b ? a : b;
    		};
    
    		int fieldName;
    
    		static int notherName;
    
    	};
    }
    

    A snippet of wrapped C++ code might look something like this:

    # Traditional wrapper
    const test_h = "../test.hpp"
    type test {.header: test_h, importcpp.} = object
        fieldName: cint
        notherName: cint
    
    proc output(this: typedesc[test]): void {.header: test_h, importc: "pp::test::output".}
    proc multiply(this: test, value, by: cint): cint {.header: test_h, importcpp.}
    proc max[T](this: test, a, b: T): T {.header: test_h, importcpp.}
    

    Introducing ClibPP

    With ClibPP this process becomes much more readable and simpler. It works by parsing out each of the statements below a "class" declaration, generating code similar to the wrapper code provided above. Here's an example of what a ClibPP wrapper for the same code would look like:

    # Import "test" class from C++:
    import clibpp
    
    namespace pp:
        class(test, header: "../test.hpp"):
            proc multiply[T](value, by: T): int
            proc output: void {.isstatic.}
            proc max[T](a, b: T): T
            var fieldName, notherName: int
    

    This module also generates dummy "typedesc" parameters for static methods, so static methods can be invoked with their prefix similar to how they're invoke in C++, i.e. test.output().

    Here's what using your wrapper would then look like:

    # Use the "test" class from C++:
    test.output()
    
    var item: test
    echo item.multiply(5, 9)
    echo item.fieldName
    echo item.max(2, 10)
    echo item.notherName
    

    Clone it on Github