Bon bah tout est dans le titre... Dans ce post j'affirmais que :
Vous pouvez ne faire confiance à personne en ce qui concerne votre vie privée. Les meilleures boites se font hacker tous les jours et celles dont on ne parle pas ou peu sont juste celles qui sont meilleures pour étouffer les affaires !
Est-ce que vous pensez qu'il existe des sociétés ayant plus de moyens que Facebook, pouvant se payer de meilleurs ingénieurs que Facebook et détenant autant de données sensibles et intimes que Facebook ? (Pour info, le développeur-architecte sénior est à 950 K$ / an en 2019 chez Facebook hein).
Ca restreint pas mal le champs des possibles n'est-ce pas ? Et pourtant Facebook s'est encore une fois transformée en passoire... Dégagez votre appli Facebook, cette immondice est littéralement un spyware ; et pour votre santé mentale je vous recommanderais de dégager aussi Facebook de votre vie !
C'est à crever de rire je trouve ! Vous comprenez l'idée ?
Les grandes entreprises captent tellement de richesses et les redistribuent à si peu de monde que l'être humain "normal" n'a plus les moyens d'acheter. Aussi les seuls qui puissent encore dépenser quelque chose et assurer un vecteur de croissance à Microsoft sont les entreprises capables de s'offrir un panneau publicitaire. Et ici le panneau s'appelle Windows 10 et touche 4,5 milliards de prospects... #Rentable
Il y a quelques temps j'avais lu sur Twitter que "Bientôt... il faudra écouter une publicité avant de pouvoir téléphoner ou envoyer un texto..." La publicité permanente est un premier pas !
Suis-je la seule à ne pas vouloir de ce monde qui pousse perpétuellement à la sur-consommation, qui nous prends pour des acheteurs et non des êtres intelligents, sensibles et désintéressés ? Si vous aussi vous êtes contre un tel monde, alors commencer à dire non à Window 10 c'est agir contre le système tout-marchand. @Kysofer le dit tout le temps : Payer c'est voter !
Edit : Philou m'a indiqué que ça existait déjà.
Je suis morte de rire !
En gros, comme il est impossible de censurer le livre d'Edward Snowden, livre dans lequel il dévoile la surveillance de masse illégale à laquelle la CIA et l'armée américaine ont participée, ces deux entités criminelles ont trouvé une astuce : comme il s'agit de parler de choses classées "secret défense", le livre aurait dû être soumis à l'approbation de la CIA et de l'armée avant sa publication (publication depuis la Russie hein). Moralité, toutes les royalties du livre reviennent... roulement de tambours... à la CIA et à l'armée américaine !!! (> <) #Mafia
Je cite :
Le ministère de la Justice américain pourrait ne jamais être en mesure de poursuivre Edward Snowden pour avoir obtenu et diffusé des informations hautement classifiées provenant du réseau de la National Security Agency. Mais les avocats du ministère de la Justice ont décidé de s'en prendre à une source potentielle de revenus (pour Snowden mais également pour Macmillan Publishers) : ils ont engagé une action au civil contre lui pour la publication de son livre, Permanent Record.
[...]
Le mémoire de Snowden n’aurait pas été soumis à la CIA ou à la NSA pour un examen préalable à la publication, une pratique obligatoire parmi les anciens employés des agences de renseignement. En tant que tel, le ministère considère le livre comme une violation des obligations contractuelles et fiduciaires de Snowden et désigne les éditeurs comme codéfendeurs dans la poursuite.
Remarque :
- Le concept de cache ici pose problème puisque des méthodes qui transforment (à base de verbes) retournent en réalité quelque chose.
- Les méthodes avec des boolean ont des verbes, c'est une exception à la Yegorification du code.
// Usage :
object Main {
fun regularUseCase() {
// Given
val christmas = LocalDate(2019, 12, 25)
val calendar:HolidaysCalendar = HolidaysCalendarForYear(Year(2019))
// When
val daysOff:DateSet = calendar.daysOff()
// Then
println(daysOffs.contains(christmas)) // print true
}
fun cachedUseCase() {
// Given
val christmas = LocalDate(2019, 12, 25)
val cache:Cache = HolidaysCalendarCache()
// When
val daysOff2:HolidaysCalendar = cache.value(Year(2019))
val daysOff3:HolidaysCalendar = cache.value(Year(2019))
// Then
println(daysOff2.contains(christmas)) // print true
println(daysOff2 === daysOff3) // print true (same instance)
}
@JvmStatic
fun main() {
val main = Main()
main.regularUseCase()
main.cachedUseCase()
}
}
// Interfaces
interface DateSet {
/**
* Determine whether or not the specified date is in this set.
*
* @param date
* The date to research.
*
* @return true if the date exists in this set, false otherwise.
*/
fun contains(date:LocalDate):Boolean
/**
* Determine whether or not the specified date is in this set.
*
* @param date
* The date to research.
*
* @return true if the date exists in this set, false otherwise.
*/
fun contains(date:Calendar):Boolean
/**
* Return the current set of date as an iterable collection.
*
* @return A collection having all the date stored in this set.
*/
fun asCollection():Collection<LocalDate>
}
interface HolidaysCalendar {
/**
* Return a set of holiday dates.
*
* @return All holidays for a period (see implementation for more detail).
*/
fun daysOff():DateSet
/**
* The period covered by this calendar.
*
* @return Something in the CalenadrPeriod enumeration.
*/
fun range():CalenadrPeriod
}
class Cache<K, V> {
/**
* Determine whether or not the specified value exists in this cache.
*
* @param value
* The value to search.
*
* @return true if the value has been found, false otherwise.
*/
fun contains(value:V):Boolean
/**
* Determine whether or not a key exists in this cache.
*
* @param key
* The key to search.
*
* @return true if the key exists, false otherwise (reminder: a key cannot exists if linked to nothing).
*/
fun containsKey(key:K):Boolean
/**
* Retrieve the value related to the specified key.
*
* @param key
* The key related to the researched value.
*
* @return The value related to the given key.
*
* @throw UnexistingEntryException
* When the subsystem cached by this object is not able to restitute a value using the specified key.
*/
fun value(key:K):V
/**
* The list of keys used by this cache.
*
* @return The list of keys used by this cache.
*/
fun keys():List<K>
/**
* Remove the specified key in order to force an update.
*
* @param key
* The key of the cache entry to remove.
*/
fun remove(key:K)
/**
* Clear all entry is the current cache.
*/
fun reset()
}
// Implementation of HolidaysCalendar
class HolidaysCalendarForYear(private val year:Year):HolidaysCalendar
class HolidaysCalendarForMonth(private val year:Year, private val month:Month):HolidaysCalendar
// Implementation of Cache
class HolidaysCalendarCache:Cache<Year, HolidaysCalendar>Je cite :
Le report de l'age pivot à 64 ans était un leurre, comme l'avaient deviné certains, Macron va faire style de "lacher" là dessus pour mieux passer la seule chose qui l'importe : la retraite par point. [1]
La suite :
--> la CFDT va se retirer de la grève
--> bouuu les vilains grévistes qui continuent sont des extrémistes, cgtistes cheminots blabla, privilégiées blabla. prise d'otage ... et ça alors que le gouvernement a accepté de négocier[1] selon les réactions il va plus ou moins lâcher vite ou partiellement question de gérer le robinet du mouvement social selon le calendrier qui l'arrange
Voilà
Youhou, nouvelle version majeure de Linux Mint !
Et celle-ci est une LTS (Long Terms Support), ce qui signifie que c'est l'OS parfait pour migrer les PC d'une société. Je sais que @Kysofer a cela en tête depuis quelques mois donc je sens qu'il va me demander un coup de main entre Noël et nouvel an...
@Animal du coup si toi aussi tu as des dispos hein :)
Les liens vers les différents bureaux :
J'abonde dans le sens de l'article. Le design pattern Builder est totalement obsolète en Kotlin puisque ce langage intègre les "defaulted method parameters" ce qui fait que si un paramètre venait à manquer, alors il prendrait automatiquement la valeur par défaut, par exemple :
class SocketJavaX(
private val port:Int = 0,
private val host:String? = null,
private val ssl:Boolean = false
)
Quand je vous disais que Kotlin a une multitude de petites choses qui rendent le dev facile et magique.
Bon je ne suis pas fan des architectures en couche mais pour des projets sur Spring Boot ou Sparkjava qui désirent ouvrir ou fermer des routes sans effort, c'est plutôt bien fait !
Mercià @Philou pour le lien
Un PDF visant à débunker les arguments en faveur de la réforme des retraites. Alors oui le PDF fait 20 pages, mais que l'on ne vienne pas me dire "arf... strolongàlire" ou encore des #GéPaLeTem ... Parce que la médiocrité du quidam qui préfère tenir ses positions sur des croyances et ne jamais se renseigner... Bah ce n'est plus mon problème et j'en ai ma claque !
Pour rappelle, je ne suis pas concernée par la réforme des retraites, donc battez-vous pour vous-même et arrêtez de croire en des fadaises !
Le backup du Warrior du Dimanche est disponible ici
Merci à @CCous pour l'info (et que j'oublie tout le temps).
La commande à taper c'est :
docker run --entrypoint "id" <mon-image-docker>Je suis d'accord avec tout ce qu'écrit Timo :
Je n'ai pas Netflix, mais c'est pas avec ça que je vais commencer.
Mon écran est 4K en 60 Hz, mais il passe par le port Thunderbold. Mon ordi tourne sous Linux et j'utilise Firefox.
N'importe quel site peut faire tourner une vidéo 4K dans mon navigateur, n'importe quelle vidéo 4K tourne sous VLC.Pourtant Netflix ne marchera pas : selon eux, je dois être sous Windows 10 dernière version, passer en HDMI 2.0, installer de codec et des DRM, utiliser soit l'application Netflix soit Edge et avoir un écran qu'ils ont décrété qui allait bien.
Ce n'est pas ma config qui est incompatible avec la 4K.
C'est Netflix qui est incompatible avec 90% des appareils, systèmes, navigateurs, écrans.Les seules vraies limite technique dans l'histoire, ce sont le débit internet (et encore : s'ils utilisent de l'offline, ça n'en serait pas) et la possession d'un écran 4K (et encore, rien n'empêche d'afficher une vidéo 4K sur un écran full-HD, c'est juste complètement idiot car on n'en profite pas tout en saturant sa bande passante et son CPU/GPU).
Bref, on dirait qu'ils n'apprendront jamais. C'est exactement pour ces raisons que le téléchargement illégal n'est pas disparu.
Ma phrase préférée étant :
Ce n'est pas ma config qui est incompatible avec la 4K.
C'est Netflix qui est incompatible avec 90% des appareils, systèmes, navigateurs, écrans.
Merci Timo !
Oh je suis surprise... Spring Boot serait aux micro-services ce qu'une Baleine serait aux petits poissons... LOL

Pour info, nous avons viré intégralement toute la stack Spring Boot depuis trois ans :
- Spring Boot => Sparkjava
- Spring DI => Feather-java
- Hibernate => ActiveJDBC
- Jackson => Jsoniter => Jackson de nouveau (à cause d'ActiveJDBC notamment et de ses récentes améliorations de performances)
- JWT => Petite API perso + Bouncy Castle
- Etc.
Résultats :
- Une application qui passe de 45 Mo de JAR à 6,5 Mo sur le disque.
- Un démarrage instantané.
- Une consommation mémoire divisée par 5 !
Mais bon, Spring est à la mode comme l'ancien JEE et comme son ancêtre il finira par s'effondrer sur lui-même à cause de son propre poids.
Via Riduidel.
Je cite :
il n’ y a pas eu de phase de tests de régression dédiée et que les tests non fonctionnels ont été conduits sur une période de temps inadéquate parce que très courte.
Et puis je rigole. Comme d'hab quoi, les tests c'est pour les looser, nous on en finance, on est des winner et là... On a tout gagné... Double-lol !
Un énorme mémo pour faire un tas de trucs en bash avec des oneliners. Pour toi @Animal.
Merci à @MamiSama pour le lien
Quand OVH fabrique son propre serveur d'intégration continue pour ses propres besoins. Évidemment, c'est un logiciel libre ! Je sens que ça va plaire à @Philou !

EXCELLENT ! J'étais pliée de rire ! L'idée est d'interviewer dans un futur fictive les retraités qui doivent se remettre au travail grâce aux réformes des retraites...
Un extrait :
N’est-ce pas tout de même un peu une retraite au rabais, si on ne peut en profiter que le weekend ? « Bien sûr, on aimerait pouvoir vivre comme ça toute la semaine, avoue Olivier, c’est toujours un pincement au cœur quand j’abandonne mes mots-croisés pour retourner travailler le lundi, mais on prend ça avec philosophie, on se dit qu’on a déjà la chance de vivre notre rêve deux jours par semaine. »
Je me répète mais l'article est excellent vraiment.
Merci à Riduidel pour le lien.
Yesss ! Drone-CI permet enfin d'avoir des runners hors Docker !
Parce que produire le serveur d'intégration continue le plus léger du monde mais permettre de lui de ne s'exécuter que dans un conteneur, comment vous dire... C'était... Débile... Voilà. #DoYouKnowWhatAnOverheadIs
Edit : oui je sais très bien qu'un process de build dans un conteneur évite de laisser des miettes à gauche à droite et empêche un faquin de faire des bidouilles sur un serveur avec les droits d'exécution du CI (mais déjà ça se corrige avec un sh -c <user> côté Linux). Après ça reste du Docker hein... La techno pas safe by design donc vous m'envoyez navrée mais quand on sait que les permissions Unix et la gestion des utilisateurs sont plus fiables qu'un run conteneurisé en 2019, bah moi pas peur et moi préfère ma machine de build sans overhead (d'autant plus qu'il s'agit d'un RaspberryPI donc je n'ai pas les ressources de dispo).
J'ai évoqué la stratégie de la Contre-Attaque de Robin des Bois et bien certains l'appliquent à Lyon ! 🤩
Je le répète, il ne faut plus manifester pour bloquer le pays, non a contrario il faut s'appliquer à une guérilla économique où le peuple s'enrichirait toujours et les puissants jamais.
Très bonne initiative de nos amis Lyonnais que de basculer gratuitement au tarif heures creuses ceux qui ne paient pas cet abonnement !
Et merci à Chlouchloutte pour le lien.
Il n'y a pas à dire, David Graeber est un formidable historien et un incroyable économiste.
Comment récupérer une conf Gradle distante pour l'inclure dans son build Gradle (et donc reproduire le mécanisme d'héritage des plugins de Maven avec Gradle) :
apply from: 'http://server-url/nexus/service/local/artifact/maven/redirect?r=repository-name&g=group-name&a=build-common&e=gradle&v=LATEST'