RCKid is a handheld gaming device for young kids. Build for my two betatesters to spare them the horrors of youtube:) On the surface this is just another DIY little gaming handheld, but under the hood it is much more - the first truly personal device for a child that emphasizes creation over consumption, invites learning and tinkering and is designed to grow with the child. It went through many iterations and has a grand vision.
MP3 player with integrated radio built for small kids in a pretty wooden case. I got inspired for this when I watched by young daughter pretending to listen to music and control it via the buttons you often find on arm chairs. This shaped the device's control interface and its formfactor. Internally it uses ESP8266 for the MP3 playback a WiFi access and ATTiny3216 for the io/power management.
A really fast and no-nonsense terminal emulator with real cross platform support and some nifty features. The project started because I could not find a decent terminal emulator for Windows, despite the emerging WSL (back then, this predates the Windows Terminal that exists since and which is not bad at all. That said, I am still using my terminalpp to this day:). The terminal bypasses the conpty on Windows giving it absolute compatibility with escape sequences, uses native renderers on Windows and Linux (QT for apple) and comes with ropen, a tool that can use existig terminal connection to send files from remote servers to be viewed locally - super useful for those non-terminal friendly outputs like pdfs, images, etc.
My first big project back when I was studying high school in the early noughties, I thought having a web page is really cool. Back then I was working with Delphi, which was amazing RAD IDE, and I lacked the "advanced" editing & design features it had in contemporary web editors. So I created my own - with object inspectors, command palettes and syntax checking for the holly triad of HTML/CSS, JavaScript and PHP. Coincidentally, the syntax checker was the reason I ended up doing programming languages & compilers after I went to the university. The experience writing it (without any knowledge about lexing or parsing at the time) was so painful that I considered the whole field dead and wanted to specialize in CPU design instead. But the Compilers 101 course at the uni changed my mind completely when I saw the Chomsky hierarchy for the first time and realized how much pain I could have saved myself with proper knowledge:)
The above are just the largest projects I did, I have been part of many others - from designing and implementing educational games for kids with Down's Syndrome to weather forecasting for the Czech Academy of Sciences and to a plethora of smaller, mostly embedded, projects. For somewhat fuller list of my projects check my github page
Graduate level compiler course focusing on backend implementation and optimizations (register allocation, instruction selection). I believe that in systems programming (whose curriculium it is part of) more so than anywhere else the devil is in the details. Those details cannot be taught during a lecture on slides, so the course is very coursework heavy. But not all details are created equal - the entaglement between instruction selection and register allocation is real and important, the minute details about x86 instruction binary encoding and executable loading is not. That is why with the help of some of my very talented students I have created Tiny86, a virtual machine emulating the interesting (from compiler's perspective) parts of CPU architectures (and not just x86, but also RISC & friends) without drowning students in the "implementation details".
Undergraduate introduction to non-imperative programming paradigms. Interestingly, programming languages curriculum at CTU starts with C/C++. This is the first course the students have that exposes them to different ways to think about algorithms. It covers a lot of ground, lambda calculus (for which we have developed an "IDE" and present as a "programming language" - see the SPLASH-E paper), functional programming (Racket in the past, now transitioning to Haskell) and Prolog.
Introduction to building a Just In Time compiler using the LLVM, part of PLISS. Co-taught with Jan Vitek and Oli Fluckiger. Source code available at github.
Introduction to the LLVM compiler and its use as an optimizing JIT for dynamic languages (MI-LCF).
I believe that embedded programming is particularly great introduction to STEM due to its tangibility. Unfortunately, it also comes with increased cost of entry. While teaching at the grammar school, I have successfully applied for a Google CodeWeek funding that provided ample hardware for the kids to tinker with and I taught the first year of the embedded programming voluntary course at the school.
Voluntary high school course for older students (14y+) that taught them basics of C++ (manual memory management as a feature, OOP and programming design) as well as introduction to interesting, but more advanced topics from computer science - grammars (as I wanted to avoid students falling into the same trap I did with not knowing lexer from a parser:), evolutionary programming, basics of computer graphics, interpreters, etc.
I have developed a brand new course for compulsory informatics at a high school switching from Pascal to Python. I have taught the pilot two classes and onboarded the other techers on the new course design. The change was extremely well received and has been used for many years to come.
I am generally available at CTU on Fridays, but please arrange consultations for current courses by email. Online via Teams or Zoom is also possible with a more relaxed scheduling. If you are coming from outside, please note that some of the course links might not work as they are internal to the CTU.
Maj P., Muroya, S. L., Di Grazia, L, Vitek J.
Maj P., Siek K., Vitek J., Kovalenko A.
J. Sliacky, P. Maj
Berger, E.D., Hollenbeck, C., Maj P., Vitek O., Vitek J.
Lopez C.V., Maj P., Martins P., Saini V., Yang D., Zitny J., Sajnani H., Vitek J
Kalibera T., Maj, P., Morandat, F., Vitek, J.; VEE 2014
Maj P., Kalibera T., Vitek J.; Best technical presentation award.
Kalibera, T., Hagelberg, J., Maj, P., Pizlo, F., Titzer, B. and Vitek, J.
Pizlo F., Ziarek L., Maj P., Hosking A., Vitek J., Blanton E.
Pizlo F., Ziarek L., Blanton E., Maj P., Vitek J.
I have also helped organize various conferences in different roles, mostly as a student voluteer chair.
Part of the Azul Prime Java VM group, working on the fastest Java virtual machine available and its final tier LLVM-based optimizer and code generator. While at Azul, I was responsible for improving the VM’s warmup times (devising metrics and improving the code), dealt with key customers with piloting the VM and I lead the performance analysis team (4 people).
Focused on teaching, developed the NI-GEN course (graduate compilers, ~20 students) and BI-PPA (undergraduate programming paradigms, ~150 students). Leading bachelor and master theses, many of which received dean awards for outstanding theses.
Working on the design & implementation of almost all parts of the distributed non SQL big data store and analytics framework including core messaging, user-level API, distributed execution, initial implementation of R-like distributed queries on the cloud system.
Responsible for correcting bugs & developing new features for the SN compiler that is used by most developers for Sony Playstation 3, PSP and PS Vita. Apart from the compiler, also responsible for implementing PS Vita assembler from scratch (main developer).
Co-Advised by Jan Vitek and Jan Janousek. Thesis: Analyzing Large Scale Code Repositories
Thesis title: Source Code Plagiarism Detection, graduated s. c. l. Dean's award for outstanding Master thesis
1st class degree from major subjects taken. Advised by Henk Muller
The above is heavily abridged, full CV is also available.
Petr Maj
Department of Theoretical Computer Science
Faculty of Information Technology, Czech Technical University
Thakurova 9, 16000 Praha 6
Czech Republic