Blog Familial

Aller au contenu | Aller au menu | Aller à la recherche

mardi 2 juin 2015

Arduino, compilation séparée

Découper en classes, c'est bien, la compilation séparée c'est mieux : ça évite de copier-coller des bouts de code. On continue sur l'exemple.

Lire la suite

lundi 1 juin 2015

Arduino, Makefile

Pense-bête, en pratique, pour utiliser un Makefile

Lire la suite

jeudi 28 mai 2015

Arduino, KeyPad, gestion des rebonds, suite

Quand on joue avec le clavier (voir article précédent) on tombe de suite sur le problème des rebonds sur les boutons. Quand on appuie sur un bouton, le contact n'est pas très stable pendant un petit moment. L'idée est d'ignorer ces oscillations pendant un moment, et que ça soit la classe Keypad qui s'en occupe.

Lire la suite

dimanche 24 mai 2015

Arduino : une classe pour le LCD Keypad Shield

Il y a une classe `LiquidCrystal` pour piloter l'afficheur du LCD Keypad Shield, mais elle gère seulement l'affichage. Pour les boutons, on est priés de se débrouiller avec analogRead(). Pas très sympa. D'où l'idée de faire une petite classe pour s'occuper des boutons.

Lire la suite

jeudi 1 janvier 2015

Meilleurs voeux pour 2015. La tablette encore (Debian Wheezy)

Me suis décidé à rebrancher la tablette Trust évoquée dans les lointains épisodes précédents (La pile d'origine marche toujours !)

Cette fois-ci c'est sous Debian Wheezy (7.7, comme le temps passe).

Soyons bref, j'ai suivi les indications de https://help.ubuntu.com/community/TabletSetupWizardpen Plus précisement

  • la méthode 2
  • à partir de l'archive xorg-input-wizardpen-0.8.1.tar.bz2 prise sur https://launchpad.net/wizardpen
  • un truc à changer, c'est l'emplacement du fichier .fdi, qui est dans /usr/share/hal/fdi/policy/99-x11-wizardpen.fdi , mais je ne suis pas sur que ça serve à quelque chose, vu que hal n'esr pas installé sur ma machine. Et que j'avais oublié un guillemet autour du nom de la tablette, ça a marché quand même.
  • voila la ligne
<match key="info.product" contains="UC-LOGIC Tablet WP5540U">

et puis voilà, ça marche.

Avec tous mes voeux !

dimanche 17 février 2013

Vous n'êtes pas du tout concentrés

S'apercevoir en pleine réunion de travail, ou en cours, qu'on était parti dans les nuages depuis un temps indéfini, c'est arrivé à tout le monde. Et de fournir aussitôt des explications : la réunion était sans intérêt, le cours était terriblement ennuyeux (je compatis avec mes étudiants), on aurait dû se coucher plus tôt, etc. Tout ça, c'est pas faux (à part mes cours qui sont passionnants). Quand ça arrive à quelqu'un d'autre (de plus jeune), on accuse aussi le déficit d'attention lié à l'abus de distractions, la propension à se mettre au travail avec la télé allumée, de la musique dans le casque et un oeil sur facebook. Et le gâtisme précoce pour les plus vieux.

Il reste une explication : nous sommes tous naturellement enclins à la dispersion de l'attention.

Et en réalité c'est bien pire que ce qu'on peut imaginer, l'attention c'est une vraie savonnette qui n'arrête pas de s'échapper. Dans la vie courante nous croyons être à peu près concentrés, mais nous ne faisons en fait que suivre le fil des sollicitations.

Vous croyez sûrement que j'exagère ? Une petite expérience amusante, juste 5 minutes, vous permettra de constater l'ampleur du phénomène.

5 minutes pour voir

Il vous faut peu de choses, d'abord trouver un endroit à peu près calme, où personne ne viendra vous déranger toutes les 3 minutes. Une chaise chez soi, un banc dans un parc, etc, ça fait l'affaire. Une montre ou un réveil pour voir l'heure. Et surtout la détemination de mener l'expérience coûte que coûte à son terme, 5 minutes, pas moins. Quoi qu'il arrive.

Diable, direz-vous, dans quoi on s'embarque, que fait-on de si difficile qu'il faille prendre une telle résolution ?

Et bien, rien, justement. Nichts, nothing, nada, niente. Y a rien à faire. Et c'est ça qui va causer des réactions que vous allez pouvoir observer : l'attention qui s'en va, qui revient, etc.

Bon, si, en fait, vous allez faire quelque chose. A moins de pratiquer assidument l'apnée, en 5 minutes vous allez forcément respirer à un moment où à un autre. Vous n'êtes pas là pour du sport extrême, donc normalement vous respirez, 5 à 10 fois par minute, sans mes précieuses indications. N'y changez rien. Ce que vous allez faire, c'est juste compter ces cycles respiratoires : 1 la première fois que vous expirez, 2 la seconde etc. C'est quand même pas dur. Là il va arriver des choses

  • vous arrivez à 10. Très bien. Alors reprenez à 1.
  • vous vous perdez en route. Vous vous ếtes embrouillé (j'étais à 6 ou à 7 ?), vous avez eu un moment de distraction, vous réalisez que vous êtes arrivé à 14 : très bien aussi. Vous reprenez à 1.

et vous continuez jusqu'à la fin des 5 minutes. C'est tout.

Ce comptage, n'en faites pas un but. Ca n'a pas d'importance d'arriver ou pas à 10. Il n'y a rien à gagner. Le comptage c'est juste un moyen de voir quand on est présent et quand on ne l'est pas. Ou plutôt, quand on revient à la présence après un égarement. Si on voit qu'on était parti, c'est qu'on est revenu.

Ce qui arrive aussi, c'est que vous vous rappelez tout d'un coup que le frigo est vide. Que vous n'êtes pas sûr d'avoir raccroché le téléphone. D'avoir répondu à la carte postale de Noël. Et qu'il faut absolument que vous vous en occupiez tout de suite, maintenant, immédiatement. Et hop, vous êtes peut être même debout avant d'avoir compris ce qui se passait. Rien de grave, rassurez-vous. C'est juste votre esprit, qui, légèrement privé de distractions, est allé piocher un vieux truc dans la mémoire, et lui a donné un habillage dramatique pour pouvoir jouer avec. Revenez à 1.

Bon, bref, vous allez voir que vous vous arrivez rarement à 10. Ce qui représente une malheureuse petite minute ou deux (la respiration ralentit au bout d'un moment). Hé oui, on en est là. Inutile de vous dire que vous n'arrivez pas à suivre les réunions de plus d'une demi-heure : le délai est beaucoup plus court !

Et après ?

En recommençant ,plusieurs fois l'expérience, vous allez remarquer des changements. Typiquement, un jour, ça compte assez bien. Cool. Le lendemain, ça ne marche pas fort. Le jour d'après, vous vous dites qu'en faisant un effort, ça ira mieux : raté, c'est pire. En suite vous recommencez sans trop y croire, et là ça revient.... En fait, c'est de vouloir réussir quelque chose qui vous en empêche, ça vous distrait. Prenez donc garde à ne pas transformer le comptage, qui est un moyen d'observation, en objectif à atteindre.

C'est la même chose pendant les réunions : le temps que vous passez votre temps à vous dire "zut je suis pas concentré, il faudrait que je me concentre, halala j'y arriverai jamais", c'est du temps en moins pour suivre ce qui se dit.

En fait, si on répète (quelques semaines), l'attention reste plus facilement focalisée. Mais ce n'est pas très amusant comme méthode d'entraînement, faites plutôt du yoga. Ou finalement, faites de n'importe quelle activité (la cuisine, passer le balai, se promener...). Marcher 500 m en faisant attention à bien sentir chaque pas, ça aussi ça ne prend que 5 min. Faites ce que vous avez à faire, et chaque fois que vous voyez que vous pensez à quelque chose, revenez à ce que vous faites.

dimanche 20 janvier 2013

Programmation : la technique de descente récursive

Quelques explications sur la technique de "descente récursive", très utilisée pour faire des compilateurs. Explication par étapes sur un petit exemple de programme qui calcule la valeur d'une expression arithmétique entière comme "(2+2)*20 + 4*(4-1)/2" Ça peut être une idée de traduire le pseudo-code dans le langage de programmation de votre choix.

Lire la suite

jeudi 27 décembre 2012

Entre assembleur et FORTRAN : à la recherche du chainon manquant

Le désoeuvrement, origine de tous les vices, m'a poussé à chercher ce qu'on aurait pu inventer comme langage de programmation au dessus de l'assembleur, mais en dessous de FORTRAN. Plus basique que BASIC.



Donc j'ai conservé la traduction des formules, et supprimé tout ce qui est structures de contrôle. Hop, plus de boucle DO. Juste une instruction de saut, éventuellement conditionnelle.



Pour commence, voila un exemple simple : somme des carrés de 1 à N

 
 #
 # somme des carrés des entiers de 1 à 5
 #
   print "--- exemple : somme des carres des entiers de 1 à 5"
   declare somme, n, i
debut
   somme = 0
   n = 5
   i = 1
boucle
   jump fin if i > n
   somme = somme + i * i
   print i, somme
   i = i + 1
   jump boucle
fin
     print "somme = ",somme
     stop

Une instruction/déclaration par ligne. Les étiquettes commencent en colonne 1. La déclaration des variables est obligatoire (mais il n'y a qu'un type entier). Tableaux multidimensionnels indicés à partir de 1. Le saut conditionnel utilise une comparaison (pas de conditions composées). Un jour, peut être, il y aura print/println, et input pour des lectures. Bon, ça y est vous savez programmer.



Et pour faire bon poids, le problème des 8 reines

#
# pb des 8 reines
# m billaud, 27 dec 2012
#
     declare n, t(8), q, nb

     n  = 8    # nombre de reines
     nb = 0    # nombre de solutions trouvées
     q  = 0    # nombre de reines positionnées

success                     # les reines t1..q sont compatibles
     jump display if q == n
     q = q + 1              # on essaie d'en placer une autre
     t(q) = 1
test                        #  tq compatible avec t1..q-1 ?
     declare i
     i = 1
testi
     jump success if i == q     # oui. alors on passe à la suivante
     jump next    if t(i) == t(q)
     jump next    if t(i)-t(q) == i-q
     jump next    if t(i)-t(q) == q-i	
     i = i + 1
     jump testi
                            # non, on essaie autre chose
# --
next
     t(q) = t(q)+1          # autre possibilité pour la même reine ?
     jump test if t(q) <= n   
	
	
fail                        # non, retour à la reine précédente
     q = q - 1
     jump next if q > 0
                            # plus de possibilités   
     print "On a trouvé", nb,"solutions."     # y en a 92, je vous assure.
     stop
#
# affichage d'une solution
#
    
display
    declare r
    r = 0
    i = n
    nb = nb + 1
displayloop
    r = 10*r + t(i)
    i = i - 1
    jump displayloop if i > 0
    print "solution ", nb,"=", r
    jump fail            # inutile d'essayer de changer t(n)

Ah, et les tours de Hanoi (hello, HCM !)

#
# tours de Hanoi
#
    declare from(10), to(10), nb(10)
    declare top
    declare f, t, b, n
    top = 1
    from(top) = 1
    to(top) = 2
    nb(top) = 3
    print "*** tours de hanoi avec n=", nb(top)
loop
    f= from(top) 
    t = to(top)
    b = 6 - (f+t)
    n = nb(top)
#   print "boucle", f, t, b
    top = top -1
    jump general if n > 1
    print f,"->",t
    jump next
general
    from(top+3) = f
    to  (top+3) = b 
    nb  (top+3) = n-1
    
    from(top+2) = f
    to  (top+2) = t 
    nb  (top+2) = 1
    
    from(top+1) = b
    to  (top+1) = t 
    nb  (top+1) = n-1

    top = top+3
next
    jump loop if top > 0    
    stop

L'interprète est écrit en Python, environ 600 lignes. Analyse par descente récursive, traduction sous forme de code intermédiaire : tableau d'objets "instruction" contenant des "Expression" arborescentes, évaluées récursivement.

samedi 28 juillet 2012

Itérables en Java

Je cherchais un exemple simple pour montrer comment parcourir un objet en Java, à l'aide du fameux "foreach" ajouté en Java 1.6 (je crois). J'ai trouvé des exemples pas simples, alors voila.

Lire la suite

lundi 2 janvier 2012

Réglage luminosité sur Samsung N110 (Linux/Debian)

Sous Linux/Debian tout marche assez bien sur le Samsung N110, sauf les touches de réglage de luminosité. Et comme l'écran est un peu sombre, ça m'embête un peu. En principe il y a des utilitaires comme xbacklight qui devraient s'en occuper, mais ça marche pas.

# xbacklight 
No outputs have backlight property

Doh!

Voila déjà une manière de faire (avertissement : ça marche pour moi, mais si ça grille votre matériel inutile de me faire un procès, je vous ai prévenu).

        sudo  setpci -s 00:02.0  F4.B=FF

Vous pouvez remplacer FF par d'autres valeurs en hexadécimal 00 c'est le noir complet (n'essayez pas), FF est à fond.

Sur internet, on trouve des conseils disant d'utiliser l'adresse 00:02.1, qui est l'adresse du contrôleur graphique.

$ lspci  | grep Graph
00:02.0 VGA compatible controller: Intel Corporation N10 Family Integrated Graphics Controller
00:02.1 Display controller: Intel Corporation N10 Family Integrated Graphics Controller

pour moi ça n'a rien donné, et quand j'ai essayé avec celle du machin VGA, ça a marché. Donc voila.

mercredi 21 décembre 2011

Une clé USB qui lance des scripts d'administration.

Imaginons un gros parc de machines sous linux, qui tournent à peu près mais sur lesquelles il faut faire quelques manips d'administration. Manque de chance, on ne peut pas faire les manips par ssh (par exemple, une mise à jour malencontreuse a viré le pilote de la carte réseau). D'où l'idée de mettre sur une clé USB un script avec les commandes à appliquer, et s'arranger pour que ce script soit lancé dès qu'on insère la clé USB, sans avoir à s'authentifier. Évidemment, il n'est pas question de faire ça avec n'importe quelle clé, et il faut préparer les machines avant.

Lire la suite

samedi 12 novembre 2011

tablette graphique, le retour

Le portable Dell ayant cessé de me rendre ses inestimables services (carte graphique kaputt), j'ai investi il y a quelque temps dans un netbook Samsung (NC110) moins cher, moins lourd etc. et qui, muni d"un grand écran et d'un clavier USB, me sert de machine principale à la maison. Reste à y brancher les périphériques existants : le retour de la tablette trust TB 5300

Lire la suite

vendredi 11 février 2011

Carte Wifi, Dell Latitude D600, Debian 6.0 Squeeze

Un petit problème en migrant mon portable de Debian Lenny à Squeeze : la carte wifi n'était pas reconnue.

Lire la suite

mercredi 26 janvier 2011

Arnaque au Vietnam

Mon troisième voyage (2011) au Vietnam aura été l'occasion d'une rencontre inattendue : un quatuor d'arnaqueurs. Qui me voyaient très bien dans le rôle du pigeon.

Lire la suite

vendredi 12 novembre 2010

Authentification par imap

J'ai une application Web, dont l'accès est réservé aux utilisateurs qui ont des comptes quelque part. Dans l'idéal il faudrait mettre en place un SSO, mais ça ne dépend pas que de moi. Donc je fais l'authentification par l'intermédiaire du serveur de courrier IMAP : on lui envoie une demande de connexion avec le nom d'utilisateur et le mot de passe dans le bon format, et on voit ce qu'il répond.

Lire la suite