Io ti odio!

Febbraio 14th, 2009

Caro collega,

stavolta lo scrivo qui: ieri ti ho odiato, per l’ennesima volta!

Quando il nostro collega DBA indiano e’ venuto da me chiedendomi:

«Angelo, come faccio ad inserire una stringa “NAME” su un file “tmp.log” da 1 GB tra la quarta e la quinta colonna con VI/VIM?»

Tu hai sentito… ti sei voluto alzare… con quell’aria da saccente… *dovevi* intrometterti… il tuo istinto da “nerdone-primo-della-classe-so-tutto-io” ti ha fatto venire alla mia scrivania mentre io scrivevo il one-liner perl necessario alla magia, consigliandomi di poterlo fare cosi’ e coli’… con sed piuttosto che con awk, e blabla…

nerd

Non e’ stato sufficiente che ti dicessi di farti i cazzi tuoi… dovevi gareggiare… dovevi farti sputtanare… e dopo 2 minuti hai avuto anche la sfacciataggine di mandare una email al collega col subject “sed version”, scrivendo questa zozzeria:

$ cat tmp.log | sed 's/^\(\W*\w\+\W\+\w\+\W\+\W*\w\+\)/\1 fff/g'

Ma ti ho punito con la eleganza del Perl:

$ perl -lpne 's/^((\w+\W+){3})/$1NAME /;' tmp.log

Sei old! OLD! Mettitelo in testa. Guarda quella linea, e’ ILLEGGIBILE. Con tutte quelle sequenze di escape!

Peccato che il DBA abbia scelto il tuo sed. In questo mondo non c’e’ giustizia.

Popularity: 32% [?]

pallotron Informatica, Irlanda, Lamentazioni, Lavoro, Programmazione, Unix , , , , ,

  1. Febbraio 14th, 2009 at 11:55 | #1

    attenzione. RILASCIO I BENCHMARK:

    $ time cat tmp.big.log | \
       sed 's/^\(\W*\w\+\W\+\w\+\W\+\W*\w\+\)/\1 NAME/g' > sedout
     
    cat tmp.big.log  
          0.01s user 0.27s system 0% cpu 36.300 total
    sed 's/^\(\W*\w\+\W\+\w\+\W\+\W*\w\+\)/\1 NAME/g' > sedout  
          35.58s user 0.68s system 99% cpu 36.318 total
     
    
     
    $ time perl -lpne 's/^((\w+\W+){3})/$1NAME /;' tmp.big.log > perlout
     
    perl -lpne 's/^((\w+\W+){3})/$1NAME /;' tmp.big.log > perlout  
     
    4.25s user 0.55s system 99% cpu 4.799 total
     
    

    Perl vince, 4.79 secondi contro 36.

  2. Febbraio 14th, 2009 at 14:46 | #2

    “Ma che cazzo ne vuoi sapere tu che sei pure immigrato” non te l’hanno detto? :)

  3. Febbraio 14th, 2009 at 14:51 | #3

    beh il tipo in questione e’ anche lui immigrato!

  4. Febbraio 14th, 2009 at 15:35 | #4

    Vabbe’, ma che il DBA abbia scelto la soluzione piu’ inefficace era scontato.

    Gia’ uno che vuole aprire un file di 1GB con VI…

  5. Febbraio 14th, 2009 at 15:40 | #5

    vim (non vi) e’ ok per aprire file da 1 GB :)

    basta disattivare lo swap file, l’undo, e fare un po’ di tuning sulla dimensione dei buffer, tutto in ~/.vimrc :)

  6. Febbraio 14th, 2009 at 15:59 | #6

    Provato mai a farlo con notepad?
    In Accenture andava molto di moda… :/

  7. Febbraio 14th, 2009 at 16:03 | #7

    vabe’ non mi meraviglio.
    quando ero a milano in vodafone per fare una cosa, c’era uno affianco a me che aveva problemi a “installare” jboss. ahhaha

  8. Febbraio 14th, 2009 at 16:42 | #8

    :)

  9. Febbraio 14th, 2009 at 23:58 | #9

    Per fare cose del genere, i programmatori tendono a usare linguaggi di programmazione, mentre i sistemisti tendono a usare sequenze di comandi.

    Io quando devo fare operazioni sulle stringhe uso sempre cose tipo: “cat pippo.txt | cut -f. -d 3 | grep -v fuffa > /tmp/pippo1.txt” piuttosto che una cosa in perl dato che non ci ho mai capito niente del perl :D

  10. Febbraio 15th, 2009 at 01:12 | #10

    il perl e’ un linguaggio di programmazione *anche* per sistemisti :)

    non ho nulla contro le sequenze di comandi, io sono pure in grado di fare sequenze muostruose, ma quando so che ho bisogno di velocita’ uso perl.
    cmq per tornare all’esempio dell’articolo, trovo + leggibile perl di sed in questo caso.

  11. Febbraio 15th, 2009 at 10:46 | #11

    perl rulez

  12. Beppe
    Febbraio 15th, 2009 at 11:09 | #12

    Fossi stato nella tua posizione sarei andato dal DBA a dirgli “ti ringrazio per l’aiuto non richiesto, la prossima volta fatti i fatti tuoi, poi amici(?) come prima. Anzi mi offri un caffè così discutiamo delle due soluzioni?”.
    La chiarezza (ed il caffè) prima di tutto!

    PS ci sono sempre i colleghi saccenti in qualunque campo

  13. Febbraio 15th, 2009 at 11:22 | #13

    @Beppe
    DBA? DBA e’ quello che mi ha chiesto il consiglio! aahahha. minchia NON LEGGETE.

  14. Febbraio 15th, 2009 at 12:00 | #14

    @pallotron
    si lo so, ci sono anche volumi dedicati all’uso del perl per funzioni sistemistiche, è solo colpa mia che non ci ho mai capito un cazzo :)

    sono mentalmente legato alle strutture estese e prolisse tipiche dei linguaggi ad alto livello.

  15. Beppe
    Febbraio 15th, 2009 at 13:22 | #15

    @pallotron
    Dho! Scusa è la febbre… Comunque il consiglio è sempre valido ;-)

  16. kimso
    Febbraio 16th, 2009 at 19:07 | #16

    Ma forse volevi dire colonna??
    che cacchio ci vuole ad inserire una qualunque cosa alla 5 riga??

    ahi ahi sti sysadmin… eheheh

    cmq. io avrei usato awk, solo perche’… ci sto giocando… ahahah
    ovviamente dipende dal file…

    Ma provando la tua con un file random ho visto che sostituisce parole tipo “http://sito” in “http://NAME sito” in pratica sballa il contaggio delle colonne..

    awk No … ahahah

  17. Febbraio 16th, 2009 at 19:10 | #17

    kimso perl fa quello che il manuale documenta, leggiti il manuale e avrai spiegazioni sia per awk che per perl.

  18. Febbraio 16th, 2009 at 19:23 | #18

    @kimso
    si volevo dire colonna. ho corretto.
    la posti la tua versione awk please? :D

  19. kimso
    Febbraio 17th, 2009 at 10:51 | #19

    Ma nooo che posto la versione,
    non voleva essere un confronto, anche perche’ non e’ oneline…

    e cmq. cme dice Antonio awk e’incluso in perl quindi…

    “9. Why would anyone still use awk instead of perl?
    clear perl code is better than unclear awk code; but NOTHING comes close to unclear perl code…”AHAHAHAH

    cmq. riguardo al funzionamento guarda qui:

    awk out
    return from NAME the rquest …
    Response: HTTP/1.1 NAME 200 OK
    Server: Apache-Coyote/1.1

    perl out
    return from NAME the rquest …
    Response: HTTP/NAME 1.1 200 OK
    Server: Apache-NAME Coyote/1.1

    Cheeers

  20. Febbraio 17th, 2009 at 11:29 | #20

    @kimso
    e’ perche’ \W matcha tutti i caratteri NON alfabetici

    \w Match a “word” character (alphanumeric plus “_”)
    \W Match a non-”word” character

    cmq per il caso specifico andava bene perche’ era SQL.

  21. Febbraio 17th, 2009 at 22:01 | #21

    Pallotron, premetto che non capisco una mazza di tutto quanto avete scritto ma la tua riga di comando e’ molto piu’ ordinata e leggibile. :-)

  22. kimso
    Febbraio 18th, 2009 at 16:25 | #22

    Cmq. al di la del come fare, il problema vero, e per il quale e’ nato sto post, penso, sia il comportamento INDEGNO del tuo collega (non il DBA…), dico se al limite voleva giocare con sed awk java c fortran o altro, poteva prendere quel problema come spunto e poi mandare A TE la soluzione alternativa chiedendoti magari cosa ne pensassi…

    Ma si sa ci sono quelli che si prendono il merito di altri, quelli che non si fanno i caxxi loro, quelli che non sanno stare al loro posto…
    e tutti tentano di luccicare, “Pain in their fucking ass!!” ahahah

  23. Febbraio 21st, 2009 at 20:34 | #23

    Ognuno odia il proprio “nerdone-primo-della-classe-so-tutto-io”, ma dobbiamo conviverci. ciaoooo kysucix P.S. Io avrei usato awk :D

  24. Ilgiocatore
    Febbraio 27th, 2009 at 14:27 | #24

    Pallo, ho una domanda da nerds.
    Ho una rete windows workgroup, circa 30 pc (win 98, win 2000, xp pro e 1 vista)
    Ogni pc ha in condivisione un certo numero di cartelle.
    Io ho in condivisione “C:\network” con alias “!network”, lettura per tutti (doc pubblici) e scrittura per tutti (zona di scambio file, se uno mi vuole passare un file lo mette li), poi ho un’altra cartella “sorgenti”, che voglio sia visibile solo agli utenti Pippo, Pluto (o meglio al gruppo “developers”).
    Come si fa?
    In pratica attualmente ogni PC in rete windows vede TUTTE le risorse degli altri, salvo poi avere o meno autorizzazioni e permessi.
    Non ha senso che un pc di un utente diverso da Pippo e Pluto veda una cartella “Sorgenti” nel mio PC.
    Il PC che si connette deve fornire le sue credenziali (user-pwd) al PC che accetta la connessione, quindi in teoria il PC che mostra le risorse condivise e’ in grado di “filtrare” per utenti/gruppi…. o no?
    grazie
    saluti

  25. Febbraio 27th, 2009 at 14:36 | #25

    non so piu’ niente di windows. mi spiace.

  26. ilgiocatore
    Febbraio 28th, 2009 at 08:12 | #26

    @pallotron

    allora in linux come si farebbe? avete tutti i pc con linux?!?! la vostra rete come e’ fatta?

  27. Febbraio 28th, 2009 at 10:10 | #27

    @ilgiocatore

    1. intanto i sorgenti non si condividono con “condivisioni file o cartelle” ma con un sistema di versioning tipo git (che e’ il bene). Io ho un git personale e non posso farne a meno.

    2. con linux devi usare samba server, ed usando utente e permessi.

  28. ilgiocatore
    Febbraio 28th, 2009 at 21:01 | #28

    @pallotron

    samba va installato su tutti i pc? E’ una rete di peer la vostra? se due pc vogliono scambiarsi un file?
    Come si risolverebbe il problema che ho scritto sopra con samba?
    Cioe’ filtrare le cartelle in base ai gruppi…
    Credo che samba sia installabile anche su windows, se risolvo il problema metto samba sul mio pc windows e’ fatta

  29. Marzo 1st, 2009 at 12:12 | #29

    mio dio, il giocatore, samba su windows! ma sei scarsissimo.
    Perche’ non ti leggi un manuale di windows e chiedi su microsoft.com? Pallo non usa windows, l’ha gia’ detto.

  30. Ilgiocatore
    Marzo 2nd, 2009 at 08:08 | #30

    ma sto attendendo ancora la risposta su come si fa sta cosa in linux eh :)
    Io sono scarso e chiedo a voi esperti linari

  31. Marzo 2nd, 2009 at 21:35 | #31

    su linux si fa cosi’: RTFM
    http://www.samba.org/samba/docs/

  32. Marzo 2nd, 2009 at 21:45 | #32

    quello che ha scritto antonio, per quanto diretto, e’ la pure verita’ :D

  33. Enzo
    Luglio 29th, 2009 at 16:54 | #33

    Cazzo, bellissimo questo post, mi hai fatto morire, davvero il top.

    Comunque nella nostra azienda ad una domanda come quella (“come faccio ad inserire una stringa “NAME” su un file “tmp.log” da 1 GB tra la quarta e la quinta colonna con VI/VIM?”), a parte che a nessuno verrebbe in mente di farla, le risposte possibili sarebbero state:
    * fattelo da te
    * fallo a mano
    * non si puo’ fare
    * mettilo nella schedule
    * non c’e’ un altro sistema? Cioe’ ti serve proprio, non si puo’ evitare?
    * manda una mail a tutti e vedi se qualcuno ti sa aiutare
    * (il nostro capo) “questo e’ un problema di struttura del processo” (non c’entra un cazzo, ma lui dice queste cose no-sense)

    Scherzo, eh ;)

    P.s.: a Vodafone dov’eri? Non e’ che a Vodafone son proprio delle cime, probabilmente dipende dai reparti …

  1. No trackbacks yet.