Coder Social home page Coder Social logo
  • 👋 Hi, I’m @mj9
  • 👀 I’m interested in Deep Learning, Computer Vision, Java, Functional Programming, Task Automation, Game Design
  • 📔 Below is an overview over my writing (grouped by completion time) and projects (grouped by start time, many of which are still ongoing)

My writing

2021

2019

My projects

2022

Gradle Plugin
Personal projects have slowed down, as I worked mostly on my new software engineering job. I learned Kotlin and Scala (and Groovy), so new projects will likely no longer be using Java. This is the first example, as the plugin is written in Kotlin and tested with Spock. It is also my first public repository. This gradle plugin helps bring my legacy Java Eclipse projects (2016 onward) to a much more maintainable state, where they can be built anywhere. So they are now pure Gradle projects. Custom jar dependencies are replaced with public GitHub forks built via JitPack. My library projects are published via Maven. Automated unit tests are configured.

2020

Kernel Prediction Network


For my Master thesis, I designed a PyTorch network to estimate blur kernels, that can be used to deblur images. This is a novel architecture (comprised of a VGG base network and a U-Net style encoder-decoder network). There has been no substantial prior work in this area, where motion blur kernels are estimated directly with neural networks (the common approach is to estimate the sharp image exclusively or simultaneously). As seen in the image (and known from classical blind deblurring), optimizing for the image fails in a simple setting. In my experiments, I discovered the key to make this work (for my approach) is optimizing kernels in spatial domain using a shift-tolerant loss function. Prior deep neural networks existed for direct kernel estimation (and were even somewhat popular), but not for difficult blur types such as nonlinear motion blur. I theorize that with a loss function designed for kernel estimation, this approach may yield state-of-the-art results even on challenging motion blur.
PlaylistDownloader WindowRobot Misc

For years I manually downloaded and tagged music, then finally made this app to streamline the process. Although intended for YouTube, it can download music and videos from any site supported by youtube-dl. Already downloaded files are skipped, and source link is saved for each directory, to allow continuous synchronization. For tagging (including cover art), SoundCloud is used, while mp3, opus and other formats are supported. But YouTube can be used as a fallback for tagging (including thumbnail cropping). It can also tag already existing files.

Automation tool for mouse and keyboard inputs in and between application windows. Comes with a tiny script language, and guide for it. It can grab windows by title, and record mouse coordinates within (so window position does not matter). When a click is within a window, it is automatically focused. Scripts can be executed by command line. I used this to process several hundreds of images for my thesis.
Privatebin Uploader Java implementation for encrypted text uploading (AES/GCM with PBKDF2)
PyTorch network plotting takes a network instance and draws accurate layer sizes and labels, and can be customized in many ways
Filesplitter made as companion tool for MouseChart logs, it can split lines into two files, depending on keyword matches

2019

High Speed Imaging


Left: 1-bit video, right: network output. To record high temporal resolution footage, exposure times have to be short, i.e. the number of photons hitting the sensor is low. Pushing this to the extreme, photon counting sensors may only consider a single bit per frame. So a pixel is either black, or white in case a photon was detected.
For this partner project, we successfully reimplemented the spatio-temporal denoising network from a paper (with access to dataset but not source code) in PyTorch, and obtained small improvements. I also implemented an n-dimensional crop and stitch algorithm to process large video volumes in chunks.
GiveawayPaster Zork Bot

Out of curiosity, I wanted to see if key giveaways in Twitch chat could be automated. This tool scans a chat for messages containing keys, and can be configured to paste and submit them in any window. I never ended up using it because the only giveaways I found were for North American servers in League.

Looking for more ways to integrate games into a chat environment, I found old text adventure games (interactive fiction). There are existing games like Zork (1979), which have been ported to many platforms. I took the Java implementation ZMPP, and modified it to be used with Twitch chat. This can be used for multiple users to collaboratively play these old Z-Machine game files.
Dungeon Map Misc

Proof of concept for dungeon generation, inspired by Slay the Spire.
REPL read-eval-print loop, i.e. shell environment that can run commands, that I made to rename large numbers of files
Java image processing small set of companion functions for thesis (rotate, threshold, and measures like IoU and contour score)
Obfuscator v2 new generation of tool to obfuscate API keys in code, with my own xor cipher implementation, and measures to ensure decoding only works on a particular system
ImageNet downloader Java utility for multi-threaded downloading given a list of URLs, with many levels of error checking (timeouts, HTTP errors, URL decode, URL-to-filename correction, image format validation)

2018

One-Shot Video Object Segmentation


Left: input video, right: predicted segmentation mask. As part of my bachelor thesis, I did an analysis of a paper on video segmentation, using its available PyTorch source code. A convolutional neural network is first pretrained on general object segmentation, then trained on a single annotated frame of the input video. Although the algorithm is conceptually simple (no temporal coherence), it serves as a good study on transfer learning, and its limitations.
I investigated the role of pretraining vs. one-shot training, the role of deep supervision and validated the hyperparameters. To verify the algorithm and explore its limitations, I created my own test videos. The algorithm turns out to be very robust to changes in object appearance, but struggles with changing backgrounds.
YtApp Misc

A proof of concept for scraping and merging YouTube channel pages, specialised for Music.
Unitypatcher byte manipulation tool
TimeDifference utility for date and time calculations
GükoScraper a web scraper to extract job listings from a website into CSV format
WinOgerUtil Java library for Windows specific features (flashing taskbar icons, taskbar progress bars and window titles)
SequenceViewer image viewer for large scale qualitative image comparison

2017

Virtual Self
Soon™
MouseChart Misc

If you spend a lot of time on a computer, you may sometimes wonder what you did all day. To answer this question, this tool tracks your activity (mouse movements, and active window titles) and plots it. In addition to a broad overview, every single minute can be viewed, and summaries can be created. This also serves as somewhat of a diary, since you can go back to any point in time and see what you did. The activity log files are also made to be human-readable, so that all detailed information can be viewed at a glance, with an editor of your choice.
CUDA string matching GPU implementation of the Rabin/Karp algorithm.
Atom unicode snippets Java tool to query (mathematical) unicode characters and make them typeable in the Atom text editor.
File sequence parser intelligently detects numbering sequences in filenames and integrates into the Windows explorer context menu to run a configurable command on the sequence.
Game networking library uses Java SSL sockets and java.io Streams to transport data and events (Objects) securely over network.
Fake Process Builder VR Labyrinth Script Timer

An interesting security concept is that malware does not want to run in environments where it could be analysed. So by creating fake processes that mimic common analysis and reverse-engineering tools, potential malware may decide to not even run your system. Although I am not the first to implement this idea, prior solutions simply renamed existing executable files. This may incur a performance hit, but also the executable metadata (such as the title) can be used to identify the original file name and author. To alleviate this, my solution creates custom process metadata (including icon) for every process. New processes can be added to the list and will automatically be compiled into executables when the app runs.


A demo using a VR framework in C++/OpenGL. I made a Java app to design the labyrinth layout, which is translated into 3D tiles with collision, that can be navigated with VR gear.

A simple timer that stores and runs shell scripts. I use this mostly to turn off the computer while I am away or asleep, or to remind myself when a pizza is done. It also shows the progress in the Windows taskbar, which is not native to JavaFx.

2016

FxTwitch

As the successor to my previous livestreaming app, this can play streams in-app. It is also built with JavaFx, and thus offers a rich interface with CSS styles (used for the dark theme). Another addition is that several game categories can be shown simultaneously, while also being searchable. Stream discovery is further streamlined with high resolution preview images, that are preloaded and transition smoothly into playback. Discovery is highly customizable with multi-tier favorites, individual or whole category ignores, as well as language and rerun filters. I have been using this app daily for over 4 years, so a lot of development time has also gone into it. Playback is handled by LibVLC, via vlcj.
Chat Bot Advanced Rendering Demo


A chat bot for Twitch, developed in Java, using on PircBotX. I actively worked on it over 3 years, with over 150 commands and over 50,000 usages in a small community. It is hosted on a RaspberryPi, specifically for this project. At large this is a tool for chatters to use, offering chat statistics, access to web APIs, moderation, games, text tools, communication tools and more. But it also delivers public mail.
Background While common bots are made for content creators (streamers), this one is made for chatters. All coding is done by me, but the community is closely involved in many design decisions. What is unique about this project is that every feature can be put immediately into a production environment, with direct feedback. This allowed me to learn what users find intuitive or engaging, often defeating my expectations. Note that names have been changed in the image.


This demo aims to implement parallax mapping, normal mapping and shadow maps. Note that every surface is actually flat—the illusion of depth comes from parallax mapping (lowering geometry) and normal mapping (lighting effects). More importantly, this is a JavaFx app with custom OpenGL integration, which has been a notorious shortcoming of native JavaFx.
Going Home Maya Render Util

An almost 3 minute long animation I made with Autodesk Maya, consisting of 4000 frames. Everything is made from scratch: models, character, rigging, animations, texture mapping, and generated textures. Only image textures for the exterior were pre-existing. This project may not seem relevant to my career, but this was one of the most challenging things I have ever done. The work ethic required to drive this to a (timely) completion pushed my limits more than any other project. The full-time work on this was about eight months, demanding me to constantly learn, conceive creative solutions, and put in many hours.

A utility to render all frames for multiple cameras in a Maya scene file. This was used to efficiently distribute the complex render job to a pool of available desktops.
Background

Consider the fact that one frame can take up to ten minutes to render. This alone would take over 600 hours in total. Since I had a pool of around 20 desktop computers available, I could distribute the rendering to multiple computers. They could render to a network drive, and the renderer automatically skips frames that already exist. So given a render job, this already distributes the work perfectly. However at the time, the default renderer (mental ray) only allowed a single camera to render, and I had twelve. So I would have to start render jobs on all machines twelve times. Since I cannot be at the university's PC pool at all times, the effort and total render time would be much higher. I could give every machine a different camera to render, but they have a different number of frames, again leaving much potential computation time wasted. This workflow is also prone to manual error, a single of which can ruin an entire batch of frames.

After being unable to make a "super camera" work (that would combine several cameras into one), I decided to create a tool that just queues up several render jobs in sequence. Although this was made in 2017, it sits next to the relevant project. Using the MEL scripting language from Maya (which I largely learned just for this tool), the tool would extract all camera information and render settings from a scene file, and run a render job for each. The tool is then started once on every machine, and the entire complex rendering job is fully distributed. I even added a shutdown command to turn off the PCs after the job was done. This allowed me to go there on a Friday afternoon, start the job, and come back Monday with all frames rendered.

Note that in principle this tool could have been very useful to other students, or anyone working with Maya, but after years of using mental ray, the next Maya version introduced a new renderer (Arnold). This is also why it is no longer working in the image (taken in 2021 with Maya 2018).
OgerUtil Misc

Over the years I started using the same code in multiple projects, and collected it as a library in this project. As of 2021, it has 10,000 lines of code (counting only logic). This library is used in almost every of my Java projects. It contains functions for string manipulation, unicode tools, logging, HTTP client abstraction, HTML/XML parsers, web APIs and scrapers, time-based collections, threading abstraction, persistence tools, custom JavaFx controls, shell abstractions, and more. For instance, all recent GUI layouts (JavaFx) are created with the VBuilder class. The image shows size of OgerUtil components, visualized using SpaceSniffer.
Typing Test tool to practice typing speed / accuracy.
Obfusca-tor v1 to hide plaintext API keys in source code.

2015

Map Editor


A crude map and object editor for primitives (boxes and spheres), written in Java and OpenGL. Although somewhat cumbersome, it greatly improves from the most basic low-level graphics workflow, where one enters object transformations by hand. This was made in tandem with another student, who created a separate game engine. We created a common file format (with compression) for maps, that can be loaded by the game engine. Custom textures can be added by anyone designing their own maps. We aimed to extend this beyond the uni project, and turn it into a full game with story, enemies, objectives and sword combat, but after many planning sessions it became apparent that our vision would require years to accomplish.
VelcroDB Misc

This is the successor to LoL Pick List, improving some of its flaws. The name is an intentionally bad spelling of Vel'koz, whose purpose is to gain knowledge. The prior tool was difficult to maintain because all champions were added by hand. VelcroDB checks the registry for the game installation directory, then takes all champions directly from the game files. It is also not restricted to the five predefined tags, allowing the user to fully customize tags. Tags can be easily added via suggested tags in the context menu, or with the quick tag mode where a selected tag can be added to any champ with a single click. The first item in the context menu opens a wiki page to help determine appropriate tags. There is now a search bar with and/not/or functionality and auto-completion. This allows to make the perfect pick to suit a given matchup, e.g. searching "hardcc&physical". Any search can be pinned. Win rate statistics are also easily added and displayed with an overlay.
Nut classifier A uni project with the goal to classify trail mix contents in photos. Written in C++ with OpenCV, it first segments all objects, computes handcrafted features, then from a few clicked objects learns to assign classes (using NN/kNN/linear classifier).
Mini Smart Home team project where my part was designing an Android app to monitor Bluetooth sensor data and offer controls.
Medical image processing group project where my part was to read a dataset saved in an archaic lossless-JPEG format from the year 2000.

2014

Game of Life Misc

For a university project I was in a team tasked to replicate this classical German board game. I designed the frontend with JS and CSS Animations, including all artwork (except for background sprites, i.e. trees and houses). The spinner for instance is created entirely in CSS. The browser shows the section of the board that is currently active. Player figures (family cars with space for up to six people) move smoothly across the track. The spinner animates the rolls that are given by the backend. An event log tracks the state of the game. This game was fully playable for multiple human and AI players.
Giveaway Browser simple filtered view of a subreddit that keeps refreshing.
Snake Game proof of concept for a very simple game loop with rules.
LoL Pick List Snake Draw

To help create and maintain a diverse champion pool in the game, I created this (I used to main fill as a role). For each role, a number of champions can be picked. Notes can be attached to them and show as tooltips (indicated in bottom right corner). The semi-opaque overlay can be used to mark tentative additions to the champ pool. The current selection is also copied to the clipboard (bottom text field), to be pasted into the in-game champion search.

I used to draw patterns made from a single line on paper. This is the first creative tool I developed. The line moves on a fixed grid, which is drawn to a canvas. It can be saved and loaded, and undo functionality allows to fix mistakes, such as when the head gets stuck in a dead end.

2013

Livestreamer Tool Series Scheduler

This was inspired by a browser extension called LoL Stream Browser. I made this tool for myself (and one friend), to discover livestreams on Twitch, Azubu and YouTube all in one place. Unlike the simple browser extension, this offered preview images of the streams. Streams can be opened via their webpage, or using Livestreamer (now maintained as Streamlink), which can open the streams directly in VLC player. Different game categories can be browsed efficiently, one page (100 streams) at a time. The advanced tooltips show all available data from the Twitch API, such as profile picture, creation date and partner status. I developed the tool until 2015 (screenshot taken in 2021).

Initially I used a .txt file to keep track of all the series I watch. It was cumbersome to edit text anytime an episode is finished, so I created this tool that requires just one click. The data is backed by a MySQL database. The tool also reminds you to keep information up to date. For instance, if the current date is past the specified season end, it reminds you to check new episodes.
Turtle Blueprints DNS Changer Misc

Turtles are robots from the Computercraft mod for Minecraft. They can be programmed in the game to move around and place blocks. This can be easily used to build predefined structures, however typing a building blueprint by hand is difficult. I made a simple tool with a graphical interface for that, that can also upload the blueprint script to Pastebin.

A tool that stores DNS profiles that can be switched between with a click. Additionally it could fetch IPs from a smart DNS website.
Big file reader command-line tool to efficiently search through very large text files.
Online shop demo backed by PHP/SQL, frontend with HTML/CSS/JS.

2012

LAN Food Delivery List v1 (2009) LAN Food Delivery List v2

Originally the idea came up in 2009, because it took a long time to get everyone's food order at LAN events. In an attempt to solve this, I made a batch script that everyone could open, type their name and order in, and it would be appended to a log file on a local host.

One of the first apps I made in Java was a GUI version of this tool. Instead of the Windows file system, it used sockets to connect to a local network host. The tool was made in the BlueJ editor, using the Stifte und Mäuse library for Java beginners, for networking and NetBeans to build the GUI. Unlike the previous version, it did not have problems with encoding special characters, and was robust to connection errors.

mj9's Projects

mj9 icon mj9

Config files for my GitHub profile.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.