Experience
I have been developing software products specializing in Geographic Information System, Computer Vision, and Spatial Computing. Here are some of the tools, operating systems, languages, frameworks, and libraries I have used to deliver these products.
I've been developing software for over a decade. I've used a lot of tools and technologies over the years. Here are some of the tools I currently use daily.
-
These days I'm using VSCode for my development environments with remote containers. VSCode has a great marketplace of extensions and supports things like remote port forwarding and other automations with ease.
-
I really love the Solarized color sheme. I use it for terminals and editors. If anyone knows how to make VSCode and Terminal/iTerm2 use the OS settings hit me up on twitter.
-
Docker makes development and deployment dependencies repeatable and consistent. Using images to lock in requirements for things like OpenCV, TensorFlow, PyTorch, all with NVIDIA's Docker Engine for CUDA support make onboarding, developing, and deploying with remote containers a breeze. I've used Docker Hub for private organizations and even host a few of my own images there.
-
I've been using Google Colab since before it was released publicly in 2017. It's been a great tool for sharing and pairing on machine learning projects like computer vision for Cainthus, GreenThumb IO, and nSightSurgical.
-
Sometimes iTerm2 is great for special usecases like typing, or hitting return, on multiple tabs at once.
-
I used to use plain old Jupyter notebooks, but mostly use Google Colab these days. Sometimes I will run notebooks on remote containers with the VSCode extension.
-
I love writing content with markdown. Most of this website is markdown files or markdown in YAML files
-
I really like using GitHub for code version, discussions, and project management. It's just the write amount of features, right in the place you push your code, so why not just user Projects, Issues, and Pull Requests. I also hear good things about GitLab, but just haven't had a opportunity to use their project management features yet.
-
I'm a big proponent of asynchronous work. Loom is a great way to share ideas and receive inline feedback. From announcements to updates, design revisions to pull request demos, Loom videos provide a great user experience to capture, share, and provide feedback async.
-
Documentation is critical for async processes and notion is a great way to collaboratively produce documentation.
-
Slack is a great way to partially sync up with the expectation being you don't have to respond imediately. Chat is self documenting in a way because public channels record ideas and decisions from disucussions that are searchable for posterity. You can easily use integrations to take a message and create a task/doc or just copy paste.
-
Infrastructure as Code is something I'm passionate about. Terraform is a remarkably powerful tool for reproducable cloud infrastructure. I've used it for automated deployment workflows with GitHub Actions.
-
GitHub Actions is my favorate way to automate CI/CD workflows. From testing to infrastructure to deployments GitHub Actions is an incredibly powerful tool to make the developer experience that much better through automating the boring, tedious, and previously manual stuff.
-
I used to use CircleCI when it was first released in like 2012 and have used them on and off over the years depending on the project.
-
Redis is a high performance in-memory data store I've used for caching things like rendered views and geocoder look ups. It's a great jobs queue for Sidekiq and is the foundation for Faktory. It's also a powerful PubSub message broker that is used for things like WebSocket broadcasting with ActionCable for live updates pushed from the server to the users.
-
Elasticsearch provides a data store with advanced search engine functionality and analytics. I've used it for location based searches of places for PINSTOP JP and ZALA.
-
I've used Celery for background job processing for real-time Computer Vision applications at Cainthus. Background jobs like TMS tile analysis jobs rendered heatmaps for matching patterns of target polygons across entire fields on-demand as users interacted with the map interface. For the dairy cow monitoring we used Celery to parallelize our Computer Vision analysis of real-time camera feeds to report analytics to our API.
-
I started using Sidekiq at Banjo in 2012 as one at one of the first paying Sidekiq Pro customers. I've used it to processing billions of jobs the perform anywhere from geocoding and image processing to email and push notifications.
-
More recently I'ved started using Faktory for my background processing needs. With its simple API and flexible language agnotstic abilities it's proven to be a stable and reliable way to enqueue and process jobs in JavaScript, Python, and Ruby, with community support for job producers and consumers written in Crystal, Go, Elixer, PHP, Rust, and Swift and more!
-
I've built out payments for a handful of products using Stripe, including subscribptions.
-
I've used Twilio for sending email, chat, video, and voice integrations.
-
I've made a few Telegram bots, one of my favorites integrated with TendAir to provide alerts to my group chat for indoor air quality.
-
I've integrated with marketing campaigns run using MailChimp. This website might even use MailChimp for subscriptions... some day.
-
I've used MailGun and SendGrid to send emails to users in dozens of products
-
At Cainthus we tested using RabbitMQ with Celery, but ultimitely Redis is my preferred message broker for it's simplicity and powerful feature set.
-
I've used ZMQ for IPC (Inter Process Communication) to share image data between processes on the same machine. I've found using shared memory objects with Faktory to be more performant and more concise to develop with. Faktory also provides the extensibility to use different languages for jobs, like API clients in JavaScript as well as processs jobs on distributed machines.
Artificial Intelligence > Machine Learning > Deep Learning
-
I've used ONNX Runtime for deploying computer vision models to edge compute devices using CUDA and CoreML Execution Providers. I've also used ONNX Runtime for multitarget inference with multiple models loaded on CPU, GPU, and Edge TPU devices.
-
I've used PyTorch for training and deploying neural networks, mostly for computer vision.
-
Recently I've used PyTorch Lighting for more performant inference at nSightSurgical AI
-
I've deployed ML pipelines that train and use nueral networks for computer vision inference on image data.
Programming Languages
-
I've been using Ruby for over a decade. I still learn new things and find joy writing Ruby.
-
I mostly use Python for Computer Vision and other Machine Learning tasks.
-
I use JavaScript mostly for browser based applications, but have also made React Native mobile and Electron desktop applications
-
I have done audits for and deployed a few applications in TypeScript, but it's not my daily driver. Typing great, but it's not an excuse to skip testing.
-
I have done audits for and deployed a few applications in PHP, but it's not my daily driver.
-
Rust is pretty sweet and I look forward to doing more work with it.
-
Elixir and the Pheonix framework have had my interest for a while, but I've limited production experience.
Frontend frameworks
-
Stimulus controllers are just enough JavaScript for me.
-
Tailwind is a great CSS utility framework that makes me feel like I'm not terrible at CSS. This site uses the Tailwind UI Spotlight template as a base with minor customizations.
-
Alpine is great, lightweight and there's even a sprinkle of Alpine in this site!
-
PostCSS is great for processing CSS with plugins like Tailwind CSS and Autoprefixer.
Web Application Frameworks
-
I've been using Rails to create Web applications and APIs since Rails 2. I've launch dozens of full-stack products with Rails even a few with classic Turbolinks. I'm really excited about HOTwire and the new community tooling like Turdbo Reflex.
-
I've been using JWT for authenticated user credentials for almost all of my projects.
-
I've used both Twilio Video and hand rolled WebRTC signaling servers and WebRTC clients with WebSockets to provide product solutions for realtime communcation through audio/video and collaboration through screen shares.
-
I've built a few microservices with Sinatra to expose APIs with Ruby. One of the most interesting examples that made it to production was a geocoding service that took coordinates and returned location names using OSM, PostGIS, and Redis for a caching layer. It could handle batches of coordinates with a custom stored proceedure and serviced tens of millions of requests a day.
-
At Cainthus we served our APIs with Flask for our React apps that rendered data derived from Computer Vision
-
At Momentage we created a simple file upload service with Express JS and MongoDB's GridFS for resumable file uploads with S3 and CloudFront serving the uploaded assets.
-
At Cainthus we used Django for our Drone mapping web app with Celery for background jobs to process map tile analysis and visualizations.
-
At Focus Testing Services we had a CakePHP JSON API serving our desktop app that was built with Flash FlexBuilder using ActionScript 3
-
Laravel is cool in my book.
-
I've used RESTful APIs for over a decade and starting working with GraphQL in 2017
-
-
I've built dozens of web applications backed by PostgreSQL databases. The first production service I deployed with postgres was in 2013 using the PostGIS extention to leverage powerful geo indexing and querying to deliver a high throughput (tens of millions of requests per day) reverse geocoding service for Banjo.
-
I used MongoDB heavily at Banjo in 2012 we had a 24 hour TTL collection of all social posts from Twitter, Instagram, Facebook, and Foursquare and a collection for geo posts at events detected by our events service I designed and built.
-
I have contrinbuted to a number of my client's web applications with MySQL server backends. I had initially started using MySQL before the Oracle debacle and also at Focus Testing Services in 2011, but I've ended up using PostgreSQL for most of the application my teams and I have developed.
-
At CATS we used Microsoft SQL Server. I help to maintain the Windows Server machine's hardware (SCSI RAID, UPS battery backups, etc.) and software upgrades (Windows System and Applicaiton Dependencies). I also had an opporunity to contribute to the development of our Java JBoss web app and services for the backend with a good old JDBC Microsoft SQL Server driver and Swing Desktop frontend. Coincidentally it was my first time using SQL and last time using Microsoft SQL Server.
Geo Information Systems and mapping tools for location based applications
-
I've used Google Maps for a number of projects. PINSTOP was one of the more comprehensive mapping projects built with a Google Map interface that supported place search with eh Google Places API along with custom pindrops and place details.
-
LeafLeft was used for the drone mapping and analytics product I built at Cainthus. We used it to render customer Tile Map Server (TMS) layers and also to provider a user interface for drawing polygons around areas of interest. These polygon area's were then used as the query parameter for a computer vision analysis across the TMS top layer with on demand heat map renderings as users zoomed in/out and panned around.
-
MapBox has a great suite of solutions with their APIs and SDKs, though most of the products I've built have been too high volumen and on early stage startup budgets to afford using them as opposed to handrolled solutions.
-
OpenStreetMap is a fantasic open source data and tool set that provides multipolygon information about administrative regions, streets, and buildings around the world. It was the foundational dataset used in the Banjo reverse geocoder service that I built in 2013.
Media processing tools for manipulating and analyzing audio, video, and image data
-
I've developed a few computer vision pipelines with FFMPEG decoding inputs that splits into two outputs for computer vision processing and encoding outputs for demos.
-
OpenCV is a lower level library for video/image manipulation and computer vision inference using ONNX, CuDNN, a I've been using OpenCV for a little under a decade. I have built a number of Computer Visions Applications as products for startups and even have a few OSS projects built with OpenCV.
I've used a number of cloud hosting providers over the years.
-
I've managed classic EC2 instances, but typically will automate a VPC with ASG policies for ECS instances.
-
It's been a while since I've deployed with it, but DigitalOcean still has some great offerings.
-
I've managed a number of deployments on GCP using Compute and Run environments.
-
I started using Heroku is 2012 and I still really enjoy Heroku to this day. I should probably checkout some of the new hotness like Render, Vercel, Fly.io, and the like, but I mostly just use AWS ECS/EKS with Terraform and GitHub Actions
-
I've managed a couple of client's deployments on Linode, but it's definitely not my preference.
I've used a number of hardware devices for prototyping and production deployments.
-
I've been tinkering with Arduinos building sensors with ESPs or that talk to Raspberry Pis over serial.
-
Movidus acquired by Intel - I've used the Myriad VPU for computer vision inference on edge compute devices like the Raspberry Pi and
-
I have nearly a decade of experience delivering CUDA power products to market with experience in CUDA, cuDNN, TensorRT, and more. I've used NVIDIA GPUs for training and inference with PyTorch, TensorFlow, ONNX Runtime, and OpenCV. I also have experience developing for the NVIDIA Jetson Nano device line.
-
I've been able to leverage the Apple Silicon architecture using CoreMLTools in python to leverage the Apple Neural Engine for on-device inference. I've also used OpenCV and NumPy with Silicon support for GPU computations.
-
I have been tinkering with Raspberry Pis for over a decade now. Anywhere from heliostats to monitoring plants with computer vision to water them
I've used a number of operating systems over the years to develop and deploy software.
-
My first operating system as a kid. We soon upgraded to Windows 98 and Windows 98 Plus. Good times.
-
I couldn't find a logo for Windows 2000, but Windows XP styled like Windows 2000 was my daily driver early in my career.
-
Currently using Windows 11 mostly for gaming. You can follow me on Twitch to checkout my build and content there.
-
I've been using Ubuntu for well over a decade now. I've used Ubuntu Desktop for development as well as Ubuntu Server for cloud and on-premise deployments