Blog &Notes
Notes on research, engineering, and studying well, written from experience.
Latest Posts
29 postsRules You Can Read: An Adaptive Rule-Based Classifier for Biological Data
Biological data often means many features and few examples, along with noise and contradictions. Farid et al.'s 2016 classifier combines random feature subsets, error-focused reweighting, and C4.5 rules so the result stays readable, then checks its leftover mistakes with weighted kNN.

Two Hybrids, One Idea: Pairing Decision Trees with Naive Bayes
Farid et al.'s 2014 paper builds two independent hybrids. One lets naive Bayes delete the training rows a tree would otherwise overfit. The other lets a tree select and depth-weight the attributes naive Bayes uses. Same partnership, run in opposite directions, with one caution about what a model's mistakes really mean.

Reading a Moving Target: The Adaptive Ensemble for Concept-Drifting Data Streams
A dataset is a snapshot, but a stream keeps arriving and its meaning shifts over time. Farid et al.'s 2013 adaptive ensemble holds three weighted decision trees, focuses later trees on the cases earlier ones missed, watches its leaves for a new class, and swaps the weakest tree for a fresher one. This is how the pieces fit.

Newsletter
Newsletter
New posts and project updates by email, a few times a year. Unsubscribe any time.
Delete or Repair? Two Hybrid Classifiers and the Problem of Hard Instances
Farid's 2014 hybrid classifier deletes the instances naive Bayes gets wrong, then grows a tree on what's left. The same authors' 2016 paper reweights and repairs them instead. I traced both algorithms through one tennis dataset, and the contrast says something about noise in every dataset.

Building a Literature Review as a Reproducible Data Pipeline
For my Big Data Analytics review paper, OpenAlex queries build the candidate pool, scripts log every include and exclude decision, and the comparison table regenerates itself from per-paper notes. Here is the system.

Solving the Lorenz-1960 ODE With a Physics-Informed Neural Network
Our FYDP-II model solves the Lorenz-1960 system to five decimal places, trained on the equations alone. Here is the setup, the honest numbers, and two findings the loss curve never showed us.

Common Linked-List Bugs: Lessons From Grading DSA-1 Submissions
I spent a semester grading DSA-1 assignments: 25 students, 10 problems, mostly linked lists. The same five bugs showed up in almost every submission. Here they are, with the code that causes them and the fixes I now grade against.

Building BriefLi: A Link Shortener Designed for Daily Use
BriefLi started as an itch: I share study guides and project links constantly, and long URLs with random slugs are unmanageable. So I built a shortlink dashboard on React, Supabase, and Vercel.

Study Packs: Treating Exam Preparation Like an Engineering Project
I stopped 'studying hard' and started building study systems: structured prep packs with topic guides, cram sheets, mock exams, and an hour-before reading plan. Here's the full method.

React Reconciliation and the Virtual DOM, Explained for a Handwritten Exam
My Mobile App Development final is handwritten: React Native and NestJS worth 16 of 20 marks, written from memory on paper. Preparing for that format forced a clearer explanation of the virtual DOM and reconciliation than any tutorial gave me.

Defending a Thesis With Zero Trained Models: Our FYDP-I Defense
Our final-year thesis defense had one awkward problem: we hadn't trained a single neural network yet. Here's how we defended a verified baseline instead, and the exact prep system we used.

The Accuracy Paradox in Intrusion Detection: Class Imbalance on UNSW-NB15
Our intrusion detection baseline scored 87% binary accuracy and detected exactly none of the 44 Worms samples. A controlled 18-experiment study shows what class weighting fixes, what it costs, and what it can't fix at all.

Verifying a Critical Path Method Answer With a Python Script
Studying for my Software Engineering final, I encoded an 11-task past-exam network as a Python dict and made the machine compute the critical path. Answer: 50 weeks, F → C → E → A. It matched my hand solution, and that agreement was the whole point.

Computing a Neural Network Forward Pass and Backpropagation by Hand
For my Machine Learning final I re-derived everything on paper: a 2-2-1 network producing exactly 0.631, an RNN weight update worth 0.00035, a stochastic neuron at T=0, and the pseudo-labeling threshold that decides everything. The numbers are small. The understanding isn't.

Length-Prefix Framing Over TCP: Reinventing a Protocol Convention From Scratch
For my Computer Networks lab I wrote echo, chat, and file-transfer clients and servers in Python. All three ended up inventing the same fix for the same problem: prefix every message with its length. Turns out that's a real protocol technique, and I'd rederived it from need.

Sizing a Page Table by Hand: From Address Bits to Multi-Level Tables
An OS assignment gave me a 256 MB virtual memory, 4 GB of physical memory, and 2 KB pages, then asked how big the page table is. The chain of arithmetic answers that, then explains why multi-level page tables exist.

Calibrating an MPU6050 and MAX30102 for a Wearable Health Monitor
Our microprocessor lab project is a wearable health monitor on an ESP32: MPU6050 accelerometer and gyro, MAX30102 pulse-oximeter, OLED dashboard. The interesting parts are the conversion constants, the calibration loop, and the fall-detection dataset we recorded by hand.

BCNF Decomposition by Hand: Lossless Joins and Dependency Preservation
A 28-page handwritten DBMS assignment taught me the part of normalization the diagrams skip: BCNF decomposition is always lossless, sometimes dependency-preserving, and you only find out which by computing it. Worked example included.

kNN and k-Means From Scratch: One Distance Function, Two Learners
My AI lab's second assignment was kNN on two datasets; the third was k-means with covariance ellipses drawn around every cluster. Written back to back, they reveal something neat: the same distance function powers a supervised learner and an unsupervised one.

Implementing A* Pathfinding on a Weighted Grid, With Visualization
For my AI lab I built A* over a grid where every cell has a movement cost and obstacles are just -1 values, then drew the result with matplotlib. The version with weights taught me why the heuristic and the edge costs must speak the same units.

Measuring Diode Operating Points: What Forward Drops Reveal in a Real Circuit
Our electronics lab report recorded the operating points of a real diode network: 0.34 V here, 0.68 V there, 0.72 V across the LED branch, one diode fully off. Reading those numbers taught more than the circuit diagram did.

Dynamic Programming in Practice: A Course Contest Retrospective
Ten dynamic programming problems with real test data, solved during my DSA-2 course. Two recurrences worth stealing, one memset trap, and two problems I never finished. All of it still in the folder.

Arithmetic, Geometric, and Harmonic Means: A Descriptive Statistics Study by Hand
Before touching pandas, my statistics course made me compute everything on a 25-person health dataset: arithmetic, geometric and harmonic means, Pearson and Spearman correlations, and medians read off an ogive. Here's what the hand-calculation taught that the libraries hide.

Three Greedy Algorithm Bugs That Passed Every Sample Test
An integer-division comparator that passed every sample, a greedy coin change that works until it doesn't, and a one-line union-find bug that corrupts sets silently. All three are mine, all three survived testing.

Grammar Ambiguity, Chomsky Normal Form, and a Seven-State DFA
Three assignments from my Theory of Computation course, solved by hand: proving a grammar ambiguous (and another one not), converting to Chomsky Normal Form with fresh terminals, and a DFA that tracks three string conditions at once.

Building a Multithreaded TCP Chat Server in Plain Java
For my AOOP socket assignment I built a chat server with no frameworks: a ServerSocket, one thread per client, a registry HashMap, broadcast that skips the sender, and message history replayed on join. Every part explained.

Maximum Power Delivery in an RC Circuit: Differentiating and Integrating by Hand
An electrical circuits assignment asked for the moment of maximum power delivery from a voltage and current that decay exponentially. The answer required differentiating a product, rejecting a negative root, and integrating by parts.

From Boolean Algebra to a 4-Bit Ripple-Carry Adder in Logisim
Two XOR gates and an AND-OR pair make a full adder. Chain four of them and you can add binary numbers. I built it all in Logisim for my DLD lab, and the algebra-first workflow stuck with me.

Sorting an ArrayList in Java: Anonymous Classes, Lambdas, and Reversed Comparators
My OOP lab file sorts the same student list three ways: anonymous inner class, lambda, reversed comparator. That progression is the whole story of Java comparators, including the one rule nobody explains.
