Problema:
Data una stringa, calcolare e ritornare una nuova stringa con gli stessi caratteri ma in ordine inverso.
Esempio: ABCDE
Risultato: EDCBA
Input:
Una stringa.
Output:
La stringa di input con i caratteri in ordine inverso.
Il mio ragionamento:
Costruisco un vettore di caratteri lungo quanto la stringa e lo riempio con un semplice ciclo for.
La mia soluzione:
public static string Reverse(string s)
{
if (s == null) throw new ArgumentNullException("s");
if (s.Length < 2) return s;
int n = s.Length - 1;
char[] vc = new char[n + 1];
for (int i = 0; i <= n; ++i)
vc = s[n - i];
return new String(vc);
}
Problema 1:
Determinare se in una stringa tutti i caratteri sono diversi tra loro.
Problema 2:
Risolvere il problema 1 senza usare strutture dati aggiuntive.
Input:
Una stringa
Output:
Un booleano
Il mio ragionamento:
Sfrutto un vettore di booleani con un numero di elementi pari a tutti i possibili caratteri. Itero la stringa e per ogni carattere setto il corrispondente elemento del vettore a true. Se prima di settare lo trovo gia’ a true significa che quello e’ un carattere ripetuto e restituisco subito false. Se si termina l’iterazione allora ritorno true.
Senza strutture dati non si puo’ fare altro che controllare ogni coppia di caratteri.
Le mie soluzioni:
public static bool IsStringWithUniqueCharacters1(string s)
{
if (s == null) throw new ArgumentNullException("s");
if (s.Length < 2) return true;
bool[] flags = new bool[Char.MaxValue + 1];
foreach (char c in s)
if (flags[(int)c]) return false;
else flags[(int)c] = true;
return true;
}
public static bool IsStringWithUniqueCharacters2(string s)
{
if (s == null) throw new ArgumentNullException("s");
if (s.Length < 2) return true;
int n = s.Length;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (s == s[j]) return false;
return true;
}
Problema 1:
Fino ad ora non sapevo cosa fosse una ransom note.
Praticamente si tratta di un testo realizzato utilizzando ritagli da una rivista.
Dato il testo di una ransom note e il testo della rivista, dire se e’ possibile realizzare la ransom note.
Problema 2:
Risolvere lo stesso problema ma ritagliando parole invece che singoli caratteri.
Input:
Testo della ransom note che si vuole creare (stringa).
Testo della rivista da cui si vuole ritagliare (stringa).
Output:
True se e’ possibile realizzare la ransom note, False altrimenti.
Il mio ragionamento:
Scansiono due volte i testi e costruisco due vettori che conteggiano il numero di occorrenze di ciasun carattere. Fatto questo controllo che ci sia sempre un numero sufficiente di lettere per costruire la ransom note confrontando uno ad uno gli elementi corrispondenti di questi due array.
Per quanto riguarda il problema 2 invece di utilizzare due vettori, utilizzo due tabelle hash. La logica e’ sostanzialmente la stessa.
Le mie soluzione:
public static bool IsCharacterRansomNotePossible(
string noteText,
string magazineText)
{
if (
String.IsNullOrEmpty(noteText) ||
String.IsNullOrEmpty(magazineText))
throw new ArgumentException(
"noteText and/or magazineText cannot be null or empty");
const int N =
Char.MaxValue + 1;
uint[] noteCount =
new uint
;
uint[] magazineCount =
new uint
;
foreach (
char c
in noteText) ++noteCount[(
int)c];
foreach (
char c
in magazineText) ++magazineCount[(
int)c];
for (
int i = 0; i < N; ++i)
if (noteCount > magazineCount)
return false;
return true;
}
public static bool IsWordRansomNotePossible(
string noteText,
string magazineText)
{
if (
String.IsNullOrEmpty(noteText) ||
String.IsNullOrEmpty(magazineText))
throw new ArgumentException(
"noteText and/or magazineText cannot be null or empty");
var noteCount =
new Dictionary<
string,
int>();
var magazineCount =
new Dictionary<
string,
int>();
var noteWords = noteText.Split();
var magazineWords = magazineText.Split();
foreach (
string s
in noteWords)
if (noteCount.ContainsKey(s)) ++noteCount;
else noteCount = 1;
foreach (
string s
in magazineWords)
if (magazineCount.ContainsKey(s)) ++magazineCount;
else magazineCount = 1;
foreach (
string word
in noteCount.Keys)
if (!magazineCount.ContainsKey(word) || noteCount[word] > magazineCount[word])
return false;
return true;
}
Qualunque commento e’ ben accetto. Il codice non e’ stato testato rigorosamente.
Problema:
Dato un array di interi ordinato in modo crescente ma ruotato, calcolare il valore minimo.
Input:
Un vettore di interi.
Output:
Un intero che rappresenta il minimo elemento del vettore.
Esempio:
Dato l’array ordinato ruotato:
20, 30, 50, 108, 6, 8, 9, 19
il valore minimo e’ 6
Il mio ragionamento:
Fare una scansione totale dell’array avrebbe complessita’ O(n) e non sfrutterebbe l’informazione aggiuntiva che l’array e’ ordinato e ruotato.
Si puo’ allora pensare di fare una specie di ricerca binaria con complessita’ O(log(n)) guidata dal valore dell’elemento centrale dell’array e dell’elemento finale.
Se l’elemento finale e’ maggiore o uguale all’elemento centrale allora il minimo si trova nella prima meta’ dell’array altrimenti nell’altra. Nota che l’elemento centrale potrebbe essere il minimo solamente nel primo caso (questo motiva l’utilizzo di m invece che m-1 nel codice seguente).
La mia soluzione:
private static int InternalMin(int[] v, int a, int b)
{
if (a == b) return v;
int m = (a + b) / 2;
return (v >= v[m]) ? InternalMin(v, a, m) : InternalMin(v, m + 1, b);
}
public static int Min(int[] v)
{
if (v == null) throw new ArgumentNullException("v");
if (v.Length == 0) throw new ArgumentException("v must contain at least one element");
return InternalMin(v, 0, v.Length - 1);
}
Problema:
Data un’ora, calcolare l’angolo in gradi compreso tra le due lancette dell’orologio (sempre il piu’ piccolo dei due).
Input:
L’input e’ costituito da due interi che rappresentano rispettivamente il valore delle ore (h) e il valore dei minuti (m).
Output:
L’output e’ un numero reale (compreso tra 0 e 180 gradi) che rappresenta l’angolo cercato.
Il mio ragionamento:
Misuriamo gli angoli assoluti in senso orario e partendo dalla positione che indica le 12.
Il valore assoluto dell’angolo della lancetta dei minuti e’ dato da:
m * (360 / 60) = 6 * m
Il valore assoluto dell’angolo della lancetta delle ore e’ dato da:
h * (360 / 12) + (m / 60) (360 / 12) = 30 * h + m / 2
La differenza di questi due angoli in valore assoluto e’ uno dei due angoli tra le lancette:
Abs( 6 * m – (30 * h + m / 2)) =
Abs( 5.5 * m – 30 * h )
Tuttavia se questo angolo e’ maggiore di 180 significa che dobbiamo considerare il suo esplementare:
(360 – angle)
La mia soluzione:
public static double GetAngleBetweenClockHands(byte h, byte m)
{
if (h < 0 || h > 11) throw new ArgumentException("h have to be between 0 and 11");
if (m < 0 || m > 59) throw new ArgumentException("m have to be between 0 and 59");
double angle = Math.Abs(5.5 * m - 30 * h);
return angle <= 180 ? angle : 360 - angle;
}
Per chi non ci conoscesse, DotNetToscana è lo User Group Toscano su .NET, un gruppo senza fini di lucro formato da persone con una forte passione per l’informatica e in particolare per prodotti e tecnologie legate al Microsoft .NET Framework.
Il nostro principale scopo è quello di favorire il dialogo e lo scambio di conoscenze ed esperienze tra persone che vivono, studiano e/o lavorano in Toscana. Non c'è tuttavia alcun vincolo territoriale e chiunque può diventare un membro e partecipare attivamente a questa Community.
Crediamo fortemente che incontrarsi di persona al di fuori di questo ambiente virtuale sia estremamente importante affinché interessi comuni possano concretizzarsi e permettere la nascita di nuove e sincere amicizie.
Se hai una forte passione per il .NET Framework, condividi il nostro spirito e ciò in cui crediamo, iscriviti subito ed entra a far parte della Community!
Sei già iscritto? Che cosa stai aspettando?
Partecipa attivamente condividendo le tue conoscenze attraverso il nostro forum, oppure inizia subito a pubblicare contenuti creando il tuo blog personale! E non dimenticare di consultare il nostro Wiki, attraverso cui renderemo disponibili articoli e apprfondimenti sulle tecnologie .NET: se sei un utente registrato, puoi contribuire con i tuoi commenti e, se ne hai voglia, persino inviare un articolo scritto da te, che ti piacerebbe condividere con gli altri!
Se sei curioso di sapere chi si nasconde dietro la nascita di questo gruppo, o per qualsiasi necessità, puoi conoscere o contattare i creatori di questa Community e guardare l'intervista fatta da Pietro Brambati durante i Micorosoft Days 08 a Firenze.

Sono quasi passati un paio di anni dalla nascita del gruppo ed ancora non siamo riusciti a crescere come vorremmo.
Per questo motivo abbiamo creato un brevissimo sondaggio in modo da raccogliere feedback per migliorare nel prossimo futuro.
La nostra maggiore difficoltà è il fatto di essere pochi. Approfitto per ricordare che chiunque sia interessato a diventare un membro dello staff può fare esplicita richiesta tramite il nostro sito web.
Perfavore, aiutaci a migliorare la nostra community o meglio LA TUA COMMUNITY:
Compila il sondaggio su DotNetToscana
La compilazione richiede meno di un minuto.
Dopo una prima fase di sviluppo su una applicazione enterprise in tecnologia Java e Javascript (quasi tre mesi), in seguito ad un mio colloquio con il direttore tecnico dell’azienda sono stato recentemente spostato su un nuovo interessante progetto in tecnologia .NET.
Negli ultimi dieci giorni in azienda ho lavorato intensamente con la tecnologia XNA 3.1 per permette di visualizzare e navigare i risultati del motore di ricerca aziendale in maniera tridimensionale e su schemi con tecnologia 3D Vision. L’obiettivo e’ sperimentare nuove modalita’ di interazione e arricchire l’esperienza utente. Infatti tale progetto si colloca nell’area di ricerca e sviluppo della mia azienda. E’ un lavoro che sto svolgendo con altri due colleghi e devo ammettere che mi sto divertendo una marea. Adoro XNA e adoro C# !
Oggi in azienda e’ stata una giornata molto importante perche’ il principe Andrew, Duke of York figlio della regina Elizabeth II ha fatto una visita ufficiale. Erano presenti molti giornalisti e il principe ha fatto il giro delle scrivanie e gli sono stati presentati i principali team di sviluppo e i loro prodotti. Anche io ho fatto la mia parte, rispettando il galateo inglese. Saluto: “Good morning, your royal highness” :) Il direttore tecnico UK ha presentato al principe la nostra versione demo e abbiamo ricevuto feedback positivi e un certo interesse viste le domande.
La soddisfazione piu’ grande per me, pero’, e’ stata piu’ tardi quando il CEO e il chairman dell’azienda (venuti dagli USA per l’importante visita) sono venuti, in momenti separati, alla mia scrivania per vedere l’applicazione. Entrambi erano estremamente entusiasti e mi hanno fatto molti complimenti. Avevo il cuore a mille, ma ero molto felice :)
Durante tutto il pomeriggio c’e’ stato un via vai di persone (tra cui alcuni manager dell’azienda) che hanno chiedo di poter vedere l’applicazione in esecuzione. Questo significa che il nostro lavoro e’ ritenuto valido e ricevere questo tipo di complimenti non ha prezzo.
Per ora sono davvero molto soddisfatto, vedremo gli sviluppi futuri….
What do you usually do when you have to learn a new technology or a new metodology?
The typical action is to read a tutorial or a book and then, start to put in practice the new concepts.
Is this boring?
For a lot of people the answer is "Yes, it is". They think that reading a book is boring and they would like a quicker way to learn.
Why not attend a course class?
Yes, this is a good option but the problem is that often the company where you work does not invest enough in training. For this reason, you cannot get some free days for the class. However, also if you could attend the course probably you have to move to an other city and this could be a problem.
Then, What is the better option we have?
Simple: ThinkCode.TV
ThinkCode.TV is a web site where you can buy a lot of video courses (called screencast) created by technical experts. You can download the lessons and watch them anytime, anywhere! In this lessons, very competent programmers explain you new technologies step by step. This a very easy to learn approch. I tried it and it works pretty well.
More information about ThinkCode.TV and the list of courses available are in their website:
http://thinkcode.tv/
All the knowledge in two simple words:
WATCH and LEARN
Ieri sera ho terminato la lettura del libro “Work Smarter With Speed Reading”
Devo dire che mi ha fatto riflettere parecchio e mi ha suggerito utili consigli pratici.
La cosa piu’ importante per aumentare la propria velocita’ di lettura e’ imparare a leggere con gli occhi invece che con le orecchie. Se leggi con le orecchie (leggi dentro di te a voce alta, parola per parola) la massima velocita’ che potrai raggiungere e’ la velocita’ con cui parli. Purtroppo mi sono reso conto che io leggo sempre con le orecchie, abitudine radicata da anni e anni di lettura.
Prima bisogna riuscire a incrementare la velocita’ e solo successivamente cercare di eliminare il suono dentro la testa (chiamato sub-vocalization).
Il consiglio che ritengo piu’ utile e’ quello di utilizzare un indicatore (io uso una penna per esempio). La cosa fondamentale e’ scorrere l’indicatore a velocita’ costante, riga per riga, e incrementare lentamente la velocita’ superando di poco quella in cui ci si sente a proprio agio. Questo semplicissimo esercizio stimola la lettura con gli occhi. L’obiettivo finale e’ cercare di imparare a leggere piu’ di una parola per volta (addiritura piu’ di una riga anche se mi sembra incredibile).
Personalmente e’ circa una settimana che ormai leggo sempre utilizzando l’indicatore (anche per finire il libro stesso), e gia’ solamente in questo limitato range temporale sento di aver aumentato la mia velocita’. Sento che questo metodo mi potra’ dare grossi benefici. Prima di iniziare ho misurato la mia velocita’ di lettura (seguendo le istruzioni del testo), usando testi in inglese (quindi neanche la mia lingua madre), e il risultato e’ stato di 247 parole al minuto che e’ quasi il massimo che si puo’ ottenere dalla lettura a orecchie.
Riporto alcune frasi del libro (direttamente in inglese) che ritengo significative:
- “Speed reading is a skill. Developing that skill does not mean you have to read fast all the time. The ability to read quickly allows you to choose how fast or slow you read”
- “We do know that some people can read a book the size of “War and Peace” in less than 20 minutes and retain and recall enough to answer questions at least as well as those who read ‘normally’!”
- “Speed reading is easy to learn, and you can learn it quickly”
- “No matter how fast you read, unless you rememeber what you read you will have wasted your time”
- “Use new information”
- “Have a purpose”
- “Use the Five-Step Reading System” (presentato nel libro)
- “Reading quickly requires concentration”
- “Every type of reading should be approached differently”
- “Read the first paragraph of every chapter and the first and last (if the paragraph is long) sentence of every paragraph”
- “Cross out, highlight, underline, circle and take notes as you read”
- “Take a few moments to stop and summarize what you have learnt from each chapter”
- “Having a clear purpose is the easiest way to cut out the dross and find information you really need”
- “Prepare your mind and environment before you start to read”
- “Practise ofted: use everything you read as a practice medium”
- “Speed reading a second language is full of challenges. The first is vocabulary".
- “Use a pacer as you read. It keeps your attention on the page and your eyes moving”
- “Eliminate as many distractions as you can. The more you are interested in what you are doing, the easier it is to concentrate.”
- “Taking a break will improve your memory, concentration, mood and ability and enable you to continue for much longer than you could without one”
- “Consiously decide to focus on the reading you need to do. Make it a priority.”
- “Reinforce what you read by reading a number of books on the same subject”
- “Take care of your eyes.”
- “Get plenty of quality sleep”
- “Avoid working through the night. Avoid caffeine.”
- “Try to deal with all your e-mail at one point in the day”
- “Don’t feel under pressure to know everything”
- “Never stop learning. There will always be something new.”
Leggere con gli occhi e’ ovviamente solo un aspetto del problema. Il libro tratta anche come affrontare diverse tipologie di testi a seconda degli scopi e i vincoli temporali che abbiamo, problematiche relative alla lettura di testi in lingua straniera e anche aspetti pratici su concentrazione, memoria, pause, lettura al computer e affaticamento degli occhi.
Consiglio a tutti la lettura.
La cosa piu’ difficile e’ avere la volonta’ di applicare alcune tecniche quotidianamente. Nel mio piccolo cerchero’ di farlo, perche’ lo ritengo veramente un investimento in termini di tempo che posso dedicare ad altre attivita’ o alla lettura stessa.
Ricordare sempre che:
Speed reading is not just about reading words faster then you did before. It’s about being able to read at a speed appropriate for the material you are reading.
Concludo con una bellissima citazione che e’ un po’ la mia filosofia di vita:
“Look constantly for a better way of doing what you do”
In azienda mi sono imbattuto in un libro molto interessante chiamato “The Pragmatic Programmer” della Addison-Wesley. Il libro e’ sostanzialmente una raccolta di Tip estremamente preziosi ottenuti tramite anni di esperienza diretta sul campo. L’obiettivo del libro e’ quello di far diventare uno sviluppatore piu’ efficace e piu’ produttivo.
In particolare mi sono imbattuto sul seguente tip:
“Don’t Program by Coincidence”
L’idea e’ quella di cercare di evitare di affidarsi a fortuna o successi casuali in favore di una programmazione piu’ attenta. Quando introduci del codice e scopri che qualcosa non funziona e non riesci a capire perche’ non funziona, questo potrebbe significare che forse tu non sapevi ancor prima della tua motifica perche’ il codice funzionava. Questa affermazione sembra banale ma non lo e’ affatto.
Come fare ad evitare tutto questo ?
- Essere sempre consapevoli di quello che si sta facendo
- Non scrivere codice ciecamente. Cercare di realizzare una applicazione che non comprendi completamente, o usare una tecnologia che non conosci e’ un invito a procedere in maniera incauta.
- Affidarsi a cose affidabili. Non dipendere da assunzioni o da codice di libreria non documentato. (se possibile)
- Documenta le tue assunzioni.
- Non testare giusto il tuo codice, ma testa anche le tue assunzioni
- Non essere schiavo della storia. Non permettere che il codice esistente detti il codice futuro. Tutto il codice puo’ essere sostituito tramite opportuno refactoring.
Ho scritto questo post perche’ mi sono reso conto che da quando ho iniziato a lavorare mi sta capitando troppo spesso di programmare by coincidence. Nel mio caso, il motivo ovviamente e’ banale. Mi sono ritrovato a lavorare su una grossa applicazione enterprise scritta in Java che utilizza il framework ExtJS come tecnologia client. Queste sono tutte tecnologie con cui non sono familiare e il cui apprendimento richiedera’ molto tempo. Anche se in futuro spero di lavorare in tecnologia .NET.
Quello che sto cercando di fare ora e’ riuscire a portare a termine i miei incarichi nel modo migliore possibile cercando di evitare il piu’ possibile di cadere in questo errore. Prima di modificare qualcosa devo cercare di capire (meglio che posso) come il codice funziona attualmente. Ovviamente nel tempo libero devo cercare di apprendere queste tecnologie nel modo piu’ veloce possibile, ma il tempo non basta mai.
E’ faticoso ed e’ solo l’inizio…
Consigli ?
Ho letto questo articolo: IL MONDO DEGLI HACKER
Pur non facendo parte di nessuna comunita’ del genere, devo ammettere che in molte frasi mi ci ritrovo e scrivo questo post proprio per condividerle con voi.
I computer ed Internet hanno contribuito a fare degli hacker quello che sono oggi, certo, ma l'hacking in sé esiste da sempre. L'hacking è uno stato mentale, un'attitudine psicologica, una forma mentis e insieme un concreto modello di vita.
Gli hacker non commettono (in genere) reati informatici. Un hacker tende a guardare con disprezzo, odio e compatimento la sua nemesi, il cracker.
Un hacker prova l'impulso irresistibile di indagare il funzionamento delle cose, di comprendere i meccanismi interni di un sistema, si tratti di una penna stilografica o di un computer o della regolazione del traffico aereo mondiale. Un hacker non riesce a tollerare l'idea di usare qualcosa di cui non conosce il funzionamento.
Un hacker è un gran ficcanaso. E' ossessivo, pedante, esasperante per chi gli sta intorno.
Un hacker è curioso, come un bambino che non ha mai smesso di chiedersi e di chiedere agli altri "Perché?". E come un bambino agisce sempre ingenuamente, anche quando il risultato del suo operato è di indescrivibile complessità. Un hacker trae piacere e meraviglia dal funzionamento del proprio cervello, e non perde occasione per metterlo alla prova con problemi di estrema complessità.
Pur essendo portato alla solitudine, un hacker sa essere una compagnia estremamente stimolante: a patto, però, che si trovi tra altri hacker. Nel campo delle normali relazioni sociali, invece, la maggior parte degli hacker è un disastro
Ogni hacker ha una punta di genialità. Tutti, però, tengono con la matematica, le scienze, e soprattutto la programmazione un atteggiamento che si riserva di solito all'arte, attribuendo a queste discipline una forte valenza estetica ed emotiva.
Consapevoli di essere troppo spesso distaccati dalla realtà.
Un hacker è un gran ficcanaso. E' ossessivo, pedante, esasperante per chi gli sta intorno.
L'etica in cui si riconosce la maggior parte degli hacker prevede la condivisione delle creazioni (in genere codice per computer) e dell'esperienza, nella convinzione che l'informatica possa progredire molto più velocemente in questo modo. L'apertura mentale tipica degli hacker, quindi, impedisce di escludere a priori dalla comunità chi non si riconosce nelle dichiarazioni del GNU.
Le questioni della Proprietà Intellettuale e dell'open-source sono estremamente complesse, e ciascuno - anche tra gli hacker - tende ad avere un proprio punto di vista, mai del tutto coincidente con quello altrui.
Gli hacker non considerano la politica una cosa di cui valga la pena occuparsi, sono tanto ossessivamente gelosi della propria libertà di pensiero che l'adesione a una qualsiasi fazione politica apparirebbe loro troppo limitante.
Esiste un vero e proprio pantheon di figure a metà tra la leggenda e la realtà (la maggior parte delle quali tuttora in vita), cui ogni hacker guarda con rispetto e ammirazione.
Ci sono pero’ anche aspetti che non condivido e in cui non mi riconosco:
Gli hacker posseggono dosi massicce di senso dell'umorismo, e nessuno di loro è privo di ironia ed auto ironia.
L'indipendenza intellettuale è anche alla base del supremo disprezzo che ogni hacker prova per tutorial, percorsi guidati e ogni genere di assistenza fornito dai programmi moderni. Un hacker fa le cose nella maniera più dura quando si tratta di software, e per nulla al mondo rinuncia al controllo assoluto di quello che succede all'interno suo computer; anche se questo comporta grandi e piccoli disagi. Questa intransigenza incomprensibile dai non-hacker raggiunge spesso eccessi maniacali, tanto forti sono i risvolti emotivi nella relazione tra un computer-geek e il software che utilizza.
Talvolta disgustato dall'invasione della massa affluita in rete grazie a tecnologie sempre più immediate e user-friendly.
Richard Stallman ne è il principale autore: chi scrive ritiene che, quando la programmazione sarà una disciplina con una storia secolare alle spalle (come la Fisica, ad esempio), R. Stallman sarà ritenuto dai posteri alla stregua di Newton o - considerandone l'importanza ideologica - Galileo.
In un certo senso, dal punto di vista dello stato mentale, posso ritenermi un hacker. Ad ogni modo non ritengo corretto il distaccamento dalla realta’ e credo sia estremamente importante rendersi conto che l’informatica e’ un modo per migliorare l’umanita’ quindi ben vengano tool che aumentano la produttivita’ e processi che standardizzano e automatizzano lo sviluppo del software. Non credo si arrivera’ alla fine pessimista descritta nel libro “Snow Crash” in un futuro dove i programmatori sono ridotti a operai in una catena di montaggio del software che non richiede più intuito e abilità, dove non c'è più spazio per l'originalità. In tal caso credo proprio che smetterei di fare lo sviluppatore e mi dedicherei ad altre cose piu’ stimolanti, ma credo che anche se questo e’ il nostro destino, aime’, non saro’ piu’ in vita :)
Sono sicuro che puo’ nascere un interessante dibattito a partire da questo mio post.
Ciao a tutti,
a meta’ Ottobre 2009 mi sono laureato con il massimo dei voti all’Universita’ di Pisa e a meta’ Febbraio, dopo 4 mesi, ho iniziato una nuova vita e il mio primo lavoro a Cambridge. Ma andiamo con ordine…con questo post vorrei condividere con voi tutte le cose che sono avvenute in questo periodo e che mi hanno permesso di crescere tantissimo sotto ogni punto di vista.
Nel mese di Novembre e Dicembre per 6 Settimane ho frequentato un corso di inglese intensivo presso Regent School a Londra. E’ stata una esperienza bellissima che mi ha permesso di conoscere persone da ogni parte del mondo oltre a migliorare abbastanza il mio inglese e a portarlo ad un livello sufficiente per iniziare una vita all’estero. Ho provato a fare l’esame di Cambridge FCE ma purtroppo non sono riuscito a passarlo, lo riprovero’ in futuro. Per chi non lo sapesse a scuola sono sempre stato il primo della classe, ma l’inglese e’ sempre stato un grosso problema per me. Un motivo in piu’ per cui volevo assolutamente riuscire a vincere questa sfida con me stesso. Anche vivere in famiglia e’ stata una esperienza senz’altro positiva grazie alle belle chiaccherate, durante la cena, dopo pesanti giornate di 6/7 ore di studio dell’inglese.
Quando si raccontano le cose, dopo averle vissute, purtroppo si trascurano i dettagli, quelle piccole prime volte che pero’ fanno provare intense emozioni… come ad esempio arrivare in aereoporto la prima volta, parlare con la taxista durante il viaggio e gasarsi perche’ si riesce a conversare, fare il biglietto della metropolitana, parlare con uno sconosciuto alla fermata dell’autobus, gestire le faccende burocratiche per la scuola e l’alloggio in famiglia, acquistare la SIM inglese, fare il 999 e parlare al telefono con la polizia (si ho fatto anche questo), bersi un double beilis con il professore di inglese che e’ diventato un amico con cui chiaccherare, mangiare al ristorante e uscire con gli amici studenti, semplicemente girare per Londra e ammirare il tamigi la sera, andare al cinema,… in un paese straniero e’ come se dovessi rivivere da zero, e’ come rinascere… ogni cosa che fai e’ la prima volta e ho provato spesso la sensazione del bambino spaesato che cresce :) in effetti devo molto ai miei genitori che mi hanno sostenuto (soprattutto economicamente) nella mia avventura, da tanto desideravo diventare indipendente ed essere in grado di gestire autonomamente la mia vita… ora finalmente posso dire di esserlo (anche se devo ancora ricevere il mio primo stipendio, ma questo e’ un dettaglio). Debbo dire che provo una piacevole sensazione di liberta’ e di soddisfazione che in questo momento mi rende davvero felice.
Dopo il corso di inglese, ho passato delle piacevolissime vacanze natalizie in Italia con i miei genitori, la mia ragazza Michela (italiana) e i miei amici. Prima di rientrare in Italia pero’ mi sono dovuto mettere alla ricerca di un appartamento temporaneo dove vivere durante la ricerca del lavoro. Dopo qualche giro a Londra a visitare qualche appartamento alla fine l’ho trovato in Leytonstone e ho iniziato a vivere li a partire dall’8 Gennaio 2010. Un appartamento in condivisione con 5 persone. Sono sempre stato un bamboccione (coccolato e servito da mamma) quindi devo rimboccarmi le maniche anche con le faccende domestiche: cucinare, lavare, stirare (odio profondamente farlo), pulire ecc ecc.
Una volta che mi sono sistemato nel nuovo appartamento, a parte qualche altra lezioncina di inglese, ho iniziato a cercare attivamente lavoro. Ho fatto una ricerca molto attenta, ho letto libri su come scrivere il CV, prepararsi ai colloqui e ho fatto qualche ripasso tecnico. Devo dire che di offerte ce ne erano parecchie, i recruiter non hanno esitato a contattarmi e a farmi proposte. Ho sostenuto colloqui con due aziende, sono rimasto sorpreso da quanto erano tecnici e alla fine Autonomy Software Ltd mi ha fatto un’ottima proposta di lavoro essendo un neolaureato che ho deciso di accettare. Tuttavia questa multinazionale, qui in Gran Bretagna ha sede a Cambridge quindi mi sono dovuto trasferire. Anche in questo ambito sono state tante le piccole cose che mi hanno fatto crescere: parlare con i recruiter, i colloqui, il vestirsi in giacca e cravatta, le ore a cercare/filtrare le offerte, a personalizzare e scrivere le cover letter, nel frattempo sono anche riuscito ad aprire un conto in banca con HSBC e ad avere la mia carta di debito inglese, ad avviare le operazioni per ottenere il mio National Insurance Number.
Ricordo che Luca Minudel mi disse che l’idea di fare esperienza di lavoro all’estero e’ furba e che saro’ coinvolto in tante cose interessanti e nuove. Mi aveva detto anche che se sarei riuscito nella mia impresa di non scordarmi di condividere su UgiDotNet la mia esperienza, raccontare com'è, aiutare questa Italia a essere meno chiusa. Sono ben contento di farlo perche’ sono molto grato a questa community, ai rapporti umani che mi ha permesso di creare con persone che hanno la mia stessa grande passione. E sono sicuro che se sono riuscito ad arrivare dove sono e’ anche merito di tutti voi, di tutta questa passione che respiro ogni volta che leggo i vostri post. Pero’ a volte provo anche invidia, ma e’ quella positiva, quella di ammirazione, quella che ti spinge a crescere. Grazie a tutti ! Un grazie particolare anche ad Alessio Marziali che avendo gia’ vissuto certe esperienze si e’ offerto di fornirmi utili consigli e ovviamente grazie ai miei amici (Matteo, Marco e Mario) della community DotNetToscana che non hanno mai smesso di incitarmi e caricarmi in questa impresa.
Il mio primo giorno di lavoro e’ stato il 15 Febbraio. Nei giorni immediatamente precedenti la mia ragazza e’ venuta 5 giorni a Londra a trovarmi e per la prima volta dopo tre mesi sono riuscito a trovare il tempo di visitarla un po. Siamo andati al museo delle cere, tower hill, buckingham palace, camden town, Big Ban, Harrods, giro in battello sul Tamigi e London Eye di notte il giorno di San Valentino. Che si puo’ volere di piu’ dalla vita :) Ringrazio ovviamente anche a lei che ha seguito nei minimi dettagli tutta questa mia avventura e mi ha sempre supportato, nonostante la sua evidente sofferenza di non essere fisicamente vicina a me.
La mia prima settimana di lavoro e’ stata davvero intensa. Ho alloggiato in una casa offerta dall’azienda e nel poco tempo libero oltre il lavoro mi sono dovuto barcamentare di nuovo nella ricerca di una casa/appartamento a Cambridge. Sabato scorso, 20 Febbraio, ho finalmente trovato una bella sistemazione in una casa con tre persone, stanza molto spaziosa con bagno interno, Internet, sala con divani e televisore, cucina, insomma tutto il necessario. Anzi ancora meglio perche’ solamente 10 minuti a piedi dal Business Park dove lavoro, cosa che aumentera’ notevolmente la qualita’ della mia vita. Fermata dell’autobus quasi sotto casa che mi porta in centro in 15 minuti. Mi resta da comprare una bici e sono a posto! Quel giorno stesso sono tornato a Londra a prendere quasi tutta la mia roba (dovro’ fare un altro viaggio alla fine di questa settimana per completare il trasloco) e da ieri mi sono definitivamente spostato qui.
Ho ancora un po’ di cose da fare per completare il mio “trasloco di nazione”, tra cui ottenere il NIN, cambiare il medico di famiglia e iscrivermi all’associazione italiani residenti all’estero (AIRE).
Sicuramente mi sono dimenticato di racconare qualcosa, ma non ho dubbio nel dire che sono stati sicuramente i mesi piu’ intensi ed eccitanti della mia vita fino ad ora. Sono riusciuto a tagliare un traguardo difficile, a superare una sfida che volevo vincere. Sono contento di essere qui, sono sicuro che avro’ l’opportunita’ di crescere molto e sicuramente anche di riflettere molto. Non so cosa riservera’ il mio futuro, la mia ragazza spesso me lo chiede, ma purtroppo la vita non si puo’ prevedere. Non posso dire se tornero’ in Italia, non posso dire se mi sentiro’ solo, non posso dire se decidero’ di vivere qui per tanto tempo se non per sempre. Non posso dire niente, posso solo vivere. Quello che voglio ora e’ solamente una cosa: crescere professionalmente e imparare al massimo la lingua inglese. Ovviamente spero anche di divertirmi e farmi qualche nuovo amico.
E adesso?
Niente, direi di cominciare a vivere la mia nuova vita…
Questa mattina e’ arrivato il mio Amazon Kindle DX !!!! E’ veramente uno spettacolo !!!!
Ecco i principali vantaggi che cambieranno in meglio il mio modo di leggere:
- Primo fra tutti lo schermo E-INK che e’ veramente come leggere su carta ! I miei occhi ringrazieranno.
- Possibilita’ di viaggiare ovunque e portarmi con me la mia raccolta sterminata di libri, compresi quelli tecnici che potro’ consultare durante il lavoro
- Schermo 9 pollici per fruire i contenuti al meglio (lo adoro)
- Supporto nativo ai PDF. Ogni articolo sufficientemente lungo da ora in poi lo trasformero’ in PDF e me lo leggero’ sul Kindle. E gli occhi ringraziano di nuovo.
- Anche il giornale (purtroppo di Italiani c’e’ solo “La Stampa”) arrivera’ ogni mattina con i contenuti aggiornati sul Kindle :)
Altri aspetti molto utili sono:
- Possibilita’ in maniera molto semplice di sottolineare pezzi di testo
- Possibilita’ di mettere segnalibri e aggiungere note testuali in qualsiasi punto (non possibile ovviamente per i PDF)
- Dizionario di inglese in tempo reale. Basta spostarsi sulla parola con il cursore e appare in basso la definizione. Lo trovo utilissimo !!!
- Dimensione del font variabiale.
- Possibilita’ di acquistare libri ovunque grazie al Wireless
- Supporto MP3 per ascoltare musica durante la lettura
- Dicono durata della batteria notevole… vi sapro’ ridire
E’ tutto il pomeriggio che sto usando questo dispositivo e la prima impressione e’ stata davvero grande. Avevo grandi aspettative e sono state tutte mantenute. Un gioiello abbastanza costoso, ma ne vale la pena soprattutto per uno come me che adora leggere piu’ di ogni altra cosa.
Oggi in metropolitana a Londra dovevate vedere come la gente mi guardava, sussurrava: “ma quello e’ il Kindle di Amazon, waoo” e sbirciava. Considerate che Amazon ha iniziato le spedizioni dall’america solamente due giorni fa, il 19 Gennaio, quindi un certo stupore e’ normalissimo !!! Avrei fatto esattamente come loro oggi.
Sono certo che questo aggeggio sara’ uno dei miei migliori investimenti !
Oggi mi sono imbattuto in questa metrica. La Cyclomatic Complexity è una metrica non orientata agli oggetti, introdotta da Thomas McCabe, che misura la complessità strutturale di un metodo o un insieme di metodi.
Una possibile (banale) definizione è la seguente:
Cyclomatic Complexity (CC) = numero di punti di decisione (if, else, while, …) + 1
Il plugin per .NET Reflector chiamato CodeMetrics permette di calcolare questa metrica sia a livello di metodo che a livello di classe (tutti i metodi della classe).
Alcuni valori di complessità, giusto per curiosità:
- CC della classe Uri = 1807
- CC della classe DataTable = 1316
- CC della classe DataSet = 618
- …
Un valore troppo alto comporta una difficoltà nel testare una classe. Penso che sia proprio da un presupposto di questo tipo che da diverso tempo è nata la Campagna Anti IF per promuovere un utilizzo puro della OOP con lo scopo di realizzare applicazioni flessibili, modificabili e testabili.
Tra il dire e il fare c’è di mezzo il mare !
Per maggiori approfondimenti:
http://en.wikipedia.org/wiki/Cyclomatic_complexity
http://www.antiifcampaign.com/
Ora che ho terminato un bellissimo ma faticoso corso di inglese a Londra sto iniziando a cercare attivamente un lavoro nella capitale e nei dintorni. Molte aziende, per l’ammissione ai colloqui, chiedono la realizzazione di alcune applicazioni di test in modo da verificare se i candidati possiedono le conoscenze di base a loro necessarie. Considerato che ripassare è per me spesso un’operazione noiosa, e visto che sento la mancanza di scrivere sul mio blog, ho deciso di pubblicare in forma sintetica gli argomenti che sto rinfrescando senza la pretesa di essere esaustivo e senza l’obiettivo di creare guide chiare e lineari. Inizio con qualcosa di sicuramente noioso ma assolutamente necessario in ambito web e cioè i fogli di stile.
Introduzione
Le specifiche ufficiali “CSS livello 2 revisione 1” del W3C sono raggiungibili al seguente indirizzo: http://www.w3.org/TR/CSS2/
Sviluppare applicazioni web nel rispetto degli standard ha i seguenti vantaggi:
- Compatibilità con un ampio numero di browser
- Indipendenza dal dispositivo
- Miglioramento dell’accessibilità dell’applicazione
- Semplificazione dello sviluppo e della manutenzione del codice
- Leggerezza del codice e quindi migliore velocità di navigazione
- Migliore indicizzazione da parte dei motori di ricerca
Un foglio di stile è formato da un insieme di regole. Ogni regola è costituita da un selettore che specifica gli elementi a cui si fa riferimento e da un insieme di coppie proprietà-valori (dichiarazioni) che specificano come gli elementi selezionati devono essere rappresentati graficamente.
Le regole CSS possono essere scritte direttamente nel codice del documento XHTML all’interno del tag <style>
<head>
<style type=”text/css”>
/*<![CDATA[*/
…
/*]]>*/
</style>
</head>
oppure possono essere separate in fogli di stile esterni che possono essere collegati a una pagina attraverso il tag <link>
<head>
<link rel=”stylesheet” href=”stile_esterno.css” type=”text/css” />
…
</head>
Selettori
* è il selettore universale e seleziona ogni tipo di elemento dell’albero del documento.
p h1 h2 sono selettori di tipo e permettono di specificare regole che si applicano solamente ad un particolare tipo di elemento XHTML.
.classe è un selettore di classe che specifica una regola che può essere applicata ad un elemento utilizzando l’attributo class. Tramite l’attributo class è anche possibile applicare più classi contemporaneamente.
#elemento è un identificatore che permette di individuare un unico oggetto del documento con l’attributo id impostato. Non possono esistere due oggetti con lo stesso attributo id.
E’ possibile effettuare combinazioni come h1.classe e div#elemento.
Le pseudoclassi distinguono gli oggetti in base ad alcune loro proprietà intrinseche, quindi non richiedono una marcatura o una notazione particolare per essere specificate:
p:first-child individua il primo paragrafo.
a:link e a:visited si applicano rispettivamente ai collegamenti non visitati e visitati
a:hover, a:focus, a:active rispondono ad azioni compiute dall’utente come posizionamento del puntatore sopra un oggetto, la selezione e l’attivazione di un oggetto.
html:lang(it) differenzia gli elementi in base all’attributo lang.
Gli pseudoelementi selezionano una sottoparte di un elemento:
p:first-line seleziona la prima linea di un blocco, p:first-letter seleziona la prima lettera di un blocco.
Tramite i selettori di discendenza è possibile specificare i rapporti di parentela tra gli elementi:
body > p individua tutti i tag <p> direttamente contenuti nel tag <body> (figli)
body p individua tutti i tag <p> contenuti nel tag <body> indipendente dal grado di discendenza
h1 + p individua il primo tag <p> dopo <h1> (si chiama selettore fratello)
Tutti gli attributi possono essere utilizzati come selettori CSS utilizzando il selettore di attributi:
tag[att] verifica se l’attributo att è stato impostato
tag[att=val] verifica se l’attributo att assume uno specifico valore
tag[att~=val] verifica se l’attributo att assume come valore una serie di parole separate da spazi, una delle quali è esattamente val
tag[att|=val] verifica se l’attributo att assume come valore una lista di parole separata da un trattino, la prima delle quali è esattamente val
Classi e identificatori sono un caso particolare di selettore di attributo.
E’ possibile associare l’insieme delle dichiarazioni di una regola a più selettori contemporaneamente separandoli tramite una virgola come ad esempio h1, #id, p.classe { … }.
Quando due dichiarazioni sono in conflitto si applica la dichiarazione il cui selettore ha maggiore specificità.
Dichiarazioni
Lista delle proprietà per la specifica del font:
font-style: italic;
font-weight: bold;
font-size: 90%;
line-height: 2em;
font-family : arial, helvetica, sans-serif;
text-align: justify;
E’ possibile raggruppare gran parte delle proprietà nella proprietà font.
font: italic bold 2em/1.5em arial, helvetica, sans-serif;
Per inserire immagini di sfondo e colore di sfondo:
background-color: #FFCC99;
background-image : url (../immagini/sfondo.jpg);
background-repeat: no-repeat;
background-position: 20% 25%;
E’ possibile raggruppare gran parte delle proprietà nella proprietà background.
Il Box Model
Il Box Model è uno degli aspetti più importanti dei CSS poichè determina l’aspetto degli elementi a livello di blocco (<p>, <div>, <h1>…<h6>, <blockquote>).
Ogni box è caratterizzato da:
- larghezza e altezza dei contenuti (proprietà width e height)
- spazio tra contenuti e bordi (proprietà padding)
- bordo (proprietà border)
- spazio tra il bordo e gli altri oggetti della pagina (proprietà margin)
E’ possibile specificare le dimensioni minime e massime utilizzando le proprietà min-width, min-height e max-width, max-height.
La proprietà overflow (valori visible, hidden, scroll e auto) specifica cosa fare quando un elemento all’interno di un blocco supera in larghezza la dimenzione impostata per il box stesso.
La proprietà display (valori block, inline, list-item e none) permette di modificare il tipo di elemento.
Il tipo di posizionamento è definito attraverso la proprietà position e può essere static, relative, absolute o fixed. L’offset del posizionamento relativo è assegnato tramite le proprietà top, right, bottom e left che invece, nel caso di posizionamento assoluto, individuano la posizione del blocco. E’ possibile determinare la larghezza (altezza) di un blocco impostando contemporaneamente il valore delle proprietà left e right (top e bottom). Il posizionamento fisso è simile al posizionamento assoluto solamente che il riferimento per il posizionamento è sempre la finestra del browser e quando la pagina scorre, i blocchi rimangono ancorati alla posizione iniziale.
L’ordine di sovrapposizione dei blocchi può essere modificato utilizzando la proprietà z-index.
I blochi flottanti permettono la disposizione dei contenuti di blocchi successivi rispettivamente attorno al loro bordo destro o sinistro. Si utilizza la proprietà float con i possibili valori none, left, right. Un elemento flottante diventa implicitamente un elemento di blocco e viene estratto dal normale flusso della pagina. I margini di un box flottante non collassano. Per interrompere l’effetto del box flottante si può utilizzare la proprietà clear. Quando due blocchi flottanti sono disposti uno di seguito all’altro, si dispongono uno di fianco all’altro sulla stessa linea finchè c’è spazio disponibile.
Con la proprietà visibility (valori visible, hidden e collapse) è possibile regolare lo stato di visibilità di un elemento.
Il problema dei browser
La prima volta che ho studiato i CSS (più di 6 anni fa), in poche ore ho letto un manuale e ho compreso il significato dei vari attributi. Tutto contento inizio a fare alcune prove e mi accorgo di essere letteralmente imbranato e incapace di creare anche una delle più semplici interfacce. Mi chiesi: ma come è possibile ? La risposta era semplice: purtroppo ogni browser intepretava differentemente lo standard W3C e c’erano differenze notevoli di comportamento tra uno e l’altro. Tutto questo ha per molti anni limitato le potenzialità offerte dai CSS che dovevano per forza rimanere inespresse per mantenere la compatibilità tra browser differenti. Il peggiore di tutti, è doveroso dirlo è il browser Internet Explorer 6, che ha reso frustrante la vita di molti sviluppatori web !
Per fortuna oggi le cose sono notevolmente migliorate. Tutti i browser sostanzialmente offrono il supporto alla versione CSS 2.1 aprendo ai designer web nuove possibilità. Con la versione 8 di Internet Explorer finalmente anche Microsoft si è allineata agli standard. Quest’ultima versione supporta in modo completo tutta la versione 2.1 dello standard CSS e alcune caratteristiche presenti nella futura versione 3.
Voglio segnalare un link interessante e utile in cui è possibile verificare la compatibilità di un attributo CSS attraverso le varie versioni di Internet Explorer (che è il browser più diffuso): CSS Compatibiliy and Internet Explorer.
More Posts
Next page »