RSSAmplifier

Blog

tail -f thoughts.txt

Recent content on tail -f thoughts.txt

jake-windle.gitlab.ioRSS feed ↗74 posts

Latest posts

Django View Decorator

Today for a contract, I worked on a redirect that checked to see if user had a profile or was authenticated. Simple enough, but you may not know how to do it in Django! Here’s how: def profile_required(): def decorator(view): @wraps(view) def _wrapped_view(request, *args, **kwargs): if not request.user.is_authenticated: return HttpResponseRedirect(reverse('login')) if not…

TID: MCP Auth Middleware and Single-Tenant Planning

I’m going to start a new series, called today-i-did. and what it is is a collection of the things I did and learned that day. I want to spread any knowledge, and let loose while writing and building that writing muscle. An eventful day it was today, having to implement some new features for an MCP server, while also balancing side-hustle work and CTO burdens. It all started with some Nest.

This Upcoming Week: 9/15

This is a busy week for me, not taking into account anything from my personal life. Work has just exploded over the last year with all these different projects that I am leading or have a major hand in in some way. It’s a great problem to have, but it’s still a problem, and leaves not a lot of mental energy left for any kind of exploration and learning on my own time.

Untitled

In a sense, writing is nice because of the act of creation. Creating something again. Creating something from nothing. It feels like we can’t create anymore and the act of creation is for nought. I agree with something that I just read on George Hotz' blog. Technology isn’t about creation anymore, it’s about status and dollars. I find myself getting caught up in it. Some of these…

Thoughts on Burnout

Maybe AI tools are the greatest thing to hit programming since sliced bread, and maybe they do drastically change the game. Here’s one unintended consequence though: burnout. Not being able to ever take a break from the hard problems, and instead constantly being focused on solving them. You are stuck working as a programmer on problem after problem without any cognitive respite despite…

Going to Grad School

Why did I decide to go to grad school? I don’t know. It’s a decision that feels like it’s been forever in the making. I have had an interest in hardware since my undergraduate days. I’ve read online plenty lately that most developers think all there is to this field is web development. Most developers that I know locally this is definitely the case. SaaS culture and other…

Dystopia Today: Let AI Manage Your Dev Twitter Account

Talking with friends about startup ideas In our community Tridev, we often find ourselves wishing we had certain software, or wistfully thinking about products that we could build. I wanted something that could tweet for me! I wanted a bot that could tweet about updates to my ongoing work that I was doing in code. Why? Because everyone talks about building a brand and how important that is.…

Math for Data Science Chapter 5 Linear Regression

Linear Regression Attempting to fit a function (a straight line) to a dataset to observe a linear relationship. Then used to predict further values given the line that we’ve fit. Validation Machine Learning engineers will use train-test splits, which means that they will split up the data into a train and a test set. Statisticians will use metrics, prediction intervals and correlations.kjA…

Math for Data Science: Chapter 4 Eigenvectors and Eigenvalues

Eigendecomposition Break up a matrix into it’s basic components. A lot like factoring a number. Used in machine learning and principal component analysis. Two values, the eigenvalues and the eigenvector. This only works on square matrices.A Eigenvalue equation Because this only works on square matrices, if we have a square matrix A, then it has the following equation for the eigenvalues. A *…

Math for Data Science: Chapter 4 Linear Algebra

Yes, it’s true that I spend my days as an AI researcher at my current full-time job, but I’ve found myself behind in terms of hard AI skills. These skills I used to have from my college days, but since then I’ve grown rusty on a lot of the math. Lots of workers out there are looking to improve their AI skills in this AI-driven age, and you count me among them.

Sniff AI Test Creation: Adding Test Models

With the admin views in place, and the placeholder admin view showing, I need models so that I can begin building out the CRUD views. My models are going to be simple to start, because it’s more important to get working than to be perfect. You should strive to be better along the way, and cover your code with tests, but I want to get going and start building out the test creation tools.

Sniff AI Test Creation: Creating the Admin Layout

Now that we have our login flow ready, we are prime to create the layout for the application page. The layout will give us admin specific navigation and flow. What I’ve envisioned for this, is a left-rail menu that contains the admin options, and a main content space that will display whatever we are working on. For this first pass, this will be test creation. So, getting started on the…

Sniff AI Test Creation: Testing Login Flow

Today I’m testing the login flow manually of my application. This means that I’ll try to navigate in the browser to my admin/index page and see if I can trigger the login redirect. If I can, and it doesn’t redirect the way that I expect, then we have a problem Houston. I tested it, and here’s what happened: 15:09:37 web.1 | Started POST '/login' for ::1 at 2024-05-21…

Sniff AI Test Creation: Admin Area Scoped Access

Last time, we worked on getting the login redirect to work. I for some reason wrote at the end of my last post that all was not right with the world and I needed to fix some additional bugs. Turns out, not the case. Get to my computer, run the tests, and what happens? Everything works perfectly. So, onto the next thing. Why am I scoping the admin area? Sniff.AI will host tests, and from those…

Sniff AI Test Creation: Redirect to Login

In the last devlog, I worked through adding a sessions controller, and a new method to log users in. What I want now is the ability to redirect after login to the desired page. To do that, I just need a few things. I need to store the target URL as a param. SessionsController needs to read this target URL from the parameters, and redirect to it after successful login.

Sniff AI Test Creation: User Models

Sniff AI I am working on a piece of software that I’m calling Sniff.AI. It’s meant to fight back against the proliferation of AI tools. Put the “power to the players” or whatever by giving testing providers the software that can detect suspicious activity as it’s happening. I’ve made it all open source, and I’m now working on the backend. The backend is a…

TIL - Computer Algebra Systems

Today I started working through Essential Math for Data Science, an awesome book from O' Reilly that goes over the mathematical fundamentals most of us need in today’s AI-driven world. In this morning’s learning session, I read about SymPy, but decided to implement all the examples in Julia. Loved the results. using Symbolics @variables a f = a ^ 2 * a ^ 3 simplify(f) The output of the…

Blazor WASM: Setting up Firebase Auth

While developing my big C# project for a local company, I found a hurdle I had to get over when developing authentication. The company already uses Firebase for auth of existing customers. This was a problem for me because I am using Blazor standalone WASM as my application platform of choice. C# has a few packages that do Firebase authentication, but all of them are based on the Admin SDK rather…

Observable Pattern: C#/JS Interop

In working with the current project, I’ve developed my own little observable pattern from JS to C# with DotNetObjectReference First, setup your module to do something that requires a stream. For me, this is a Firebase auth module. onAuthStateChanged(auth, (user) => { if (user) { console.log('got user', user) uid = user.uid; } else { uid = null; } // ... }); I want this module to be call back…

Developing With SignalR

I’ve been working for a while now on a real-time eyetracking application for a startup in Johnson City. Previous posts I’ve written have gone over some of the initial technology choices that I made. WebSocketSharp as a server served me well, and it abstracted away annoying things about writing a websocket server in C#. On the client side I went with ClientWebSocket. My ClientWebSocket…

The Project Continues: Using Blazor

The websocket server that I’ve been writing about in past posts will now need an integration point to continue testing. I’ve developed the protocol for this websocket communication, and it consists only of a server state, a timestamp, then additional data. Protocol Example message below: { 'state': 'Ready', 'timestamp': '2023-08-20T13:56:45.5106278-05:00', 'data': { 'arbitrary':…

Cancellable ThreadPools and Work

Today I learned about how .NET wants you to manage cancellable work. I only found out because I tried to use Thread.Abort () and everything blew up on me :). .NET wants you to manage work through this concept of “Cancellable Tokens,” where any asynchronous task represents one cancellable unit of work that you can then stop once cancellation is desired. How did I end up needing this…

WebsocketSharp Deep Dive

To implement the Websocket server from my last post, I’ll use WebsocketSharp https://github.com/sta/websocket-sharp. I’d like to know before I design the remainder of my server though, what actually happens when I call .Start () on my server. I have a snipped of code that looks like this: protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.Log…

Code Reading List

For the first time in my 10 year career, I’d like to get into code reading. Here is my list of repositories that are on the shortlist: https://github.com/ggerganov/llama.cpp - C++ https://github.com/clojure/clojure - Clojure https://github.com/sta/websocket-sharp - C#, related to my current project

Websocket Server C#/.NET: Part 1

I’m creating a background service that does some low-level stuff, and will be responsible for connecting with a client program. That background service is written in C#/.NET. The cross-platform story is great for the C# ecosystem, and the vendor of a particular eyetracker provides .NET bindings for their SDK. If I can write a cross-platform long-running service, that hooks into Windows and…

Junit5: Parameterized Testing with MethodSource

Today I had to write some test cases for permutations of configuration-driven code. There are currently only 2 configuration values, so the test only had 4 possible configurations. In my case, I wanted to drive these tests through paramterization. This allows me to have simple test code, while putting all the complexity in the test arguments. While working with JUnit5 at my unspecified big…

TIL - Structured Clone

Too many times have I been bitten by modifying references to an object rather than a clone of the object. This isn’t a problem in languages like Clojure where everything is immutable by default, but when working with Python or JS, it certainly is. For a client here in my hometown, I wrote some Python code that read values from some JSON in a file into a list. Those values were then scaled in…

Update on Me

I’ve been doing a lot, and lately it’s felt like I can’t catch my breath. Between work at a FAANG company, a side project that I really believe in, and being a dad I don’t have much time for myself. Things that I need to be doing fall by the wayside while I re-evaluate priorities daily. Projects have been started and dropped. I’ve had habits get created and die.…

Chore Feed Project Plan

Problem I constantly see things that I need to fix around the house, then go on about my day and forget to fix those things. I won’t even write them down! I will do things that I am constantly reminded about. I’ve found some success with Ryder Caroll’s Bullet Journal method, but still then I have to remember to write in the bullet journal. How can I be constantly reminded about…

Flutter - Dependency Hell

With the recent move to Dart 3, many applications out there are upgrading to take advantage of null safety. Null safety IS awesome, but what isn’t awesome is the plethora of packages out there in Pub that don’t yet support these breaking changes. Why is this an issue? Because most Flutter apps built out there (particularly ones built by low-code tools) have tons of dependencies. Odds…

Using UseEffect with Firebase Realtime Database

In my current project I’m working on, I’m building up a React application. This app will replace an existing desktop, Windows-only Python 2 app that a client has had for around 8 years. The client uses Firebase Realtime database for their existing data, and rather than try to solve their data problems, I’ll fit this data into the application using useEffect and the Firebase SDK:…

Analyzing My Ultramarathon Training

I’ve completed my analysis of ultramarathon training! Find that analysis here

Julia UltraRunning Analysis

I’ve completed my analysis of ultramarathon training! Find that analysis here

Some Julia Tidbits from FIT.jl: Enums, and my FIT.jl progress update.

Some things that I learned about from my most recent session: Julia Enums Julia has an @enum macro that allows one to define an enum type. Working at Amazon, I’ve had to deal a lot with Enums as an easy way to represent categories of things. Especially in the Java world. Having come from Python though, I didn’t use the concept of enums very much. Here are Julia’s excellent docs…

Hacky way to get bit at index: Julia

This is quite hacky, but it definitely unblocked me while working on FIT.jl. In Garmin FIT files, each record has a byte header used to identify the message type. At position 6 in the byte header, we find the bit used to identify whether a message is a data message or a definition. I know there are ways to isolate this bit using bitwise operators, but I settled on the below approach (knowing that…

What's Next: FIT.jl and Running Data Analysis

What I’ve been working on I’ve been working lately on a new Flutter app for mom-and-pop fast casual restaurants. The idea was brought to me when I was too early for a Bible study in the morning and the manager spoke with me about his app idea. Once he found out I was a software engineer, he could not resist the temptation to tell me about his app idea, but he’s only human!

DAO + Riverpod, Flutter Repository Pattern

Flutter Repository Pattern The Repository pattern is a simple one, you use a Repository to abstract away the implementation details of how to store and retrieve data. With Flutter, it can be complicated (especially when using Firestore) to implement the Repository pattern in a repeatable, testable way. I have heard from friends and other budding Flutter developers that testing with Firebase is a…

On Balance in Life

On Balance I’m training for an ultra marathon in May. Why would I do this? Because I also turn 30 this year. I don’t know why, but 30 feels like an age that I’ve anecdotally seen most decline. I don’t want to be that way. I want my daughter and others to see me still pushing for the limits of what is possible in my daily life. But what about balance in my world?

Chain of Responsibility - C++

Yesterday, I somewhat implemented the Chain of Responsibility design pattern in C++. This was because I grew tired of writing code that constantly called into some C library, checked an error code, and continued on to call another function IF the error was not present. This lent itself naturally (in my opinion) to a Chain of Responsibility pattern, though I may not have implemented it perfectly.…

Firebase: Infinite Scroll Widget in Flutter

Author’s note: If you like this post, consider supporting at patreon.com/windlejacob12. I love writing, and sharing what I’ve learned. I’d love to spend the majority of my time doing it! I’ve been working on a contact lately with a local startup in Johnson City, to implement infinite scrolling in their application. The codebase is entirely generated via FlutterFlow, and…

Advent of Code Day 1

Here is my solution to Advent of Code, Day 1: (def input (slurp 'day1.txt')) (def elf-totals (->> (clojure.string/split input #'\n\n') (map (fn [elf-row] (clojure.string/split elf-row #'\n'))) (map (fn [elf-row] (map (fn [calorie-value] (Integer/parseInt calorie-value)) elf-row))) (into []) (map (fn [elf-row] (reduce + elf-row))) (sort (fn [x y] (> x y))) (take 3))) (def answer (list (reduce +…

Software Complexity

I’m currently reading a book by John Ousterhout, called A Philosophy of Software Design, and this book preaches one central tenant: reducing complexity. This is something near and dear to my heart, being someone that frequently works on his own projects. Complexity can kill projects and companies entirely, because the cost of engineering new software is just too high. I’ve seen it…

std::lock_guard in C++

Working on a project that I currently have, I’ve found myself needing some mutual exclusion in dealing with some hardware devices. I could have gone the singleton route, where I only keep one device representation in memory at a time, but the internet and stack overflow have both told me how I am oh so wrong for wanting that. Thinking then about how I can support multiple devices in the…

Re-Frame + Reagent CLJS Router Pattern

TIL how to implement a routing component using Re-frame and Reagent in CLJS. This has been one of the joys for me in using CLJS, things that seem like they would be complicated on the surface, end up being just a few lines of code. With this routing component, the key is to have the current page key as a symbol in the Re-frame state (sweet sweet re-frame.db/app-db), then to subscribe to that state…

Using Supabase Experience

It wasn’t that long ago that I was listening to an Indie Hackers podcast about Supabase. Supabase is an open-source Firebase alternative and so far we are absolutely loving using it for our current project. The experience has been great. I have begun to model data in it and one of the things that I love is that you get instant API’s spun up to access that data. Supabase, knowing that…

Where I Vow to Improve

I did an evaluation of myself late last night about where I stood as a software engineer. I graded myself on a great many things related to the development of my career and didn’t really like what I had found! Despite having been a software engineer for more than 7 years at this point, I don’t think there is really any skill category that I really stand out on. Jack of all trades,…

Long-Running Isolates in Flutter

The long-running Isolate is a technique that I have used now in my contracting to run extensive processes in the background of a Flutter app. Running background code came up as a need while working with a local startup FytFeed in order to power some on-device integrations. I wrote code that detected the availbility of information in HealthKit and shipped those updates off all while being separate…

Cracking Coding Interview

Cracking the Coding Interview has many interview questions and challenge problems that really boggle the mind. Why would I want to go back to boggling my mind? In recent times, I had a daughter. This daughter has caused me to double down on my career and really get better at my craft. With tracking through the Cracking the Coding Interview book, I feel wholly inadequate but I will continue on…

End of Coaching

I have seen the end of coaching coming for a very long time. It’s great to be able to be a part of young men’s lives the way that I was, but with my new and growing family I simply don’t have time to be the coach that they need me to be. Coaching lacrosse is something that I have done with my free time for much of my adult life.

Fatherhood

It has been a very long time since I have posted anything to this blog, and a lot has happened in my life. I’ve developed certain priorities and definitely come to realize what is important to me as a person. Science Hill High School, a local high school in Johnson City, TN where I live has hired me as the head lacrosse coach. Coaching has become very important to me. The development of…