Lorsque l'on regarde l'évolution du logo de Firefox, notre cher petit panda roux a littéralement disparu au profit d'au choix et selon votre perception :
- Une sorte de flamme.
- La fin d'un grosse queue d'animal (mais en inversant tête et queue par rapport au logo "classique").
J'ai lu beaucoup de personnes (Reddit, 9gag, Imgur) décrier le nouveau logo en arguant que Mozilla était en train de faire tout simplement disparaître Firefox de nos vies, au sens symbolique comme au sens réel du terme (puisque part de marché en baisse), le logo actuel étant un constat de ce phénomène.
Je rappelle que Mozilla avait choisi le Firefox pour avertir le grand public que cette espèce était en voix d'extinction, visiblement cette cause n'est plus importante ou l'espèce n'est plus à protéger... Ou alors le marketing est plus important que les causes importantes #ComplotismeOuCapitalisme ?
Edit : ce que le logo Firefox aurait pu être si le style minimaliste n'était pas en vogue.

Edit 2 : Apparemment Mozilla gardera l'avant dernier logo du set que j'ai posté. Quant à ce logo :
Il sera utilisé pour parler l'ensemble des produits de la "gamme Firefox", donc non le Panda Roux reste bien qu'un peu déformé (source Mozilla Blog).
Merci @Lou, pour avoir remonté la vraie info, le nouveau logo venant du blog consacré à Firefox, ce n'était pas clair.
Edit : Pitest marche avec TestNG finalement ! Il faut rajouter ceci au plugin (info que j'ai trouvée dans la conf Gradle d'une application Android mais pas dans la doc officielle) :
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>${version.pitest}</version>
<configuration>
<testPlugin>testng</testPlugin>
</configuration>
</plugin>
Merci à @Animal et @Kysofer qui m'ont accompagnée très tard cette nuit sur Framatalk.org ! #BestBuddiesEver
Depuis hier je me casse les dents sur Pitest dont j'ai parlé à deux reprises ici et ici. Pour faire simple un client m'a demandé de le mettre en œuvre sur nos projets mais impossible de le faire marcher :'(
Comme ce soir tout le monde est couché depuis 1h30 et que j'ai l'esprit frais, je me suis dit que j'allais réessayer mais en changeant ma démarche. Cette fois-ci je prendrai un projet sur internet et qui fonctionne puis j'en modifierai sa configuration pour la faire converger vers celle de mon projet jusqu'à ce qu'elle pète.
Conclusion : Pitest ne fonctionne pas avec TestNG (et j'ai essayé toutes les versions majeures de la 6.1.1 conseillée par le site de Pitest jusqu'à la 7.3.0, dernière version en date).
Bref, cela faisait quelques temps que le couple TestNG + AssertJ me posait problème dans le sens où TestNG était moins bien pris en charge par certains framework et je vais a priori devoir faire un retour arrière pour le couple JUnit Jupiter + AssertJ (oui je conserve AssertJ, plus jamais les assertions de JUnit, viva la fluent-expressive API d'AssertJ).
Voici le passage dont j'ai graissé la partie qui m'a énervée :
Cornichon : 28 calories
100 grammes de cet aliment représentent une valeur énergétique de 28 calories ou kilocalories (ou 116 kilojoules). En moyenne, les produits de la catégorie sauces salées et condiments apportent une valeur énergétique équivalente à 203 kilocalories.
Donc, c'est au choix j'imagine c'est ça ? C'est, 100g de cornichons apportent :
- 28 calories (c'est-à-dire que-dalle !)
ou - 28 kilocalories, c'est-à-dire 28 000 calories (c'est-à-dire 1 000 fois plus !!)
Et c'est ça qui m'énerve avec toute cette presse orientée régime-bien-être-minceur / la-saloperie-qui-vous-vient-à-lesprit-synonyme-de-tes-moche-alors-achète-ma-merde. Heureusement que je sais que les producteurs (industriels) ont créé l'unité Calorie avec un 'C' majuscule où 1 Calorie = 1000 calories pour nous faire croire que nous ne grossirions pas en consommant leurs merdes, mais qu'est-ce que ça m'énerve de voir que la majuscule n'est respectée nulle part !
On ne peut JAMAIS savoir la quantité d'énergie que l'on ingère, ajoutez à cela qu'il faudrait convertir les calories en leur équivalent sucre pour savoir combien d'énergie nous absorbons réellement et j'en viens à me dire que tous les régimes hypocaloriques ne sont que du bullshit pur et dur.
N.B : oui en équivalent sucre car jusqu'à preuve du contraire, le bambou contient aussi des calories, sauf que notre organisme n'est pas capable des les assimiler comme c'est le cas du Panda... Pour rappel, nous nous déplaçons grâce aux lipides stockés, puis transformés en glucides au moment de l'effort, pour être utilisés comme carburant.
Bref, je viens d'ajouter une règle pour rediriger le domaine journaldesfemmes.fr vers 127.0.0.1, plus jamais je ne veux consulter ce site de ma vie ! Et je lui donne la note de #PQsur20 parce que même #TorchonSur20 ce serait trop bien le noter.
Un framework de test de mutation pour JRE, donc qui marche avec Kotlin et Java.
Tout à fait d'accord ! Et il y a aussi Marx par Léon Trotsky que je recommande parce que Le Capital de Marx est certes une œuvre majeure mais qui peut s'avérer être indigeste pour une bonne partie des gens.
Aujourd'hui j'ai relu un cours de @Kysofer qu'il prépare sur la bonne utilisation des monades en programmation fonctionnelle et ça m'a donné envie de le résumer en un cas d'école clair et simple.
Pour la petite histoire et depuis Java 8, je vois apparaître des Optionals partout mais 99% des développeurs n'ont pas compris comment s'en servir (c'est pour cette raison que je dis souvent que la programmation fonctionnelle est un cancer métastasé, car une fois ces mauvaises pratiques installées, le code devient alors incurable). #Sadness
Bref, c'est partie pour une explication claire et courte... Notre cas d'école sera le suivant :
Une
Personnepossède uneDate de Naissance, cette date contient elle-même uneAnnée de Naissancequi contient à son tour une valeur (logée dans un Integer).L'objectif est d'imprimer l'année de naissance si elle existe sans jamais écrire le moindre 'if' pour l'exécution ci-après déclarée dans la méthode
main().
La méthode main() :
class Main {
public static void main(String[] args) {
optionalPrintln(Optional.ofNullable(new Person(new BirthDay(new YearOfBirth(2000)))));
optionalPrintln(Optional.ofNullable(new Person(new BirthDay(null))));
optionalPrintln(Optional.ofNullable(new Person(null)));
}
}
La sortie attendue dans la console doit être celle-ci
2000
Étape 1 - Les classes/structures de données Person, BirthDay et YearOfBirth
class Person {
private final BirthDay birthDay;
public Person(BirthDay birthDay) {
this.birthDay = birthDay;
}
public Optional<BirthDay> getBirthDay() {
return Optional.ofNullable(birthDay);
}
}
class BirthDay {
private final YearOfBirth year;
public BirthDay(YearOfBirth year) {
this.year = year;
}
public Optional<YearOfBirth> getYearOfBirth() {
return Optional.ofNullable(year);
}
}
class YearOfBirth {
private final int year;
public YearOfBirth(int year) {
this.year = year;
}
public Optional<Integer> getValue() {
return Optional.of(year);
}
}
Étape 2 - Ce qu'il ne faut pas faire
Les 9-10ième des développeurs Java que je côtoie écriront ce genre de code pour la optionalPrintln(Optional<Person> option) :
class Main {
// ...
public static void optionalPrintln(Optional<Person> option) {
if (option.isPresent()) {
Person person = option.get();
Optional<BirthDay> birthDay = person.getBirthDay();
if (birthDay.isPresent()) {
Optional<YearOfBirth> yearOfBirth = birthDay.get().getYearOfBirth();
if (yearOfBirth.isPresent()) {
Optional<Integer> year = yearOfBirth.get().getValue();
if (year.isPresent()) {
System.out.println(year.get());
}
}
}
}
}
}
C'est très moche, c'est très compliqué et ça n'est pas fonctionnel du tout ! Pire encore, certains développeurs écriront ceci :
year.ifPresent(it -> System.out.println(it));
à la place de ce dernier 'if' :
if (year.isPresent()) {
System.out.println(year.get());
}
tout en croyant coder en fonctionnel, or ça n'est pas le cas du tout non plus ! Croire que l'on fait bien alors que l'on fait mal, c'est en ce sens que la chose est pire AMHA.
Étape 3 - Ce qu'il faut faire
La programmation fonctionnelle ne cherche pas à représenter des instructions, c'est-à-dire une succession d'actions techniques qui s'enchaînent mais a contrario, elle cherche à représenter un flux de conversion, c'est-à-dire le fait de passer d'un type A à un type B.
L'API permettant une telle prouesse réside dans le map de la stream API, or cette fonctionnalité n'est pas applicable à un objet composé comme c'est le cas du Optional puisqu'il s'agit d'un arbre à deux niveaux sur une seule branche.
Dans ce cas, il faut utiliser la méthode flatMap() de la même API pour supprimer le niveau superflue de l'arbre et accéder directement à la donnée si elle n'est pas null.
Ce qui donne le code suivant :
public static void optionalPrintln(Optional<Person> option) {
option.flatMap(it -> it.getBirthDay())
.flatMap(it -> it.getYearOfBirth())
.flatMap(it -> it.getValue())
.ifPresent(it -> System.out.println(it));
}
Explication
A chaque invocation de flatMap(), cette méthode va jouer pour nous un optional.ifPresent(it -> ...) afin de nous en décharger. Si rien n'est présent, alors l'évaluation du flatMap() lui succédant ne se fera tout simplement pas car le flux d'instances à convertir d'un type à un autre type sera dépourvu de toute instance à convertir. #Malin
Et c'est comme cela que l'on code en fonctionnel avec les Optionals ! Le véritable but étant de ne jamais s'en servir explicitement.
Remarque :
La programmation fonctionnelle est extrêmement difficile car elle oblige les développeurs à passer du stade "je dis à la machine comment faire" au stade "je décris à la machine quoi transformer et vers quoi d'autre".
Depuis ces 20 dernières années, j'ai toujours constaté que moins de 5% des développeurs étaient capables de penser dans ce paradigme et parmi ce petit pourcentage, à peine la moitié s'en servira dans sa vie professionnelle.
Ceci est sûrement le post le plus utile que j'ai fait de toute ma vie !
Mon retour d'expérience sur Podman : ça marche très bien sous Red Hat. Il faudra encore quelques temps pour que tout soit correctement backporté sous Debian & Co AMHA.
Le fait que ça soit moins compatible avec Windows => #MenFiche
Quand on est un minimum professionnel, on code pas et on ne gère pas une production avec du Windows dans un conteneur ou derrière un conteneur. Du reste, Linux est un OS beaucoup plus productif pour les Dev et DevOps (certains prétendent le contraire certes, mais je pense qu'ils n'ont pas suffisamment pexé sous Linux pour le réaliser. Aprèsje sais que je suis partiale sur la question).
Le problème ne vient pas de Matignon mais de la Commission Européenne qui, à l'attention tous les états membres, dans ses Grandes Orientations Politiques et Économiques déjà en 2017 (cf. le point (3) de l'article), décrétait que :
« d’importantes économies à court terme ne peuvent être réalisées sans une réduction significative de l’augmentation des dépenses de sécurité sociale ».
Relisez la phrase et appréciez la novlangue sur laquelle elle s'appuie ! Je propose une reformulation honnête qui exprime l'esprit profondément anti-sociale de notre chère EU siégeant dans de somptueux bureaux à Bruxelles : « d’importantes économies à court terme doit être réalisées au moyen d'un arrêt immédiat des dépenses de la sécurité sociale ».
J'adorerai que les tampons et serviettes soient incluses dans des aides sociales via remboursement sécu ou de préférence la CAF - oui la CAF pas la sécu, car être une femme n'est ni une maladie ni un risque de la vie - mais comment faire quand des instances supra-nationales comme la Commission Européenne pèsent de tout leur poids pour défoncer l'entre-aide nationale publique garantie par ce qui existait avant sous le nom "d'état" ?
Sources :
Bref, tout à fait d'accord avec l'idée mais la cause des causes n'est toujours pas identifiée. Donc je propose en complément de :
1) Lire les textes de lois de l'UE.
2) Les comprendre (bonne chance).
3) Enfin sortir de se traquenard qui nous paupérise à toute vitesse (ie. l'UE).
Et encore une fois, je ne dis pas cela pour moi puisque je fais partie depuis quelques années de ceux qui gagnent très bien leur vie dans ce système merdique et individualiste au possible.
Encore une très bonne nouvelle pour Kotlin ! Le fait d'avoir une fondation à part, disposant d'un modèle économique clair et qui assure au langage sa survit et mieux encore son évolution est ce qu'il fallait faire.
Le parfait contre-exemple que je pourrais donner est ce qu'a fait la fondation Apache avec Maven dans le sens où Apache étant "anti-argent", la fondation a toujours refusé que des contributeurs majeurs de Maven mettent en place un modèle économique de financement de leurs contributions. 15 ans plus tard, le projet n'a qu'une mise à jour tous les 18 mois... Heureusement, des forks sont apparus comme Maven Daemon mais cela fragmente le marché.
Bref, je suis très contente pour Kotlin.
Une des nombreuses raisons pour lesquelles je préfère éviter l'écosystème Spring Boot le plus possible. Tout étant basé sur le scanne du classpath, rien n'est vérifiable au build et tous les imports sont validés/calculés au runtime.
Bref, avant Spring et Spring Boot nous avions un environnement Java où tout était vérifié à la compilation, fortement typé statiquement et à présent nous avons une sorte de clone verbeux de JavaScript avec des temps de build (ce que JavaScript n'a pas puisque interprété) et des temps de démarrage hyper-longs (ce que JavaScript n'a pas puisque interprété).
Bref si c'était pour transformer Java en JavaScript merci mais non merci.
Sinon Kotlin + Jooby + Ktorm sur JVM ça remplace totalement Java + Spring Boot + Hibernate, c'est plus simple (pas de conflits internes de versions, pas de mécaniques implicites obscurs à connaître), ça prend littéralement 10 fois moins d'espace disque pour faire la même chose et c'est plus rapide (démarrages instantanés, tient plus de 100 fois mieux la charge d'après techempower).
Article très intéressant sur le vocabulaire que je vais essayé de résumer.
La Programmation Dynamique (DP)
La programmation dynamique consiste à réorganiser un arbre d'appels récursifs en graphe orienté convergent, où des embranchements impliquant la même exécution vont voir leurs résultats mémorisés afin de ne pas être recalculés.
Typiquement pour le calcul d'une suite de Fibonacci nous avons cet arbre avant :
Transformé en ce graphe après (ou le résultat de **fib(1) a été mémorisé) :
La memoization
La mémoïsation en français est une technique qui consiste à mettre en cache les valeurs déjà calculée.
L'exemple de l'article est le suivant :
fun square(x) {
return x * x
}
fun square_memoized(x) {
if (mem[x] is not set) {
mem[x] = x * x
}
return mem[x]
}
La tabulation
Cette technique ressemble un peu à la memoization mais consiste à remplir le cache systématiquement jusqu'au moment où l'on trouve la bonne valeur, alors que la memoization va se concentrer sur la valeur à retourner directement.
L'exemple donné est le suivant :
fun fib_tab(n) {
mem[0] = 0
mem[1] = 1
for i = 2...n
mem[i] = mem[i-2] + mem[i-1]
return mem[n]
}
Donc l'exécution réelle donne ceci :
mem[0] = 0
mem[1] = 1
mem[2] = mem[0] + mem[1]
mem[3] = mem[1] + mem[2]
mem[4] = mem[2] + mem[3]
On voit bien que le cache est surutilisé dans le cadre de la tabulation puisque chaque valeur suivante s'appuie sur la précédente forcément cachée. De facto, la tabulation consomme plus de mémoire mais garantie un accès instantané à la valeur dès la seconde utilisation, à l'image des caches gloutons finalement ("goutons" au sens algorithmes gloutons du terme).
Edit : en fait non, les indéps mandataires de leur SASU ne sont pas concernés puisqu'ils ne rentrent pas dans l'effectif salarial de leur propre société. Donc faire voter un accord de branche par les salariés dans une entreprise ayant 0 salarié, ça devient facile de faire passer l'accord.
Donc si je comprends bien mon cas, il faudrait que je fasse voter un accord de branche par moi-même et pour moi toute seule dans ma société en tant qu'indép car en tant que détentrice du mandat social de Président, je suis catégorisée i3.1 minimum, au vu de mes diplômes et des libertés que moi en tant qu'Actionnaire Unique, ait accordé à moi en tant que Présidente, dans ma propre entreprise, ceci impliquant une rémunération minimum de 2 x le PMSS (Plafond Mensuel de la Sécurité Sociale) soit 6 856,00 € bruts mensuels ! #CestBô #CrésusSur20
Sauf que... Pour des raisons fiscales et comme beaucoup de Président et Directeur Général de SAS/SASU, je me verse 3 428 € bruts chaque mois, puisqu'il s'agit du PMSS qui majore tranche A (ndr. c'est la première catégorie de salaire et la moins soumise à cotisations en proportion).
Pourquoi cette limitation me direz-vous ?
Déjà il faut que l'entreprise ait les sous tous les mois, mais en IT et surtout en Finance de Marché la raison est tout autre....
C'est assez simple, les détenteurs de mandats sociaux n'étant pas salariés de l'entreprise dans des SASU/SAS ils détiennent le statut de travailleurs dits assimilés-salariés.
La conséquence est que nous cotisations comme les salariés sauf que nous ne bénéficions pas du chômage et nous aurons une retraite moindre à cotisation égale, aussi tout le jeu consiste à se restreindre mensuellement à la tranche la moins taxée (la tranche A) et d'attendre la fin de l'exercice pour compléter le reste de l'année par des dividendes (qui n'offrent pas de retraite par répartition mais qui permettent de construire une retraite par capitalisation [#BeurkMaisPasLeChoix)](https://antichesse.cakeozolives.com/./add-tag/BeurkMaisPasLeChoix)_).
Bref, sans un accord de branche, l'entreprise est contrainte d'augmenter ses mandataires, même si les salaires de ces derniers sont en théorie fixés par AG. Je viens d'en discuter avec @Kysofer et lui et ses associés semblent concernés à cause de leur SAS, sauf que eux ils ont des salariés... Et là ça va devenir marrant de faire voter à leurs salariés un accord de branche au sein de leur PME, afin de leur permettre en tant que dirigeants de limiter leur propre salaire pour des raisons fiscales personnelles n'arrivant qu'en fin d'année ! Là je me suis carrément marrée c'était juste trop drôle !
Je trouve que le droit français est à la fois une immondice et quelque chose de magnifique ! Un peu comme le JS en fait.

Sinon je vous ai déjà dit que j'adorais internet pour ce genre de choses stupides ? Voilà, j'adore internet.
Traduction / Résumé :
La Commission Européenne est un organe Exécutif qui détient également un pouvoir Législatif (sic), constituée de personnes non-élues (sic 2) et qui fait pression sur un organe Judiciaire en faisant appel d'une décision de la CJUE (à la limite why not ?) pour obtenir le jugement qu'elle souhaite afin qu'Apple soit bien imposée à 0,005 % et non 1% (sic 3 voire carrément WTF ?).
Sinon, en tant qu'indép :
- Je rends 20 % de toutes mes factures, c'est la TVA, je n'ai pas le plaisir d'une exonération de TVA à la sauce Irlandaise.
- Puis je paie environ 48 % de cotisations sur mon salaire brut (précisément je touche une indemnité de travailleur mandataire puisque je suis Présidente de ma SASU) en sachant que ce statut ne me donne pas le droit au chômage !
- Je pais aussi 33,33 % d'impôts sur les sociétés (le fameux IS sur les bénéfices) en fin d'exercice.
- Puis je paie 30 % de cotisations sociales sur ce qui reste après l'IS si je me verse des dividendes (ce que je fais et en contre-partie de ces 30 % seulement, l'argent des dividendes ne rentre pas dans le calcul de ma retraite).
- Et je suis enfin imposée sur le revenu sur l'ensemble de tout ce que j'ai touché.
- Ah oui, j'oubliais les 1 à 2 % de taxes diverses et variées, indexées sur le montant total des salaires versés incluant des petites merveilles de déclarations comme les taxes d'apprentissages (FAFIE, FAFIEC) et les frais de fonctionnement de la structure (comptable, bilan, banque, assurance RCE, dépôts administratifs, etc).
Et là, notre chère Commission Européenne n'est pas contente pour Apple parce que la CJUE demande à ce qu'Apple paie 1 % d'impôts au lieu de 0,005 % !!!
Je propose de noter l'Union Européenne à #DémocratureSur20...
Et après certains se demandent encore pourquoi je défends ardemment l'idée de quitter ce piège des peuples qui est aussi une structure mafieuse servant ses intérêts propres au détriment de tous les autres.
Pour les salariés et les clients de la firme de Cuppertino qui adorent s'offrir des iBidule, sachez que votre retraite part là, les écoles publiques de vos gosses perdent leurs financement là, la sécurité sociale est détruite à cause de ça, les hôpitaux publics manquent de subventions à cause de ça, les infrastructures routières, ferroviaires et aéronautiques sont privatisées à cause de ça, les investissements dans la recherche sont annulés à cause de ça... Alors s'il vous plaît, avant d'acheter un truc avec un pomme croquée, juste "Think Different" please, car payer c'est voter. Et pour ce qui est de l'Union Européenne, peut-être qu'un jour nous serons suffisamment nombreux à vouloir en sortir.
La fonctionnalité retirée est celle-ci : "Ajouter en racourcis sur le bureau".
Ce qui me fascine ce sont ces commentaires :
[...] On commence à voir les effets de la réduction des effectifs chez Mozilla. Tout bénef pour la concurrence. La pente descendante de Firefox n'est pas finie.
xarkam
Ou celui-ci :
Argument simplifié de Firefox : "Comme nous n'avons pas les moyens de maintenir la fonctionnalité, alors elle est inutile". R.I.P. Firefox.
yahiko
Ou encore celui-ci :
c'est sur qu'une décision pareille va contribuer amplement à augmenter leur part de marché
Aspartame
Et mon préféré :
Décidément, à se demander s’ils ne font pas tout pour laisser la place à edge ?
jvalois
Pourquoi ces commentaires me fascinent-ils autant ? Simple, je me demande toujours combien d'argent ces personnes si critiques vis-à-vis de Mozilla ont-elles pu donner pour financer le bon développement de Firefox et éviter que ce genre de choses n'arrivent. Et vous à votre avis ?
Sinon pour faire un don à Mozilla et sauver Firefox, même de 1 €
===> C'est par ici.
Trop bien, c'est exactement ce que je cherchais !!! Et dire que c'était aussi facile... Damned (O__O)
@Oros merci
#MaVieDeDev Je pense que nombreux comprendrons :D (avec le son)
@Oros j'ai souvent vu que la ligne set -euo pipefail était recommandée en Bash et je voudrai te poser une question car je crois que le c'est le -e ou le pipefail qui ne marchent pas chez moi à cause de ma façon de coder en Bash.
En fait (et je sais que @Animal fait pareil) je créé des fichiers à sourcer et qui ne contiennent que des fonctions. Ces fichiers/bibliothèques peuvent aussi contenir des constantes via un export -r et surtout, chaque fonction est testée unitairement avec bbtools ou shellunit.
Comme Bash ne permet que de retourner des "exit codes" depuis une fonction, le hack consiste à leur faire imprimer le résultat souhaité via un echo unique et d'exécuter la fonction de la manière suivante pour récupérer la valeur de retour :
local resultat
resultat=$(ma_fonction "${param_eventuel}")
Donc mon script principale consiste à sourcer les libs dans le bon ordre puis à déclencher une fonction unique, en générale baptisée main() qui contient la procédure à suivre. Évidemment, cette fonction main() est purement déclarative et se limite à déléguer les traitements aux fonctions des API sourcées.
Est-ce que tu procèdes comme ça pour écrire un script où est-ce que tu écris les traitements en flat directement dedans ? (Je vais essayer de retrouver le cas ou le set -euo pipefail plante avec des fonctions)
Très simple :
- Vous installez GraalVM en tant que JAVA_HOME.
- Vous installez native-image dans GraalVM via la commande
gu install native-image. - Vous installer les GCC + build-essential :
sudo apt install gcc build-essential - Vous ajoutez le plugin Maven dans votre projet.
Enjoy :D
