Libgourou v0.8.7

Sunday, 02 March 2025
|
Écrit par
Grégory Soutadé

Reminder : Libgourou is an open source ADEPT protocol implementation (ePub DRM management from Adobe) that helps download ACSM files on Linux system (and remove DRM).

Libgourou v0.8.7 is out. I just realized that I missed to announce v0.8.6 release and the mysterious v0.8.5 has just been dropped... There is only few updates since v0.8.4, mainly small bugfixes :

  • Use of $HOME environment variable if available instead of static /home/XXX
  • Fix a use after free for sendHTTPRequest()
  • Remove EBX object (that contains DRM information) when removing DRM from PDF
  • Handle empty names in adept_load_mgt

I initialy did not planed to release v0.8.7 so early, but libzip has been updated into Debian (v4 -> v5). So I felt it was a good opportunity to provide updated binary release. The nice thing with this version is that I received 3 external contributions, which is great !

You can find source code and binaries in my forge

1096

Monday, 24 February 2025
|
Écrit par
Grégory Soutadé

Les conflits armés sont des événements décidément très imprévisibles. Il y a un peu plus de 3 mois, nous passions le cap des 1 000 jours depuis le franchissement de la frontière Ukrainiennes par l'armée Russe. 1 000 jours de combats acharnés, 1 000 jours de courage, 1 000 jours de résilience, 1 000 jours d'innovation, 1 000 jours que Kiev résiste tant bien que mal à un ennemi largement supérieur en homme et matériel.

À la sortie de l'hiver dernier, et après une contre offensive Ukrainienne stérile, les positions étaient relativement figées. L'aide Américaine concernant les livraisons d'obus a été gelée pendant plusieurs mois suite à la discorde entre Républicains et Démocrates. Face à ce constat, le haut commandement Russe a décidé d'augmenter (encore) les moyens. Le nombre de missiles envoyés quotidiennement avoisine désormais les 100 par jour, visant notamment les installations énergétiques, mais aussi les bâtiments civils. Plus encore quand il s'agit de répondre à une attaque de missiles longue portée. Heureusement, grâce au soutient allié, nombre d'entre eux sont interceptés, même si certains traversent les mailles du filet.

Sur le terrain, l'armée de Poutine a adopté de nouvelles stratégies plutôt efficaces puisqu'elle progresse, faiblement, mais quotidiennement, avec un nombre de combats engagés là encore plus important. Ceci, malgré les nombreuses pertes humaines. De l'ordre de 1 000 soldats mis hors de combat par jour selon les chiffres du renseignement Ukrainien. Ainsi, dans le Sud Est, Avdiïvka est tombée. Pokrovsk est quant à elle quasiment encerclée. Stratégie moins coûteuse et plus efficace qu'un assaut frontal. Au Nord Est, la Russie a réalisé une nouvelle percée dans le sud de la région de Belgorod. L'étirement des zones de combats étant plus favorable aux soviétiques grâce à leurs importants moyens humains et matériel. En effet, 3 ans plus tard, elle est toujours capable de recruter des unités pour le combat, et l'industrie de l'armement tourne à plein régimes, par delà les sanctions.

Afin d'éviter la chute de Pokrovsk, l'Ukraine a lancé un mouvement très audacieux en envahissant une partie de la région de Koursk, directement sur le sol Russe. Un jet de dés pour espérer alléger la pression sur le front Sud, mais aussi pouvoir peser dans d'éventuelles négociations. La réponse Russe fut tout aussi intelligente avec la mobilisation de troupes Nord Coréennes (en plus de son soutien matériel). Mouvement tout a fait légitime d'un point de vue du droit international, car il s'agit de protéger son intégrité territoriale. Selon les diverses sources, ce sont donc plus de 10 000 soldats supplémentaires qui sont arrivés. Une aubaine pour le camps de Poutine.

Côté Ukrainien, les succès militaires sont rares. Un certain nombre d'avions de chasse sont opérationnels depuis l'été dernier, mais ne sont utilisés que pour des tâches défensives telle que l'interception de missiles. Par contre, l'industrie s'est grandement spécialisée dans la conception de drones à courte et longue portée. Ce qui permet d'endommager régulièrement les installations pétrolières et gazières très profondément dans le territoire ennemi. La guerre de drones est une nouveauté à laquelle peu d'armées étaient préparées. Les innovations y ont été rapides, peut-être autant que pour les missiles hyper sonique. Ces nouvelles armes sont redoutables, avec une précision inégalée quand elles sont directement pilotées par caméra. Notamment contre les chars qui ne sont pas forcément complètement blindés sur la partie supérieure. Idem pour les drones maritimes, véritable terreurs de la mer Noire, obligeant la flotte ennemie à se retirer en mer d'Azov. La marine Russe a ainsi développé des drones anti drones ! Comble de cette bataille technologique, nombre de militaires Ukrainiens formés à l'étranger se sont plaints de ne pas avoir reçu de formation spécifique pour ces nouveaux types de combats.

Fin janvier, Donald Trump est entré en fonction. Le 47e président des États-Unis est encore plus imprévisible que lors de son premier mandat. Il souffle le chaud et le froid, alternant entre soutien à l'Ukraine et négociations forcées. L'aide destinée aux pays étrangers ayant été suspendue dès sont entré en fonction, c'est désormais les métaux rares du sous-sol Ukrainien qui l'intéresse (parce qu'il adore les forages). Pourtant, les États-Unis semblent de moins en moins capables de peser dans l'issue du conflit. Trump veut juste stopper les dépenses liées à cette guerre, sans avoir d'intérêt réel quant au sort de l'Ukraine. Ce qui oblige l'Europe à faire plus et mieux, alors qu'elle est en proie aux difficultés et divisions.

Le soutien de l'opinion publique internationale s'étiole lui aussi de jours en jours. De plus en plus d'Ukrainiens sont eux-mêmes disposés à abandonner une partie de leurs territoires perdus contre la fin du conflit. Le président Zelensky n'est plus soutenu que par 57% de ses concitoyens, alors que la loi martiale court toujours et que des élections auraient normalement dû être organisées. Côté Russe, la population souffre en silence, car sous une croissance en trompe l'œil (4,1% selon les chiffres du Kremlin) principalement tirée par l'industrie militaire, la réalité du quotidien est beaucoup plus difficile avec une inflation de 9,5% en 2024. Ce problème économique pousse nombre d'entre eux dans les rangs de l'armée, qui offre de bons salaires et de bonnes primes en cas de pépin.

Dans ce tableau plutôt noir, on peut pourtant lire l'incroyable résilience d'un peuple agressé depuis maintenant 3 ans et qui vit proche des zones de combat, voir même pour certains carrément dedans. Peuple toujours debout malgré les alertes quotidiennes, les destructions, les pénuries et les mauvaises nouvelles quotidiennes.

Le bras de fer continue donc, avec des répercutions de plus en plus dramatiques sur le long terme, d'un côté comme de l'autre. Il faut continuer à espérer une sortie rapide et favorable, même si elle semble peu probable sans un soutien majeur extérieur.

Courses de printemps 2025

Sunday, 16 February 2025
|
Écrit par
Grégory Soutadé

RoureTrail (du camp Romain)

Affiche trail du Rouret

Le trail du Rouret en est à sa 3e édition, ce qui démontre l'engouement généré par cette course extrêmement sympathique. Le départ sera donné le dimanche 16 mars 2025 à 9h30 pour le 16km, 10h pour le 9km et 10h10 pour la randonnée (9km) devant le théâtre municipal. De quoi passer une bonne journée et aider au financement de l'école du Rouret.

Retour: La pluie a fait craindre une annulation de la course. Heureusement, elle n'est tombée que dans la nuit et il faisait beau lors du départ. Cette année, la participation était en hausse avec 409 partants ! Pour ma part, je n'ai pas pu prendre le départ car malade depuis une semaine, et plus particulièrement les 3 jours précédents qui ont été difficiles. Hâte d'être à l'année prochaine pour retrouver ce beau circuit et cette belle ambiance.

Ascension du col de Vence

Affiche ascension du col de Vence

La 21e édition de l'ascension du col de Vence est prévue le dimanche 4 mai 2025. 12km pour un total de 620m de dénivelé positif, dont le dernier qui fait vraiment mal aux jambes. Et pour les plus courageux, la redescente après la course via les chemins de randonnée. Descente à la fois rapide, technique et agréable (notamment dans sa seconde partie plus plate).

Le coût de l'intelligence artificielle

Sunday, 09 February 2025
|
Écrit par
Grégory Soutadé

L'intelligence artificielle est un sujet récurrent ces derniers temps. Entre la génération d'image réaliste, la (plus ou moins grande) pertinence de ChatGPT, le modèle soi-disant ultra performant et à bas coût de DeepSeek, le projet de méga centre de calcul Stargate, l'échec de la première version publique de Lucie, la concurrence dans le domaine est acharnée, avec des investissements qui vont de pair.

D'ailleurs, on ne devrait pas parler d'une intelligence artificielle, mais de plusieurs. Chacune avec son modèle et sa finalité propre. C'est exactement comme pour le cerveau qui est découpé en différentes zones avec des domaines spécialisés (langage, mémoire, vision ...). Mais dans le cas du cerveau, nous avons tous les domaines en même temps !

Pourtant, quel que soit le domaine, l'intelligence artificielle n'est pas juste un modèle informatique. Avant de pouvoir être efficace, il faut réaliser toute une phase d'apprentissage à partir de données existantes. Sur ce point, le web représente une véritable aubaine, une mine d'or de données de type divers et varié. Ce n'est pas pour rien que Microsoft a racheté Github en 2018 pour la modique somme de 7,5 milliards de dollars... Il peut ainsi accéder à, désormais, 500 millions de projets ! En ce qui concerne les données multimédia (particulièrement les images), l'apprentissage est plus complexe car il faut des personnes pour "annoter" ce que contient l'image, c'est à dire spécifier dans un carré la nature d'un élément (une personne, une voiture ...). Sur ce point, les premières annotations à grande échelle ont été réalisées via les CAPTCHA afin de "prouver" que l'utilisateur n'est pas un robot. Aujourd'hui, il existe dans des pays où la mains d'œuvre est peu chère (notamment en Asie du Sud Est) des centres professionnels où les personnes sont payées pour annoter des millions d'images.

Tout cela est relativement transparent pour les utilisateurs finaux, qui se contentent d'envoyer des requêtes via le "prompt".

Dans la dernière version d'IWLA, j'ai implémenté la fusion des robots via leur identifiant ("compatible"). Quelle ne fut pas ma surprise de voir qu'en à peine 6 jours, le robot GPTBot/1.2 a téléchargé 19,5GB de contenu depuis mon site, alors que ce dernier n'évolue que très peu. Je suppose donc que GPTBot opère une ré indexation complète à chaque changement. L'utilisation de toute cette bande passante est là encore invisible pour l'utilisateur final, mais constitue, avec le stockage des données et son traitement, une consommation d'énergie très importante.

C'est pourquoi j'ai décidé de bloquer purement et simplement toutes les requêtes venant d'openai, comme je l'avais fait pour le très gourmand robot de Microsoft (bingbot).

Voici le script que j'utilise et qui est dans mon crontab. Il va analyser les logs du serveur Apache et bloquer les IP qui correspondent à un mot :

#!/bin/bash

function ban_ip()
{
    echo "Ban $1"
    nft add rule inet BAN_RU input ip saddr $1 drop
}

function ban_file()
{
    file=$1
    token=$2
    prefix_len=$3
    fields=""
    postfix=""
    case $prefix_len in
        "8")  fields="1";       postfix=".0.0.0";;
        "16") fields="1,2";     postfix=".0.0";;
        "24") fields="1,2,3";   postfix=".0";;
        "32") fields="1,2,3,4"; postfix="";;
        *) echo "Error: prefix_len must be 8, 16, 24 or 32"
           return;;
    esac
    ips=`cat $file|grep $token|cut -f2 -d' '|sort|uniq|cut -d'.' -f$fields|uniq`
    for ip in $ips ; do
        ban_ip "${ip}${postfix}/${prefix_len}"
    done
}

if [ -z "$1" -o $1 = "-h" -o $1 = "--help" ] ; then
    echo "$0 token prefix_len (8,16,24,32)"
fi

ban_file /var/log/apache2/access.log.1 $1 $2

Il se base sur le pare-feu Linux netfilter configuré comme tel :

nft create table inet BAN_RU
nft add chain inet BAN_RU input "{{ type filter hook input priority filter; }}"

La table en question est BAN_RU, déjà utilisée pour bloquer les IP venant de Russie. Le script ne supporte que des IPv4, mais je ne vois pas de connexion IPv6 de la part de robots aussi gourmands.

IWLA 0.8

Tuesday, 04 February 2025
|
Écrit par
Grégory Soutadé

Capture d'écran IWLA

Version 0.8 of IWLA (Intelligent Web Log Analyzer written in Python) is now released. While looking at the Changelog, I realized that IWLA is now 10 years old ! It's crazy to see that it's still so useful for me, I use it everyday. There is no real alternatives to it if we consider statistic analysis without cookies/embedded javascript. Only AWSTATS do the same, but it's one big unmaintainable PERL file. This is why I created my own tool which is, I think, more accurate and fine tuned. IWLA is my most actively developed personal project, but this not the only one to be old. I also developed gPass (12 years old), KissCount (15 years old), Denote (10 years old) and Dynastie (13 years old). For these projects, I only do maintenance, but I still use them a lot. For KissCount, I think it should be re wrote from scratch with a cleaner architecture. For Dynastie, there is no real alternative, any current static site generator has a dynamic/web frontend, but I think backend should be migrated to something else (more fast). Denote is quite simple and perfect for my needs.

Going back to IWLA, the changelog is :

Core

  • Awstats data updated (8.0)
  • Sanitize HTTP requests before analyze
  • Fix potential division by 0

Plugins

  • Add rule for robot : forbid "1 page and 1 hit"
  • Try to detect robots by "compatible" strings
  • Move feeds and reverse_dns plugins from post_analysis to pre_analysis
  • Move reverse DNS core management into iwla.py

HTML

  • Add domain and number of subscribers for feed parser

Config

  • Add "multimedia_re" filter to detect multimedia files by regular expression
  • Add "no_merge_feeds_parsers_list" configuration value
  • Add "robot_domains" configuration value
  • Add "ignore_url" configuration value

A demo instance (for forge.soutade.fr) is available here

Dernier gif les joies du code Quand je code depuis des heures et que je réalise que je suis sur la mauvaise branche