Le post de @Tiger222 est intéressant en lui-même et donne le sentiment que Microsoft s'intéresse enfin (après 30 ans) à l'avis de ses utilisateurs, oui mais...
Quand nous allons sur le répo GitHub dont il est question, nous pouvons constater que tous les projets listés :
- Windows Terminal / Console / command-line
- Windows Subsystem for Linux (WSL)
- PowerShell
- PSReadLine
- OpenSSH for Windows
- .NET Core runtime & libraries
- ASP.NET Core
- Roslyn (C# & Visual BASIC Compiler Platform)
- Windows Presentation Foundation (WPF)
- WinForms
- WinUI
- Winget package manager app
- Winget package repo
- PowerToys
- Project Reunion
sont sous la licence MIT.
Mais quel pourrait être le problème avec cette licence se demandent sûrement certains ?
Tout simplement que la licence MIT est une licence libre mais du point de vue d'une entreprise commerciale à but lucratif seulement (pléonasme) et non du point de vue des citoyens que nous sommes. C'est-à-dire qu'elle permet à quiconque réutilisant du source sous licence MIT d'en faire soit un logiciel open-source, soit un logiciel close-source.
C'est un débat que j'ai longtemps eu que avec @Kysofer et @Tarq. À l'époque, mon point de vue était de dire : "oui mais avec une licence MIT ou Apache 2.0, je suis plus libre parce que je peux faire de l'open-source OU du close-source, alors que les GPL et AGPL permettent de ne faire QUE de l'open-source. En réalité la GPL et la AGPL sont moins ouvertes et confèrent moins de libertés aux développeurs que les licences MIT et Apache 2.0".
SPOILER : j'avais tort !
Les deux ont argumenté pendant des mois et ont fini par me convaincre avec les propos suivants :
-
Les licence MIT et Apache 2.0 permettent de faire sur close-source mais ceci est uniquement dans l'intérêt de sociétés commerciales, toi en tant qu'individu tu n'es pas une entreprise, ce n'est donc pas la liberté d'entreprendre et de faire de l'argent qui devrait primer de ton point de vue mais la liberté d'utiliser et d'être tranquille dans ta vie de tous les jours lorsque tu utilises un logiciel.
-
Le logiciel libre se finance de plusieurs manières :
- En lui donnant de l'argent.
- En contribuant à son développement (code, traduction, documentation, etc).
- En animant sa communauté.
- En assurant son support.
Par contre, utiliser les sources d'un logiciel libre pour en faire du close-source ce n'est pas contribué ni financer ce logiciel. À l'opposé, toute personne qui modifie un logiciel libre et qui se retrouve obligée de diffuser le code source modifié aura contribué à ce logiciel, cette personne n'aura pas payé avec de l'argent mais payé avec son temps et la redistribution de ses modifications.
Si une entreprise ne souhaite pas contribuer à un logiciel libre avec du temps et du code source, alors elle doit le payer avec de l'argent. À cet instant, c'est la stratégie de la double licence qui devrait être mise en place :
- Par défaut les sources sont sous GPL ou AGPL et celles-ci sont gratuites mais toute modification doit être redistribuée à la communauté.
- Si une entreprise commerciale souhaite faire du close-source, alors elle achète les sources sous une licence propriétaire et commerciale qui le lui permet avec un partie de l'argent qu'elle espère gagner du projet modifié, ça s'appelle invertir et c'est la raison même d'exister d'une entreprise.
Dans la démarche de Microsoft, je vois seulement une entreprise commerciale, richissime, littéralement ennemie du libre depuis sa création (cf. tous les posts de @Sebsauvage sur la question), qui obtient de la part de développeurs charitables du travail bénévole et des trésors d'innovations qu'elle pourra close-sourcer à volonté plus tard... Comment vous dire ? Merci mais non merci.
Nous ne sommes pas des personnes morales mais des personnes physiques, en tant qu'êtres humains nous n'avons pas les mêmes intérêts que des entreprises, en ce sens ne nous prenons pas pour des personnes morales en nous imaginant générer du profit à outrance à partir du travail gratuit et bénévole d'une communauté de passionnés.
Le meilleur c'est que je défends à présent cette idée en étant actuellement à mon compte et donc en disposant déjà d'une structure juridique me permettant de commercialiser ce que je voudrais. Or ceux qui ont le fantasme de développer un produit miracle à close-sourcer en spoliant les trésors d'ingéniosité des logiciels libres, sont pour certains d'entre-eux des salariés enchaînés à une clause d'exclusivité totale intégrée à leur contrat de travail, rendant caduque l'idée même de développer un produit avant même qu'un début de réalisation ne soit amorcé.
Bref, si j'étais une développeuse qui souhaite contribuer par des tickets à amélioration d'un logiciel, j'irai voir du côté de Linux Mint ou des GNU tools ou encore de Mozilla, MyPaint, WineHQ, GTK, OpenJDK, PHP, bref tout mais pas quelque chose sous licence Apache 2.0 ou MIT.
Cette personne sait-elle qu'à cause de l'Article 63 du TFUE qui permet la liberté de circulation totale et sans contrôle de tous les capitaux et de toutes les marchandises, cf. ce post, le Luxembourg est un paradis fiscal qui peut continuer d'être un paradis fiscal ?
Je comprends l'idée que les propriétaires des grands médias ne vont pas tirer sur la poule aux œufs d'or et du coup la nécessité de signaler au grand public la propagande qui règne dans notre beau pays mais ça ne se limite pas à ça.
Toutefois une question me taraude... Que dire de paradis fiscaux comme Monaco ou la Cosuzeraineté d'Andorre qui sont à l'intérieur même de notre territoire ? Parce que nous n'en parlons pas plus et cette fois-ci il ne s'agit pas d'un problème que l'Union Européenne fabrique, entretien et protège...
Je vous recommande en complément cette vidéo du vidéaste-youtubeur Trouble Fait qui décrit très bien le fond du problème avec les paradis fiscaux.
Merci à @Lenny pour le lien.
OpenNews est maintenant le café de la gare ? Quel pavé de platitude et de branlette intellectuelle.
Définition du mot platitude tirée du Larousse
Caractère de ce qui est plat, banal, médiocre : La platitude du style. Parole banale : Dire des platitudes.
Acte empreint de bassesse, de servilité, d'obséquiosité : Faire des platitudes pour parvenir à une fonction.
Je pense que le commentaire utilise le sens premier du mot, en ce sens j'aimerais demander à son auteur quel commentaire il serait en mesure de produire et qui, selon son propre jugement, ne serait pas un amoncellement de paroles plates, banales ou médiocres ?
Pour la petite histoire, je me souviens de filles qui étaient toujours promptes à juger de haut et dénigrer les dires, les goûts ou les idées des autres sans jamais argumenter et toujours avec un ton péremptoire ; mais elles avaient une excuse pour cela : elles étaient au collège.
Sinon j'étais certaine que Twitter ne s'écrivait pas ecirtam.net... Il faut vraiment que j'améliore mon français. (> <)
le néerlandais-qui-plane
Désolé @Timo mais j'ai rigolé.
Sinon d'accord avec le propos du poste, les grands propriétaires lucratifs ne sont pas inquiétés par la novlangue "du progrès".
En général, les gens qui se revendiquent antifascistes me font un peu peur, tout comme les skin-heads et ceux qui se revendiquent de l'extrême-droite (genre les mecs qui se pensent de la race supérieure et tutti quanti si vous voulez). En y réfléchissant un peu, j'ai réalisé deux choses :
1) Qu'ils m'effrayaient parce que je les assimilais aux Black Blocs.
2) Qu'à chaque fois que le terme était utilisé, c'était souvent pour du reductio ad hitlerium.
Mais peu importe, à force de lire @Neko, je me suis dit que j'allais chercher une vraie définition de ce qu'était l'antifascisme et donc je suis allée sur Wikipédia :
L'antifascisme est l'opposition organisée au fascisme et, plus largement, à l'extrême droite1.
Il prend forme dans les années 1920 et se développe conséquemment à la montée du fascisme en Europe. Il a connu un très fort développement au cours des années 1930, étant à l'origine de la formation des Fronts populaires Ce lien renvoie vers une page d'homonymie, puis pendant la Seconde Guerre mondiale au sein des résistances contre les dictatures fascistes et nazies ainsi que contre les régimes de collaboration.
En dehors de la lutte contre les régimes se réclamant du fascisme proprement dit, l'antifascisme ou le terme d'antifascisme a très tôt été utilisé par des partis communistes pour combattre leurs adversaires politiques, proches ou lointains sur le plan idéologique, voire tout opposant critique. Cette instrumentalisation de la lutte dite « antifasciste » a été analysée et critiquée par de nombreux intellectuels et historiens2.
L'antifascisme peut également désigner dans une acception plus large une idéologie tendant à s'opposer aux mouvements populistes.
Cette définition me semble claire, elle aborde même l'origine du mouvement et je n'ai rien à y redire, je m'en sens carrément proche d'ailleur, sauf peut-être le dernier paragraphe car je ne sais pas ce qu'est "un mouvement populiste". Si cela signifie "mouvement institué par le peuple" alors aucun problème pour moi (rappel : le peuple est ce sur quoi le pouvoir s'exerce). Si cela signifie "mouvement institué en manipulant le peuple", alors oui j'ai un problème avec le populisme.
Et puis il y a ce passage qui traduit également ma perception de l’antifascisme, mais cette fois-ci dans ce que nous constatons au 21-ième siècle (les passages graissés sont de moi) :
Pour Pierre-André Taguieff, l'antifascisme, « pur produit de la propagande soviétique [...] est devenu, à partir des années 50, une machine de guerre idéologique qui a prospéré dans les démocraties occidentales. Il s’est ainsi diffusé, après la Seconde Guerre mondiale, dans les représentations politiques d’une grande partie de la gauche française. » Selon lui, le plus grand « tour de passe-passe » de la gauche, « est d’avoir réussi à faire persister le discours antifasciste dans l’espace public malgré l’absence de fascisme réel. L’antifascisme s’est révélé être un formidable levier d’illégitimation des opinions divergentes. » Selon le politologue, l'antifascisme opère « comme un argument d’autorité suprême qui vise plus à la disqualification qu’à l’établissement d’un débat démocratique. » Son corollaire, le terme fascisme a été ainsi galvaudé, devenant une étiquette pratique afin de discréditer et disqualifier un adversaire.
Comme je ne savais pas qui était Pierre-André Taguieff, je suis partie rechercher sa bio consultable ici en me disant qu'il s'agissait peut-être d'un militant lui-même d'extrême droite... Et apparemment non, tout au contraire même, puisque l'extrême droite lui a décerné son prix parodique dit "Lyssenko", je cite :
« Pour son analyse approfondie du racisme sous toutes ses formes », il reçoit en 2014 le prix Lyssenko, prix parodique décerné chaque année par le Carrefour de l'horloge, association d'extrême droite, « à un auteur ou une personnalité qui, par ses écrits ou par ses actes », a apporté, « une contribution exemplaire à la désinformation en matière scientifique ou historique, avec des méthodes et arguments idéologiques. »
Donc même à gauche, parmi les personnes instruites à la lecture des discours et méthodes politiques, il en existe qui perçoivent "une partie de ceux qui se revendiquent antifascistes" comme des personnes se servant de l'accusation de "fasciste" sans fondement et uniquement pour dévaloriser et décrédibiliser un adversaire sans preuve ni effort.
En ce sens, à quoi peut-il bien servir de se revendiquer antifasciste ou de revendiquer que l'on tient des propos antifasciste ou de s'assimiler à de l'antifasciste ? Je n'ai pas besoin de me sentir être "une meilleure personne" ou d'avoir bonne conscience, et j'ai l'impression qu'accuser de quelqu'un de fasciste fait rayonner l'accusateur non pas parce qu'il devient meilleur mais par contraste en ternissant l'accusé ; et ce genre de méthodes je ne les aime pas trop en fait...
Sauf que...
C'est ce que je fais déjà avec les SJW ! #FacePalm Accuser quelqu'un d'être un SJW ou un Baizuo, cela revient exactement au même !
Du coup, de chaque côté il y a un noyau dur qui s'est concentré ou les appellations fascsistes / fafs et SJW / Baizuo doivent être en partie vraies mais fondamentalement, ce sont deux façons de décrisibiliser le message en attaquant la personne, soit en la diabolisant dans le premier cas, soit en la ridiculisant dans le second.
Je pense que Crédic Champeau et les personnes argumentant en faveur du DSL Gradle dans les commentaires "just miss the point".
1) Le DSL ne permet pas d'hériter ou d'inclure un processus de build unique, public, documenté et standard, ce qui est indispensable en industrie. Certains répondraient qu'il est possible de le coder directement dans un plugin ce à quoi je réponds :
- Écrire du code qui va compiler du code, the what ?
- Mais admettons, je code le-dit plugin, si alors j'ai besoin de me sortir partiellement du processus standard que dois-je faire ? Forker le plugin ? Donc je rajoute du code à du code qui va compiler le code ? Encore une fois the what ?
2) Même en écrivant en DSL Gradle de manière déclarative, l'ordre des déclarations est important, ce qui de facto rend le code impératif puisqu'il nécessite de penser en termes d'ordonnancement de l'instantiation des élements qui constituent le DSL, ce qui n'est pas déclaratif.
3) Les DSL ne m'intéressent pas. Ta techno => tes problèmes. Je dois déjà faire du Kotlin, du Java, du TypeScript, du Spring, du Spring Boot, du Spring Cloud, du JPA, du Lombok, du Mapstruct, du Jackson, du Zuul, de l'Open API, de l'Ansible, du Docker, du Kubernetes, du SCSS et CSS, du Bootstrap, de l'Angular, du Karma, du JUnit Jupiter, du Mockito, du WireMock, du Rest Assured, du Protractor, du npm, du Maven, de l'Angular-cli, du SSL, du Linux (ssh + systemctl + GNU tools), du bash et du dash, du GraalVM, du Jasmine, de l'AOP (AspectJ), du Spring Data (JPQL), du Liquibase, du SQL, du PL/SQL, du REST, du SOAP, de l'Apache CXF, du HazelCast, du SonarQube, de l'OAuth2, et du clean code + clean architecture + Domain Driven Design + architecture hexagonale + Design Patterns et tout ça c'est uniquement sur un seul projet (il y en a une trentaine) et là on me dit qu'il faut que j'apprenne deux langages de plus (Groovy + DSL Gradle) juste pour compiler du code ? Comment leur dire à ces messieurs ? Nous ne vivons pas dans le même monde.
Bref, Maven Daemon pour speed up les builds + les pom de Maven écrits en Yaml et c'est bon.
Est-ce que vous savez comment je perçois l'économie et les classes sociales de ce pays ?
La classe bourgeoise garde tout l'argent pour elle.
La classe moyenne paie toutes les taxes et fait tout le travail.
Et les pauvres sont juste là pour foutre les boules à ceux de la classe moyenne afin de les forcer à retourner bosser.
George Carlin
Du pur génie !
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
Personne
possède uneDate de Naissance
, cette date contient elle-même uneAnnée de Naissance
qui 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).