martedì, marzo 17, 2009

Simple Google Documents Backup utility

Recently Google Documents List APIs Team released a new version of the API. Now you can download documents.
Using the new APIs I wrote in .NET a very very simple utility for downloading all my documents. It does a simple backup: for each document in Google Docs, it downloads the document if the document is not present on the local disk or if it was modified.



More info, compiled exe and source code: http://gs.fhtino.it/gdocbackup




.

lunedì, marzo 09, 2009

MySql e Typed Dataset: non ci siamo!

Stavo facendo un po' di esperimenti con MySql e Net 2.0 / VS2005 e ho scoperto che i problemi sono ancora tanti. Il Net Connector (MySql.Data.dll) è un buon prodotto se usato a basso livello ma ha ancora problemi se utilizzato con i vari wizard / utility di aiuto di visul studio. Andiamo con ordine.

La libreria funziona bene se si accetta di scrivere a mano il solito codice tedioso per l'accesso ai dati: creo una connessione, creo un command, gli imposto quello che serve, definisco e carico i parametri, apro la connessione, eseguo, leggo, ecc. ecc. ecc. Cose del tipo (esempio banale):

string dbConnString = Properties.Settings.Default.db1;
using (MySqlConnection dbConn = new MySqlConnection(dbConnString))
{
dbConn.Open();
using (MySqlCommand cmd = new MySqlCommand("select * from persone order by Cognome", dbConn))
{
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
Console.WriteLine("> " + reader["IDpersona"] + "\t " + reader["Cognome"] );
reader.Close();
}
dbConn.Close();
}

Ma quando uno si rompe le scatole di scrivere queste cose, prova ad usare ad esempio i Typed DataSet. In passato ne avevo già parlato: con sql 2005 funzionano bene anche se bisogna fare un po' di attenzione.
Oggi ho scoperto, con mio massimo dispiacere, che ci sono dei grossi problemi con MySql. Per ora la conclusione è: non funzionano! Troppi problemi e lacune. Provo a farne una lista:
  • non ho trovato un modo per far aggiornare i dati di una datatable dopo l'insert. Caso tipico: un campo ID autoincremento. Dopo l'insert vorrei che l'ID riflettesse il valore assegnato dal motore di database. Con Sql funziona, con MySql no! Boh... spero di trovare una soluzione...
  • le query autogenerate contengono sempre / spesso (?) il nome del database. Ad esempio invece di avere SELECT ID, Cognome, Nome FROM Persone c'è SELECT ID, Cognome, Nome FROM MyTestDB.Persone. Quel MyTestDB impedisce di "attaccare" un altro db con la stessa struttura ma nome diverso. Tipico: DBTest, DBProd, ecc. Bello vero? grrrr... Mi consola il fatto che sono bug noti (bug1) (bug2) . Speriamo...
  • i campi autoincremento... non vengono riconosciuti come tali! Vengono visti come normali interi. Peggio di così.... Soluzione: impostarli a mano come autoincremento.

UPDATE 10/03/2009: per il problema dell'update dei campi AutoInc dopo l'inserimento bisogna intervenire a mano sul TableAdapter autocreato da VisualStudio. E' necessario inserire la query di select per l'aggiornamento dei dati. Esempio:

INSERT INTO persone (Cognome, Nome, Eta, IDCitta) VALUES (@Cognome, @Nome, @Eta, @IDCitta);
SELECT IDPersona,Cognome,Nome,Eta,IDCitta FROM persone WHERE (IDPersona = LAST_INSERT_ID());

Stesso discorso per il nome del database: bisogna toglierlo a mano.
Attenzione: non modificare il TableAdapter con il suo wizard (tasto destro "Configure..."). Le query di Insert, Update e Delete verrebbero rigenerate con la conseguente perdita di tutte le modifiche fatte a mano.

 
UPDATE 13/03/2009:  soluzione al problema dei campi autoincremento non riconosciuti. Non è un problema del Net Connector ma di una caratteristica di documentata su MSDN del metodo DataAdapter.FillSchema(). In pratica il campo per essere mappato correttamente come autoincremento deve essere di tipo Signed Int. Nei test che ho fatto io, il campo sul database MySql era INT UNSIGNED. In queste condizioni il designer di Visual Studio non era in grado di impostare in modo corretto la proprietà di autoincremento. E' bastato modificare il database mysql togliendo unsigned al campo.

.

VmWare player rete lenta

[Post... a futura memoria]

Rete lenta fra sistema operativo host e guest? Decine di minuti per copiare qualche file via SMB/Samba? Il sistema host è un Windows? Soluzione: disabilitare il TCP Task Offloading. Per me ha funzionato.

Sembra che il problema sia presente anche in altri ambienti di virtualizzazione, come Virtual Server 2005. O meglio, non è un problema di VmWare o Virtual Server ma di Windows che non si comporta bene con i sistemi "ospiti".


Con Regedit aggiungere, se non presente, la entry DisableTaskOffload valorizzandola a 1 (dword).

1. Click Start, click Run, type regedit, and then click OK.
2. Locate and then click the following registry subkey:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3. Click Edit, point to New, and then click DWORD Value.
4. Type DisableTaskOffload as the entry name, and then press ENTER.
5. Right-click DisableTaskOffload, and then click Modify.
6. In the Value data box, type a value of 1, and then click OK.
7. Quit Registry Editor.
8. Restart your computer.

From: http://support.microsoft.com/kb/888750


.

venerdì, marzo 06, 2009

Google Documents List Data api e proxy

Stavo facendo un po' di prove con la nuova versione delle Google Documents List Data Api per .Net. Nella nuova versione è possibile anche scaricare i documenti da Google Docs in vari formati (Pdf, html, ecc.). Un bel  post sul blog ufficiale di Google fornisce anche i link al codice sorgente di esempio.

Ho scaricato il tutto e funziona perfettamente. Potrebbero però esserci dei problemi se c'è di mezzo un proxy. La libreria .NET di Google utilizza WebRequest e WebResponse del framework NET. Le 2 classi tendono ad utilizzare il proxy impostato in Internet Explorer.  Non ho però trovato il modo per accedere alle istanze di queste classi. Ma c'è un altro modo: passare attraverso la proprietà Proxy di GDataRequestFactory.

Ad esempio, se si vuole usare una connessione diretta, senza usare il proxy impostato in Internet Explorer basta aggiungere un paio di righe:


... SNIP ...

this.request = new DocumentsRequest(settings);
this.Text = "Successfully logged in";

GDataRequestFactory reqFact = this.request.Service.RequestFactory as GDataRequestFactory;
reqFact.Proxy = new WebProxy();

Feed<Document> feed = this.request.GetEverything();
// this takes care of paging the results in
foreach (Document entry in feed.Entries)
{
    all.Add(entry);
}
... SNIP ...
 
La classe Webproxy è quella del framework NET. Vedere MSDN per i dettagli su come usarla.

giovedì, marzo 05, 2009

SuseStudio prime impressioni

Qualche settimana fa ho scroperto per caso SuseStudio. Si tratta di un servizio di OpenSuse (by Novell) che permette di creare macchine virtuali Linux completamente online. Dopo averla configurata è possibile scaricarla come immagine raw per disco (anche usb) oppure immagine iso per cd live oppure come macchina virtuale VmWare.

Provato... funziona!   Ho messo quello che mi interessava, fatto build, scaricato uno zip di 500 MB con dentro una machine virtuale da 1 GB e run in VmWare Player. Tutto OK. Vabbè... per ora sono le prima prove... prima o poi salterà fuori qualcosa che non funziona.  Alla fine dei conti SuseStudio è un servizio ancora in Alpha.

Ultima nota: l'accesso non è immediato. Bisogna farne richiesta e dopo un po' di giorni dovrebbe arrivare il codice di invito. Buona fortuna.

Home page:



Scelta dei pacchetti da installare:





Creazione immagine (disco, cd live, vmware):


Wiki:




.

martedì, marzo 03, 2009

LAMA: Linux, Apache, MySql, Asp.Net

Questa sigla mi mancava: lo stack LAMA = Linux, Apache, MySql, Asp.Net. Conoscevo LAMP ma LAMA mi mancava.
Comunque confermo che funziona. Proprio in questi giorni sto facendo un po' di test con Mono ed effettivamente funziona molto bene. Per prova ho preso un'applicazione asp.net compilata e l'ho messa su Ubuntu con tutto il necessario (a parte Sql Express) e ha funzionato.
A questo punto mi rimane solo MySql.

Un paio di link interessanti: