Month: July 2011

Netduino … errore nel deploy : “DebugPort.GetDeviceProcess() called with no arguments”

Oggi mi è capitato un errore alquanto strano utilizzando la mia board Netduino Plus…

Dopo aver scritto varie applicazioni per testare le funzionalità della board ed averle deployate senza alcun problema, ad un certo punto una nuova applicazione, anche abbastanza semplice, non vuole saperne di essere deployata sul device.

Infatti, durante tale operazione, Visual Studio visualizza il seguente messaggio di errore :

DebugPort.GetDeviceProcess() called with no arguments

Dopo parecchi grattacapi e qualche ricerca su Internet, sono convenuto ad una soluzione non molto elegante ma efficace.

Basta eseguire il deploy della medesima applicazione sull’emulatore e poi ritornare a fare il deploy sulla board….magicamente tutto torna a funzionare !!

Microsoft elimina la verifica GeoTrust

3324.geotrust_005CAAE3

 

Una buona notizia che permette di rendere più semplice l’iter burocratico per diventare sviluppatore per Windows Phone 7.

La Microsoft ha deciso di rimuovere la verifica di GeoTrust per gli sviluppatori individuali e per gli studenti. Non sarà più necessario inviare via mail la fotocopia del proprio documento ed attendere i tempi di verifica di GeoTrust.

Nel comunicato ufficiale, si legge che la validazione dell’identità di uno sviluppatore individuale e di uno studente sarà eseguita sulla base delle informazioni fornite e della carta di credito. Per le aziende rimane invece ancora necessario il passaggio attraverso GeoTrust.

“Individual and Student Identity Validation

Once registration is complete, individuals will be verified using the information provided and their credit card information. These two must match to successfully activate the App Hub account. Students will be verified using the information provided and their DreamSpark membership.”

“Company Identity Validation

Once registration is complete, GeoTrust will contact the Corporate Approver to validate the information provided during registration. The Corporate Approver will first be sent an email to approve the registration request before validation can proceed. Once the request has been approved, GeoTrust will validate the information provided and may contact the Corporate Approver for additional documentation, should that be required to complete validation”

Pachube : un data logger online

3302.pachube_31619063

Pachube, recentemente acquistato da LogMeIn, è un servizio online che mette a disposizione una funzionalità di data logger. Esso, infatti, è capace di registrare e di gestire i dati che provengono da un qualsiasi tipo di dispositivo o sistema, fornendone anche una rappresentazione grafica nel tempo. Attraverso lo stesso sito di Pachube, è poi possibile visualizzare i grafici in questione per poter tenere sotto osservazione le grandezze che essi descrivono.

La fonte dati può essere di vario tipo, da un sistema embedded caratterizzato da sensori che rilevano grandezze nel mondo reale (es. temperatura, luce, …) ad un personal computer che può trasmettere ad esempio il carico o la temperatura del processore o la quantità di memoria libera, passando per gli smartphone (pensando ad esempio ad un dispositivo Windows Phone 7) che possono trasmettere i valori rilevati dal GPS oppure dall’eccelerometro.

Tutte queste informazioni possono essere trasmesse in rete al servizio Pachube, che li registra in tempo reale e ne fornisce una rappresentazione grafica online. In pratica, esso fornisce i dati attraverso un feed. L’interazione con il servizio avviene utilizzando delle API ben documentate che necessitano comunque di una chiave di identificazione che viene assegnato al momento della registrazione al servizio.

Piani e tariffe

Per quanto concerne tale aspetto, Pachube offre i tre seguenti piani tariffari :

  • Pachube Basic : FREE
    • feeds pubblici (quindi tutti avranno la possibilità di vedere online i nostri dati);
    • salvataggio dati storici fino ad un mese;
    • 5 datastreams (attraverso cui trasmettere dati);
    • velocità di gestione di 5 API/minuto;
    • import di 500 datapoints/giorno;
  • Pachube Premium : $7.99 / mese
    • feeds privati e pubblici;
    • salvataggio dati storici illimitato;
    • 250 datastreams;
    • 250 API/minuto;
    • import illimitato di datapoints;
  • Pachube Pro : $1.99 / mese
    • feeds pubblici;
    • salvataggio dati storici fino ad un anno;
    • 40 datastreams;
    • 40 API/minuto;
    • import di 4000 datapoints/giorno;

Tutti i piani permettono un periodo di prova di 7 giorni prima di procedere all’acquisto ed includono :

  • storicizzazione e monitorizzazione dei dati;
  • visualizzazione attraverso grafici online;
  • chiave di identificazione della nostra applicazione;
  • notifiche di eventi che si possono verificare sui datastreams;
  • account sicuri attraverso password e protocollo SSL/HTTPS;
  • numerose API;
  • chiavi aggiuntive con durata limitata per la sicurezza sui dati;

Registrazione

La registrazione è alquando semplice e veloce; in primo luogo bisogna selezionare il piano tariffario che nel mio caso è il Basic (free) e fornire uno username, una password ed un indirizzo email valido.

5241.signup1_678308B2

Subito dopo la registrazione, riceveremo una mail con tutte le istruzioni per l’attivazione dell’account, basterà semplicemente cliccare sul link presente nel corpo della mail stessa.

0211.signup2_794F76B2

Una volta registrati, è possibile creare uno o più feed per ciascuna delle nostre applicazioni che trasferiranno dati verso Pachube. Ciascuna di esse dovrà sempre inviare la master API key che identifica il nostro account. Infine, a ciascun feed potranno essere associati uno o più datastream e per ciascuno di essi anche l’unità di misura della grandezza rilevata.

Di seguito l’esempio di un feed, che riporta le informazioni sulla temperatura ed umidità a Caen. In primo luogo, compaiono le coordinate geografiche che comunque non sono obbligatorie.

4774.feed1_7856C52E

8400.feed2_7B98113C

4186.feed3_237B109C

I campi di applicazione di questo servizio sono molteplici, partendo dall’integrazione di un sistema embedded, ad esempio Arduino o Netduino, con il servizio Pachube per poter monitorare alcune grandezze elettriche e fisiche. Nulla vieta di realizzare delle applicazioni per dispositivi di tipo consumer, quali smartphone (Windows Phone 7, Android, …) oppure addirittura personal computer.

Netduino Plus : il .Net Micro Framework a portata di mano

Netduino Plus rappresenta la versione di fascia alta delle tre board prodotte dalla Secret Labs che sono : Netduino Mini, Netdutino ed appunto Netduino Plus.
Rispetto alla versione Netduino, essa mette a disposizione due features che la rendono ancor più interessante ossia la connessione Ethernt e lo slot micro sd.
La connettività in rete rappresenta sicuramente una delle funzionalità dalle quali un dispositivo moderno non può prescindere per poter interagire con l’ambiente esterno e condividere dati  rilevati attraverso dei sensori. La micro sd fornisce un’ottima potenzialità di storage esterno dei dati.

5756.netduinoplus_4E8511DD

 

Questa board, completamente open source, permette di sviluppare le proprie applicazioni embedded mediante l’utilizzo del .Net Micro Framework 4.1. Oltre all’SDK della Microsoft, è però necessario installare il Netduino SDK 4.1.0, per poterne sfruttare a pieno tutte le potenzialità.

Microprocessore e memoria

Per quanto riguarda il microprocessore, le sue caratteristiche principali sono le seguenti :

  • Atmel ARM7 32 bit (AT91SAM7X512)
  • 48 Mhz Clock
  • 512 KB Flash
  • 128 KB RAM

Nonostante la dotazione di 512 KB e 128 KB rispettivamente di Flash e di RAM, la disponibilità per il codice utente è inferiore, ossia 64 KB di Flash e 28 KB di RAM considerando lo spazio necessario per l’esecuzione del CLR del micro framework e delle ulteriori librerie fornite dalla Secret Labs. Nel caso in cui si escludesse il supporto per l’ethernet, avremmo a disposizione più spazio e più precisamente 128 KB di Flash e 60 KB di RAM.

Input ed Output

L’interazione con l’esterno è possibile attraverso un totale di 20 pin, così differenziati :

  • 14 pin digitali input/output;
  • 6 pin analogici input;

Tutti i pin disponibili possono essere usati sia come pin di GPIO che come pin relativi alle periferiche supportate dal processore, quali :

  • 2 UART
  • PWM
  • Interfaccia SPI
  • Interfacci I2C

In particolare, nel secondo caso, la mappatura dei pin è la seguente :

  • pin digitali 0-1: UART 1 RX, TX
  • pin digitali 2-3: UART 2 RX, TX
  • pin digitali 5-6: PWM, PWM
  • pin digitali 7-8: UART 2 RTS, CTS
  • pin digitali 9-10: PWM, PWM
  • pin digitali 11-13: SPI MOSI, MISO, SPCK
  • pin analogici 4-5: I2C SDA, SCL

Una delle principali caratteristiche a cui fare attenzione è la corrente massima disponibile sui pin, così disposta :

  • corrente massima: 8 mA per pin
  • pin digitali 2, 3, 7: 16 mA per pin
  • pin analogici 0-3: 2 mA per pin
  • corrente massima del microprocessore : 200 mA total

Inoltre, tutti i pin lavorano con tensione di 3,3 V ma arrivano a tollerare fino a 5 V. Infine, i pin analogici permettono l’accesso ai canali ADC con una risoluzione di 10 bit.

Alimentazione e massa

L’alimentazione può essere fornita attraverso un alimentatore da 7.5 – 12.0 V oppure via USB.

Dispone inoltre di una serie di pin che permettono di portare all’esterno le due alimentazioni di 3,3 V e 5 V, così come un pin AREF attraverso il quale poter fornire l’alimentazione di riferimento per gli ingressi analogici.

Networking

La connessione ethernet permette una velocità di 100 Mbps ed lo stack di rete disponibile èlwIP (lightweight IP), ossia uno stack TCP/IP open source progettato esclusivamente per sistemi embedded.

Storage

Oltre alla flash dedicata alla memorizzazione del codice applicativo, è messo a disposizione uno storage esterno attraverso lo slot per microSD fino a 2 GB.

Accessori Onboard

Infine, sulla board sono disponibili un led ed uno switch che viene utilizzato anche per eseguire il reset della scheda. Questi due semplici accessori permettono di utilizzare subito la scheda per progetti molto semplici, prima di svilupparne di più complessi mediante l’utilizzo di componenti esterni.

Conclusioni

Netduino, in tutte le sue versioni, è un progetto completamente open source, per il quale sono disponibili i codici sorgenti dell’SDK e lo schematico per la realizzazione del circuito. Per approfondimenti vi rimando alla pagina ufficiale.

Sito MSDN : una nuova veste grafica

2438.msdn_logo_16F427C7

 

Il sito MSDN ha una nuovissima veste grafica e sinceramente ben fatta e molto più accessibile e navigabile della precedente.

In alto, in evidenza le quattro aree principali di sviluppo : desktop, web, cloud e phone.

6445.msdn_1_53C8A999

Nella parte bassa, oltre ai link diretti alle quattro aree suddette, anche le sezioni dedicate ai tools disponibili da Visual Studio a Microsoft Expression.

7217.msdn_2_78E5F405

Windows Phone Mango : evento online

Ieri c’è stato un evento online in streaming dedicato a Windows Phone “Mango”, che potete rivedere al seguente link.

C’è una keynote iniziale più 6 sessioni tecniche che sono le seguenti :

  • Introduzione allo sviluppo per Windows Phone;
  • Il design delle applicazioni Windows Phone;
  • Le novità della piattaforma di sviluppo in Windows Phone “Mango”;
  • Multitasking nelle applicazioni Windows Phone “Mango”;
  • Live Tile e notifiche in Windows Phone “Mango”;
  • Phone + Cloud in pochi clic con Azure Toolkit per Windows Phone 7;

Non ho avuto modo di seguirle in diretta ma non mancherò di farlo in questo weekend.

Buona visione !

StringBuilder : tre modi per ripulirla

Quando utilizziamo un oggetto StringBuilder e lo costruiamo in maniera incrementale attraverso i metodi Append() ed AppendFormat(), arriva talvolta il momento di doverlo ripulire per poterlo riutilizzare. Ovviamente, non ha senso istanziare un nuovo oggetto facendolo puntare dal medesimo riferimento che stavamo usando sino a quel momento e stranamente la classe StringBuilder non fornisce un metodo Clear().

Esistono, però, tre modi per ripulire un oggetto StringBuilder.

Impostare la lunghezza a zero

La property Length non è readonly, per cui è lecito eseguire la seguente operazione..

myStringBuilder.Length = 0;

Rimuoverne il contenuto

Utilizzare il metodo Remove() per tutta la lunghezza della stringa…

myStringBuilder.Remove(0, myStringBuilder.Length);

Replace del contenuto con la stringa vuota

Sostituire la stringa interna allo StringBuilder con una stringa “vuota”, utilizzando il metodoReplace()

string content = myStringBuilder.ToString();

myStringBuilder.Replace(content, string.Empty);

Pattern Singleton con parametri

Attraverso il pattern Singleton, siamo in grado di rendere disponibile un’unica istanza di una classe in un qualunque punto di un’applicazione essa venga referenziata, in quanto l’allocazione dell’oggetto avviene una sola volta in corrispondenza del primo accesso.

L’implementazione più semplice del pattern, senza considerare le problematiche di thread-safety (per le quali vi rimando a questo link), prevede all’interno della classe stessa :

  • un campo privato statico “instance” che rappresenterà l’unica istanza della classe a cui appartiene;
  • un costruttore privato, quindi non invocabile dall’esterno, che istanzia la classe assegnando il riferimento al campo suddetto;
  • un metodo o una proprietà che ritorna il riferimento al campo privato in maniera intelligente, creando l’istanza della classe se non esiste oppure ritornando il suo riferimento se la stessa è stata già allocata;

Poiché poche righe di codice riescono ad esprimersi più di mille parole, riporto di seguito la versione base di implementazione del pattern :

<br />public class MyClass<br />{<br />    private MyClass instance = null;<br />    ...<br />    ...<br />    private MyClass()<br />    {<br />        // costruzione oggetto<br />    }<br />    ...<br />    ...<br />    public MyClass Instance<br />    {<br />        get<br />        {<br />            if (instance == null)<br />                instance = new MyClass();<br />            return instance;<br />        }<br />    }<br />}<br />

Nel caso in cui abbiamo necessità di passare dei parametri in fase di allocazione dell’oggetto, come possiamo comportarci ?

Una possibilità potrebbe essere quella di implementare un metodo GetInstance() in luogo della property Instance e predisporlo con dei parametri in ingresso.

Ad esempio, nel caso di due parametri :

private MyClass(int param1, int param2)
{
    // costruzione oggetto
}

public MyClass GetInstance(int param1, int param2)
{
    if (instance == null)
        instance = new MyClass(param1, param2);
    return instance;
}

Con questa soluzione, si può dar luogo ad un’ambiguità. Basta considerare il seguente esempio :

MyClass a = MyClass.GetInstance(1,2);
MyClass b = MyClass.GetInstance(3,4);

Chi lavora con l’oggetto a, si aspetta di aver inizializzato correttamente l’oggetto con i valori 1 e 2. Chi lavora con l’oggetto b, invece, si aspetta di avere un oggetto il cui stato interno ha valori 3 e 4. Ovviamente, la prima inizializzazione prevarrà sulla successiva e quindi sia il riferimento a che b punteranno al medesimo oggetto avente stato con valori 1 e 2 (positivo per a ma non per b).

Una soluzione a questo problema può essere quello di implementare il pattern nel modo seguente :

public class MyClass
{
    private MyClass instance = null;
    ...
    ...
    private MyClass(int param1, int param2)
    {
        // costruzione oggetto
    }

    public MyClass GetInstance()
    {
        if (instance == null)
            throw new InvalidOperationException("MyClass instance not created !");
        return instance;
    }

    public static MyClass Create(int param1, int param2)
    {
        if (instance != null)
            throw new InvalidOperationException("MyClass instance already created !");

        instance = new MyClass(param1, param2);
        return instance;
    }
}

In pratica, viene fornito all’esterno un metodo statico di Create() per la prima allocazione dell’oggetto ed il metodo GetInstance() per ricavarne l’istanza corrente. Una doppia chiamate al metodo Create() solleverebbe l’eccezione “oggetto già creato” così come una chiamata alla GetInstance() senza aver prima creato l’oggetto, solleverebbe l’eccezione “oggetto non creato”.