Mots-clé : programmation

1 – QMK firmware – clavier AZERTY – Update

Pour tous ceux qui veulent le récupérer et le compiler, cela se passe par .

Attention ce qui suit est une explication du temps que j’ai perdu, mais j’essaie de rester honnête : il y a deux gros « firmwares » que l’on peut mettre dans les claviers de geek : le firmware QMK et le firmware kiibohd. Les deux personnes qui bossent dessus sont hyper fortes et connaissent les claviers et les drivers sur le bout des doigts. De mon point de vue je ne conseille que le premier (dont j’ai mis les sources en téléchargement juste au dessus), car le kiibohd n’est que sources de problèmes.

Celui qui a fait de grosses sources, travaillé énormément dessus et qui a le plus de connaissances est Jacob Alexander (alias haata), et vous trouverez toutes ses sources ici. Seul gros problème : même s’il est plein de bonne volonté, son code est difficilement lisible et le comportement même du clavier est totalement incohérent par rapport à ce que je recherchais. Je ne conseille pas du tout de récupérer et d’utiliser ce code pour ces raisons :

  • si vous voulez afficher une image totalement différente sur votre LCD par rapport à la couche, c’est impossible : il affiche uniquement un chiffre par rapport à la couche en cours (et si on vient d’une couche à une autre, par exemple de la 3 à la 2, alors vous verrez 2 chiffres)
  • si vous voulez facilement programmer des macros, vous allez galérer à mort, je n’y suis pas arrivé
  • si vous voulez compiler facilement sous Windows, c’est la même chose, et la seule réponse c’est : utilisez une machine virtuelle Linux et compilez là. Super !

Bref, que des points bloquants, même si un seul était résolu, les autres m’empêcheraient de faire ce que je veux avec mon Infinity Ergodox, donc : go for QMK !.

Infinity ergodox

[Update 5 avril 2018]
Voici toutes mes sources :
2018.04.05.qmk_firmware.tar.bz2
Pour la compilation, tout a changé et n’est plus compatible (…), voici la nouvelle commande qui fonctionne avec ce code source :
sudo make ergodox_infinity:azerty:dfu-util MASTER=right
sudo make ergodox_infinity:azerty:dfu-util MASTER=left

Tout mes sources spécifiques sont dans le dossier 
./layouts/community/ergodox/azerty

  • Les macros + fonctions AZERTY sont dans le fichier keymap.c
  • Le texte sur les LEDs est dans visualizer.c

[Update 30 mars 2018]
J’ai reçu mes nouveaux keycaps.
Je poste juste des images. J’espère que vous pardonnerez la qualité de l’image et les grains de poussière qui pourraient faire croire que c’est pas très nettoyé chez moi mais l’appareil photo les fait ressortir malgré mes 4-5 prises de vues et re-nettoyage…

Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps
Ergodox nouveaux keycaps

[/Update]

Après avoir acheté deux fois l’Infinity Ergodox (oui le premier avait des défaut de LED, celle de droite était défectueuse… je l’ai gardé car je ne l’aurais jamais revu si je l’avais renvoyé), j’ai récupéré toutes les sources et j’ai tout fait pour les recompiler.

Bref, il fonctionne :


Infinity Ergodox


Infinity Ergodox


Infinity Ergodox

Je mets en disponibilité mes sources pour la configuration complète d’un clavier AZERTY tel que je l’ai expliqué dans la page de configuration du clavier, avec quelques modifications qui me conviennent mieux..

8 – Source pour un clavier AZERTY

Je mets en disponibilité mes sources pour la configuration complète d’un clavier AZERTY tel que je l’ai expliqué dans la page de configuration du clavier.

Pour tous ceux qui veulent le récupérer et le compiler, cela se passe par .

ExtJS et grids : double click, comment faire, howto ?

Cela fait une bonne heure que je cherche comment avoir le double click sur une grid générée dynamiquement.

C’est très simple :

Ce code ne fonctionnait pas, donc si vous êtes dans le même cas que moi, n’ayez pas peur :

this.gridAttributs = Ext.create('Ext.grid.Panel', { 
    border: 0,
    store: this.store,
    columns: [ 
        { text: "id", dataIndex: 'id', sortable: true },
        { ... },
        { ... }
    ],
    celldblclick: function(evt, elem, opts ) { 
        console.log('dblclick');
    }
});

Voici le code qui fonctionne :

this.gridAttributs = Ext.create('Ext.grid.Panel', { 
    border: 0,
    store: this.store,
    columns: [ 
        { text: "id", dataIndex: 'id', sortable: true },
        { ... },
        { ... }
    ]
});
this.gridAttributs.on('cellDblClick', function(evt, elem, opts ) {
    console.log('dblclick');
});

J’espère vous avoir évité de perdre l’heure que moi même j’ai perdu ! 😉

scp : comment résoudre le problème C0644

Il arrive parfois que lorsqu’on fait un scp, ça ne fonctionne pas, et on peut lire quelque chose comme :

>> scp root@olivierpons.fr:/var/www/html/pysoko.tar.bz2 .
root@olivierpons.fr's password:
C0644 129502 pysoko.tar.bz2
>>

Dans cet exemple, je veux récupérer le fichier :
pysoko.tar.bz2
qui est sur le PC distant dans le répertoire
/var/www/html/
sachant que le PC distant est nommé :
olivierpons.fr.
En fait le problème est super simple : lorsque le programme scp se connecte pour faire la copie, un shell du distant nommé olivierpons.fr est ouvert, et par conséquent tout ce qu’il y a dans la configuration du shell est exécuté, donc tout ce qu’il y a dans le fichier de configuration du shell .bashrc.
Pour faire simple, si vous avez fait un « echo » quelque part dans le fichier de configuration du shell .bashrc, changez le par tty -s && echo ".
L’explication est dans ce site génial, qui explique tout sur le SCP, encore mieux que mon article, qui sort pourtant numéro un sur google France lorsqu’on tape scp linux

Le monde est injuste !

Apache : rotation de log

J’ai trouvé un article sur la rotation des logs très intéressant, mais il y a une lacune du côté du serveur Apache qui n’est pas résolue. D’ailleurs qui ne semble résolue nulle part.

>_<

A savoir lorsqu’on utilise la gestion des hôtes virtuels, apache crée un processus de log *par* fichier log. Donc par exemple : un hôte virtuel, un fichier de access_log et un fichier error_log dédié = 2 process rotatelogs. J’ai 12 sites vhost (très peu de fréquentation heureusement), ça me fait un total de 24 process dans ma liste des process… J’ai beau chercher un moyen de n’avoir qu’un seul process, je n’ai trouvé que le module mod_log_rotate qui donne la possibilité d’avoir la rotation de log directement en interne dans Apache, mais, à cause de la gestion des erreurs telle qu’implémentée dans Apache, ce module ne peut gérer que les logs d’accès, pas les logs d’erreur. Autrement dit il me restera tout de même 12 logs différents qui correspondront aux logs d’erreur.

Je me demandais, si, éventuellement, il ne serait pas plus judicieux de faire comme le suggère ce monsieur, à savoir ne pas utiliser mod_log_rotate, ni le programme livré avec Apache, mais de se servir plutôt de l’outil système d’archivage, et, en pratique, juste avant de les archiver, de faire un « awstats » sur les logs. Ce qui me gêne, c’est l’éventualité d’un conflit d’écriture. Que se passe-t-il si jamais j’ai 30 visiteurs de connectés sur mon site en même temps (ce qui serait très bien), qu’Apache écrit dans le log concerné, et que Logrotate est lancé à ce moment là ? C’est la seule et unique chose qui me retient pour l’instant de faire le saut dans cette direction.

Python : mes premiers essais

Bon, sur cet article ici, j’ai traduit tout le vécu d’un auteur, et j’ai voulu tester par moi même.

En pratique, j’ai installé un dictionnaire de Français entièrement gratuit, et je voulais récupérer les mots Français, sans la définition (je ne dirai pas pourquoi par contre hahahah).

Donc je regarde les fichiers, c’est du XML.
Ok donc il me faut juste un parseur.
En Delphi, ça m’aurait pris disons… une trentaine de minutes.
Eh bien pour mon premier script en Python, ça m’a pris… 10 minutes.
Oui oui je n’exagère pas : 10 minutes, j’ai lancé le chrono pour voir si j’allais être rapide ou pas.
Voilà mon script :

1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # r = open('/datas/dictionnaire/test
5
6 import types, fileinput
7
8 def process(line):
9 if line[0:7] == ' 0):
12 sub = sub[:sub.find(' ')]
13 if (sub.find(',') > 0):
14 sub = sub[:sub.find(',')]
15 print(sub)
16
17 for line in fileinput.input():
18 process(line)

Incroyable. Effectivement, en pratique c’est vraiment ce que j’ai mis sur mon article précédent : tout est clair, lisible, la documentation aide bien, et c’est extrêmement rapide, en tous les cas sa rapidité suffit amplement pour faire toutes les tâches de scripts de base que l’on veut.

Je suis extrêmement content, à part depuis la découverte de la librairie ExtJs, qui est très impressionnante, ça allait faire longtemps que je n’avais pas été autant enthousiasmé (du point de vue informatique, j’entends).

ExtJs : comment accéder aux variables GET ?

Avec la librairie ExtJs, Comment accéder aux variables GET qui sont dans l’URL ?

Cet article s’inspire de la discussion dans ce forum ici.

Il vous suffit de déclarer une fonction de Ext, par exemple :

Ext.getUrlParam = function(param) {
    var params = Ext.urlDecode(location.search.substring(1));
    return param ? params[param] : params;
};

Et ensuite, de l’appeler de cette façon :

var param = Ext.getUrlParam('ident');
if (param=='test') {
    alert('ok');
}

Pour tester si ce code fonctionne, il suffit de le mettre dans une page qui contient la librairie ExtJs, et de l’appeler avec le paramètre ‘test‘. Par exemple, si votre page s’appelle monexemple.php, il vous faudrait la tester ainsi : http://www.localsite/monexemple.php?ident=test.

Pour la note, j’utilise la librairie JavaScript ExtJs et j’apprends à m’en servir. Je suis actuellement en pleine découverte de ses possibilités, et elles sont grandes.

Linux : un serveur Knock (knockd). Mais c'est quoi ?

En résumé, il s’agit d’un système dit des « portes dérobées ». Le knockd scrute en permanence les paquets entrants et vérifie si certains d’entre eux répondent à une séquence prédéfinie, et si oui, il exécute une action. On peut imaginer une action qui est l’ouverture du port SSH pour l’IP à l’origine de la séquence.

Par ex, je décide que si une IP m’envoie un paquet SYN sur le port 342 en TCP, puis un paquet ACK sur le port 15161 en UDP, et enfin un paquet RST sur le port 63009 en TCP, alors j’ajoute une règle iptables qui autorise la connexion de cette IP sur le port 22 et qui forwarde cette connexion vers un autre ordinateur de façon transparente.

Le développeur se connecte alors en SSH sur mon ordinateur et se retrouve sur un autre comme par magie, de manière entièrement transparente pour lui. Simple, sûr et efficace.

Petite contrainte : il a faut un client « knock » qui envoie les bons paquets dans le bon ordre et au bon endroit. Il existe un binaire pour quasiment toutes les plateformes, Win32, Linux, MacOS, etc. Donc avant chaque connexion, il devra lancer une commande du genre :

./knock 293.15.12.12 ack:34562:tcp ack:961:udp rst:63009:tcp

Puis il pourra se connecter en SSH. Une fois la session terminée, il faut fermer la porte avec le même genre de commande. Pour se simplifier la vie on peut par exemple se faire 2 scripts, un « sshopen » et l’autre « sshclose » qui contiennent chacun la commande adéquate.