From 96d009ba99fa47a34cdebfbfa99b69126dbd87ac Mon Sep 17 00:00:00 2001 From: Samuel Ortion Date: Fri, 24 May 2024 20:54:56 +0200 Subject: [PATCH] Update posts Change favicon Add French version of tutorial on Wine for ultrasound analysis --- config.yaml | 20 +- content/favicon.ico | Bin 31275 -> 165662 bytes content/pages/news.org | 8 + content/pages/projects.org | 0 ...5_sound-analysis-on-linux-using-wine.en.md | 166 +++++++++++++++ ...5_sound-analysis-on-linux-using-wine.fr.md | 193 ++++++++++++++++++ ...0325_sound-analysis-on-linux-using-wine.md | 158 -------------- content/posts/20220612_draw_a_plot_in_c.md | 1 + .../20220614_render_equation_in_pelican.md | 1 + .../posts/20220619_install_gephi_on_linux.md | 26 +-- ...21001_run_stable_diffusion_on_colab.fr.md} | 0 ...ce_copier_texte_presse_papier_linux_fr.md} | 0 ...ramming_languages_using_github-linguist.md | 2 +- ...ssify_blood_cells_using_neural_networks.md | 1 + content/posts/20240114_unixfu.org | 2 +- content/posts/20240309_pseudocode_in_hugo.md | 16 +- .../20240313_eulerian_path_Hierholzer.md | 135 ++++++++++++ content/posts/20240415_permutations.md | 28 +++ content/sigmulus.png | Bin 24676 -> 0 bytes go.mod | 5 - go.sum | 2 - org/taocp/20240415_permutations.org | 71 +++++++ org/taocp/references.bib | 10 + sync.sh | 2 +- themes/mus | 2 +- 25 files changed, 641 insertions(+), 208 deletions(-) create mode 100644 content/pages/news.org create mode 100644 content/pages/projects.org create mode 100755 content/posts/20210325_sound-analysis-on-linux-using-wine.en.md create mode 100644 content/posts/20210325_sound-analysis-on-linux-using-wine.fr.md delete mode 100755 content/posts/20210325_sound-analysis-on-linux-using-wine.md rename content/posts/{20221001_run_stable_diffusion_on_colab_fr.md => 20221001_run_stable_diffusion_on_colab.fr.md} (100%) rename content/posts/{20230205_astuce_copier_text_presse_papier_linux_fr.md => 20230205_astuce_copier_texte_presse_papier_linux_fr.md} (100%) create mode 100644 content/posts/20240313_eulerian_path_Hierholzer.md create mode 100644 content/posts/20240415_permutations.md delete mode 100755 content/sigmulus.png delete mode 100755 go.mod delete mode 100755 go.sum create mode 100644 org/taocp/20240415_permutations.org create mode 100644 org/taocp/references.bib diff --git a/config.yaml b/config.yaml index 98079ff..da2a843 100755 --- a/config.yaml +++ b/config.yaml @@ -70,15 +70,15 @@ params: # suffixes: # - "gmi" -outputFormats: - # GEMINI: - # name: GEMINI - # isPlainText: true - # isHTML: false - # mediatype: text/gemini - # protocol: "gemini://" - # permalinkable: true +# outputFormats: +# GEMINI: +# name: GEMINI +# isPlainText: true +# isHTML: false +# mediatype: text/gemini +# protocol: "gemini://" +# permalinkable: true outputs: - home: ["HTML", "RSS", "GEMINI"] - page: ["HTML", "GEMINI"] + home: ["HTML", "RSS",] # "GEMINI"] + page: ["HTML"] #, "GEMINI"] diff --git a/content/favicon.ico b/content/favicon.ico index dc1363fa571df5c29cc5b6298df97bc4289040e8..ee375c5a60bb2a88d261583a8ee864d59bba8698 100755 GIT binary patch literal 165662 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 +#+updated: <2024-04-14 Sun> +#+draft: true + +* <2024-04-15 Mon> +Je commence un stage au Laboratoire de Mathématiques et Modélisation d'Évry (LaMME), pour travailler sur un pipeline de détection de gènes dupliqués en tandem sous la supervision de Carène Rizzon et Franck Samson. diff --git a/content/pages/projects.org b/content/pages/projects.org new file mode 100644 index 0000000..e69de29 diff --git a/content/posts/20210325_sound-analysis-on-linux-using-wine.en.md b/content/posts/20210325_sound-analysis-on-linux-using-wine.en.md new file mode 100755 index 0000000..a8f2935 --- /dev/null +++ b/content/posts/20210325_sound-analysis-on-linux-using-wine.en.md @@ -0,0 +1,166 @@ +--- +title: Analyse Sound on GNU/Linux using Wine +author: Samuel Ortion +date: 2021-03-25 +modifdate: 2024-05-18 +tags: [audio, bat, bird, ultrasound, syrinx, batsound] +lang: en +aliases: ["/analyse-sound-on-gnulinux-using-wine.html"] +slug: analyze-ultrasound-on-gnulinux-using-wine +--- + +After recording bats, orthoptera or birds sounds, it is often necessary to have a look at the spectrograms of the sounds, for instance while analyzing [Vigie-Chiro Program](http://www.vigienature.fr/fr/chauves-souris) bat records. + +The software needed to do so are often developed only for Windows. In this article, we will learn how to install these softwares (e.g., Kaleidoscope, Syrinx, Batsound 4, 7-zip and Lupas-Rename). + +_Une [version traduite en Français](/posts/analyser-des-sons-sur-gnulinux-avec-wine/) est disponible, avec quelques modifications_. + +## Install Wine + +Wine is a software that enable .exe software to run on UNIX systems such as Linux or Mac OS. + +### On Debian and derivatives (Ubuntu...) + +Enable 32 bit packages (if you haven't already): + +```bash +sudo dpkg --add-architecture i386 +``` + +Download and install the repository key: + +```bash +wget -nc https://dl.winehq.org/wine-builds/winehq.key +sudo apt-key add winehq.key +``` + +Add the repository to `/etc/apt/sources.list` or create a `wine.list` file under `/etc/apt/sources.list.d/` with the following content (recommended): + +```textile +deb https://dl.winehq.org/wine-builds/debian/ buster main +``` + +Update packages + +```bash +sudo apt update +``` + +Install Wine stable + +```bash +sudo apt install --install-recommends winehq-stable +``` + +### On Fedora, RHEL, and derivatives + +Add repository : + +```bash +dnf config-manager --add-repo https://dl.winehq.org/wine-builds/fedora/33/winehq.repo +``` + +Install stable package : + +```bash +dnf install winehq-stable +``` + +## Install Kaleidoscope + +Kaleidoscope is available on both fedora and debian based distros at [wildlife acoustics](https://www.wildlifeacoustics.com/). + +## Install Syrinx + +As all the softwares in the following, Syrinx is not available for GNU/Linux, we need Wine to execute the `.exe`. +Syrinx-PC is available at [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOM0ZfYlpDR2l1cU0/view) (from the Vigie-Chiro program). +You will also need the config files available at [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOQnBhRjNVRFM1Rkk/view) too. + +You have two options : +You can either right click on the `.exe` installer and select `Open with other application` and `Wine Windows Program Loader`, or run `wine syrinxalphainst.exe` in Terminal. + +### Set up app launcher + +You have to create a new file `.local/share/applications/syrinx.desktop`: + +```textile +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Syrinx +Comment=Acoustic analysis +Exec=/usr/bin/wine /home/$USER/.wine/drive_c/Program\ Files\ (x86)/syrinx/Syrinx.exe +Icon=/home/$USER/.wine/drive_c/Program Files (x86)/syrinx/img/vigie-chiro.png +Terminal=false +``` + +Change `$USER` by your unix username. To have an icon for the application launcher, you can download [`vigie-chiro.png`](/images/vigie-chiro.png). + +To analyse ultrasound, with a 384 kHz sampling frequency, we have to open `Configs_syrinx/exp384.dsp`; and click on 'Load sound file' (shortcut `Ctrl+L`). To switch to other sound files in same folder, we can use `alt+arrows`. For more tips, you can view [the video of Charlotte ROEMER (Fr)](https://www.youtube.com/watch?v=BPPSw2FSLxs). + +## Install and Configure Batsound 4 + +The procedure is quite similar with Syrinx-PC installation. We mention only key points. + +### Set up app launcher + +Create a new file `.local/share/applications/batsound.desktop`: + +```textile +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Batsound +Comment=Acoustic analysis +Exec=/usr/bin/wine /home/$USER/.wine/drive_c/Program\ Files\ (x86)/Pettersson/Batsound4/BatSound.exe +Icon=/home/$USER/.wine/drive_c/Program Files (x86)/Pettersson/Batsound4/img/batsound.png +Terminal=false +``` + +(Do not forget to change `$USER` with your username.) + +To have an icon displayed in your application launcher, you can download [`batsound.png`](/images/batsound.png). + +### Configure Batsound to analyse ultrasounds + +- Enter the `Sound/Sound Format` menu. + +![Entering `Sound/Sound Format` menu](/images/batsound/enter-sound-format-menu.png) + +- Change `Time expansion` value to 10 (according to your recorder settings) +- Keep 44 100 as `Samples per second` value. + +- Enter the `Analysis/Spectrogram Settings - Defaults` menu. + +![Entering `Spectrogram Setting - Defaults` menu](/images/batsound/spectrogram-settings-default-values.png) + +- Change `Max frequency` to `150000`; +- Set `Amplitude color mapping` to `Yellow, Red & Blue`; +- Adapt `Threshold` to sound intensity. + +- You can zoom in. + +With a _Pipistrellus kuhlii_ record, I obtain the following spectrogram with the above settings: +![pipkuh spectro](/images/batsound/pipkuh-spectro-batsound.png) + +## Install 7-zip + +7-zip is useful in Vigie-Chiro process to compress audio files for faster upload to [https://vigiechiro.herokuapp.com](https://vigiechiro.herokuapp.com). + +1. Download `.exe` installer at [https://www.7-zip.org/](https://www.7-zip.org/) +2. Execute `7z1900.exe` with wine. + +## Install Lupas-Rename + +Lupas-Rename is used in Vigie-Chiro protocole to batch rename audio file to add protocoles informations such as pass and square. + +1. Download `.exe` installer at [https://rename.lupasfreeware.org/download.php](https://rename.lupasfreeware.org/download.php) +2. Execute installer with wine +3. Batch rename audio files... + +## Conclusion + +With all these softwares running on your Linux PC, you will be able to perform Vigie-Chiro protocole and sound analysis! I look forward to see your participations at ! + + diff --git a/content/posts/20210325_sound-analysis-on-linux-using-wine.fr.md b/content/posts/20210325_sound-analysis-on-linux-using-wine.fr.md new file mode 100644 index 0000000..d3e0999 --- /dev/null +++ b/content/posts/20210325_sound-analysis-on-linux-using-wine.fr.md @@ -0,0 +1,193 @@ +--- +title: Analyser des sons pour le programme Vigie-Chiro sur votre machine GNU/Linux avec Wine +author: Samuel Ortion +date: 2024-05-18 +tags: [audio, bat, bird, ultrasound, syrinx, batsound] +lang: fr +slug: analyser-des-ultrasons-sur-gnulinux-avec-wine +--- + +Après avoir enregistré des sons de chauve-souris, orthoptères ou d'oiseaux, il est souvent utile de jeter un oeil aux spectrogrammes des enregistrements, par exemple lors de l'analyse d'enregistrements réalisés dans le cadre du [programme Vigie-Chiro](http://www.vigienature.fr/fr/chauves-souris). + +Les logiciels recommandés dans les tutoriels Vigie-Chiro sont, pour certains, développés uniquement pour Windows. Dans cet article, nous apprendrons comment installer ces logiciels (Kaleidoscope, Syrinx, Batsound 4, 7-zip et Lupas-Rename) sur une machine Linux à l'aide de [Wine](https://winehq.org/). + +_Version traduite et modifiée de la [version en anglais de cet article](/posts/analyse-sound-on-gnulinux-using-wine/) initialement publié en 2021._ + +## Comment installer Wine ? + +Wine est un logiciels qui permet de faire tourner des logiciels Windows (`.exe`) sur un système d'exploitation UNIX comme Linux, ou Mac OS. + +### Sur une machine Debian (et certaines distributions dérivées utilisant `apt` pour la gestion des logiciels) + +On commence par activer le support des paquets 32 bit, si ce n'est pas déjà fait. + +```bash +sudo dpkg --add-architecture i386 +``` + +Ensuite, on télécharge et on installe la clé du dépôt deb de wine: + +```bash +wget -nc https://dl.winehq.org/wine-builds/winehq.key +sudo apt-key add winehq.key +``` + +On ajoute l'adresse du dépôt à la liste des sources, soit directement sur `/etc/apt/source.list`, ou mieux, dans un fichier `/etc/apt/sources.list.d/wine.list` + +```textile +deb https://dl.winehq.org/wine-builds/debian/ bookworm main +``` + +Il faudra peut être modifier le nom de la distribution et le nom de code de la version installée sur votre machine. + +On met à jour la liste des paquets: + +```bash +sudo apt update +``` + +Enfin, on installe wine (on choisit la version stable, qui devrait bien marcher pour ces logiciels). + +```bash +sudo apt install --install-recommends winehq-stable +``` + +### Sur une Fedora, RHEL, et dérivées + +On ajoute le dépôt RPM: + +```bash +dnf config-manager --add-repo https://dl.winehq.org/wine-builds/fedora/39/winehq.repo +``` + +Ici aussi, la version 'fedora39' est à adapter à la version de l'OS que vous avez sur votre machine. + +On installe wine: + +```bash +dnf install winehq-stable +``` + +Pour plus de détails et des informations pour d'autres systèmes, ou davantage à jour: se référer au [wiki de Wine](https://wiki.winehq.org). + +## Installer Kaleidoscope + +Kaleidoscope est disponible pour les distributions basées sur Fedora, comme celles basées sur Debian via le site officiel . Il n'est pas utile d'utiliser wine pour faire fonctionner ce logiciel: il est préférable d'installer les versions adaptées pour votre système si celui-ci est supporté. + +## Installer Syrinx + +Comme beaucoup des logiciels présentés ici, Syrinx n'est pas conçu pour Linux. Nous avons besoin de Wine pour lancer l'exécutable `.exe`. + +Syrinx-PC est disponible depuis le site de Vigie-Chiro, via un lien [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOM0ZfYlpDR2l1cU0/view). Vous aurez aussi besoin des fichiers de configurations proposés par Vigie-Chiro sur [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOQnBhRjNVRFM1Rkk/view). + +Ici, nous avons deux options: +Soit on clique sur le `.exe` et on sélectionne 'Ouvrir avec une autre application', puis on choisit 'Wine Windows Program Loader', soit un lance + +```console +$ wine syrinxalphainst.exe +``` + +depuis le terminal. + +### Configurer un lanceur d'application pour Syrinx + +Pour faciliter le lancement de l'application, on peut créer un fichier `~/.local/share/applications/syrinx.desktop`, dans le dossier 'home' de l'utilisateur: + +```textile +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Syrinx +Comment=Acoustic analysis +Exec=/usr/bin/wine /home/$USER/.wine/drive_c/Program\ Files\ (x86)/syrinx/Syrinx.exe +Icon=/home/$USER/.wine/drive_c/Program Files (x86)/syrinx/img/vigie-chiro.png +Terminal=false +``` + +N'oublier pas de changer `$USER` par votre nom d'utilisateur. +Pour qu'une icône s'affiche dans le lanceur, vous pouvez télécharger l'image [`vigie-chiro.png`](/images/vigie-chiro.png). + +Ensuite, pour analyser les ultrasons avec une fréquence d'échantillonage de 384 kHz en expansion de temps x10 on ouvre le fichier `Configs_syrinx/exp384.dsp` (disponible sur le site du programme Vigie-Chiro); et on clique sur `Load sound file` (`Ctrl+L`) pour charger le fichier `.wav` à analyser. Pour changer de fichier au sein du même dossier, on peut utiliser le raccourcis clavier `alt+ `. Pour plus d'astuces pour manier ce logiciel efficacement, vous pouvez consulter [le tuto vidéo de Charlotte ROEMER](https://www.youtube.com/watch?v=BPPSw2FSLxs). + +## Installer et configurer Batsound 4 + +La procédure est très similaire à celle présentée pour Syrinx PC. On ne détaillera que les points clés. + +### Créer un lancer d'application pour batsound + +Comme pour Syrinx, on crée un fichier `.desktop`: `~/.local/share/applications/batsound.desktop`: + +```textile +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Batsound +Comment=Acoustic analysis +Exec=/usr/bin/wine /home/$USER/.wine/drive_c/Program\ Files\ (x86)/Pettersson/Batsound4/BatSound.exe +Icon=/home/$USER/.wine/drive_c/Program Files (x86)/Pettersson/Batsound4/img/batsound.png +Terminal=false +``` + +(Encore une fois, il ne faut pas oublier de changer `$USER` par votre nom d'utilisateur UNIX.) + +Pour l'icône, vous pouvez télécharger [`batsound.png`](/images/batsound.png), ou un logo officiel depuis le site de l'éditeur du logiciel. + +### Configurer Batsound pour l'analyse d'ultrasons + +Voici un mémo rapide des différents paramètres que j'utilise avec Batsound. + +- Entrer dans le menu `Sound/Sound Format`. + + ![Le menu `Sound/Sound Format`](/images/batsound/enter-sound-format-menu.png) + + - Mettre la valeur `Time expansion` à 10 (ou 1, suivant le paramètrage de votre enregistreur, et si vous avez expansé les enregistrement + - Garder 44100 pour le paramètre `Samples per second` (là aussi, cela peut varier selon le fichier son). + +- Dans le menu `Analysis/Spectrogram Settings - Defaults`: + + ![Le menu `Spectrogram Setting - Defaults`](/images/batsound/spectrogram-settings-default-values.png) + + - Mettre `Max frequency` à `150000`; + - Choisir `Yellow, Red & Blue` pour `Amplitude color mapping`; + - Adapter la valeur `Threshold` en fonction de l'intensité du son enregistré. + - Vous pouvez zoomer. + +Avec un petit enregistrement de pipistrelle de Kuhl (_Pipistrellus kuhlii_), j'ai obtenu le spectrogramme suivant: +![pipkuh spectro](/images/batsound/pipkuh-spectro-batsound.png) + +## Installer 7-zip + +7-zip est utile dans Vigie-Chiro pour compresser les dossiers d'enregistrements traités, afin d'accélérer le téléchargement sur +. + +Il est recommendé d'utiliser l'outil p7zip fourni pour Linux, mais si vous souhaitez suivre le tutoriel de Vigie-Chiro avec l'interface graphique Windows, vous pouvez aussi installer le logiciel 7-zip graphique prévu pour ce système d'exploitation: + +1. Télécharger l'installeur `.exe` depuis [https://www.7-zip.org/](https://www.7-zip.org/) +2. Lancer `7z1900.exe` avec `wine`: + ```console + wine 7z1900.exe + ``` + +## Installer Lupas-Rename + +Lupas-Rename est utilisé dans le tutoriel de Vigie-Chiro, pour faciliter le renommage des fichiers sons suivant le format de nom de fichier des protocoles. Là aussi, il est probablement plus efficace d'utiliser les outils disponible sous votre machine Linux, en ligne de commande ou via un outil graphique proposé par votre distribution, mais néanmoins, voici la procédure qui vous permettrait d'installer Lupas-Rename sur votre machine, toujours à l'aide de `wine`. + +1. Télécharger l'installeur `.exe` depuis +2. Exécuter l'installeur avec wine +3. Suivre la procédure décrite dans le tutoriel pour renommer les fichiers audio... + +## `tadam.py!` pour traiter vos nuits d'enregistrements en une ligne de commande + +J'ai écris un [petit script Python](https://forge.chapril.org/Chiro-Canto/TadaridaTools/src/branch/master/src/tadam.py) qui tente d'automatiser au maximum toute la procédure des fichiers sons brutes, aux archives de son compressées (incluant l'expansion de temps des son, si besoin) destinées au téléchargement sur la plateforme Vigie-Chiro. +Un [petit peu de documentation en français](https://forge.chapril.org/Chiro-Canto/TadaridaTools/src/branch/master/docs/fr/TADAM.md) est disponible dans le même dépôt. + +## ChiroSurf + +[ChiroSurf](https://vigie-chiro.forumactif.com/t108-chirosurf-2-4-analyse-bioacoustique-gratuit-portable-24-04-24) est un logiciel gratuit développé par un bénévole pour le programme Vigie-Chiro. Ce logiciel s'installe bien sur Linux, avec wine et en utilisant le `.exe` (car il n'y a pas de version prévue pour Linux, malheureusement). + +## Conclusion + +Avec tous ces logiciels installés sur votre machine Linux, vous devriez être capable de participer au traitement et à l'analyse des fichiers son pour le protocole Vigie-Chiro, sans quitter votre machine Linux ! + + diff --git a/content/posts/20210325_sound-analysis-on-linux-using-wine.md b/content/posts/20210325_sound-analysis-on-linux-using-wine.md deleted file mode 100755 index ee8ba8e..0000000 --- a/content/posts/20210325_sound-analysis-on-linux-using-wine.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Analyse Sound on GNU/Linux using Wine -author: Samuel Ortion -date: 2021-03-25 -tags: [audio, bat, bird, ultrasound, syrinx, batsound] -lang: en ---- - -After recording bats, orthoptera or birds, it is often necesserary to see the spectrograms of the sounds, for instance while analysing [Vigie-Chiro Program](http://www.vigienature.fr/fr/chauves-souris) bat records - -The software needed to do so are often only for Windows, in the present article, we will learn how to install these softwares (i.e. Kaleidoscope, Syrinx, Batsound 4, 7-zip, Lupas-Rename). - -Install Wine ------------- - -Wine is a software that enable .exe software to run on UNIX systems such as Linux or Mac OS. - -### On Debian and derivatives (Ubuntu...) - -Enable 32 bit packages (if you haven't already): -```bash -sudo dpkg --add-architecture i386 -``` - -Download and install the repository key: - -```bash -wget -nc https://dl.winehq.org/wine-builds/winehq.key -sudo apt-key add winehq.key -``` - -Add the repository to /etc/apt/sources.list or create a wine.list under /etc/apt/sources.list.d/ with the following content: - -```textile -deb https://dl.winehq.org/wine-builds/debian/ buster main -``` - -Update packages - -```bash -sudo apt update -``` - -Install Wine stable - -```bash -sudo apt install --install-recommends winehq-stable -``` - -### On Fedora, RHEL, and derivatives - -Add repository : -```bash -dnf config-manager --add-repo https://dl.winehq.org/wine-builds/fedora/33/winehq.repo -``` - -Install stable package : -```bash -dnf install winehq-stable -``` - -Install Kaleidoscope --------------------- - -Kaleidoscope is available on both fedora and debian based distros at [wildlife acoustics](https://www.wildlifeacoustics.com/). - -Install Syrinx --------------- - -As all following softwares, Syrinx is not available for GNU/Linux, we need Wine to execute the `.exe`. -Syrinx-PC is available at [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOM0ZfYlpDR2l1cU0/view). -You will also need the config files available at [Google Drive](https://drive.google.com/file/d/0B5ZM90wrDzUOQnBhRjNVRFM1Rkk/view). - -You have almost two options : -You can either right click on the `.exe` installer and select `Open with other application` and `Wine Windows Program Loader`, or either run `wine syrinxalphainst.exe` in Terminal. - -### Set up app launcher - -You have to create a new file `.local/share/applications/syrinx.desktop`: -```textile -[Desktop Entry] -Type=Application -Encoding=UTF-8 -Name=Syrinx -Comment=Acoustic analysis -Exec=/usr/bin/wine /home//.wine/drive_c/Program\ Files\ (x86)/syrinx/Syrinx.exe -Icon=/home//.wine/drive_c/Program Files (x86)/syrinx/img/vigie-chiro.png -Terminal=false -``` -Change `` by your username. To have the icon, you can download [`vigie-chiro.png`](/images/vigie-chiro.png). -To analyse ultrasound, with a 384 kHz sampling frequency, we have to open `Configs_syrinx/exp384.dsp`; and next Load sound file (`Ctrl+L`). To switch to other sound file in same folder, we can use `alt+arrows`. For more tips, you can view [the video of Charlotte ROEMER (Fr)](https://www.youtube.com/watch?v=BPPSw2FSLxs). - -Install and Configure Batsound 4 --------------------------------- - -The procedure is quite similar with Syrinx-PC installation. - -### Set up app launcher - -Create a new file `.local/share/applications/batsound.desktop`: - -```textile -[Desktop Entry] -Type=Application -Encoding=UTF-8 -Name=Batsound -Comment=Acoustic analysis -Exec=/usr/bin/wine /home//.wine/drive_c/Program\ Files\ (x86)/Pettersson/Batsound4/BatSound.exe -Icon=/home//.wine/drive_c/Program Files (x86)/Pettersson/Batsound4/img/batsound.png -Terminal=false -``` -(Do not forget to change `` to your username.) - -To have the icon, you can download [`batsound.png`](/images/batsound.png). - -### Configure Batsound to analyse ultrasounds -* Enter the `Sound/Sound Format` menu. - -![Entering `Sound/Sound Forma` menu](/images/batsound/enter-sound-format-menu.png) - -* Change `Time expansion` value to 10 (according to your recorder settings) -* Keep 44 100 as `Samples per second` value. - -* Enter the `Analysis/Spectrogram Settings - Defaults` menu. - -![Entering `Spectrogram Setting - Defaults` menu](/images/batsound/spectrogram-settings-default-values.png) - - -* Change `Max frequency` to `150000`; -* Set `Amplitude color mapping` to `Yellow, Red & Blue`; -* Adapt `Threshold` to sound intensity. - -* You can zoom in. - -With a *Pipistrellus kuhlii* record, I obtain the following spectrogram with the above settings : -![pipkuh spectro](/images/batsound/pipkuh-spectro-batsound.png) - -Install 7-zip -------------- - -7-zip is useful in Vigie-Chiro process to compress audio files for faster upload to [https://vigiechiro.herokuapp.com](https://vigiechiro.herokuapp.com). - -1. Download `.exe` installer at [https://www.7-zip.org/](https://www.7-zip.org/) -2. Execute `7z1900.exe` with wine. - -Install Lupas-Rename --------------------- - -Lupas-Rename is used in Vigie-Chiro protocole to batch rename audio file to add protocoles informations such as pass and square. - -1. Dowload `.exe` installer at [https://rename.lupasfreeware.org/download.php](https://rename.lupasfreeware.org/download.php) -2. Execute installer with wine -3. Batch rename audio files... - -Conclusion ----------- - -With all these functionnal softwares, you are able to perform Vigie-Chiro protocole and sound analysis on GNU/Linux. I look forward to see your participation at [https://vigiechiro.herokuapp.com](https://vigiechiro.herokuapp.com) ! \ No newline at end of file diff --git a/content/posts/20220612_draw_a_plot_in_c.md b/content/posts/20220612_draw_a_plot_in_c.md index 28a69f2..063a0b5 100755 --- a/content/posts/20220612_draw_a_plot_in_c.md +++ b/content/posts/20220612_draw_a_plot_in_c.md @@ -4,6 +4,7 @@ author: Samuel Ortion date: 2022-06-12 tags: [math] lang: en +draft: true --- ## Install plotutils diff --git a/content/posts/20220614_render_equation_in_pelican.md b/content/posts/20220614_render_equation_in_pelican.md index a2a06a5..e39b872 100755 --- a/content/posts/20220614_render_equation_in_pelican.md +++ b/content/posts/20220614_render_equation_in_pelican.md @@ -6,6 +6,7 @@ tags: [math, latex, pelican] slug: rendering-latex-pelican author: Samuel Ortion lang: en +draft: true --- Rendering $\LaTeX$ formulas in Pelican is easy. diff --git a/content/posts/20220619_install_gephi_on_linux.md b/content/posts/20220619_install_gephi_on_linux.md index cfbdb34..c30e55b 100755 --- a/content/posts/20220619_install_gephi_on_linux.md +++ b/content/posts/20220619_install_gephi_on_linux.md @@ -1,24 +1,24 @@ --- title: Install Gephi on Linux date: 2022-06-19 -lastmod: 2022-06-19 +lastmod: 2024-05-18 tags: [graph, visualization, linux] slug: install-gephi-on-linux author: Samuel Ortion lang: en +draft: true --- Gephi is a software package for graph visualization. Let's install it on Linux. ## Install Gephi +Don't forget to update the release version in the URL, as well as in the resulting decompressed folder name. + ```bash -su - # Switch to root -cd /opt/ -wget https://github.com/gephi/gephi/releases/download/v0.9.5/gephi-0.9.5-linux-x64.tar.gz -o +wget https://github.com/gephi/gephi/releases/download/v0.9.5/gephi-0.9.5-linux-x64.tar.gz tar -xzf gephi-0.9.5-linux-x64.tar.gz -rm gephi-0.9.5-linux-x64.tar.gz -cd gephi-0.9.5 +sudo mv gephi-0.9.5 /opt/gephi ``` Now you could use it by running `./bin/gephi` in the terminal. @@ -27,27 +27,21 @@ Now you could use it by running `./bin/gephi` in the terminal. For an easier access, you could add a desktop entry to your menu. +In `/home/$USER/.local/share/applications/gephi.desktop`: ```text -// /home/$USER/.local/share/applications/gephi.desktop [Desktop Entry] Name=Gephi Comment=Launch Gephi -Path=/opt/gephi-0.9.5/ -Exec=/opt/gephi-0.9.5/bin/gephi +Path=/opt/gephi/ +Exec=/opt/gephi/bin/gephi Terminal=true Type=Application -Icon=gephi.jpg +Icon=gephi-tool-icon-200x200-1.jpg StartupNotify=true Categories=Development;Education; Keywords=graph; ``` -And download a logo for your application. - -```bash -cd /opt/gephi-0.9.5/ -wget https://dighumlab.org/wp-content/uploads/2020/03/gephi-tool-icon-200x200-1.jpg -o gephi.jpg -``` That's it ! diff --git a/content/posts/20221001_run_stable_diffusion_on_colab_fr.md b/content/posts/20221001_run_stable_diffusion_on_colab.fr.md similarity index 100% rename from content/posts/20221001_run_stable_diffusion_on_colab_fr.md rename to content/posts/20221001_run_stable_diffusion_on_colab.fr.md diff --git a/content/posts/20230205_astuce_copier_text_presse_papier_linux_fr.md b/content/posts/20230205_astuce_copier_texte_presse_papier_linux_fr.md similarity index 100% rename from content/posts/20230205_astuce_copier_text_presse_papier_linux_fr.md rename to content/posts/20230205_astuce_copier_texte_presse_papier_linux_fr.md diff --git a/content/posts/20230329_analyze_programming_languages_using_github-linguist.md b/content/posts/20230329_analyze_programming_languages_using_github-linguist.md index 583ce67..8077ade 100755 --- a/content/posts/20230329_analyze_programming_languages_using_github-linguist.md +++ b/content/posts/20230329_analyze_programming_languages_using_github-linguist.md @@ -172,4 +172,4 @@ ggplot(data = languages_count_df, aes(x = reorder(language, count), y = count)) ggsave("linguist-project-count.png", width = 10, height = 5) ``` -bar plots of languages I used, according to github-linguist +bar plots of languages I used, according to github-linguist diff --git a/content/posts/20230618_classify_blood_cells_using_neural_networks.md b/content/posts/20230618_classify_blood_cells_using_neural_networks.md index 3c07e34..ef9c791 100755 --- a/content/posts/20230618_classify_blood_cells_using_neural_networks.md +++ b/content/posts/20230618_classify_blood_cells_using_neural_networks.md @@ -7,6 +7,7 @@ slug: classify-blood-cells-using-neural-networks author: Samuel Ortion Summary: Machine Learning is widely used for image recognition. Here, we tried to perform blood cell classification using Convolutional Neural Networks. lang: en +draft: true --- ## Introduction diff --git a/content/posts/20240114_unixfu.org b/content/posts/20240114_unixfu.org index 076431e..0c57662 100755 --- a/content/posts/20240114_unixfu.org +++ b/content/posts/20240114_unixfu.org @@ -2,7 +2,7 @@ #+date: <2024-01-14 Sun> #+category: linux -A bin for some useful UNIX command. +A bean for some useful UNIX command snippets. * Add two hours diff --git a/content/posts/20240309_pseudocode_in_hugo.md b/content/posts/20240309_pseudocode_in_hugo.md index 9e33996..429fd7a 100644 --- a/content/posts/20240309_pseudocode_in_hugo.md +++ b/content/posts/20240309_pseudocode_in_hugo.md @@ -13,19 +13,9 @@ Here is what I did to make this working on my blog. In your theme files, you will first need to add link to the library CDN. ```html - - diff --git a/content/posts/20240313_eulerian_path_Hierholzer.md b/content/posts/20240313_eulerian_path_Hierholzer.md new file mode 100644 index 0000000..e2ac5de --- /dev/null +++ b/content/posts/20240313_eulerian_path_Hierholzer.md @@ -0,0 +1,135 @@ +--- +title: Find an Eulerian Path with the Hierholzer Algorithm +date: 2024-03-13 +pseudocode: true +slug: hierholzer-algorithm +draft: true +--- +An Eulerian path of a graph is a path that passes once on every edge of the graph. + +The Hierholzer algorithm allows to find this path. + +The algorithm proceeds as follows: +1. Choose any vertex $v_0$ of the graph $G = (V, E)$. Starting from $v_0$, build a path $c$ that passes only once per edge until it reaches $v_0$ again. +2. If $c$ is an Eulerian cycle, we have found the Eulerian path, else + - Ignore all edges from $c$. + - For the first vertex $u$ from $c$ whose degree is not null, build an other cycle $c'$ that passes only once per edges, and does not pass in the previously visited edges. + - Insert $c'$ in $c$ by replacing the starting node $u$. + - Repeat the second step until we have an Eulerian path. + + +## Pseudocode +
+\begin{algorithm}
+\caption{Hierholzer algorithm for Eulerian path finding}
+\begin{algorithmic}
+\Function{EulerianPath}{$G: (V, E)$} 
+\State $c \gets$ an empty Doubly Linked List
+\State $E' \gets E$
+\State $v_0$ becomes the first vertex from $V$
+\State $u \gets v_0$
+\State \Comment{Find the first cycle}
+\While{$\exists (u, v) \in E'$}
+    \State $c$.insert($u$)
+    \State $u \gets v$
+    \State $E' \gets E' \setminus \{(u, v)\}$
+    \If {$u = v_0$}
+        \Break
+    \EndIf
+\EndWhile
+\State \Comment{Add the other cycles}
+\While {$c$.length $< |E|$}
+\State \Comment{Find the next vertex with non null degree}
+\State $v_0 \gets c$.value
+\While {$\nexists (v_0, v) \in E'$}
+\State $c \gets c$.next
+\State $v_0 \gets c$.value
+\State $u \gets v_0$
+\EndWhile
+\State \Comment{Insert the next cycle in $c$}
+\State $c$.delete() \Comment{Ensure $v_0$ is not present twice there}
+\While {$\exists (u, v) \in E'$}
+    \State $c$.insert($u$)
+    \State $u \gets v$
+    \State $E' \gets E' \setminus \{(u, v)\}$
+    \If {$u = v_0$}
+    \Break
+    \EndIf
+\EndWhile
+\EndWhile
+\EndFunction
+\end{algorithmic}
+\end{algorithm}
+
+ +## Rust implantation + +```rust +use std::collections::{HashMap, LinkedList}; +use std::io::Error; + +/// Eulerian path +/// +/// Warning: this assumes the graph is Eulerian +fn eulerian_path(graph: HashMap>) -> Option> +{ + let mut n_edges: usize = 0; + for adj_list in graph.values() { + n_edges += adj_list.len(); + } + let mut graph = graph.clone(); + let mut cycle: LinkedList = LinkedList::new(); + let v_0: usize = *graph.keys().next().unwrap(); + let mut visited_edges: usize = 0; + let mut u: usize = v_0; + loop { + cycle.push_back(u); + let adj_list = graph.get_mut(&u).unwrap(); + visited_edges += 1; + if adj_list.len() > 0 { + let v = adj_list.pop().unwrap(); + u = v; + } else { + return None; + } + if u == v_0 { + break; + } + } + while visited_edges < n_edges { + // Find the next vertex with non null degree + let mut v_0 = cycle.front().unwrap().clone(); + while graph.get(&v_0).unwrap().len() == 0 { + v_0 = cycle.front().unwrap().clone(); + // Move to the next vertex without removing it from the cycle, with rotation + let v = cycle.pop_front().unwrap(); + cycle.push_back(v); + } + // Insert the next cycle in c + cycle.pop_back(); + let mut u = v_0; + loop { + cycle.push_back(u); + let adj_list = graph.get_mut(&u).unwrap(); + visited_edges += 1; + if adj_list.len() > 0 { + let v = adj_list.pop().unwrap(); + u = v; + } else { + return None; + } + if u == v_0 { + break; + } + } + } + Some(cycle) +} +``` + + + +## References + +- _Algorithmus von Hierholzer_ (de), Wikipedia, . +- _Eulerkreisproblem_ (de), Wikipedia, diff --git a/content/posts/20240415_permutations.md b/content/posts/20240415_permutations.md new file mode 100644 index 0000000..31fbd85 --- /dev/null +++ b/content/posts/20240415_permutations.md @@ -0,0 +1,28 @@ +--- +title: "Mixed-radix generation -" +author: ["Samuel Ortion"] +date: 2024-04-15T00:00:00+02:00 +draft: true +pseudocode: true +--- + +In its draft on Generating all \\(n\\) tuples, of The Art of Computer Programming, Knuth presents the following algorithm for the generation of $n$-tuples (Knuth 2002). + +
+    \begin{algorithm}
+    \caption{Mixed-radix generation}
+    \begin{algorithmic}
+    \State \textbf{M1.} [Initialize.] Set $a_j \gets 0$ for $0 \leq j \leq n$, and set $m_0 \gets 2$.
+    \State \textbf{M2.} [Visit.] Visit the \(n\)-tuple $(a_1, ..., a_n)$ (The program that wants to examine all $n$-tuples now does its thing.)
+    \State \textbf{M3.} [Prepare to add one.] Set $j \gets n$.
+    \State \textbf{M4.} [Carry if necessary.] If $a_j = m_j - 1$, set $a_j \gets 0$, $j \gets j - 1$ and repeat this step.
+    \State \textbf{M5.} [Increase, unless done.] If $j = 0$, terminate the algorithm. Otherwise set $a_j \gets a_j + 1$ and go back to step M2.
+    \end{algorithmic}
+    \end{algorithm}
+
+ +## References + +
+
Knuth, Donald E. 2002. A Draft of Section 7.2.1.1: Generating All N-Tuples. Vol. 4a. 5 vols. The Art of Computer Programming.
+
diff --git a/content/sigmulus.png b/content/sigmulus.png deleted file mode 100755 index 67d92425ea5390ac2a6f5fffd389a7198025e2bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24676 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�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 +#+category: taocp +#+pseudocode: true +#+bibliography: references.bib +#+slug: taocp/permutations +#+hugo_draft: true + +#+hugo_front_matter_format: yaml +#+hugo_base_dir: ../../ +#+hugo_custom_front_matter: :pseudocode true + +In his draft on Generating all $n$ tuples, of The Art of Computer Programming, Knuth presents the following algorithm for the generation of $n$-tuples [cite:@knuthDraftSectionGenerating2002]. +#+begin_export html +
+    \begin{algorithm}
+    \caption{Mixed-radix generation}
+    \begin{algorithmic}
+    \State \textbf{M1.} [Initialize.] Set $a_j \gets 0$ for $0 \leq j \leq n$, and set $m_0 \gets 2$.
+    \State \textbf{M2.} [Visit.] Visit the \(n\)-tuple $(a_1, ..., a_n)$ (The program that wants to examine all $n$-tuples now does its thing.)
+    \State \textbf{M3.} [Prepare to add one.] Set $j \gets n$.
+    \State \textbf{M4.} [Carry if necessary.] If $a_j = m_j - 1$, set $a_j \gets 0$, $j \gets j - 1$ and repeat this step.
+    \State \textbf{M5.} [Increase, unless done.] If $j = 0$, terminate the algorithm. Otherwise set $a_j \gets a_j + 1$ and go back to step M2.
+    \end{algorithmic}
+    \end{algorithm}
+
+#+end_export + +In this document, I try to implement this algorithm in C. + + +#+begin_src C +#include +#include + +void print_array(unsigned short int *a, size_t n) { + for (size_t i=0; i < n; i++) { + printf("%d", a[i]); + if (i < n - 1) { + printf(", "); + } else { + printf("\n"); + } + } +} + +/** Apply function fun on the generated permutations + ,*/ +void mixed_radix(const size_t n, void (*fun)()) { + // Initialize + unsigned short int a[n]; + unsigned short int m_0 = 2; + // Visit + fun(a); + // Prepare to add one + size_t j = n; + // Carry if necessary + if (a[j] == ) +} + +void main() { + const size_t n = 4; + unsigned short int a[n]; + print_array(a, n); +} +#+end_src + +#+RESULTS: +| 0 | 0 | 0 | 0 | + +#+print_bibliography: diff --git a/org/taocp/references.bib b/org/taocp/references.bib new file mode 100644 index 0000000..7364f93 --- /dev/null +++ b/org/taocp/references.bib @@ -0,0 +1,10 @@ +@mvbook{knuthDraftSectionGenerating2002, + title = {A Draft of Section 7.2.1.1: Generating All n-Tuples}, + author = {Knuth, Donald E.}, + date = {2002-03-30}, + series = {The {{Art}} of {{Computer Programming}}}, + volume = {4a}, + langid = {english}, + pagetotal = {200}, + volumes = {5} +} diff --git a/sync.sh b/sync.sh index 0cbfd76..8fda1e5 100644 --- a/sync.sh +++ b/sync.sh @@ -1,2 +1,2 @@ #!/usr/bin/env bash -rsync -avzu --delete ./public/ root@samuel.ortion.fr:/var/www/blog.samuel.ortion.fr/ \ No newline at end of file +rsync -avzu --delete ./public/ sortion@samuel.ortion.fr:/var/www/blog.samuel.ortion.fr/ diff --git a/themes/mus b/themes/mus index 77fdac9..2b9c735 160000 --- a/themes/mus +++ b/themes/mus @@ -1 +1 @@ -Subproject commit 77fdac90ad06d76c8e5b42db74fc2cfbb513e185 +Subproject commit 2b9c7350f28fb803fdfab6d2bec510cefa35d2fd