JS-DOS 6.22

JS-DOS permet d’exécuter un programme DOS dans un navigateur Web de manière très simple. => Site officiel : https://js-dos.com.

Version : https://github.com/caiiiycuk/js-dos/releases/tag/6.22.60

Télécharger et décompresser 6.22.60.zip :

cd Téléchargements
wget https://github.com/caiiiycuk/js-dos/releases/download/6.22.60/6.22.60.zip
unzip 6.22.60.zip -d 6.22.60

Problème rencontré : Le titre que je donne à mes pages html est écrasé par JS-DOS et indique DOSBox. Pour résoudre ce problème, j’ai modifié certains fichiers de l’archive en remplaçant :

setWindowTitle!=="undefined"

par :

setWindowTitle=="undefined"

Pour lister les fichiers concernés par le problème, on va écrire un script Bash dans un fichier nommé liste-jsdos.sh (utilisation : ./liste-jsdos.sh 6.22.60):

#!/bin/bash

# ============================================================
# Recherche de fichiers contenant :
#
#     setWindowTitle!=="undefined"
#
# Utilisation :
#
#     ./liste-jsdos.sh /chemin/vers/le/repertoire
#
# Exemple :
#
#     ./liste-jsdos.sh /var/www/html/js-dos
# ============================================================


# ------------------------------------------------------------
# Vérifie qu'un répertoire a été fourni en argument
# ------------------------------------------------------------

if [ -z "$1" ]; then
    echo "Usage : $0 /chemin/vers/le/repertoire"
    exit 1
fi


# ------------------------------------------------------------
# Stocke le répertoire fourni dans une variable
# ------------------------------------------------------------

DIR="$1"


# ------------------------------------------------------------
# Vérifie que le répertoire existe
# ------------------------------------------------------------

if [ ! -d "$DIR" ]; then
    echo "Erreur : le répertoire '$DIR' n'existe pas."
    exit 1
fi


# ------------------------------------------------------------
# Texte que l'on recherche
# ------------------------------------------------------------

PATTERN='setWindowTitle!=="undefined"'


# ------------------------------------------------------------
# Recherche récursive avec grep
#
# -r  : recherche récursivement dans les sous-répertoires
# -l  : affiche uniquement le nom des fichiers contenant
#       le texte recherché
# -F  : recherche le texte exactement, sans expression
#       régulière
# -I  : ignore les fichiers binaires
#
# "$DIR" : répertoire dans lequel commencer la recherche
# ------------------------------------------------------------

grep -rIlF "$PATTERN" "$DIR"

Résultat obtenu (5 fichiers contiennent l’erreur mentionnée) :

6.22.60/wdosbox.js
6.22.60/wdosbox-emterp.js
6.22.60/dosbox.js
6.22.60/dosbox-emterp.js
6.22.60/wdosbox-nosync.js

On va écrire un nouveau fichier Bash qui va corriger l’erreur (utilisation : ./reparer-jsdos.sh 6.22.60) :

#!/bin/bash

# ============================================================
# CORRECTION GÉNÉRIQUE DE JS-DOS
# ============================================================
#
# Le script recherche automatiquement dans un répertoire
# tous les fichiers contenant :
#
#     setWindowTitle!=="undefined"
#
# et remplace cette chaîne par :
#
#     setWindowTitle=="undefined"
#
# Il n'est donc pas nécessaire de connaître à l'avance
# les fichiers problématiques.
#
# Une copie de chaque fichier est créée avant modification :
#
#     fichier.js
#     fichier.js.bak
#
# Utilisation :
#
#     ./reparer-jsdos.sh /chemin/vers/js-dos
#
# Exemple :
#
#     ./reparer-jsdos.sh 6.22.60
#
# ============================================================


# ------------------------------------------------------------
# Vérification de l'argument
# ------------------------------------------------------------

if [ -z "$1" ]; then
    echo "Usage : $0 /chemin/vers/js-dos"
    exit 1
fi


# ------------------------------------------------------------
# Répertoire à analyser
# ------------------------------------------------------------

DIR="$1"


# ------------------------------------------------------------
# Vérification du répertoire
# ------------------------------------------------------------

if [ ! -d "$DIR" ]; then
    echo "Erreur : le répertoire '$DIR' n'existe pas."
    exit 1
fi


# ------------------------------------------------------------
# Texte recherché
# ------------------------------------------------------------

OLD='setWindowTitle!=="undefined"'


# ------------------------------------------------------------
# Texte de remplacement
# ------------------------------------------------------------

NEW='setWindowTitle=="undefined"'


# ------------------------------------------------------------
# Recherche des fichiers problématiques
# ------------------------------------------------------------
#
# grep :
#
#   -r  recherche récursivement
#   -l  affiche uniquement les noms des fichiers
#   -I  ignore les fichiers binaires
#   -F  recherche le texte exactement
#
# "|| true" empêche le script de s'arrêter si grep ne
# trouve aucun fichier.
# ------------------------------------------------------------

mapfile -t FILES < <(
    grep -rIlF "$OLD" "$DIR" 2>/dev/null || true
)


# ------------------------------------------------------------
# Vérification du résultat de la recherche
# ------------------------------------------------------------

if [ "${#FILES[@]}" -eq 0 ]; then

    echo "Aucun fichier contenant :"
    echo
    echo "    $OLD"
    echo
    echo "n'a été trouvé dans :"
    echo
    echo "    $DIR"

    exit 0
fi


# ------------------------------------------------------------
# Affichage du nombre de fichiers trouvés
# ------------------------------------------------------------

echo "=========================================="
echo " Fichiers problématiques trouvés"
echo "=========================================="
echo

echo "Nombre de fichiers : ${#FILES[@]}"
echo


# ------------------------------------------------------------
# Affichage de la liste
# ------------------------------------------------------------

for FILE in "${FILES[@]}"; do
    echo "  $FILE"
done


echo
echo "=========================================="
echo " Correction"
echo "=========================================="
echo


# ------------------------------------------------------------
# Traitement de chaque fichier
# ------------------------------------------------------------

for FILE in "${FILES[@]}"; do

    echo "Traitement : $FILE"


    # --------------------------------------------------------
    # Création d'une sauvegarde
    # --------------------------------------------------------
    #
    # Le fichier original est conservé avec l'extension .bak.
    #
    # Exemple :
    #
    #     dosbox.js
    #
    # devient :
    #
    #     dosbox.js
    #     dosbox.js.bak
    #
    # --------------------------------------------------------

    BACKUP="$FILE.bak"


    # --------------------------------------------------------
    # Évite d'écraser une sauvegarde existante
    # --------------------------------------------------------
    #
    # Si .bak existe déjà, on ne le remplace pas.
    #
    # Cela évite de perdre la version originale si le script
    # est exécuté plusieurs fois.
    #
    # --------------------------------------------------------

    if [ ! -f "$BACKUP" ]; then

        cp -p "$FILE" "$BACKUP"

        echo "  Sauvegarde : $BACKUP"

    else

        echo "  Sauvegarde déjà présente : $BACKUP"

    fi


    # --------------------------------------------------------
    # Compte le nombre d'occurrences avant modification
    # --------------------------------------------------------

    COUNT=$(grep -oF "$OLD" "$FILE" | wc -l)


    echo "  Occurrences trouvées : $COUNT"


    # --------------------------------------------------------
    # Effectue le remplacement
    # --------------------------------------------------------
    #
    # sed -i modifie directement le fichier.
    #
    # "g" signifie que toutes les occurrences de la chaîne
    # sont remplacées.
    #
    # --------------------------------------------------------

    sed -i \
        's/setWindowTitle!=="undefined"/setWindowTitle=="undefined"/g' \
        "$FILE"


    # --------------------------------------------------------
    # Vérification après modification
    # --------------------------------------------------------

    if grep -Fq "$OLD" "$FILE"; then

        echo "  ERREUR : certaines occurrences sont encore présentes."

        # Restauration automatique
        cp -p "$BACKUP" "$FILE"

        echo "  Fichier restauré depuis la sauvegarde."

    else

        echo "  OK : $COUNT occurrence(s) corrigée(s)."

    fi


    echo

done


# ------------------------------------------------------------
# Résumé final
# ------------------------------------------------------------

echo "=========================================="
echo " Terminé"
echo "=========================================="
echo

echo "Fichiers traités : ${#FILES[@]}"
echo
echo "Les fichiers originaux sont conservés avec l'extension .bak."

J’en ai informé l’auteur.

Installation de FreeDOS sur un Netbook

Article mis à jour le 15/07/2026

Machine cible : Samsung NC210 / DD 250 Go / RAM 2 Go.
Système à installer : FreeDOS 1.4 (05/04/2025).

Initialement, il y avait sur cette machine une version de Debian. Pour installer FreeDOS, il faut donc préparer le disque dur.
J’ai utilisé pour cela une version live de Debian :

Dans la console :

sudo fdisk /dev/sda

Supprimer les partitions existantes (touche d).
Ajouter une partition (touche n).
Définir le format de partition (touche t) avec le code Hexa c : W95 FAT32 (LBA).
Activer l'unique et nouvelle partition (touche a).
Contrôler les modifications avant écriture (touche p).
Écrire la nouvelle table de partitions (touche w).

Pour décompresser le fichier FD14-FullUSB.zip et récupérer FD14FULL.img :

unzip FD14-FullUSB.zip

J’ai ensuite gravé l’image de FreeDOS sur une clé USB avec Accessoires > Disques (gnome-disk-utility – Restaurer l’image disque…)

Une fois le système installé, pour pouvoir accéder à une clé USB, il faut, au niveau du BIOS mettre les priorités suivantes concernant le boot :
1 – SATA HDD (disque dur)
2 – USB HDD (clé USB)

Le disque dur sera accessible en tapant C: et la clé USB en tapant D: à condition d’avoir installé la clé avant le démarrage du système. Il n’est pas possible d’utiliser la clé USB de manière souple (l’enlever, la remettre).

Pour résoudre le problème lié à la touche Alt Gr, remplacer dans fdauto.bat (edit fdauto.bat) :
mkeyb FR par keyb FR

Official FreeDOS™ repositories at ibiblio
Pour installer des logiciels : FDIMPLES (très peu réactif sur mon NetBook)
ou plus directement :

d:
cd packages\devel
fdinst install watcomc.zip
fdinst install nasm.zip
cd ..\edit
fdinst install fed.zip
fdinst install uhex.zip

Outils de développement que j’installe :
Open Watcom C/C++ 1.9 => Lien intéressant pour l’installation
NASM 2.15.05 => Manuel en ligne
Turbo Pascal 7.0

Pour copier mon répertoire PERSO et ses sous-répertoires de D: vers C: :

xcopy d:\perso c:\perso /E

Rajouts personnels à la fin du fichier fdauto.bat (= autoexec.bat) :

REM *** OPEN WATCOM 1.9 ***
PATH C:\DEVEL\WATCOMC\BINW;%PATH%
SET INCLUDE=C:\DEVEL\WATCOMC\H
SET WATCOM=C:\DEVEL\WATCOMC
SET EDPATH=CC:\DEVEL\WATCOMC\EDDAT
SET WIPFC=C:\DEVEL\WATCOMC\WIPFC

REM *** TURBO PASCAL 7.0 ***
PATH C:\TP7\BIN;%PATH%

REM *** NASM 2.15.05 ***
PATH C:\NASM;%PATH%

Pour compiler et créer un exécutable avec Watcom :

wcl hello.c

Liens :
DOS commands
Index of FreeDOS 1.2 on ibiblio.org
Chaine officiel YouTube de FreeDOS
BTTR Software

Mettre à jour un programmateur USBasp avec un autre programmateur USBasp (sous Debian 10)

Lorsque je téléverse un programme dans ma carte Arduino Nano avec mon programmateur USBasp, j’obtiens le message suivant : avrdude: warning: cannot set sck period. please check for usbasp firmware update.

Si avrdude n’est pas installé dans Debian 10, le faire préalablement :

sudo apt-get install avrdude

Télécharger la dernière version du firmware (usbasp.2011-05-28.tar.gz ) sur le site officiel et décompresser l’archive :

cd Téléchargements
wget https://www.fischl.de/usbasp/usbasp.2011-05-28.tar.gz
tar -zxvf usbasp.2011-05-28.tar.gz

La puce sur le programmateur à mettre à jour est un ATmega8L (à vérifier à la loupe). Dans l’archive décompressée ci-dessus, le fichier qui nous intéresse est donc : usbasp.atmega8.2011-05-28.hex

Sur le programmateur à mettre à jour, JP1 est à positionner sur 5V ; les 2 broches de JP2 sont à relier entre elles.
Connecter les 2 programmateurs.
Taper dans la console les 2 lignes suivantes :

cd Téléchargements/usbasp.2011-05-28/bin/firmware/
avrdude -p atmega8 -c usbasp -U flash:w:usbasp.atmega8.2011-05-28.hex:i -F -P usb

Copie écran de ce qu’on obtient :

Libérer les broches de JP2.

=> Lien

Installation de Fritzing 0.9.6 sous Debian 10

Fritzing 0.9.6 ne fonctionne pas sous Debian 10 :
Fritzing utilise les bibliothèques Qt5 suivantes : libqt5printsupport5 libqt5xml5 libqt5sql5 libqt5serialport5 libqt5sql5-sqlite. Debian 10 en propose la version 5.11 alors que c’est la version 5.12 qui est nécessaire.
Debian 11 qui devrait sortir prochainement proposera la version 5.15. Patience donc…

Dans la console :

Pour supprimer la version 0.9.3 éventuellement installée depuis les dépôts de Debian 10 :

sudo apt-get --purge remove fritzing
sudo apt-get autoremove

Si le répertoire fritzing n’existe pas déjà, je le crée :

sudo mkdir /usr/share/fritzing

Télécharger Fritzing depuis : https://fritzing.org/download/ (8 €)

Je décompresse l’archive téléchargée et l’installe à l’endroit voulu :

cd Téléchargements
tar jxvf fritzing-0.9.6.linux.AMD64.tar.bz2
sudo mv fritzing-0.9.6.linux.AMD64 /usr/share/fritzing/fritzing-0.9.6

Je télécharge l’icône fritzing et l’installe à l’endroit voulu :

wget http://entropie.org/3615/download/fritzing.png
sudo mv fritzing.png /usr/share/fritzing

Pour intégrer le programme au menu de Xfce, je crée un fichier fritzing-0.9.6.desktop dans le répertoire /usr/share/applications :

cd /usr/share/applications
sudo nano fritzing-0.9.6.desktop


[Desktop Entry]
Version=0.9.6
Name=Fritzing
GenericName=Fritzing
Comment=Electronic Design Automation software
Exec=/usr/share/fritzing/fritzing-0.9.6/Fritzing
Icon=/usr/share/fritzing/fritzing.png
Terminal=false
Type=Application
Categories=Development;IDE;Electronics;
X-SuSE-translate=false
StartupNotify=true
MimeType=application/x-fritzing-fz;application/x-fritzing-fzz;application/x-fritzing-fzp;application/x-fritzing-fzpz;application/x-fritzing-fzb;application/x-fritzing-fzbz;application/x-fritzing-fzm;

Arduino : Téléverser un croquis avec le programmateur USBasp

Carte Arduino Uno sur une breadboard :
Source : https://www.arduino.cc/en/Main/Standalone
L’image d’origine a été corrigée (erreur sur le fil vert MOSI).
RESET vers broche 1 de l’ATmega328P
MOSI vers broche 17 de l’ATmega328P
MISO vers broche 18 de l’ATmega328P
SCK vers broche 19 de l’ATmega328P

USBasp : Thomas Fischl (Site officiel)

Remarque : Choisir un programmateur avec jumper qui permet de programmer sous 5V ou 3,3 V.

Firmware Bug sous Debian 10

A l’allumage de mon ordinateur, ce message apparaît :

[Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x22 (or later)

Quelques infos sur les microcodes
Microcode Update Guidance

Dans la console :
cat /proc/cpuinfo

Dans la console (dépôt non-free) :
sudo apt-get install intel-microcode
sudo apt-get install firmware-misc-nonfree

Dans la console, après redémarrage de l’ordinateur :
cat /proc/cpuinfo

Pour plus d’informations sur le microcode, dans la console :
sudo dmesg | grep microcode

Installer Mednum Offline Player sous Debian 10

Site : https://vod.mediatheque-numerique.com
Version du lecteur VOD : 3.0.6

Dans la console :

Si le répertoire Mednum Offline Player n’existe pas déjà, je le crée :
sudo mkdir /usr/share/mednum-offline-player

Je télécharge l’application : mednum-offline-player.AppImage

J’installe l’application à l’endroit voulu :
cd Téléchargements
sudo mv mednum-offline-player.AppImage /usr/share/mednum-offline-player

Je rends le fichier exécutable :
sudo chmod +x /usr/share/mednum-offline-player/mednum-offline-player.AppImage

Pour intégrer le programme au menu de Xfce (juste après avoir cliqué sur mednum-offline-player.AppImage) :

Le fichier .desktop se trouve dans : ./local/share/applications
Son contenu est ci-dessous :

[Desktop Entry]
Name=MEDNUM Offline Player
Comment=ARTE VOD offline player
Exec="/usr/share/mednum-offline-player/mednum-offline-player.AppImage" %U
Terminal=false
Type=Application
Icon=appimagekit-mednum offline player
X-AppImage-Version=3.0.6
X-AppImage-BuildId=71f28e60-134a-11a9-2954-499dceea7f3c
Categories=Video;
X-Desktop-File-Install-Version=0.26
X-AppImage-Comment=Generated by /tmp/.mount_mednum16hnCt/AppRun
TryExec=/usr/share/mednum-offline-player/mednum-offline-player.AppImage

Modification à apporter ci-dessus : Categories=AudioVideo;

Pour effacer une version précédente de Mednum Offline Player (à adapter) :
sudo rm -rf /usr/share/mednum-offline-player/mednum-offline-player.AppImage

Interroger la zone DMI de la carte mère avec Debian 10

=> Site officiel de Dmidecode

Dans la console :

Pour récupérer des informations sur le BIOS :

sudo dmidecode -t 0

Pour récupérer des informations sur la carte mère :

sudo dmidecode -t 2

Pour récupérer des informations sur le processeur :

sudo dmidecode -t 4

Pour récupérer des informations sur la RAM :

sudo dmidecode -t 5
sudo dmidecode -t 6
sudo dmidecode -t 16
sudo dmidecode -t 17

De manière générale :

sudo dmidecode -t x
avec x dans la liste ci-dessous :

0 : BIOS
1 : System
2 : Base Board
3 : Chassis
4 : Processor
5 : Memory Controller
6 : Memory Module
7 : Cache
8 : Port Connector
9 : System Slots
10 : On Board Devices
11 : OEM Strings
12 : System Configuration Options
13 : BIOS Language
14 : Group Associations
15 : System Event Log
16 : Physical Memory Array
17 : Memory Device
18 : 32-bit Memory Error
19 : Memory Array Mapped Address
20 : Memory Device Mapped Address
21 : Built-in Pointing Device
22 : Portable Battery
23 : System Reset
24 : Hardware Security
25 : System Power Controls
26 : Voltage Probe
27 : Cooling Device
28 : Temperature Probe
29 : Electrical Current Probe
30 : Out-of-band Remote Access
31 : Boot Integrity Services
32 : System Boot
33 : 64-bit Memory Error
34 : Management Device
35 : Management Device Component
36 : Management Device Threshold Data
37 : Memory Channel
38 : IPMI Device
39 : Power Supply
40 : Additional Information
41 : Onboard Device
42 : Management Controller Host Interface
43 : TPM Device

Installer un gestionnaire de machines virtuelles sous Debian 10

Site officiel : http://virt-manager.org

Dans la console, pour vérifier que le microprocesseur de mon ordinateur permet la virtualisation avec KVM :

grep -E 'vmx|svm' /proc/cpuinfo &>/dev/null && echo "La virtualisation est possible sur cette machine." || echo "Le microprocesseur de cette machine ne permet pas d'utiliser la virtualisation avec KVM."

Dans le BIOS de mon ordinateur ASUS (F2 au démarrage de l’ordinateur) :

Onglet Avancé > Configuration processeur > Technologie Intel Virtualization > Active

J’installe virt-manager :

sudo apt-get install virt-manager

J’ajoute l’utilisateur courant dans le groupe libvirt pour lui permettre de gérer les machines virtuelles :

sudo adduser $USER libvirt

Afin de faire communiquer les machines virtuelles avec l’extérieur :

sudo apt-get install bridge-utils

Pour pouvoir stocker mes machines virtuelles à un autre endroit que /var/lib/libvirt/images, sur un autre disque par exemple :

sudo nano /etc/libvirt/qemu.conf

et ajouter dans le fichier qemu.conf, à l'endroit adéquat :
user = "MonIdentifiant" (à adapter)
group = "MonIdentifiant" (à adapter)

sudo systemctl restart libvirtd

Dans le gestionnaire de machines virtuelles, double-cliquer sur QEMU/KVM et dans l'onglet Stockage, ajouter un pool à l'emplacement désiré, puis créer un nouveau volume pour chaque machine virtuelle. Enfin, rendre inactif le pool par défaut.

Installer Molotov sous Debian 10

Dans la console :

Si le répertoire Molotov n’existe pas déjà, je le crée :
sudo mkdir /usr/share/molotov

Je télécharge l’application : molotov.AppImage

J’installe l’application à l’endroit voulu :
cd Téléchargements
sudo mv molotov.AppImage /usr/share/molotov

Je rends le fichier exécutable :
sudo chmod +x /usr/share/molotov/molotov.AppImage

Je télécharge l’icône Molotov et l’installe à l’endroit voulu :
wget http://entropie.org/3615/download/molotov.png
sudo mv molotov.png /usr/share/molotov

Pour effacer une version précédente de Molotov (à adapter) :
sudo rm -rf /usr/share/molotov/molotov.AppImage

Pour intégrer le programme au menu de Xfce, je crée un fichier molotov.desktop dans le répertoire /usr/share/applications :
cd /usr/share/applications
sudo nano molotov.desktop

[Desktop Entry]
Type=Application
Name=Molotov
Comment=TV
Exec=/usr/share/molotov/molotov.AppImage --no-sandbox
Icon=/usr/share/molotov/molotov.png
Terminal=false
Categories=AudioVideo;Player;