Ancienne usine Ferriere Fiat à Turin
14 septembre 2025
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Photo
Mots clés : aucun
amoweb.fr
14 septembre 2025
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Photo
Mots clés : aucun
14 septembre 2025
Les jours fériés et les vacances scolaires ne sont pas affichées par tous les calendrier même si ça peut paraître être une fonctionnalité de base.
Se rendre sur le site du gouvernement et télécharger le fichier des jours fériés au format ICS ici : https://www.data.gouv.fr/fr/datasets/jours-feries-en-france/.
Et télécharger le fichier des jours fériés au format ICS ici : https://www.data.gouv.fr/fr/datasets/le-calendrier-scolaire/.
Il suffit en suite de les importer dans Outlook, Gmail ou l'application calendrier.
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Astuces Soft
Mots clés : aucun
18 juillet 2025
Voici ma sélection de spectacles vus à Avignon cette année. Ils sont tous à voir !
***Contre-temps. Une pièce/concert de Samuel Séné sur l'histoire incroyable du compositeur d'opérettes et de comédie musicale François Courdot. Un grand moment avec deux chanteuses et un pianiste. Très drôle.
***Polar Polar. L'enquête de deux policiers dans une ville très froide. Très dynamique et très drôle.
Par Hadrien Berthaut, Louis Hanoteau et Benjamin Isel.
3 Courtes Pièces de Molière en 3 époques épiques. Trois pièces adaptées avec des très différents : le Médecin Volant en baroque, l'Amour Médecin en comedia del’arte et la Jalousie du Barbouillé en contemporain. Drôle et très bien interprétée.
Par La Compagnie Rugir l’Art.
Basketteuses de Bamako. Jonglage musique et chant. Beau travail sur les rythmes. Une belle découverte. De Thomas Guérineau.
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Evenements, Reportages
Mots clés : aucun
01 novembre 2023
In english: How to create a C or C++ library (DLL) : common mistakes.
Il est fréquent de fournir une librairie (bibliothèque) pour permettre au client d'utiliser votre produit dans son logiciel. Par exemple, si vous fournissez un logiciel de calcul scientifique, le client aura peut-être besoin de lire les fichiers générés par votre logiciel ou bien intégrer certains calculs à son produit. Si vous vendez des sondes de dioxyde de carbone, vous fournissez sûrement une DLL (Dynamic Link Library) permettant de lire les mesures.
Peu importe dans quel langage est développé votre logiciel, fournir une interface en C est permet une intégration presque partout et une utilisation dans la plupart des langages.
Sous Windows, vous fournissez donc un fichier .dll contenant les fonctions utiles au client, un fichier .lib qui liste ces fonctions et indique comment les trouver dans la .dll et un fichier .h qui contient la signature des fonctions lisibles par le programmeur. Sous Linux, la DLL s'appelle .so et elle est fournie uniquement avec un fichier .h.
Si vous avez développé votre programme en C++ et que vos clients utilisent du C++, fournir une DLL pour ce même langage permet d'en simplifier l'utilisation pour le client car il bénéficiera des avantages des classes, des références, etc. C'est ce que fait Qt par exemple. L'inconvénient est qu'il faut compiler la librairie pour plusieurs compilateurs voire plusieurs versions d'un même compilateur : GCC, Clang, MSVC (Visual Studio 2015, 2022, etc), etc.
La librairie standard C++ peut aussi changer entre les versions d'un même compilateur : entre deux versions de Visual Studio, par exemple std::string peut changer et provoquer des plantages difficiles à comprendre.
Une librairie C++ a certains avantages, mais a aussi un coût. Une solution est de rendre la bibliothèque open source pour que le client puisse la recompiler ; une autre solution est de développer une interface C++ header-only (uniquement dans le .h) qui cache l'interface C.
malloc et free ou bien new et delete doivent être fait dans la même entité (programme ou DLL). Considérez la fonction suivante :
DLL_EXPORT char* GetProjectName(Project_t id);
Ici GetProjectName renvoie une chaine de caractères qui a été allouée par la DLL. Si le compilateur du client est différent du compilateur qui a produit la DLL, désallouer la chaine de caractères avec free peut provoquer un plantage car l'implémentation de l'allocateur peut être différente. Par exemple en debug, malloc et free peuvent être instrumentés pour détecter des problèmes.
La solution classique est la suivante :
DLL_EXPORT void GetProjectName(Project_t id, char* name);
Dans ce cas le client doit allouer un tableau et GetProjectName va copier la chaine. Il faut fournir au client la taille maximum possible ou une fonction GetProjectNameLength. Un alternative est de définir un type qui contient la chaine :
typedef struct MyString_ { const char * const str; } MyString_t;
Et des fonctions pour manipuler MyString_t :
DLL_EXPORT MyString_t* CreateMyString(const str* ms); DLL_EXPORT void DeleteMyString(MyString_t* ms); DLL_EXPORT MyString_t* GetProjectName(Project_t id);
Les fonctions CreateMyString et GetProjectName font un malloc et la fonction DeleteMyString, un free. C'est donc la DLL qui se charge à la fois de l'allocation et de la libération de la mémoire.
On réduit aussi les erreurs car l'utilisateur n'a plus besoin de se soucier d'allouer la bonne taille. Les consts interdisent la modification de str par l'utilisateur pour éviter que DeleteMyString se retrouve à appeler free sur des données allouées par l'utilisateur.
Clarifier l'interface. Et les types sont là pour ça. On considère la fonction suivante :
DLL_EXPORT int GetCurrentProjectId(); DLL_EXPORT void RemoveFile(int projectId, int fileId);
Ici ce code peut être rendu beaucoup plus clair avec des types
typedef int ProjectId_t; typedef int FileId_t; DLL_EXPORT ProjectId_t GetCurrentProjectId(); DLL_EXPORT void RemoveFile(ProjectId_t projectId, FileId_t fileId);
Malheureusement, le compilateur n'émettra même pas un warning si l'utilisateur place un ProjectId_t au lieu d'un FileId_t, mais le code est quand même plus lisible.
Const correctness. Déclarer les pointeurs ou références const dès que possible.
DLL_EXPORT char* SetProjectName(Project_t id, const char* str);
Ici, str est const char*, c'est indispensable si l'utilisateur veut passer une chaine de caractère constante. Son code ne pourra pas respecter la const correctness si vous ne le faites pas.
Pas plus de 4 paramètres pour vos fonctions. Utiliser une structure si la fonction a trop d'entrées. Pour retourner plusieurs paramètres utilisez des structures. N'utilisez surtout pas de tableaux pour renvoyer des données de natures différentes. Par exemple renvoyer un tableau contenant [x y z] peut être dangereux car l'utilisateur risque de se tromper d'ordre. En C++, évitez les std::pair qui ont ce défaut aussi.
Utilisez des pointeurs opaques pour identifier les instances de votre lib, cela permet de cacher les données stockées. En C++, le patron PIMPL sert à ça. Dans les exemples précédents, j'ai utilisé des entiers (par exemple Project_t) ce qui est moins efficace car il faut une map qui stocke la correspondance mais c'est parfois plus facile à gérer dans le logiciel du client.
Bien documenter le format des données, les types et les unités GetPressure, GetTemperature, GetDistance ne veulent rien dire si on ne précise pas si ce sont des bars, des N/m², des °C, °F, des mètres ou des mm.
Le plus important : la lib est l'interface entre vous et le client. La documentation et le nom des fonctions doit utiliser les termes du client pas un jargon interne !
En conclusion, demandez-vous ce que le client va comprendre de votre interface et quelles erreurs il va faire. Facilitez-lui la tâche en rendant les erreurs difficiles voire impossibles.
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Coding
Mots clés : aucun
01 novembre 2023
La qualité du support technique est aussi importante que la qualité du produit lui-même (matériel ou logiciel). Dans son choix, le client va préférer un support technique qui sait résoudre ses problèmes rapidement. Le client va probablement rester fidèle à une marque s'il sait que le support fonctionne bien.
En faisant du SAV pour du matériel industriel (optique, électronique ou logiciel), j'avais remarqué que tous les clients ne doivent pas être traités de la même manière et qu'il y avait des besoins différents entre la recherche et l'industrie.
Ainsi, un client industriel a souvent des questions entièrement dirigées vers son but : corriger un problème ou connaitre une bonne manière de réaliser son besoin. Il a des questions du type : "Comment faire ça ? Quelle configuration permet de créer mon produit ?".
Il attend de la rigueur dans le mode d'emploi du produit et l'idéal est de lui fournir des exemples concrets qui correspondent à son besoin.
J'ai remarqué qu'un client académique (chercheur, université, etc) ou R&D a des questions plus larges. Il va par exemple demander quelles sont les différentes manières de réaliser quelque chose ? S'il y a différentes méthodes, il veut pouvoir les comparer lui-même ou lire un comparatif chiffré. Il sait généralement déjà comment fonctionne le produit ou il connait déjà la théorie et il va plutôt chercher à comprendre la réalité technique derrière le nom commercial.
Rédigé par Amaury Graillat - Aucun commentaire
Classé dans : Pro
Mots clés : aucun