Concurrent Data Pipeline Orchestrator
C · Unix system programming
A process controller running multi-stage CSV pipelines with fork, exec and pipes.
- Like a shell pipeline, but shaped like a tree: every stage runs as its own process, and streams merge upward through sub-merger nodes.
- The tricky part was the plumbing — deadlock-free IPC over Unix domain sockets, so no stage ever blocks another.
Cfork/execIPCUnix sockets
Code on GitHub
this project is also a tree — of processes. trees all the way down.
Crossroad — a monitor for a shared intersection
C++ · pthreads · monitors & condition variables
An intersection where every car is a thread — no collisions, no deadlock, and nobody waits forever.
100 / 100 grader score · 0 violations, deadlocks, races
- Cars from perpendicular directions must never be inside at once, cars from the same direction cross in parallel, higher-priority lanes go first — and among equals, whoever arrived first.
- Every car gets its own condition variable instead of one per lane, so a hand-over wakes exactly the threads that can actually move.
- Each lane is a min-heap keyed by a monotone arrival ticket, so "is it my turn?" is a single peek — that's what keeps the ordering starvation-free.
C++pthreadsMonitorsCondition variablesDeadlock freedom
Code on GitHub
the whole thing is one Monitor subclass. the lock discipline is impossible to get wrong.
mergeext2fs — merging filesystems by hand
C++ · ext2 on-disk format · raw block I/O
git merge, one layer down: three ext2 disk images folded into one with nothing but open, read, write and lseek.
100 / 100 all five cases · ~1.3k lines of C++
- A base image and two branches that each grew files, directories and appended content. The tool prints what the merge would do, then edits the base image in place to do it.
- No mount, no libext2fs — inodes, bitmaps, directory entries and indirect block chains are all read and rewritten by hand, and every counter the kernel would normally maintain has to stay consistent or e2fsck screams.
- The fiddly parts: walking direct → single → double → triple indirect blocks, splicing a new entry into a directory's packed slack list, and rewriting the superblock and group-descriptor backups.
C++Filesystemsext2Systems programmingBit manipulation
Code on GitHub
the most fun I've had with a hex dump.
Simulating and Reading Networks
OMNeT++ / INET · Wireshark · CENG435
Three assignments: measure a network, read a network, address a network.
- Built the Ethernet topologies in OMNeT++ and swept them — throughput against offered load, the saturation knee at ~95.4 Mbps, delay and jitter, and chains of switches with and without bit errors. Ten seeds per point, so the curves come with confidence intervals.
- Reconstructed a break-in from a packet capture: which accounts were real, whose password leaked, which IP was brute-forcing the login endpoint, and the file it walked out with — all from plaintext HTTP.
- Six INET configurator labs, from wildcard auto-assignment inside METU's own 144.122.0.0/16 to asymmetric routing across a diamond of routers and hierarchical addressing with optimized tables.
OMNeT++INETWiresharkTCP/IPRoutingNetwork forensics
Code on GitHub
the wireshark shot is the actual capture. you can read the break-in off the Info column.
Pipelined Processor Optimization
Assembly · HCL · Y86-64
Extended a pipelined processor simulator, then made a bilateral filter run 2.1× faster on it.
2.1× speedup · 1442 → 688 cycles / element
- Y86-64 is a teaching version of x86-64 — I worked on the processor itself, adding instructions and resolving data and control hazards in its control logic.
- Then tuned programs to run fast on it: loop unrolling, instruction reordering, custom functions — every saved cycle counts.
HCLAssemblyPipeliningHazard resolution
Processor (HCL) · Performance lab
the screenshot is the real run, not a slide.
Bomb & Attack Labs
x86-64 · GDB · reverse engineering
Defused a multi-stage binary bomb with GDB and a disassembler.
6 / 6 phases defused · 0 explosions
- Each phase hides a password inside a binary — you disassemble it, watch the registers, and read the logic backwards. Every phase ends in a call to explode_bomb; guess wrong and it goes off.
- Then switched sides: crafted code-injection and return-oriented-programming exploits against vulnerable binaries, in a sandboxed course lab.
x86-64GDBReverse EngineeringROP
Bomb Lab · Attack Lab
all six phases defused. my favourite kind of puzzle.
PIC18 Embedded Systems
Assembly / C (PIC18F8722) · MPLAB X
Bare-metal microcontroller work: a Flappy Bird game on an LED matrix, a timer-free round-robin scheduler, and a serial link for an EV charging cabinet.
- Flappy Bird on the board's LED grid: the bird flaps on a button interrupt, gravity pulls it down, pipes scroll in from the right, collisions end the game — and a 7-segment display keeps score. Timer0 is a 50 ms tick and every rhythm in the game is counted off it.
- A separate control task: round-robin scheduling of three state machines with no hardware timers or interrupts at all — every deadline met by counting instructions.
- For a three-port EV charging cabinet, I wrote the serial link to its supervisor: EUSART at 115200, lock-free ring buffers both ways, a frame parser that silently drops malformed input, and silent recovery from overrun and framing errors.
PIC18AssemblyCInterruptsEUSARTADCEmbedded
Flappy Bird (THE2) · Round robin (THE1) · EV cabinet (THE3)
the board photo is my Flappy Bird — bird on the left, pipes scrolling in
Flight Finder
C++ · graph theory
A flight search engine on a directional multigraph.
- Airports are nodes, flights are edges — and since two cities can be connected by many flights, it's a multigraph, backed by a hash table for fast lookups.
- Dijkstra with heuristics that blend ticket cost and travel time, plus airline filtering.
C++DijkstraHash Table
Code on GitHub
AI Model Hub Database
Java · SQL · H2
A normalized database for models, datasets and training runs.
- Schema design first: normalized tables that track which model trained on which dataset, and how each run went.
- SQL analytics on top — user reputation scores and model performance metrics.
JavaSQLDatabase Design
Code on GitHub
KSO — Marine Biodiversity Platform
Team of two · Software Engineering (CENG350)
Architecture design for the Koster Seafloor Observatory — spotting marine species in seafloor video with ML and citizen science.
74 pages of SAD · 6 subsystems
- Co-authored a 74-page Software Architecture Description: six subsystems, from a researcher web UI to a YOLO-based detection pipeline trained on HPC.
- The loop that makes it work: volunteers annotate footage on Zooniverse, annotations retrain the models, results flow to global biodiversity databases (GBIF, OBIS) in Darwin Core format.
- Full UML set — component, class, sequence, state and activity diagrams — plus the SRS.
Software ArchitectureUMLRequirements (SRS)Architecture (SAD)ML System Design
The architecture (74pp PDF) · The requirements (68pp PDF)
diagrams straight from our SAD — drawn box by box in StarUML