Journal De l'art de la notification

Posté par .
Tags : aucun
17
24
juil.
2012

Salut à toi codeur ;)

Tu n'est pas sans savoir que ta lourde tâche qui t'incombe n'est pas sans une longue est fastidieuse période d'attente.

Pour combler cette attente il existe une multitude de solutions

  • discutailler avec un collègue
  • faire un tour à la machine à café
  • faire de le veille technologique
  • ou plus pragmatique regarder le code pour repérer des truc avant que le compilo ne tombe dessus (ça marche aussi avec les langages interprétés, mais c'est plus technique)
  • ou encore se tourner les pouces

mais voila, par soucis d'efficience, au delà du make -j kekchose, j'enchaine souvent mes make (ou plutôt mes alias de make ) par un ;beep qui lui même est un alias if which xeyes &>/dev/null ; then xeyes ; else xlogo ;fi

Le gestionnaire de bureau s'occupant lui même de le faire apparaitre sur tous les espaces de travail.

Pendant un temps c'était un xosd, mais le truc était trop temporaire.

Et toi cher codeur quel est ta technique pour être notifié de la fin d'une exécution ?

  • # zenity

    Posté par (page perso) . Évalué à 4.

    Je propose: make && zenity --notification --text="Compilation terminée"

    Après, les notifications sonores, c'est bien aussi…

    • [^] # Re: zenity

      Posté par . Évalué à 5.

      Je propose: make && zenity --notification --text="Compilation terminée"

      Et si le make échoue, tu n'es au courant de rien ?

      Knowing the syntax of Java does not make someone a software engineer.

      • [^] # Re: zenity

        Posté par (page perso) . Évalué à 10.

        Mes appels à make n'échouent pas.

        Je suis Chuck Norris et j'approuve ce message !

  • # Je code en écoutant de la musique

    Posté par . Évalué à 3.

    Vu que j'ai un casque quand je code (pour écouter de la musique). Un beep, ça s'entend pas trop.

    Donc je me suis fait un petit script :

    # $ cat bin/alarm
    #!/usr/bin/env sh
    
    echo "Type ^C"
    
    while true
    do
        for i in $(seq 3)
        do
            echo -n -e "\a"
            sleep 0.2
        done
        sleep 0.4
    done
    
    

    et hop un petit,

    $ compilation ; alarm
    
    

    Knowing the syntax of Java does not make someone a software engineer.

  • # osd

    Posté par (page perso) . Évalué à 3.

    Ah ben moi aussi j'affiche un petit message en OSD pendant une demi-seconde, mais effectivement des fois quand je suis un peu trop concentré sur le moulage il m'arrive de zapper le message

    D'ailleurs j'aimerais bien trouver un osd cross-platform win/linux/macos ( et qui ne vole pas le focus)

    • [^] # Re: osd

      Posté par . Évalué à 8.

      D'ailleurs j'aimerais bien trouver un osd cross-platform win/linux/macos ( et qui ne vole pas le focus)

      Un mail ?

      À mon avis, c'est la réponse la plus basique qui soit et pourtant c'est celle qui répond à le plus d'usage.

      Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

      • [^] # courriel aussi

        Posté par . Évalué à 2.

        C'est comme ça que je faisais aussi, et en prime, je me mettais un rapport en pièce jointe, je crois bien, et au moins le statut (succès ou non) dans le message et/ou dans le titre.

        • [^] # Re: courriel aussi

          Posté par . Évalué à 4.

          Et le must, c'est que tu as un archivage, alors qu'une fois que tu as validé une notification celle-ci disparaît.

          Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

          • [^] # Re: courriel aussi

            Posté par . Évalué à 2.

            Oui, je m'étais dit ça aussi, mais je n'ai pas osé en faire un argument parce que c'est pas super élégant d'archiver dans la boîte de messagerie.

            Le script de compilation peut faire ça mieux en copiant le rapport directement au bon endroit.

    • [^] # Re: osd

      Posté par (page perso) . Évalué à 4.

      Et une notification directement dans la tribioune ? Si ca c'est pas joindre l'utile a l'agreable, je ne m'y connais pas !

  • # notify-send

    Posté par (page perso) . Évalué à 10.

    Fourni par un collègue.

    function doAndWarn () 
        { 
            echo "doAndWarn $1";
            START=`date`;
            send_alias=$(alias);
            cmd="$1";
            shift;
            args=${1:+$(IFS='"' echo "\"${*//\"/\\\"}\"")};
            if bash -O expand_aliases ; then
                notify-send -u low -i /usr/share/icons/gnome/scalable/emblems/emblem-default.svg "Command $cmd is finished.";
            else
                notify-send -u critical -i /usr/share/icons/gnome/scalable/emblems/emblem-important.svg "Command $cmd failed!";
            fi <<EOF
        cd $PWD
        $send_alias
        $cmd $args
        EOF
    
            echo "Started at $START.";
            echo "Ended   at" `date`"."
        }
    
    

    Affiche une pop-up de notification avec logo & message adapté au résultat.

    • [^] # Re: notify-send

      Posté par . Évalué à 1.

      Merci pour cette commande notify-send, je ne connaissais pas, c'est plus générique que kdialog.
      Sinon pour les utilisateurs de tmux, il y a aussi tmux display 'message' qui peut être intéressant. Je l'utilise dans un script "Make" qui se substitue au make habituel, et redirige les erreurs dans un fichier, ce qui permet de les charger dans vim (:help :cg).

  • # La ventilation

    Posté par (page perso) . Évalué à 10.

    La surchauffe et le moment où ça s'arrête, ça s'entend. Surtout si on est avec un laptop.

    Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/

  • # Lock free coder

    Posté par . Évalué à 10.

    Et toi cher codeur quel est ta technique pour être notifié de la fin d'une exécution ?

    Moi je vis dans ce siècle. Je n'utilise pas de technologies préhistoriqus qui demandent des compilations interminables et je fais du code qui va vite. Du coup j'attends pas et je passe pas pour un bof des années 80 avec xeyes. J'évite aussi d'écrire des tests par ce que sinon j'aurais a attendre…

    • [^] # Re: Lock free coder

      Posté par . Évalué à 2.

      que ce soit pour la compile ou pour autre chose quand tu bosses bien, la machine bosse à ta place, et il convient d'avoir un truc pour être notifié ;)

      Bon pour la j'ai du modifier mon beep, car sur la machine distante je n'ai pas de xlogo ou xeyes, je suis obligé de faire un ssh sur une machine qui l'a pour le faire…

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Lock free coder

        Posté par . Évalué à 1.

        Quand une machine bosse bien c'est que l'humain n'a pas le temps de se rendre compte qu'elle a bossée. Les compiles de 30 minutes c'est juste de la fainéantise de pas régler le vrai problème par ce que ca donne une excuse pour surfer l'interweb. L'humain est très mauvais au context switch et à l'asynchrone.

        • [^] # Re: Lock free coder

          Posté par . Évalué à 8.

          Quand tu as 3 To de données à traiter, à moins d'avoir accès à une ferme google, tes machines vont devoir passer un moment à traiter tes données.

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: Lock free coder

          Posté par . Évalué à 1.

          surfer l'interweb

          Et regarder des petites nimages

    • [^] # Re: Lock free coder

      Posté par (page perso) . Évalué à 3.

      Tu évites aussi d'écrire des commentaires parce que ça n'est pas du code qui va vite ?

      Et pour les tests, si c'est quelqu'un d'autre qui les écrit pour toi, au final ça ne fait que déporter le problème d'une personne à l'autre. Si personne ne les écrit en revanche…

      Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/

  • # echo "C'est fini"|cw

    Posté par (page perso) . Évalué à 4.

    echo "C'est fini"|cw -w 15
    
    

    je viens de découvrir ce petit soft à la unix pour faire du … morse. (ça fait parti du paquet unixcw, le nouveau: http://unixcw.sourceforge.net/)

  • # web 2.1

    Posté par . Évalué à 5.

    script qui poste un twit pour que tu sois averti par ton AndroWinIphone et par la même occasion l'ensemble de la planète?

  • # Agence de presse

    Posté par . Évalué à 10.

    Et toi cher codeur quel est ta technique pour être notifié de la fin d'une exécution ?

    En suivant le flux RSS d'une agence de presse, on est généralement informé quelque jours avant, pendant et après une exécution.

    Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.

  • # Pantheon Terminal

    Posté par (page perso) . Évalué à 2.

    Il y a un an j'ai écrit les premières lignes du terminal du bureau Pantheon. Sa plus grande particularité était qu'il intégrait Notify OSD pour notifier l'utilisateur de la fin d'une tâche. Le développement a continué sans moi, je ne sais pas si cette fonctionnalités est toujours présente.

  • # WM_HINTS

    Posté par . Évalué à 4.

    Je me sers quelque fois que la propriété WM_HINTS de X. dans un xterm, il suffit de faire make blabla ; echo -e "\a" Ensuite, ça dépend du gestionnaire de fenêtre. Sous i3, j'ai configuré le truc pour que le tag de la fenêtre vire au rouge, et j'ai un raccourci clavier qui me donne le focus sur la dernière fenêtre à être passer urgent (Meta+u). vala. Comme d'autres prog comme pidgin gèrent aussi cette propriété, c'est pas mal.

    Plus de détails ici

    Faut pas gonfler Gérard Lambert quand il répare sa mobylette.

  • # eject

    Posté par . Évalué à 7.

    Pour ma part, quand je lance une commande qui prend du temps et que je souhaite être notifié alors que je bosse sur un autre bureau virtuel, j'exécute la commande "eject" après la tâche.

    L'avantage c'est que ça attire mon attention de manière sonore ("clic !"), visuelle, et tactile, puisque que le lecteur CD vient toucher la main qui tient la souris (si je suis en train d'utiliser Firefox). Si je m'absente de mon bureau et que la commande se termine pendant mon absence, à mon retour je retrouve le lecteur CD ouvert donc je sais que la tâche est terminée.

    Note : je bosse sur un laptop.

    • [^] # Re: eject

      Posté par . Évalué à 3.

      Va falloir upgrader ta technique prochainement. Les media optiques c'est obsolète depuis 10 ans. Les derniers constructeurs résistants vont bien finir par virer ce truc qui sert à rien.

      • [^] # Re: eject

        Posté par (page perso) . Évalué à 10.

        Ça donnerait une utilité intéressante aux lances missiles usb.

        Envoyé depuis mon lapin.

        • [^] # Re: eject

          Posté par (page perso) . Évalué à 10.

          Faudrait que je retrouve la page, mais certaines personnes s'étaient justement amusées à connecter un lance missiles usb à un serveur d'intégration continue. En cas de build failed, ça récupérait l'auteur du dernier commit et lançait un missile sur la cible (je pense en ayant préalablement indiqué les positions des auteurs possibles).

          Ca doit être plutôt marrant.
          Ha oui, et histoire de rigoler il y avait aussi une webcam sur le lance missile histoire d'enregistrer l'action :)

  • # Intégré à mon prompt

    Posté par . Évalué à 6. Dernière modification le 24/07/12 à 23:33.

    Et toi cher codeur quel est ta technique pour être notifié de la fin d'une exécution ?

    C´est intégré à la commande qui gère mon prompt :

    # NOTIF_MIN_RUN: notify command termination if command ran longer than this (sec)
    # NOTIF_OK_ICON: icon to display if $? == 0
    # NOTIF_KO_ICON: icon to display if $? != 0
    # NOTIF_TIMEOUT: delay to display notifications (sec)
    # NOTIF_PRIO   : notification priority
    # NOTIF_CMDS   : array of grep-expressions of commands to notify for
    NOTIF_MIN_RUN=10
    NOTIF_OK_ICON='/usr/share/icons/gnome/48x48/emblems/emblem-default.png'
    NOTIF_KO_ICON='/usr/share/icons/gnome/48x48/status/dialog-warning.png'
    NOTIF_TIMEOUT=10
    NOTIF_PRIO=low
    NOTIF_CMDS=(
        "\</?configure'? .*"
        "\</?q?make'? .*"
    )
    
    do_notify() {
        local ret="${1}"; shift
        local cmd="${*}"
        local pwd="$(pwd)"
        local msg icon
    
        if [ ${ret} -eq 0 ]; then
            title="Command finished successfully"
            icon="${NOTIF_OK_ICON}"
        else
            title="Command terminated in error"
            icon="${NOTIF_KO_ICON}"
        fi
        case "${pwd}" in
            "${HOME}"/?*)   pwd="~${pwd#${HOME}}";;
        esac
        msg="$( printf "CWD: %s\nCMD: %s" "${pwd}" "${cmd}" )"
    
        notify-send -t $((1000*NOTIF_TIMEOUT))  \
                    -u ${NOTIF_PRIO}            \
                    -i "${icon}"                \
                    "${title}"                  \
                    "${msg}"
    }
    
    do_prompt() {
    # [...]
        # Was the last command running for long enough that it warrants a notification?
        last_run="$( history |tail -n 1                                               \
                     |sed -r -e |sed -r -e 's/^[''[:space:]'']*[''[:digit:]'']+[''[:space:]'']+(.*)$/\1/;'   \
                   )"
        last_run_cmd="${last_run#* }"
        last_run_epoch="$( date -d "$( sed -r -e 's/(....)(..)(..)\.(..)(..)(..)/\1-\2-\3 \4:\5:\6/;' <<<"${last_run%% *}" )" '+%s' )"
        cur_epoch="$( date '+%s' )"
        if [ $((cur_epoch-last_run_epoch)) -ge ${NOTIF_MIN_RUN} -a ${prompt_first} -eq 0 ]; then
            for c in "${NOTIF_CMDS[@]}"; do
                if grep -E "${c}" <<<"${last_run_cmd}" >/dev/null; then
                    do_notify ${RET} "${last_run_cmd}"
                    break
                fi
            done
        fi
    # [...]
      prompt_first=0
    }
    
    export prompt_first=1
    export -f doPrompt
    export PROMPT_COMMAND=doPrompt
    
    

    Note: j´ai été obligé de rajouter des simples quotes dans l´expression sed, sinon ça fait des liens Wikipedia… :-(

    Le bidouillage avec history, c´est parce que bash ne donne pas le temps d´exécution de la dernière commande. Utiliser history n´est pas très robuste, mais ça marchouille dans le cas droit.

    J´ai très peu de commandes notifiées, mais en ajouter est trivial.

    Dans le futur, je vais peut-être ajouter un son (Tadaa! pour succès, Blong-patatra pour une erreur), mais je n´aime pas trop les notifications sonores… Ceci dit, le rajouter dans le code ci-dessus sera trivial.

    Hop,
    Moi.

    • [^] # Re: Intégré à mon prompt

      Posté par . Évalué à 1.

      Ça ne ralenti pas trop le prompt ?

      • [^] # Re: Intégré à mon prompt

        Posté par . Évalué à 2.

        Tu estimes à combien le différentiel entre tes doigts et un processeur ?

        C'est joli mais il faudrait pouvoir afficher la notification uniquement quand le term/la tab courante n'a pas le focus. Autrement un echo "toto" | less provoque une notification.

        • [^] # Re: Intégré à mon prompt

          Posté par . Évalué à 2. Dernière modification le 25/07/12 à 19:45.

          Tu estimes à combien le différentiel entre tes doigts et un processeur ?

          En effet ! ;-)

          il faudrait pouvoir afficher la notification uniquement quand le term/la tab courante n'a pas le focus. Autrement un echo "toto" | less provoque une notification.

          C´est pour ça qu´il y a une liste de (patterns de) commandes pour lesquelles on doit notifier. Les commandes qui ne matchent pas une pattern n´ont pas droit à notification.

          Pour moi, les seules commandes qui provoquent une notification si elles durent plus de 10s, c´est :

          • configure
          • make et qmake
          • ct-ng (crosstool-NG)

          Du coup, c´est vrai que le make menuconfig du noyau me pète toujours une notification. Mais bon, je fait avec. C´est pas parfait, mais ça fait avec.

          Pour l´instant, il n´y a que des patterns positives (ça match, je notifie), mais je vais peut-être ajouter des patterns négatives (ça match, je notifie pas). Il faut juste que je trouve une syntaxe sympa (eg. si la pattern commence par !, alors elle est négative. Tiens, ouais, c´est plutôt sympa, ça! Merci! ;-) )

          Hop,
          Moi.

          PS. Je me rend compte qu´il y a un mauvais copy-paste et u´un sed se trouvé en double… Vous aurez bien entendu corrigé de vous-mêmes !

          • [^] # Re: Intégré à mon prompt

            Posté par . Évalué à 2.

            J'avoue que j'ai remplacé tes patterns par ".*". J'ai réfléchi 30s à la solution pour savoir si la tab courante à le focus (gnome-terminal ou screen) mais j'ai pas eu la révélation.

            Pour être gentil avec celui qui essaierait ton code tu peux aussi lui donner ton HISTTIMEFORMAT et s/doPrompt/do_prompt/ ;)

            • [^] # Re: Intégré à mon prompt

              Posté par . Évalué à 2.

              j'ai remplacé tes patterns par ".*"

              Dans le premier sed ou le second ? Dans un cas comme dans l´autre, je ne vois pas comment ça peut marcher… :-/ Je vais essayer plus tard, si ça peux simplifier le bousin. Mais par défaut, j´ai tendance à être strict dans mes regexps

              savoir si la tab courante à le focus

              Je ne pense pas que ce soit faisable. En tout cas, pour konsole (dans yakuake), ça n´est pas possible, de tout ce que j´ai pu lire comme doc … :-/

              tu peux aussi lui donner ton HISTTIMEFORMAT

              En effet …

              set |grep -E '^HIST'
              HISTCONTROL=ignoredups:erasedups
              HISTFILE=/home/ymorin/.bash_history
              HISTFILESIZE=131072
              HISTIGNORE='h *'
              HISTSIZE=131072
              HISTTIMEFORMAT='%Y%m%d.%H%M%S '
              
              

              s/doPrompt/do_prompt/

              Ouaip dans mon copy-paste, mais j´ai effectivement deux fonctions, doPrompt qui appelle do_prompt (j´ai jamais dit que c´était propre ! ). Du coup, j´ai oublié de modifier l´extrait en conséquence …

              Hop,
              Moi.

      • [^] # Re: Intégré à mon prompt

        Posté par . Évalué à 2. Dernière modification le 25/07/12 à 19:40.

        Ça ne ralenti pas trop le prompt ?

        Pff … Honnêtement, j´ai pas mesuré. J´appuie sur Entrée, je lève les yeux, le nouveau prompt est visible. Ça me convient très bien. Et puis, si je dois attendre moins de ~1s, c´est pas bien grave.

        Mon prompt fait plein d´autre choses :

        • notification (ci-dessus)
        • status du repo courant : détection Hg, git, svn; puis status, formatage, etc …
        • calcul autonomie : détection présence batterie, calcul, formatage
        • loadavg, date, session ssh et/ou screen …
        • formatage CWD : ${HOME}/ -> ~/, élision au milieux si trop long …
        • formatage prompt global (Cf. plus bas pour exemple)
        • sauver + relire l'historique

        Durée totale : moins d´une seconde quand je suis dans repo git ou Hg avec plein de modifs (eg. un noyal avec plein de patchs locaux). Bon, pour svn (qui est le mal ;-] ), ça peut prendre un poil de temps sur un gros checkout. Si le CWD est sur le réseau (eg. NFS ou sshfs), alors c´est assez galère en effet (mais bon, ça ne m´arrive que très rarement).

        ┌───┤~/dev/kconfig-frontends/current☿default:145+patches:0+├────────────────┤0.14|4:04↓├──────┤20120725.193206├───
        └─┤ymorin@treguer:pts/16|ret=12├────>
        
        

        Hop,
        Moi.

  • # CTRL+B

    Posté par . Évalué à 0.

    Je code en java dans Eclipse, la compilation est quasi instantanée.

    • [^] # Re: CTRL+B

      Posté par . Évalué à 8.

      Mais t'as pas besoin d'une notification pour savoir quand eclipse a enfin fini de se lancer ?

    • [^] # Re: CTRL+B

      Posté par . Évalué à 1.

      $ cat Class.java
      public class Class {}
      
      $ time javac Class.java
      real    0m1.807s
      
      $ time javac Class.java
      real    0m0.795s
      
      $ cat f.c 
      int f(void){return 0;}
      
      $ time gcc -c f.c 
      real    0m0.213s
      
      $ time gcc -c f.c 
      real    0m0.036s
      
      

      Désolé, c'était trop tentant :) Une demie seconde pour compiler un fichier vide c'est déjà pas instantané, alors un projet entier…

      Please do not feed the trolls

      • [^] # Re: CTRL+B

        Posté par . Évalué à 3.

        en fait, avec la quantité confortable de mémoire que prend Eclipse, il peut se permettre de ne compiler que ce qui change, donc cela ne dépend pas de la taille du projet, mais de l'itération que tu as fait.
        j'ai la sale manie de builder toutes les dix secondes et c'est vraiment instantané.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.