a simple PNG decoder in Go

while working with image files, I needed a simple way to analyze content of a picture; so I wrote this tool that “walks” inside a PNG file and reports all the chunks seen; this is intended to be expanded with more features in a future. package main import ( "encoding/binary" "fmt" "io" "os" ) type chunk struct { Length uint32 ChunkType [4]byte } func main() { if len(os.Args) != 2 { fmt.Printf("Usage: %s filename.png\n", os.Args[0]) os.Exit(1) } f, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer f.Close() header := make([]byte, 8) _, err = f.Read(header) fmt.Printf("header: %v\n", header) if err != nil { panic(err) } var data chunk var offset int64 offset = 8 for { err = binary.Read(f, binary.BigEndian, &data) if err != nil { if err == io.EOF { break } panic(err) } fmt.Printf("Offset: %d chunk len=%d, type: %s\n", offset, data.Length, string(data.ChunkType[:4])) f.Seek(int64(data.Length+4), io.SeekCurrent) offset += int64(data.Length) + 4 } } usage: ...

January 28, 2018 · Andrea Manzini

il linguaggio Lua: sesta parte

segue dalla quinta parte Quando il saggio indica la luna, lo sciocco guarda il dito Nello scorse puntate abbiamo appreso le basi di un linguaggio minimalista, il cui motto è “doing more with less”, che occupa meno byte della vostra foto su Facebook e che i benchmark dichiarano il più veloce tra i linguaggi di scripting. Nato da menti brasiliane, l’hanno chiamato Lua, che vuol dire Luna in portoghese. Lua viene usato come linguaggio di scripting in Angry Birds, World of Warcraft e decine di altri videogame e software: nello scorso post abbiamo visto come creare un semplice plugin per VLC. In questo invece approfondiremo le peculiarità del linguaggio e cominceremo a guardare oltre, presentando l’ecosistema di librerie; infine nel prossimo sperimenteremo l’integrazione tra Lua e C. ...

December 22, 2017 · Andrea Manzini

il linguaggio Lua: quinta parte

segue dalla quarta parte “Sonata al chiaro di luna” : un plugin per vlc Come dicevamo all’inizio, Lua è usato da numerose applicazioni come linguaggio di estensione; per scopi didattici ho scelto di scrivere un semplice plugin per un programma diffuso, il media player universale VLC. Con questo plugin risolveremo per sempre l’annoso problema di decidere cosa sarebbe meglio sgranocchiare durante la visione! L’integrazione con lo scripting Lua è documentata in una serie di file README.TXT sparsi nella directory $SRC/share/lua/ (dove $SRC è la directory dove abbiamo decompresso l’archivio del sorgente di vlc). Grazie ad essi apprendiamo che VLC supporta diversi tipi di “agganci” (hooks) con Lua: per la generazione di playlist (ad esempio trasformare una playlist Youtube in una VLC), per le interfacce di controllo (a titolo di esempio, si può comandare VLC via telnet), per il recupero di meta-informazioni sullo stream (tipicamente scaricare e visualizzare la copertina dell’album o la locandina del film in riproduzione) e, finalmente, quella che useremo noi, cioè una generica funzionalità aggiuntiva attivabile e disattivabile da menù. Il file README specifica che questo tipo di estensione deve contenere due funzioni Lua di nome activate() e deactivate() che verranno chiamte in concomitanza con questi due eventi. Lo script deve avere anche una funzione descriptor() che VLC chiamerà allo startup ed avrà il compito di esporre una tabella con delle informazioni sul plugin come titolo, autore, versione. Ultimo vincolo, lo script deve risiedere in uno specifico path, ovvero $LIB/vlc/lua, dove $LIB è il percorso di libvlc (il “motore” del programma) a livello di sistema oppure $HOME/.local/share/vlc/lua, soluzione che permette ad ogni utente di usare i propri plugin; io ho pertanto copiato lo script seguente [vlc_cibo.lua] in ~/.local/share/vlc/lua/extensions/cibo.lua ...

October 16, 2017 · Andrea Manzini

il linguaggio Lua: parte 4

segue dalla terza parte “Moonlight Bay” (ovvero: “chiedi chi erano i vectors”) L’unica struttura dati disponibile in Lua è rappresentata dagli array o meglio, dalle tabelle (o hash): array associativi formati da coppie chiave-valore, nelle quali sia la chiave sia il valore possono essere qualsiasi tipo di dato. Vediamo un paio di esempi, dapprima un normale vettore: > i = 3 > a = {1,3,5,7,9} > print(i,a[3],a[4],a[i+3]) questa sequenza stampa i valori 3,5,7,nil; la prima cosa che appare diversa rispetto ad un altro linguaggio è che gli indici per gli array partono da 1 anziché da zero; la seconda è che un eventuale sforamento dell’array non causa errore ma semplicemente ritorna nil. Le tabelle Lua sono flessibili… Esploriamole con un esempio di complessità crescente. ...

April 11, 2017 · Andrea Manzini