Christophe Bliard a écrit 108 commentaires

  • # Tail-call optimization de la factorielle ?

    Posté par  . En réponse à la dépêche Sortie du livre « Parallel and Concurrent Programming in Haskell ». Évalué à 3.

    Je ne connais pas Haskell mais certaines techniques comme le tail call optimization me séduisent. Du coup sur l'exemple de la fonction fac, je me demande si Haskell sait transformer ça en fonction tail-récursive ou s'il faut l'aider un peu en définissant d'autres fonctions ?

    Dans la doc Haskell, le tail call optimization est défini ainsi :

    In many programming languages, calling a function uses stack space, so a function that is tail recursive can build up a large stack of calls to itself, which wastes memory. Since in a tail call, the containing function is about to return, its environment can actually be discarded and the recursive call can be entered without creating a new stack frame. This trick is called tail call elimination or tail call optimisation and allows tail-recursive functions to recur indefinitely.

  • # Rudder

    Posté par  . En réponse à la dépêche Formation Puppet : lancement d'un cursus complet en France et en Suisse par Camptocamp. Évalué à 7.

    Il existe aussi Rudder. Il se base sur CFEngine et FusionInventory et propose une interface web d'administration et de supervision du parc. Il se veut simple à administrer et complet.

  • [^] # Re: Bon autant vous montrez le complet ça vous aidera peut etre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 1.

    Juste pour m'aider à apprendre awk, voici une solution sans tac

    % awk '
    BEGIN {
            getline previousline
    }
    {
            if ($3 != previousfield) {
                    print previousline
            }
            previousfield = $3
            previousline = $0
    }
    END {
            print previousline
    }' BD.dat
    ID MAC              Port          Switch      IP             Date      Heure
    1 00:B0:D0:22:46:16 Ethernet1/0/1 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    14 00:08:02:11:D6:01 Ethernet1/0/14 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    15 00:04:75:FE:0E:69 Ethernet1/0/15 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    16 00:04:75:D1:1F:69 Ethernet1/0/16 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    18 00:90:05:00:86:61 Ethernet1/0/18 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    19 00:21:5A:BD:F4:7C Ethernet1/0/19 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    20 00:13:20:63:18:15 Ethernet1/0/20 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    21 00:19:B9:3E:0A:26 Ethernet1/0/21 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    
    
  • [^] # Re: Bon autant vous montrez le complet ça vous aidera peut etre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 0.

    Merci ! J'avais pourtant regardé dans le man pour trouver une astuce mais je n'avais pas bien cherché.

  • [^] # Re: Bon autant vous montrez le complet ça vous aidera peut etre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 0.

    tac (cat à l'envers) permet d'afficher les lignes dans l'ordre inverse, ça me permet de contourner le fait que uniq garde la première ligne

    Avec deux tac et un peu de awk au lieu de uniq, on peut supprimer les doublons.

    % tac BD.dat | awk 'BEGIN { r="" } { while ($3 == r) { next } ; r = $3 ; print }' | tac
    ID MAC              Port          Switch      IP             Date      Heure
    1 00:B0:D0:22:46:16 Ethernet1/0/1 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    14 00:08:02:11:D6:01 Ethernet1/0/14 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    15 00:04:75:FE:0E:69 Ethernet1/0/15 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    16 00:04:75:D1:1F:69 Ethernet1/0/16 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    18 00:90:05:00:86:61 Ethernet1/0/18 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    19 00:21:5A:BD:F4:7C Ethernet1/0/19 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    20 00:13:20:63:18:15 Ethernet1/0/20 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    21 00:19:B9:3E:0A:26 Ethernet1/0/21 3com5500(IP= xxx.xxx.x.xx) 22-01-13 15:59:55
    
    

    Il y a peut-être une solution plus élégante et si quelqu'un est motivé, ça m'intéresse de la connaître.

  • [^] # Re: Bon autant vous montrez le complet ça vous aidera peut etre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 0.

    Oui avec la commande uniq : ça garde l. J'ai un peu adapté le fichier mac.sort pour l'exemple.

    % cat mac.sort 
    1 00:B0:D0:22:46:16
    2 00:25:B3:0E:64:FE
    12 00:03:BA:12:53:6A
    26 00:03:BA:12:53:6A
    27 00:03:BA:44:91:58
    25 00:60:08:2D:27:28
    28 08:00:20:CE:DB:06
    34 00:60:08:2D:27:28
    40 00:60:08:2D:27:28
    
    % uniq --skip-fields=1 mac.sort
    1 00:B0:D0:22:46:16
    2 00:25:B3:0E:64:FE
    12 00:03:BA:12:53:6A
    27 00:03:BA:44:91:58
    25 00:60:08:2D:27:28
    28 08:00:20:CE:DB:06
    34 00:60:08:2D:27:28
    
    

    --skip-fields (ou -f) permet d'ignorer le premier champ. Il faut alors que le reste soit identique pour que uniq puisse fonctionner. Si dans le fichier de résultat il y a des adresses mac identiques mais avec des descriptifs différents, il faut combiner plusieurs commandes

    Prenons le fichier suivant

    % cat result
    1 00:B0:D0:22:46:16 Ethernet1/0/1
    2 00:25:B3:0E:64:FE Ethernet1/0/2
    5 00:25:B3:0E:64:FE Ethernet1/0/5
    26 00:03:BA:12:53:6A Ethernet1/0/26
    27 00:03:BA:44:91:58 Ethernet1/0/27
    28 08:00:20:CE:DB:06 Ethernet1/0/28
    30 08:00:20:CE:DB:06 Ethernet1/0/29
    32 00:25:B3:0E:64:FE Ethernet1/0/32
    40 00:60:08:2D:27:28 Ethernet1/0/40
    
    

    On sélectionne les deux premiers champs, on lance le uniq et on s'en sert pour retrouver la ligne complète avec fgrep

    % grep -f <(cut -f1,2 -d\  result | uniq -f1) result
    1 00:B0:D0:22:46:16 Ethernet1/0/1
    2 00:25:B3:0E:64:FE Ethernet1/0/2
    26 00:03:BA:12:53:6A Ethernet1/0/26
    27 00:03:BA:44:91:58 Ethernet1/0/27
    28 08:00:20:CE:DB:06 Ethernet1/0/28
    32 00:25:B3:0E:64:FE Ethernet1/0/32
    40 00:60:08:2D:27:28 Ethernet1/0/40
    
    

    Seule la première occurrence est conservée

  • [^] # Re: Bon autant vous montrez le complet ça vous aidera peut etre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 0.

    join -1 1 -2 1 mac.sort <(fgrep -w -f <(cut -d ' ' -f 1 portname.sort) mac.sort)
    1 00:B0:D0:22:46:16 00:B0:D0:22:46:16
    2 00:25:B3:0E:64:FE 00:25:B3:0E:64:FE
    26 00:03:BA:12:53:6A 00:03:BA:12:53:6A
    27 00:03:BA:44:91:58 00:03:BA:44:91:58
    28 08:00:20:CE:DB:06 08:00:20:CE:DB:06
    40 00:60:08:2D:27:28 00:60:08:2D:27:28
    
    

    Voilà !

  • [^] # Re: Bizarre bizarre

    Posté par  . En réponse au message Utilisation de awk pour la jointure de 2 fichiers. Évalué à 0.

    On ne peut pas dire à "fgrep" de ne tenir compte que des motifs présents en début de ligne

    Non, mais on peut lui dire de ne sélectionner que des mots entiers avec -w

    fgrep -w 1 f2
    1 eth1
    
    
  • [^] # Re: Le but est de standardiser le contenu des logs

    Posté par  . En réponse à la dépêche Projet Lumberjack. Évalué à -6.

    D'où peut-on télécharger cet outil readlog ?

  • [^] # Re: sikuli

    Posté par  . En réponse à la dépêche Actionaz, un logiciel d'automatisation libre. Évalué à 2.

    Très pratique pour du test d'interface graphique quand justement l'interface graphique est spécifiée et qu'on veut s'assurer du résultat du rendu.

  • [^] # Re: Mon calcul

    Posté par  . En réponse à la dépêche Free lance son offre mobile : ce que ça change. Évalué à 2.

    Pareil, ma batterie ne tenait plus qu'une poignée d'heures, et elle a fini par gonfler et devenir inutilisable. J'en ai racheté une nouvelle pour 15 euros et désormais mon portable tient 4 à jours allumé pour un coût modique.

    C'est plus simple et plus écolo que de racheter un nouveau téléphone, même à 20-30 euros le nouveau téléphone.

  • [^] # Re: Questions

    Posté par  . En réponse à la dépêche Sortie officielle de GTK+ 3.0 !. Évalué à 2.

    Ça marche à merveille ! Je n'ai pas trop l'utilité de SHARE_HISTORY, mais INC_APPEND_HISTORY c'est l'option que je cherchais (mal apparemment).

    Faudrait que je lise ce Zsh Guide, même si c'est déjà un beau morceau...
  • [^] # Re: Questions

    Posté par  . En réponse à la dépêche Sortie officielle de GTK+ 3.0 !. Évalué à 2.

    Comment ça s'active ? J'utilise zsh mais la gestion de l'historique est la même que bash pour moi.
  • [^] # Re: Les miens

    Posté par  . En réponse au journal Blogs BD. Évalué à 1.

    Et comme autre blog BD de Pacco, en plus de http://www.mae-bd.fr/ , il y a aussi fucking karma. Je trouve les textes excellents. http://www.fuckingkarma.com/
  • [^] # Re: digital

    Posté par  . En réponse au journal La copie numérique selon la Warner. Évalué à 3.

    Et non, de la même manière qu'on peut compter jusqu'à 10 avec ses dix doigts levés, on compte jusqu'à 1024 :-)
  • [^] # Re: zgrep -r ma-chaine *.odt

    Posté par  . En réponse au message Recherches dans un répertoire plein d'ODT. Évalué à 1.

    Ou alors
    find . -name "*odt" | while read f ; do if zipgrep -q ma_recherche "$f" ; then echo "correspondance trouvee dans $f" ; fi ; done
    affichera le nom de chaque fichier dans lequel une correspondance est trouvée.
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à 1.

    Je ne connaissais pas, merci pour l'astuce. Par contre, il semble que ça fonctionne avec zsh mais pas avec bash.
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à 1.

    Je me suis trompé, j'ai mis des {} au lieu de (). normalement, c'est

    cd "/home/sacha/Bureau/images/test image 2"
    name=$(basename "$(pwd)")
    name=${name// /_}
    echo $name
    => test_image_2
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à 1.

    C'est balot, ma page ne s'est pas rafraîchie et j'ai cru que le commentaire n'avait pas été posté
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à -2.

    Le problème pourra venir des espaces dans les noms de dossier. Utilise les guillements
    basename "$(pwd)"

    Pour remplacer les espaces par des underscores, plutôt que sed et awk, le plus pratique, c'est d'utiliser les fonctions de remplacement du shell
    ${variable// /_}

    Au final, ça donne
    cd "/home/sacha/Bureau/images/test image 2"
    name=${basename "$(pwd)"}
    name=${name// /_}
    echo $name

    ça donne test_image_2
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à -2.

    Le problème pourra venir des espaces dans les noms de dossier. Utilise les guillements
    basename "$(pwd)"

    Pour remplacer les espaces par des underscores, plutôt que sed et awk, le plus pratique, c'est d'utiliser les fonctions de remplacement du shell
    ${variable// /_}

    Au final, ça donne
    cd "/home/sacha/Bureau/images/test image 2"
    name=${basename "$(pwd)"}
    name=${name// /_}
    echo $name
    => test_image_2
  • [^] # Re: Re:

    Posté par  . En réponse au message renommer les fichier par script en nom_dossier_jour.jpg. Évalué à 3.

    Le problème pourra venir des espaces dans les noms de dossier. Utilise les guillements
    basename "$(pwd)"

    Pour remplacer les espaces par des underscores, plutôt que sed et awk, le plus pratique, c'est d'utiliser les fonctions de remplacement du shell
    ${variable// /_}

    Au final, ça donne
    cd "/home/sacha/Bureau/images/test image 2"
    name=${basename "$(pwd)"}
    name=${name// /_}
    echo $name
    => test_image_2
  • [^] # Re: Je vais enfin pouvoir avoir un portable

    Posté par  . En réponse au journal And then they were four .... Évalué à 5.

    Après avoir été chez SFR puis chez Leclerc Mobile, je suis chez Simyo, et en effet ils sont plus compétitif que du mobicarte : prix fixe de 19 centimes la minute, sms à 10 centimes et un décompte à la seconde. Tout rechargement dure au minimum 3 mois, et il y a plusieurs formules de rechargement automatique. Pour gâter le tout, l'interface web du compte client est simple et claire.

    Pour le moment, j'ai pas trouvé mieux, mais s'il y a mieux, je suis preneur.
  • [^] # Re: Enfin, ça ressemble à quelque chose:

    Posté par  . En réponse au journal Singe de mer 2.0. Évalué à 6.

    ou plutôt 1023 Mo et 384 Ko de trop
  • # inpainting ?

    Posté par  . En réponse à la dépêche [GIMP] G'MIC évolue et s'internationalise. Évalué à 3.

    GREYCstoration permet de faire de l'inpainting, et quand on voit les démonstrations, c'est plutôt impressionnant (par exemple, http://cimg.sourceforge.net/greycstoration/img/res_zoobird.h(...) ; placez votre souris sur/hors de l'image pour voir le avant/après).

    Sur la page d'accueil de GREYCstoration, il est indiqué que G'MIC contient toutes les fonctionnalités de GREYCstoration, mais je n'ai pas réussi à trouver l'inpainting la dernière fois que je l'ai utilisé. Est-ce que cette nouvelle version le propose ?