RSS
 

Posts Tagged ‘C’

Jolie – Lezione 2 – Servizi ed Operazioni

24 Jun

C è un linguaggio molto potente, ma se doveste scrivere il codice in C necessario per fare quello che sto per mostrarvi, avreste a che fare con un numero decisamente più grande di righe di codice. Anche se so ancora poco di questo lignuaggio, per ora posso dire che può permettermi di scrivere una semplice applicazione client-server mettendo mano a veramente poco codice. Adesso veniamo alla seconda lezione

Jolie è un linguaggio di programamzione incentrato sulla comunicazione tra diversi servizi. Potete invocare un servizio o anche essere il servizio che viene invocato. Altri linguaggi di programmazione sono più complicati nello scrivere codice che  comporre messaggi da inviare o ricevere. Per questo motivo la cosa fondamentale da sapere per programmare con JOLIE è la definizione di un servizio e come questo può comunicare con il resto del mondo. Nello specifico, creeremo un servizio che invia un messaggio, e che ne attente la rielaborazione, quindi un altro servizio che riceve questo messaggio lo elabora e poi successivamente lo restituisce. Più o meno come se volessimo richiamare una funzione di un altro programma e ci attendessimo un risultato da questo.

^topOperazioni
Una operazione è una funzionalità messa a disposizione da un servizio, il quale può essere invocato da un’altra applicazione.

Ci sono due tipi di operazione:

  • OneWay: che è la ricezione di un messaggio;
  • RequestResponse: riceve un messaggio e quindi ne restituisce una risposta;
  • Utilizzando lo statement One-Way possiamo scrivere una operazione che ascolta una determianta porta ed attende di ricevere un messaggio. In alternativa si può utilizzare lo statement di notifica. Per quanto riguarda l’invocazione delll’operazione di request-response la sintassi è analoga e lo statement leggermente diverso.

    Le operazioni sui servizi sono simili ai metodi che si possono trovare nel paradigma della programmazione ad oggetti.

    ^topInvocazione dei servizi
    ^topPorte in uscita
    Per invocare un servizio bisogna definire la porta di uscita nel preambolo del programma. Fin troppo facile: voglio una porta in uscita e voglio chiamarla MathService, metterla sulla porta 8000 dell’host locale e voglio anche che usi il protocollo sodep. Ecco fatto:

    outputPort MathService {

    Location: “socket://localhost:8000″
    Protocol: sodep

    }

    Ora vediamo i 3 componenti principali:

  • Name: ogni porta in uscita ha un nome univoco, nel nostro caso la porta si chiama MathService;
  • Location: questo è un URI (external link), che dice dove si trova il servizio. Nel nostro caso abbiamo localhost perchè il nostro servizio è in locale sul nostro computer;
  • Protocol: qui indichiamo il protocollo da utilizzare per comunicare con il servizio. Possiamo indicare http, https, … e nuovi protocolli sono in uso. In questo caso specifico, il protocollo utilizzato è sodep;
  • Ora diamo un occhio di riguardo a Location e Protocol per una migliore comprensione su che cosa realmente possiamo fare con questi due elementi. Abbiamo definito MathService, che è la nostra porta, ma non abbiamo specificato quali operazioni sono disponibili per comunicare con essa. Vediamo ora come aggiungere un’operazione a MathService:

    outputPort MathService {

    Location: “socket://localhost:8000″
    Protocol: sodep

    RequestResponse:

    twice

    }

    Per descrivere il comportamento della porta, abbiamo aggiunto lo statement RequestResponse. Ora la nostra porta può richeidere e rispondere twice. Per aiutarvi alla comprensione… twice è il nome dell’operazione, MathService è il nome del servizio.

    ^topComunicazione verso l’esterno
    E per invocare MathService da un altro programma? Il tutto è decisamente molto semplice: dobbiamo utilizzare loo statement solicit-response:

    main
    {

    // <operation>@<service>(<output-message>)(<input-message>)
    twice@MathService(5)(result)

    }

    Il nostro piccolo programma, chiama l’operazione twice del servizio MathService, passando 5 come valore di invocazione. Questo comando, aspetterà di ricevere un paramentro di risposta nella variabile result. Decisamente molto semplice.

    ^topCreare un servizio
    ^topPorte in ingresso
    Ora andremo a creare una applicazione JOLIE che realizza un ambiente per MathService. Per creare un servizio, dobbiamo prima scrivere la porta in ingresso, la quale somiglia decisamente molto alla porta in uscita. Una porta in ingresso per MathService potrebbe essere la seguente:

    inputPort MathService {
    Location: “socket://localhost:8000″
    Protocol: sodep
    RequestResponse:
    twice
    }

    Banalmente, usa la stessa porta, lo stesso protocollo e la stessa operazione.

    ^topComunicazione in ingresso
    Ora che il nostro programma JOLIE è stato istruito per ricevere una invocazione per l’operazione twice, noi dobbiamo scrivere il codice per il suo ambiente. In poche parole noi abbiamo detto che c’è una porta in ingresso che riceverà twice e dobbiamo quindi dire che cosa fa twice.

    main
    {

    twice(number)(result) {

    result = number * 2

    }

    }

    L’operazione twice, riceve number e restituisce result, che altro non è che “number * 2″. Siamo appena riusciti a creare due programmi distinti che sanno inviare un numero, riceverlo e rielaborarlo e reinviarlo al mittente. Con questo, la lezione è finita. Per semplificare le cose, più avanti pubblicherò qualche sorgente che aiuterà senz’altro a capire i meccanismi di JOLIE.

    Condividi questo post sui tuoi social network preferiti:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Google Bookmarks
    • LinkedIn
    • MySpace
    • Twitter
    • Wikio IT
    • Live
    • RSS
    • StumbleUpon
    • Technorati
     
    View Comments

    Posted in tutto

     

    C#: out!

    19 Oct

    Eheheh il titolo è assolutamente fuorviante =). Sono amante del php ma della programmazione in generale. In questi giorni mi sono ritrovato a leggere “C# 2005 Guida per lo sviluppatore“. A dire il vero si tratta di un libro un tantino obsoleto visto che è già uscita la versione 2008 del linguaggio (e quindi del libro).

    Ma non è per questo che ho deciso di scrivere questo post. In verità volevo parlare della forte tipizzazione di C#. In particolare del fatto che non ha tipi variant (come php), e che un dato deve essere inizializzato prima di essere utilizzato. C’è una parola chiave (out) che da a C# una caratteristica molto particolare. Passare un paramentro ad una funzione non è tecnicamente corretto se questo parametro è una variabile e se questa non è stata inizializzata. Come si può ovviare al problema? out è la risposta! Come ho detto non si può utilizzare una variabile se prima non è stata inizializzata, perà Microsoft ha deciso che è possibile passarla comunque come parametro ad una funzione anteponendo out alla variabile. Ecco un esempio di codice che ho appena compilato:

    using System;

    namespace Out
    {
    class MainClass
    {
    private void ciao (out int i)
    {
    i = 33;
    }

    public static void Main(string[] args)
    {
    int i;
    MainClass mainClass = new MainClass();
    mainClass.ciao(out i);
    }
    }
    }

    Faccio notare solo un piccolo particolare: out deve essere utilizzato sia quando si passa il parametro che quando si dichiara il metodo. Ci tengo a far notare che non utilizzo .NET ma MONO e sviluppo con monodevelop.

    (Io Amo l’Open Source ma il sentimento non è corrisposto)

    Condividi questo post sui tuoi social network preferiti:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Google Bookmarks
    • LinkedIn
    • MySpace
    • Twitter
    • Wikio IT
    • Live
    • RSS
    • StumbleUpon
    • Technorati
     
    View Comments

    Posted in tutto

     

    C# su linux con Monodevelop

    17 Oct

    E siccome che a me di installare nuovamente Windows non mi va proprio:

    http://www.howtogeek.com/howto/ubuntu/install-monodevelop-on-ubuntu-linux/

    sudo apt-get install mono mono-gmcs mono-gac mono-utils monodevelop monodoc-browser monodevelop-nunit monodevelop-versioncontrol

    C# is possibile. E’ stato persino meno complicato che installare java =). PS Ieri ho fatto saltare una rana con il mio amatissimo JAVA =)

    Condividi questo post sui tuoi social network preferiti:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Google Bookmarks
    • LinkedIn
    • MySpace
    • Twitter
    • Wikio IT
    • Live
    • RSS
    • StumbleUpon
    • Technorati
     
    View Comments

    Posted in tutto

     

    union ansi c

    17 Jul

    però siccome non si tratta di uCosì come per strcat ho avuto difficoltà a atrovare in giro per la rete qualche cosa di utile che mi spiegasse cosa facesse in concreto una union. Ecco il mio codice di esempio;

    #include <stdio.h>
    #include <stdlib.h>

    typedef union _c
    {
    char byte[4];
    int prova;
    } c;
    int main (void)
    {
    c prova;
    prova.prova = 127;
    printf(“%d”, prova.byte[0]);
    return 0;
    }

    Come dovreste sapere (se siete interessati al C ovvio) un char occupa un byte mentre un int ne occupa 4. Se avessi usato una struttura, la struttura avrebbe occupato 4 + 1 = 5 byte in memoria. Con la union vengono occupati max(1,4) = 4 byte in memoria, ovvero il numero di byte pari alla dimensione occupata dalla variabile più grande.

    La parte interessante, che si vede in questo esempio, è che se io scrivo la variabile intera della union, e poi vado a leggere “byte” nella prima posizione, allora troverò il valore 127. Ho fatto diversi esperimenti e per esempio ho inserito 128. Il valore stampato a video ovviamente è -128:

    128 = 10000000 e l’1 davanti alla sequenza di bit indica che si tratta di un numero negativo.

    Ho provato a modificare il codice impostando la union così:

    typedef union _c
    {
    char byte[4];
    unsigned int prova;
    } c;

    Mi aspettavo che quel 128, una volta stampato risultasse ancora positivo ed invece rimaneva negativo. Quindi ho provato con:

    typedef union _c
    {
    unsigned char byte[4];
    int prova;
    } c;

    … e questa volta il programma ha stampato 128. Ad essere sincero non credevo che i char potessero essere unsigned =). Un “carattere senza segno”. “a” e “-a” sono due cose ben diverse =). Del resto a volte 127 + 1 = -128. Sperto che questo post risolva i problemi di qualche sventurato che continua a non capire come mai le cose non vanno mai come devono andare.

    Condividi questo post sui tuoi social network preferiti:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Google Bookmarks
    • LinkedIn
    • MySpace
    • Twitter
    • Wikio IT
    • Live
    • RSS
    • StumbleUpon
    • Technorati
     
    View Comments

    Posted in tutto