I am a software engineer with a passion for team development. It combines two activities that I love to do: programming and working with others. I have worked with a wide array of technologies, but I have spent most of my time developing in C#. I have a decent amount of cloud experience, I have developed and deployed many microservices to both AWS and Azure. Within each cloud provider I have used a good range of offerings and know how to navigate both systems comfortably. I have developed with several different web technologies such as Node.js, ASP.NET, AngularJS, Vue.js, and others. I can implement any reasonable frontend UI as long as I have good stylistic direction. I can design and implement a RESTful API. I can write well thought out automated tests at any level, from unit tests to cover individual groups of code to integration tests that test a system on a larger level. I am familiar with databases and the mechanics of them in both SQL-based and NoSQL-based databases. I have worked with various different source and version controls like Git, SVN, and Accurev. I have experience in Windows and Linux-based environments. I have actively sought out leadership roles, such as interviewing and leading interns, organizing a culture group within Tyler Technologies, and doing peer and code reviews.
While not at work I love to explore new hobbies. I prefer to be a "Jack-of-All-Trades," trying out many things and expanding my skill set, but rarely spending a large amount of time in any one area. Some of the things I have done that I enjoyed are bouldering, ballet, table top games (mostly Dungeons and Dragons), fencing, ballroom dancing, video games, painting, playing Magic the Gathering, and travelling. Above all else though, my favorite thing to do is read. I have spend countless hours reading all sorts of books, from fantasy to non-fiction, I will devour any text that piques my interest. I used to be pretty dismissive of audio books, but I decided to give them a try and now I am pretty much always listening to a book if I'm not busy.
I developed a program to overlay graphical information about the game state of an online "Digital Trading Card" game called Eternal. The project can be found here on GitHub. Many games have players who wish to have easy access to more information available to them than the game normally provides. These players develop "overlay programs" which draw on top of the screen where the game is to display this information. There are several ways to go about this, a common way is to make something called a Direct3D Wrapper. You can duplicate the code in the Direct3D dll but include your own graphics code in the EndScene function, which will cause your graphics to be drawn after everything else has been rendered. This project will eventually attempt such a method. For the first iteration I wrote a program that finds the game's process and changes its drawing space to match the game, then drawing on a transparent background.
There existed another open source program to achieve a similar goal that derived the game state by reading network information between the server and client. I decided to develop a program using a different method: Optical Character Recognition (OCR). I used a C# wrapper for the popular OCR Engine Tesseract. Using this library, I was able to get almost perfect word recognition. However, since it wasn't perfect, I supplmented the Tessearct with another library, SymSpell that finds the closet word match. This project is normally used for spell correction, but it is also often used to clean up the results of an OCR program like I am using it here.
The first few iterations produced very poor results. Reading text straight from the screen with no image processing failed to make any correct match. In order to improve this result, I went through several iterations of image processing. I started with scaling the image upwards to provide larger text to Tesseract. This was a little big effective, so the next pass, I added some light text processing on the results of the OCR. This included removing any non-alphabet characters including spaces. This had a significant jump in accuracy. The next few iterations I experimented with several kinds of image preprocessing. Some of the techniques include converting the image to greyscale, binarizing the image, noise removal, and several others. The latest version converts each screen rendering into grey scale, then scales the image upwards by a factor of 4. The following table shows the results of the most interesting milestones of the development process:
Method | Accuracy | Results | Processing Time |
---|---|---|---|
No PrePrccessing | 0% |
thumpmn Mom“
7>eknu<k|e1nuun
cmky m-
’ounandxnmm
’Umhren n.‘ sz'u
’rmnmk mph;
‘Bmh’shanhm
' Cannonbum
’cumxmladlmg
’ Sandslnrm
Re a‘ixlthnpesh
|
44 ms |
Scale | 8.33% |
Ehampion of Oraer
jceknicfikle jotlin fl
C raftx Yiati f —
* Outlands Brute
~Umbfen Thirsfer 7
—Foomlls Alpha 7
‘Brasli-Shorthan
Cannonbearer
'CiMWMeddliEg 7
SaFdstorm
Kerialist's Khopésh
Sanguine Sond
|
2595 ms |
Scale & Text Processing | 58.33% |
ehampionoforaer
jceknicklejotlin
craftxyiatif
outlandsbrute
umbfenthirsfer
foomllsalpha
braslishorthan
cannonbearer
cimwmeddlieg
safdstorm
kerialistskhopsh
sanguinesond
|
2565 ms |
Binarize, Greyscale, Scale, Remove Noise & Text Processing | 75% |
charinnifdrdcr
skywalkinstruct
adativepredatur
cabalhindeuner
skywagstranger
minataurduelist
archivecuratnr
grenadineannuneer
|
1795 ms |
Greyscale, Scale Image & Text Processing | 83.3% |
championoforder
iceknuckleotun
craftyyeti
outlandsbrute
umbrenthirster
foothillsalpha
brashshorthorn
cannonbearer
cirsosmeddling
sandstorm
aerialistskopeah
sanguinesword
|
774 ms |
Greyscale, Scale Image & Text Processing & SymSpell | 100% |
championoforder
iceknucklejotun
craftyyeti
outlandsbrute
umbrenthirster
foothillsalpha
brashshorthorn
cannonbearer
cirsosmeddling
sandstorm
aerialistskhopesh
sanguinesword
|
951 ms |
In the future I have several improvements planned: