Articles

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.

La Poste et moi

Monday, 21 October 2024
|
Écrit par
Grégory Soutadé

La Poste d'Espelette

On a tous une histoire avec La Poste, notamment les personnes qui ont connu l'entité en tant qu'organisme d'État. Il faut dire que le facteur est une personne qui nous connaît par procuration, via les courriers et les colis que l'on reçoit et qu'il délivre de par sa tournée. Il reste pourtant souvent dans l'ombre de nos boîte aux lettres. Si, dans l'inconscient collectif, le groupe a une réputation plutôt moyenne, je dois dire que personnellement, et en dehors des périodes estivales, je n'ai de mémoire jamais eu de problème de livraison. Au contraire, le facteur arrive même à compléter les éléments parfois manquants de l'adresse, et ça, c'est quand même vachement bien !

Pourtant, tout n'est pas rose. Particulièrement quand on discute avec celles et ceux qui ont travaillé pour le groupe avant le changement de statut. Mais également avec la plupart des personnes du service publique qui ont connu une période dorée jusque dans les années 1990/2000. C'est d'ailleurs en 1991 que les PTT sont séparés de France Telecom pour devenir La Poste, alors une entreprise publique autonome. Cette transformation est l'application d'une directive très libérale Européenne visant à supprimer les monopoles d'État (pour ouvrir les marchés à la concurrence). Deux an plus tard (novembre 1993) voit la ratification du traité de Maastricht qui transforme la Communauté Européenne en Union Européenne, telle que nous la connaissons aujourd'hui.

La deuxième étape majeure pour le groupe intervient en 2010 avec la création d'une Société Anonyme en lieu et place de l'entreprise publique autonome. Si l'aspect financier et rentabilité se retrouvent sous le feu des marchés, l'aspect politique reste inchangé puisque la société nouvellement créée est détenue à 66% par la Caisse des dépôts et consignations et à 34% par l'État Français. Du fait de son statut d'entreprise privée, le groupe se doit donc, à minima, de trouver un point d'équilibre financier. Pas évident dans un monde en transformation constante et rapide. Notamment quand son statut de service publique lui a offert une arme à double tranchant : un maillage territorial important, donc une masse salariale importante. Ce maillage permet pourtant de délivrer des services locaux qu'aucune autre entreprise ne serait en mesure de créer sur le court terme. Pourtant, il a tendance à disparaître dans les zones peu rentables. Les services postaux et associés y sont peu à peu confiés à l'administration (via les bureaux de mairie) ou à des sociétés locales (bar, commerce...).

Pour faire rentrer de l'argent, La Poste n'a donc d'autres choix que la diversification. Le groupe, via ses multiples filiales, est aujourd'hui un monstre présent un peu partout : livraison de courrier, livraison de colis (Collisimo, Chronopost, DPD), Immobilier, Finance (La Banque Postal), Prévoyance, Assurance, Bourse (EasyBourse), Telecom (La Poste Mobile), Cinéma, Numérique (Docaposte). Dans le numérique, elle se paie même le luxe de racheter le logiciel Pronote et la plateforme KissKissBankBank. Il faut reconnaître que cette stratégie semble fonctionner puisque depuis 2004 (alors que le nombre d'entités est en croissance), le groupe a toujours été bénéficiaire. La crise du COVID lui a même permis de doubler son résultat net à plus de 2 milliards d'euros ! Pourtant, à partir de 2019, et malgré une réduction des effectifs de 30% depuis 2004, la dette du groupe n'a cessé d'augmenter passant de ~3/4 milliards à plus de 10 milliards d'euros en 2022 ! Le conseil d'administration semble être devenu accro à l'endettement, ce qui ne présage rien de bon pour la suite.

La Poste a donc besoin de se ré inventer constamment pour rester en vie. En ce qui concerne son cœur de métier (courrier - colis), elle propose des services assez innovants, mais pas forcément très bien mis en avant.

  • Le premier qui permet de gagner en temps de livraison tout en diminuant la pollution est l'impression à distance. L'idée est de faire imprimer le courrier par l'agence postale la plus proche du destinataire. La confidentialité en prend pour son compte, mais l'efficacité est de mise !

  • Le second est la possibilité d'imprimer à la maison son bon de livraison, de le coller sur son colis et de le mettre dans sa boîte aux lettres. Le facteur se chargera de le récupérer le lendemain et de le déposer lui même au bureau de poste. Ce qui évite les files d'attente et/ou le fait de devoir se déplacer dans un bureau dont les horaires ne nous conviennent pas forcément (notamment quand ils sont tenu par des agents de mairie). Attention cependant, le colis ne sera pris en charge pour le transport que le lendemain du dépôt au bureau (donc J+2 par rapport à l'impression de l'étiquette).

  • Dans la même veine, on peut désormais imprimer ses timbres numériques, même si La Poste continue de vendre toute une collection de timbres originaux (ou classiques).

  • Pour augmenter ses marges, la société met également en vente des cartons de taille diverses et variées dans ses agences.

Tout n'est donc pas parfait avec cette entreprise qu'au fond on aime bien (et donc que l'on châtie bien), mais il faut savoir reconnaître et mettre en valeur les bons aspects quand ils existent. Ce que les Français ont beaucoup de mal à faire !

Hello, I'm a hacker

Sunday, 06 October 2024
|
Écrit par
Grégory Soutadé
Hello!
I am a hаckеr who has аccess to your operating system.
I also have full аccess to your account.
...

C'est le genre de message que l'on reçoit (malheureusement) de plus en plus souvent... Il va s'en dire qu'il s'agit d'un SPAM. Il a d'ailleurs été classifié comme tel par gmail. Le texte est rédigé dans un Anglais parfait. Problème : la cible ne parle pas forcément cette langue. Dans le doute ils tentent quand même...

Les arguments déployés sont de nature à mettre le destinataire en état de stress :

  • L'ordinateur a été piraté par un cheval de Troie (trojan)
  • Le pirate a pris des photos intimes via la caméra (sans pour autant joindre des preuves)
  • Le cheval de Troie est indétectable par un anti virus car il est polymorphe (et il utilise le driver ?)
  • Le pirate va envoyer les photos à tous nos contacts et les publier sur les réseaux sociaux
  • Son email est intraçable
  • Le pirate ne fait pas d'erreur
  • Si on tente de prévenir quelqu'un d'autre, il mettra ses menaces à exécution

La rançon (parce que c'est le plus important) est de 1300 dollars (1200 €) à payer dans les 52 heures sur une adresse bitcoin (soit 0,000016 bitcoin). Il n'y a pas de lien étrange dans ce SPAM.

Là où ça devient intéressant et qui est souvent un critère de détection des SPAM : l'adresse email d'émission semble parfaitement valide : Hope Mcknight info@protonmail.com. Proton Mail offre des solutions (mail, calendrier, espace de stockage, VPN, gestionnaire de mot de passe, gestionnaire de crypto monnaie) sécurisées et garantissant la vie privée (du moins sur le papier). Elle est basée en Suisse, à Genève. Hope Mcknight semble être une personne réelle, même si on peut se douter que l'adresse "info" ne correspond pas à une adresse personnelle. Il s'agit donc d'une technique appelée "spoofing" ou usurpation d'identité. Elle consiste à afficher une adresse valide qui ne correspond pas à l'émetteur réel.

Maintenant, si l'on regarde avec attention le message original du mail avec toutes les entêtes, on peut noter :

Authentication-Results: mx.google.com;
       spf=softfail (google.com: domain of transitioning info@protonmail.com does not designate 45.95.146.101 as permitted sender) 

et surtout l'auteur original :

Received: from linkmasters.ru (linkmasters.ru [45.95.146.101])

Ces deux messages sont très intéressants car ils nous disent, d'une part, que l'adresse IP d'émission ne correspond pas à un serveur de Proton Mail (ses adresses sont référencées dans ses entrées DNS) et, d'autre part, qu'il vient en fait d'une société d'envoi d’email "linkmasters" d'origine Russe. L'IP du serveur émetteur (45.95.146.101) correspond quant à elle à un hébergeur de serveurs Néerlandais, ce qui augmente les chances de passer à travers les filtres anti-spam.

Ce message nous ramène donc directement à l'actualité. Pour passer outre les sanctions internationales et le désengagement Occidental en Russie, un des moyens de financer la guerre est de rançonner la population. C'est le genre de message qui ne coûte quasiment rien à envoyer et peut rapporter gros car la somme demandé est importante, mais en adéquation avec ce que serait prêt à payer les personnes pour protéger leur intimité. Il est le plus souvent l’œuvre d'un groupe de hackers malveillants plus ou moins sponsorisé par leur gouvernement respectif. Les champions en la matière sont Russes, mais aussi Chinois, Nord Coréen et bien d'autres.

Pour éviter que ses clients ne se fassent abuser, tout hébergeur de mail un tant soit peu sérieux se doit donc de vérifier les paramètres SPF et si possible DKIM (qui utilise une signature cryptographique) des messages entrants.

Malheureusement, dans la panique et parmi la masse de personnes touchées, certaines peuvent céder et payer la rançon.

Déchets à emporter

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

Nous sommes en septembre ! Les grosses chaleurs de l'été vont bientôt s'estomper, on va pouvoir enfin respirer. Certains regrettent justement cette chaleur, les longues journées de vacances et les bons fruits et légumes gorgés de soleil, avec comme perspective grisaille et travail. Pourtant il se produit le contraire autour du bassin méditerranéen où le reste de l'année est agréable à vivre tandis que l'été est une période suffocante (encore 34°C le 1er septembre)... Bref, septembre marque le début d'un nouveau cycle. Cycle où traditionnellement l'on pouvait reprendre le travail sans trop se brûler la peau, à commencer par les vendanges. De nos jours ce cycle est calqué sur le cycle scolaire. Après une douce montée en charge fin août, c'est donc l'agitation de la rentrée qui opère. On se replonge dans un quotidien chargé en activités. Tout reprend en même temps, ce qui en fait un mois plutôt chaotique d'un point de vue circulation, le temps que chacun s'adapte à son (nouvel) emploi du temps.

Avec le retour au travail (et une moindre disponibilité de fruits et légumes variés), la question des repas revient sur la table. D'après une étude réalisée par Harris Interactive pour Cetelem (2023) et qui se base que sur un échantillon de 1165 personnes, 45% des actifs apportent un repas sur leur lieux de travail, 25% vont à la cantine, 10% au restaurant et 20% achètent leur repas le jour même. En se concentrant sur la région Parisienne, 40% se restaurent à la cantine. Les disparités sont donc importantes selon la région et la catégorie socio-professionnelle. L'étude nous apprend également que la pause déjeuner est souvent courte (inférieure 30 minutes dans 46% des cas, 1h dans dans 86% des cas).

Pour répondre à ce besoin de se sustenter pendant et en dehors des heures de travail, le recours à un achat externe est devenu monnaie courante. Il est d'ailleurs amusant de noter que les vendeurs ambulants ont (quasiment) toujours existé dans les villes. Aujourd'hui, on appelle ça la street food. Composés à la fois d'échoppes ambulantes (food trucks) et fixes. D'aucun pourra regretter le déclin de la grande cantine commune ou du bistrot du coin. Cette pratique du repas sur commande connaît d'ailleurs une forte croissance grâce à la livraison. Côté qualité, il y en a pour tout les goûts. Certes, hormis pendant la période du COVID, il sera difficile d'atteindre une qualité équivalente à un bon restaurant dans une offre à emporter/commander, mais l'on peut trouver des plateaux repas tout à fait correct, voire même des camions à nourriture de bonne qualité.

Le revers de la médaille, comme souvent quand il s'agit de "simplifier" la vie du consommateur, est une production de déchets importante (notamment plastiques et cartons). Déchets qui seront difficiles à recycler car souillés (liquides, gras, bactéries). De manière plus générale, l'alimentation est une grande génératrices de déchets à causes d'emballages et de sur emballages nombreux. Face à ce constat amer, une association Toulousaine a vu le jour en 2019 "En boîte le plat". Le nom n'est pas forcément très vendeur, mais l'idée tombe sous le sens : proposer un circuit de distribution/nettoyage aux commerçants. Ces derniers délivrent alors les repas dans un contenant consigné qui pourra être réutilisé de nombreuses fois. La principale difficulté de mettre en place un système de consigne est le fait que la plupart du temps les producteurs et les consommateurs sont éloignés via une (longue) chaîne de distribution, ce qui n'est pas le cas dans la vente à emporter; la plupart du temps locale et récurrente !

En quelques années, le réseau ETIC Emballages a pris de l'ampleur avec des antennes sur Rennes, Besançon, Compiègne, Saint-Étienne, Toulouse, le bassin Sophiapolitain et quelques 180 commerces engagés. Si ce chiffre peut paraître anecdotique au regard de l'offre nationale, l'important est surtout la volonté de faire bouger les choses et pourquoi pas l'évolution des mentalités. Car, même s'ils ne le proposent pas d'eux même, la plupart des commerçants acceptent DÉJÀ de disposer leurs produits dans nos propres contenants. Il faut juste anticiper un minimum avant de sortir faire des achats. Boulangerie, Pâtisserie, Boucherie, Poissonnerie, Traiteur, Food Truck... Pensez à apporter votre propre contenants, exactement comme on pense à apporter ses propres sacs de courses.

Aparté : Au delà de la production de déchets, de la qualité et du niveau d'équilibre nutritifs très moyen des repas, la vente à emporter favorise des comportements très mauvais d'un point de vue nutritionnel car elle s'accompagne souvent de desserts et "boissons" très sucrés via les "formules". Ces éléments qui sont peu souvent fait sur place, permettent au commerçant de réaliser de grosses marges unitaires. Pour autant, c'est une mauvaise habitude de les associer à son repas, car on aura tendance à reproduire ce schéma lors des repas courants (notamment pour les plus jeunes).

Dorloteur d'abeilles

Sunday, 18 August 2024
|
Écrit par
Grégory Soutadé

Selon les chiffres officiels, chaque Français consommerait environ 1,5kg de miel par an. Soit un consommation globale de 45 000 tonnes, dont 90% seraient importés. Difficile d'y voir clair tant il y a de producteurs qui vendent/donnent en direct. Difficile également de faire la part entre le miel consommé directement ou intégré dans d'autres produits, notamment le fameux pain d'épice. En effet, d'un point de vue personnel, la consommation brute semble relativement faible, notamment du fait de la concurrence d'autres produits plus attractifs : chocolat, sucre, sirop d'agave (ou équivalent)...

Quoi qu'il en soit, le rendement par ruche a été divisé par 2 en dix ans. Entre réchauffement climatique (l'année 2023 a été la plus chaude jamais enregistrée et 2024 s'apprête à la surpasser), pesticides, artificialisation des sols (les abeilles ne butinent ni le béton, ni le gazon), maladies et parasites (favorisés par des températures chaudes), nouveaux prédateurs (bonjour le frelon asiatique)... Les abeilles ont la vie dure. Pourtant, l'on sait parfaitement le rôle essentiel joué par les pollinisateurs dans les écosystèmes : sans eux, beaucoup de plantes (dont celles que l'on mange) ne se reproduisent pas, donc pas de fruits, ni de légumes à la clé.

Je parle bien ici de pollinisateurs, car il n'y a pas que les abeilles qui font ce travail, mais également tout un tas d'autres insectes (même le frelon asiatique !). Si on se concentre uniquement sur les abeilles, toutes ne produisent pas de miel. En effet, il existe environ 20 000 espèces différentes ! Notamment les osmies rousses (osmia rufa) et les osmies cornues (osmia cornuta). Ces deux dernières sont des abeilles dites "solitaires", c'est à dire qu'elles ne vivent pas dans une ruche avec leurs congénères. Elles vont utiliser des petites cavités (notamment dans les troncs d'arbres) afin d'y déposer du pollen. Une fois qu'il y a suffisamment de stock, elles vont pondre un œuf et refermer la cavité avec de la terre qu'elles auront humidifié et qui va sécher. Elles pourront faire plusieurs cavités à la suite. C'est un travail qui dure environ un mois avant qu'elles ne meurent. De leur côté, les œufs vont éclore en petits vers qui vont manger le pollen. Ils vont ensuite se transformer en cocons pour passer l'hiver. Une fois le printemps venu (ils ressentent le changement de température), les cocons vont éclore pour donner naissance aux abeilles et recommencer ainsi le cycle.

Les osmies ne sont absolument pas agressives. Elles se contentent de butiner et de se reproduire, ce qui permet de les observer tranquillement. C'est pour toutes ces caractéristiques qu'a été lancée l'initiative "Les Dorloteurs d'Abeille". Le principe consiste à vendre des habitats (plusieurs formes et tailles sont disponibles) pour les osmies (avec ou sans cocons). Le particulier enverra l'année suivante sa "récolte" de cocons afin qu'ils passent l'hiver à l’abri et puissent être en parti re distribués. Il y a un achat récurrent de tubes en carton qui simulent l'habitat naturel des abeilles (elles se reproduisent à proximité de leur lieu de naissance). Les osmies ne sont pas une espèce particulièrement menacées, mais il s'agit d'un outil pédagogique très intéressant (en plus d'avoir une vraie utilité), surtout pour les jeunes générations qui peuvent facilement observer tout le cycle de vie, notamment avec certains tubes transparents et un toit amovible afin de ne pas trop les déranger.

Attention cependant. Comme mentionné plus haut, il ne suffit pas d'élever des abeilles dans une ruche/dorlotoir pour que la vie reprenne. Comme tous les êtres vivants, les abeilles ont besoin de se nourrir. Or, la nourriture se raréfie : hors des villes, l'agriculture prend le pas sur les espaces sauvages. Dans les villes, c'est le béton qui domine et, lorsqu'il y a un jardin, il est souvent taillé ras, avec peu de diversité en terme de fleurs. C'est pourquoi il est important, d'une part, de planter des fleurs mellifères et, d'autre part, de laisser des espaces sauvages non taillées qui seront des habitats à insectes et d'où va naturellement pousser (sans engrais, ni arrosage) des petites fleurs utiles pour la biodiversité. En parallèle, l'idéal est de mettre à disposition des points d'eau (peu profond et avec des cailloux) afin qu'elles puissent s'abreuver après une longue journée de travail. Il n'est d'ailleurs pas nécessaire de posséder un dorloteur pour mettre en pratique ces conseils !