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.

33 thoughts on “Io ti odio!”

  1. 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 …

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

    Reply
  3. 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.

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

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

    Reply
  6. 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

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

    Reply
  8. 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

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

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

    Reply
  11. 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

    Reply
  12. 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

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

    Reply
  14. 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

    Reply
  15. 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.

    Reply
  16. 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 😀

    Reply
  17. 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

    Reply
  18. 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 🙂

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

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

    Reply
  20. 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.

    Reply

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.