We left off the last post looping over each pixel, wahoo! So this final post will focus on ✨filter types✨. Here’s the image I’m working against: And here’s the final output of this post. In the last post, we were splitting the scanline into individual rows and looping over each byte in the row. Conveniently enough, the sample image has a 1:1 pixel to byte ratio, so we don’t need to do anything…
We left off the last post with the image metadata and raw bytes for the pixels. Here’s the image I’m working against: And here’s the final output of this post. The IHDR chunk fully parsed provides this information: { " width " : 150 , " height " : 200 , " bitDepth " : 8 , " colorType " : 0 , " compression " : 0 , " filter " : 0 , " interlace " : 0 } Our new function will take in the metadata and…
We left off the last post having successfully parsed the IHDR chunk, revealing metadata about the image. Here’s the image I’m working against: And here’s the final output of this post. The IHDR chunk fully parsed provides this information: { " width " : 150 , " height " : 200 , " bitDepth " : 8 , " colorType " : 0 , " compression " : 0 , " filter " : 0 , " interlace " : 0 } Now that we have the…
This blog post is the first in a series about image manipulation and parsing. This project started because I was curious how I might go about manually resizing an image. I’m also experimenting with manual image generation as a part of this project. If you’d like to follow along as we go, the repo for the project is here. The PNG spec is here. Here is the image I used: libpng also has a…
Lately I’ve been doing a lot more data-driven work, including data analysis. From this work, I’ve needed to import and export a lot of data. Here is my best quick-and-dirty way to copy a table from one Postgres table to another. I frequently use this method to refresh my local environment with production data. Of course, if you’re using a tool like pgAdmin , you can export data at the click of a…
It’s sort of hard to know where to start writing this blog post, especially since I’ve never blogged about this project before. I think the idea of “#BuildInPublic” where you share your progress along the way is neat, and its great for marketing, but, funny enough, its also a lot of work! When you’re trying to build a business - marketing, coding, networking, selling, and all that - it’s tough to…
Note: This blog post references an app I no longer maintain. I let the domain go as well. I left the post up because it was a fun little project, and I enjoyed building it, as well as writing about it. As I write this, I have scheduled Accounta-Billie to launch a beta this Friday, 10-23-2020. Looking back I have been working on it for about 3 months, which makes me chuckle now because my initial…
Note: This blog post references an app I no longer maintain. I let the domain go as well. I left the post up because it was a fun little project, and I enjoyed building it, as well as writing about it. I wanted to take some time to write about a project I’ve been working on called Accounta-Billie. Accounta-Billie is a productivity and goals app. The concept is simple: you and your friends make up…
As someone who loves JavaScript as much as I do, I never expected to be working in Xamarin. But that’s where I’ve been since I started my awesome new job! Xamarin brings some interesting challenges. You might think it’s just regular old C#, but since Xamarin uses MVVM architecture versus MVC architecture , I found a few things very tricky to manage. In this blog post, we’ll talk about how I…
Arguably, the biggest part of service workers is being able to fetch data off of a user’s machine, rather than making trips across the network. There’s a variety of reasons reaching over the network isn’t ideal – lack of connection, intermittent connection, speed of the network. Fortunately service workers help with all of these things. In this post, we’ll look at caches.match – the function to…