PROJET AUTOBLOG


le hollandais volant links

Site original : le hollandais volant links

⇐ retour index

Formulaire d’admission pour l’enfer | ploum.net

jeudi 21 février 2019 à 15:10
Les systèmes administratifs ont tendance à être peuplés de troglodytes mous du bulbe. La corrélation est observable par tout un chacun, mais je n’ai pas encore réussi à démontrer la causation. Sont-ils recrutés comme étant particulièrement lents et incapables de toute autonomie de pensée ? Sont-ils formés pour le devenir ? Ou bien est-ce une forme de sélection naturelle : toute personne capable d’un minimum de sens analytique, de logique et d’initiative finit par rendre sa démission en hurlant et en s’arrachant les vêtements, généralement au bout de sept à huit jours.

Une autre théorie que j’entretenais jusque là était celle de la création d’emplois. À partir du moment où le but premier d’une société était de créer des emplois, il fallait créer des structures capables d’employer tous les types de profils. Et pour chaque type d’individus, il fallait un emploi qui ne soit pas seulement à sa portée, mais également où il soit le meilleur. Où il excelle et écrase la concurrence. Mécaniquement, les administrations se sont donc épanouies pour employer les gens pointilleux, mesquins, sans imagination et, n’ayons pas peur de le dire, foncièrement bêtes et méchants.

La force de l’administration ce n’est pas qu’elle propose des emplois qui ne nécessitent pas d’être intelligent, il en existe bien d’autres. Non, sa première qualité est qu’elle propose des emplois où faire preuve d’intelligence est un défaut grave. La bêtise et la stupidité deviennent des compétences encouragées et transmises grâce aux prestigieuses « Écoles d’administration ». Au même titre qu’un cul de jatte est incapable de devenir éboueur, un humain intelligent, raisonnable et capable de prendre du recul ne peut en aucun cas prétendre à travailler pour l’administration.

La généralité n’est malheureusement pas tout à fait vraie. L’administration pouvant, parfois, offrir de confortables salaires ou certains avantages afférents, une nouvelle race d’humains s’est créée : des gens capables d’éteindre leur intelligence au moment où leur badge touche la pointeuse. Le soir et le week-end, ils discourent avec élégance, ils lisent, partagent, offrent une vision personnelle fouillée. Mais, une fois la cravate nouée autour du cou afin de couper toute irrigation du cerveau, ils se transforment en œsophage sur patte, engloutissant des litres de mauvais café tout en répétant, le regard vide, d’abscons aphorismes numérotés.

Le but premier d’un employé administratif, c’est d’être là pour toucher un salaire sur ses heures de présence. Durant ces heures, il doit faire le moins possible. Pour justifier qu’il reste encore beaucoup de travail à faire. Moins il fait, plus est grande la probabilité qu’on engage un nouvel agent administratif pour lui tenir compagnie, augmentant de ce fait son importance et son prestige. Car si le travail n’avance pas, c’est bien que le premier employé n’est pas suffisant tout seul. À deux, nos compères pourront passer à la vitesse supérieure et générer du travail à faire. Si la masse de travail ne diminuait pas avec le premier, elle ne fait qu’augmenter avec le second. La boucle est lancée et tout cela est un merveilleux mécanisme pour générer de l’emploi qui est, on l’a dit, le but premier de notre société. Le corolaire est que tout employé qui fera du zèle en faisant diminuer la charge de travail se verra immédiatement tancer, blâmer voire pousser à la démission.

Oh merde.
Il a tout dit.


— (permalink)

The blackest black paint in the world! Black 3.0 by Stuart Semple — Kickstarter

jeudi 21 février 2019 à 14:46

Une peinture plus noire que noire.

Ça se rapproche du Vantablack® (dont je parle là), mais au moins ici y a pas un artiste à la con qui a payé la boîte pour en avoir l’exclusivité.

Ça semble assez impressionnant, je me tâte à en acheter un tube, mais c’est cher :/


— (permalink)

Chers recruteurs | Coderstand

jeudi 21 février 2019 à 14:40

Mer-ci !


— (permalink)

[JS] - Note

jeudi 21 février 2019 à 01:38

Je me note :

En JS, avec element.querySelector(), pour cibler un descendant direct de element, ceci ne marche pas :

element.querySelector('> .class');

Si element possède un id lui-même on peut faire ça :

element.querySelector('#id > .class');

Mais il y a une méthode dédiée :

element.querySelector(':scope > .class');

:scope est censée représenter l’élément sur lequel on utiliser querySelector(). C’est une notation CSS similaire similaire à « :root », et d’ailleurs, à ce jour, il est égal à :root (il n’a pas encore d’autres usages).

C’est censé marcher (même si je n’ai pas réussis sous Firefox).

Sinon, on peut toujours utiliser

element.firstElementChild

(attention, si querySelector() renvoie une nodeList, firstElementChild() renvoie une HTMLCollection.)


— (permalink)

A growing share of Google’s display ads on the web are now built with AMPHTML ads

mercredi 20 février 2019 à 18:57

Oh, ça alors : Google profite d’AMP pour mettre en place de la pub ?!


— (permalink)

How to REALLY make Windows 10 Super Light for Gaming - YouTube

mercredi 20 février 2019 à 18:13

Ah, voilà qui peut m’être utile !

Debloat Windows 10 > https://github.com/W4RH4WK/Debloat-Windows-10
Remove bloat script > https://gist.githubusercontent.com/matthewjberger/2f4295887d6cb5738fa34e597f457b7f/raw/b23fa065febed8a2d7c2f030fba6da381f640997/Remove-Windows10-Bloat.bat

Dans la vidéo, il gagne ~500 Mo de mémoire vive, ce qui sur un PC de jeu n’est pas anodin.

L’ensemble peut aussi être appliqué sur les PC pas trop puissants ou anciens.

Par contre, dans tous les cas, ne faites pas tout ça à la légère.


— (permalink)

Note : lenteur JS

mercredi 20 février 2019 à 16:32

Rhaaa…

(oui, encore sur le JS)

Les fonctions sur les dates en JS sont pratique. Je parle celles des formats et l’internationnalisation, celle qui quand on lui dit "Fr" nous sort « mercredi 20 février » et quand on lui dit “de” nous sort « Mittwoch, 20. Februar ».

Voyez là :
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Date/toLocaleDateString
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/DateTimeFormat

Mais bordel, qu’est-ce que c’est LENT !!

J’utilise ça pour afficher la date dans mon lecteur RSS.
Bah ça me prenait 700 ms pour afficher ~650 posts.

Vous ne voyez pas le problème : 1 ms par post, c’est pas énorme à première vue. Mais moi si : en mettant la fonction qui définit le format en dehors de la boucle, je ne mets plus que 50 ms pour afficher 650 posts.

Aaah, voilà qui est mieux =).

Donc faut faire comme ça :


var DateTimeFormat = new Intl.DateTimeFormat('fr', {year: "numeric", weekday: "short", month: "short", day: "numeric", hour: "numeric", minute: "numeric"});

feedList.forEach(function(item) {
    …
    …
    li.querySelector('.post-head > .date').textContent = DateTimeFormat.format(item.datetime);
    …
}

Ça semble logique, mais c’est tellement con et je m’en tape la tête contre les murs >_<.

C’est comme vider un nœud de ses éléments :

element.innerHTML = "" // trèèès lent.
// très rapide !
while (elementfirstChild) {
    elementremoveChild(element.firstChild);
}

=_=


— (permalink)

Olivier SITRUK sur Twitter : "Hier a une manif contre l’antisémitisme dans le Var, à droite mon père ( président de la communauté juive de Draguignan) , à gauche le mufti du var, ils ont échangé leurs signes extérieurs de croyants et ça les fait se marrer. C’est ça la France.… https://t.co/2QGPysqAYT"

mercredi 20 février 2019 à 15:55

:-)


— (permalink)

Grumpy Website

mercredi 20 février 2019 à 13:55

Je ne sais pas si vous connaissais ce site, mais il râle tous les jours contre les « petits trucs pourris » dans le design sur le web (mais parfois aussi ailleurs).

Il râle sur des détails, mais il faut dire qu’il a très souvent raison.


— (permalink)

Découvrez le World Wide Web comme en 1990 – Korben

mercredi 20 février 2019 à 13:49

Le nav (en ligne) : https://worldwideweb.cern.ch/

Tiens, à l’époque ils n’avaient PAS DE PUB… ni de popup… ni de trackers sur les sites.


— (permalink)

路地裏のにゃん吉 (@nyankichi5656) • Instagram photos and videos

mardi 19 février 2019 à 16:49

Un photographe japonais de chats. Des chats partout \o/

Mention pour celle là : https://www.instagram.com/p/BUhMS6UDuEz/ :D


— (permalink)

Note : rapidité d’affichage d’un lecteur RSS

mardi 19 février 2019 à 15:48

Je maintiens toujours mon propre lecteur RSS. C’est cool et ça me permet de faire face à des problèmes parfois incongrus pour des petits projets.

Déjà, faut savoir que ma connexion est pourrie (<2 Mo/s) et que je ne souhaite pas encombrer mon serveur de requêtes trop lourdes. Pour le moment, mon lecteur RSS tourne donc en local.
Si je met ça en ligne, ça me prendrait beaucoup de temps pour ne serait-ce qu’ouvrir le lecteur RSS.

Certains lecteurs RSS font une requête à chaque ouverture d’un post ou d’un site. C’est impensable pour moi : je ne veux pas attendre 3 secondes à chaque clics.

Depuis le début, l’ensemble des flux RSS "non lus" sont envoyés au navigateur. Généralement, ça fait entre 2 et 3 Mo, mais comme c’est en local, c’est instantané.

Je cherche à améliorer ça.

Je suis aussi sur le point de transformer mon lecteur RSS en PWA (application mobile en HTML/JS/CSS). Pour ça, je dois scinder l’interface de l’application des données. Vu que je bosse intégralement en JSON, c’est très simple.

Concernant la vitesse, en quelques lignes de JS j’ai ma page qui s’affiche et une fois chargée, fait une requête vers le serveur avec les données. C’est pas plus lent qu’avant (mais je fais un pas de plus vers la PWA).

Là où je m’interroge, c’est comment accélérer ça encore plus ?

Sur les 3 Mo transférés, la plus grande partie provient du contenu des articles, le reste étant plutôt des méta-données : date, ID, nom du flux et le titre de l’article.

J’essaye donc :
– à l’affichage de la page, l’interface s’affiche.
– Pendant ce temps, une première requête qui récupère titre + métadonnées et qui suffisent pour afficher les flux dans une liste.
– une seconde requête est ensuite faite qui récupère le contenu des articles et les attache à la liste principale.

La première requête suffit pour afficher la liste des flux : l’utilisateur peut commencer à lire les titres et à trier visuellement les articles qu’il souhaite lire (du moins, perso je fonctionne comme ça).
Pendant qu’il repère les articles qu’il va lire, la page récupère le contenu des articles (2,5 Mo).

Dans l’ensemble, ça prend peut-être quelques ms de plus pour charger, mais beaucoup moins de temps pour s’afficher : l’interface s’affiche instantanément, par exemple. C’est une question de perception de rapidité.

PS :
Quand je combine le résultat des deux requêtes, je fais deux boucles imbriquées, pour vérifier l’égalité tableau1[i].id === tableau2[j].id.
C’est un super-exemple d’utilisation du « break » dont je parle dans cet article. Une fois qu’il y a une égalité, on sort de la boucle et on passe à l’élément suivant.

Résultat : j’ai 471 éléments RSS à parser, donc 471×471 = 221 841 tours de boucles à faire. Avec le break, je prédisais qu’on gagne environ 50 % de la charge. Ça se vérifie sur cet exemple : le nombre de tours de boucle est de 111 214. Le gain est de 49,86 %. On y est.

En fait, je même beaucoup mieux : comme les deux requêtes renvoie deux tableaux de la même base de donnée rapidement à la suite, il est fort probable que les deux tableaux (triés en SQL) comportent la même indexation (sauf si une mise à jour des données RSS s’est glissée pile entre les deux requêtes).

On peut donc faire ça :


// si les ID sont identique, on ne reboucle pas (les deux tableaux comparent à la position « i »)
if (tableau1[i].id === tableau2[i].id) {
	# code here
}
// autrement, on recherche dans tout le tableau (tableau 1 sur « i », et le tableau2 sur « j »)
else {
	for (var j=0, len2 = _this.feedList.length ; j<len2 ; j++) {
		if (newFeeds[i].id === _this.feedList[j].id) {
			# code here
			break;
		}
	}
}

Dans le cas idéal, on passe à 471 tours de boucle (pour 471 éléments)
… au lieu de 111 214…
… au lieu de 221 841.

C’est bien non ?

PPS :
Finalement, le truc où je fais deux requêtes séparées c’est pas une bonne idée.
Ça marche, et l’idée peut fonctionner ailleurs, mais ici le gain n’est pas aussi important que je pensais. En fait, je viens de voir que les données sont déjà compressées par Gzip/deflate par le serveur (réduisant le poids de 2,5 Mo à 0,6 Mo environ).
Ça reste beaucoup de données, mais même avec une connexion pourrie, le temps que la connexion se fasse et que le serveur exécute la requête, j’en suis déjà à 1/3 du temps. Autant éliminer une des deux requêtes et n’en faire qu’une seule : ça reste plus rapide.


— (permalink)

Installer Une ROM Custom Sur Son Téléphone Android - LineageOS

mardi 19 février 2019 à 15:21

Mh…

Je vois qu’ils supportent le BQ Aquaris X chez LineageOS. Je pourrais éventuellement essayer (j’ai jamais fait ça, pour info).

Je sais que BQ permet de déverrouiller le bootloader, vu qu’ils fournissent leur propre outil pour le faire et qu’il y a un bouton dans les paramètres pour le faire (je ne sais pas si c’est comme ça partout).

(PS : je vois que ce blog, Holory.fr, est tout récent ! Je viens de l’ajouter à mes flux RSS =))


— (permalink)

Le Grand Débat s’installe sur Twitch : 10 ministres discuteront avec des vidéastes - Politique - Numerama

mardi 19 février 2019 à 15:06

Ça devient un peu n’importe quoi le grand débat.

[…]
– Bon, toutes ces news des politiques à la con me dépriment. Je vais aller jouer un peu à ce jeu.
*joue 5 minutes*
*popup sauvage apparaît*
– bonjour, c’est Manu ! Tu as 5 minutes pour voter pour moi au proch… parler #grandDébat ?
– AAAAAAAHHH
[…]

— (permalink)

Le ministre de l'ducation et l'Assemble nationale disent non la priorit au logiciel libre pour l'enseignement scolaire

mardi 19 février 2019 à 15:00

Donner la priorité à un concurrent de notre actionnaire ? Vous n’y pensez pas !


— (permalink)

Note : ffmpeg/avconv

mardi 19 février 2019 à 14:49

Ces dernières années le développement de avconv et de ffmpeg a été bordélique, en particulier avec les dépôts linux : l’un étant le fork de l’autre, ils sont entrés, sortis, re-rentrés dans les dépôts, etc.
Y a même eu des paquets de compatibilité qui faisaient des alias de l’un vers l’autre.

Aujourd’hui en 2019, c’est ffmpeg qu’il faut utiliser.

Je viens de passer 1 h à essayer de trouver pourquoi je ne pouvais pas utiliser ffmpeg : j’avais fait un alias à moi dans mon .bashrc >_<.

Bref…

Voici un script pour convertir tout un tas de MP4 en MP3. En prime, il déplace tous les MP4 dans un dossier "mp'.old" et affiche une notification quand une vidéo est terminée :


#!/bin/bash

for i in *.mp4;
	do ffmpeg -i "$i" -c:a libmp3lame -ab 320k -vn "$i.mp3";
	notify-send --icon="info" "Conversion terminée" "$i" --expire-time=2000;
	mkdir mp4.old;
	mv "$i" mp4.old/"$i";
done
notify-send --icon="info" "Toutes les conversion sont terminée !" ":-)";

Sous Mint Mate : mettez ça dans un fichier "mp4tomp3.sh" puis dans le dossier ~/.config/caja/scripts. Rendez-le ensuite éxecutable :

cd ~/.config/caja/scripts && chmod u+x *.sh

Ensuite allez dans un dossier avec des vidéos, clic droit > scripts > mp4tomp3.sh et c’est bon =)

(d’autres scripts )


— (permalink)

Prison avec sursis et 1 800 euros à payer pour 223 films téléchargés en P2P - Next INpact

mardi 19 février 2019 à 14:22

Comment ne pas trouver ça absurde :
– un DVD : 10 à 20 € le film
– 223 films et payer 1 800 € : 8 € le film.


— (permalink)

The Scorpion That Turned Into Copper! - Rock Seeker

mardi 19 février 2019 à 14:16

La fossilisation, c’est quand un être vivant (enfin, mort du coup) se retrouve à la merci des éléments : chaque atome organique de son corps finit par être remplacé par des minéraux inorganiques, en préservant plus ou moins sa structure biologique (organes, etc.).

Ici, un environnement riche en cuivre a permis de remplacer, atome par atome, son corps par des atomes de cuivre. Résultat, le scorpion est devenu 100% cuivre.


— (permalink)

Prime Macron : la quasi-totalité des grands groupes ont répondu présent

mardi 19 février 2019 à 13:12

Repartager la thune d’une boîte à ceux qui font tourner la boîte est toujours une bonne chose : ce n’est que justice.

Pour rebondir sur ça :

Ce ne sont pas les salariés des grands groupes français qui en ont le plus besoin. Or ce sont eux qui vont très majoritairement la toucher.

Ça pourrait éventuellement en être autrement, si les boîtes qui font le plus de bénéfices payaient des impôts qui sont ensuite redistribués directement ou indirectement à ceux qui en ont besoin…

100 milliards d’euros d’évasion fiscale par an, ça représente plus d’un smic par habitant français (pas par foyer, par habitant).

100 milliards d’euros d’évasion fiscale par an, ça permet aussi de combler la dette en 15~20 ans, et donc de virer peu à peu la CRDS (et donc de bénéficier à tous les travailleurs).


— (permalink)

PWA and HTTP Caching | eNux

mardi 19 février 2019 à 00:49

Je suis en train de jouer du JS pour faire une PWA (progressive web app).

Un des aspects sympa est la gestion du cache : on utilise le cache et les données hors connexion du navigateur pour notre PWA.

Comme le dit la page, le truc c’est que c’est au PWA de gérer si une URL doit être cachée :
– url des images, des scripts, des CSS : mis en cache
– url des XHR et requêtes renvoyant des données JSON (par exemple) : pas de cache.

Dans ce dernier cas, la PWA ignore son cache et lance une requête, qui atterrit… dans le navigateur !

Les PWA sont des app (en JS/HTML/CSS) dont le moteur d’exécution est le navigateur. C’est le navigateur qui gère les requêtes réseau (entre autres).

Et concernant ces dernières requêtes non cachées par la PWA, le navigateur décide :
– soit il fait une vraie requête vers le serveur
– soit il cherche dans son cache disque à lui

Donc même avec un bouton « rafraîchir » dans la PWA, on n’est pas assuré que les données soient bien transmises au serveur, et il n’y a aucun moyen de forcer ça depuis la PWA.

… enfin si : en ajoutant un paramètre (timestamp par exemple) à l’URL, mais là, ça peut poser problème pour le cache interne au PWA (qui risque de cacher toutes les URL identiques ne différant que par leur timestamp).

La solution, c’est d’agir au niveau du serveur : ajouter une en-tête Cache-Control au fichier appelé par le XHR :

Cache-Control: max-age=0

Soit en PHP :

header('Cache-Control: max-age=0');

Là, le navigateur ne conservera pas le fichier en cache disque, et si la PWA fait une requête, elle atterrira sur le serveur à tous les coups.


— (permalink)