Michael Neuper
Computer science student at Stellenbosch University. I like low-level software, electronics and the maths underneath both, and I do almost all of it in Emacs.
- hardware
- software
- maths
- security
About me
I study computer science at Stellenbosch University, and I’ve been a teaching assistant for introductory computer science and for computer architecture. I like knowing what’s going on underneath the code I write, right down to the logic gates, and I like the maths behind it too. I’m happiest when I get to build something myself, and so far that’s been a scheduler, a compiler and an 8-bit computer on breadboards. Outside of all that, I’m a linguistics nerd and I’m into cars.
git log --graph --all --color \ --date=format:'%Y-%m' \ --format='%ad -%C(auto)%d%C(reset) %s %C(blue)<%an>%C(reset)'
Click an underlined commit message to read the rest of it.
Projects
-
hardware
8-bit breadboard computer
Ben Eater's 8-bit breadboard computer, built chip by chip.
- stack
- 74HC logic, EEPROMs, breadboards, a lot of jumper wire
My most recent finished project: a programmable computer on breadboards, built from 74-series logic chips by following Ben Eater’s video series. It is a set of modules that share one 8-bit bus: a program counter, 16 bytes of RAM, an instruction register, A and B registers feeding an adder that also subtracts, and an output register that drives a 7-segment display.
Every instruction takes five clock steps, and the first two fetch it from RAM. At each step, microcode stored in EEPROMs sets sixteen control lines that decide which module puts a value on the bus and which ones read it. Carry and zero flags give it conditional jumps, enough for loops like counting up and down or computing Fibonacci numbers.
-
software
Multicore OS scheduler
A multicore operating system scheduler, for a concurrency course.
- stack
- C, OpenMP
- source
- private (university coursework)
The part of an operating system that decides which process runs on which core, and for how long. Processes come from a file that lists each one’s instructions, which request and release named resources. OpenMP threads act as the cores: each takes the next process from a shared ready queue, behind a lock so two cores never take the same one, and runs it under first come, first served, round robin or preemptive priority scheduling.
A process that asks for a resource another process has goes into a waiting queue until the holder releases it, then back to the ready queue. Once nothing is left to run, the scheduler checks the waiting processes for deadlock by following who holds the resource each one needs: a chain that leads back to where it started is a deadlock.
-
software
Othello with Monte Carlo tree search
An Othello player in C that runs Monte Carlo tree search across MPI processes.
- stack
- C, MPI, Docker
- source
- private (university coursework)
The player picks a move by running thousands of random games from the current position and keeping the move that was explored most, using UCT to balance trying new moves against improving promising ones. Each move gets one second.
The project was for a concurrency course, so the search also runs in parallel over MPI, in three versions: independent search trees combined at the end with
MPI_Allreduce, trees that share their statistics every so often, and the same sharing done asynchronously with non-blocking sends. Each version is packaged as a Docker image, and a match runner plays them against each other. In ten-game matches on four processes, each version beat the one before it, except the asynchronous version, which won half its games against the synchronous one. -
software
Compiler to JVM bytecode
A compiler in C for a custom language that targets the JVM.
- stack
- C, JVM bytecode, Jasmin
- source
- private (university coursework)
I wrote it for a computer architecture course. It reads a program in a small procedural language, with subroutines, arrays,
ifandwhilestatements, input and output, and produces a class file the Java virtual machine can run.It works in stages. A scanner splits the source into tokens, and a recursive-descent parser checks them against the grammar. A symbol table, built on my own hash table, records every name and its type so the type checker can catch mistakes. The last stage emits JVM instructions, which Jasmin assembles into the class file.
-
software
Chat, voice calls and P2P file sharing
Four networking projects in Java: chat, fast UDP file transfer, voice calls and P2P sharing.
- stack
- Java, JavaFX, TCP and UDP sockets, Java Sound, RSA, AES-GCM
- source
- private (university coursework, group project)
Four projects my group built for a networks course:
- A chat server that handles many clients at once, with a JavaFX client, load-tested with dozens of simultaneous users.
- File transfer over Reliable Blast UDP, measured against TCP across packet sizes, loss rates and file sizes from 1 to 100 MB.
- The chat extended with voice calls and group calls streamed over UDP, plus voice notes.
- Peer-to-peer file sharing: a server brokers searches, then peers send files to each other directly over TCP, encrypted with AES-GCM keys exchanged using RSA, with pause and resume. We tested it across four machines over Tailscale.
Posts
A mix of posts about things I’ve done or found interesting. The list below is an Org buffer: TAB folds the heading you’re on, S-TAB cycles the whole list from folded to open, and clicking a heading’s stars folds that heading.
Say hello
Email works best. For anything private, encrypt it with my GPG key below.
Encrypt it
fingerprint4E7B F800 0D86 182D F484 5C37 508B CF84 373C 8930
curl -sL https://michaelneuper.com/michaelneuper.gpg | gpg --import Elsewhere
Capture the flag
Three flags are hidden on this site, the kind you would find in a beginner CTF. They look like flag{…}. Found one? Run M-x submit-flag, or use the button.
0 of 3 found