Loading...
 

No Food for Thought

Food is something you should provide to your brain long before coming to this blog. You will find no food recipes here, only raw, serious, non-fake news for mature minds.

Losing your cool with Lenovo's Ideapad Flex? Get rid of Yoga Mode Control

admin Saturday December 31, 2016

I gave a new laptop with Microsoft Windows to my parents in October. Unfortunately, the best deal I found, Lenovo's Ideapad Flex 4, was not a Signature Edition. But it was my first time buying Lenovo, and I thought they may not be so bad.

Things went rather smoothly initially, but I did not realize there were sometimes processes monopolizing a whole CPU core. This became hard to ignore the day there were 4 such rundll32.exe processes running simultaneously, each using up 25% of the CPU, causing fans to spin at maximum speed and incredible unresponsiveness.

Sometimes, Windows 10 even refused to let any user "login" because there was a lack of unspecified resources. Windows says it won't let you open new sessions until you free resources. The only issue being that even the sessions already opened cannot be used, so you cannot go investigate the problem, and are only left able to restart Windows.

This unspecific symptom was difficult to research. I uninstalled several useless pre-installed Lenovo packages unsuccessfully. We endured this problem for more than a month on a fully up-to-date system, even following Lenovo's upgrade recommendations, without obtaining a solution. I then uninstalled every pre-installed Lenovo package, again without solving the issue. I was about to reformat this morning when I found this Lenovo forum thread reporting the issue, at the last minute. The culprit is ymc.exe, Lenovo's "Yoga Mode Control", which manages the switch between classic laptop usage and tablet usage. I had noticed a "Yoga Mode Control" running, and since my parents have not practiced yoga in decades, had considered the possibility it was malware which had infected Windows, but I had verified it was just a strangely-named Lenovo application which was not supposed to be harmful.

The proposed workaround works. Apparently, the only downside of disabling ymc is that the visual keyboard is no longer managed automatically, which is not a problem if you do not use the Ideapad as a tablet. Disabling the service seems to kill the processes, but they apparently reappear right away. You need to make the service Manual and restart Windows to really get rid of the processes.

Congratulations, Lenovo, for leaving software you pre-install go out of control for months. Next time you want to keep your computers and their users in a cool mode, try fixing your serious bugs before deploying Yoga Mode Control.

ManageEngine NetFlow Analyzer on Debian 8

admin Monday December 19, 2016

ManageEngine's NetFlow Analyzer is probably the best NetFlow analysis software. It supports GNU/Linux and is even free for a maximum of 2 network interfaces.

NetFlow Analyzer 12.1 can be installed on Debian 8, but that does not mean there are no issues. The software is heavyweight. Once the service was started with # /etc/init.d/OpManagerServer start; you still need to give a some time before the service is usable.

The init scripts unfortunately lack LSB headers. While that apparently does not prevent proper functioning nor even pollute logs in general, it seems to cause much confusion when dpkg has to upgrade a service. Therefore, upgrading Samba brought a pretty scary output:

Préconfiguration des paquets... (Lecture de la base de données... 83617 fichiers et répertoires déjà installés.) Préparation du dépaquetage de .../libnss-winbind_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de libnss-winbind:i386 (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../libpam-winbind_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de libpam-winbind:i386 (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba-vfs-modules_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de samba-vfs-modules (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba-dsdb-modules_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de samba-dsdb-modules (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../python-samba_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de python-samba (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../libwbclient0_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de libwbclient0:i386 (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../winbind_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de winbind (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../smbclient_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de smbclient (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../libsmbclient_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de libsmbclient:i386 (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba-libs_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de samba-libs:i386 (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de samba (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba-common-bin_2%3a4.2.14+dfsg-0+deb8u2_i386.deb ... Dépaquetage de samba-common-bin (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Préparation du dépaquetage de .../samba-common_2%3a4.2.14+dfsg-0+deb8u2_all.deb ... Dépaquetage de samba-common (2:4.2.14+dfsg-0+deb8u2) sur (2:4.2.10+dfsg-0+deb8u3) ... Traitement des actions différées (« triggers ») pour man-db (2.7.0.2-5) ... Traitement des actions différées (« triggers ») pour systemd (215-17+deb8u5) ... Paramétrage de samba-common (2:4.2.14+dfsg-0+deb8u2) ... debconf: Impossible d'initialiser l'interface : Gnome debconf: (Can't locate Gtk2.pm in @INC (you may need to install the Gtk2 module) (@INC contains: /etc/perl /usr/local/lib/i386-linux-gnu/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/i386-linux-gnu/perl5/5.20 /usr/share/perl5 /usr/lib/i386-linux-gnu/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl .) at /usr/share/perl5/Debconf/FrontEnd/Gnome.pm line 91.) debconf: Utilisation de l'interface Dialog en remplacement Paramétrage de libwbclient0:i386 (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de samba-libs:i386 (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de python-samba (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de samba-common-bin (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de samba-dsdb-modules (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de samba (2:4.2.14+dfsg-0+deb8u2) ... insserv: warning: script 'K98OpManagerServer' missing LSB tags and overrides insserv: warning: script 'OpManagerServer' missing LSB tags and overrides insserv: There is a loop at service rmnologin if started insserv: There is a loop between service OpManagerServer and mountnfs if started insserv: loop involving service mountnfs at depth 10 insserv: loop involving service nfs-common at depth 9 insserv: There is a loop between service OpManagerServer and networking if started insserv: loop involving service networking at depth 7 insserv: loop involving service urandom at depth 6 insserv: loop involving service mountnfs-bootclean at depth 12 insserv: loop involving service rpcbind at depth 9 insserv: There is a loop between service OpManagerServer and mountall-bootclean if started insserv: loop involving service mountall-bootclean at depth 6 insserv: loop involving service mountall at depth 5 insserv: There is a loop between service rmnologin and checkroot if started insserv: loop involving service checkroot at depth 3 insserv: loop involving service keyboard-setup at depth 2 insserv: loop involving service hwclock at depth 3 insserv: There is a loop between service rmnologin and udev if started insserv: loop involving service udev at depth 1 insserv: loop involving service checkfs at depth 5 insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Max recursions depth 99 reached insserv: loop involving service irqbalance at depth 2 insserv: There is a loop at service OpManagerServer if started insserv: loop involving service rsyslog at depth 13 insserv: loop involving service OpManagerServer at depth 1 insserv: loop involving service mountkernfs at depth 1 insserv: exiting now without changing boot order! update-rc.d: error: insserv rejected the script header dpkg: erreur de traitement du paquet samba (--configure) : le sous-processus script post-installation installé a retourné une erreur de sortie d'état 1 dpkg: des problèmes de dépendances empêchent la configuration de winbind : winbind dépend de samba (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet samba n'est pas encore configuré. dpkg: erreur de traitement du paquet winbind (--configure) : problèmes de dépendances - laissé non configuré dpkg: des problèmes de dépendances empêchent la configuration de libnss-winbind:i386 : libnss-winbind:i386 dépend de winbind (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet winbind n'est pas encore configuré. dpkg: erreur de traitement du paquet libnss-winbind:i386 (--configure) : problèmes de dépendances - laissé non configuré dpkg: des problèmes de dépendances empêchent la configuration de libpam-winbind:i386 : libpam-winbind:i386 dépend de winbind (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet winbind n'est pas encore configuré. dpkg: erreur de traitement du paquet libpam-winbind:i386 (--configure) : problèmes de dépendances - laissé non configuré Paramétrage de samba-vfs-modules (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de libsmbclient:i386 (2:4.2.14+dfsg-0+deb8u2) ... Paramétrage de smbclient (2:4.2.14+dfsg-0+deb8u2) ... Traitement des actions différées (« triggers ») pour libc-bin (2.19-18+deb8u6) ... Des erreurs ont été rencontrées pendant l'exécution : samba winbind libnss-winbind:i386 libpam-winbind:i386 E: Sub-process /usr/bin/dpkg returned an error code (1) Échec de l'installation d'un paquet. Tentative de récupération : Paramétrage de samba (2:4.2.14+dfsg-0+deb8u2) ... insserv: warning: script 'K98OpManagerServer' missing LSB tags and overrides insserv: warning: script 'OpManagerServer' missing LSB tags and overrides insserv: There is a loop at service rmnologin if started insserv: There is a loop between service OpManagerServer and mountnfs if started insserv: loop involving service mountnfs at depth 10 insserv: loop involving service nfs-common at depth 9 insserv: There is a loop between service OpManagerServer and networking if started insserv: loop involving service networking at depth 7 insserv: loop involving service urandom at depth 6 insserv: loop involving service mountnfs-bootclean at depth 12 insserv: loop involving service rpcbind at depth 9 insserv: There is a loop between service OpManagerServer and mountall-bootclean if started insserv: loop involving service mountall-bootclean at depth 6 insserv: loop involving service mountall at depth 5 insserv: There is a loop between service rmnologin and checkroot if started insserv: loop involving service checkroot at depth 3 insserv: loop involving service keyboard-setup at depth 2 insserv: loop involving service hwclock at depth 3 insserv: There is a loop between service rmnologin and udev if started insserv: loop involving service udev at depth 1 insserv: loop involving service checkfs at depth 5 insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Starting OpManagerServer depends on rmnologin and therefore on system facility `$all' which can not be true! insserv: Max recursions depth 99 reached insserv: loop involving service irqbalance at depth 2 insserv: There is a loop at service OpManagerServer if started insserv: loop involving service rsyslog at depth 13 insserv: loop involving service OpManagerServer at depth 1 insserv: loop involving service mountkernfs at depth 1 insserv: exiting now without changing boot order! update-rc.d: error: insserv rejected the script header dpkg: erreur de traitement du paquet samba (--configure) : le sous-processus script post-installation installé a retourné une erreur de sortie d'état 1 dpkg: des problèmes de dépendances empêchent la configuration de winbind : winbind dépend de samba (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet samba n'est pas encore configuré. dpkg: erreur de traitement du paquet winbind (--configure) : problèmes de dépendances - laissé non configuré dpkg: des problèmes de dépendances empêchent la configuration de libpam-winbind:i386 : libpam-winbind:i386 dépend de winbind (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet winbind n'est pas encore configuré. dpkg: erreur de traitement du paquet libpam-winbind:i386 (--configure) : problèmes de dépendances - laissé non configuré dpkg: des problèmes de dépendances empêchent la configuration de libnss-winbind:i386 : libnss-winbind:i386 dépend de winbind (= 2:4.2.14+dfsg-0+deb8u2) ; cependant : Le paquet winbind n'est pas encore configuré. dpkg: erreur de traitement du paquet libnss-winbind:i386 (--configure) : problèmes de dépendances - laissé non configuré Des erreurs ont été rencontrées pendant l'exécution : samba winbind libpam-winbind:i386 libnss-winbind:i386


Thankfully, Samba and everything other than dpkg seemed to work perfectly, but to get rid of this nastiness, I had to add a dummy LSB header to /etc/init.d/OpManagerServer:

### BEGIN INIT INFO # Dummy LSB header # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start or stop ManageEngine NetFlow Analyzer ### END INIT INFO

And then run

# insserv /etc/init.d/OpManagerServer


This is apparently the result of Debian bug #587587.

Unintentionally coined terms

admin Wednesday December 14, 2016

This week our network was hit by the Osiris ransomware. Ransomware is a huge waste of time, but perhaps not as much as the term I unintentionally coined today: randomware.

I still have to reflect on whether randomware can include hardware and settle on a precise definition. Typos in source code are usually a source of bugs and a perceived higher randomness. Rarely do typos provide such an opportunity. I cannot believe that an anti-randomware activist became the person who would coin the term "randomware" coincidentally. I take this apparent chance very seriously and will carefully craft the best definition possible before making it official; no coin-flipping involved in this historical task.

Windows Firewall: a threat waiting for any occasion to strike

admin Saturday September 17, 2016

Just 4 days after writing Windows Firewall dangers - Is your Windows [8] PC's networking broken after you joined a domain?, I did my first major Windows upgrade (from Windows 7). And noticed that Windows Firewall had been completely re-enabled, as well as the warnings telling you that Windows Firewall is disabled.

Not even a year later, that same PC was hit by Windows 10 Anniversary Update, which caused the very same issues. But I finally understood what happened this time. When Windows upgrades, it assumes it knows better than the administrator and re-enables warnings about the Windows Firewall being disabled, which causes a notification to appear in the notification pane. The administrator who does not know by heart how to re-disable warnings might click that notification hoping to be offered to get rid of these. Unfortunately, the only visible effect of clicking that notification is that the notification disappears. But that is not the only effect. When that notification receives a single click, Windows re-enables the firewall, without providing any feedback to that effect. Brilliant deceptiveness!

Oh, Microsoft. How could we earn such a direct ticket to Heaven if it wasn't for enduring you and your silly tricks? I'll refrain from explaining how pitiful the upgrade to Windows 10 and then Windows 10 Anniversary Update was until I find an answer to that question.

DEWALT Multi-Bit Ratcheting Screwdriver: Avoid

admin Monday September 5, 2016

When I got my hands on the DEWALT Ratcheting Screwdriver, it took me 5 minutes to tell whether I would use it as a multi-bit screwdriver. The weird mountable rack it came with made me wonder if it could store all of its bits inside the handle. After I decided to try it, I opened the package and put the bits in the internal bit storage. After putting 1 or 2 bits, I struggled to put the next in place. At first, I thought there must have been a manufacturing defect. But after trying more slots and bits, and considering the mountable rack, I started to smell a design error.

And indeed, the online reviews are poor. This review of a variant of mine says it all. Visibly, Dewalt didn't intend to have internal storage initially and rushed a broken solution. Or, it tried to patch its faulty internal storage with the mountable rack.

In any case, if you are looking for a multi-bit screwdriver, do the world a favor and do not encourage DEWALT by buying its ratcheting screwdriver.

SQL Anywhere and Interactive SQL quietly losing transactions in default configurations

admin Wednesday July 20, 2016

SAP SQL Anywhere and its GUI Sybase Central (now SQL Central) have been part of my 5 most important tools for 4 years now. A few times, I noticed some oddities, but it wasn't until yesterday that I realized what was going on.

First, Interactive SQL starts transactions which are not automatically committed. By default, commits happen when closing or disconnecting (see the SQL Anywhere tab in Options). There is no warning to that effect. Second, the default SQL Anywhere isolation level for database transactions (at least in versions 11 to 17) is 0, "read uncommitted": http://dcx.sap.com/index.html#sqla170/en/html/3bf0ef526c5f1014b372935839b121fc.html
Which means that the changes from uncommitted transactions are all visible, from different sessions and even from different users. Which is why I did not realize how Interactive SQL behaved before now.

So far, this may be surprising, but perhaps nothing incorrect. Unfortunately, this comes with a ultimate surprise. When you execute a query in Interactive SQL in these default configurations, the transaction started is not committed. And after some time, it appears that the transaction is quietly cancelled, automatically. I reproduced this at the first attempt. If the abortion was indeed triggered by a timeout, I do not know how long the delay is, but it is inferior to 16 hours. The Interactive SQL window was still open, there was no popup, nor any indication that the transaction had expired. The Interactive SQL closed normally, without indicating that the transaction had timed out.

This happened with Sybase Central 16 and SQL Anywhere 11. Commit after every statement will workaround this, but will not cause automatic commits when modifying with the results table (either modifying cells or deleting rows).

Transactions are great, but when implemented properly. Thinking about all the manipulations which we must have lost due to this bug leaves a taste which is quite bitter, and certainly not ACID.

Duplicate form sections with jQuery - Improved

admin Friday May 27, 2016

Based on David Carr's excessively simple technique to duplicate form sections using JavaScript, here is my enhanced but still minimalist take, adding support for:

  1. select multiple
  2. starting the form with several sections already
  3. easy backend usage


This changes indices so they start at 0.
Image Duplicate Form Sections

//define template var template = $('#sections .section:first').clone(); //define counter var sectionsCount = jQuery('div.section:last').data('number'); function incrementIdentifier(id, sectionsCount) { if (id.substr(-1) == '0') { id = id.substr(0, id.length - 1); } return id + sectionsCount; } //add new section $('body').on('click', '.addsection', function() { //increment sectionsCount++; //loop through each input var section = template.clone().find(':input').each(function(){ //set id to store the updated section number newId = incrementIdentifier(this.id, sectionsCount); //update for label $(this).prev().attr('for', newId); //update id this.id = newId; var baseName = this.name; var array = false; if (baseName.substr(-2) == '[]') { array = true; baseName = baseName.substr(0, baseName.length - 2); } baseName = incrementIdentifier(baseName, sectionsCount); if (array) { baseName = baseName + '[]'; } this.name = baseName; }).end() //inject new section .appendTo('#sections'); jQuery('input[name=lastSection]').val(sectionsCount); return false; }); //remove section $('#sections').on('click', '.remove', function() { //fade out section $(this).parent().fadeOut(300, function(){ //remove parent element (main section) $(this).parent().parent().empty(); return false; }); return false; });


As a bonus, the PHP function I quickly crafted to ease processing the resulting $_REQUEST:

<?php /** * Treat $_REQUEST when working with duplicate-form-sections.js * $_REQUEST['numberedParameters'] contains the base name of the parameters to be converted into arrays * $_REQUEST['lastSection'] is the number of the last section (the number of sections minus 1) * Alters neither $_GET nor $_POST * @author Philippe Cloutier * @license MIT * @return boolean false on failure */ function numberedParametersToArrays() { if (! isset($_REQUEST['lastSection'])) { return false; } $numberedParameters = $_REQUEST['numberedParameters']; $lastSection = $_REQUEST['lastSection']; foreach ($numberedParameters as $numberedParameter) { $_REQUEST[$numberedParameter] = array(); for ($i = 0; $i <= $lastSection; $i++) { if (isset($_REQUEST[$numberedParameter . $i])) { $_REQUEST[$numberedParameter][] = $_REQUEST[$numberedParameter . $i]; } else { $_REQUEST[$numberedParameter][] = array(); } // We could unset the numbered parameters. } } return true; } ?>


And here is an adjusted usage example:

<form> <div id="sections"> <div class="section" data-number="0"> <fieldset> <legend>User</legend> <p> <label for="firstName">First Name:</label> <input name="firstName0" id="firstName0" value="" type="text" /> </p> <p> <label for="lastName">Last Name:</label> <input name="lastName0" id="lastName0" value="" type="text" /> </p> <p> Friends: <select name="friends1[]" id="friends1" size="2" multiple> <option>Alice</option> <option>Bob</option> </select> </p> <p><a href="#" class='remove'>Remove Section</a></p> </fieldset> </div> </div> <p><a href="#" class='addsection'>Add Section</a></p> <input type="hidden" name="numberedParameters[]" value="firstName"> <input type="hidden" name="numberedParameters[]" value="lastName"> <input type="hidden" name="numberedParameters[]" value="friends"> <input type="hidden" name="lastSection" value="0"> </form>


Note that there are similar solutions elsewhere. I am not saying this one is better than these.

You know you're getting old when...

admin Saturday May 7, 2016

You know part of your life is behind you when Debian is dropping support for your first computer (as well as your second). I can't help but feeling nostalgic when thinking about my good old Pentium 120 MHz (80502) and my AMD 450 MHz (K6-2). Ah, the good old times when CPU-s were the stars. Today, I do not even remember the model or frequency of the computers I work on, even though I chose them alone.

That being said, I'm happy Debian is finally making that move.

Are beta credit cards the right choice?

admin Sunday April 17, 2016

Tangerine bank started promoting its new Money-Back Credit Card several months ago. Wanting to avoid spending time on anything "beta", I did not request a card until, last month, I fell under the impression that the card was ready.

The ordering process was not bad, except for asking you to make a ridiculous choice between purchase categories granting extra money-back rewards. The process lets you define your credit limit.

When the package arrived, I was surprised to find the contract was printed on 4 unbound sheets of paper. But even more surprised to see the card's design:
Tangerine

Out of 4 adults asked, a single one could tell the right direction in which the card must be inserted (which is chip first, of course).

Running from Debian Project Leadership

admin Wednesday March 16, 2016

The 2016 Debian Project Leader election has started. For a second time, its result is quite predictable, as there is a single candidature.

After a single term, Neil McGovern has not offered himself again. A few years ago, I wrote about governance issues in my description of my involvement in Debian. Although elections are infrequent and the number of candidates has never been very high, the following table seems to show a downwards trend:

Number of DPL candidates per year
YearNumber of candidates
19994
20004
20014
20023
20034
20043
20056
20067
20078
20083
20092
20104
20111
20123
20133
20142
20153
20161


While I believe Debian should use liquid governance, I suggested that distributing the DPL role (using for example a Second in Charge) would help meanwhile. Some may argue that a second single-candidature DPL election this decade implies that candidatures for the 2IC role would be rare, since so few contributors are interested in even the DPL role.

There may be several factors behind the diminution of candidatures, including a diminution of activity. But it should still be observed that Software in the Public Interest, which is a lot less active than Debian, manages to find 8 directors. So I have an alternative interpretation for the low number of candidatures in past years.

In my description of my journey in Debian, I showed that half of Debian Project Leaders do not propose themselves again after their first term. Veteran developers know that becoming DPL often means burnout and the end of one's Debian involvement. So I propose that the decline in DPL candidatures is not due to the role's importance having diminished, but rather a realization of that importance being excessive (in other words, excessively demanding for the (null) compensation).

I am not convinced this year's candidate has as much maturity as the DPL role would call for. But even him seems aware of the DPL's importance, as he shows at the very end of his platform:

Mehdi Dogguy wrote:

Time commitment

The DPL role is very time-consuming. To be able to do it seriously, I will put on hold my other Debian activities for the duration of the mandate.

I will not be able to be a full-time DPL. Instead, I have the full support of my employer, who is very supportive of the work we do on Debian. I will be able to dedicate 20% of my work time to Debian tasks.

I am disappointed to see his platform does not propose any major improvement to governance. Which does not mean things cannot improve a bit:

Mehdi Dogguy wrote:
I do not intend to centralize all tasks, but will call for help Debian contributors whenever possible. I will invite Debian contributors who are good speakers to represent the project, rather than have the project rely solely on the DPL.

Hopefully, by distributing the role of spokesperson, the DPL can get a bit more time for decision-making.

Updates

2016-04-16

The leader in office at the time of publication included the following in his electoral platform:

Neil McGovern wrote:
I will continue to communicate with the project - the daily DPL log as set up by Stefano is a great tool, and monthly bits mails are helpful to show the project what the DPL is up to.


Neil's Final bits from the (outgoing) DPL was only his third "bits" mail. And it contains:

Neil McGovern wrote:
That said, I'm not sure anyone except those who have experienced the job realize what a time commitment it is [...]


While the above is very revealing, I encourage leaders who will leave the office to provide an actual estimate of the amount of time they dedicated to the office, as well as an evaluation of how well they think they did.

2016-08-21

After Neil dedicated most of his A year in the life of a DPL talk about his DPL term to a single issue (ZFS and its Common Development and Distribution License), he was asked by his predecessor about the time spent by DPL-s on licensing matters (at 33:05). Neil's answer eventually strayed from the question to discuss the DPL role and concluded with:

Neil McGovern wrote:
I am not convinced that this is a role that one person can take on—especially if they are not working full-time on the job—and be able to achieve everything that they want to.

2017-04-02

The 2017 election is quite comparable to 2016's. There are twice as many candidates this year - 2 - but no more focus on governance. Mehdi Dogguy's platform is unchanged regarding governance. Mehdi also doesn't estimate how much time he committed to the role in his first mandate. As for Chris Lamb, his platform does not have 1 word on governance.

2018-04-10

This year again, a single candidate is walking for leadership. The candidate, the current leader, presents a new platform which still has no word on improving governance, but which now discusses governance by describing his first term:

Chris Lamb wrote:

Being the DPL is an extremely hard job. Indeed, it's even difficult to explain exactly how, any statistics somehow do not quite capture it. However, I am now beginning to understand the look in previous Leader's faces when congratulating me on my appointment. Future candidates should not take nominating themselves lightly.

[...]

On the other hand, it is with some regret that a large amount of my effort and energy was consumed with mediating a significant number of complicated interpersonal and anti-harassment issues. I mention them here, not to moan or complain, but merely because these concerns, perforce, generate little-to-no external noise and are thus otherwise invisible.

More saliently, they cost a disproportionate amount of energy or "spoons" which — as they took myself and others away from furthering initiatives outlined in my platform — I was truly not convinced I would stand for re-election until very recently on a question of personal ethics. Indeed, I might not have done at all had it not been for some encouraging and deeply touching words from a number of close confidants. They stressed to me that a year, especially as the DPL, is not a long time. In some senses, they counselled, I should consider myself just getting started and only now prepared to start to take on the bigger changes.


While I congratulate Chris for describing his activity probably more than any other DPL, and while I know very well how painful time-tracking is, I deplore that once again no estimation of the time required/invested during the current term is published.

Fully Free

Kune ni povos is seriously freethough not completely humor-free:

  • Free to read,
  • free to copy,
  • free to republish;
  • freely licensed.
  • Free from influenceOriginal content on Kune ni povos is created independently. KNP is entirely funded by its freethinker-in-chief and author, and does not receive any more funding from any corporation, government or think tank, or any other entity, whether private or public., advertisement-free
  • Calorie-free*But also recipe-free
  • Disinformation-free, stupidity-free
  • Bias-free, opinion-free*OK, feel free to disagree on the latter.
  • Powered by a free CMS...
  • ...running on a free OS...
  • ...hosted on a server sharedby a great friend for free