Sei sulla pagina 1di 6

DEV DEVeloping Software Solutions n.

123 novembre 2004

LaTeX e la formattazione di pseudocodice e sorgenti


di Gianluca Pignalberi
` Non contenti delle nostre possibilita di inserimento di brani di codice sorgente, di grammatiche BNF e di diagrammi sintattici allinterno di documenti LaTeX, vediamo come inserire, evidenziandoli coerentemente, brani di pseudocodice e di codice sorgente.

Gianluca Pignalberi ` E laureato in Scienze dellInformazione presso ` lUniversita La Sapienza di Roma. Si occupa, per passione, di Algoritmi Genetici applicati allelaborazione delle imma` gini, ma e stato a lungo occupato, per professione, in problematiche legate allelaborazione di testi: riconoscimento della lingua, compressione, retrieval. Il tutto sempre per sistemi Unix .

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of DEV, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2004 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2004 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di DEV sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2004 Infomedia e rilasciato ` con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2004 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

LaTeX e la formattazione di pseudocodice e sorgenti


di

Gianluca Pignalberi > gpignalberi@infomedia.it

n due precedenti articoli [2] e [3] abbiamo visto quali possibilit abbiamo di aggiungere a documenti LaTeX sia brani di codice sorgente, tramite lambiente verbatim e derivati, che produzioni grammaticali, sia sotto forma di regole BNF che di diagrammi sintattici. Se questo pu rendere i nostri documenti pi ricchi e comprensibili, potremmo non essere pienamente soddisfatti di quanto ottenuto. Potremmo ancora volere due modi per impaginare i nostri codici: uno per inserire facilmente dei brani di pseudocodice e uno per evidenziare automaticamente le parole chiave sia di brani di pseudocodice che di brani di codice sorgente, dipendentemente da quello scelto per redigere un programma. In questo articolo illustreremo i package algorithms, program e listing, che ci permetteranno di ottenere quanto voluto.

ri \, { e } non vengono interpretati letteralmente, ma mantengono il significato usuale in LaTeX, dandoci la possibilit di cambiare font e inserire formule e comandi in un sorgente verbatim. Questa soluzione, come anche soluzioni alternative che prevedano luso di inserimenti di spazi arbitrari inserendo parole colorate di bianco, renderebbero illeggibile il sorgente; non le prenderemo in considerazione. Il package che ci aiuta nel formattare pseudocodici (algorithms) [4] composto da due file di stile: algorithm e algorithmic, che possono essere inclusi insieme o meno allinterno di un documento. Questi due file di stile forniscono gli ambienti omonimi. Vediamone luso e le finalit. Lambiente algorithmic serve a formattare lo pseudocodice adottando dei comandi specifici. La sua portata racchiusa da
\begin{algorithmic}[<numero>]

Non contenti delle nostre possibilit di inserimento di brani di codice sorgente, di grammatiche BNF e di diagrammi sintattici allinterno di documenti LaTeX, vediamo come inserire, evidenziandoli coerentemente, brani di pseudocodice e di codice sorgente

Algoritmi
Una volta che sappiamo padroneggiare lambiente verbatim e ambienti correlati, ci rendiamo conto di quanto la loro utilit, a volte, possa essere molto limitata e limitante. Supponiamo di voler descrivere un algoritmo: inseriamo il testo entro unistanza dellambiente verbatim, ottenendo una parte di documento ben indentata, ma il cui testo interpretato letteralmente. Se nel testo ci fosse una parte di codice LaTeX per formattare una formula, vedremmo il codice stesso nel documento finale, anzich la formula, proprio a causa della (non) interpretazione. Per ovviare a ci tentiamo un imbroglio a LaTeX, non usando lambiente verbatim: questa volta la formula viene resa bene, ma perdiamo tutte le indentazioni, perch LaTeX elimina gli spazi inutili per la composizione del testo. Un esempio di quanto detto in Figura 1. Luso del package alltt potrebbe semplificarci il compito, essendo questo simile a verbatim. Lunica differenza che i caratteDEV > n. 123 novembre 2004

\end{algorithmic}

il cui argomento opzionale numero indica ogni quante righe vogliamo che il sorgente sia numerato. Allatto di includere il package possiamo invocare lopzione noend, che non fa stampare gli end di ogni comando e salvare spazio. I comandi a nostra disposizione ricalcano il tipo di costrutti che i linguaggi imperativi ci forniscono in genere: affermazioni, cicli e scelte.

impossibile formattare in maniera efficace brani di pseudocodice; si perde lindentazione o FIGURA 1 linterpretazione dei comandi di composizione

91 <<

Intermediate

cui inserire un algoritmo (o qualunque altro testo). Ogni algoritmo viene numerato in modo tale che, quando inseriamo una didascalia in un algoritmo (tramite \caption), vediamo anche letichetta numerata. Tale numerazione viene usata anche per generare un indice generale degli algoritmi, inseribile nel documento tramite \listofalgorithms. In caso di invocazione del comando, verr generato un file con estensione .loa. Il floating body relativo agli algoritmi pu o meno essere circondato da un motivo; tale motivo viene passato come opzione al caricamento del package e pu essere plain, boxed o ruled (scelta di default).
Pseudocodice ben formattato e con il testo LaTeX composto correttamente (end if presente perch non stato usato noend al caricamento FIGURA 2 di algorithmic)

Sorgenti e pseudocodice
Un package che promette di formattare pseudocodice e sorgenti program di Martin Ward (fornito senza manuali, ma con un file di esempio). Molto onestamente lautore afferma che la formattazione avviene secondo il suo stile preferito, che non necessariamente quello preferito da altri (tra cui lautore del presente articolo). Tale package fornisce due ambienti: program e programbox; il secondo formatta il sorgente in una sola pagina. Lo stile dei comandi simile a quello visto in precedenza, con dei minimi cambiamenti; ad esempio la sintassi della scelta :
\IF <condizione> \THEN <azione> \ELSE <azione> \FI

Il primo tipo di costrutto formattato con il comando:


\STATE <testo>

che formatta unistruzione scritta in LaTeX nellesatta maniera che ci aspettiamo, rispettando lindentazione implicita dellalgoritmo; i cicli sono formattati, in base al tipo, tramite i comandi:
\FOR{<condizione>} <testo> \ENDFOR \FORALL{<condizione>} <testo> \ENDFOR \WHILE{<condizione>} <testo> \ENDWHILE \REPEAT <testo> \UNTIL{<condizione>} \LOOP <testo> \ENDLOOP

mentre quella di un ciclo while


\WHILE <condizione> \DO <istruzioni> \OD

Infine, le scelte coinvolgono i seguenti comandi:


\IF{<condizione>} <testo> \ENDIF \IF{<condizione>} <testo> \ELSE <testo> \ENDIF \IF{<condizione>} <testo> \ELSIF <testo> \ELSE <testo> \ENDIF

Cos come il precedente package, anche questo basa la sua sintassi sul modello del Pascal (o del Fortran) e, come il Pascal, fornisce due comandi per definire procedure e funzioni. I comandi sono, rispettivamente, \PROC e \FUNCT, con terminazioni \ENDPROC e \ENDFUNCT. Ad esempio, la funzione ricorsiva per il calcolo del fattoriale potrebbe essere composta tramite il seguente codice:
\FUNCT |fatt|(x) \BODY \IF x < 0 \THEN |exit|(0); \FI \IF x = 0 \THEN |return|(1); \ELSE |return|(x * |fatt|(x - 1)); \FI \ENDFUNCT

Possiamo ora riscrivere lalgoritmo di Figura 1 come segue, vedendone il risultato in Figura 2:
\begin{algorithmic} \IF{$S \neq \emptyset$} \STATE $S = S \setminus e$ \ELSE \STATE exit \ENDIF \end{algorithmic}

Il risultato visibile in Figura 3. I lettori noteranno che le parole non chiave sono formattate con i caratteri matematici (corsivi o inclinati), mentre

Quando descriviamo un algoritmo utile definire le precondizioni e le postcondizioni, cosa che possiamo fare tramite i comandi
\REQUIRE <testo> \ENSURE <testo>

Infine possiamo inserire dei commenti; il comando


\COMMENT{<testo>}

Data la difficolt di mettere un commento in una linea non finale di un costrutto, i relativi comandi prendono un argomento opzionale (racchiuso da parentesi quadre) in cui scrivere leventuale commento. Lambiente algorithm fornisce invece il floating body entro
>> 92

FIGURA 3

Formattazione di una funzione pi simile allo pseudocodice che non ad un codice sorgente

DEV > n. 123 novembre 2004

Intermediate

nel sorgente non si fa mai riferimento esplicito agli ambienti di formattazione di formule: ci fatto intrinsecamente dallambiente. Il carattere | intorno ad alcuni termini serve a tenere i termini sulla stessa riga, mentre per stampare il suddetto carattere bisogna usare il comando \origbar. Altri comandi forniti dal package riguardano i commenti, le azioni, le uscite forzate dal programma, oltre ad altri cicli e evidenziazioni varie. Diversi esempi duso sono proposti nel file programdemo.tex allegato al package. Una possibilit interessante quella di far scrivere le variabili lunghe e le parole chiave con un carattere senza grazie; il comando necessario \sfvariables. Lultima cosa da notare che, a differenza di algorithms, questo package non fornisce un floating body entro cui mettere i sorgenti, n la possibilit di non stampare i vari fi e od di fine costrutto. Ci lascia perplessi sulla reale capacit di program di formattare sorgenti.

FIGURA 4

Sorgenti C e csh formattati coerentemente con il linguaggio

\lstset{language=[<dialetto>]<linguaggio>}

Codice sorgente
Supponiamo di trovarci nella seguente situazione: abbiamo un codice sorgente scritto in un linguaggio X da inserire nel nostro documento, ma lo vogliamo pretty-printed. Finch il programma paragonabile come lunghezza a Hello, world! potremmo quasi ricorrere a alltt e formattarlo come ci conviene, e avremmo gi lavorato molto. Un package che per noi si incarica di formattare un sorgente in base al linguaggio listings [1]. Il suo caricamento allinterno di un documento altamente personalizzabile, e la lista delle opzioni interamente disponibile in [1]. Ci limiteremo qui ad analizzarne le caratteristiche di base. La prima cosa da fare per formattare correttamente i sorgenti caricare i driver del o dei relativi linguaggi. Supponiamo di avere programmi scritti in C e nel linguaggio di csh. Nel preambolo, dopo aver caricato il package, dovremo inserire:
\lstloadlanguages{C,csh}

Lo stesso comando ci permette di stabilire la dimensione del carattere di tabulazione, lo stile delle parole chiave ed altri aspetti. Il sorgente va scritto entro un ambiente apposito, che si chiama lstlisting; allapertura dellambiente possiamo fornire parametri opzionali e dobbiamo fornirne uno obbligatorio (anche vuoto):
\begin{lstlisting}[<opzioni>]{<parametro>} <sorgente> \end{lstlisting}

(sono disponibili pi di trenta driver, di cui molti con possibilit di scegliere tra pi dialetti). In Figura 4 vediamo la formattazione di Hello, world! in C e delle prime righe di runtime in csh. Nel corpo del documento, prima di scrivere ogni sorgente, bisogna selezionare il linguaggio adatto e relativo dialetto; possiamo farlo con:

Tra i parametri opzionali troviamo caption per le didascalie, captionpos (con valori t o b) per il posizionamento delle didascalie, float per rendere il listato riposizionabile da LaTeX. Il parametro obbligatorio un nome; tutti i listati richiamati con lo stesso nome hanno lo stesso contatore di riga, cosicch possiamo inserire pezzi di un programma in varie parti del documento, potendo mantenere la continuit di numerazione delle righe di codice. Lasciarlo vuoto significa reinizializzare il contatore ogni volta. Allo stesso modo del comando \verb abbiamo la possibilit di comporre un comando inline. Listruzione che ce lo consente :
\lstinline

il cui uso uguale al citato \verb. Luso di lstlisting e lstinline mostrato in Figura 5, il cui sorgente visibile nel Listato 1. Possiamo infine inserire nel documento dei sorgenti senza doverli copiare fisicamente, e ci grazie al comando:
\lstinputlisting[<opzioni>]{<nome file>}

Il riferimento ai listati sfrutta il solito meccanismo \label \ref; in questo caso letichetta va messa allinterno della definizione caption; purtroppo, nei casi provati, il meccanismo ha fornito numerazioni scorrette.

Conclusioni
LaTeX base non in grado di formattare in maniera non elementare dei codici sorgente, n di agevolarci il compito di scrivere dei brani di pseudocodice. In precedenza abbiamo visto alcuni package che espandono la capacit di LaTeX nel formattare sorgenti, grammatiche BNF e diagrammi sintattici, ma che non sono comunque in grado di manipolare semplicemente pseudocodice, o
93 <<

FIGURA 5

Sorgenti formattati inline e come elemento a s stante

DEV > n. 123 novembre 2004

Intermediate

LISTATO 1

Sorgente LaTeX del documento che include il programma C per il calcolo approssimato di p, con descrizione inline di unistruzione

due operazioni, e che possono rendere i nostri documenti ancora migliori con minore sforzo programmativo.

Bibliografia
\documentclass[a4paper, 12pt]{article} \usepackage{listings} \lstloadlanguages{C} \begin{document} \lstset{language=[ANSI]C} \begin{lstlisting}[captionpos=b,% caption={Programma C per il % calcolo approssimato di $\pi$}]{} #include <stdio.h> #define SIGN -1 main () { double pi = 4.0; int lim, i; char sign; printf (Scrivi lapprossimazione: ); scanf (%d, &lim); for (i = 3, sign = SIGN; i <= lim; i += 2, sign *= SIGN) pi = pi + sign * 4.0 / i; printf (Pi ~ %f\n, pi); return 0; } \end{lstlisting} La parte fondamentale del calcolo \`e stata fatta con ``\lstinline|pi = pi + sign * 4.0 / i;|. \end{document}

[1] C. Heinz, Listings.dtx Version 0.2000, www.ctan.org, 1999. [2] G. Pignalberi, Codici sorgente in documenti LaTeX, Dev n. 120, Gruppo Editoriale Infomedia, Lug. - Ago. 2004. [3] G. Pignalberi, LaTeX, diagrammi sintattici e grammatiche, Dev n. 122, Gruppo Editoriale Infomedia, Ott. 2004. [4] P. Williams, Algorithms, www.ctan.org, 1996.

Gianluca Pignalberi
laureato in Scienze dellInformazione presso lUniversit La Sapienza di Roma. Si occupa, per passione, di Algoritmi Genetici applicati allelaborazione delle immagini, ma stato a lungo occupato, per professione, in problematiche legate allelaborazione di testi: riconoscimento della lingua, compressione, retrieval. Il tutto sempre per sistemi Unix.

Download del progetto


addirittura di formattare un sorgente in base al linguaggio di programmazione in cui stato scritto. In questo articolo abbiamo visto alcuni package che ci semplificano le ultime Scarica il progetto completo di questo articolo allindirizzo: ftp://ftp.infomedia.it/pub/DEV./Listati/Dev123/ls-latex.zip

GAME HACKING

a cura di Matteo Baccan > baccan@infomedia.it

Low Level

Avete mai giocato, in rete, a Medal Of Honor, Half-Life, Unreal, Colin McRae Rally, The Rage o Quake 3? Non vi si mai bloccato il server? Non avete mai notato delle cose strane? C chi dedica molte ore delle sue giornate a scoprire vulnerabilit allinterno di questi programmi
Mi ricordo ancora la prima volta che sono riuscito a giocare in rete con degli amici. Lavoravo a Baveno, sul lago Maggiore. Durante lora di pranzo il nostro capo chiudeva un occhio e ci concedeva, anche se in modo non ufficiale, di poter usare la rete aziendale per i nostri scopi ludici. Era molto divertente, ci permetteva uno sfogo che ci aiutava a lavorare con pi tranquillit ed armonia durante il pomeriggio.

Luigi Auriemma
Probabilmente una delle persone pi note in questo campo Luigi Auriemma [2]. Visti i frequentissimi aggiornamenti del suo sito, si pu tranquillamente dire che la persona che ha studiato e trovato pi bug al mondo nel campo dei videogiochi. Il suo lavoro importante perch, da un lato ha documentato i protocolli di comunicazione, dallaltro ha provato a forzarli trovando molti modi con i quali poter bloccare un game-server. Da un punto di vista aziendale la cosa potrebbe essere vista in modo negativo: si potrebbe considerare un piccolo terrorista che si diver te a bloccare computer, dallaltro invece molto impor tante perch in grado di evidenziare dei reali problemi, come i buffer over flow, che se ben sfruttati potrebbero essere usati per prendere il possesso della macchina nella quale sono provocati o, peggio, usati per la diffusione di virus.

chetti UDP, creare una serie di finti player allinterno dei server di gioco, in modo da bloccare delle partire o mandare in blocco il sistema per un numero troppo alto di giocatori da gestire.

E i produttori cosa dicono?


Se da un lato questo lavoro veramente apprezzabile, come dice lo stesso Luigi: Sto ancora aspettando una patch od almeno una risposta da EA riguardo il buffer-overflow in Need for Speed Hot Pursuit 2 segnalatogli molti mesi fa. C quindi chi sonnecchia davanti a questi problemi o chi si limita a dire il gioco non pi supportato.

Lo sviluppo
Questo approccio, il passare dalla monoutenza allemozionante multiutenza del netgaming, col tempo ha contagiato molte persone. Levoluzione ha cosi portato al proliferare di giochi in grado di connettersi a game-server in grado di ricevere molte richieste in parallelo. Purtroppo, quando si sviluppa un gioco, si pensa soprattutto al raggiungimento delle massime performance, ma poco alla sicurezza. Di questo problema di sono accorti in molti, ma ci sono persone che dedicano parecchio del loro tempo allo studio dei protocolli di comunicazione fra i vari client e server di gioco, provando a scoprirne il funzionamento, notoriamente non documentato, in modo da cercare dei possibili problemi di sicurezza.

Conclusioni
Come si poteva immaginare, anche i videogiochi nascondono dei problemi di sicurezza, laspetto grave della vicenda per che a pochi pare interessare la loro soluzione, come se si trattasse di software di serie B.

Fake Player
Un altro aspetto interessante del lavoro di Luigi dato dai cosiddetti fake player. Per come sono pensati molti server possibile, tramite linvio di appositi pac-

Bibliografia
[1] http://www.baccan.it, sito di riferimento per Low Level. [2] http://aluigi.altervista.org, il sito di Luigi Auriemma DEV > n. 123 novembre 2004

>> 94