PROJET AUTOBLOG


Le Hollandais Volant

source: Le Hollandais Volant

⇐ retour index

[Programmation] break & continue pour accélérer les scripts

samedi 26 janvier 2019 à 10:54

i
Parfois il suffit d’un rien pour accélérer des scripts, et comme ça ne coûte rien et que ça peut rendre service, il faut s’en servir.
Aujourd‘hui, l’astuce est toute bête, mais je ne la voit pas tant que ça non plus, d’où mon partage.

break

Quand on fait une boucle (for, while…) sur un tableau ou une liste, par exemple pour trouver un élément particulier du tableau, on peut gagner beaucoup de temps en sortant du tableau une fois qu’on a trouvé le résultat.

Ainsi, au lieu de ça :


// soit $array un tableau de 1 000 éléments
for (var i=0, len=array.length; i<len ; i++) {
    if (array[i] === recherche) {
        console.log('élément trouvé : ' + i);
    }
}


On peut faire ça :

// soit $array un tableau de 1 000 éléments
for (var i=0, len=array.length; i<len ; i++) {
    if (array[i] === recherche) {
        console.log('élément trouvé : ' + i);
        break;
    }
}


Où est l’optimisation ?
Il est avec le break : étant donnée qu’ici on recherche un élément du tableau en particulier, une fois qu’on l’a trouvé, il est inutile de perdre du temps de chercher dans les éléments qui suivent. Par conséquent, on va utiliser break pour sortir de la boucle for dès qu’on a rempli la condition.

Sur un tableau de 1 000 éléments, celui que l’on recherche se retrouve en moyenne à la moitié du tableau (parfois au début, parfois à la fin, mais en moyenne, au milieu). Du coup, en moyenne, on gagne 50 % de temps de calcul.

Une autre solution pourrait être de faire avec while :


// soit $array un tableau de 1 000 éléments
var flag = false, i=0;
while (array[i] && !flag) {
    if (array[i] === recherche) {
        console.log('élément trouvé : ' + i);
        flag = true;
    }
    else {
        i++
    }
}


Perso je préfère utiliser for plutôt que while, mais ce dernier fonctionne aussi. En JS, il existe aussi .forEach, .each, for of, for in, tous pour leur propres application, mais on peut parfois utiliser break aussi (même si ça dénaturerait un peu le forEach).

Notez que le gain de temps/énergie/temps processeur devient vite non-négligeable lorsque l’on commence à imbriquer plusieurs boucles for les unes dans les autres. Imbriquer 2 boucles de 1 000, ça fait 1 000 000 de tests à effectuer. Si les tableaux ne sont (virtuellement) plus que de 500, alors on réduit le temps de calcul de 75 % (plus que 250 000 calculs).

Bref, dès que vous le pouvez, sortez de la boucle et gagnez du temps.

À retenir : le break permet de sortir de la boucle. Son comportement est un peu différent du continue que voici.

continue

continue permet de sortir de l’itération courante dans une boucle, c’est pratique si l’on souhaite sortir de l’itération sans ajouter un if/else supplémentaire.

C’est utile, si je souhaite effectuer plusieurs calculs sur des éléments du tableau, mais que je dois exclure certains éléments.

Imaginons que l’on ait un tableau (de 1 000 éléments) d’objets "personne" et que seuls certains d’entre-eux ont renseigné leur âge. Pour ceux-là, et uniquement ceux-là, on souhaite vérifier si c’est leur anniversaire. Pour les autres, on ne fait rien.

Plutôt que de faire ça :


for(var i=0, len=array.length; i<len ; i++) {
    if (array[i].birthday !== undefined) {
        if (array[i].birthday === today) {
            console.log('Bon anniversaire !);
        }
    }
}


On peut faire ça :


for(var i=0, len=array.length; i<len ; i++) {
    if (array[i].birthday === undefined) {
        continue;
    }
    if (array[i].birthday === today) {
        console.log('Bon anniversaire !);
    }
}


Ici, si l’anniversaire n’est pas défini, on sort de l’itération en cours et l’on passe à la suivant : inutile d’effectuer les autres tests.

Ok, ici, c’est le gain est nul, mais dans certains cas il ne l’est pas.
Un exemple concret où je l’utilise c’est dans mon lecteur RSS : une fois que les éléments sont marqués comme lu, je ne souhaite plus les voir affichés, mais comme ils sont toujours sur la liste des éléments, il faut les ignorer.
Plutôt que d’utiliser un if/else ou un switch, j’utilise ça :

if (this.eventsList[i].action == "deleteEvent") continue;


Ça tient en une seule ligne, c’est discret et ça ne gêne pas la lecture du code.
D’autant plus que si l’élément n’est pas à supprimer, il peut avoir plusieurs autres .action
D’un point de vue « lecture du code », je préfère utiliser le if/else pour quand je dois effectuer une action dans les deux cas. Si je n’ai qu’un seul cas à traiter, je ne prends que if.
Si j’ai tous les cas à traiter (>2) je prends un switch, et si j’ai n-1 cas à traiter, je mets un continue au début, plutôt qu’un if suivi d’un gros else
Chacun ses façons de faire, mais j’apprécie celle-ci parce qu’elle réduit les niveaux d’indentation et le nombre de blocs indentés, qui rendent parfois le code difficile à suivre.


Conclusion

Comme j’avais expliqué dans mon article sur la prog récemment, il n’y a pas qu’une seule façon de faire, mais si le but est de faire un code rapide et moins gourmand en ressources, il n’y a pas 36 solutions : il faut réduire l’empreinte CPU, et ça, ça passe surtout par le nombre de calculs qu’il doit effectuer (et dans une moindre mesure, le type de calculs, mais ça ça sera pour une autre fois).

image d’en-tête de Jun OHWADA

Aux sites qui ne veulent pas de l’indexation par Google

jeudi 17 janvier 2019 à 17:21

meme thumb up rage face
Comme tu sembles perdu dès que ça touche à Internet, laisse-moi t’aider, je suis là pour ça !

Tu as un site de presse sur lequel tu publies tes beaux articles ?
Tu ne veux pas que Google indexe tes beaux articles ?

Voici la solution, très simple :

User-agent: Googlebot
Disallow: /

Enfin, dernière chose, maintenant que Google ne vient plus te « voler » : tu arrêtes de nous casser les couilles avec une taxe à la con simplement parce que t’es un incompétent qui ne sait pas lire la documentation.

Merci.

Mon grain de sel sur le #GrandDebat

dimanche 13 janvier 2019 à 23:00

On dirait que le grand débat est ouvert, et Macron demande l’avis de la population :

C’est pas l’endroit, mais je commence ici avec quelques idées.
Il n’est pas exclu que j’envoie tout ça un jour à ma mairie (même si, j’avoue être très pessimiste sur la prise en compte de tout ça, non pas seulement pour mes idées, mais surtout que, d’expérience, les élus à tous les niveaux sont connus pour ignorer l’avis d’un citoyen de base).

Bref, voici mon grain de sel…

Le premier sujet porte sur nos impôts, nos dépenses et l'action publique.

Je propose qu’on commence par des mesures simples. Pas forcément les plus importantes, mais elles auront (j’en suis sûr) pour impacte de réduire les tensions actuelles :

Quand tout le monde sera logé à la même enseigne, on pourra discuter sur des ajustements d’impôts, de taxes, qui impacteront alors tout le monde sans exception. Pas avant.

Le deuxième sujet sur lequel nous devons prendre des décisions, c'est l'organisation de l'Etat et des collectivités publiques.

Beaucoup de choses ont déjà été faites avec la fusion des régions.

Je n’ai pas trop de recul sur ces points, si ce n’est que j’ai toujours été pour l’idée d’un système fédéral, avec une politique régionale adaptée à chaque région (et donc forcément moins uniforme entre les régions). Le rôle de l’État sera de garantir un juste financement des différentes régions.

La transition écologique est le troisième thème, essentiel à notre avenir.

Si j’exclue mon avis selon laquelle je considère l’avenir de l’humanité comme déjà foutue (l’économie et la finance ont eu raison de la survie à long terme de notre espèce. Tout ce qu’on peut faire, c’est laver notre conscience), je propose ce qui suit.

Pour ma part, il faut cesser le production d’électricité à base d’énergie fossile. En France déjà, et surtout inciter le monde à nous imiter. Les énergies fossiles sont une solution simple mais sales.

Les énergies renouvelables sont importantes et serviront de source d’ajustement dans un premier temps, avant que le parc ne soit réellement productif. À court et moyen terme, l’essentiel ne pourra venir que du nucléaire (seule source d’énergie assez puissante pour couvrir les besoins).

Une éducation devra être faite autour du nucléaire pour la démystifier.
Une renationnalisation des centrales devra être effectuée pour que l’énergie redeviennent un bien commun, sans besoin de rémunérer des investisseurs privés, et où la sécurité reprendra la première place devant la rentabilité.

Les filières du thorium seront prises au sérieux. La recherche sur la fusion sera prise au sérieux également.

L’important travail autour de la mise à niveau maisons, immeubles, etc. sur le plan des économies d’énergie (isolation, etc.) devra être poursuivi. On s’améliore sans cesse, mais il faut continuer à améliorer l’existant. La meilleure solution pour réduire notre empreinte carbone est encore de réduire le gâchis et les pertes actuelles.

Les pompes à chaleurs, par exemple, permettent de produire 2x, 3x, 4x plus de chaleur en hiver que ce qu’elles ne consomment en courant (2 000 W, 3 000 W, 4 000 W de chaleur pour 1 000 W électrique consommé !).
Ce genre d’installation très économes devrait remplacer les radiateurs « grille pain » dans toutes les nouvelles habitations.

Localhost et HTTPS

lundi 7 janvier 2019 à 22:57

Le site web accessible depuis l’adresse « http://localhost » correspond à la boucle local : si votre ordinateur est accessible sur le port 80 dans votre navigateur, alors le site qui s’affiche correspond à votre ordinateur.

Ceci est vrai pour chaque internaute : par conséquent, obtenir un certificat SSL/TLS pour localhost est impossible (vu que le certificat sert justement à identifier un site unique).

Généralement, on utilise localhost pour avoir un serveur sur son propre ordinateur, pour pouvoir coder en local, par exemple. Aussi, il est parfois nécessaire d’avoir du https en local (surtout maintenant que les navigateurs considèrent tous les sites sans https comme dangereux).

Pour ça : mkcert.

Ce petit programme très simple va créer un certificat, non pas auto-signé (ce que les navigateurs n’aiment pas), mais signé par votre certificat personnel ! Par conséquent, les navigateurs le verront toujours comme valide !

Pour activer tout ça sous Apache, sous Linux Mint, on va :

Télécharger mkcert

Ça se passe ici. Perso je prends le fichier binaire directement (ici) : je prends le mkcert-v1.2.0-linux-amd64 et je l’enregistre sous le nom « mkcert » dans le dossier « ~/.mkcert ».

En ligne de commande ça donne (on crée le dossier, on récupère le fichier, on le marque comme exécutable) :

mkdir ~/.mkcert && cd ./.mkcert
wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.2.0/mkcert-v1.2.0-linux-amd64
chmod +x mkcert

Mkcert a aussi besoin de certutils, un outil tiers, qui (sous Linux Mint) se trouve dans les dépôts :

sudo apt install libnss3-tools

Produire un certificat

Là, c’est tout con, on va produire un certificat avec mkcert. Juste deux commandes.

On créer un certificat local, puis on l’applique à un certificat pour localhost :

./mkcert -install
./mkcert localhost

Cela va créer deux fichiers, localhost.pem et localhost-key.pem

Activer le HTTPS dans Apache

Ensuite, on active le site HTTPS (sur le port 443) dans Apache.

On active SSL :

sudo a2enmod ssl

On configure le site dans le fichier de conf (remplacez xed par gedit sur Ubuntu) :

sudo xed /etc/apache2/sites-available/default-ssl.conf

Trouvez la ligne suivante :

DocumentRoot /var/www/html

Et mettez-y la racine de votre site (perso c’est /var/www).
Allez ensuite sur la ligne où l’on désigne les certificats, puis remplacez les chemins vers les chemins des deux fichiers créés par mkcert (attention, mettez bien le chemin complet, sans le « ~/ », donc avec /home/$user ») :

SSLCertificateFile	/etc/ssl/certs/ssl-cert/snakeoil.pem
SSLCertificateKeyFile /etc/ssl/certs/ssl-cert/snakeoil.key
SSLCertificateFile	/home/timo/.mkcert/localhost.pem
SSLCertificateKeyFile /home/timo/.mkcert/localhost-key.pem

Enregistrez le fichier et fermez Xed (ou gedit).

Activer le site

Il reste à activer le site dans Apache.

cd /etc/apache2/sites-available/
sudo a2ensite default-ssl.conf

Puis on relance le service Apache. Selon que vous utilisiez systemd ou pas, c’est l’un ou l’autre de ces deux commandes (prenez la première qui fonctionne) :

sudo systemctl restart apache2
sudo service apache2 restart

Si tout s’est bien passé, votre site est désormais actif sur le port 443, en HTTPS, et avec un certificat détecté comme valide (en vert et sans erreurs) : localhost:443 :

le site localhost est bien en vert avec le cadenas
Voilà voilà !

Sources de l’info

Les taxes et impôts ne sont pas le problème

lundi 7 janvier 2019 à 12:50

photo d’une annexe du palais de versailles
L’impôt tire son nom du fait qu’un peuple « s’impose » le fait de donner une partie de son revenu à l’État, en échange de quoi l’État s’occupe de la maintenance des infrastructures qui profitent à tout le monde : écoles, routes, hôpitaux, services publics, pompiers, police…

Avec les taxes, l’impôt constitue une rentrée d’argent pour l’État, qui sert ensuite à faire fonctionner tout le pays. Je pense que tout le monde sait ça, ou au moins peut le comprendre.

Vu tout ce qui se passe en ce moment (gilets jaunes, etc.) on peut penser que les gens ne veulent plus payer tout ça. Du moins, il s’agit de l’image que les médias à la con nous montrent, et celui que les politiciens veulent nous donner du mouvement contestataire.

À mon avis (toujours), personne ne voudrait retirer leur salaire :

Ni qu’on retire le financement :

Bref, au fond, l’impôt est basé sur un consentement à participer, selon ses moyens à maintenir le pays dans un bon état.

Personne ne peut être contre ça sans également être pour l’idée de ne plus profiter de tout ce que l’État fournit en retour.

Non. Le problème n’est pas l’impôt.

Mais…

Quand certains, sous prétexte qu’ils touchent des milliards, se permettent de ne pas payer leurs impôts grâce à l’évasion fiscale (100 milliard par an) et que l’État en est complice par son inaction, on peut, sous ces conditions, se demander si tout le monde est bien soumis à l’impôt et aux mêmes lois.

Le problème est là.

Quand on voit, par ailleurs, les élus toucher des salaires annuels à 6 chiffres, défiscalisés, tout en dormant sur leur lieu de travail où ils vont et d’où ils partent quand ils veulent, le tout avec chauffeur, logement, avion, hôtel, secrétaire payés sur les fonds publics, on se demande si ce n’est pas de l’argent jeté par les fenêtres, alors qu’en bas, le moindre centime est précieux.

Le problème est là.

Quand on voit que les mêmes élus cités plus haut se plaignent de ce même salaire à 6 chiffres défiscalisé (trop faible selon eux), et qu’ils sont obligé de manger des pâtes plusieurs fois par mois — entre deux pains aux chocolats à 0,10 € – ou qu’ils n’arrivent plus à payer la garde de leur enfants sans une augmentation de 25 % après seulement 1 an de travail (tel que décrit plus haut) alors que les gens normaux sont parfois au même salaire de misère depuis 30 ans à travailler de 7h à 19h tous les jours, on se demande sur quelle planète ils vivent, ces élus.

Le problème est là.

Quand on voit que la République dépense des millions d’euros pour que sa majesté le Sir Macron puisse offrir un service en porcelaine, des rideaux et un tapis à sa majesté Dame Macron, alors que des dizaines de milliers de personnes dorment dehors sur un bout de carton, on se demande pourquoi on appelle ce type encore « notre représentant ».

Le problème est là.

Quand on voit que certains députés, toujours les mêmes, sont en grande partie sous le coup d’une poursuite judiciaire, n’arrivent pas à justifier des dépenses, mentent, insultent, menacent ou juste tabassent des gens, on se demande si le prérequis pour être député est le CV ou le casier judiciaire.

Le problème est là.

On est gouverné par des gens qui ne savent pas vivre. Qui ne connaissent pas la vie des français « moyens ». Qui vivent dans leur monde, d’or et de diamants, un monde où ils ne payent rien. Qui n’ont jamais eu un autre travail que celui d’élu payé par le contribuable (et qui viennent ensuite faire des leçons aux soi-disant « assistés »).
On est gouverné par des gens qui laissent passer 100 milliards d’euros et ferment les yeux dessus, mais qui continuent quand-même de taper sur les plus pauvres (chômeurs, etc.), de faciliter le licenciement, de détruire le service public, de défoncer nos droits et acquis sociaux qui permettent justement aux plus pauvres de parfois — non pas vivre — mais survivre.
On est gouverné par des gens qui considèrent l’argent comme illimité et pour laquelle la réponse est systématiquement « le contribuable ».

Dans ces conditions là, le problème n’est pas l’impôt et les taxes : c’est ce qui en est fait.

Si on ne dilapidait pas des milliards en salaires honteusement élevé pour des gens qui ne savent rien de la France et de ses habitants, si l’État appliquait à lui-même les « efforts » qu’il demande de faire à chacun, si sa majesté le Sir Macron cessait de nous prendre pour des cons et commençait par donner l’exemple de ce qu’est la vie en 2019 en France dans un contexte d’austérité, d’efforts pour l’économie et le climat, on n’en serait peut-être pas là.

Et si il s’avère que le gouvernement demande, dans ce contexte, encore une fois de plus, aux gens plus honnêtes, plus économes, plus responsables et plus pauvres qu’eux de devoir s’acquitter d’une nouvelle taxe, oui, le vase déborde et c’est normal.

Références :

image d’en-tête de Eos Clio