Posts by morgan

Jasper Report – Ajouter une interligne dans un tableau

Le but est de pouvoir ajouter une interligne dans un tableau. Cela peut-ête très utile, par exemple lors d’une facture et que l’on voudrais pouvoir préciser la taxe.   Pour ce faire, il faut faire des groupes dans le tableau. Don un group footer (qu’on va appeler « Group1 » car on a beaucoup d’imagination). A l’intérieur de ce groupe, on va ajouter un texteField (qui s’appel ici compléments). A ce stade, lorsque vous allez générer le pdf, la ligne sera afficher uniquement tout en bas du tableau, comme un footer.   Et c’est ici que réside l’astuce, il faut définir le group1 comme étant la concaténation de tous les champs de la colonne. Ainsi, chaque nouvelle ligne sera considéré comme un nouveau group et l’interligne sera répété. En bonus, je vous met la définition du groupe de donnée (subDataSet) . Shell &lt;subDataset name="FACTURE_LIGNE_DETAIL" uuid="d6f6b8e3-dd07-442d-a637-1f0536066d26"&gt;<br />&lt;parameter name="PIECE" class="com.fdilogbox.artemis.jreport.bean.marketplace.StandardReportParam"/&gt;<br />&lt;field name="reference" class="java.lang.String"/&gt;<br />&lt;field name="description" class="java.lang.String"/&gt;<br />&lt;field name="quantite" class="java.lang.String"/&gt;<br />&lt;field name="unitOfMeasure" class="java.lang.String"/&gt;<br />&lt;field name="prixUnitaireHT" class="java.lang.String"/&gt;<br />&lt;field name="montantTotalHT" class="java.lang.String"/&gt;<br />&lt;field name="tauxTaxe" class="java.lang.String"/&gt;<br />&lt;field name="complements" class="java.lang.String"/&gt;<br />&lt;group name="Group1"&gt;<br />&lt;groupExpression&gt;&lt;![CDATA[$F{reference}+$F{description}+$F{quantite}+$F{unitOfMeasure}+$F{prixUnitaireHT}+$F{montantTotalHT}+$F{tauxTaxe}+$F{complements}]]&gt;&lt;/groupExpression&gt;<br />&lt;/group&gt;<br />&lt;/subDataset&gt; 1 &lt;subDataset name="FACTURE_LIGNE_DETAIL" uuid="d6f6b8e3-dd07-442d-a637-1f0536066d26"&gt;<br />&lt;parameter name="PIECE" class="com.fdilogbox.artemis.jreport.bean.marketplace.StandardReportParam"/&gt;<br />&lt;field name="reference" class="java.lang.String"/&gt;<br />&lt;field name="description" class="java.lang.String"/&gt;<br />&lt;field name="quantite" class="java.lang.String"/&gt;<br />&lt;field name="unitOfMeasure" class="java.lang.String"/&gt;<br />&lt;field name="prixUnitaireHT" class="java.lang.String"/&gt;<br />&lt;field name="montantTotalHT" class="java.lang.String"/&gt;<br />&lt;field name="tauxTaxe" class="java.lang.String"/&gt;<br />&lt;field name="complements" class="java.lang.String"/&gt;<br />&lt;group name="Group1"&gt;<br />&lt;groupExpression&gt;&lt;![CDATA[$F{reference}+$F{description}+$F{quantite}+$F{unitOfMeasure}+$F{prixUnitaireHT}+$F{montantTotalHT}+$F{tauxTaxe}+$F{complements}]]&gt;&lt;/groupExpression&gt;<br />&lt;/group&gt;<br />&lt;/subDataset&gt;...

Read More

Mettre à jour tous les dépot git d’un répertoire

Voici une petite astuce qui me permet de mettre à jour tous les dépots git d’un répertoire. Pratique quand on a plein de sous-dépot.   Shell # For use in a shell: # Download this file to /usr/local/bin/git-pull-recursive, then chmod 755 it to install git-pull-recursive find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \; 123 # For use in a shell:# Download this file to /usr/local/bin/git-pull-recursive, then chmod 755 it to install git-pull-recursivefind . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;...

Read More

Quelle base pour stocker 100 million de ligne ? – part 2 : Mysql vs PostgreSql

Étude technique Comment choisir la base de donnée Dans notre besoin, une base de donnée clés / valeur correspondrait à notre attente car nous aurions besoin d’une clé (id de la base alfresco) et d’une valeur (les métas du document). En soi, une base de donnée relationnelle peut tout à fait faire le job : une colonne ‘alfrescoID’ indexée et une colonne ‘metadata’. Les dernières versions de bases relationnelles permettent d’avoir des colonnes de type json et donc introduisent le paradigme ‘document storage’ puisqu’il devient possible de requêter du json. Avant de choisir le paradigme de la base de données dont nous avons besoin (relationnelle / clés/valeur / document / graph), il est important de savoir ou l’on doit se situer sur le théorème de CAP. Si nous n’avons pas besoin de partitionnement, une base relationnelle suffirait. Comment savoir si une base relationnelle a besoin de partitionnement ? La réponse est simple : Si les indexes ne tiennent pas en RAM, les performances sont dégradés et on a besoin de les partitionner. A partir du moment où il y a besoin de partitionnement, il vaut mieux quitter les bases SQL conventionnelles pour aller vers les bases NOSQL. Condition du benchmark Pour le benchmark, nous allons comparer 2 bases relationnelles : mysql 5.8 (dernière version) et postgre 10.3 (dernière version). Je vais générer 100 000 lignes, avec une colonne ‘dbid’ qui correspond a l’id dans la base alfresco et une colonne ‘data’ qui contiendra un json ~2MO. L’idée est de vérifier l’empreinte mémoire utilisée par la base pour stocker les dbid/métadonnée d’un document. Si l’empreinte mémoire est trop grande, il faudra songer à utiliser des bases NoSQL. Les tests seront effectués sur un serveur avec les caractéristiques suivantes : OS : windows server 2012 à jour RAM : 64Go Proc : 4 proc a 2.39GhZ SSD 1To C’est parti ! Étape 1 : installation Installer un serveur postgresql 10 à été très facile, double clique sur l’exe, suivant -> suivant et tout fonctionne très bien. Pour installer le serveur MySql c’est beaucoup plus laborieux, il faut installer toutes les dépendances .net Étape 2 : Mesure de l’empreinte mémoire à vide Je profite de ce chapitre pour dire qu’il est très difficile de mesurer l’empreinte mémoire utilisée par un service sous Windows. Je m’y suis pris de trois manières différentes, mais aucune ne retourne le même résultat. Nous allons en étudier...

Read More

Quelle base pour stocker 100 million de ligne ? – part 1 : théorie

Expression du besoin fonctionnel L’objectif est d’être capable de stocker 100 000 000 documents avec alfresco. On sait déjà que la base de donnée alfresco ne tiendra jamais la charge. Le but est donc de déléguer le stockage des méta-données à une base externe (laquelle ?) afin de décharger la base alfresco. Il y a aussi un moteur d’indexation (solr) qui indexe tous les documents et qui effectue la recherche sur les méta-données. Ainsi le rôle de la base de donnée est de stoker la donnée et pas d’effectuer des recherches. Une requête Solr renverra des ID de base de donnée mysql correspondant à cette recherche. Pour soulager la base alfresco, il faudrait une seconde base de donnée qui fasse le mapping entre l’id de la base alfresco et les méta-donnée du document. Théorie sur les bases de données Théorème de CAP Dans ce chapitre, nous allons faire un peu de théorie et étudier le théorème de CAP. Consistency C = Consistence = La donnée est fiable. Après un insert ou un update, quand on fait un read, on est certain que la donnée soit à jour. Availability A = Availability = Le fait que la base de donnée soit rapide à répondre (haute vitesse d’accès à la donnée). Partitioning P = Partitioning = Quand on a des grosses base de données, un seul serveur ne suffit plus pour tout stocker, il faut partitionner la donnée sur plusieurs serveurs. Le théorème de CAP dit qu’il est possible d’avoir seulement 2 de ses trois choses. Les bases de données relationnelles (postgresql, mysql) sont des bases de données CA (la donnée est rapide d’accès et toujours fiable) mais se scale très mal. Le partitioning n’est pas impossible, mais l’overhead de partitioning coute très cher. A partir du moment il faut commencer à avoir un cluster, il faut songer à des bases de données AP ou CP. Par exemple, mongoDB est une base de donnée CP : Elle est capable d’être clusterisée sans payer de gros overhead, et la donnée est toujours consistante. Après un update, la donnée est tout de suite mise à jour sur tous les clusters. Le coût a payer pour cela est une vitesse de lecture diminuée (availability). D’un autre côté, il y a Cassandra : une basse de donnée AP. C’est à dire que Cassandra se clusterise très bien tout en gardant des vitesses d’accès comparables à...

Read More

vt#3

Pour ce troisième lot d’articles à lire, les sujets seront un peut plus varié que la simple programmation.   Qu’est-ce que l’observabilité d’un programme ? Towards Secure System Graphics: Arcan and OpenBSD Comment faire une grosse application en...

Read More

vt#2

Voici un lot de 3 articles intéressants que j’ai lu cette semaine. On peut voir que je me suis intéressé au websocket : BEM (CSS) : https://blog.eleven-labs.com/fr/retour-d-experience-sur-bem/ Server Side Event ou Websocket ? https://www.smashingmagazine.com/2018/02/sse-websockets-data-flow-http2/   RabbitMq chat post mortem : http://alvaro-videla.com/2011/05/rabbitmq-chat-post-mortem.html...

Read More

VT#1

Dans se nouveau concept, je vais regroupé les articles qui m’intéresse et que je m’oblige a lire pour faire ma veille technologique. Je vous fais ainsi partagé ma veille technologique.   Les résolvers angular : https://blog.nathanaelcherrier.com/2017/11/29/angular-les-resolvers/ Vim n’a pas besoin de multi-curseur : https://medium.com/@schtoeffel/you-don-t-need-more-than-one-cursor-in-vim-2c44117d51db Les id auto-incrémenté sont une mauvaise idée, il faut plutôt  utilisé les UUID : https://www.clever-cloud.com/blog/engineering/2015/05/20/why-auto-increment-is-a-terrible-idea/ Faites attention avec les UUID en tant que clé primaire : https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439      ...

Read More

[PoC] installation de Nagios pour superviser une application HTTP avec docker

Ressources utilisé : Superviser un hôte Linux via NRPE https://blog.nicolargo.com/2007/10/surveiller-vos-serveurs-linux-avec-nagios-et-nrpe.html [Tuto] Nagios: Introduction au fichiers de configurations de Nagios http://blog.nicolargo.com/wp-content/uploads/2011/03/ebook-nicolargo-nagios-v1.0.pdf http://djibril.developpez.com/tutoriels/perl/ecrire-facilement-plugin-nagios-perl/ 1. Pré-requis 1.1 Script bash qui démare un container nagios superviseur : Shell #!/bin/bash docker pull jasonrivers/nagios:latest docker run --name nagios4 \ -v /home/morgan/dev/docker/nagios/data/etc/:/opt/nagios/etc/ \ -v /home/morgan/dev/docker/nagios/data/var:/opt/nagios/var/ \ -v /home/morgan/dev/docker/nagios/data/custom-plugins:/opt/Custom-Nagios-Plugins \ -p 80:80 jasonrivers/nagios:latest 12345678 #!/bin/bashdocker pull jasonrivers/nagios:latest docker run --name nagios4 \-v /home/morgan/dev/docker/nagios/data/etc/:/opt/nagios/etc/ \-v /home/morgan/dev/docker/nagios/data/var:/opt/nagios/var/ \-v /home/morgan/dev/docker/nagios/data/custom-plugins:/opt/Custom-Nagios-Plugins \-p 80:80 jasonrivers/nagios:latest 1.2 un autre container qui contiens votre application http 1.3 Commande docker pour connaitre les ip : docker network inspect bridge | jq 2. Mise en place de l’environnement 2.1 Pour chaque container docker supervisé, il faut installé un serveur NRPE : apt-get install nagios-nrpe-server 2.1.1 Configurer pour autorisé a se connecter à notre serveur nagios de supervision nano /etc/nagios/nrpe.cfg Shell allowed_hosts=&lt;ip du container nagios&gt; 1 allowed_hosts=&lt;ip du container nagios&gt; 2.1.2 Si iptable est installé, autorisé les requete NRPE iptables -A INPUT -p tcp --dport 5666 -j ACCEPT 2.1.3 Automatisé le démarrage de NRPE : update-rc.d nagios-nrpe-server defaults 2.1.3 redémaré le service service nagios-nrpe-server restart 2.1.4 Pour vérifier que cela fonctionne, connecter vous sur le container <nagios> Shell cd $NAGIOS_HOME ./check_nrpe -H <ip_container a supervisé> 12 cd $NAGIOS_HOME./check_nrpe -H <ip_container a supervisé> 3. Exécuter une commande de supervision 3.1 sur le container supervisé, créer une nouvelle commande en éditant le fichier nrpe.cfg vim /etc/nagios/nrpe.cfg 3.2 En dessous des commandes déjà existantes, ajouté : command[check_home]=/usr/lib/nagios/plugins/check_disk -w 20 -c 10 -p /home Ici, le statue du service que nous allons créer plus tard sera en WARNING (-w), s’il reste moins de 20% (20) d’espace disque disponible et le statue sera CRITICAL (-c) s’il reste moins de 10% (10) d’espace libre. 3.3 Redémarer pour que la nouvelle commande soit prise en compte : service nagios-nrpe-server restart 3.4 Executer la commande depuis le container nagios Shell cd $NAGIOS_HOME ./check_nrpe -H <ip_container a supervisé> -c check_home 12 cd $NAGIOS_HOME./check_nrpe -H <ip_container a supervisé> -c check_home   4. Superviser plusieurs containers 4.1 Dans le container nagios : Dans le dossier objects nous allons créer un dossier linux_servers, c’est dans ce dossier que nous allons configurer toutes nos machines linux à superviser. Puis nous allons éditer le fichier nagios.cfg se trouvant dans $NAGIOS_HOME/etc et nous allons donc rajouter la ligne: Shell #Dossier serveurs Linux cfg_dir=/opt/nagios/etc/objects/linux_servers 12 #Dossier serveurs Linuxcfg_dir=/opt/nagios/etc/objects/linux_servers   Commenter la ligne qui surveille le serveur locale : Shell # Definitions for monitoring the local...

Read More

Mettre en place un environement de dev pour rust

Installer rust et les outils tiers curl https://sh.rustup.rs -sSf | sh installer les sources rustup component add rust-src Installer racer pour l’autocompletion cargo install racer installer raincorn pour le parsing cargo install --git https://github.com/RustDT/Rainicorn --tag version_1.x rustfmt pour le formattage Shell [crayon-662ad286159ad769264190 lang="sh" decode="true" inline="1" ]cargo install rustfmt-nightly 1 [crayon-662ad286159ad769264190   lang="sh" decode="true" inline="1"  ]cargo install rustfmt-nightly [/crayon] Configurer eclipse :   Directory : ~/.cargo rust src directory : $(rustc --print sysroot)/lib/rustlib/src/rust/src Racer : ~/.cargo/bin/racer...

Read More

Steam ne se lance pas

Ce n’est pas un gros article, mais c’est un problème qui ‘arrive souvent après une MAJ de pilote graphique / steam, alors je poste la solution en tant qu’article qui fera office d’aide mémoire.   quand je lance steam, je reste bloqué avec ceci dans la console : Shell Running Steam on ubuntu 16.04 64-bit STEAM_RUNTIME is enabled automatically Installing breakpad exception handler for appid(steam)/version(0) libGL error: unable to load driver: nouveau_dri.so libGL error: driver pointer missing libGL error: failed to load driver: nouveau libGL error: unable to load driver: swrast_dri.so libGL error: failed to load driver: swrast 12345678 Running Steam on ubuntu 16.04 64-bitSTEAM_RUNTIME is enabled automaticallyInstalling breakpad exception handler for appid(steam)/version(0)libGL error: unable to load driver: nouveau_dri.solibGL error: driver pointer missinglibGL error: failed to load driver: nouveaulibGL error: unable to load driver: swrast_dri.solibGL error: failed to load driver: swrast c’est du a un conflit entre les lib de steam et celle du system. il faut supprimer celle de steam (qui sont outdated) pour utililiser celle du system : Shell find ~/.steam/root/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -delete find ~/.local/share/Steam/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -delete 12 find ~/.steam/root/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -deletefind ~/.local/share/Steam/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -delete...

Read More