venerdì 29 ottobre 2010

Sillabe (Array di sillabe italiane)

Come sempre ... devo inventarmi qualcosa per risolvere un problema...

Scherzavo .. eh eh eh ! questa volta il problema non esiste ma sono più che sicuro che questo post possa essere uno dei miei post più importanti.

Già sono più che sicuro che molti di noi si siano più volte imbattuti in questa domanda.. MA QUALCUNO AVRA' MAI PENSATO A CREARE UN ARRAY DELLE SILLABE ITALIANE ??

Credo (anche se non lo spero) di essere il primo ... ed ecco il quanto

public const string[] Sillabe { "à","a","ab","ac","àc","ad","af","ag","ai","al","am","an","ap","ar","àr","as","at",
"au","az","az","ba","bà","bac","bal","bam","ban","bar","bàr","bat","be","bè","bel",
"bèl","béz","bi","bil","bo","bò","boc","bor","bra","bràn","bri","brò","brùt","ca",
"cà","cal","càl","cam","can","car","cat","ce","cel","cèl","cem","cèn","cet","ces",
"cer","cét","che","ché","chi","chì","chia","chià","chiac","chie","chiò","chio","cì",
"ci","cia","ciè","ciè","cièn","cìl","cil","cin","cio","cio","ciòl","clé","co","cò",
"coc","col","còl","com","con","cón","cop","cor","còr","crà","cra","crè","crè","cre",
"crì","cri","cro","crò","cru","cu","cù","cul","da","dà","dar","dàt","de","dèl","den",
"di","dì","dig","dio","diu","do","dò","dol","dól","don","dót","du","dù","dur","e",
"ei","eu","fa","fà","fab","fal","fan","fè","fèt","fi","fie","fiu","fo","for","fra",
"fra","frà","frap","fré","frin","frìt","frón","fron","fu","ga","gà","gal","gat",
"gaz","ge","get","ghe","gi","giàl","gio","giù","giu","giùn","gli","glie","glie",
"glie","gliò","gliò","go","gò","gon","gor","gra","grìl","gròp","gù","gua","guan",
"gue","guèl","guì","gui","i","ì","ia","ia","ià","ià","iai","ie","iei","in","ìn",
"io","io","iu","iuo","ka","kov","la","là","làn","las","làsc","làt","laz","le","lè",
"lèn","let","lét","lét","lèt","léz","léz","lì","lì","lia","liar","liè","lìn","lin",
"lis","lo","lò","lon","lon","lón","lòp","lòp","lór","lot","lòt","lot","lu","lù","lù",
"luò","ma","mà","mac","mal","man","màr","mar","mat","me","mé","mè","mè","mèl","mén",
"men","met","mi","mì","mic","mit","mo","mò","mol","mon","mor","mór","mul","mùl","na",
"nà","nal","nar","né","nè","ne","nel","nèl","ner","nér","nèr","net","ni","nì","nìs",
"niz","no","nò","noc","nòc","non","nòt","nu","nù","nua","nuo","nuò","o","ò","oc","oi",
"on","os","ot","ou","pa","pà","pàl","pal","pan","pàn","pàp","par","par","pàt","pe",
"pé","pèl","pen","per","pèr","per","pèt","péz","pi","pì","pie","pìl","pin","piu",
"pla","plàn","ple","pli","pli","plu","pluì","pò","po","pó","pò","pòl","pór","pòr",
"prà","pra","pre","pren","prez","pric","pro","pu","pùl","pùm","quag","quas","quàt",
"quin","ra","rà","rac","ral","ran","ràn","rat","rat","ré","re","rec","rèl","rem",
"ren","rèn","rét","rì","ri","rial","riàn","ric","rio","riz","ro","rò","róm","ron",
"rù","ru","rul","rùl","sa","sà","sac","sàc","sàg","sal","sàl","san","sàn","sba",
"sbal","sbi","sca","scà","scar","scel","sci","sci","sco","scon","scor","scrac","scré",
"scu","scu","sdi","se","sè","se","sen","sen","ses","set","sfar","si","sì","sià",
"sic","sìc","sièr","sìl","sim","slà","slab","slàr","slès","slit","smàl","smu",
"so","sò","só","sol","sòl","són","sor","sòr","sot","spèt","spi","spre","sra",
"sta","stà","stan","stè","ste","stéc","sti","stì","stic","stìn","sto","sto","stò",
"stra","strà","stràc","stres","strì","stri","stril","striz","strò","stroz","stu",
"stuò","su","sù","suà","sur","svio","ta","tà","tal","tàn","tap","tàr","tàr","te",
"tè","tè","tel","tèl","ten","tèn","tèn","ter","ti","tì","tià","tiè","tiè","tis","tìs",
"to","tó","tò","ton","tór","tor","tra","trét","tri","tro","trol","tron","trù","tu",
"tù","tù","tùc","u","ua","uai","uc","ue","uei","ui","un","uo","uoi","va","ve","vel",
"ven","vèn","ver","vi","vì","vil","vo","vò","vol","vòr","vór","yò","zà","za","zam",
"zé","ze","zec","zèl","zèl","zi","zì","zial","zio","zió","zio","zò","zòp","zop","zu"
};

Probabilmente qualche doppione c'e' è possibile che non siano tutte, ma sono più che convinto
che sia un ottimo (se non essenziale) punto di partenza...

A che cosa può servire ??
A) Generatore di parole casuali
B) Generatore di frasi casuali
C) Generatore di Password (volendo si .. )

E molto altro credo .. la fantasia rimane a voi...

martedì 12 ottobre 2010

From XML to C# Class...

Si già e poi ?? Verrebbe da dire, ma questa funzionalità esiste dal VS 2005 solo che non tutti lo sanno.

Esattamente in che cosa consiste ? Esiste un tools "XSD" che consente varie opzioni, quella in analisi consente
a) la generazione di un file xsd, partendo da un xml
b) la generazione di un file .cs (classe o classi) che rappresentano l'xsd.

Onestamente ho fatto solo una prova e sono più o meno convinto del risultato ottenuto, anche se sono partito da un XML.

Fate questa prova:
-createvi un file xml che possegga l'intestazione un nodo (root) e una serie di figli..
-qualcosa di simile a
[animali]
[animale]
[tipo] qudrupede [/tipo]
[verso] bau [/verso]
[famglia] canidi [/famglia]
[nome] Doggy [/nome]
[/animale]
[animale]
[tipo] qudrupede [/tipo]
[verso] miao [/verso]
[famglia] felinidi [/famglia]
[nome] kitty [/nome]
[/animale]
[/animali]
-salvatevi il file come [nome].xml
-da prompt di visual studio lanciate il comando XSD [nome].xml
-il risultato è un xsd che descrive il vostro xml
-sempre da prompt lanciate il comando XSD [nome].xsd /Classes
-E il risultato è il file [nome].cs che contiene le classi rappresentanti il vostro XML

Provare per credere....

giovedì 7 ottobre 2010

IsNumeric ( regular Expression )...

Avevo già affrontato questo simpatico problema... come comprendere se un valore in una stringa, è o non è un numero.

Al tempo mi ero risolto il problema (non molto elegantemente) con un try catch dove nel try avevo bene pensato di forzare il valore letto in un int in caso di Exception... non stavo trattando un numero.

Bene l'idea era valida, e funzionante ma non del tutto efficace..

Ad oggi ecco due nuove Idee... testate e garantite basate sulle regular expression.

public bool isNumeric (string value)
{
Regex verifier = new Regex( @"^(\+|-)?\d+(.|,)*\d+$");

return verifier.IsMatch(value);
}

public bool isNumeric (string value)
{
Regex verifier = new Regex(@"[0-9](.|,)*[0-9]$");

return verifier.IsMatch(value);
}

Nel primo caso si considera anche la possibilità di avere un + o un - come intestazione del numero, il secondo no.

Entrambi funzionano, ma è necessario includere la System.Text.RegularExpressions...

martedì 5 ottobre 2010

Assmbly Build Version...

Mi è capitato di voler sapere la data di build di un assembly (non la data di creazione o la data in cui è stato copiato.. per quello basta leggerle da file sistem...) e non è stato semplice comprendere dove e come reperire l'informazione.

Tuttavia, il linker (in fase di build) si occupa anche di questo... E' necessario fare una premessa, questo codice in parte trovato on line, in parte modificato da me, ha lo scopo nudo e crudo di recuperare una porzione di byte che rappresentano proprio o quasi la data di buil di un assembly.

E' doveroso ricordare che quest'informazione proviene in parte o in toto dall'assembly Version che se compilato con logica (1.0.*) funziona... (nel mio caso funziona anche con (1.0.0.0).

private string GetAssemblyBuildDate()
{
//
// percorso dell'assembly
//
string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
//
// posizione di Offset dell'header..
//
const int c_PeHeaderOffset = 60;
//
// posizione in cui il linker deposita la data durante la sua fase.
//
const int c_LinkerTimestampOffset = 8;
//
// buffer
//
byte[] b = new byte[2048];
//
// stream di byte.
//
System.IO.Stream sAssembly = null;

try
{
//
// operazione ad assembly aperto...
//
sAssembly = new System.IO.FileStream(
filePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read
);
//
// legge dal byte 0 al 2048'esimo
//
sAssembly.Read(b, 0, 2048);
}
finally
{
//
// se non è riuscito nel tentativo di aprire il buffer..
//
if (sAssembly != null)
{
sAssembly.Close();
}
}

//
// legge dal buffer i primi 60 char/byte
//
int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
//
// crea il limite (superiore byte che rappresentano la data di build in secondi...) partendo da ciò che letto
//
int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);

//
// si crea la data di comodo a cui sommare il limite
//
DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);

//
// li aggiunge alla data di comodo
//
dt = dt.AddSeconds(secondsSince1970);
//
// "aggiunge" il gmt
//
dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);

return dt.ToShortDateString() + " " + dt.ToLongTimeString();
}

Come sempre se recuperate questo codice, potrebbe essere necessario verificare l'indentazione dei commenti ...