Rendi il tuo workflow di sviluppo più efficiente con questi tool poco noti

Tool di sviluppo poco noti

Gli strumenti di sviluppo sono una parte fondamentale del lavoro di ogni programmatore. In questo articolo, vedremo alcune alternative poco conosciute ma altrettanto valide ai tool di sviluppo più diffusi, che potrebbero rendere il nostro workflow di sviluppo ancora più efficiente.

Ci sono tool di sviluppo molto famosi e utilizzati, come ad esempio git per la gestione del codice sorgente, npm per la gestione delle dipendenze in JavaScript e pip per la gestione delle dipendenze in Python. Ma ci sono anche tante altre operazioni per cui ogni sviluppatore ha nelle dita un qualche comando.

Ho fatto un rapido sondaggio in un canale interno per presentare i miei tool “poco famosi” e conoscere quelli degli altri, ed ecco il risultato. Vediamo di raggrupparli per tipologia:

Modifica del testo

  • fastmod è un tool “cerca e sostituisci”, con supporto per regex. La particolarità del tool è che la preview della sostituzione viene visualizzata in forma di diff in modo interattivo.

  • cog è una sorta macro Python embeddabile un po’ ovunque, si esegue ed espande il codice, quindi si committa sia il codice di generazione che il codice espanso (esempio)

    README.md
    (before)

    # Readme
    
    Initially the space between the markers will be empty.
    
    <!-- [[[cog
    import subprocess
    print("```raw")
    print(subprocess.check_output(["cat", "--help"], text=True))
    print("```")
    ]]] -->
    <!-- [[[end]]] -->
    
    The file will be modified inplace running `cog -r README.md`.
    

    (after)

    # Readme
    
    Initially the space between the markers will be empty.
    
    <!-- [[[cog
    import cog
    import subprocess
    cog.outl("```raw")
    cog.outl(subprocess.check_output(["cat", "--help"], text=True))
    cog.outl("```")
    ]]] -->
    ```raw
    Usage: cat [OPTION]... [FILE]...
    Concatenate FILE(s) to standard output.
    
    With no FILE, or when FILE is -, read standard input.
    
      -A, --show-all           equivalent to -vET
      -b, --number-nonblank    number nonempty output lines, overrides -n
      -e                       equivalent to -vE
      -E, --show-ends          display $ at end of each line
      -n, --number             number all output lines
      -s, --squeeze-blank      suppress repeated empty output lines
      -t                       equivalent to -vT
      -T, --show-tabs          display TAB characters as ^I
      -u                       (ignored)
      -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
          --help        display this help and exit
          --version     output version information and exit
    
    Examples:
      cat f - g  Output f's contents, then standard input, then g's contents.
      cat        Copy standard input to standard output.
    
    GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
    Full documentation <https://www.gnu.org/software/coreutils/cat>
    or available locally via: info '(coreutils) cat invocation'
    
    \```
    <!-- [[[end]]] -->
    
    The file will be modified inplace running `cog -r README.md`.
    
    

    L’ho usato per avere un output aggiornato nei file README, oppure per includere snippet di codice nelle slide (remarkjs/latex) o anche per generare codice ripetitivo in linguaggi con introspezione/macro poco potenti (penso a te C/C++).
    Il vantaggio nell’uso di cog è che il codice generato è committato, quindi non ci sono nuove dipendenze di build. cog è necessario solo quando si vuole modificare il codice generato.

Ricerca

  • fd è una versione “moderna” di find, di default fa la cosa giusta, senza opzione -name.
    screencast
  • exa A modern replacement for ls. exa è un file lister migliorato con più funzionalità e impostazioni predefinite migliori. Utilizza i colori per distinguere i tipi di file e i metadati. Conosce i collegamenti simbolici, gli attributi estesi e Git. L’ho provato varie volte ma ancora non ha sostituito ls nella mia memoria muscolare.

Monitoraggio

  • btop una alternativa a top, nello stile di htop, ma ancora più bello. È bello persino
    l’output del makefile!
  • duf Disk Usage/Free Utility – a better ‘df’ alternative
    demoimage

Visualizzazione

  • bat è una alternativa colorata a cat e less, anche se alcuni preferiscono 2 righe di bash per ottenere un risultato simile:
    #!/bin/sh
    highlight -l --style=dusk -Oxterm256 "$@" | less -rFX
    
  • tldr Simplified and community-driven man pages. Avete presente la manpage tipica del programma che elenca prima 72782 opzioni astruse, e poi forse un minimo esempio di uso? Ecco, tldr invece elenca prima gli usi più comuni, e nel 98% dei casi, quello che ci serve è entro il 3° esempio.

Test

  • cram è uno script Python pensato per scrivere test di regressione di tool a linea di comando. I file di test contengono sia il comando da eseguire che l’output atteso (con eventuali wildcard):
    test.t
    Simple commands:
    
    $ echo foo
    foo
    $ printf 'bar\nbaz\n' | cat
    bar
    baz
    

Git

  • git freeze / git thaw dal repo depot_tools di Chrome. Il repo contiene tanti altri script, ma questi due sono comodi per cambiare velocemente branch a metà di un lavoro.
    • git freeze crea un commit con tutti i file tracciati e non tracciati nel branch locale (una sorta di stash per branch)
    • git thaw fa il revert di quel commit.
  • git-absorb prende quello che c’è nell’index e cerca tra i commit recenti quello che ha toccato linee vicine a quelle di un hunk. Se ne trova, prepara un commit di fixup consumando quell’hunk dall’index. Comodo per fixup di typo o cose del genere.

More

  • moreutils è una collezione di tool per compiti un po’ particolari, vanno a sostituire una pipeline non banale di comandi bash con una interfaccia più comoda. Ad esempio: ts per benchmark alla buona e vipe per aprire in un editor l’output di una pipe.

    Leggete le descrizioni per vedere se almeno uno vi potrebbe essere utile, sono pacchettizati in Debian.

    chronic: runs a command quietly unless it fails
    combine: combine the lines in two files using boolean operations
    errno: look up errno names and descriptions
    ifdata: get network interface info without parsing ifconfig output
    ifne: run a program if the standard input is not empty
    isutf8: check if a file or standard input is utf-8
    lckdo: execute a program with a lock held
    mispipe: pipe two commands, returning the exit status of the first
    parallel: run multiple jobs at once
    pee: tee standard input to pipes
    sponge: soak up standard input and write to a file
    ts: timestamp standard input
    vidir: edit a directory in your text editor
    vipe: insert a text editor into a pipe
    zrun: automatically uncompress arguments to command

  • stow (GNU) per creare symlink in modo intelligente (utilissimo per installare in un commando tutti i tuoi dotfiles, da un repo git verso la tua home)

Stats

  • pct è un sort | uniq -c | sort -n -r che ti stampa anche le percentuali

  • dist legge numeri line-by-line e ti stampa la loro distribuzione (sia visualmente che i percentili significativi, min, max e media).

    Come si installa?

    go install github.com/aclements/go-moremath/cmd/dist@latest che installa in $GOPATH/bin oppure $HOME/go/bin se GOPATH non è definito.

  • hyperfine A command-line benchmarking tool. È un tool che esegue un comando varie volte e poi espone delle statistiche del tempo di esecuzione.

    demoimage

Da provare

  • jc CLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.
    è un tool molto interessante, implementa tantissimi parser per output di programmi e permette di convertire un output umano in formato json, per poi processarlo con tool tipo jq.

Tool ormai famosi

  • ag the silver searcher è un tool di ricerca che ha sostituito nella mia memoria muscolare il vecchio grep -lIris. Molto veloce, con default sani, è un diretto competitor di ripgrep. Alcuni dicono che ormai dovrebbe essere reato non avere ag di default su un sistema Linux :smile:.
  • fzf command line fuzzy finder. Utilissimo per creare piccoli alias/scripts con fuzzy-finding gratuito. Ad esempio il mio collega Aurélien ha scritto fco (fuzzy git checkout) per scrivere poche lettere del branch e autocompletare il resto, fkill per killare processi by name via fuzzy finding, fv per aprire file in vim, etc. Se volete il codice, chiedete a lui al prossimo GoLab!

Conclusione

Spero che qualche tool presentato in questo articolo vi sia utile ad automatizzare qualche compito noioso. Così potrete dedicare più tempo alle cose interessanti!