Workflow#
This is a top-level description of the workflow to prepare a full conference setup
with easely. The different subsections of this section map directly into the
sub-parsers of the easely command-line interface, and we shall quickly go
through each one of them.
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
Folder structure#
By design each conference is supposed to have its own workspace, where all the relevant
files live. If this is your first time using easely, go ahead, create an empty folder
for your conference cd into it and follow the instructions in the next sections.
The workspace will contain a few standard files, along with a folder structure resembling
the one defined in the WorkspaceLayout class in the paths module:
class WorkspaceLayout(str, Enum):
"""Small Enum class with the basic folder structure within each conference root folder.
"""
ATTACHMENTS = "indico_attachments"
QRCODES = "qrcodes"
POSTERS = "posters"
HEADSHOTS = "presenters"
RASTERED_POSTERS = "posters_raster"
CROPPED_HEADSHOTS = "presenters_crop"
Note
While the command-line interface allows you to customize the behavior of each task,
the default values are chosen to fit this folder structure, and you should be good
by literally following two simple rules: operate (i.e., run easely tasks) from
within the root folder of your conference and just let the thing flow.
Downloading the conference data#
The first thing you have to do is to download all the relevant event metadata, as well as
the poster attachments, from the Indico server. This is done with the download sub-command:
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
If you issue, e.g.,
cd my-conference-workspace
easely download https://agenda.infn.it/export/event/37033.json
you should see at the very minimum a program.json file in the root of your workspace,
containing all the relevant metadata for the conference, such as the list of sessions and
contributions within each session.
If the event has one or more poster sessions with contributions, and if these contributions
have attachments, they will be automatically downloaded in the attachments folder.
Most likely you will have to repeat this over and over again as you prepare for the
conference—be assured that people will upload material to indico until the very last minute,
and often during the conference itself. We are fully aware that useless downloads are
expensive, and the basic rules for the download task are the following:
the json file with the program is overwritten every time, with no mercy;
we keep track of the indico upload timestamp for each attachment, and we only download any given file if it is not already on disk, or if the version on indico is newer than the one on disk.
Note
In order to facilitate matching the attachments files with the actual contributions,
all the file names are prepended with the friendly_id of the contribution, which
is an identifier generated based on the submission order that is guaranteed to be
unique within the scope of the conference.
Creating the poster roster#
The very first thing that you will need to do with the json file containing the
conference metadata is to create the poster roster, which is the excel file that drives
all the poster display. This is achieved with the roster sub-command:
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
Normally, all you have to do is to run the sub-command once from within the conference workspace
easely roster
and this will create a program.xlsx file alongside the original program.json file.
If you open the file, you will see a sheet with the list of all the poster sessions, and a series of additional sheets (one per session) listing all the contributions. This is very important, as this very excel file regulates two important things:
the times when the system switches between different poster sessions; and
the mapping of the contributions to the different screens in the poster display.
Warning
The poster roster, by definition, needs manual editing. You don’t want to generate it before the conference program is fully finalized, and you do not want to overwrite after you have started editing it. (The sub-command will not overwrite it by default.)
Generating the QR codes#
By default the poster display system will show a QR code in the upper part of the screen, containing a link pointing to the contribution on the indico server. This allows attendees to quickly access the relevant indico page (e.g, with their smartphone) and download a pdf copy of the poster to their device, if they care.
Specific QR codes for each single posters can be generate with the qrcodes sub-command:
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
As usual, from within the conference workspace, you can just run
easely qrcodes
and there it is: you will have your QR codes in the qrcodes folder, ready to be
consumed by the poster display applications.
Note
As for most of the final artifact that correspond to a specific contributions,
QR codes are named after the friendly_id of the contribution, which is an identifier
generated based on the submission order that is guaranteed to be unique within the
scope of the conference.
Dispatching attachments#
When you download the indico attachments, by default you will get all the graphics files
(e.g., pdf, png, pptx.) in the default attachments folder. These will include various
things along with the actual poster files—presenter close-up pictures, mini-elevator
pitches, and any additional material that you might have asked the presenters to upload.
For the purpose of the poster display, we are mainly interested in two types of files:
the actual poster files, which are supposed to be in pdf format; and
the presenter close-up pictures, which are supposed to be in a sensible graphics format.
The dispatch sub-command allows is meant to automatically sort out the attachments
into the posters and headshots folders, respectively.
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
As usual, from within the conference workspace, you can just run
easely dispatch
Unless your conference is tiny (literally: if you have more than half a dozen posters) you
will painfully realize that no matter how precise were the instructions you gave the
presenters, they can be very creative in ignoring your indications. This is an area where
manual intervention will be required during the preparation of the conference, and likely
during the conference itself. For this very reason, the dispatch task will
never overwrite existing files in the destination folders—there is essentially no good
automatic way to tell whether a file was put there manually for good reasons.
Warning
The current mechanism is not very amenable to frequent changes in the attachments, as once the original files have been dispatched once in the destination folder, any subsequent change needs to be done manually. This is, admittedly, an area where we could improve, but the basic reasoning is that we generally want to keep indico in order (e.g, rename files there) at which point we can always regenerate everything from scratch right before the beginning of the conference, and treat subsequent changes as manual interventions.
Rasterizing the posters#
The main task of the command-line interface is to generate rasterized versions of the
posters, which are the actual files that will be displayed on the poster display system.
This is done with the rasterize sub-command:
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
This task is peculiar in a few different ways: it is definitely the one that takes the longest time to run, especially if you launch it on all the poster contributions of a large conference—be ready because it might take a while the first time. In addition, it is one of the tasks where you actually have to pay attention to the command-line arguments, as best results are obtained when your choices match your hardware setup.
More specifically, if you adjust the target-width argument to match exactly
the actual width of the QPixmap objects that are used in the poster display
system, you will be able to display the rasterized posters to the screen without
any additional scaling. This, in turn, depends on both the screen resolution and
the border size that you have decided to use.
Additionally, the task allow to rasterize the input pdf to a (larger) intermediate png file, which is then resized using a high-quality resampling algorithm to the final size. This tend to produce better result that rasterizing directly to the final size, and an intermediate size of twice the final size is a good compromise between quality and performance.
Warning
The variety of tools used to produce the original pdf files for the poster is such that is very difficult not to run in edge cases where the rasterization is not optimal (e.g., transparencies are not handled correctly). While we might improve on this one, it is very important to check the rasterized output on a poster-by-poster basis, and to be ready to intervene manually.
Cropping the headshots#
Just like for the QR codes, the poster display system will show a headshot image of
the presenter, when available. (As a matter of fact, next to the QR code).
In order for the thing to look nice, you will have to crop all the original
headshot images to a square format, and to resize them making sure that the
cropped image is centered on the actual face. This is achieved with the
facecrop sub-command:
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.13/x64/bin/easely", line 3, in <module>
from easely.cli import main
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/cli.py", line 28, in <module>
from easely.__qt__ import bootstrap_window
File "/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/easely/__qt__.py", line 23, in <module>
from PySide6 import QtCore, QtGui, QtWidgets
ImportError: libEGL.so.1: cannot open shared object file: No such file or directory
Warning
The face cropping leverages opencv under the hood and generally does a reasonable job at detecting and cropping faces, but there are edge cases where it fails and need manual intervention. This is an area where we can definitely improve.