Avertissement de la passerelle antivirus Mailcleaner
----------------------------------------------------

Les règles de sécurité de notre entreprise interdisent la
transmission de la pièce jointe "msg-11853-33.txt".

Celle-ci a été remplacée par cet avertissement.

La pièce jointe a été conservée sur la passerelle.  Elle peut donc
vous être rendue sur demande.  Faites suivre ce message à
[email protected] pour la récupérer.

Résultats de l'antivirus:
   MailCleaner:  (msg-11853-33.txt)


Contactez [email protected] pour plus d'informations.

Information de repérage: mailcleanerpro:20180215/1emRxi-00061G-2I

-----------
Mailcleaner
Désolé si je passe pour un Philistin, mais pourquoi ne pas faire ça en séquentiel et en Python? 

Pour être constructif, j’ai fait le test (c’est un peu plus verbeux, mais c’est assez clair)

#!/usr/bin/env python3
# -*- coding: utf-8 -*
"""
Read file from stdin, fix dates and give totals
"""
import sys
import time
from dateutil.parser import parse as date_parse

start_time = time.time()

# extract the values
lines = [l.strip().split(" ", 1) for l in sys.stdin.readlines() if l.strip()]

# split
lines = [(float(a), date_parse(d)) for a, d in lines]

# output
print('\n'.join(["%11.2f %s" % (a, d) for a, d in lines]))
print("%11.2f" % sum([a for a, d in lines]))

print("--- %s seconds ---" % (time.time() - start_time), file=sys.stderr)

En exécutant sur mon Raspberry Pi j’obtiens:
    3569.00 2011-12-29 17:07:20
     594.40 2015-03-05 05:44:40
    9546.85 2015-12-31 06:56:45
    3445.75 2016-07-14 18:43:15
 4674781.85
--- 6.447550058364868 seconds ---

Ce qui n’est pas mal…

Et voici ma config (Raspberry 1B, je crois):
cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7

Hardware : BCM2708
Revision : 0010
Serial : 00000000e6fb0385

Comme quoi Python est un bon camion pour les tâches système.

Par contre je suis conscient qu’on ne fait pas toujours les choses d’une certaine façon parce que c’est facile, mais parce qu’il y a quelque chose à apprendre et par esprit d'aventure. Autrement il n’y aurait pas de motards, et tout le monde choisirait le confort prosaïque de la bagnole...

Bonne soirée,
Laurent




Le 15 févr. 2018 à 21:01, felix <[email protected]> a écrit :

On Thu, Feb 15, 2018 at 07:56:21AM +0100, Laurent Franceschetti wrote:

Surtout quel est le problème que cette méthode résoud, et quelle est l’idée
centrale de la méthode?

Eliminer les ``forks'' répétitifs qui peuvent être évités.

Petit exemple: Voici un fichier:

 $ wget http://f-hauri.ch/vrac/scTestFile.raw.gz
 scTestFile.raw.gz   100%[===================>]  12.14K  --.-KB/s  in 0.004s

Qui contient des lignes (1000) de montants suivits de dates:

 $ zcat scTestFile.raw.gz | (head -n3;tail -n7)
      2032.55  Jul 22 00:12:45 2007
      6229.85  Apr 19 20:31:15 2010
      3089.75  Sun Nov  2 08:48:10 2014
      3816.30  Sat Nov 19 21:12:50 2016
      7934.70  May 23 16:47:40 2008
      2969.45  Aug 30 2017 01:43:45
      3569.00  2011-12-29 17:07:20
       594.40  Thu Mar  5 05:44:40 2015
      9546.85  Dec 31 2015 06:56:45
      3445.75  2016-07-14 18:43:15

Pour
 - unifier la présentation des dates et
 - calculer le total des montants,
je peux:

 $ tot=0.0
 $ time while read val date;do
       tot=$(bc -l <<<"$tot+$val")
       printf "%11.2f %(%a %d %b %Y %T)T\n" $val $(
           date -d "$date" +%s
       )
   done < <(zcat scTestFile.raw.gz) > >(head -n3;tail -n7)
     2032.55 dim 22 jui 2007 00:12:45
     6229.85 lun 19 avr 2010 20:31:15
     3089.75 dim 02 nov 2014 08:48:10
     3816.30 sam 19 nov 2016 21:12:50
     7934.70 ven 23 mai 2008 16:47:40
     2969.45 mer 30 aoû 2017 01:43:45
     3569.00 jeu 29 déc 2011 17:07:20
      594.40 jeu 05 mar 2015 05:44:40
     9546.85 jeu 31 déc 2015 06:56:45
     3445.75 jeu 14 jui 2016 18:43:15
 real    2m0.433s
 user    0m20.960s
 sys     0m24.550s

Euh oui, je l'ai fait sur un raspberry-pi... 2 minutes!

 $ echo $tot
 4674781.85

Bon, à présent voyons:

 $ wget https://f-hauri.ch/vrac/shell_connector.sh
 shell_connector.sh  100%[===================>]   7.93K  --.-KB/s    in 0.005s  

 $ . shell_connector.sh
 $ newConnector /usr/bin/bc -l 0 0
 $ newConnector /bin/date '-f - +%s' @0 0
 $ echo >&$BCIN tot=0

Oui, je stoque la variable tot dans `bc`...

 $ time while read val date ;do
     echo >&$BCIN tot=tot+$val
     myDate "$date" mDate
     printf "%11.2f %(%a %d %b %Y %T)T\n" $val $mDate
   done < <(zcat scTestFile.raw.gz) > >(head -n3;tail -n7)
     2032.55 dim 22 jui 2007 00:12:45
     6229.85 lun 19 avr 2010 20:31:15
     3089.75 dim 02 nov 2014 08:48:10
     3816.30 sam 19 nov 2016 21:12:50
     7934.70 ven 23 mai 2008 16:47:40
     2969.45 mer 30 aoû 2017 01:43:45
     3569.00 jeu 29 déc 2011 17:07:20
      594.40 jeu 05 mar 2015 05:44:40
     9546.85 jeu 31 déc 2015 06:56:45
     3445.75 jeu 14 jui 2016 18:43:15
 real    0m8.043s
 user    0m2.370s
 sys     0m0.800s

Voilà, en évitant ~2000 forks, je le fais en 8" au lieu de 120"!

 $ myBc tot montotal
 $ echo $montotal
 4674781.85

Tant que mon shell courant existe et que je ne ferme pas les
descripteurs, je peux continuer à les utiliser...

 $ ps --sid $(ps ho sid $$) fw
   PID TTY      STAT   TIME COMMAND
  4625 pts/2    Ss     0:00 -bash
  9146 pts/2    S      0:00  \_ /usr/bin/bc -l
  9150 pts/2    S      0:00  \_ /bin/date -f - +%s
  9188 pts/2    R+     0:00  \_ ps --sid 4625 fw

Voilà, j'espère avoir montré l'intérêt de la méthode.
Bonne soirée!

--
Félix Hauri  -  <[email protected]>  -  http://www.f-hauri.ch
_______________________________________________
gull mailing list
[email protected]
http://forum.linux-gull.ch/mailman/listinfo/gull


_______________________________________________
gull mailing list
[email protected]
http://forum.linux-gull.ch/mailman/listinfo/gull

Répondre à