diff --git a/.gitattributes b/.gitattributes index 49e49b6..3f13ad8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,3 +6,4 @@ # Git LFS *.pdf filter=lfs diff=lfs merge=lfs -text *.mov filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/docs/assets/images/concernification_api_feedback.jpg b/docs/assets/images/concernification_api_feedback.jpg new file mode 100644 index 0000000..79bde94 Binary files /dev/null and b/docs/assets/images/concernification_api_feedback.jpg differ diff --git a/docs/assets/images/concernification_fm_feedback.jpg b/docs/assets/images/concernification_fm_feedback.jpg new file mode 100644 index 0000000..d8d38ff Binary files /dev/null and b/docs/assets/images/concernification_fm_feedback.jpg differ diff --git a/docs/assets/images/concernification_introduction.jpg b/docs/assets/images/concernification_introduction.jpg new file mode 100644 index 0000000..361452e Binary files /dev/null and b/docs/assets/images/concernification_introduction.jpg differ diff --git a/docs/assets/images/concernification_missing_feature.jpg b/docs/assets/images/concernification_missing_feature.jpg new file mode 100644 index 0000000..4313392 Binary files /dev/null and b/docs/assets/images/concernification_missing_feature.jpg differ diff --git a/docs/assets/images/coronavirus_dashboard.jpg b/docs/assets/images/coronavirus_dashboard.jpg new file mode 100644 index 0000000..96d866a Binary files /dev/null and b/docs/assets/images/coronavirus_dashboard.jpg differ diff --git a/docs/assets/images/hochseilgarten.jpg b/docs/assets/images/hochseilgarten.jpg new file mode 100644 index 0000000..ed5cf0e Binary files /dev/null and b/docs/assets/images/hochseilgarten.jpg differ diff --git a/docs/assets/images/hochseilgarten_parcours.jpg b/docs/assets/images/hochseilgarten_parcours.jpg new file mode 100644 index 0000000..878e365 Binary files /dev/null and b/docs/assets/images/hochseilgarten_parcours.jpg differ diff --git a/docs/assets/images/hochseilgarten_responsive.jpg b/docs/assets/images/hochseilgarten_responsive.jpg new file mode 100644 index 0000000..bab8a41 Binary files /dev/null and b/docs/assets/images/hochseilgarten_responsive.jpg differ diff --git a/docs/assets/images/kinect_teaser.jpg b/docs/assets/images/kinect_teaser.jpg new file mode 100644 index 0000000..6a6a21d Binary files /dev/null and b/docs/assets/images/kinect_teaser.jpg differ diff --git a/docs/assets/images/maxpaynezone.jpg b/docs/assets/images/maxpaynezone.jpg new file mode 100644 index 0000000..078867c Binary files /dev/null and b/docs/assets/images/maxpaynezone.jpg differ diff --git a/docs/assets/images/maxpaynezone_2.jpg b/docs/assets/images/maxpaynezone_2.jpg new file mode 100644 index 0000000..a26532d Binary files /dev/null and b/docs/assets/images/maxpaynezone_2.jpg differ diff --git a/docs/assets/images/tippspiel_matches.jpg b/docs/assets/images/tippspiel_matches.jpg new file mode 100644 index 0000000..b018678 Binary files /dev/null and b/docs/assets/images/tippspiel_matches.jpg differ diff --git a/docs/assets/images/tippspiel_matches_responsive.jpg b/docs/assets/images/tippspiel_matches_responsive.jpg new file mode 100644 index 0000000..4bb63d7 Binary files /dev/null and b/docs/assets/images/tippspiel_matches_responsive.jpg differ diff --git a/docs/assets/images/tippspiel_ranking.jpg b/docs/assets/images/tippspiel_ranking.jpg new file mode 100644 index 0000000..596fe1e Binary files /dev/null and b/docs/assets/images/tippspiel_ranking.jpg differ diff --git a/docs/assets/images/tippspiel_ranking_responsive.jpg b/docs/assets/images/tippspiel_ranking_responsive.jpg new file mode 100644 index 0000000..f89581f Binary files /dev/null and b/docs/assets/images/tippspiel_ranking_responsive.jpg differ diff --git a/docs/assets/images/tippspiel_tipp.jpg b/docs/assets/images/tippspiel_tipp.jpg new file mode 100644 index 0000000..6bdf1fe Binary files /dev/null and b/docs/assets/images/tippspiel_tipp.jpg differ diff --git a/docs/assets/images/tippspiel_tipp_responsive.jpg b/docs/assets/images/tippspiel_tipp_responsive.jpg new file mode 100644 index 0000000..ce3ac86 Binary files /dev/null and b/docs/assets/images/tippspiel_tipp_responsive.jpg differ diff --git a/docs/assets/images/touchcore_class_diagram.jpg b/docs/assets/images/touchcore_class_diagram.jpg new file mode 100644 index 0000000..b2f36fc Binary files /dev/null and b/docs/assets/images/touchcore_class_diagram.jpg differ diff --git a/docs/assets/images/touchcore_feature_model.jpg b/docs/assets/images/touchcore_feature_model.jpg new file mode 100644 index 0000000..d1d50a1 Binary files /dev/null and b/docs/assets/images/touchcore_feature_model.jpg differ diff --git a/docs/assets/images/touchcore_impact_model.jpg b/docs/assets/images/touchcore_impact_model.jpg new file mode 100644 index 0000000..d3e0fbf Binary files /dev/null and b/docs/assets/images/touchcore_impact_model.jpg differ diff --git a/docs/assets/images/touchcore_reuse.jpg b/docs/assets/images/touchcore_reuse.jpg new file mode 100644 index 0000000..9abbe50 Binary files /dev/null and b/docs/assets/images/touchcore_reuse.jpg differ diff --git a/docs/assets/images/touchcore_sequence_diagram.jpg b/docs/assets/images/touchcore_sequence_diagram.jpg new file mode 100644 index 0000000..9fd7359 Binary files /dev/null and b/docs/assets/images/touchcore_sequence_diagram.jpg differ diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css index 0ffd952..4c40fb1 100644 --- a/docs/assets/stylesheets/extra.css +++ b/docs/assets/stylesheets/extra.css @@ -24,3 +24,13 @@ ul li .admonition.hidden { display: none; } + +/* Increase space between icon/emoji and title in card grid */ +.grid.cards .twemoji { + margin-right: 5px; +} + +/* Hide extra figures so they only show up in the lightbox */ +.md-typeset figure.hidden, .md-typeset .glightbox .hidden { + display: none !important; +} diff --git a/docs/assets/videos/kinect_fitts_law.mp4 b/docs/assets/videos/kinect_fitts_law.mp4 new file mode 100644 index 0000000..148ac40 --- /dev/null +++ b/docs/assets/videos/kinect_fitts_law.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19d38119b00eb028d71a615f5506efda30f7514c46fed2f6453586ee580aec1a +size 2255631 diff --git a/docs/assets/videos/kinect_fitts_law_close.mp4 b/docs/assets/videos/kinect_fitts_law_close.mp4 new file mode 100644 index 0000000..ec5fa5c --- /dev/null +++ b/docs/assets/videos/kinect_fitts_law_close.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e758a060a5a6d23e544d7751491d22e1b638828b4ae3c8093d50823ec54968fa +size 2410266 diff --git a/docs/projects/index.md b/docs/projects/index.md index 1166db6..cb14965 100644 --- a/docs/projects/index.md +++ b/docs/projects/index.md @@ -1,3 +1,413 @@ # Projects -TBD +A selected list of projects that I created or am/was involved in. +They include both work projects and personal ones. + +## Software Engineering + +
+ +* :material-heart-pulse:{ .lg .middle } **Opal** + + --- + + A solution providing patients timely access to their medical data. + It empowers patients and their caregivers to play an active role in their care. + + [:octicons-arrow-right-24: Tell me more](#opal) + +* :simple-django:{ .lg .middle } **Digital Printing Workflow** + + --- + + A web application built with Python and Django to manage a digital printing workflow including sending print jobs to an industrial printer via JMF/JDF. + + [:octicons-arrow-right-24: Tell me more](#digital-printing-workflow) + +* :student:{ .lg .middle } **Concernification Study** + + --- + + A study web site built with TypeScript and Angular to allow study participants to provide their feedback interactively. + + [:octicons-arrow-right-24: Tell me more](#concernification-study) + +* :fontawesome-brands-java:{ .lg .middle } **TouchCORE** + + --- + + A tool for software design modelling aimed at developing scalable and reusable software design models. + + [:octicons-arrow-right-24: Tell me more](#touchcore) + +
+ +## Personal Projects + +
+ +* :fontawesome-solid-virus-covid:{ .lg .middle } **COVID-19 Montreal Dashboard** + + --- + + A dashboard built with [Plotly Dash](https://dash.plotly.com/) for the epidemiological situation of the corona virus pandemic in Montréal and Québec. + + [:octicons-arrow-right-24: Tell me more](#covid-19-montreal-dashboard) + +* :simple-python:{ .lg .middle } **SEPAQ Availability Scraper** + + --- + + A scraper for availability of [SEPAQ](https://www.sepaq.com) camp sites that makes it easier to find available camping spots across all SEPAQ parks. + + [:octicons-arrow-right-24: Tell me more](#sepaq-availability-scraper) + +* :soccer:{ .lg .middle } **Tippspiel** + + --- + + A web application for users to predict results of football (or soccer :wink:) matches and compete with each other. + + [:octicons-arrow-right-24: Tell me more](#tippspiel) + +
+ +## Archive + +Projects in this category are older and mentioned here for completeness sake. +In case of an open source project it means that the corresponding repository is archived. + +
+ +* :simple-django:{ .lg .middle } **Docker Monitor** + + --- + + A simple helper script that allows you to monitor docker containers to ensure they are running and healthy. + + [:octicons-arrow-right-24: Tell me more](#docker-monitor) + +* :raised_hand:{ .lg .middle } **Kinect Project** + + --- + + A university project using the Kinect for an experiment to measure how humans perform pointing in 3D. + + [:octicons-arrow-right-24: Tell me more](#kinect-project) + +* :fontawesome-brands-wordpress-simple:{ .lg .middle } **Hochseilgarten Nagold** + + --- + + A responsive website set up using Wordpress for a high ropes garden. + + + [:octicons-arrow-right-24: Tell me more](#hochseilgarten-nagold) + +* :fontawesome-brands-php:{ .lg .middle } **Max Payne Zone** + + --- + + A fan site for the game _Max Payne_ providing news about the game in German. + + [:octicons-arrow-right-24: Tell me more](#max-payne-zone) + +
+ +## Project Details + +### Opal + +Since 2021 I have been working with the [Opal Health Informatics Group](https://www.opalmedapps.com) on the Opal solution (1). +As the _Software Architect_ I am overseeing the software architecture and future design of Opal. +I helped establish various best practices and improvements, such as using containerization, CI/CD, use of code quality tools, "everything as code", dependency management via [Renovate](https://docs.renovatebot.com/), and more. +{ .annotate } + +1. Opal is a patient portal designed to empower patients with their medical information. + It consists of the patient portal, and a hospital-facing part to manage the medical data as well as enrich it to make it more useful for patients. + +A big part is the question of how many of the legacy components can be migrated to a new component. +I proposed the [Strangler Fig Migration Pattern](https://martinfowler.com/bliki/StranglerFigApplication.html) instead of doing a "big bang replacement". + +I also develop and troubleshoot. +For example, I designed and implemented support for smart devices. +This allows a patient to send vital signs to the hospital. + +**Information:** + +* [Opal Website](https://www.opalmedapps.com/en) + +### Digital Printing Workflow + +In 2020 I built a web app for a client to manage a digital printing workflow. +The web app helps keep the overview of print jobs and allows the user to follow the progress from planning, printing, to production, shipment, and completion (it has been invoiced). +This web app significantly decreases the manual steps (which are error-prone) to be performed by a user and therefore reduces the potential for errors. +It has successfully helped to manage large amounts of print jobs during peak times. + +[Django](https://www.djangoproject.com) is used to define a general model (data structure) for all data which is coming from various sources (XML, CSV, PDF, HTML). +Individual small services/components are used to process these different sources. +I did consider a microservice architecture but for the type of application it is overkill and would have unnecessarily increased the complexity. +The services/components were developed separately and packaged as Python packages. +Some are containerized while others are dependencies of (i.e., part of) the Django web app. + +A central part is the ability to print a job directly from the web app on the production printer. +This is accomplished by integrating the printer via the industry standard _JDF_/_JMF_. +_JMF_ stands for _Job Messaging Format_ and is a communication protocol based on XML over HTTP. +_JDF_ stands for _Job Definition Format_ which describes the print ticket in XML for the production printer. + +In this project I used a linter and wrote unit tests from the beginning and have to say that has helped to increase the quality of the application. +It has lead to only a few bugs that made it into production. +I also used [drone](https://www.drone.io/) as the continuous integration server and for deployment to the staging environment. + +**Information:** + +* **Backend:** Python, Django, PostgreSQL +* **Frontend:** CSS, HTML, JavaScript, jQuery, Bootstrap +* **Other:** Docker, Unit Testing, CI/CD, Web/Document Scraping, Data Analysis (pandas), Git, Bash, XML, JSON, Network Printing via JDF/JMF + +### Concernification Study + +In 2018, during my [PhD research](../research/index.md) I designed an algorithm that extracts a feature model along with the API for each feature from a framework. +This is done by looking at examples that are typically provided to show different use cases/features of the framework. +I needed to evaluate the accuracy of the algorithm with a user study. + +To allow participant to provide feedback in an interactive way, I built a web application using [Angular](https://angular.dev/) on the client-side and [Node.js](https://nodejs.org) on the server-side. +The feedback is collected for evaluating the result of an algorithm I designed, which extracts a concern (feature model and the corresponding API for each feature) of a software framework. +The framework I mainly used is the _Android SDK_ (specifically the [notifications part](https://developer.android.com/reference/android/app/Notification)). + +
+ ![Concernification Study Introduction](../assets/images/concernification_introduction.jpg){ width="500" } +
Introduction to the Concernification Study with instructions
+
+ +
+ ![Concernification Study Feature Model Feedback](../assets/images/concernification_fm_feedback.jpg){ width="500" } +
Giving feedback on the feature model of a framework
+
+ +
+ ![Concernification Study Missing Feature](../assets/images/concernification_missing_feature.jpg){ width="500" } +
Adding a missing feature
+
+ +
+ ![Concernification Study API Feedback](../assets/images/concernification_api_feedback.jpg){ width="500" } +
Giving feedback on the API of a feature
+
+ +The diagram part is done using [GoJS](https://gojs.net/latest/index.html), a nice JavaScript Diagram framework. +The remainder of the UI is done using [Bootstrap](https://getbootstrap.com/) and [jQuery](https://jquery.com/). +The study data is loaded from JSON files. +Once a user submits the feedback, an API is called on a Node.js server which then stores the data. + +**Information:** + +* **Technologies:** Angular, TypeScript/JavaScript, Node.js, Express.js, REST, JSON, HTML, CSS, Git +* **[Try it out](https://concernification.mattsch.com/android-notifications2-test)** + +### TouchCORE + +During my PhD, I was part of a team (as the Lead Software Developer/Software Architect) working on [TouchCORE](https://djeminy.github.io/touchcore/), which is a multitouch-enabled tool for agile concern-oriented software design modeling aimed at developing scalable and reusable software design models. + +
+ ![TouchCORE Feature Model](../assets/images/touchcore_feature_model.jpg){ width="500" } +
Feature Model in TouchCORE
+
+ +
+ ![TouchCORE Impact Model](../assets/images/touchcore_impact_model.jpg){ width="500" } +
Impact Model in TouchCORE
+
+ +
+ ![TouchCORE Class Diagram](../assets/images/touchcore_class_diagram.jpg){ width="500" } +
Class Diagram in TouchCORE
+
+ +Besides the main focus being on reuse, the tool also focusses on allowing users to quickly and seamlessly build software design models. +It provides a touch-based interface allowing the user to use multitouch gestures besides using the traditional keyboard and mouse. +For example, I designed the sequence diagram editor that allows a user to define the behaviour for the given class diagram in a fast and intuitive way. + +
+ ![TouchCORE Sequence Diagram](../assets/images/touchcore_sequence_diagram.jpg){ width="500" } +
Sequence Diagram in TouchCORE
+
+ +At the end, the user can generate the code for the design. + +The backend is built with the [Eclipse Modeling Framework (EMF)](https://www.eclipse.org/modeling/emf/) and the frontend with [MT4j](https://github.com/mschoettle/mt4j) to provide the touch-based interface. + +
+ ![TouchCORE Reusing a concern](../assets/images/touchcore_reuse.jpg){ width="500" } +
Reusing another concern (a reusable piece of a collection of functionality) in TouchCORE
+
+ +**Information:** + +* **Technologies:** Java, OOP, Eclipse Modeling Framework (EMF), XML, Code generation, JUnit, GUI, Git +* **Project Management:** Bitbucket (Issue Tracker, Pull Requests, Code Reviews, Wiki) +* **Videos:** + * [View Demo Video from my PhD Defence](../assets/videos/phd_defence_demo.mov) + * [View Demo Teaser from 2014 on Youtube](https://www.youtube.com/watch?v=Am9jp2y2Uds) + * [View Demo Teaser from 2013 on Youtube](https://www.youtube.com/watch?v=Dxc5LvV3Nsw) + +### COVID-19 Montreal Dashboard + +Dashboard for the epidemiological situation of the SARS-CoV-2 (coronavirus) pandemic in Montréal and Québec. + +
+ ![COVID-19 Dashboard](../assets/images/coronavirus_dashboard.jpg){ width="500" } +
+ +I started contributing to this project towards the end of 2020. +I helped update it to the latest data formats of data provided from official sources, and adding more graphs. +In addition, I automated the download and update of data every day. +This helped keep the data up-to-date without any manual intervention. + +**Information:** + +* **Technologies:** Python, pandas, Plotly, Dash, Git, Bash +* [Blog post](../blog/posts/2021/covid-19-montreal-dashboard.md) +* [Project on GitHub](https://github.com/jeremymoreau/covid19mtl/) +* **[View project](https://covid19mtl.ca)** + +### SEPAQ Availability Scraper + +Scraper for availability of SEPAQ camp sites. +Makes it easier to find available camping spots across all SEPAQ parks. + +It extracts all availability information for specific types of camp sites (_Prêt-à-camper_(1) ). +The information is then parsed and camping sites with a given minimum availability (number of days) are extracted and the parks with their date ranges output for review. +{ .annotate } + +1. Ready to camp: You only need to bring your food and sleeping bags. + +The script can also be adjusted to look at specific camp sites and only look for availability in interested date ranges for those. + +**Information:** + +* **Technologies:** Python, Web Scraping +* [Read the blog post](../blog/posts/2021/sepaq-availability-scraper.md) +* [Project on GitHub](https://github.com/mschoettle/sepaq-availability-scraper) + +### Tippspiel + +
+ ![Tippspiel Matches](../assets/images/tippspiel_matches.jpg){ width="500" } +
The match schedule of a tournament with results
+
+ + + +A _Tippspiel_ is a prediction game where the game results of (football) matches are predicted and varying points given based on the actual result. +Starting in 2006, I have been running a _Tippspiel_ (almost) every two years for each World Cup and European Championship where approximately 50 users participate for fun. +Besides game results, there are also additional questions (for example, which team will win the World Cup) allowing users to earn bonus points. + +
+ ![Tippspiel Tipps](../assets/images/tippspiel_tipp.jpg){ width="500" } +
Past guesses and making a guess for the next game
+
+ + + +The frontend is built with HTML5 and CSS3, is responsive(1), and supports Retina screens. +In the screenshots, you can see how the layout and texts are adjusted for smaller screens and mobile devices while showing the same information. +{ .annotate } + +1. See the additional screenshots in the "slideshow" when you click on a screenshot. + +The backend is built with PHP and MySQL running on an Apache server. +The game data is retrieved from a web service ([OpenLigaDB](https://www.openligadb.de/)) using a REST API and (their older SOAP API) returning JSON. +A script is executed periodically by a cron job to retrieve new match results and new fixtures (for the knockout phase). + +**Information:** + +* **Technologies:** PHP, MySQL, SOAP/REST API (XML/JSON), HTML5, CSS3, Apache +* **[View Project](https://tippspiel.mattsch.com)** + +### Docker Monitor + +INFO: This project is archived (not actively maintained anymore). + +Simple helper script that allows to monitor docker containers to ensure they are running and healthy. +The script only outputs anything in the opposite case (non-running or unhealthy). +This allows it to be used for cronjobs etc. + +**Information:** + +* **Technologies:** Python, Docker, Bash +* [Project on GitHub](https://github.com/mschoettle/docker-monitor) + +### Kinect Project + +![3D room](../assets/images/kinect_teaser.jpg){ width=250, align=right } + +In 2011, during my graduate degree at university, my team (three in total) did a project using the _Kinect_ to build a _Fitts' Law_ 3D application. +[Fitts' Law](https://en.wikipedia.org/wiki/Fitts%27s_law) shows how users perform the act of pointing (virtually) to an object on a screen using a pointing device (such as the mouse). + +The goal was to build an application that allowed to gather measurements on how humans perform pointing in a three-dimensional space. +The Kinect and application were installed/running on a screen installed in a hallway that is showing a digital information board. +A background application was managing the window management to switch from the information screen to the application using a dedicated gesture, and back to the screen after no input is detected by the Kinect for a certain time. +The user can then play the game, as you can see below, and is then presented with their "performance". + +The Kinect backend was written in C++ making use of an (unofficial) Kinect SDK. +The frontend was done with _Unity_, and written in C#, including its backend to store the results of each player in a SQLite database. +The Kinect backend and frontend were connected using a socket in order to receive the detected hand gestures and movements. + +**Information:** + +* **Technologies:** C#, Unity, SQLite, C++, Subversion (SVN) +* [Video showcasing how a person interacts with the screen and performs the experiment](../assets/videos/kinect_fitts_law.mp4) +* [Close-up video of the screen showing the game](../assets/videos/kinect_fitts_law_close.mp4) + +### Hochseilgarten Nagold + +
+ ![Hochseilgarten Nagold Website](../assets/images/hochseilgarten.jpg){ width=500 } +
Click the image for more screenshots
+
+ +![Hochseilgarten Nagold Parcours](../assets/images/hochseilgarten_parcours.jpg){ .hidden } + +![Hochseilgarten Nagold Responsive](../assets/images/hochseilgarten_responsive.jpg){ .hidden } + +In 2014, I built website for a client with Wordpress and a theme with retina and responsive support. +A booking calendar and custom forms are used for visitor interaction. +Custom CSS was used for improved appearance. + +In May 2018, with the _General Data Protection Regulation_ (GDPR) (or _Datenschutz-Grundverordnung_ (DSGVO) in German) coming into effect, I customized the website to comply with the regulations and eliminate loading external resources. + +**Information:** + +* **Technologies:** Wordpress, Plugins, CSS, Photoshop + +### Max Payne Zone + +
+ ![Max Payne Zone](../assets/images/maxpaynezone.jpg){ width=500 } +
+ +In 2002, I took charge of _Max Payne Zone_ (MPZone) which was one of the biggest [Max Payne](https://www.remedygames.com/games/max-payne/) fan sites and the biggest one for German speakers. +I updated and improved it maintaining its original design and re-launched it in 2003, in time for the launch of [Max Payne 2](https://www.remedygames.com/games/max-payne-2/). + +With a staff of 6 news posters, it provided extensive news coverage of the game and custom modifications (mods), game-related information (such as tips and walkthroughs), and an active discussion forum. + +
+ ![Max Payne Zone News](../assets/images/maxpaynezone_2.jpg){ width=500 } +
+ +The amazing folks of [Remedy Entertainment](https://www.remedygames.com/) valued the efforts of the fan community and (together with their publisher [Rockstar Games](https://www.rockstargames.com/)) collaborated with us and three other big fan sites. +We received news updates in advance, exclusive content and gear to be used for competitions. +As a result, several competitions were held where users could win prizes. + +It had a custom content management system (CMS) built in PHP that allowed news posters to post news items. + +**Information:** + +* **Technologies:** Apache, CSS, HTML, MySQL, PHP (frontend and custom-built backend for content management) diff --git a/docs/research/overview.md b/docs/research/overview.md index 8efd76b..f46416d 100644 --- a/docs/research/overview.md +++ b/docs/research/overview.md @@ -53,7 +53,7 @@ I have been  on the Program Committee for the following conferences/workshops: * [MLE 2019](https://gemoc.org/events/mle2019) (co-located with [MODELS 2019](https://modelsconf19.org/)) * [MOMO 2018](https://2018.programming-conference.org/track/MOMO-2018-papers) (co-located with [ 2018](https://2018.programming-conference.org/home)) * [MODELS 2017 Artifact Evaluation](https://models17ae.itu.dk/) (open review on [GitHub](https://github.com/grammarware/models17)) -* [GEMOC 2017](https://gemoc.org/events/gemoc2017.html) (co-located with [MODELS 2017](https://www.cs.utexas.edu/models2017)) +* [GEMOC 2017](https://gemoc.org/events/gemoc2017.html) (co-located with [MODELS 2017](https://web.archive.org/web/20180628044654/https://www.cs.utexas.edu/models2017)) * [GEMOC 2016](https://gemoc.org/events/gemoc2016.html) (co-located with [MODELS 2016](https://web.archive.org/web/20240303155734/https://models2016.irisa.fr/)) * [GEMOC 2015](https://gemoc.org/events/gemoc2015.html) (co-located with [MODELS 2015](https://cruise.eecs.uottawa.ca/models2015/)), * [MODELS 2014](https://models2014.webs.upv.es/) (co-reviewer) diff --git a/mkdocs.yml b/mkdocs.yml index d539492..06ec3e1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -30,7 +30,9 @@ theme: - navigation.expand - navigation.indexes - navigation.tabs + - navigation.top - toc.follow + # - toc.integrate logo: assets/images/profile.jpg language: en name: material @@ -99,6 +101,8 @@ plugins: exclude: - index.md - blog/** + # https://github.com/blueswen/mkdocs-glightbox + - glightbox markdown_extensions: # Abbreviations diff --git a/pyproject.toml b/pyproject.toml index 8cac8d2..0c19077 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ requires-python = ">=3.12" dependencies = [ "markdown-callouts==0.4.0", "mkdocs-git-revision-date-localized-plugin==1.3.0", + "mkdocs-glightbox==0.4.0", "mkdocs-material==9.5.44", ] diff --git a/uv.lock b/uv.lock index 9a14153..0df3fd7 100644 --- a/uv.lock +++ b/uv.lock @@ -258,6 +258,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/e5/ffeb92db53af8c3aa2d92e21a3cf6b5f83eee7e03b9cf9234ef6b30230d5/mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1", size = 22549 }, ] +[[package]] +name = "mkdocs-glightbox" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/5a/0bc456397ba0acc684b5b1daa4ca232ed717938fd37198251d8bcc4053bf/mkdocs-glightbox-0.4.0.tar.gz", hash = "sha256:392b34207bf95991071a16d5f8916d1d2f2cd5d5bb59ae2997485ccd778c70d9", size = 32010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/72/b0c2128bb569c732c11ae8e49a777089e77d83c05946062caa19b841e6fb/mkdocs_glightbox-0.4.0-py3-none-any.whl", hash = "sha256:e0107beee75d3eb7380ac06ea2d6eac94c999eaa49f8c3cbab0e7be2ac006ccf", size = 31154 }, +] + [[package]] name = "mkdocs-material" version = "9.5.44" @@ -332,6 +341,7 @@ source = { virtual = "." } dependencies = [ { name = "markdown-callouts" }, { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-glightbox" }, { name = "mkdocs-material" }, ] @@ -344,6 +354,7 @@ dev = [ requires-dist = [ { name = "markdown-callouts", specifier = "==0.4.0" }, { name = "mkdocs-git-revision-date-localized-plugin", specifier = "==1.3.0" }, + { name = "mkdocs-glightbox", specifier = "==0.4.0" }, { name = "mkdocs-material", specifier = "==9.5.44" }, ]