Desktop Apps & Schemata

Though most of my work with code supports web services and web-based interfaces, I do have an increasing number of stand-alone applications that were coded from "scratch".

MarkUpDown, my independently designed and coded Markdown editor, is the project I'm proudest of... currently. It shows a great example of my ability to execute a concept through to completion with a high-quality outcome.

But I enjoy having created everything on this page. SqlDb# is a particularly ambitious project to write a relational database system completely in C#. It was an excellent way to apply and improve my low-level development skills (here's one example). It already works well enough to use while prototyping, and I'm currently working on porting it to a Portable Class Library and adding indexing.

When the Internet was still reasonably new, I created a few desktop applications using Java and Visual Basic 6, from a Quake 2 server pinger (though long since retired) to a shareware email application to a web-page designer for members of the National Estuary Program.

Some of my application work is owned by those for whom I did the programming, though I would be happy to provide examples on request.


MarkUpDown (2016-)

MarkUpDown Screengrab Thumbnail

In January 2016, I worked part-time on a Markdown editor for Windows 10 called MarkUpDown. It's an independently released application written in C# for the Universal Windows Platform. As of September 2016, it's entered beta testing, and will be released on the Windows App Store. Combined with a few open-source libraries, it is wholly original code, and though it does not feature syntax highlighting, it is already, I believe, the best stand-alone dedicated Markdown editor for Windows.

I enjoy using MarkUpDown nearly daily, and it has banked me scores of dollars of pizza money. Thank you to everyone that's purchased.

To learn more about MarkUpDown, check out MarkUpDown's page on rufwork.com or on the Windows App Store.

MarkUpDown is an editor specialized to make creating Markdown code easy for beginners and experts. With helpful toolbars for beginners, GitHub Flavored/Multimarkdown table support, and keystroke shortcuts & Easy Actions for the expert, MarkUpDown is ready to help anyone create perfectly formatted Markdown files.

If you're new to Markdown, MarkUpDown will hold your hand as your learn Markdown syntax, ramping you up as quickly as you're comfortable.

If you're already an expert, MarkUpDown's Easy Actions will make markup flow from your fingers even faster. You'll keep your hands on your keyboard longer, and that means you'll spend more time typing, not tagging.

I'm shamelessly stealing text from my own marketing copy here.


PowerShell scripts (ESN for Navy Enterprise Data Center, 2014-15)

Snippet of Get-Help for one script created during ESN work

Work at Engineering Services Network, Inc. was on-site programming support for a Navy Enterprise Data Center, where I was the only full-time programmer on staff. I "inherited" a complex system of reporting that had been created under a previous contract with VMWare for custom services, and my task was give or take simply to maintain and run those reports. Instead, I took it on myself to essentially finish the last 20% of the customization to fit our day-to-day reporting requirements, automating as much of the reporting requirements as possible to minimize the amount of time the NEDC staff was spending in Excel and text editors crafting and finishing reports.

The system itself was a strange amalgamation of technologies, using VMWare's vCenter/vSphere Web Client (Java servlet) and PowerCLI as data sources, piping data through PowerShell and mapped drives to SQL Server Reporting Services, Java Servlets and Server Faces, Perl, and/or PowerShell to massage that data into reports -- some html, some simple comma separated value, some Excel documents. These were done through cron jobs, Windows Services, and occasionally manual executions. It really was, as Martin Fowler puts it, a snowflake.

Though my assignment was technically only maintenance, one of the first tasks I took once on site was to update the PowerShell scripts (which were the roundhouse for much of the data being thrown around) to match current customer requirements and requests -- addressing the practical pain points. The scripts would take measurements from VMWare virtual machines using PowerCLI, and the original script would only do this for a hard-coded list of VMs, and only for hard-coded VM traits.

After I was finished, the scripts were able to take any list of VMs by name from a CSV, report on any VM traits (several prepackaged selections plus the ability to take a list from the same CSV that contained names), and essentially perform all sorts of customizations that the initially narrowly focused scripts could not support. And the scripts were wonderfully documented to ensure they were maintainable and useable by engineers whose experience wasn't in PowerShell. I also had to update the scripts to support PowerCLI 5 and 5.5, which included moving from Get-Attribute to Get-Tag, a process I automated for our NEDC installation.

In any event, I became exceptionally well acquainted with PowerShell and using .NET syntax within PowerShell when needed. I connected custom PowerShell scripts to all sorts of web and reporting services, going as far as customizing code in Perl, Java, .NET, and php to automate workflows that were previously "manual" affairs.

Related Experience:


SqlDb# (2013-)

Hex view of SqlDbSharp database file

SqlDb#'s goal is to be a simplest-case, embeddable, crossplaform, YesSQL datastore written in C#. Its ongoing emphasis is on a laconic, yet easy to understand and maintain, codebase that enables the serialization of data to files using a select subset of ANSI SQL.

Using SQL has many benefits over querying a custom-rolled text file as an application's datastore, facilitating both initial coding as well as changing to another, more fully-featured database when a project requires it. At this early stage, SqlDb# is best used for crossplatform application prototyping. It has been tested on .NET 4.0, Windows Phone 8 & 10, and Xamarin's Mono.

The master branch should compile without edit for Mono/Xamarin and conventional .NET. A quick, ugly port to Windows Phone 8 can be found in the WP8 branch, and a prebuilt dll for WP8 can be downloaded here. (Yes, I released a Windows Phone apps when that was still (?) a potentially viable platform.)

Note that the WP8 branch should work fine on the other target branches with a single line change currently, the major difference being the use of a shim for the dbms' System.Data usage.


Build-A-PIVOT (BAP) Visual Basic Application (2001-2)

Build-a-PIVOT Screengrab Thumbnail

The BAP application is unique to CSC in that it is the first piece of software designed to be installed on a user's computer. One of CSC's signature product lines is the CD-ROM. When I started at CSC, CD-ROMs released had only static content. They held simple text and images in html format along with some spatial data that people could use only if they had expensive Geographic Information System (GIS) software like ArcView (now called ArcGIS for the Desktop). To get more dynamic content onto CDs, I first helped create dhtml pages with Javascript to include everything from simple mouse-over image swaps -- a "poor man's GIS viewer" -- to a Javascript-powered full-text indexing application that could highlight search terms once the user moved on to an html page with a hit, all from a CD with no software installation.

The browser as a means of delivery, though successful, was fairly limited. The BAP is the culmination of integrating CSC's html skills with truly dynamic content without browser constraints. By moving outside of the browser into Visual Basic, product users could not only read a tutorial of how to foreground their issues on a web site, now they would have their web pages created for them as they followed along and consolidated their information together. By using the Internet Explorer engine in the BAP application, the PIVOT team was able to continue to leverage CSC's html design abilities. The embedded IE engine also allowed simple hyperlink clicks to set off processes, like writing out files or creating html image maps, that could not have been easily done within a traditional browser's security constraints.

BAP was released to a select group of National Estuary Program (NEP) leaders in Summer of 2002, and is set for general release to the public in December 2002.

Screenshots, in jpg format
Checklist Project Entry/Edit page
Project page with review window open
Wizard, "What are we doing?" page
Wizard Finish page with example output in browser

The Digest Handler (2003-4)

From some really old "ad copy", so to speak:

You're subscribed to an email list.  The traffic is brisk, so you subscribed to the digest version.  You no longer get emails every fifteen minutes bothering your busy day, but the digest is unnecessarily difficult to read. Enter The Digest Handler.  Now digest emails will stop looking like endless streams of text like this, and start looking like something manageable, like this!

Digest Handler Screenshot

The Digest Handler isn't a mail handler.  You don't have to give up Eudora or Netscape or mutt.  Instead, The Digest Handler is made to work in tandem with your mail handler as it scans your inbox for new digests, downloads them, and parses them into an easy to read format. Download The Digest Handler and give it a try today!  The Digest Handler is available for Mac OS X, 10.0 or higher, today.
(You'll note I didn't claim to be great at writing marketing copy.)

And just for fun, here's an archive.org backup of that Quake server browser's "release page" from 1999!

L4Q2 image from home page with a list of Quake 2 servers with pings and some notation added to the image to show what each widget does, like selecting which Quake 2 mods to find. A copyright of 1999 is visible on the application's window. That's a LOOOOOONG time ago now.


SQL Sample

Essentially every piece of work I've done involves a relational database. I've designed hefty schemas for regional online coupon sites, handling visually authored, user-created joins for Army mapper, and another than handles all the trappings that surround the creation of an email client.

But what you want to see is some code. It's actually much harder to work within the bounds of an existing schema, often full of non-normalized tables and data duplication, than it is to create a new one, so I'll start there. In fact, I'll use a rock-solid schema, but one that was being asked to do something it'd been explicitly designed not to do. The goal is to add client requested functionality without breaking anything existing in the schema.

For this example, I believe it is long enough after working at Blackbaud for me to share this little bit of SQL, especially since the fix is obsolete with version 7.6. Raiser's Edge (RE), Blackbaud's flagship product, is software that allows non-profits to track donors, sending them mail solicitations, keeping track of what sorts of appeals each donor appreciates, even some support for seating donors attending fundraiser dinners, with the right modules. Of course the amount a donor has given would be an important thing to track, and RE does that well, gift by gift, from first to most recent.

One thing that RE did not do, at least not in any way that was viewable in the interface until version 7.6 (with a corresponding schema change), was keep a historical record of adjustments to those gifts. If someone accidently wrote that Jane Doe had donated $300 when she had donated $3000, after the adjustment to the original gift had been made, the original $300 gift dropped off of the face of the planet.

Raiser's Edge was not designed to be used as a historical financial managment tool; that was what The Financial Edge did and does. Regardless, RE was powerful enough many people wanted to have historical, auditable gift reporting, if only for a few key reports.

That's where these views come in handy. Using them to create a SQL view that replaced one gift table would seamlessly create audit-level historical tracking with RE, something Product Development at Blackbaud said was impossible to do. They did not know they were lying, apparantly, as they changed RE's database schema in version 7.6, not even at a major version change, which added the feature and, well, broke this fix literally a week or so after I made it. So though the fix was used on a number of reports, we didn't test it much beyond seeing that, "It works!" If there are outlier cases, I wouldn't be horribly surprised, but it's still good stuff.

In any event, it does make for interesting SQL, and added historical adjustment reporting to any legacy RE 7.5 or lower report by changing one table name in the report's construction. Very efficient, done in the database as it should have been, and actually pretty quick, too. Probably worth reading the Developer Documentation even if the SQL is too product-specific to spend much time reviewing.

Link to developer documentation and the views:
Developer Documentation for Adjustment Views (surprisingly easy reading)
    bbps_vwFirstAdjustmentSplits.sql
    bbps_vwAdjustmentSplits.sql
    bbps_vwNegativeAdjustmentSplits.sql
    bbps_vwFinalAdjustmentSplits.sql
    bbps_vwPreAdjustmentSplits.sql