I started programming in 1996, at age 13, with Visual Basic 4. I remember getting excited with Visual Basic 5, which was a leap forward. I wrote various desktop applications with it, most of which can be found in the "downloads" section of my website. Most of them even still run, which says something about Microsoft's commitment to backwards compatibility.
Around 2003, I discovered Python, and wrote artificial intelligence agents for a text-based MMORPG I had been playing at the time. This was also the focus of my undergraduate dissertation in 2008. Around that time, I discovered Django, and branched into writing web apps (front- and backend).
I've been using Python as my main language ever since, and Django for most web-related projects. I've dabbled in other languages (PHP, C, C++, Go, Rust, Erlang, etc) and web frameworks (Flask, Bottle, Gorilla, Iron, etc), some of which I really like and use whenever it makes sense.
Over the years, I've evolved from a sole developer in projects to working with more people and larger teams, both in the same and other departments. I have come to strongly believe in the advantages of code reviews and giving feedback to (and receiving feedback from) other developers, and doing my best to enable others to work independently, while still having visibility into everyone else's work.
I recently discovered two unrelated passions, one for photography and one for hardware. I've been pursuing both with great aplomb, as they turned out to be excellent. I also very much enjoy writing about my projects on my website, and my posts regularly find their way to the front page of Hacker News, which is very rewarding.
DFINITY is developing a distributed computer, sort of like an AWS Lambda that isn't owned by any single entity.
Doing DevOps for such a groundbreaking product presented its own set of unique challenges. Qualifying a release was a difficult process, as each release had to go through a battery of multi-day automated tests, and keeping the code in good shape while in development was challenging in its own right.
Although it was challenging, I had the pleasure of working with an excellent team of very competent people, and I learned a lot about an area that was not my core competence. I'm very happy to have gained more experience on all parts of the development stack, as that's crucial for better architecting systems and processes.
Gray Oncology Solutions is a small startup that tries to optimize patient outcomes by increasing patient treatment rates and shorten treatment times.
As a technical founder of a small startup, the challenges are many, from selecting the technology stack of the company to helping guide the overall business strategy.
This was certainly a very challenging environment, due to both the business uncertainties we had to navigate and the difficulties of setting up and growing a brand new company. It was a high-stakes environment where every decision matters, and it taught me a lot.
Elation Health provides HIPAA-compliant EHR software, so security and privacy considerations were paramount.
The main challenge there was working with a large codebase and infrastructure that had already been in operation for almost a decade and had thousands of customers.
My contribution there mainly focused on improving the development processes, improving the maintainability of the code, ensuring fewer bugs through automated (testing, type-checking, linting) and manual methods (documentation, processes, reviews), which included a migration of the entire codebase from legacy Python 2 to 3.
Another aspect of my contribution was on the ops side, where I oversaw and carried out a migration of our entire staging infrastructure to Kubernetes (along with associated tooling) so developers could instantly deploy branches on a cluster to perform work, testing and QA on them.
Silent Circle is a secure communications platform. My team is responsible for the entirety of the backend and frontend, including the various APIs, user data, devops, security and infrastructure architecture. In short, I am largely responsible for everything that happens on the server after a stock Debian machine is provisioned.
The backend is written in Django, with some parts formerly written in Go, and the frontend is using various JS technologies like Angular and React.
Obviously, given the company's focus, a strong focus on cryptography and security is necessary, so the role mainly encompasses those aspects. To that end, I helped design some of the protocols that underpin our services, such as group chats.
Responsibilities also include conducting interviews of new candidates, helping come up with an efficient hiring process, and conducting code reviews and training of new hires.
Togethera was a private sharing application with a focus on strong UX and ease of use. My role as a technical advisor was to help with decisions about the choice of stack, taking into account business needs and abilities, design high-level architecture, and sometimes help with tracking down difficult bugs or optimizing critical paths.
I also helped with less technical aspects, like leading recruitment and helping with managerial issues within the company.
I was CTO and employee #1 on Luluvise, a private social network for women. I built the first prototype, which used Django on the backend and (the then-new) websockets for providing real-time communication. This helped the company get to series A, and subsequently pivot to other areas before being acquired by Badoo.
My role also entailed hiring, contracting external people for various tasks, and managing the development team.
Stochastic Technologies is my consultancy company. We help large and small businesses get their ideas to market, or support their current applications, as needed.
Net Communities was a company that had a number of news websites, based on their custom Django CRMs. My responsibilities included support of the existing features and development of new ones, as business needs arose.
Hellenic Homes was a construction company. I was the manager of the entire IT infrastructure for the company headquarters that housed more than 100 people, and I was the sole developer responsible for a host of in-house web-based applications, written in Django. The applications were central to the company's scalability, as sharing customer data had hit a bottleneck until I developed a solution to the problem.
The application had been entirely designed developed by me, going off a loose list of requirements by the business, which I had to capture.
Open Source Libraries
Here is a list of my open-source libraries. I have only included a few of the most important ones, or ones I am most proud of. You can find an exhaustive list, and also the sources for many of the full-blown applications in the next section, in my Gitlab or Github pages.
This section purposely omits larger projects I've created (and which are farther down), instead only focusing on small libraries or scripts.
ShortUUID is a library I wrote that I personally find very useful. It takes a standard UUID/GUID and serializes it into a much shorter format, based on a customizable alphabet.
This lets you generate human-readable IDs that still have high entropy. It can also generate purely random IDs by using the system's PRNG.
Expounder is a small but opinionated library that aims to improve the way educational text is written.
It's a way of writing that allows the writer to expound on terms they're introducing (hence the name) by adding a dotted hyperlink. The reader can then click the hyperlink to have a sentence seamlessly appear in the flow of the text, making itself a part of the larger paragraph.
Essentially, this allows readers to specify their own level of depth they want the text to go into.i This lets experienced readers skip most explanations instead of being tired by reading things they already know, while still explaining everything to novice readers seamlessly.
String phone is a secure communications protocol and library geared towards embedded devices. Its goal is to allow, for example, your mobile phone to communicate with your home automation devices in a secure manner, even over an insecure channel. It also allows for authentication of devices, so you can be sure that the only device whose commands will be accepted is the phone.
It uses the NaCl library for strong cryptography, only building minimally on that to provide the desired functionality, to ensure that the added attack surface is as small as possible.
Django-annoying is a popular library that solves various annoyances in Django. I stepped in to maintain this library when the original author disappeared, and have been responsible for it ever since.
Goatfish is a schemaless, efficiently indexable database built on top of SQLite. Essentially, it allows you to store dictionary-like objects in an SQLite database, while still allowing indexing and efficient queries over them.
netproxy is a Hulu/Netflix/Pandora/etc proxy in a box, for those of us outside the US.
An API for IMDB. They don't provide one themselves, so someone had to.
Omnisync is rsync with configurable backends. Instead of only SSH and local, Omnisync can support anything, like ftp, http, even zip files.
This is a list of some of the side-projects I've launched over the years. Some are profitable, some are free, some have thousands of users, some have very few, some I made completely by myself, some with a friend. Some are closed-source, some are open-source, and you can find the OSS ones in my Gitlab or Github pages.
historious is a full-text search engine for bookmarks. If you remember some of the text in a page you bookmarked a while ago, historious will find it.
historious is currently significantly profitable, and has tens of thousands of users.
Dead Man's Switch lets you write messages to your loved ones, to be sent only after your death. The site will check up on you and send the messages if you don't reply in time.
DMS is also profitable, and has thousands of users.
Pastery is the world's best pastebin, and the only one I use frequently and to great acclaim.
TiThess is an events website for Thessaloniki, where I live. It shows you what's going on around the city every night. The codebase is very clean and easily extensible to other cities.
My website. It runs on a custom CMS I wrote, with Dropbox integration (so I can write directly from my local machine) and other nice features.
I'm quite proud of how fast the site is, give it a try above, and try navigating to various posts.
Spamnesty is an open-source service that wastes email spammers' time. Just forward a spam email to it, and Spamnesty will pretend to be a real person and try to engage the spammer in conversation.
A simple open-source service for making custom countdown pages.
Instabot was a chatbot (like Hubot) as a service. You'd go on the site, enter your room's name, and Instabot would connect and provide various integrations.
Instahero was a powerful analytics processor, which allowed you to select your analytics reports from an extensive list of pre-made reports or to write your own in Lua, which would then run on the Instahero servers and produce your custom reports.
The Badginator (defunct)
The Badginator allowed you to create custom achievements for your games or applications, and provided a central place where users could see and share the ones they had completed.
The Summarist was a website that had summaries of various business books, to help people to make a more informed decision about whether to read a certain book or not.
Persowna was a Mozilla Persona identity provider with many security features like two-factor authentication, customizable authentication, etc.
Persowna failed to gain significant traction, as Persona failed, and was shut down when Persona was.
Moneygement was a personal finance management app that I wrote in 2006. It had many active users, and was a free app. I took it down after a few years, when the number of users declined to almost zero.
AggeliesNow was the first classifieds site in Cyprus. It was shut down after becoming evident that users weren't willing enough to pay to post classifieds.
Δεξί Χέρι (defunct)
Deksi Xeri was a personal assistant service for Greece. Users could request tasks for a fee, and a real person would perform them.
The following are projects I've created that are related to hardware. Some are PCBs, some are software libraries, and some are firmware code. I haven't included them all, as they would be too many.
Most links lead to my writeups about each project, since that's the best way to explain what each one does.
I thought it would be funny to turn an old rotary dial phone into a mobile phone.
So I did.
My dad needed some way to remotely control the fields' irrigation system, as well as receive notifications on potential error conditions, so I built him one that works via mobile phone.
The irrigation controller and the iRotary could benefit from a custom-designed PCB that contained a GSM modem and a microcontroller, so I designed and built one.
The GSM modem I used in the board above didn't have a driver library, so I wrote one.
I needed a way to upgrade my projects' firmware over the internet, so I wrote a server that will deliver upgrades to devices, but only if they aren't already running the latest version.
i wanted to control my tv, ac and other devices from my mobile, so i came up with a way to create an infrared emitter and modulate the signal to transmit the codes for all the devices' remotes, emulating them.
I wanted to control even more devices, so I wrote an RF transceiver and the associated software.
RF turned out to be fiddly, so I bought some Sonoff wifi-enabled relay switches and wrote custom firmware for them so I can turn devices on and off via WiFi, through an API.
I wrote a customizable Android remote control so I could control all the above devices more conveniently.
I didn't want to turn the devices on and off by hand, so I designed and build a sensor board PCB and wrote automation software to read the inputs and control the devices around the house based on who was in what room, the time of day, the available light, temperature, and other inputs.
I was hungry and I didn't want to cook, so I designed and built a PCB that is the open-source equivalent of the Amazon Dash button, and I programmed it so it will order food automatically when I press it.
I got too fat from all the easy food so I turned an old Wii Balance Board into a WiFi-enabled bathroom scale and uploaded my weight for everyone to see.
I like having my back scratched, but everyone complained that they were too tired to do it, so I built a robot servant.
I thought it would be fun to control the house lights' color and intensity through an API, so I designed and built a controller PCB for LED strips. I then thought it would be great if the house lights could pulse along with my video games when I played, so I wrote some software to connect the two. The video is in the post.
I organize the largest Python meetup in Greece (in Thessaloniki), where we meet twice a month and discuss various topics, libraries, techniques and other updates in Python and technology in general.
I have been hosting tracks in Thessaloniki's largest developer conferences (FrontMASS, DevIt, Voxxed Days), and generally like being a part of and furthering the technology community in Thessaloniki.
I've also given talks on various conferences and topics, including FOSDEM.
I like taking photos. My best are above.
I also like writing about things I've made, or cool new techniques I've discovered of doing something better, or just teaching people things I've learnt. Learn Python in Ten minutes , a short ebook I wrote, has sold thousands of copies to date.
You can read all of this on my site, in the link above.
A list of papers I have (co-)authored.
Sparse PCA through Low-rank Approximations
Dimitris S. Papailiopoulos, Alexandros G. Dimakis, Stavros Korokithakis
We introduce a novel algorithm that computes the k-sparse principal component of a positive semidefinite matrix $A$. Our algorithm is combinatorial and operates by examining a discrete set of special vectors lying in a low-dimensional eigen-subspace of A. We obtain provable approximation guarantees that depend on the spectral profile of the matrix: the faster the eigenvalue decay, the better the quality of our approximation. For example, if the eigenvalues of A follow a power-law decay, we obtain a polynomial-time approximation algorithm for any desired accuracy. We implement our algorithm and test it on multiple artificial and real data sets. Due to a feature elimination step, it is possible to perform sparse PCA on data sets consisting of millions of entries in a few minutes. Our experimental evaluation shows that our scheme is nearly optimal while finding very sparse vectors. We compare to the prior state of the art and show that our scheme matches or outperforms previous algorithms in all tested data sets.
Heuristic Rule Induction for Decision Making in Near-Deterministic Domains
Stavros Korokithakis, Michail G. Lagoudakis
This paper focuses on a rule induction method for (near-)deterministic domains, so that an unknown world can be described by a set of short rules with well-defined preconditions and effects given a brief interaction with the environment. The extracted rules can then be used by the agent for decision making. We have selected a multiplayer online game as a model of a near-deterministic domain and used our approach to infer rules about the world, generalising from a few examples. The end result is a set of a few meaningful rules that accurately describe the world, on which a simple planner was able to perform near optimally in a fight scenario.