Aeolian Islands & Sicily

After one year of break to pursue my sailing license, I spent a week with my irreplaceable buddy Damien on the boat of Sailing bubbles. We were staying on a beautiful Sun Odyssey sailboat, and we moved to the Aeolian Islands (Filicudi and Lipari), and finally to the natural reserve of Capo Milazzo in Sicily.

The dives were challenging, often touching 40m for 60 minutes of dive, but we did see some spectacular things, and I am particularly happy of the photos this year!

What went not perfectly well was that my trusted Sea&Sea strobe flooded on my last day, but it was probably time to buy a new one!

Weather forecast app for sailors

When planning a sailing trip, it’s important to know what the typical winds for a specific region and a specific time are. However, I could not find any online resource that could do easily show this.

I created a free online app that allows you to choose a date, click on a place, and it gives you a prediction of the typical winds in the area based on free historical data. You can use it here: https://sailingprediction.streamlit.app/

Select a date, click on a point on the map, and after a few second a plot like this will appear:

In the two panels, typical windspeeds and directions are indicated. The sectors correspond to wind directions, and the width of the wedge tells how common that wind is, the larger the wedge, the more common. The length of the wedge is proportional to the speed and the actual value is written in knots. In this example, the most common wind is from the west, with a median speed of 8.9 knots and a top speed recorded in the previous years of 20.9.

The circle in the middle with a percentage shows how often (in terms of hours) a windspeed of less than 5 knots was recorded. Minimum and maximum temperatures as well as precipitation probability is also reported.

The paper that Springer Nature doesn’t want you to read!

Inspired by a recently published article by Cocozza and Palma1 I wrote a commentary for European Radiology on how the current publishing system is at the verge of collapse, driven by the greed of the publishers that by becoming gatekeepers of the scientific careers of researchers, they can dictate the rules and the prices of the game. Add generative AI into the mix, and the whole system becomes explosive.

Of course, such a commentary should have been published open access. And, my friends, I tried.

Please realize that this paper is a 1000-word essay, not peer reviewed, written by me after I was asked by the editorial board. This paper is now put in a PDF and stored on a server at Springer Nature. How much do you value the extra work that the publisher put to put this single PDF page online?

Well, I was surprised when they proposed my a €3500 bill (more than $4000) to make this paper open access!

And my institution even has a read + publish agreement with them, which means that my University already spends enough public money to buy Springer Nature subscriptions, that papers from us should be published open access for all. Well, apparently this doesn’t cover 1000-word, non-peer-reviewed, invited essays.

So the question was: spend €3500 for the principle of upholding open access, and in the vanity hope that my paper would get more visibility from it, or keep the money and seize the opportunity to write a blog post about the irony of it?

Of course I chose the money2!

Fortunately, there are other less-known, but still legal, ways for me to give you access to this content. You can use this link to see my commentary and share it with your colleagues: https://rdcu.be/dA816. Or you can just read it here below.

But the irony that I couldn’t afford to openly publish a paper about the greed of the scientific publishing system? Priceless.

  1. Cocozza, S., Palma, G. Of editorial processes, AI models, and medical literature: the Magnetic Resonance Audiometry experiment. Eur Radiol (2024). https://doi.org/10.1007/s00330-024-10668-w
  2. Not really keeping the money though: I’m going to send two students to an international conference with it.

Diving Cruise in the Red Sea 2022

Great trip in the Red Sea on the Emperor Elite boat. We sailed down to St John and visited beautiful reefs!

These photos are Copyright by Francesco Santini 2022 and released under a CC-BY-ND license. This means that you can freely use and distribute them, even for commercial purposes, but you must cite the author and cannot modify them. Please contact me for other uses.

Vanity post for KoboCloud

I never really bothered checking, but apparently, my KoboCloud project, a set of scripts to download books to Kobo ebook readers from multiple cloud storage services (Dropbox, pCloud, Google Drive, and more) is quite successful. A couple of people even made video tutorials about it, with thousands of views!

I’m happy that this little hobby project changed the experience for so many users!

I’m also very grateful to the other contributors, who implemented a ton of features into the project! Thank you guys, this is the power of Open Source!

Diving cruise in the Maldives 2021

The Maldives offer amazing biodiversity, with large fishes (sharks and mantas) as well as reef life. These pictures are from a week-long cruise with Emperor Maldives. Great experience and great company!

These photos are Copyright by Francesco Santini 2021 and released under a CC-BY-ND license. This means that you can freely use and distribute them, even for commercial purposes, but you must cite the author and cannot modify them. Please contact me for other uses.

Advanced Input Dialog for Python with PyQt5

I recently implemented a swift generic input dialog for PyQt5 which extends the functionality of QInputDialog. It supports multiple inputs in the same window, with text, numeric, boolean, and option inputs.

Its usage is simple and intuitive as demonstrated by the following code snippet:

import sys
from PyQt5.QtWidgets import QApplication
import GenericInputDialog

app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)

accepted, values = GenericInputDialog.show_dialog("Test",
    [GenericInputDialog.TextLineInput('Text input'),
     GenericInputDialog.IntSpinInput('My Int', 10, -100, 100),
     GenericInputDialog.FloatSpinInput('My Float'),
     GenericInputDialog.IntSliderInput('My slider'),
     GenericInputDialog.BooleanInput('Bool value'),
     GenericInputDialog.OptionInput('My string options', [
                                        'option 1',
                                        'option 2',
                                        'option 3'
                                        ], 'option 3'),
     GenericInputDialog.OptionInput('My int options', [
                                        ('option 1', 1.1),
                                        ('option 2', 2.2),
                                        ('option 3', 3.3)
                                        ], 2.2)
    ])
# Note: for option inputs, the value list can be a list
# of strings, and then the output is the string itself, or a
# list of tuples, where the first element is a string (the label) 
# and the second is the returned value (any).
# The default value for options can be the label string, the
# default returned value, or an integer index.


# returned values can be accessed by key or by position
print(values['My Int'])
print(values[2])

# they can be iterated like a list
for v in values:
    print(v)

Which produces the following:

The code is in the public domain and is available at https://gist.github.com/fsantini/13bca4e5f57af1f5df66a3006ac441a9