Io ti odio!

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.

Comments Posted in Informatica, Irlanda, Lamentazioni, Lavoro, Programmazione, Unix
Tagged , , , , ,

Comments

  1. Enzo says:

    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 …

  2. pallotron says:

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

  3. Ilgiocatore says:

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

  4. antonio says:

    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.

  5. ilgiocatore says:

    @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

  6. pallotron says:

    @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.

  7. ilgiocatore says:

    @pallotron

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

  8. pallotron says:

    non so piu’ niente di windows. mi spiace.

  9. Ilgiocatore says:

    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

  10. kysucix says:

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

  11. kimso says:

    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

  12. Paolo says:

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

  13. pallotron says:

    @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.

  14. kimso says:

    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

  15. pallotron says:

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

  16. antonio says:

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

  17. kimso says:

    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

  18. Beppe says:

    @pallotron
    Dho! Scusa è la febbre… Comunque il consiglio è sempre valido 😉

  19. LoneStar says:

    @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.

  20. pallotron says:

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

  21. Beppe says:

    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

  22. antonio says:

    perl rulez

  23. pallotron says:

    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.

  24. LoneStar says:

    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 😀

  25. pallotron says:

    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

  26. Freddy says:

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

  27. pallotron says:

    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 🙂

  28. Freddy says:

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

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

  29. pallotron says:

    beh il tipo in questione e’ anche lui immigrato!

  30. Freddy says:

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

  31. pallotron says:

    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.