Logo Git

Tips to dig into git log

Publié dans Développement | Laisser un commentaire

I am a regular user of git dag <sourcefilepath> to check all commits applying on a single source file. You can also do it with gitk <sourcefile> but I always find git dag more convenient.

git dag interface

Recently, I had to check the changes made on a specific line of a source file. I started digging into 7 years of commits… and obviously it was time to search for a better option 🙂

Fortunately, git log is really powerful.

First you can list commits with an impact on a specific function using the -L option. The diff are display immediately which is pretty handy. For example: git log -L:sendTcpRequest:src/evcc/Evcc.cpp. The -L option be used for numerous other stuff, please check git log --help.

This was still listing dozen of diff. The -G option allows to directly search on all the diffs and list related commit. For example git log -G "flush" Evcc.cpp was listing me 3 commits with a diff containing the word « flush ».

Plus de folie avec les QThread

Publié dans C / C++ | Laisser un commentaire

La programmation avec des threads est complexe et ne doit jamais être prise à la légère. Tête froide, mutex et variables atomiques sont de rigueur si on veut s’éviter les affres de l’horreur.

Qt peut nous simplifier la vie. Il peut nous y aider en tout cas. Mais. Oui il y a un mais. En regardant la documentation disponible sur Internet, c’est le bazar car : il y a bien longtemps, entre Qt 4.4 et Qt 4.7, on utilisait les mêmes noms de méthodes (run) pour quelque chose de différent ! Du coup, même aujourd’hui on trouve de tout sur le Web.

Voici quelques conseils en vrac avant de pointer vers de la documentation intéressante.

Conseils en vrac

  • Si cela ne vous parle pas, allez regarder les définitions de thread-safe et re-entrant. En fait, renseignez-vous sur les threads avant d’utiliser les QThreads, vous gagnerez du temps.
  • Un QObject appartient au thread dans lequel il est créé, ou dans lequel il est déplacé (mais dans ce cas, il ne peut avoir de parents)
    • Corolaire : les enfants d’un QObject vivent dans le même thread que leur parent. Mais attention, les variables membres ne deviennent pas automatiquement enfant de leur QObject ! (bigre)
  • Si la notion de QEventLoop Qt ne vous parle pas, renseignez-vous !
  • De manière assez logique, on peut appeler tranquillement un QObject via plusieurs thread, donc la même fonction d’une même classe peut être appelée par différents threads. En général on évite. Pour faire de la communication inter-thread, le plus safe est d’utiliser les signaux / slots en mode QueueConnection (mode par défaut dans ce cas). Si le thread A émet un signal variableChanged(int), ce signal peut être catché par une classe dans le thread principal via un slot handleVariableChanged(int). Voir QueuedConnection
  • En fait, si on ne fait pas gaffe, notamment si on n’utilise pas les signaux / slots, ou si on utilise le mode DirectConnection, on peut sans se rendre compte avoir plusieurs threads qui modifient en même temps la même donnée. Le mécanisme de protection de base, c’est les mutex (QMutexLocker et QMutex sont vos amis). Mais on peut aussi jouer avec les variables atomiques. Plus difficile, pas toujours possible, mais indispensable si on veut éviter de manière fiable les interlocks.
  • Pour utiliser les signaux / slots entre thread, il faut au préalable s’assurer que les paramètres des signaux soient bien enregistrés avec Q_DECLARE_METATYPE(Type) et qRegisterMetaType<Type>(). Sans cela, en QueuedConnection le slot ne serait juste pas appelé (dommage, try again).
  • D’une manière générale, je préconise d’utiliser QConcurrent et QFutureWatcher qui encapsule le comportement des QThreads. C’est mieux, plus simple et presque toujours possible. Je ne suis pas le seul à le préconiser, c’est la doc Qt qui le dit.
  • Si on doit utiliser directement QThread, alors la lecture de la doc Qt et des articles de Maya et FabienPN est fortement encourager.

Continuer la lecture

Logo KDE

X11, SDDM, Kwin et Plasma desktop

Publié dans Geekeries | Laisser un commentaire

Cinq mois après mes mésaventures suites à une mise à jour Debian/KDE testing, rebelote, j’ai à nouveau un problème suite à une mise à jour classique. Ce qui n’est pas si étonnant quand on utilise testing, surtout que testing a switché assez récemment sur bookworm.

Les symptômes très classiques : la page de login s’affiche, je m’authentifie, la page de chargement de Plasma KDE s’affiche, le loader tourne puis s’arrête au bout de quelques secondes et… voilà ! J’ai la souris, mais pour le reste c’est figé sur l’écran de chargement.

J’ai fini par trouver quel était le problème (incompatibilité temporaire entre kwin et kdecorator), mais voici les étapes par lesquels j’ai dû passer, pour finalement trouver la réponse sur un rapport de bug dans une mailing list Debian. J’en sais désormais d’avantage sur SDDM, X11, Kwin et le montage du bureau.

Au delà de l’analyse de sa machine, le bon réflexe à avoir c’est de regarder la liste des bugs en cours sur Debian : le portail des bugs et son moteur de recherche.

Continuer la lecture

Copier / coller un tableau HTML

Publié dans HTML et CSS | Laisser un commentaire

Il existe une astuce pour copier / coller un tableau HTML d’un navigateur vers un fichier Excel (par exemple).

De base, si je sélectionne un tableau avec ma souris, la sélection s’effectue ligne par ligne.

Pratique pour copier un tableau entier. Mais embêtant lorsque l’on ne souhaite copier que quelques colonnes comme c’est mon cas ici.

Dans ce cas, pendant la sélection, il faut appuyer sur la touche Ctrl. On obtient alors une sélection par colonne.

Continuer la lecture
Logo KDE

Akonadi pour 15 go

Publié dans Geekeries | Laisser un commentaire

Sur ma Debian KDE bulleyes, j’ai récemment remarqué qu’Akonadi utilisait plus de 15 go d’espace disque ! Akonadi, c’est ce mécanisme de base de données partagées que peuvent utiliser les applications Linux pour faciliter l’accès aux données de l’utilisateur : email, agenda, rappels, etc. C’est principalement utilisé par de plus en plus d’applications KDE comme KMail, KOrganizer, etc.

Pourtant, il ne me semble pas utiliser particulièrement ces applications… J’utilise Thunderbird et je m’en porte très bien ! Akonadi est normalement coupé par défaut, et activé dès qu’une application le nécessite. Il semblerait que l’horloge KDE puisse l’activer (eh oui, elle peut afficher un agenda), mais à part ça, mystère.

Mon hypothèse c’est que j’ai dû tester un jour KMail, puis le désinstaller, et Akonadi s’est ainsi retrouvée avec 15 go d’emails dans sa base de données.

J’ai cherché, et je n’ai pas trouvé comment savoir si ces données étaient vraiment utiliser, ni comment purger. Alors j’ai suivi les conseils de ce thread KDE : couper Akonadi, tout supprimer, relancer Akonadi. Oui.

Continuer la lecture
Logo KDE

Astuces en cas de pépin avec KDE Plasma

Publié dans Geekeries | Un commentaire

Plasma crashe au boot à cause d’EventCalendar

Pour ceux qui sont sous Debian Testing Bulleyes (so 2020), si jamais vous avez le même problème que moi (j’ai juste ouvert mon ordi pour rien d’important, et pof écran noir, juste la souris, même après le reboot, bref galère) :

Je ne sais pas qui est la cause de quoi, mais il s’avère que le plugin qui affiche l’heure EventCalendar s’est aussi mis à crasher et le résultat c’est que Plasma crash au démarrage et affiche un écran noir. Le plus simple c’est de sauvegarder puis supprimer `.config/plasma-org.kde.plasma.desktop-appletsrc` puis de reboot (Donc `Alt+F2` pour afficher un terminal, ou bien `Ctrl+Alt+F2`). ça recréera une config par défaut. J’ai pu comparer les 2, faire des tests, détecter le pb d’affichage de l’heure par hasard, et du coup remettre ma config d’origine corrigée.
Plasma s’affichait bien, mais pas le décorateur de fenêtre (pas possible de déplacer, fermer des fenêtres, alt+tab marchait pas).

EventCalendar est toujours planté aujourd’hui, donc je ne l’utilise plus. Lorsque j’ai eu ce problème, j’avais probablement un double bug EventCalendar + kwin. C’est peut-être dû à la dernière mise à jour que j’ai faite, soit ça a cassé mon kwin (le « window decorator »), soit ça a introduit un bug dans kwin. Bref, dans la soirée une nouvelle version de kwin est apparu et cela a réglé le souci. J’ai cherché à savoir si c’était ma config ou un bug, mais je n’ai pas trouvé.

Au moins, je sais maintenant où trouver la config de Plasma, et je sais ce qu’est un window decorator 😀

Redémarrage live de Plasma

La commande pour redémarrer plasma c’est : `killall plasmasheel` (pour tuer l’ancien) puis tout simplement `plasmashell &`.

Picotech

libpicoipp installation error

Publié dans Geekeries | Un commentaire

Sur mon Debian bulleyes (encore « testing » pour l’instant, mais plus pour longtemps), je me suis récemment retrouvé avec une erreur étrange lors de la mise à jour de mon système :

$ sudo apt upgrade                                                                                                                  
Lecture des listes de paquets... Fait                                                                                               
Construction de l'arbre des dépendances                                                                                             
Lecture des informations d'état... Fait                                                                                             
Vous pouvez lancer « apt --fix-broken install » pour corriger ces problèmes.                                                        
Les paquets suivants contiennent des dépendances non satisfaites :                                                                  
 libps2000a : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                       
 libps3000a : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                       
 libps4000 : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                        
 libps4000a : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                       
 libps5000a : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                       
 libps6000 : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                        
 libps6000a : Dépend: libpicoipp (>= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                       
 picoscope : Dépend: libpicoipp (= 1.3.0-4r78) mais 1.3.0-4r29 est installé                                                         
E: Dépendances non satisfaites. Essayez « apt --fix-broken install » sans paquet                                                    
   (ou indiquez une solution).
Continuer la lecture

Monter le Storex AivX avec Samba

Publié dans Geekeries | Laisser un commentaire

J’ai depuis plusieurs année un disque dur Wifi / media center Storex AivX – 372 HD. A part que c’est un peu vieux, c’est assez cool : 1to et il permet de lire facilement des films sur un écran (très pratique, je n’ai que faire d’un télé).

Voilà longtemps que je voulais pouvoir y accéder à distance via mes autres ordinateurs. C’est censé être possible puisqu’il est connecté en Wifi à ma box Internet. Via Windows c’est un peu la croix et la bannière, mais ça marche. Sous Linux… je n’avais jamais réussi ! L’autre jour, je me suis un peu acharné, j’ai trouvé et relu la doc, et j’ai fini par trouver la solution (et les raisons) juste avant de lâcher prise. Ouf !

Continuer la lecture
syncthing

Installer syncthing sur recalbox

Publié dans Geekeries | Laisser un commentaire

J’ai récemment installé l’OS Recalbox, l’émulateur de consoles de jeux, sur mon RaspberryPi3. Une petite manette USB, et… ah oui il me faudra une manette USB ou Bluetooth supplémentaire, et prendre le temps de retrouver des jeux sympas… et cela devrait animer les soirées d’hiver !

Mon objectif est d’avoir un RaspberryPi près du bureau pour :

  • Faire console de jeux (checked)
  • Ah tiens Recalbox est fourni avec le media center Kodi (à creuser)
  • Rendre mon imprimante utilisable via le réseau (peut-être compliqué avec Recalbox, c’est mon prochain défi)
  • Rajouter un noeud Syncthing à la maison (checked)

Mais comment installer synchting sur Recalbox ? Puisque comme le disent certains sur les forums : il n’y a pas de gestionnaire de paquet sur Recalbox.

Continuer la lecture
Grub

Grub rescue après mise à jour Windows

Publié dans Geekeries | Laisser un commentaire

Contexte
Sur un Dell Inspiron 155000, j’ai un dual boot Windows 10 / Kubuntu. Lors d’une mise à jour Windows, ce dernier semble avoir purement et
simplement supprimé grub. J’avais déjà eu le cas où Windows modifie le disque d’amorçage, et il faut donc reconfigurer grub à la main, mais cette
fois-ci, je n’avais carrément plus de grub, juste un prompt “grub rescue”. Génial !


Solution
Dans le prompt grub rescue :
grub rescue> ls # affiche la liste des disques, pour moi cela allait de gpt9 à gtp1
grub rescue> set # affiche la configuration courante, pour moi gtp8 était sélectionné
grub rescue> set prefix=(hd0,gtp5)/boot/grub
grub rescue> set roothd0,gpt5
grub rescue> insmod linux # Maybe useless
grub rescue> insmod normal
grub rescue> normal # Linux will start

J’ai fait plusieurs tentatives pour trouver la bonne partition car je ne me rappelais plus laquelle c’était ! (petite piqûre de rappel de qwerty en
prime) Il n’y a pas de risque à faire des essais, quand ce n’est pas correct, la commande insmod linux déclare unknown filesystem.
Pour rendre cette modification permanente, il faut utiliser les commandes suivantes une fois qu’on a un prompt digne de ce nom :
sudo os-prober
sudo update-grub
sudo grub-install /dev/sda

Ressources

  • https://doc.ubuntu-fr.org/tutoriel/comment_restaurer_grub
  • http://forum.ubuntu-fr.org/viewtopic.php?id=358656