Rechercher un mot - le hollandais volant

Vous jouez à Wordle / Sutom ? Vous ne connaissez pas tous les mots en français ?

Je vous ait fait un z'outil (pas encore terminé) !.

Exemple, si le mot est « R . . . . . .S », tapez « R......S » et il vous sort tous les mots possibles (c’est en regex, donc le joker c’est le point).
Dans l’outil, le début est fixe (le « ^ » est implicite) mais pas la fin (le « $ » peut être rajouté à votre texte). En vrai il faut donc mettre «R......S$ ».

Le dictionnaire de mots utilisé fait 336 411 mots (y a les singuliers, les pluriels, les conjugaisons…) et pèse un peu. Attendez que le chargement se finisse avant de lancer la recherche.

Pour les plus férus, vous pouvez créer et taper la régex parfaite qui permettra à partir des lettres bonnes (en rouge) et les lettres déplacées (en jaune) =) de filtrer suffisamment pour réduire la recherche à tout juste quelques mots.

Il ne resterait plus qu’à utiliser le dictionnaire interne de Sutom et à faire un script qui analyse et automatise la résolution du jeu :-D.
Après tout, c’est de la pure logique, ça doit pouvoir se faire. On fait bien des solveurs de Sudoku ou de Rubik's-Cube.

En dehors de ça, cet outil peut aussi servir pour les mots croisés (toujours en exploitant la puissance des régex pour filtrer au nombre de lettres (avec « .{5}$ » par exemple).

(PS : ceux qui pensent que c’est de la triche, c’est votre droit, mais ne vous fatiguez pas : si vous n’êtes pas programmeur, vous ne comprendriez pas le fun de faire un script qui fait tout à votre place, y compris répondre une fois par jour à un jeu gratuit où y a rien à gagner ou à perdre :p)

JavaScript Sudoku solver

J’aime ce genre d’article où on montrer itérrativement comment résoudre un problème de prog, et comment on arrive à passer d’une solution qui fonctionne mais qui est un peu lente (8 secondes) à une solution faisant appel à quelques astuces logiques (issues de l’intelligence humaine, impossible à deviner pour un script comme ça) pour le réduire à 0,7 secondes (le nombre de calculs passe lui de 8,9 millions à 1 200). Magnifique.

There is no 'printf'.

As so often when debugging something that doesn't make sense, we need to determine if what we're looking at is actually what we think we're looking at. We wrote some code, and we run an executable, but who's to say that the executable uses the exact instructions we wrote into the code?

C is not an interpreted language, but a compiled language, meaning we use a tool -- a compiler -- to translate our high-level code into machine instructions. And if you remember the various stages of a compiler, you'll note that one of them includes code optimization. So let's take a look at what exactly our compiler produces:

Parfois, les compilateurs remplacent certaines fonctions que vous écrivez par d’autres qu’ils jugent plus appropriées. Et ça peut provoquer des désagréments. Ici, printf() retourne la longueur de la chaîne affichée. Mais le compilateur peut le remplacer par une fonction qui retourne autre chose (ici, puts(), qui retourne un code, pas la longueur de la chaîne passée en paramètres).

CodePen Home File and Directory Drag-and-drop for Firefox and Chrome - Codepen

Un script JS pour uploader des fichiers ET des répertoires.

Ça marche dans Firefox et dans Chrome.
Alors que généralement, cette fonction est décrite comme ne fonctionnant pas dans Firefox.

En vrai, Firefox supporte une fonction de Webkit ici, mais elle le supporte depuis 2016 (la fonction — expérimentale et préfixée — existe elle depuis 2012, mais est utilisée partout), et autant de temps qu’on a droit à ce genre de bullshit :
https://twitter.com/lehollandaisv/status/1447595435233882114

Déjà connu depuis longtemps sur les sites de Google (qui ont tout intérêt à descendre la concurrence), voir là :
https://lehollandaisvolant.net/?d=2016/01/03/16/30/39-youtube-lent-en-html5-avec-firefox-42

… et sur les sites codés avec des moufles sur chaque main :
https://lehollandaisvolant.net/?d=2017/07/03/20/33/52-ce-site-nest-fait-que-pour-chrome-bla-bla-blah

#ChromeIsTheNewIE

Parsing JSON Really Quickly: Lessons Learned - YouTube

C’est un truc de fou quand-même.

Imaginons de faire un tableau avec des nombres aléatoires dedans :

while (howmany != 0) {
    out[index] = random();
    index += 1;
    hownany--;
}

Ceci, coûte environ 3 cycles CPU par itération.

Maintenant, disons que l’on veuille mettre des nombres aléatoires, mais seulement paires :

while (howmany != 0) {
    var = random();
    if (val is odd) {
        out[index] = val;
        index += 1;
    }
    hownany--;
}

Comme il dit, on pourrait penser que c’est aussi rapide (le test de parité se fait en regardant seulement le bit de poids faible), voire plus rapide car le tableau de sortie est en moyenne moitié moins gros.

En réalité, c’est 5 fois plus lent à 15 cycles CPU par ittération !

Ceci est plus rapide :

while (howmany != 0) {
    val = random();
    out[index] = val;
    index += (val bitand 1);
    howmany--;
}

Ça fait la même chose : l’index est incrémenté par le bit de poids faible (BPF) du nombre créé. Autrement dit, si le nombre est pair, le BPF est 1, donc l’index est incrémenté, et au prochain tour de boucle, on passe à l’index suivant du tableau.
Si le nombre est impaire, le BPF est 0, et le nombre sera écrasé dans le tour de boucle suivant.

Ici, on trouve la vitesse de la méthode initiale, à environ 4 cycle CPU par tour de boucle.

Pourquoi ?

Parce que les CPU modernes font du calcul prédictif. Ils essayent de gagner de temps en calculant un résultat futur.
Si la prédiction est bonne, on aura gagné du temps : le calcul est déjà fait.
Mais s’il est faux, on aura calculé pour rien ET on devra faire le calcul réel. On aura donc perdu davantage de temps à essayer d’en gagner, que ce qu’on on aurait perdu à ne pas vouloir en gagner. Si les CPU intègrent ça, c’est que le gain est globalement plus important que la perte dans la majorité des cas.

Dans notre exemple, lors de la seconde méthode avec un if, la méthode change à chaque tour de boucle. Autrement dit, tout le travail de prédiction ne sert systématiquement à rien et le CPU perd du temps à jeter la prédiction et à en recalculer une autre, qui sera à son tour jetée au tour suivant… à chaque fois !
Le calcul prédictif est là, mais il n’est pas encore assez évolué pour reconnaître le patern qu’on fait ici (c’est du très bas niveau ici, et on est encore loin d’une IA intégrée dans les CPU).

C’est pour ça que le dernier bout de code est plus rapide : la logique utilisée est la même à chaque tour de boucle. Il n’y a pas "if", le calcul est toujours le même.

On réalise ceci en limitant le nombre de niveaux d’embranchement dans le code (moins de IF). Il est préférable de faire plus de calculs sans branches que moins de calculs avec des branches.

Je ne sais pas trop dans quelles mesures tout ceci peut s’appliquer à du calcul de haut niveau (affichage d’une page web, par exemple et dans mon cas), je pense que ça reste limité, hormis pour les très grosses quantité de JSON ou les gros travaux sur le DOM, mais pour du calcul plus compliqué, comme le calcul 3D d’un jeu vidéo, ça doit jouer énormément.

Dans une certaine mesure, il ne m’étonnerait pas que certains vieux jeux tournent plus rapidement sur des CPU/GPU qui leur seraient contemporains que sur des systèmes modernes, qui perdraient alors plus de temps à vouloir en gagner. Dans les faits, le gain de la vitesse pure des CPU modernes sera toujours là, mais si ça arrive, faudra pas s’étonner je pense.

How to deal with bugs in an agile setting | Lobsters

Juste pour le titre : « How to deal with bugs in an agile setting ».

Je ne sais même pas pourquoi je m’attendais à une astuce style kung-fu pour gérer les moustiques… Car non c’est pas ça :(.

Note PHP, encore une optimisation à la con

Je suis en train de refaire des optimisations en tout genre dans un script.

L’une concerne un tableau associatif qui liste les #tags associés à mes posts.
Donc je récupère ça de la BDD, concatène tout, explode() et j’ai un tableau.
Je trie le tableau avec ksort(), puis compte les occurrences de chaque valeur dans le tableau (avec array_count_values), pour avoir un tableau associatif :

(
    #tag1 => nombre_d'occurences1,
    #tag2 => nombre_d'occurences1,
    …
)

Ça me prend 50-70 ms.
J’ai pu réduire ça à 30-50 ms très facilement

En fait, j’ai simplement inversé les étapes ksort() et array_count_values().

Avant :

$tableau = …
ksort($tableau);
$tableau = array_count_values($tableau);

Après :

$tableau = …
$tableau = array_count_values($tableau);
ksort($tableau);

Pourquoi c’est plus rapide ?
Parce qu’au début, le tableau contient tous les #tags, y compris les doublons : il y a 10 000 environ. Trier ça prend du temps.

Mais après le array_count_values(), le tableau est dédoublonné et ne compte que 400 entrées. Trier ça prend moins de temps.

Il suffit qu’il y ait 4 ou 5 optimisations comme ça et on gagne 200 ms sur la page. C’est bête hein, mais ça marche.

Je ne sais pas si on apprend ça à l’école (j’ai jamais eu de prog à l’école), mais une règle :

Sur les tableaux, faire le tri après les filtres.

(PS : oui, beaucoup de posts de prog() en ce moment. Pas désolé du tout par contre :p)

Ivre, il écrit une fonction qui pèse 100 Mo pour savoir si un nombre est pair | Les Joies du Code - Humour de développeurs : gifs, memes, blagues

O_o

Representing SHA-256 Hashes As Avatars | François Best

Encore une idée pour utiliser une représentation graphique d’un sha-256.

Kinda a big announcement – Joel on Software

StackOverflow a été racheté par un groupe d’investissement hollandais (Prosus NV).

voir aussi là : https://www.wsj.com/articles/software-developer-community-stack-overflow-sold-to-tech-giant-prosus-for-1-8-billion-11622648400

Bon… ça va finir comme Tumblr, CCleaner, Opera, OpenOffice.org/MySQL, Freenet et bientôt Github aussi : un ramassis de pub, popup « go premium », de fonctions réservés aux riches, de trackers, le tout purifié et censuré, à l’avenir incertain et aux soldes des actionnaires. C’est toujours la même chose, on a l’habitude.

Je ne reproche pas au fondateur d’avoir vendu ça (il fait ce qu’il veut), mais c’est juste dommage pour tous les utilisateurs de voir les bons outils se faire racheter sans cesse.
J’espère qu’un autre forum naîtra pour les remplacer.

Mozilla présente MDN Plus, une version enrichie et payante de ses ressources pour développeurs

Mouarf.

Si Stackoverflow est le Reddit des dév, alors MDN est son Wikipédia.

Qu’ils ajoutent des fonctions payantes au MDN, ok, pourquoi pas, mais s’ils mettent toute la doc (très complète) derrière un paywall, ça me ferait chier.

Tableau HTML - le hollandais volant

Voilà.

Oui c’est un outil de feignasse.

Dimension Senpaï ?.. 😳👉👈 sur Twitter : "Apprendre la programmation à quelqu'un be like :… "

Sinon, pour se la péter, on peut mettre :

return (!(value_1 xor value_2));

(pour les langages le supportant, comme PHP)

How one programmer broke the internet by deleting a tiny piece of code — Quartz

(viel article, mais toujours aussi bon et plus que jamais d'actualité)

L'entreprise Kik demande à Azer Koçulu, un programmeur, de virer son package "kik" sous peine de poursuites. Ce dernier refuse. Du coup, Kik demande à NPM de retirer le package sous peine de poursuites. NPM accepte sans broncher.

Koçulu décide alors de retirer tout son code de NPM, y compris des lib très populaires comme "left-pad". Résultat, tout l'internet, y compris des entreprises comme Facebook et des solutions comme React se retrouvent en feu. Ironie du sort, Kik est lui même emmerdé.

M'enfin, comme il dit :

“This situation made me realize that NPM is someone’s private land where corporate is more powerful than the people, and I do open source because, Power To The People,” Koçulu wrote.

Y'a plusieurs leçons à tirer de tout ça :
- NPM (mais aussi Github/Microsoft et les autres) se rangeront toujours de ceux qui on les plus gros avocats
- utiliser des gestionnaires de paquets qui dépendent les uns des autres en cascade, c'est une très mauvaise idée
- une dépendance pour un paquet de 11 lignes de code comme left-pad, c'est une aberration (ça c'est mon avis : c'est pas comme s'il y avait 46 solutions de faire un left-pad).

Note : Rendre son site visuellement plus rapide

Dans mon lecteur RSS, je ne télécharge pas les données d’un post à chaque ouverture d’un post. J’ai pas envie de faire une requête à chaque fois, c’est trop long et trop chiant (à l’usage).
À la place, je charge tout au début et après c’est fluide. Sauf que le début met du temps à charger.

Ma solution jusqu’à présent ?

Faire trois requêtes.
— une pour récupérer la liste des sites (requête légère) auxquels on est abonnés (puis afficher cette liste de sites, en sidebar)
— une pour récupérer la liste des posts (requête moyenne), sans le contenu (puis afficher la liste des posts, sur la partie principale de la page)
— une pour récupérer le contenu de chaque post (requête très lourde ; puis les incorporer dans le JSON qui gère les posts).

La dernière requêtes est longue, lourde, mais faite de façon invisible. La liste des flux et des postes est déjà chargée, affichée et on peut interagir avec. Le temps que l’utilisateur choisisse le post à lire, la troisième requête est finie et la page est totalement opérationnelle.
D’un point de vu « look and feel » c’était hyper rapide.

Sauf que pour moi, c’était encore trop lent. Et programmatiquement, c’était moche.

Ma solution ?

Afficher la liste des posts AVANT la liste des sites.

Pourquoi ?
Parce que dans la liste des sites (affichée en première), il y a un favicon pour chaque site. Et même si ce favicon est en stockage cache navigateur ET en stockage cache serveur, en récupérer 150, un pour chaque abonnement, c’est pas rapide.

Maintenant, la page charge vite et les derniers éléments qui s’affichent discrètement, ce sont les favicons des sites auxquels on est abonnés.

Petite astuce incroyablement bête, mais qui change… tout.