L’affaire pingouin

Cher journal, cet après midi en traînant dans les rayons enfants de la bibliothèque je tombe sur un livre «imagier» nommé «Pingouin ou manchot».

Un livre qui rétablit la vérité sur les manchots et les pingouins !

La vérité éclate au grand jour

Voila qui nous rappel le site «l’affaire pingouin». En rentrant je me suis donc rué sur mon pc (oui je suis un vieux qui préfère utiliser un clavier plutôt que de caresser son téléphone pour «surfer» sur «l’»internet ) et quelle ne fut pas ma déception de découvrir que le site de l’affaire n’existe plus !

Un complot ourdit par de sombres individus chercherait-il à faire taire cette lourde vérité ?

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Connecteur batterie lampe vélo

Les connecteurs de batteries de ce genre de lampe vélo sont vraiment très dures à déconnecter.

On a tendance à tirer sur le câble et à l’arracher. La solution simple pour éviter ça est de donner un petit coup de pince coupante dans le manchon :

Une petite fente dans le manchon et le tour est joué

La déconnexion est grandement facilité sans affecter réellement la connexion.

Publié dans Non classé | Marqué avec , , , , | Laisser un commentaire

Vidanger un lave-linge LG bouché

Comment faire pour vidanger un lave-linge qui est bouché. Sur le LG 8kg il y a une petite trappe en bas à droite. Si on l’ouvre on peut sortir un tuyau de caoutchouc et le déboucher pour récupérer l’eau du tambour.

Seulement voila, le tuyau est tout en bas de la machine à laver, et la capacité du tambour est de plusieurs dizaine de litres.

La solution adoptée peut-être d’utiliser un bac «plat» de peinture pour rouleau, puis d’écoper dans un seau à coté. Comme ça prend du temps, on hésitera pas à utiliser un timer pour laisser couler.

On fait avec ce qu’on a

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Déballage du CH32V003, le microcontrôleur à 0.1$

Après avoir commandé un kit de développement CH32V003 sur Tindie, voici qu’il m’arrive par courrier (avec taxes douanière) ce matin dans ma boite aux lettres.

Les deux carte de développement

D’après ce que j’ai compris, il est nécessaire d’avoir la sonde de debug en plus pour pouvoir la programmer. Il va donc falloir que j’attende le deuxième colis pour pouvoir réellement jouer avec.

Ça ne nous empêche pas de la brancher.

Une led PWR allumé en rouge et une led D1 qui clignote en rouge. Mais rien sur la console linux (dmseg)

Le kit semble fonctionner, les LED s’allument. Cependant nous n’avons rien sur la console Linux, ce qui n’est pas étonnant vu que les deux résistance de shunt de l’USB ne sont pas soudées 😉

Prise en main

WCH propose un logiciel chinois nommée MounRiver pour développer sur son composant. Le logiciel semble accessible en téléchargement au format d’archive xz. On le décompresse avec tar -Jxvf puis on installe les dépendances (Mint) suivante:

$ sudo apt install libgtk-3-0 libgtk-3-dev
$ rulo apt-get install ia32-libs-gtk
$  sudo apt install libatk-wrapper-java libatk-wrapper-java-jni 

Pour le lancer il suffit d’executer le «script d’installation» une première fois puis de lancer le binaire :

$ tar -Jxvf /home/fabien/projets/ch32v003/downloads/MounRiver_Studio_Community_Linux_x86_V130.tar.xz
$ cd MounRiver_Studio_Community_Linux_x86_V130/beforeinstall
$ ./start.sh 

Copy Libs
[sudo] Mot de passe de user :        
Register new Libs
copy rules
Reload rules
DONE
$ cd ../MRS_Community/
$ ./MounRiver\ Studio_Community 
Saisie d’écran de l’éclipse chinois «mounriver»

Téléchargement du firmware

Pour le moment j’en suis à tenter de télécharger le firmware d’exemple (GPIO_Toggle) dans le micro.

Board chip Status error!

Toolchain «standalone»

La toolchain quand à elle est proposée en téléchargement sur le site du même éditeur.

Pour l’utiliser il suffit de télécharger l’archive MRS_Toolchain_Linux_x64_V1.60.tar.xz et de la décompresser :

$ tar -Jxvf MRS_Toolchain_Linux_x64_V1.60.tar.xz 

Un README explique la marche à suivre pour l’installer.

Les tentatives d’accès au micro avec openocd ne sont pas beaucoup plus fructueuses :

$ cd MRS_Toolchain_Linux_x64_V1.60/OpenOCD/bin
$ ./openocd -f wch-riscv.cfg
Open On-Chip Debugger 0.11.0+dev-02215-gcc0ecfb6d-dirty (2022-10-10-10:35)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : WCH-LinkE-CH32V307  mod:RV version 2.7 
Error:  WCH-Link failed to connect with riscvchip
Error:  1.Make sure the two-line debug interface has been opened. If not, set board to boot mode then use ISP tool to open it
Error:  2.Please check your physical link connection

Ressources

Publié dans Non classé | Marqué avec , | Laisser un commentaire

fullpath

Quand on fait une recherche d’un fichier avec fd il nous donne le path du fichier trouvé à partir du répertoire courant:

$ cd /sys/class/
$ fd -I hiddev0
usbmisc/hiddev0

Si l’on veut copier coller le chemin complet du fichier pour l’utiliser dans une quelconque interface graphique (pièce jointe de mail, fichier de configuration de son IDE, …) alors il faut concaténer le répertoire courant (pwd) avec le chemin trouvé.

On peut se faire une fonction bash pour ça, dans son .bashrc :

# give the full path for a file given in arg
fullpath() {
    echo $(pwd)"/"$1
}

Pour l’utiliser il suffit de donner le path trouvé :

$ fullpath usbmisc/hiddev0
/sys/class/usbmisc/hiddev0

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Trouvé sur : https://iximiuz.com/en/posts/ssh-tunnels/

Pense bête tunnel ssh

Publié le par admin | Laisser un commentaire

Ma config neovim

Cher blog, je suis en train de migrer vers neovim. Voici donc une prise de notes pour la config.

fichier de config

Ça n’est plus .vimrc, maintenant c’est bien rangé dans ~/.config/nvim/init.vim Le miens est constitué ainsi pour le moment :

" me
let g:Author = "Jean-Paul Martoni"
let g:EmailAuthor = "Moi je dit qu'il @ bluff"

" pour avoir le mulot
set mouse=a

"enregistrer sans help
map <F1> :wall<CR>
imap <F1> <ESC>:wall<CR>i

map <F1> :wall<CR>

set textwidth=80

filetype plugin on
" Alternative: use the following to also enable language-dependent indenting.
" filetype plugin indent on

lua require('plugins')

" better tab completion :
set wildmode=longest,list

" my standard tab config
set tabstop=4
set shiftwidth=4
set expandtab

Sensibilité à la casse de la recherche

Par défault neovim est sensible à la casse, ce qui n’était pas le cas de mon ancien vim. Par contre si on place une majuscule dans le mot recherché, vim devenait sensible à la casse. C’est le «smartcase». Pour obtenir se comportement il suffit d’ajouter cette ligne à son init.vim :

" case search
set ignorecase smartcase

Copier coller clique milieu

Pour faire fonctionner le copier/coller clique milieu depuis un autre programme il faut ajouter la ligne suivante à son fichier de config :

set clipboard+=unnamedplus

Par contre pour le moment ça ne fonctionne pas dans l’autre sens (neovim -> autre programme)

Paramètres d’indentations spécifique à un langage

Pour définir mes propres paramètres pour chaque langages j’utilise ftplugin que j’active dans init.vim :

filetype plugin on

Puis j’ajoute mes config dans le fichier de configuration portant le nom du langage. Par exemple, pour avoir des «TAB» transmuté en deux espaces en C++, j’ajoute les lignes suivantes dans le fichier ~./config/nvim/ftplugin/cpp.vim :

set tabstop=2
set shiftwidth=2
set expandtab

Problèmes

Les problèmes que j’ai encore à résoudre sont :

  • Je n’ai pas l’historique du shell quand je relance une commande avec «:!»

Publié dans Non classé | Marqué avec , | Laisser un commentaire

Ma vieille contour HD 1080p

Petite page de prise de notes sur la caméra contour HD 1080p qui n’est plus commercialisée.

C’est la caméra qui m’a servie à faire quelques vidéos en parapente dont celle-ci.

Je l’ai ressorti de mes cartons car je voudrais m’en servir de «dashcam» à vélo.

Linux

Si on branche l’usb avec une carte sd enfichée dans son lecteur on obtient la trace suivant (notez le magnifique numéro de série !)

 master+* 22h35m13s ± sudo dmesg
[40678.767336] usb 3-2: new high-speed USB device number 7 using xhci_hcd
[40678.918703] usb 3-2: New USB device found, idVendor=115b, idProduct=a271, bcdDevice= 0.00
[40678.918714] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[40678.918718] usb 3-2: Product: Mass Storage
[40678.918721] usb 3-2: Manufacturer: ContourHD
[40678.918723] usb 3-2: SerialNumber: 0123456789
[40678.919202] usb-storage 3-2:1.0: USB Mass Storage device detected
[40678.919625] scsi host2: usb-storage 3-2:1.0
[40679.941353] scsi 2:0:0:0: Direct-Access              ContourHD 1080        PQ: 0 ANSI: 0
[40679.941868] sd 2:0:0:0: Attached scsi generic sg0 type 0
[40679.945665] sd 2:0:0:0: [sda] 61067264 512-byte logical blocks: (31.3 GB/29.1 GiB)
[40679.946712] sd 2:0:0:0: [sda] Write Protect is off
[40679.946717] sd 2:0:0:0: [sda] Mode Sense: 87 00 00 08
[40679.947828] sd 2:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[40679.957863]  sda: sda1
[40679.963572] sd 2:0:0:0: [sda] Attached SCSI removable disk

La caméra est vue comme un «mass storage» qui est parfaitement lisible sous Linux.

L’insertion d’une carte SD vierge provoque son formatage par la caméra avec la création des fichiers et répertoires suivant :

 $ tree
.
├── DCIM
│   └── 100MEDIA
│       └── FILE0001.MOV
├── FW_RTC.txt
└── MISC

Et le fichier de configuration créé contient les informations suivantes :

FW version:1080 v1.17

SW HI:	A
SW LO:	B
BR:	M
EV:	-1
SHRP:	3
AE:	C
CTST:	56
MIC:	33
Zone:	+02
RTC:	2008/01/01 00:16:36

Format:
SW HI	A:1920x1080 30fps
	B:1280x960 30fps
	C:1280x720 60fps
	D:1280x720 30fps

SW LO	A:1280x720 60fps
	B:1280x960 30fps
	C:1280x720 30fps
	D:848x480 60fps

BR	M:Max
	H:High
	D:Default

EV	-4~4

SHRP	1~5

AE	C:Center
	A:Average
	S:Spot

CTST	1~255

MIC	0~59dB

Zone	-12~+13

RTC	YYYY/MM/DD hh:mm:ss
	YYYY : 2008 - 2099
	MM : 01 - 12
	DD : 01 - 31

On doit pouvoir ce servir de ce fichier pour configurer la caméra je pense. Notamment pour la remettre à la bonne date/heure. Ce qui est important pour faire une dashcam.

FW_RTC.txt

Une discussion sur un forum sur la modification de la configuration avec le fichier.

Publié dans Non classé | Marqué avec , | Laisser un commentaire

Découverte de déchets nucléaires vieux de 2 milliards d’années

Un des reproche qui est souvent fait à l’enfouissement des déchets nucléaires est qu’on ne sera plus là pour les gérer. On les laisse à nos arrière-arrière-etc petits enfants.

Leur dangerosité subsistera pendant des centaines de milliers d’années et les générations futurs ne seront pas capable de gérer un tel fardeau. Et puis, a-t-on le droit de leurs laisser un tel fardeau, personne ne nous a laissé de déchets nucléaires nous !

Personnes certes.

Mais des déchets nucléaires vieux de plusieurs milliards d’années ont déjà été découvert sur terre ! Et on parle bien ici de déchets nucléaires issue de la fission de l’uranium dans des réacteurs nucléaire. Le fameux plutonium et autres transuraniens qui n’existent pas (tout à fait) à l’état naturel.

C’est en 1972 que le physicien Francis Perrin découvre que la mine d’uranium d’Oklo au Gabon renferme des restes de réacteurs nucléaires ayant fonctionné il y a environ 2 milliards d’années.

Et vous savez quoi ? Et bien il n’y a pas eu de grave contamination mondiale à la découverte. Notre civilisation décadente n’a pas été exterminée par la mise au jours de tout ce plutonium.

Non seulement nous avons su les gérer, mais en plus nous avons pu constater que les «déchets» nucléaire ne migrent pas tellement même quand ils sont pris dans le flux d’eau d’une rivière souterraine.

Bref, la dangerosité des déchets nucléaires pour notre civilisation et pour les prochaines restent nettement moins préoccupantes que les énergies fossiles. Énergies qui n’attendent pas des milliers d’années pour détruire notre climat et remettre en cause notre mode de vie.

Publié dans Non classé | Marqué avec , , , , , | Laisser un commentaire

Retour de String en Rust

Alors voila, je veux écrire une fonction qui appelle une commande shell et retourne la chaîne de caractères.

Avec la cagette standard std::process::Command c’est plutôt simple il suffit de faire ça :

use std::process::Command;
//..
    let _cmdret = Command::new("cd-discid")
                            .output()
                            .expect("La commande cd-discid a échouée");
  
//..

L’affichage de _cmdret avec un println! qui va bien me donne la forme de la structure retournée :

println!("{:?}", &_cmdret);
//:Sortie ->
Output { status: ExitStatus(unix_wait_status(0)), stdout: "30027f05 5 150 2422 15072 29219 44022 641\n", stderr: "" }

Pour le moment c’est assez simple, si je veux récupérer la chaîne de caractères, il me suffit de prendre le champs stdout :

println!("{:?}", &_cmdret.stdout);
//...
[51, 48, 48, 50, 55, 102, 48, 53, 32, 53, 32, 49, 53, 48, 32, 50, 52, 50, 50, 32, 49, 53, 48, 55, 50, 32, 50, 57, 50, 49, 57, 32, 52, 52, 48, 50, 50, 32, 54, 52, 49, 10]

Rhaa, mais pourquoi ça s’est transformé en vecteur de u8 ?!

Allons bon, convertissons avec std::str :

use std::str
///
    println!("{:?}", str::from_utf8(&_cmdret.stdout));
///sortie ->
Ok("30027f05 5 150 2422 15072 29219 44022 641\n")

On obtient donc une sortie de type Result non ? Notre fonction doit pouvoir s’écrire comme ça alors :

/// Lit le numéro unique du CD se trouvant dans le lecteur
pub fn get_discid() -> Result<String, Box<dyn Error>> {
    let _cmdret = Command::new("cd-discid")
                            .output()
                            .expect("La commande cd-discid a échouée");

    str::from_utf8(&_cmdret.stdout)
}

Sauf que non, ce que je croyais être un enum «Result» c’est transformé en une chaîne de caractères &str :

22 |     str::from_utf8(&_cmdret.stdout)
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found `&str`

Rajoutons un Ok() pour lui faire plaisir alors :

22 |     Ok(str::from_utf8(&_cmdret.stdout))
   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found enum `Result`

Et c’est là que je commence à perdre pied, bin oui t’as trouvé un enum Result, puisque c’est ça que j’attends en retour patate !

En browsant désespérément le web j’ai cru trouver qu’il fallait faire un match sur l’enum pour retourner un nouvel enum (mais j’ai pas compris pourquoi le premier ne convenait pas):

/// Lit le numéro unique du CD se trouvant dans le lecteur
pub fn get_discid() -> Result<String, Box<dyn Error>> {
    let _cmdret = Command::new("cd-discid")
                            .output()
                            .expect("La commande cd-discid a échouée");

    match str::from_utf8(&_cmdret.stdout) {
        Ok(v) => Ok(v.to_string()),
        Err(e) => Err(e.into())
    }
}

À noter qu’il est possible de remplacer le to_string() en into() dans le Ok() mais pas pour le Err().

Bon maintenant ça marche. Mais il me reste un goût amer de celui qui n’a pas compris ce qu’il a écrit. Et j’ai la désagréable impression d’avoir tartiné du code pour pas grand chose !

On doit pouvoir faire plus simple non ?

Bref, la route est encore longue, et c’est pas ce soir que je verrais mes recettes d’histoires terminées 😉

Publié dans Non classé | Marqué avec , , , | 2 commentaires