Astronomie, informatique et science

Catégorie : Informatique Page 1 of 2

Windows plus performant

Bien que Windows 10 soit une belle amélioration par rapport à ses prédécesseurs, et en attendant Windows 11, il reste pas mal de composants inutiles qui consomment des ressources. Tels les widgets et autres applications faciles à retirer. Il reste pourtant au cœur du système d’autres composants nuisibles. Par exemple le service “Expériences des utilisateurs connectés et télémétrie”. Ce service qui se permet de consommer 100% de CPU sur 1 thread pendant longtemps ne sert qu’aux besoins de Microsoft (sans qu’on sache très bien ce qui est envoyé d’ailleurs), pas à l’utilisateur. Du coup, il suffit de l’arrêter définitivement.

Le service inutile “Expérience des utilisateurs connectés et télémétrie” parmi les autres services

Le machine learning en compétition de programmation

Il y a seulement 4 ans, le machine learning apparaissait encore comme une utopie pour les compétitions de programmation. Pour preuve, cette remarque d’un compétiteur sérieux (à 34’40”) :

La phrase qui nous intéresse : « En pratique, sur un challenge comme ça, je n’ai jamais vu quelqu’un gagner grâce au machine learning ».

On peut noter que le niveau en compétition de programmation a bien progressé sur ce genre de compétition. Du fait de l’utilisation croissante d’algorithmes qui ont fait leur preuves (Minimax, algorithme génétique, recuit simulé, algorithme de recherche en faisceau, Monte Carlo Tree Search et ses nombreuses variantes, etc.) on assiste à des résultats remarquables.

Certains compétiteurs ont réussi à appliquer avec succès le machine learning dès 2019 sur certains problèmes issus de précédentes compétitions. Les résultats étaient variables et dans certains cas très remarquables, battant largement tous les algorithmes mis en œuvre jusqu’à présent.

Lors de la très sérieuse compétition de programmation organisée par CodinGame en ce mois de mai 2021, plusieurs candidats se sont essayés au machine learning. L’un de ces candidats a particulièrement frappé les esprits en réussissant à sortir une solution qui a littéralement écrasé tous les autres participants (près de 7000).

Image issue de la compétition de programmation “Spring Challenge 2021” organisée par Codingame

On remarque donc que le machine learning, s’il n’est toujours pas une solution magique instantanée, engrange toutefois toujours plus de succès. Inévitablement, on va assister à une accélération de son utilisation, tout comme on a vu se répandre l’usage de certains algorithmes performants il y a quelques années.

Un avantage de .NET core sur .NET framework

À plusieurs reprises il m’est arrivé d’atteindre des limites peu connues en utilisant le .NET framework.

Récemment encore, en travaillant sur un problème d’optimisation, j’avais mis en place un algorithme de type BFS afin de chercher la solution la plus efficace à un problème. Du fait de l’explosion combinatoire du problème, mon pauvre programme pourtant en mode 64 bits tombait sur une exception de type “mémoire insuffisante“. Le souci est qu’au moment de l’exception, mon programme consommait à peine 10 Go de mémoire et qu’il me restait 16 Go de libre sur ma machine de 32 Go. Rageant.

Exception mémoire d'un programme basé sur .NET framework
Exception mémoire d’un programme 64 bits basé sur .NET framework. On voit sur le panneau à droite que le programme a planté après avoir consommé “seulement” 10 Go

Comme je travaille de plus en plus avec le .NET core, aussi bien sous Windows que sous Linux, j’ai voulu tester mon programme en le basculant pour .NET core 5 et voir s’il y avait des différences en terme de performance et d’occupation mémoire. Je n’ai pas spécialement noté de différence sur ces 2 aspects là, mais j’ai découvert une différence majeure : plus d’exception. J’ai même pu laisser filer mon programme au-delà de la mémoire disponible (process testé à 44 Go avec 32 Go de RAM), Windows restant imperturbable.

Aucun problème mémoire d'un programme basé sur .NET core
Le même programme 64 bits que précédemment revu pour .NET core. Plus de problème de mémoire. On voit sur le panneau à droite que le process continue après avoir consommé 29 Go sur une machine de 32 Go

En conclusion, tout nouveau développement en C# devrait cibler sans hésiter .NET Core au lieu de .NET framework, vu l’ensemble des avantages (notamment l’aspect multi-plateforme) et l’absence de perte.

L’informatique moderne est éphémère

Le terme que je veux mettre en avant est éphémère.

On ne s’en rend pas compte parce que l’informatique est ancrée dans le quotidien et que les améliorations et nouveautés s’enchaînent dans ce monde. Mais l’obsolescence est de plus en plus présente dans de nombreux domaines de l’informatique.

Quelques exemples pour étayer cette remarque.

Flash a disparu début 2021 après une longue période pendant laquelle ce composant était indispensable à nombre de sites internet et même des logiciels. Cette disparition entraîne de fait nombre de pages internet à ne plus fonctionner (sauf si évolution), nombre de logiciels à ne plus pouvoir fonctionner (sans alternative), et nombre de vidéos à ne plus pouvoir être lues.

Les langages de programmation évoluent de nos jour à un rythme inquiétant (et sans compter les nouveaux langages qui fleurissent chaque année). Ainsi, nombre de langages se sont lancés dans une course folle à enchaîner soit des nouveautés non négligeables sur un rythme semestriel, soit des nouveautés significatives sur un rythme triennal. En conséquence, relire un code source écrit il y a une dizaine d’année peut faire mal aux yeux. Également, le travail d’actualisation des connaissances pour les développeurs devient de plus en plus compliqué (sans compter les nouveaux frameworks qui apparaissent ou qui évoluent, ainsi que les nouveaux outils et les nouvelles pratiques). Et là encore, arriver à recompiler un ancien code source peut s’avérer difficile voire impossible de nos jours tant les évolutions sont rapides et brutales. On peut penser au langage python 2 qui n’a plus de support depuis 2020, certaines anciennes version de Swift.

On peut aussi penser aux célèbres applets java qui étaient tant présentes au début du web : elles vont être définitivement retirées de la version 17 de java (cf. https://openjdk.java.net/jeps/398).

Les logiciels suivent le même chemin : certains disparaissent (Outlook Express, Internet Explorer, etc.). On peut aussi évoquer une liste impressionnante de projets abandonnés par Google : https://killedbygoogle.com.

Toutes ces évolutions conduisent inévitablement à devoir migrer sans cesse les données, changer les logiciels et les habitudes. Et même parfois, ça conduit à des pertes de données/fonctionnalités définitives. Une forme d’obsolescence à marche forcée. Et pourtant cette tendance ne devrait pas s’inverser, bien au contraire.

Que faire quand maven refuse de tout télécharger

Scénario : nous sommes en 2020, et maven affiche quantité de warnings (suivis de quelques erreurs) du genre :

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-compiler-plugin:2.4: Plugin org.apache.maven.plugins:maven-compiler-plugin:2.4 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-compiler-plugin:jar:2.4
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom

Nous sommes donc en 2020, et l’usage du https devient la norme partout. Dans ce cas, il y a essentiellement 2 solutions :

La constante tau apparaît dans la version 1.4.7 du langage Rust

Parmi les nouveautés du langage Rust version 1.4.7, on découvre donc une nouvelle constante peu connue : Tau. Cette constante vaut le double de la constante π (Pi). Il existe de nombreux débats (sur Internet) essayant de faire croire que la constante π aurait dû valoir le double, au motif que beaucoup d’équations réclament le double de π et non simplement π. Hélas pour ces empêcheurs de tourner en rond, beaucoup d’autres équations n’ont besoin que d’un simple Pi. Notamment la plus belle équation : e i.π + 1 = 0.

Le langage Rust suit donc le langage python qui avait introduit cette constante dans va version 3.6.

Alors que les langages Java et C# ne disposent que d’un nombre infime de constantes mathématiques (e et π), Rust en possède beaucoup (https://doc.rust-lang.org/std/f64/consts/index.html). Idem pour C++ version 20 (https://en.cppreference.com/w/cpp/numeric/constants).

Pour le moment, Javascript résiste à Tau, tout comme bien d’autres langages.

Les raccourcis Windows à connaître en télétravail

L’utilisation du bureau à distance est usuelle en télétravail. Les problèmes arrivent rapidement quand les raccourcis Windows restent en local et ne sont pas transmis à l’ordinateur distant.

Heureusement, il existe d’autres raccourcis pour émuler Alt+Tab, Alt+Print Screen, Ctrl+Alt+Del, etc.

En voici une courte liste : https://www.itprotoday.com/windows-8/top-10-remote-desktop-keyboard-shortcuts

Hélas, rien n’est prévu pour l’« inception », c’est-à-dire quand on prend le contrôle à distance d’un Windows depuis un Windows lui-même pris en contrôle à distance. Dans ce cas, il faut reconnaître que certains outils spécialisés font nettement mieux que le contrôle à distance basique de Windows. Mais les outils spécialisés sont souvent très coûteux.

La programmation informatique dans le film “Hacker / Code poursuite”

Le film Hacker / Code poursuite sorti il y a quelques mois est un des rares films montrant un ordinateur quantique. À nouveau c’est l’occasion d’évoquer l’aspect programmation informatique au cinéma.

L’héroïne du film se met à écrire un algorithme pour un ordinateur quantique, et chose surprenante, on voit clairement son écran. Mais c’est une grande déception.

Film « Hacker / Code poursuite » sorti en 2019

On voit en effet une petite fenêtre de programmation dans laquelle est écrit un simple JSON au format Jupyter Notebook (cf. https://ipython.org/ipython-doc/dev/notebook/nbformat.html). En tout cas, rien à voir avec la programmation pour ordinateur quantique.

Chose plus surprenante, l’intitulé de la fenêtre. Il s’agit de “C:\python27\python.exe”. Il s’agit donc du binaire principal du célèbre langage à la popularité grandissante, Python. Mais version 2.7.

Or, la version 2.7 de Python n’est plus supportée depuis le 1er janvier 2020, c’est-à-dire au moment de la sortie du film.

En conclusion : encore un film qui évoque l’informatique, mais qui caricature le sujet et qui est à côté de la plaque.

La programmation informatique dans le film “Rogue Warfare 2”

Clairement, le film Rogue Warfare 2 ne sera pas le meilleur de la décennie, enfin ce n’est que mon point de vue. Les critiques semblent toutefois aller dans mon sens. À défaut de parler de la qualité du film, je vais plutôt évoquer la programmation informatique au cinéma à travers ce film.

En effet, ce film met en scène une militaire donnant une leçon de programmation et même de piratage à un de ses collègues. Nous voyons clairement son écran défiler, arrêtons nous sur cette simple image tirée du film :

Film Rogue Warfare 2, pendant une session de programmation
Film Rogue Warfare 2, pendant une session de programmation : du PHP, du C, etc.

Ça bouge pas mal dans toutes les fenêtres, et surtout la fenêtre centrale qui utilise un thème sombre avec une police de couleur verte, le tout défilant de haut en bas. Probablement pour avoir un effet type Matrix. Dans l’inconscient, ça peut jouer d’associer son image avec une image qui véhicule le futur, la science fiction.

Si on regarde en détail le code source de la zone centrale, on voit qu’il s’agit de PHP, avec une ligne telle que celle-ci :

$_SESSION['username'] = 'tutorialspoint';

Cela semble être tiré directement de l’exemple de connexion en PHP fourni par le site TutorialsPoint :
http://www.tutorialspoint.com/php/php_login_example.htm

Donc, rien à voir avec ce que l’actrice explique être en train de faire (créer / lancer un programme espion).

De plus, le copier/coller de code source peut être dangereux. En effet, on voit ce code :

if ($_POST['username'] == 'tutorialspoint' && $_POST['password'] == '1234')

Clairement, il s’agit d’une violation de type CWE-259: Use of Hard-coded password. Évidemment, c’est à ne pas faire.

Concernant la fenêtre en haut à gauche, on voit du code C sur la zone droite, et la version assembleur en cours de debug dans la zone gauche :

nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK;
/* Make sure we always allocate at least one indirect block pointer */
nblocks = nblocks ? : 1;

Ce code est connu, il s’agit de la gestion des groupes dans le noyau Linux, dont on peut voir le code source complet sur git : https://github.com/torvalds/linux/commit/30639b6af85a92491b22dd14c17b14ca11da60e6#diff-d426d46610ed4fa039bbbfd367c2c186

À noter : qu’il existe un site dédié à ce code source ! En effet, pour qui veut passer pour un hacker comme au cinéma, il suffit de taper frénétiquement au clavier depuis le site http://hackertyper.com. De nouveau, thème sombre et police de couleur verte. Les stéréotypes de la programmation informatique ont hélas la vie dure.

Code golf en langage Rust

Le Rust est un langage de programmation qui se prête peu à l’exercice de Code golf. Par ailleurs les astuces permettant de réduire au maximum la taille des sources en Rust sont très peu documentées. Voici quelques techniques utiles.

  • Réutiliser une String

Supposons que l’on veuille réutiliser une string.

    let mut s=String::new();
    // Do some stuff with s
    s=String::new();

Alors, la dernière ligne peut-être remplacée par la ligne suivante qui est plus courte de 6 caractères :

    s.clear();
  • Initialisation multiple

Supposons que l’on doive initialiser les variables x et y avec le contenu des 3e et 4e valeurs d’un tableau n :

    let mut x=n[2];
let mut y=n[3];

Alors, on peut écrire la même chose en une seule ligne et en économisant un peu :

    let(mut x,mut y)=(n[2],n[3]);
  • Réduire std::io

Souvent, les concours de Code golf nécessitent :

    use std::io;

Il est possible d’économiser 1 caractère :

    use std::*;
  • Omettre le point-virgule final

En général, le programme se finit par un print/println tel que :

    println!("{}",n);

Le point-virgule terminal n’est pas nécessaire, ce qui permet d’économiser un caractère.

Page 1 of 2

Fièrement propulsé par WordPress & Thème par Anders Norén