Oui. À chaque fois sans vraiment chercher… un coup de mou, une offre qui passe qui à l’air sympas. Un coup de CV, pas de lettre de motivation, c’est eux qui cherche.
Je dirais entretient sur 50% des cas, soit 4 à tous cassé, et deux jobs : 2018 et 2021.
Parfois, il fallait passer par un utilitaire DOS pour modifier le port d’entré/sortie car ça ne se configurait pas sur cette saleté de Win95… alors que déjà à l’époque, on pouvait paramétrer le modprobe ne2k io=0x.... sous un certain OS ;-).
Tu peux ajouter le score de Zemmour à l'extrême droite. ce qui la fait monter autour de 30%, sauf si tu considères que Zemmour est autre chose que de l’extrême droite.
Oui, mais… sans Zemmour, Marine ne serait pas allée chercher les électeurs de Pécresse qui aurait de fait fait un meilleur score…
On peut refaire le match, mais c’est fini pour cinq ans.
Pour avoir un truc portable qui change rien entre Windows/Linux/BSD/etc. je pense qu’emacs est un bon candidat. En prime, vous pourrez gérer vos fichiers de la même manière sur tous les OS.
Il a également des tas de plugin.
La signification des codes de 1 à 254 est déterminée par le programme.
En fait, pas tout à fait. Il vaut mieux rester de 0 à 127. Sous Linux, généralement, si un processus est tué par un signal, tu retrouves le code de retour : 128 + numéro du signal.
Moi aussi, j’ai un CPU RGB… mais c’est juste parce que c’était le meilleur rapport qualité/prix… je l’ai découvert en l’allumant avant de fermer ma tour. C’est les araignées qui doivent être contentes.
Les exceptions constituent les erreurs non prévisibles, comme un problème réseau, disque plein, et d'autres aspects, comme la sécurité. Je comprends mal l'intérêt de ne pas utiliser les exceptions..
Je ne suis pas d’accord. Si les interfaces que tu utilises sont correctement définies, tu dois pouvoir connaître la liste des exceptions. Donc, des erreurs. Récupérer une exception networkUnreachable ou une erreur NetworkUnreachable, je ne vois pas trop la différence.
Le principal intérêt des exceptions, àmha, dans les langages impératifs, c’est de pouvoir balancer l’erreur et la récupérer à l’endroit le plus propice, sans faire de cascade d’erreur, de cas particulier juste dans l’optique de la rebalancer à l’appelant. Le pendant de ça, c’est que rien ne garantit que quelqu’un récupère l’erreur.
Avec les types permettant le Railway programming, dans les langages fonctionnels, si tu ajoutes un cas d’erreur, tous les case, match où le type est utilisé doit être complet. Donc le compilateur te le dira si tu oublies de gérer un cas d’erreur.
Je ne sais pas si la dernière édition est bien, mais j’ai l’édition avec le C++ pré-c++2003 et je la trouve très bien, didactique, progressive.
La nouvelle édition traite jusqu’au c++17. Comme je suis un peu vieux, j’aime bien un livre… ça permet entre autres de lire un chapitre le soir avant de s’endormir. De s’en servir de référence sans avoir à switcher de fenêtre sur l’écran. De caler un écran ou un pied de table.
Le langage n’était pas vraiment interprété. Un programme était constitué d’une liste d’objets. Un objet pouvez être un nombre, une instruction, un programme.
Les 5 premiers quartets (2,5 octets) de l’objet étaient un pointeur vers le code assembleur gérant l’objet. Par exemple pour un nombre, c’était d’ajouter le nombre dans la pile. Pour un +, le code prend les deux nombres dans la pile, les ajoutes et recrée un objet de nombre dans la pile.
La fin du code assembleur d’un objet termine toujours par une instruction JUMP vers le pointeur de l’objet suivant.
Dans les objets faits par HP, il y en avait deux un peu spéciaux : begin et end qui permettait d’agréger des objets pour faire un truc de plus haut niveau. J’ai trouvé cette façon de faire vraiment très élégante.
Voilà la solution, j’ai changé les Int en Ratio Int, enlevé les vérifications de la division et de la soustraction (mais là, je n’en vois pas l’intérêt ;-) )
À chaque modification, j’ai laissé l’ancienne ligne en commentaire pour voir les différences.
importData.List-- new lineimportData.Ratio-- A value is an Int or an operation with two arguments and a result.--data Value = V Int | Op Operation Value Value IntdataValue=V(RatioInt)|OpOperationValueValue(RatioInt)dataOperation=Plus|Min|Mult|Div|Error-- Instance of Show class to be able to display Operation typeinstanceShowOperationwhereshowPlus="+"showMin="-"showMult="×"showDiv="÷"show_="Error"-- Instance of Show class for Value.instanceShowValuewhere-- show (V a) = show ashow(Va)=show$numeratora-- The value is a % 1show(Opoab_)=" ("++(showa)++(showo)++(showb)++") "-- Take an Operation and a list of 2 minimal Values. Generate a new value with the first two terms.doOp::Operation->[Value]->[Value]doOpPlus(a:b:xs)=(OpPlusab(va+vb):xs)whereva=getVavb=getVb-- We don't want to have negative values, so check if a >= b-- We work in ℚdoOpMin(a:b:xs)=(OpMinab((getVa)-(getVb)):xs)-- | otherwise = (Op Error a b (-1)):xsdoOpMult(a:b:xs)=(OpMultab(va*vb)):xswhereva=getVavb=getVb-- First check that divisor is not 0, then check if b can divide a without rest.doOpDiv(a:b:xs)|vb==0=(OpErrorab(-1)):xs-- | va `mod` vb == 0 = (Op Div a b (va `div` vb)):xs-- | otherwise = (Op Error a b (-1)):xs|otherwise=(OpDivab(va/vb)):xswhereva=getVavb=getVb-- Create a Ratio--setV a = V asetVa=V(a%1)getV(Va)=agetV(Op___a)=a-- Do operations, take a list of Values and do all operations, drop error if a computation is not possibledoOps::[Value]->[[Value]]doOpsa=filter(dropError.head)$map(\x->doOpxa)[Plus,Min,Mult,Div]-- Check for error filter, return True if it's valid.dropError::Value->BooldropError(OpError___)=FalsedropError_=True-- En entrée une liste de values, en sortie une liste d'opérations filtrée.-- Check we have 4 numbers.-- From right to left-- - map setV x => generate a Value list with only V values.-- - compute all permutations-- - For each list of values apply all operations on first two values, we get list of list of list so concat to obtain list of list Values-- - We have 3 elements-- - For each element, we perform permutations and concat to get a list of list of Values.-- - loop twice to get list of list of Value with length == 1.-- - Then filter to check if result is 24.get24::[Int]->[[Value]]get24x|lengthx==4=filter(\x->(getV(headx))==24)$concat.mapdoOps$concat.mappermutations$concat.mapdoOps$concat.mappermutations$concat.mapdoOps$permutations$mapsetVx|otherwise=[]
J’y ai pensé aussi, je l’ai fait. Je ne suis pas un pro du haskell, soyez bienveillant avec vos remarques ;-)
importData.List-- A value is an Int or an operation with two arguments and a result.dataValue=VInt|OpOperationValueValueIntdataOperation=Plus|Min|Mult|Div|Error-- Instance of Show class to be able to display Operation typeinstanceShowOperationwhereshowPlus="+"showMin="-"showMult="×"showDiv="÷"show_="Error"-- Instance of Show class for Value.instanceShowValuewhereshow(Va)=showashow(Opoab_)=" ("++(showa)++(showo)++(showb)++") "-- Take an Operation and a list of 2 minimal Values. Generate a new value with the first two terms.doOp::Operation->[Value]->[Value]doOpPlus(a:b:xs)=(OpPlusab(va+vb):xs)whereva=getVavb=getVb-- We don't want to have negative values, so check if a >= bdoOpMin(a:b:xs)|(getVa)>=(getVb)=(OpMinab((getVa)-(getVb)):xs)|otherwise=(OpErrorab(-1)):xsdoOpMult(a:b:xs)=(OpMultab(va*vb)):xswhereva=getVavb=getVb-- First check that divisor is not 0, then check if b can divide a without rest.doOpDiv(a:b:xs)|vb==0=(OpErrorab(-1)):xs|va`mod`vb==0=(OpDivab(va`div`vb)):xs|otherwise=(OpErrorab(-1)):xswhereva=getVavb=getVbsetVa=VagetV(Va)=agetV(Op___a)=a-- Do operations, take a list of Values and do all operations, drop error if a computation is not possibledoOps::[Value]->[[Value]]doOpsa=filter(dropError.head)$map(\x->doOpxa)[Plus,Min,Mult,Div]-- Check for error filter, return True if it's valid.dropError::Value->BooldropError(OpError___)=FalsedropError_=True-- En entrée une liste de values, en sortie une liste d'opérations filtrée.-- Check we have 4 numbers.-- From right to left-- - map setV x => generate a Value list with only V values.-- - compute all permutations-- - For each list of values apply all operations on first two values, we get list of list of list so concat to obtain list of list Values-- - We have 3 elements-- - For each element, we perform permutations and concat to get a list of list of Values.-- - loop twice to get list of list of Value with length == 1.-- - Then filter to check if result is 24.get24::[Int]->[[Value]]get24x|lengthx==4=filter(\x->(getV(headx))==24)$concat.mapdoOps$concat.mappermutations$concat.mapdoOps$concat.mappermutations$concat.mapdoOps$permutations$mapsetVx|otherwise=[]
En vérifiant le retour de snprintf, tu peux savoir s’il y avait assez de place… Obligatoire, dès que tu as en entrée des données que tu ne maitrises pas.
$ man 3 iconv
ICONV(3) Linux Programmer's Manual ICONV(3)NAME iconv - perform character set conversionSYNOPSIS #include <iconv.h> size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);DESCRIPTION The iconv() function converts a sequence of characters in one character encoding to a sequence of characters in another character encoding. The cd argument is a conversion descriptor, previously created by a call to iconv_open(3); the conversion descriptor defines the character encodings that iconv() uses for the conversion. The inbuf argument is the address of a variable that points to the first character of the input sequence; inbytesleft indicates the number of bytes in that buffer. The outbuf argument is the address of a vari‐ able that points to the first byte available in the output buffer; outbytesleft indicates the number of bytes available in the output buffer. The main case is when inbuf is not NULL and *inbuf is not NULL. In this case, the iconv() function converts the multibyte sequence starting at *inbuf to a multibyte sequence starting at *outbuf. At most *inbytesleft bytes, starting at *inbuf, will be read. At most *outbytesleft bytes, starting at *outbuf, will be written. The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements *inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted out‐ put bytes, and it updates the conversion state contained in cd. If the character encoding of the input is stateful, the iconv() function can also convert a sequence of input bytes to an update to the conversion state without producing any output bytes; such input is called a shift sequence. The conversion can stop for four reasons: 1. An invalid multibyte sequence is encountered in the input. In this case, it sets errno to EILSEQ and returns (size_t) -1. *inbuf is left pointing to the beginning of the invalid multibyte sequence. 2. The input byte sequence has been entirely converted, that is, *inbytesleft has gone down to 0. In this case, iconv() returns the number of nonreversible conversions performed during this call. 3. An incomplete multibyte sequence is encountered in the input, and the input byte sequence terminates after it. In this case, it sets errno to EINVAL and returns (size_t) -1. *inbuf is left pointing to the beginning of the incomplete multibyte sequence. 4. The output buffer has no more room for the next converted character. In this case, it sets errno to E2BIG and returns (size_t) -1. A different case is when inbuf is NULL or *inbuf is NULL, but outbuf is not NULL and *outbuf is not NULL. In this case, the iconv() function attempts to set cd's conversion state to the initial state and store a corresponding shift sequence at *outbuf. At most *out‐
bytesleft bytes, starting at *outbuf, will be written. If the output buffer has no more room for this reset sequence, it sets errno to E2BIG and returns (size_t) -1. Otherwise, it increments *outbuf and decrements *outbytesleft by the number of bytes written.
A third case is when inbuf is NULL or *inbuf is NULL, and outbuf is NULL or *outbuf is NULL. In this case, the iconv()function sets cd's conversion state to the initial state.
RETURN VALUE
The iconv()function returns the number of characters converted in a nonreversible way during this call; reversible conversions are not counted. In case of error, it sets errno and returns (size_t) -1.
ERRORS
The following errors can occur, among others:
E2BIG There is not sufficient room at *outbuf.
EILSEQ An invalid multibyte sequence has been encountered in the input.
EINVAL An incomplete multibyte sequence has been encountered in the input.
VERSIONS
This function is available in glibc since version 2.1.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌──────────┬───────────────┬─────────────────┐
│Interface │ Attribute │ Value │
├──────────┼───────────────┼─────────────────┤
│iconv() │ Thread safety │ MT-Safe race:cd │
└──────────┴───────────────┴─────────────────┘
The iconv()function is MT-Safe, as long as callers arrange for mutual exclusion on the cd argument.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008.
NOTES
In each series of calls to iconv(), the last should be one with inbuf or *inbuf equal to NULL, in order to flush out any partially converted input.
Although inbuf and outbuf are typed as char **, this does not mean that the objects they point can be interpreted as C strings or as arrays of characters: the interpretation of character byte sequences is handled internally by the conversion functions. In some encod‐
ings, a zero byte may be a valid part of a multibyte character.
The caller of iconv() must ensure that the pointers passed to the function are suitable for accessing characters in the appropriate character set. This includes ensuring correct alignment on platforms that have tight restrictions on alignment.
SEE ALSO
iconv_close(3), iconv_open(3), iconvconfig(8)
COLOPHON
This page is part of release 5.10 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/.
Il y a vingt ans, je ne me souviens plus trop…
RedHat -> Mandrake -> Suze -> debian (stable -> sid)(2003) -> gentoo (±14 ans) -> debian stable.
Maintenant, debian stable est suffisant pour moi, sauf peut-être pour avoir des versions récentes de blender… Mais pour ça, j’utilise la version dans steam :-p
[^] # Re: age sur le CV ?
Posté par Anthony Jaguenaud . En réponse au journal Hey, les quadra, vous êtes obsolètes. Évalué à 2.
Tu parles des prises vampires ? Que de souvenir…
[^] # Re: "Les CVs, ça sert à rien"
Posté par Anthony Jaguenaud . En réponse au journal Hey, les quadra, vous êtes obsolètes. Évalué à 3.
Oui. À chaque fois sans vraiment chercher… un coup de mou, une offre qui passe qui à l’air sympas. Un coup de CV, pas de lettre de motivation, c’est eux qui cherche.
Je dirais entretient sur 50% des cas, soit 4 à tous cassé, et deux jobs : 2018 et 2021.
[^] # Re: age sur le CV ?
Posté par Anthony Jaguenaud . En réponse au journal Hey, les quadra, vous êtes obsolètes. Évalué à 3.
Parfois, il fallait passer par un utilitaire DOS pour modifier le port d’entré/sortie car ça ne se configurait pas sur cette saleté de Win95… alors que déjà à l’époque, on pouvait paramétrer le
modprobe ne2k io=0x....
sous un certain OS ;-).[^] # Re: Les règles, je suis d'accord avec que lorsqu'elles vont dans mon sens
Posté par Anthony Jaguenaud . En réponse au journal Une personne malade qui ne veut pas explicitement choisir aura.... Évalué à 2.
Oui, mais… sans Zemmour, Marine ne serait pas allée chercher les électeurs de Pécresse qui aurait de fait fait un meilleur score…
On peut refaire le match, mais c’est fini pour cinq ans.
# The best ;-)
Posté par Anthony Jaguenaud . En réponse au lien NotepadNext : une réimplémentation multiplateforme de Notepad++. Évalué à 5.
Pour avoir un truc portable qui change rien entre Windows/Linux/BSD/etc. je pense qu’emacs est un bon candidat. En prime, vous pourrez gérer vos fichiers de la même manière sur tous les OS.
Il a également des tas de plugin.
[^] # Re: true=0 ?
Posté par Anthony Jaguenaud . En réponse au journal Challenge: Écrire la plus petite implémentation de /bin/true. Évalué à 10. Dernière modification le 07 avril 2022 à 14:54.
En fait, pas tout à fait. Il vaut mieux rester de 0 à 127. Sous Linux, généralement, si un processus est tué par un signal, tu retrouves le code de retour : 128 +
numéro du signal
.Ici, 130 == 128 + 2 => SIGINT qui correspond bien au
<Ctrl>+c
.Édit: Arg, grillé !
[^] # Re: Firmwares privateurs
Posté par Anthony Jaguenaud . En réponse à la dépêche La distribution GNU/Linux Trisquel 10.0 « Nabia » est là !. Évalué à 3.
Si tu ne mets pas les dépôts
non-free
sur debian, tu as aussi un système 100% libre, non ?# Le bug est chez toi…
Posté par Anthony Jaguenaud . En réponse au message Le président est inquiet. Évalué à 3. Dernière modification le 21 mars 2022 à 09:28.
Je pense que le bug est dans ton cerveau ! Mais que faisais-tu sur le site de « closer » ?
[^] # Re: Je suis un kéké
Posté par Anthony Jaguenaud . En réponse au journal Des DIMMs DDR RGB en SMBus vraiment PITA. Évalué à 5.
Moi aussi, j’ai un CPU RGB… mais c’est juste parce que c’était le meilleur rapport qualité/prix… je l’ai découvert en l’allumant avant de fermer ma tour. C’est les araignées qui doivent être contentes.
[^] # Re: Kamoulox !
Posté par Anthony Jaguenaud . En réponse au journal Golang, oops you did it again. Évalué à 4.
Je ne suis pas d’accord. Si les interfaces que tu utilises sont correctement définies, tu dois pouvoir connaître la liste des exceptions. Donc, des erreurs. Récupérer une exception
networkUnreachable
ou une erreurNetworkUnreachable
, je ne vois pas trop la différence.Le principal intérêt des exceptions, àmha, dans les langages impératifs, c’est de pouvoir balancer l’erreur et la récupérer à l’endroit le plus propice, sans faire de cascade d’erreur, de cas particulier juste dans l’optique de la rebalancer à l’appelant. Le pendant de ça, c’est que rien ne garantit que quelqu’un récupère l’erreur.
Avec les types permettant le Railway programming, dans les langages fonctionnels, si tu ajoutes un cas d’erreur, tous les
case
,match
où le type est utilisé doit être complet. Donc le compilateur te le dira si tu oublies de gérer un cas d’erreur.# Un livre avec de vraies pages ?
Posté par Anthony Jaguenaud . En réponse au message Quelles ressources pour apprendre sérieusement ?. Évalué à 8.
Programmer en langage c++ de Claude Delannoy.
Je ne sais pas si la dernière édition est bien, mais j’ai l’édition avec le C++ pré-c++2003 et je la trouve très bien, didactique, progressive.
La nouvelle édition traite jusqu’au c++17. Comme je suis un peu vieux, j’aime bien un livre… ça permet entre autres de lire un chapitre le soir avant de s’endormir. De s’en servir de référence sans avoir à switcher de fenêtre sur l’écran. De caler un écran ou un pied de table.
[^] # Re: Kamoulox !
Posté par Anthony Jaguenaud . En réponse au journal Golang, oops you did it again. Évalué à 6.
Le principe en F# de railway programming.
[^] # Re: J'ai pas écouté le podcast, mais mon grain de sel
Posté par Anthony Jaguenaud . En réponse au lien Is functional programming the hipster programming paradigm?. Évalué à 2.
Le langage n’était pas vraiment interprété. Un programme était constitué d’une liste d’objets. Un objet pouvez être un nombre, une instruction, un programme.
Les 5 premiers quartets (2,5 octets) de l’objet étaient un pointeur vers le code assembleur gérant l’objet. Par exemple pour un nombre, c’était d’ajouter le nombre dans la pile. Pour un
+
, le code prend les deux nombres dans la pile, les ajoutes et recrée un objet de nombre dans la pile.La fin du code assembleur d’un objet termine toujours par une instruction
JUMP
vers le pointeur de l’objet suivant.Dans les objets faits par HP, il y en avait deux un peu spéciaux :
begin
etend
qui permettait d’agréger des objets pour faire un truc de plus haut niveau. J’ai trouvé cette façon de faire vraiment très élégante.[^] # Re: J'ai pas écouté le podcast, mais mon grain de sel
Posté par Anthony Jaguenaud . En réponse au lien Is functional programming the hipster programming paradigm?. Évalué à 3.
Si la fonction est pure, soit sans effet de bord, recopier son code ou une référence revient au même.
Sur ma HP48, on pouvait manipuler le code directement dans la pile, manipuler l’ordre des éléments, les dupliquer, les évaluer, les concaténer, etc.
Dans tous les cas, il va rester le problème des variables globales et des effets de bord, qu’il y ait copie ou non.
[^] # Re: Haskel
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 2.
En fait ta première ligne :((1-5) + 7 ) × 8 <=> ((7 - 5) + 1)×8. Solution que mon programme trouve. Il trouve également : (7-(5-1))×8.
[^] # Re: Haskel
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 4.
Voilà la solution, j’ai changé les
Int
enRatio Int
, enlevé les vérifications de la division et de la soustraction (mais là, je n’en vois pas l’intérêt ;-) )À chaque modification, j’ai laissé l’ancienne ligne en commentaire pour voir les différences.
Et le résultat :
[^] # Re: Haskel
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 2.
Non, ça ne marchera pas.
La division entière à besoin d’un type
integral
ce que n'est pas Ratio. On ne peut pas mélanger les types dans les divisions.[^] # Re: Haskel
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 2. Dernière modification le 04 mars 2022 à 23:38.
Oui, mais j'ai volontairement omis les nombres à virgules…
I’ll be back with Rational soon ;-)
[^] # Re: Haskel
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 2. Dernière modification le 04 mars 2022 à 20:27.
Non, je n'avait pas testé…
Il retourne une liste vide, donc sans solution du point de vue de mon programme… c'est le résultat attendu ?
[^] # Haskell
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 3. Dernière modification le 04 mars 2022 à 19:37.
J’y ai pensé aussi, je l’ai fait. Je ne suis pas un pro du haskell, soyez bienveillant avec vos remarques ;-)
Et les résultats :
Évidemment, on prend toute les permutations d’une même solution.
[^] # Re: Survivor
Posté par Anthony Jaguenaud . En réponse au journal C, un âge remarquable. Évalué à 2.
En vérifiant le retour de
snprintf
, tu peux savoir s’il y avait assez de place… Obligatoire, dès que tu as en entrée des données que tu ne maitrises pas.[^] # Re: En Prolog
Posté par Anthony Jaguenaud . En réponse au journal résoudre "trouve 24". Évalué à 3.
(6×4)÷(5-1) et il n’y a que des divisions entières.
[^] # Re: Survivor
Posté par Anthony Jaguenaud . En réponse au journal C, un âge remarquable. Évalué à 8.
Il faut juste apprendre à programmer…
J’ai appris à mes enfants, quand ils prennent le jouet d’un copain, à le rendre. Il faut juste faire pareil ;-)
--->[]
[^] # Re: une solution ?
Posté par Anthony Jaguenaud . En réponse au message renommage de fichiers en masse. Évalué à 3.
Tu as oublié de traiter le cas :
[^] # Re: Presque le même parcours…
Posté par Anthony Jaguenaud . En réponse au journal Comparaison entre Manjaro et Debian Sid. Évalué à 2.
Il y a vingt ans, je ne me souviens plus trop…
RedHat -> Mandrake -> Suze -> debian (stable -> sid)(2003) -> gentoo (±14 ans) -> debian stable.
Maintenant, debian stable est suffisant pour moi, sauf peut-être pour avoir des versions récentes de blender… Mais pour ça, j’utilise la version dans steam :-p