Quand j’ai testé le code chez moi hier soir, j’avais un retour d’erreur sur iconv. Après, c’est peut-être lié à mon terminal qui n’était peut-être pas en UTF8, mais ton programme doit toujours vérifier tous les codes de retour qui peuvent échouer.
Quand je ne vérifie pas un code de retour volontairement, par exemple printf, je le cast :
Salut,
Dans mon cas, pour le boulot, le PC est sous Windows, je ne développe pas d’application libre. On m’impose Visual.
Pour le perso, mon ordi à la maison est 100% sous Linux depuis 2003 (c’est là que je n’ai joué qu’avec une compatibilité wine), donc j’utilise emacs, vim, kdevelop ou qtcreator.
en fait personne n'utilise des GPU AMD dans mon entourage !
Ça me fait penser à une question… sur mon ordi, j’ai un Ryzen avec un APU (sans écran), et une carte graphique Nvidia, peut-on faire de l’openCL sur l’APU ?
Peut-on utiliser le back-end amdgpu de llvm ?
Hello,
Si je comprends bien, c’est une ode au non-typage… Je trouve l’exemple « mistake 2 » particulièrement laid.
Avoir trois structures avec des champs ayant le même nom et que ça marche… je comprends pourquoi certains préfère le typescript pour avoir un meilleur système de typage.
Salut,
Je me suis tenté une implémentation avec setitimer…
#define _POSIX_C_SOURCE 199309L#include<stdio.h>// #include <sys/timerfd.h>#include<errno.h>#include<string.h>#include<stdlib.h>// #include <unistd.h>#include<sys/mman.h>//#include <time.h>#include<unistd.h>#include<threads.h>#include<signal.h>#include<sys/time.h>#define COUNT 10001#define PERIODE 1000000 //1ms (in ns)mtx_tmyLock;void(*old_handler)(int);// sighandler_t don't work !!! :-(voidalarm_callback(intsig){// Unlock du mutex pour continuer la boucle.(void)mtx_unlock(&myLock);if((old_handler=signal(SIGALRM,alarm_callback))==SIG_ERR){fprintf(stderr,"Error setting SIGALARM in alarm_callback\n");return;}}intmain(intargc,charconst*argv[]){if(mtx_init(&myLock,mtx_plain)==thrd_error){fprintf(stderr,"Error creating mutex\n");return-1;}// Lock one time to init locked. First loop must unlockif(mtx_lock(&myLock)==thrd_error){fprintf(stderr,"Error locking mutex first time\n");return-1;}if((old_handler=signal(SIGALRM,alarm_callback))==SIG_ERR){fprintf(stderr,"Error setting SIGALARM\n");return-1;}structitimervalsetTimer,oldTimer;setTimer.it_interval.tv_sec=0;// Warning, c’est des us.setTimer.it_interval.tv_usec=PERIODE/1000;// First period start in 1ssetTimer.it_value.tv_sec=1;setTimer.it_value.tv_usec=0;// Timer values are defined by the following structures://// struct itimerval {// struct timeval it_interval; /* Interval for periodic timer */// struct timeval it_value; /* Time until next expiration */// };//// struct timeval {// time_t tv_sec; /* seconds */// suseconds_t tv_usec; /* microseconds */// };if(setitimer(ITIMER_REAL,&setTimer,&oldTimer)==-1){fprintf(stderr,"Setitimer initialization failed\n");return-1;}structtimespecnow,previous;longsomme=0;longpeak=PERIODE,base=PERIODE;longtabTimer[COUNT];__uint64_tret;if(clock_gettime(CLOCK_MONOTONIC,&previous)<0){printf("error clock_gettime : %s\n",strerror(errno));return-1;}for(size_ti=0;i<COUNT;i++){// Wait for syncif(mtx_lock(&myLock)==thrd_error){fprintf(stderr,"Error lock in loop number %d\n",i);return-1;}clock_gettime(CLOCK_MONOTONIC,&now);tabTimer[i]=(now.tv_sec-previous.tv_sec)*1000000000+now.tv_nsec-previous.tv_nsec;previous=now;}constlonghigh_10=PERIODE+PERIODE/10;constlonglow_10=PERIODE-PERIODE/10;inthigher=0;intlower=0;intnormal=0;//we write resultsfor(size_ti=1;i<COUNT;i++){// printf("[%2d] = %ld\n",i,tabTimer[i]);somme+=tabTimer[i];if(tabTimer[i]>peak){peak=tabTimer[i];}if(tabTimer[i]<base){base=tabTimer[i];}if(tabTimer[i]>high_10){higher++;}elseif(tabTimer[i]<low_10){lower++;}else{normal++;}}inttotal=lower+higher+normal;printf("average en ns = %ld, peak = %ld(+%2.2f%%), base = %ld(-%2.2f%%)\n",somme/(COUNT-1),peak,(((float)peak/PERIODE)-1)*100,base,(1.-((float)base)/PERIODE)*100);printf(" Total : %d,\n""\t- lower : %6d (%2.2f%%)\n""\t- normal: %6d (%2.2f%%)\n""\t- higher: %6d (%2.2f%%)\n",total,lower,100.*((float)lower)/total,normal,100.*((float)normal)/total,higher,100.*((float)higher)/total);return0;}
Pour le sigalarm, il faut le recabler à chaque fois.
Voici quelques stats, j’y ai ajouté le nombre de fois ou on a un écart de plus de 10%. De plus, si on déborde sur un cycle, la différence entre les deux sera forcément très inférieur sur le cycle suivant. D’où la relative symétrie (+ou- 1) entre les higher et les lower.
$ ./a.out
average en ns=999998, peak=1057467(+5.75%), base=944193(-5.58%)
Total : 10000,
- lower : 0(0.00%)
- normal: 10000(100.00%)
- higher: 0(0.00%)
$ ./a.out
average en ns=1000098, peak=2083044(+108.30%), base=603560(-39.64%)
Total : 10000,
- lower : 1(0.01%)
- normal: 9997(99.97%)
- higher: 2(0.02%)
$ ./a.out
average en ns=999998, peak=1206658(+20.67%), base=796835(-20.32%)
Total : 10000,
- lower : 2(0.02%)
- normal: 9997(99.97%)
- higher: 1(0.01%)
$ ./a.out
average en ns=999997, peak=1107952(+10.80%), base=894580(-10.54%)
Total : 10000,
- lower : 1(0.01%)
- normal: 9998(99.98%)
- higher: 1(0.01%)
$ su
Mot de passe :
##################### En Temps Réel####################
.../Linuxfr/TR# chrt 50 ./a.out
average en ns=999997, peak=1009857(+0.99%), base=978338(-2.17%)
Total : 10000,
- lower : 0(0.00%)
- normal: 10000(100.00%)
- higher: 0(0.00%)
.../Linuxfr/TR# chrt 50 ./a.out
average en ns=999997, peak=1011019(+1.10%), base=979650(-2.03%)
Total : 10000,
- lower : 0(0.00%)
- normal: 10000(100.00%)
- higher: 0(0.00%)
.../Linuxfr/TR# chrt 50 ./a.out
average en ns=999997, peak=1009547(+0.95%), base=976955(-2.30%)
Total : 10000,
- lower : 0(0.00%)
- normal: 10000(100.00%)
- higher: 0(0.00%)
.../Linuxfr/TR# chrt 50 ./a.out
average en ns=999997, peak=1015868(+1.59%), base=979951(-2.00%)
Total : 10000,
- lower : 0(0.00%)
- normal: 10000(100.00%)
- higher: 0(0.00%)
.../SSD/C++/Linuxfr/TR#
Un essai supplémentaire sur 2 minutes (2 × 60 × 1000 = 120 000ms)
$ ./a.out
average en ns=999999, peak=1425844(+42.58%), base=585376(-41.46%)
Total : 120000,
- lower : 22(0.02%)
- normal: 119955(99.96%)
- higher: 23(0.02%)
$ su
Mot de passe :
.../Linuxfr/TR# chrt 50 ./a.out
average en ns=999999, peak=1030337(+3.03%), base=968720(-3.13%)
Total : 120000,
- lower : 0(0.00%)
- normal: 120000(100.00%)
- higher: 0(0.00%)# Ajout d'une affinité CPU
.../Linuxfr/TR# taskset 1 chrt 50 ./a.out
average en ns=999999, peak=1272574(+27.26%), base=727705(-27.23%)
Total : 120000,
- lower : 10(0.01%)
- normal: 119981(99.98%)
- higher: 9(0.01%)
.../C++/Linuxfr/TR#
En forçant l’affinité sur un CPU, on augmente l’erreur… ça ma surpris. Il faudrait voir si on peut interdire un CPU à tout le monde sauf un processus ;-)
Après, j'avais choisi le CPU 0, peut-être que en prenant le 3…
Linuxfr/TR# taskset 4 chrt 50 ./a.out
average en ns=999999, peak=1018414(+1.84%), base=971595(-2.84%)
Total : 120000,
- lower : 0(0.00%)
- normal: 120000(100.00%)
- higher: 0(0.00%)
.../Linuxfr/TR#
C’est mieux… est-ce le hazard, ou les IT sont cablé sur le premier CPU sous Linux ?
Le get_clocktime aussi a le paramètre CLOCK_REALTIME.
Sinon, tu peux utiliser la fonction setitimer. Par contre, c'est un peu plus complexe, il faut intercepter le signal SIGALARM, dans la fonction callback, tu libères un sémaphore (mutex). Et dans ton code, tu bloques le sémaphores.
Autre chose, le temps réel, ça veut dire arrivé à temps… donc si malgré les erreurs tu arrives à finir ton algo avant la deadline, pourquoi chercher à réagir plus vite ? Néanmoins j’avoue que l’écart type d’erreur laisse songeur. ;-)
Re,
Dans le man timerfd_create,
il y a ce passage :
CLOCK_REALTIME
A settable system-wide real-time clock.
CLOCK_MONOTONIC
A nonsettable monotonically increasing clock that measures time from some unspecified point in the past that does not change after system startup.
L’application mobile se comporte aussi très bien avec la biométrie pour se déverrouiller. Je peux également, partager des mots de passe avec ma famille (les autres membres de mon instance).
Quelles sont les différences/avantages/inconvénients entre les deux ?
Hello,
Pour la définition du temps réel autant je suis d’accord que ça ne veut pas dire instantané, mais pour moi, ma façon de l’exprimer : « c’est répondre à une contrainte de temps et savoir détecter si une contrainte n’est pas respectée. »
Que la contrainte de temps soit de 1ms ou de 1h ne change pas grand chose. C’est pour ça, que je privilégie les algos à temps constant quand je fais du TR, car s’ils passent en tests, ils passeront tout le temps.
Si une contrainte n’est pas respectée, la conséquence sera en fonction de la criticité… pour l’écran d’un avion de ligne, l’écran se verra mettre en erreur (un gros F) à la place de l’affichage en cas de détection de panne hardware.
Dans certains cas, on peut gérer un dépassement, mais souvent, ce n’est pas envisageable.
Le style des livres évolue avec l’auteur aussi. Le messie n’est pas le plus intéressant. L’empereur Dieu de Dune est passionnant, mais c’est surtout une analyse politique et sociétale. Après, ça devient un peu cul, sans doute le vieillissement de Franck.
J’ai aussi aimé ce que le fils à fait : La trilogie du jihad butlerien 10 000 ans avant Dune, la trilogie juste avant, qui explique les trois maisons en conflit dans Dune, ce que j’ai moins aimé, c’est la fin de la saga… même si on retrouve des liens avec le jihad butlerien, les personnages sont un peu lourds.
Oui, son conditionnement n’est pas visible dans le film de Villeneuve. De même que le manta est transparent.
J’ai voté Lynch, car même s’il ne respecte pas bien le livre, c’est ce film qui m’a fait lire l’ensemble de l’œuvre. Je suis néanmoins impatient de voir la suite.
letx-3=0// => x = 3 la valeur x vaut-elle 3 ou c’est une contrainte ?x:=2// Erreur ?x:=3// Ok
Quand on ajoute une contrainte, est-elle testé à la compilation ? L’équation est-elle résolu ou utilisée lors de l’affectation pour vérifier les contraintes ?
Un code comme ci-dessous va-t-il détecter l’erreur à la compilation ou à l’exécution ?
[^] # Re: Retour d'erreur ?
Posté par Anthony Jaguenaud . En réponse au message renommage de fichiers en masse. Évalué à 4. Dernière modification le 23 février 2022 à 10:32.
Quand j’ai testé le code chez moi hier soir, j’avais un retour d’erreur sur
iconv
. Après, c’est peut-être lié à mon terminal qui n’était peut-être pas en UTF8, mais ton programme doit toujours vérifier tous les codes de retour qui peuvent échouer.Quand je ne vérifie pas un code de retour volontairement, par exemple
printf
, je lecast
:Je sais que printf n’est pas c++, mais c’est l’exemple qui m’est venu immédiatement en tête. ;-)
# Retour d'erreur ?
Posté par Anthony Jaguenaud . En réponse au message renommage de fichiers en masse. Évalué à 6. Dernière modification le 22 février 2022 à 22:53.
Salut,
Tu ne teste pas les retours de tes fonctions, c’est mal.
Même chose pour iconv_open.
Rajoute la gestion des erreurs, ça t’aidera à trouver ce qui cloche.
# Le code ?
Posté par Anthony Jaguenaud . En réponse au message renommage de fichiers en masse. Évalué à 2.
Salut,
Tu devrais mettre le code tel que tu l’as écrit jusque là, on pourra peut-être t’aider à adapter, debugguer.
# Aucune option
Posté par Anthony Jaguenaud . En réponse au sondage Développeur Libristes, oui ! mais macOS, Visual Studio et Azure ?. Évalué à 3.
Salut,
Dans mon cas, pour le boulot, le PC est sous Windows, je ne développe pas d’application libre. On m’impose Visual.
Pour le perso, mon ordi à la maison est 100% sous Linux depuis 2003 (c’est là que je n’ai joué qu’avec une compatibilité wine), donc j’utilise
emacs
,vim
,kdevelop
ouqtcreator
.# S’il pouvait tenir parole…
Posté par Anthony Jaguenaud . En réponse au journal Grosse déception cette semaine. Évalué à 4.
Ce ne serait pas si mal, on pourrait créer toi-et-tes-amis.fr, ou même retrouver ses anciens copains, les copains d’avant quoi :-p
Hélas, ils menacent, mais l’argent récolté grâce à la pub les empêchera de mettre leurs menaces à exécution.
[^] # Re: Le RGPD ne t'aidera pas
Posté par Anthony Jaguenaud . En réponse au journal RGPD et adresse mail. Évalué à 4.
En quoi cette complexité est elle inutile ?
[^] # Re: OpenCL, portabilité et performance en général
Posté par Anthony Jaguenaud . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.
Ah, après vérification, je n'ai pas d'APU… </me sifflote en prenant la porte>
[^] # Re: OpenCL, portabilité et performance en général
Posté par Anthony Jaguenaud . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.
Merci, bon il ne me détecte que ma Mi1080… il y a quelque chose à installer pour activer l'APU ?
[^] # Re: OpenCL, portabilité et performance en général
Posté par Anthony Jaguenaud . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.
Ça me fait penser à une question… sur mon ordi, j’ai un Ryzen avec un APU (sans écran), et une carte graphique Nvidia, peut-on faire de l’openCL sur l’APU ?
Peut-on utiliser le back-end amdgpu de llvm ?
# Il y a une limite de temps
Posté par Anthony Jaguenaud . En réponse au message Répondre à une discussion ; Aide ?. Évalué à 6.
Pour les très vieux contenus (3 mois ?) on ne peut plus poster de commentaire.
# Heu…
Posté par Anthony Jaguenaud . En réponse au lien How not to learn TypeScript. Évalué à 2.
Hello,
Si je comprends bien, c’est une ode au non-typage… Je trouve l’exemple « mistake 2 » particulièrement laid.
Avoir trois structures avec des champs ayant le même nom et que ça marche… je comprends pourquoi certains préfère le typescript pour avoir un meilleur système de typage.
# setitimer
Posté par Anthony Jaguenaud . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 6.
Salut,
Je me suis tenté une implémentation avec setitimer…
Pour le sigalarm, il faut le recabler à chaque fois.
Voici quelques stats, j’y ai ajouté le nombre de fois ou on a un écart de plus de 10%. De plus, si on déborde sur un cycle, la différence entre les deux sera forcément très inférieur sur le cycle suivant. D’où la relative symétrie (+ou- 1) entre les higher et les lower.
Un essai supplémentaire sur 2 minutes (2 × 60 × 1000 = 120 000ms)
En forçant l’affinité sur un CPU, on augmente l’erreur… ça ma surpris. Il faudrait voir si on peut interdire un CPU à tout le monde sauf un processus ;-)
Après, j'avais choisi le CPU 0, peut-être que en prenant le 3…
C’est mieux… est-ce le hazard, ou les IT sont cablé sur le premier CPU sous Linux ?
Voilà pour mes tests du soir.
Bonne nuit
[^] # Re: Paramètre de timerfd_create
Posté par Anthony Jaguenaud . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 2.
Le
get_clocktime
aussi a le paramètreCLOCK_REALTIME
.Sinon, tu peux utiliser la fonction
setitimer
. Par contre, c'est un peu plus complexe, il faut intercepter le signalSIGALARM
, dans la fonction callback, tu libères un sémaphore (mutex). Et dans ton code, tu bloques le sémaphores.Autre chose, le temps réel, ça veut dire arrivé à temps… donc si malgré les erreurs tu arrives à finir ton algo avant la deadline, pourquoi chercher à réagir plus vite ? Néanmoins j’avoue que l’écart type d’erreur laisse songeur. ;-)
# Paramètre de timerfd_create
Posté par Anthony Jaguenaud . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 4.
Re,
Dans le
man timerfd_create
,il y a ce passage :
As-tu essayé avec REALTIME ?
# Set affinity ?
Posté par Anthony Jaguenaud . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 3.
Hello,
Tu n’indiques pas comment tu lances ton programme.
En mode temps réel sur un noyau standard, la seule chose plus prioritaire, c’est le noyau.
Une solution pourrait-être de forcer ton processus sur un cœur, et d’interdire ce cœur au noyau.
Sinon, le réveil un peu plus tôt puis boucle active peut-être viable, et vraiment précis.
# BitWarden
Posté par Anthony Jaguenaud . En réponse à la dépêche Passbolt, le gestionnaire de mots de passe pour équipe, lance ses applications mobiles. Évalué à 7.
Hello,
J’ai installé sur un yunohost.org l’application bitwarden.
L’application mobile se comporte aussi très bien avec la biométrie pour se déverrouiller. Je peux également, partager des mots de passe avec ma famille (les autres membres de mon instance).
Quelles sont les différences/avantages/inconvénients entre les deux ?
[^] # Re: Habilitation
Posté par Anthony Jaguenaud . En réponse au message [Offre d'emploi][Résolue] Développeur Linux C++ temps-réel pour observatoire astronomique.. Évalué à 2.
Hello,
Pour la définition du temps réel autant je suis d’accord que ça ne veut pas dire instantané, mais pour moi, ma façon de l’exprimer : « c’est répondre à une contrainte de temps et savoir détecter si une contrainte n’est pas respectée. »
Que la contrainte de temps soit de 1ms ou de 1h ne change pas grand chose. C’est pour ça, que je privilégie les algos à temps constant quand je fais du TR, car s’ils passent en tests, ils passeront tout le temps.
Si une contrainte n’est pas respectée, la conséquence sera en fonction de la criticité… pour l’écran d’un avion de ligne, l’écran se verra mettre en erreur (un gros F) à la place de l’affichage en cas de détection de panne hardware.
Dans certains cas, on peut gérer un dépassement, mais souvent, ce n’est pas envisageable.
# Erreur ?
Posté par Anthony Jaguenaud . En réponse au message probleme de compréhension sur les rvalue et std::move. Évalué à 2. Dernière modification le 14 janvier 2022 à 15:55.
Salut, je vais sans doute écrire des bêtises…
dans la dernière partie tu utilises
V[1]
alors qu’il n’y a que l’élément 0.Si a la place de ….data() tu utilises ….c_str() ? Ça change quelque chose ? (normalement non.)
Après, le move est fait pour éviter des grosses copies, ici on peut copier avec juste une copie de 64bits. Avec une très longue chaîne, c’est pareil ?
Le push_back doit également allouer la mémoire, si tu fait un vector.resize(8) avant le push_back, est-ce que ça se comporte pareil ?
Pas d’idée supplémentaire.
[^] # Re: Pourquoi j'ai voté pour la série de John Harrison....
Posté par Anthony Jaguenaud . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 5.
Le style des livres évolue avec l’auteur aussi. Le messie n’est pas le plus intéressant. L’empereur Dieu de Dune est passionnant, mais c’est surtout une analyse politique et sociétale. Après, ça devient un peu cul, sans doute le vieillissement de Franck.
J’ai aussi aimé ce que le fils à fait : La trilogie du jihad butlerien 10 000 ans avant Dune, la trilogie juste avant, qui explique les trois maisons en conflit dans Dune, ce que j’ai moins aimé, c’est la fin de la saga… même si on retrouve des liens avec le jihad butlerien, les personnages sont un peu lourds.
[^] # Re: Yureh était mieux dans le film de Lynch
Posté par Anthony Jaguenaud . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 3.
Oui, son conditionnement n’est pas visible dans le film de Villeneuve. De même que le manta est transparent.
J’ai voté Lynch, car même s’il ne respecte pas bien le livre, c’est ce film qui m’a fait lire l’ensemble de l’œuvre. Je suis néanmoins impatient de voir la suite.
[^] # Re: pages man en couleur
Posté par Anthony Jaguenaud . En réponse au message utilisation du "man". Évalué à 2. Dernière modification le 12 janvier 2022 à 11:18.
Je ne m’étais jamais posé la question…
Merci de m’avoir créé un besoin, et de l’avoir comblé instantanément.
[^] # Re: arte aussi…
Posté par Anthony Jaguenaud . En réponse au journal Vidéo de qualitay sur l'histoire du mouvement anti-vaxx. Évalué à 2.
Le problème des bivalves, c’est qu’ils sont ahémisphère… ;-)
[^] # Re: Norbert est partout
Posté par Anthony Jaguenaud . En réponse au lien Le télétravail en 1985 . Évalué à 4.
À la fin : « Les charmes de la vie de bureau… » avec le mec qui fume. Heureusement que certaines choses ont évoluées.
[^] # Re: pas grave
Posté par Anthony Jaguenaud . En réponse au journal Le bug de l'an 2000 a 22 ans !. Évalué à 4.
Du coup, tu as provoqué le bug de l’an 2010 ;-)
[^] # Re: Intéressant
Posté par Anthony Jaguenaud . En réponse au journal Letlang, encore un nouveau langage de programmation. Évalué à 4.
Une question sur l’aspect équation…
Quand on ajoute une contrainte, est-elle testé à la compilation ? L’équation est-elle résolu ou utilisée lors de l’affectation pour vérifier les contraintes ?
Un code comme ci-dessous va-t-il détecter l’erreur à la compilation ou à l’exécution ?
Voilà pour mes interrogations actuelles ;-)