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

Milano nuovo

Tuesday, 07 January 2025
|
Écrit par
Grégory Soutadé

IBM à Milan

Le début d'année une période propice aux bilans divers et variés ainsi qu'à l'introspection. Ce qui amène à prendre des résolutions pour ce nouveau cycle qui commence, bien qu'en réalité notre rythme de vie est calqué sur le rythme scolaire. L'autre tradition consiste en l'envoie de ses vœux à un maximum de personnes, les outils de communication actuels permettant de transmettre ces messages immédiatement. Je préfère personnellement des messages personnalisés que l'on pourra délivrer directement à la personne, en face à face quand cela est possible.

Mais le 1er janvier est également synonyme d'entrée en vigueur de nouvelles législations et d'ajustement de taxes et pensions. Législations qui ont souvent été votées longtemps en avance (parfois des années). Il y a ainsi de grandes dates butoirs qui font régulièrement écho dans la presse : neutralité carbone en 2050, fin de la vente de véhicules thermiques en 2035... À la fois lointaines et si proches, ces mesures inquiètes car elles vont nous forcer à repenser notre mode de vie et nos déplacements, pour des modèles fort probablement plus contraignants.

En Lombardie, c'est une petite révolution qui s'opère en ce 1er janvier 2025. Les Milanais ont eu 5 ans pour se préparer psychologiquement à une nouvelle mesure : l'interdiction totale de fumer dans les espaces publics (ouverts ou fermés). Petit encart néanmoins : il est possible de fumer dans des lieux isolés avec une distance minimale de 10m autour de soi (difficile à obtenir dans une métropole aussi dense). Je me souviens en effet de mon voyage datant de 2019 dans la capitale Lombarde où je notais

Il est d'ailleurs assez difficile de trouver des rues où personne ne fume...

Je trouve donc cette mesure extrêmement courageuse sachant que 20% des Italiens fument et qu'il y a même des distributeurs de cigarettes en libre service (une aubaine pour la mafia). Cette mesure me rappelle le "big bang" opéré par le Royaume-Uni lorsqu’a été interdit la cigarette dans les pubs. On pensait alors à la mort de ces derniers, il n'en fut rien. Milan n'est pas précurseur en la matière. On trouve des règles similaires à New York (avec un peu plus de souplesse) ou Singapour. Mais cette mesure met en lumière une prise de conscience généralisée des pouvoirs publics face à ce qu'on appelle communément une "drogue douce".

Dans ma jeunesse, j'étais entouré de fumeurs. L'habitude faisant, la fumée ne provoquait qu'une gêne légère. Je me souviens encore de certains repas familiaux où flottait 20cm de fumée au plafond, ou encore certains restaurants/bars totalement enfumés. Les plus anciens ont même connus la cigarette dans les avions ! Il y a désormais moins de fumeurs dans mon entourage. Puis, il y a eu ce 1er février 2007 où la cigarette a été interdite dans les restaurants (entre autres). Et puis, la plupart des voisins sont non fumeurs. Et puis, j'ai commencé à faire plus de sport, domaine où l'oxygène est une ressource précieuse. Les bronches étant particulièrement ouvertes, on est beaucoup plus sensible à la pollution atmosphérique. Il s'est donc opéré un réel sevrage depuis plusieurs années. À tel point que cette odeur m'est désormais particulièrement désagréable. Et pour cause, une fois sevré, on se rend compte à quel point ce produit est de la grosse m****.

Parce que la cigarette n'apporte que des mauvaises choses :

Pour soi

  • Dépendance
  • Troubles de l'humeur
  • Perte de goût et d'odorat
  • Jaunissement des dents et de la peau
  • Mauvaise haleine
  • Encrassement des poumons et des artères
  • Risque de cancer
  • Perte de capacité respiratoire
  • Obligation de fumer en extérieur par temps froids et pluvieux
  • Obligation de se réapprovisionner régulièrement
  • Coût du tabac

Pour les autres

  • Tabagisme passif
  • Pollution de l'air
  • Exploitation des travailleurs pauvres

Pour l'environnement

  • Produit exotique venant de loin
  • Transformation du tabac utilisant des produits nocifs
  • Pollution due aux mégots
  • Risque d'incendie
  • Déforestation (plantation é séchage du tabac)
  • Pollution plastique (paquet de cigarette, briquet)

D'ailleurs, je ne comprends pas les personnes qui fument avant/pendant les repas. Il est impossible d'apprécier un plat quand on a les papilles brûlées par la fumée (en plus d'incommoder le voisinage). On pourra malheureusement dresser ce triste constat : beaucoup de personnes travaillant dans la restauration (dont des grands chefs) sont fumeurs... Et que dire des personnes qui fument dans leur voiture ? Dès le lever ? On voit ainsi à quel point cette drogue "douce" est une véritable addiction et n'est pas consommée seulement dans les moments festifs/conviviaux. Elle est une fausse solution face au stress et à l'angoisse, qui augmentent avec l'addiction cat le corps se met en état de stress avec le manque.

Fumer n'est ni un droit, ni une liberté, c'est une addiction.

Pour autant, j'ai vu autour de moi plusieurs personnes arrêter de fumer. Je trouve cette démarche très courageuse de leur part quand on connaît la difficulté de se sortir d'une addiction parfois vieille de dizaines d'années.

Halte aux squatteurs !

Sunday, 08 December 2024
|
Écrit par
Grégory Soutadé

Trouver un nom est toujours un exercice délicat, car il aura toujours une portée et une connotation sur un temps plus ou moins long. Une fois les choses actées, en changer pourra jeter le trouble chez les personnes qui auront connues l'ancienne référence.

Mon dernier projet en date est Drycat. Le nom retenu n'a été choisi que récemment. Toute sa version de développement s'est faite sous l'acronyme ssss, qui reflète plus la nature du projet mais est moins facile à retenir pour l'utilisateur. Une fois ce joli nom évoquant nos chères bestioles choisi, il aurait été bon de faire une recherche pour savoir s'il n'était pas déjà attribué. J'ai oublié de faire la démarche. Résultat, le projet est un homonyme d'un aspirateur industriel... Les deux mondes restent toutefois suffisamment éloignés pour éviter les confusions et que l'utilisateur puisse retomber rapidement sur ses pattes.

Le projet est désormais exposé aux yeux du monde entier via l'adresse https://drycat.net. Comme pour toutes les adresses internet, elle doit être enregistrée chez un organisme certifié appelé "registrar" (bureau d'enregistrement). Cet enregistrement n'est pas gratuit. Il faut s'acquitter d'une cotisation annuelle plus ou moins importante selon les organismes et l'extension choisie (.fr, .com, .net, ...).

Mon idée première était d'enregistrer l'adresse drycat.com. Le premier réflex est de tester directement cette adresse dans un navigateur. On arrive alors sur une page indiquant que le nom de domaine est à vendre. Bonne nouvelle puisque je souhaite l'acquérir. Ce service est proposé par l'Américain GoDaddy. Là où les choses deviennent étranges, c'est qu'il y a un encart qui propose de faire une offre pour le nom de domaine ("Make an offer") et n'est donc pas soumis à une grille tarifaire. Je tente de rentrer 10$, ce qui semble cohérent (en France, un nom de domaine en .com coûte dans les ~15€/an). Un message en rouge apparaît indicant que le propriétaire n'accepte pas d'offre en dessous de 5 000$ ! En gros, il y a un co***** qui a enregistré ce nom de domaine dans le seul but de le revendre.

Ce phénomène de squat n'est pas nouveau. Sauf que jusqu'à présent il était utilisé pour 2 raisons principales :

  • Faire payer de grosses entreprises
  • Créer un site de phishing

Le premier point n'excuse pas le squat. Les entreprises peuvent d'ailleurs porter l'affaire en justice lorsque la marque a été enregistrée préalablement au nom de domaine. À l'inverse, certaines entreprises ont tenté de s'approprier des noms déjà réservés par des personnes légitimes. Le deuxième point ne l'excuse pas non plus et peut être particulièrement vicieux avec des nom comme faceboook.com ou facebook.co. D'autant plus que depuis 2012, le nombre d'extensions a considérablement été élargi, passant de 21 + 250 extensions régionales à plus de 1 000 ! Avec des extensions plus ou moins farfelues telle que .builders, .buzz, .christmas, .guru, .kim, .ninja, .rich ...

Je pense que cette ouverture a poussé à la création d'un marché dit "secondaire". Il y a même une section dédiée sur le site de GoDaddy. Il devient donc de plus en plus cher pour une entreprise (internationale) de couvrir toutes les possibilités acceptables. Dans ce nouveau marché secondaire, les noms de domaines les plus prisés sont ceux avec une extension courte (et générique), souvent associée à un pays.

Transformer cette mécanique légitime en actif numérique spéculatif est une pratique infecte. Même si le spéculateur arrive, de temps en temps, à écouler un de ses squats, les entités qui gagnent vraiment de l'argent sont les registrars. Comme dans une guerre, les personnes qui s'enrichissent sont celles qui vendent des armes...

Personnellement, je possède plusieurs noms de domaine. Mon registrar favoris était Gandi, mais ils ont, semble-t-il, décidé de se saborder complètement avec d'une part, une diminution des services associés au nom de domaine (adieu le mail) et, d'autre part, une augmentation significative des tarifs. Ainsi, s'enregistrer chez eux (hors .fr) coûte 2 à 3 fois plus cher qu'ailleurs, ce qui est complètement injustifié !

J'ai donc migré tous mes actifs (hors soutade.fr) vers OVH. Le tarif y est correct, l'interface de gestion très moche et les fonctionnalités plus restreintes. Typiquement, on n'a pas une totale liberté quant aux entrées DNS. Particulièrement pour créer les entrées DNS inverse (PTR), qui ne sont disponibles que quand on loue un serveur... Résultat, j'ai dû monter mon propre serveur DNS pour Drycat afin de ne pas être filtré par les clients mails (notamment gmail qui impose une entrée PTR). Le problème est qu'un serveur DNS non officiel peut être considéré comme n'étant pas de confiance par beaucoup d'acteurs... Bref, tout le monde essaie de trouver des sous de tous les côtés.

Drycat

Sunday, 01 December 2024
|
Écrit par
Grégory Soutadé

J'annonce le lancement officiel de Drycat.net !

Je me suis rendu compte à posteriori, que ce nom était utilisé par une marque d'aspirateurs industriels... Il est d'ailleurs assez peu parlant quant à sa finalité (du moins au premier abord). En effet, Drycat est site web permettant le partage de secret entre plusieurs personnes. Un secret (une phrase ou un fichier) va être découpé en plusieurs parties et, selon la configuration, il faudra réunir plus ou moins de parties pour arriver à reconstituer le secret original.

Exemple, avec un secret que l'on découpe en 4 parties, mais dont 3 seulement sont nécessaires pour le recomposer :

Ainsi, le partage de "pouvoir" est assez souple en fonction du nombre de parties générées et à qui on les affecte. Dans notre exemple, il faudra absolument que la première personne soit présente, mais elle ne pourra pas seule reconstituer le secret.

La théorie mathématique derrière Drycat fut décrite par Adi Shamir. Elle se base sur la reconstruction d'un polynôme d'ordre k (k étant le seuil) par interpolation. Bien qu'ancienne, elle reste pour autant très peu répandue, alors que je la trouve particulièrement intéressante. D'autant plus qu'Adi Shamir n'est autre qu'un des co créateurs du système RSA (système cryptographique asymétrique), utilisé un peu partout en informatique, notamment pour la couche de sécurité HTTPS.

Drycat se base sur l'implémentation JavaScript ouverte Amper5and, dont un site de démonstration est disponible ici. Alors, pourquoi avoir crée un site tiers supplémentaire ? Pour une question d'ergonomie et de facilité d'utilisation.

En effet, je voulais réaliser un site facile à utiliser par tout le monde, et surtout les personnes qui ne sont pas très techniques. La configuration nécessite de connaître quelque bases, mais avec Drycat, la récupération du secret est quasi automatique. Ainsi, les points forts sont :

  • Ergonomie qui va à l'essentiel
  • Utilisation des QRCode et de l'envoie par mail
  • Recombinaison automatique du secret une fois que toutes les parties sont rentrées
  • Chiffrement des fichiers réalisé directement depuis l'interface (mais en local sur l'ordinateur de l'utilisateur)
  • Hébergement des fichiers sur le serveur

En ce qui concerne le dernier point, les fichiers envoyés sur le serveur sont forcément chiffrés, de sorte que personne ne pourra les lire sans la clé de déchiffrement. Clé connue uniquement en réunissant les différentes parties.

Un autre ajout majeur (et inédit) de Drycat est la possibilité, pour le chiffrement d'un fichier, de rendre une partie obligatoire. Ainsi, si le seuil est atteint sans que toutes les parties obligatoires ne soient rentrées, le déchiffrement sera invalide.

Pour le moment, il faut simplement être enregistré sur le serveur pour pouvoir y téléverser des fichiers, avec certaines restrictions (taille du fichier, durée de vie du fichier). La fonctionnalité d'envoi par mail étant réservé à des comptes payants. Cette partie payante sera mis en œuvre selon la demande des utilisateurs car cela nécessite la création d'une société. Mais le but premier est que les gens puissent s'amuser en toute autonomie.

How to do polymorphism in C ?

Thursday, 31 October 2024
|
Écrit par
Grégory Soutadé

At work, I had to write a code architecture with types polymorphism in C language. The idea is very basic : one header with common functions and multiple backend implementations. At compile time, we decide which kind of implementation is taken. This can be achieved in a very elegant way using a not so much known C feature : forward definition.

First, a quick recap :

here is a declaration of a function (usually in a header):

int my_func(void); 

Here is a definition of a function (usually in a .c file):

int my_func(void) { return 4; }

This is the same for structures.

Good solution

When compiling, compiler checks that types match declaration, but it needs definition only when object is handled. So, we can create an opaque structure (lets say struct my_struct_s) that can have multiple implementations using its pointer version:

public_header.h

#ifndef _PUBLIC_HEADER_H_
#define _PUBLIC_HEADER_H_

/* Opaque type "my_struct_s" */
struct my_struct_s;
typedef struct my_struct_s* my_struct_t;

my_struct_t init(void);
void do_something(my_struct_t param);
void print_my_struct_t(my_struct_t param);
void delete(my_struct_t param);

my_struct_t init2(void);
void do_something2(my_struct_t param);
void print_my_struct_t2(my_struct_t param);
void delete2(my_struct_t param);

#endif

And two private implementations:

private.c

#include "stdlib.h"
#include "stdio.h"

#include "public_header.h"

/* Private implementation */
struct my_struct_s
{
    int member_i;
};

my_struct_t init(void)
{
    my_struct_t res;

    res = malloc(sizeof(*res));
    res->member_i = 0;

    return res;
}

void do_something(my_struct_t param)
{
    param->member_i++;
}

void print_my_struct_t(my_struct_t param)
{
    printf("I'm an integer with value %d\n",
           param->member_i);
}

void delete(my_struct_t param)
{
    free(param);
}

private2.c

#include "stdlib.h"
#include "stdio.h"

#include "public_header.h"

/* Private implementation */
struct my_struct_s
{
    char member_c;
};

my_struct_t init2(void)
{
    my_struct_t res;

    res = malloc(sizeof(*res));
    res->member_c = 'a';

    return res;
}

void do_something2(my_struct_t param)
{
    param->member_c++;
}

void print_my_struct_t2(my_struct_t param)
{
    printf("I'm a character with value '%c'\n",
           param->member_c);
}

void delete2(my_struct_t param)
{
    free(param);
}

In main.c

#include "public_header.h"

int main()
{
    my_struct_t var;

    var = init();
    do_something(var);
    print_my_struct_t(var);
    delete(var);

    var = init2();
    do_something2(var);
    print_my_struct_t2(var);
    delete2(var);

    return 0;
}

In this example, both implementations are present in output program. But, we can use only one implementation, selected at compile time, and thus have same function names in both private.c and private2.c.

This example works because my_struct_t is a pointer to struct my_struct_s. So, type is checked correctly, and it doesn't care about pointed value unless operation like increment, decrement or dereferencement is done on it. For example, in main.c :

struct my_struct_s var2;

Will generate an error:

error: storage size of ‘var2’ isn’t known

Bad solution

Another solution for pylomorphism is

typedef void* my_struct_t;

But, I do not recommend to write it, because in this case pointer type is not checked, void* is too generic and match all of them. This code compiles without warnings and can lead to type confusion error !

#include "stdio.h"
#include "public_header.h"

typedef void* my_struct_t2;

static void print_string(char* a)
{
    printf("Value of param '%s'\n", a);
}

int main()
{
    my_struct_t2 var;
    var = init();
    do_something(var);

    print_string(var);

    delete(var);

    return 0;
}

NB : In my examples, I use "stdio.h" only because "<" and ">" are removed by code coloration.

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