giovedì 31 ottobre 2013

Libreria crt Borland-style per C++ (Windows)

Preso dalla nostalgia dei primi anni di programmazione sul vecchio Borland Pascal (e il suo fantastico IDE in modalità testo in DOS), ho pensato di ricreare la vecchia libreria "crt" della Borland sul C++, per la console di Windows. 

Ho creato una classe "Console", che scrive e legge sullo stdin e stout e non faccio uso delle librerie standard del C++ (quindi è una classe windows-dipendente), fornendo alcuni scarni metodi per un minimo di I/O. Invero faccio uso di una libreria standard del c/c++ (stdarg) per consentire alla funzione printf (scritta da me) di ricevere un numero indefinito di parametri.
Header della classe Console:
class Console
{
    public:
        Console();
        ~Console();
        void ClrEol();
        void ClrScr();
        void cursorbig();
        void cursoroff();
        void cursoron();
        void Delay(DWORD);
        bool GotoXY(int xx,int yy);
        bool KeyPressed();
        char ReadKey();
        void Sound(DWORD,DWORD);
        void TextBackground(DWORD val);
        void TextColor(DWORD val);
        int WhereX() { return coord.X; }
        int WhereY() { return coord.Y; }
        DWORD GetTextColor() { return tc; }
        DWORD GetTextBackground() { return bc; }
        HANDLE GetHandle(){return handle;}
        DWORD printf(const char *lpBuffer,...);
        DWORD printc(char c);
        void ReadLn(int&);
        void ReadLn(char*);
        void saveScreen();
        void restoreScreen();
    protected:
    private:
        DWORD tc;
        DWORD bc;
        COORD coord;
        HANDLE handle;
        LPSTR charbuf;
        LPWORD attrbuf;
        bool bufpieno;
        void Setx(int n){coord.X=n;}
        void Sety(int n){coord.Y=n;}
};

Nota bene: libreria fortemente ancorata a Windows, senza il quale non può funzionare.

Qui potete leggere la documentazione, mentre da qui potete scaricare i file sorgente.

mercoledì 30 ottobre 2013

Ideone, il sito definitivo per i programmatori

L'ho scoperto, non ci credevo quasi! Fantastico tool online per programmatori che permette di condividere spezzoni di codice in tutti i linguaggi più famosi e più usati, con tanto di output e stdin. 
Per esempio, classico codice per i neofiti:


#include 
int main(void) {
 int a,b;
 printf ("Inserisci il primo numero: ");
 scanf("%d",&a);
 printf ("Inserisci il secondo numero: ");
 scanf("%d",&b);
 printf("La loro somma è %d",a+b);
 return 0;
}

riportato su questo sito crea un link temporaneo (o perlomeno, ho visto codici vecchi sei mesi, non so quando viene cancellato, se viene cancellato) con il codice memorizzato e lo stdin:

http://ideone.com/aVxwyp

Credo che lo userò molto da ora in poi.

martedì 8 ottobre 2013

Come leggere un file XML in Java

Molto spesso capita di interfacciarsi con applicazioni tramite XML, oppure usufruire delle API di un servizio web che esportano i propri dati su dei file XML. Ebbene, in questo post spiegherò come leggere un file XML da Java, supponendo che il file XML sia una risorsa web, in particolare questa: 


che è un file che ci dà informazioni su una traccia musicale (Believe di Cher). Per semplicità, supponiamo che a noi interessa sapere la durata di questo brano e la risorsa immagine che è la cover dell'album a cui appartiene. Innanzitutto, per leggere un file XML l'applicazione che si propone di farlo deve conoscere come è strutturato questo file, specifico per ogni servizio. Per esempio, questo file di last.fm ha come root element il tag <lfm status="ok"> che ci dice che il servizio di last.fm attualmente funziona. Tralasciando altre descrizioni del file XML, arriviamo a quello che ci interessa: la durata del brano si trova in <track>--><duration>mentre l'immagine dell'album si trova in <album>--><image>Nota che ci sono quattro varianti del tag <image> che si differenziano per il valore del parametro "size". Supponiamo a noi interessa una dimensione media quindi scegliamo il valore "medium" del suddetto parametro. Passiamo allora al codice. 

Innanzitutto ci serve una libreria; io uso e mi trovo bene con jdom (www.jdom.org). 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class prova {
    public static void main(String[] args) {
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document= builder.build("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=91de4539bbb0d5b2bdc36d23d3906246&artist=cher&track=believe");
            Element duration = document.getRootElement().getChild("track").getChild("duration");
            System.out.printf("La durata è: "+duration.getValue());
            java.util.List albumImage = document.getRootElement().getChild("track").getChild("album").getChildren("image");
            String albumImageResource = "";
            java.util.Iterator iteratore = albumImage.iterator();
            while (iteratore.hasNext()){
                Element elemento = (Element)iteratore.next();
                if (elemento.getAttributeValue("size").equals("medium")) {
                    albumImageResource = elemento.getValue();
                    break;
                }                  
            }
            System.out.printf("\nLa risorsa della cover dell'album è: "+albumImageResource);
        }
        catch (org.jdom.JDOMException e) {
            System.out.printf(e.toString());
        }
        catch (java.io.IOException e) {
            System.out.printf(e.toString());
        }
    }
    
}
Come vedete il tutto è molto intuitivo, è possibile infatti per ogni tag ottenere un valore, un sottotag in particolare, o una lista di sottotag, o ancora la lista completa; e per ogni tag ottenere anche i parametri e il valore di ciascun parametro.