Nouveau

Créer son propre archétype Maven

Aujourd’hui, j’ai enfin pris le temps de voir comment créer son propre archétype Maven. L’idée m’était venue en octobre, notamment avec la lecture de cet article, Maven pour les nuls… les archetypes. Avoir son propre archétype permet de créer un nouveau projet en respectant une structure donnée très simplement. Il est ainsi possible d’uniformiser les développements au sein de l’entreprise en fournissant un modèle qui sera commun à tous les projets. Pour cette expérimentation, j’ai choisi de créer un modèle de projet avec une structure ressemblant à celle que pourrait avoir un projet en C sur MCU et dont l’artéfact généré serait un zip contenant l’intégralité du projet. Je travaille dans Eclipse Mars pour plus de faciliter mais vous pourriez très bien faire la même chose avec un éditeur de texte et la ligne de commande.

Création du modèle de projet

La première étape est de créer un projet tel que j’aimerais que Maven le génère avec mon archétype. Une fois cette coquille créée, je demanderai à Maven de générer l’archétype à partir de ce modèle (template, en anglais). Voici à quoi ressemble mon projet :

maven - archetype - 1 - template

La seconde étape est la personnalisation du fichier pom.xml pour générer non pas un jar mais un zip du projet. Pour cela, il faut utiliser le plugin Assembly de Maven. En suivant les conseils de la section Usage, j’ai rajouté l’utilisation de ce plugin, j’ai choisi le mode project et j’ai demandé à ce que la cible qui va bien d’Assembly soit appelée lors de la phase package du projet. Enfin, j’ai changé le type de packaging du projet de jar vers pom pour ne plus générer de jar mais uniquement le zip d’Assembly. Voici le pom.xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.gradot</groupId>
    <artifactId>mcu-project-template</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>project</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Création du projet Maven de l’archétype

À ce state, je possède donc un modèle de projet avec la structure et le packaging souhaités. En exécutant mvn package sur le projet, on constate en effet que le dossier de sortie target contient bien 3 archives (zip, tar.gz, targ.bz2). Il faut donc maintenant créer le projet Maven de l’archétype en lui-même, à partir de ce projet template, grâce à la commande mvn archetype:create-from-project. J’ai essayé de le faire directement avec un launch configuration d’Eclipse mais j’ai obtenu l’erreur suivante :

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:
create-from-project (default-cli) on project mcu-project-template: 
${maven.home} is not specified as a directory: 
'/home/pgradot/Documents/workspace-mars/mcu-project-template/EMBEDDED'. -> [Help 1]

Cela semble être dû à un bug de l’intégration de Maven dans Eclipse. La solution de contournement est simple :  exécuter la commande via le terminal. Le projet Maven de l’archétype est alors disponible dans target/generated-sources/archetype. Pour plus de facilité pour la suite, j’ai créé un projet Eclipse en utilisant une non-default location pointant vers l’emplacement du projet Maven de l’archétype :

maven - archetype - 2 - create eclipse project

Enfin, j’ai rajouté la nature Maven au projet Eclipse en faisant un clic-droit puis Configure / Convert to Maven project. On peut maintenant regarder le contenu de l’archétype et notamment retrouver les fichiers de notre projet template :maven - archetype - 3 - archetype content

Hic ! Les dossiers vides ne sont pas gardés lors de la génération de l’archétype…

Publication et utilisation de ce nouvel archétype

Pour publier l’archétype et ainsi le rendre disponible, il suffit d’appeler la cible install du projet (ou deploy, si les dépôts sont configurés) et l’artéfact de l’archétype se retrouve dans le dépôt local de Maven :

$ ls -l /home/pgradot/.m2/repository/com/gradot/mcu-project-template-archetype
/1.0.0-SNAPSHOT/
total 20
-rw-rw-r-- 1 pgradot pgradot   96 mai   10 08:34 m2e-lastUpdated.properties
-rw-rw-r-- 1 pgradot pgradot  726 mai   10 08:30 maven-metadata-local.xml
-rw-rw-r-- 1 pgradot pgradot 3241 mai   10 08:30 mcu-project-template-archetype
-1.0.0-SNAPSHOT.jar
-rw-rw-r-- 1 pgradot pgradot  988 mai   10 08:24 mcu-project-template-archetype
-1.0.0-SNAPSHOT.pom
-rw-rw-r-- 1 pgradot pgradot  238 mai   10 08:30 _remote.repositories

Je peux maintenant créer un nouveau projet dans Eclipse et demander à Maven d’utiliser mon nouvel archétype (il faut penser à cocher qui va bien la case si l’archétype a été buildé en snapshot, ce qui est le cas ici) :maven - archetype - 4 - create projet

Pour finir je peux constater que j’obtiens un projet semblable à mon projet template (aux dossier vides près… ) et qui se package comme il faut !

maven - archetype - 5 - result

Obtenir la BOM d’un circuit dans Eagle

Quand la conception du circuit est terminée, on souhaite naturellement récupérée la bill of materials (BOM). La BOM est la liste des composants utilisés avec les différentes références et les quantités associées. La BOM est indispensable pour acheter les pièces nécessaires à la fabrication. Et forcément, la BOM va nous donner une bonne partie du prix de revient du circuit.

Eagle ne semble pas fournir d’entrée dédiée dans ses menus pour afficher la BOM mais il est possible d’exécuter un User Language Program (ULP) fourni avec le logiciel pour effectuer cette tâche. Pour l’exécuter, il suffit de taper la commande suivante :

run bom.ulp

Une fenêtre va alors s’afficher :

eagle bom 1

Vous pouvez choisir le type de liste ainsi que le format de fichier et exporter votre BOM. Il ne vous reste plus qu’à aller au magasin ou à commander en ligne !

Utiliser Linux pour lire un disque Time Machine

OS X propose le très pratique Time Machine pour sauvegarder ses données automatiquement sur un disque dur externe. Presque en même temps que mon iMac, j’ai acheté un disque dur externe sur lequel je sauvegarde régulièrement l’intégralité de mon disque interne. Il y a quelques jours, mon iMac m’a lâché et ne s’allume plus. Je vais l’emmener voir le docteur mais en attendant j’ai besoin de certains fichiers importants. Il s’avère que ces fichiers sont sur mon disque Time Machine car je fais régulièrement mes sauvegardes🙂

Je n’ai pas de deuxième Mac pour lire ce disque mais j’ai plein d’autres PC, avec Windows ou Linux. Petit hic : Time Machine utilise des disques au format HFS+. Windows ne comprend pas ce format par défaut, il faut utiliser des logiciels additionnels ; en revanche, Linux le comprend très bien car il est directement supporté par le noyau. J’ai donc ressorti un vieux PC portable et, malgré une vieille version de Mint, j’ai immédiatement pu accéder à mes fichiers !

time machine linux1

Il y a un second hic : Time Machine stocke les sauvegardes de manière un peu ésotériques, à grands coups de liens, et cela mène à des problèmes de permissions empêchant l’accès aux fichiers de mon user. Comme par hasard, les fichiers que je veux sont là-dedans…

time machine linux 2

Je ne suis bien sûr pas le premier à rencontrer cette difficulté, d’autres se sont déjà penchés sérieusement sur le sujet et un gentil développeur a publié sur Github un script pour copier une arborescence d’un disque Time Machine vers un dossier local. Ça fait un peu mal pour récupérer beaucoup de données, mais on ne va pas se plaindre et remercier le monsieur, Marcello Barnaba !

J’ai donc copié mon dossier $HOME/Documents vers mon PC Linux :

$ sudo ./copy-from-time-machine.sh "/media/Seagate Backup Plus Drive/Backups.backupdb/iMac de pierregradot/2016-03-05-112442/iMac/Users/pierregradot/Documents" ./time_restored/

Mes fichiers étaient là, mission accomplie🙂

Savoir ce qui prend de la place sur le disque dur de son PC Windows

Il y a quelques années, j’avais écrit un article expliquant comment savoir ce qui prend de la place sur le disque dur de son Mac. Il y a quelques semaines, j’ai eu besoin de faire la même chose sous Windows. Pour pouvoir changer de machine, je souhaitais d’abord sauvegarder les données mais après des années d’utilisation, il y avait des giga et des giga à transférer ! Il fallait faire un peu de tri mais l’éternelle question s’est à nouveau posée : par où commencer ?

Sous Mac, j’utilise Disk Inventory X. J’ai donc demandé à alternativeTo de me trouver une alternative pour Windows et il m’a conseillé WinDirStat. Il est disponible sous licence GLP v2 et est donc gratuit. Il est très léger, le téléchargement et l’installation se font en quelques minutes.

Au démarrage, il nous propose d’analyser tous les disques ou d’en sélectionner certains (et donc d’exclure les autres) :

WinDirStat - sélectionner des lecteurs

Pour l’exemple, je lui ai demandé d’analyser tous les lecteurs. Il mouline un moment :

WinDirStat - work in progress

Enfin, il affiche un graphique d’occupation :

windirstat - done

Les résultats ne sont pas ici très représentatifs car j’ai analysé une machine que je viens d’installer et qui ne me sert que pour le développement…il n’y a donc presque rien dessus. Très logiquement, c’est le dossier Windows qui prend le plus de place et le gros carré rouge en bas à gauche correspond à des fichiers systèmes. Lancez-le chez vous et je suis sûr que vos films, séries, photos et mp3 arriveront en haut du classement ! Bonnes analyses et bon courage pour le ménage.

Imprimer un typon avec Eagle

Quand on a terminé le routage d’une carte et que l’on souhaite réaliser soi-même le PCB, il faut imprimer le typon de cette carte. De nombreux tutoriels sur Eagle utilisent la commande EXPORT pour générer une image et règlent un DPI très élevé pour (soi-disant) obtenir une bonne qualité. Voici un exemple de script trouvé sur Instructables et légèrement adapté :

DISPLAY ALL
RATSNEST
DISPLAY None
DISPLAY Bottom Pads Vias
EXPORT image pcb.png monochrome 600

600 est la valeur du DPI. Pour la carte de mon générateur de signal à 1 Hz, j’obtiens une image de 1117 * 1082 pixels et qui ressemble à ça :

eagle export image

Cette image est une version redimensionnée avec une largeur de 400 pixels. Si vous cliquez dessus, vous pourrez voir l’originale et bien verrez mieux que c’est un peu dégueulasse ! Les contours arrondis des pads sont flous, les bords du plan de masse sont souvent hasardeux, la pointe du plan de masse en bas au milieu part en cacahuète… Ajoutons à cela le fait que l’image n’est pas du tout à l’échelle 1:1 et nous serons d’accord que ceci n’est pas acceptable pour imprimer le typon.

Mais alors que faire ? La bonne solution est d’imprimer, au sens propre, avec File / Print. Bon, en fait, si vous faites ça sans quelques ajustements en plus, vous obtiendrez quelque chose comme ça :

eagle print default

On imprime ce qu’on voit, il nous faut donc au préalable afficher uniquement les couches utiles et remplir le plan de masse. C’est là que le script ci-dessus trouve son utilité en enlevant l’export en tant qu’image :

DISPLAY ALL
RATSNEST
DISPLAY None
DISPLAY Bottom Pads Vias

On peut ensuite imprimer en cochant la case Black :

eagle printer settings

Comme il existe une commande PRINT, on peut écrire un script pour tout faire et ouvrir la fenêtre ci-dessus avec la case Black déjà cochée :

DISPLAY ALL
RATSNEST
DISPLAY None
DISPLAY Bottom Pads Vias
PRINT black

Vous pouvez rajouter un ; à la fin de la dernière ligne pour ne pas passer par la fenêtre et imprimer directement le document. Moi, c’est l’imprimante PDF qui est sélectionné par défaut (en même temps, c’est la seule imprimante installée en ce moment). J’obtiens donc un PDF avec le même nom à côté de mon fichier *.brd. Le typon est à l’échelle 1:1 et la qualité est bien meilleure qu’avec l’export en tant qu’image :

eagle print ok