tag:blogger.com,1999:blog-6810012526997294192024-02-19T08:53:16.679+01:00Azzan blog: note di sviluppo softwareBlog di informatica generale (by Azzan Rudy)Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-681001252699729419.post-38992323618466744992017-01-01T16:00:00.000+01:002017-01-01T16:00:11.516+01:004 considerazioni informatiche per questo nuovo anno<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK7EECNjUMv9QRABND5D7_jRCOiAxvUrzgolHqo0kbXnyYI7dzvcTzbHtezVMiEWDnl4mhNd4tYDeX-8pkKeAt9diXzpt1jabMuw8LjFp8MCgrjSZQoil8ErTeGH36WTYzLyNxN9FJ0QQ/s1600/SfondoAzzanSmal3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK7EECNjUMv9QRABND5D7_jRCOiAxvUrzgolHqo0kbXnyYI7dzvcTzbHtezVMiEWDnl4mhNd4tYDeX-8pkKeAt9diXzpt1jabMuw8LjFp8MCgrjSZQoil8ErTeGH36WTYzLyNxN9FJ0QQ/s640/SfondoAzzanSmal3.jpg" width="640" /></a></div>
<br />
Ecco 4 cose scritte da me in base alla mia esperienza, da tenere in considerazione per questo nuovo anno.<br />
<br />
<h3>
1 - REALTA' VIRTUALE</h3>
Un grande boooh per quest'anno.
Non la trovo ancora pronta come tecnologia. C'é tanto fermento e gente che si butta a capofitto senza prima capire bene il contesto.
Ve lo riassumo io come regalo per questo nuovo anno: la realtà virtuale per ora, può funzionare, solo se rispecchia quella reale. Ci vuole un passaggio graduale dalla realtà alla fantasia e il nostro cervello va prima istruito. Non esagerate. Piano e bene.
<br />
<br />
<h3>
2 - BIG DATA</h3>
Sono qualcosa di impressionante le aziende che considerano questo fattore saranno le piú forti e competitive.
L'azienda che quest'anno non raccoglie i dati che semina, è finita.
Incrociare dati è un immenso potere. Fatelo! Rendetevene conto e fatelo! E se non lo fate non lamentatevi fra qualche anno, perché la possibilità la avete avuta.<br />
<br />
<h3>
3 - RETI NEURALI</h3>
Ah beh di questo ce n'è da parlare a bizzeffe. Basta vedere il mio ultimo post. Se arrivo a fare diventare intelligenti 3 poligoni (<a href="http://www.linkedin.com/hp/update/6218703731308007424" target="_blank">qui il mio post a riguardo</a>), vi rendete conto di cosa si può fare e di cosa verrà fatto quest'anno?
Piccoli assaggi ce li da già Google. Se tenete aggiornate le vostre app Google Android alle ultime versioni, quando le usate, vi accorgerete che l'app sa cosa tu vuoi da lei è ti aiuta a farlo.<br />
<br />
<h3>
4 - GUIDA AUTONOMA</h3>
Niente di concreto ma questo sarà l'anno dei test, il prossimo quello dei collaudi. Ormai ci siamo, la tecnologia c'è, bisogna solo adattarla e provarla.Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-45409588008400782622016-10-08T13:30:00.001+02:002016-10-08T13:31:51.453+02:00Win 10 update<p dir="ltr">Ultimamente questo OS ha veramente troppi update i quali non finiscono più.<br>
Se siete in un angoscioso momento di window update (Es.: andare a prendere il figlio a scuola) e lui non ha finito, vi tocca sopprimerlo.<br>
Al successivo login, probabilmente l'update non funzionerà più.<br>
Allora non perdete la calma ma dalla <u>s</u>hell digitate:</p>
<p dir="ltr"><b>net stop wuauserv</b><br>
<b>rmdir %windir%\</b><b>softwaredistribution</b><b>  /s /q</b><br>
<b>net start </b><b>wuauserv</b><br>
<b>exit</b></p>
<p dir="ltr">E tornare ad eseguire l'update</p>
Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-76659804217249792132016-03-09T17:31:00.002+01:002016-03-09T17:35:20.967+01:00Esecuzione differita QT con lambda C++ 11Questo è un esempio in Qt, di come creare un azione che viene eseguita dopo tot secondi, senza interrompere il thread di esecuzione del codice.
Al "singleShot" passo un lambda di C++ 11, per eseguire un metodo allo scadere del tempo.
<br />
<pre class="brush: cpp;">//Es.: Codice nello scope di una funzione
...
//Simulazione ritardo hardware
QTimer::singleShot(2000, this, [=]() {
eseguiDopo();
});
...
//Qui arrivo subito, mentre dopo 2 secondi viene eseguito "eseguiDopo()"
...
</pre>Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-66227926142809119952015-10-06T18:53:00.001+02:002015-10-06T18:53:11.530+02:00UML - Le proprietà delle relazioniOggi scrivo qualche appunto relativo alle proprietà delle relazioni UML<br />
<br />
Ogni relazione fra elementi UML, può avere le seguenti proprietà:<br />
<br />
<b>Cardinalità (o molteplicità)</b><br />
Rappresenta il numero di oggetti minimo e massimo, che è possibile associare ad una classe.<br />
La relazione può essere di tre tipi: uno a uno, uno a molti, o molti a molti. In un diagramma UML è indicata da un numero (1, 1..6, *) vicino alla fine del un segmento di congiunzione ad un elemento.<br />
<br />
I possibili valori di molteplicità sono:<br />
<ul>
<li>molti (*)</li>
<li>uno (1)</li>
<li>zero o più (0..*)</li>
<li>uno o più (1..*)</li>
<li>zero o uno (0..1)</li>
<li>all'interno di un range (2..4)</li>
</ul>
Guadando le cardinalità dell'esempio del post sulle <a href="http://bit.ly/relCompAss" target="_blank">relazioni UML</a> (e ricordando che la regola è valida, per il momento temporale in cui viene descritta), abbiamo le seguenti cardinalità:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj60g66iLm5JWmg72W3uqiIUAj_sH7qeP10zMSMWGVz_BPAeeih3L5DahQTxSl6qIsNIHn_AAL8pRBijubz8hQo3Ph0COXTkxkIPgelJm-R2B__PpJTL4YOeY5xidHrZBcf270ocBUFLV4/s1600/ThreeTypesOfRelations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj60g66iLm5JWmg72W3uqiIUAj_sH7qeP10zMSMWGVz_BPAeeih3L5DahQTxSl6qIsNIHn_AAL8pRBijubz8hQo3Ph0COXTkxkIPgelJm-R2B__PpJTL4YOeY5xidHrZBcf270ocBUFLV4/s320/ThreeTypesOfRelations.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Un datore di lavoro può avere da un minimo di zero ad uno o più dipendenti (quando un datore di lavoro viene creato, non deve avere necessariamente un dipendente). La molteplicità persona, datore di lavoro invece non è segnata quindi la relazione viene detta indefinita. Una persona ha una sola posizione (e deve necessariamente averne una per il momento ed il contesto in cui si trova) e una entità posizione è ricoperta da una sola persona. Una posizione è creata ed è assegnata da un datore di lavoro e senza di lui non esisterebbe.<br />
<br />
<b>Navigabilità</b><br />
Può essere unidirezionale (un oggetto fa riferimento ad un altro, ma non il contrario), oppure bidirezionale (un oggetto fa riferimento ad un altro e viceversa).<br />
<br />
Quando una classe può "navigare" o aggiornare l'associazione vuol dire che ha responsabilità sulla stessa.<br />
<br />
Una relazione unidirezionale, può avere anche una freccia invece del rombo, sul segmento di collegamento fra gli elementi.<br />
Ecco un esempio di relazione di contenimento, unidirezionale:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcLRHGwI4hiX8tVyxtUkQP0NDrgwVz2U2TbyqrrxwpWMO8NhP65ZOEKThNbcFtw8RexZrhvXK5ZthDY2mve8SctsODXYeYVsYzf9-MzFxMTW-Q2uqcDK6pdngFFD4bkiyKxWMmQYQuDZw/s1600/Cont-unidir.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcLRHGwI4hiX8tVyxtUkQP0NDrgwVz2U2TbyqrrxwpWMO8NhP65ZOEKThNbcFtw8RexZrhvXK5ZthDY2mve8SctsODXYeYVsYzf9-MzFxMTW-Q2uqcDK6pdngFFD4bkiyKxWMmQYQuDZw/s320/Cont-unidir.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
In questo diagramma, un <i>Libro</i> è un contenitore di (puntatori a) pagine, ma anche le pagine hanno le loro relazioni di navigazione. Un lettore, (oppure un browser), che visualizzano una pagina alla volta, beneficia dei collegamenti alle pagine vicine e al sommario. Ogniuno di questi collegamenti è unidirezionale, e nella figura sopra ne possiamo vedere di tre tipi diversi.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Per la lista di pagine <i>m_pagine</i> non vi è nessuna relazione inversa raffigurata, quindi questa poterebbe rappresentare una relazione di contenimento unidirezionale, ma anche bidirezionale.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Se c'è bisogno che <i>Pagina</i> possa muoversi nell'oggetto <i>Libro</i> che la contiene, la direzionalità sul diagramma, dovrebbe essere mostrata, etichettando l'alta estremità del rapporto e/o aggiungendo un attributo <i>m_libro</i> alla classe <i>Pagina.</i></div>
<br />
Per adesso è tutto, se ci sono domande o altro scrivetemi pure un feedback.<br />
<br />
Grazie a tutti.Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-38856674814817347672015-09-19T15:18:00.002+02:002015-09-20T15:28:09.238+02:00UML - Relazioni: composizione, aggregazione, associazioneStudiando UML, non potevo fare a meno di pubblicare qualcosa riguardo le basi.<br />
Per questo motivo, parlerò delle relazioni, che sono il passo fondamentale da compiere ed apprendere per riuscire a convertire in codice, un pensiero astratto.<br />
Quando abbiamo relazioni fra oggetti 1:1 (uno a uno) o 1: * (uno a molti), possiamo usare vari tipi di connessioni per descriverle.<br />
Il seguente diagramma esprime una relazione uno a molti fra le entità coinvolte:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwga-RWVgvzJR-V8nc4KNhBBbibaucoQjapzfniy7Ae5mK-dMszv5rPp2niMY1_qHuJGRXo46UuT2OtZLwr9d-EasnS5XJNV-2QNoS3qsdjUr9jWMZlapRhudxbsPFnNChFgPjrqItpqw/s1600/Persona-Occupazione.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwga-RWVgvzJR-V8nc4KNhBBbibaucoQjapzfniy7Ae5mK-dMszv5rPp2niMY1_qHuJGRXo46UuT2OtZLwr9d-EasnS5XJNV-2QNoS3qsdjUr9jWMZlapRhudxbsPFnNChFgPjrqItpqw/s320/Persona-Occupazione.png" /></a></div>
<br />
Nel contesto descritto dal diagramma si può desumere che ci possono essere più persone che lavorano per uno stesso datore di lavoro. Lo si vede dalla molteplicità specificata alla fine della relazione: 1 verso il datore di lavoro, * molti verso la persona. * significa 0 o molti (come nel caso di un esperssione regolare).<br />
<br />
Dal punto di vista del datore di lavoro la figura seguente ci mostra 3 tipi di relazione:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0kutCG_eKMkyCS_37KnwiJ3uUEF9vNx77MMNVtUPI-VufYKXNgj_joRRS5zqjmAmB1e30p-L_r6KzD1gngX9KxNo5xmh0MnkKHLMplHl2P1oTEf2usQocbgI-HvKv3bkesFQMx899PHQ/s1600/ThreeTypesOfRelations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0kutCG_eKMkyCS_37KnwiJ3uUEF9vNx77MMNVtUPI-VufYKXNgj_joRRS5zqjmAmB1e30p-L_r6KzD1gngX9KxNo5xmh0MnkKHLMplHl2P1oTEf2usQocbgI-HvKv3bkesFQMx899PHQ/s320/ThreeTypesOfRelations.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol><ol>
<li>Relazione di <b>composizione </b>(il rombo pieno) fra <i>DatoreDiLavoro</i> e <i>Posizione</i>. Questo indica che il datore di lavoro che è colui che ha in controllo delle <i>posizioni</i> e senza di lui, tali <i>posizioni</i> non esistono.</li>
<li>Relazione di <b>aggregazione</b> (il rombo vuoto) fra <i>DatoreDiLavoro </i>e il suo personale. Il <i>DatoreDiLavoro </i>controlla un gruppo di <i>Persone</i> durante l'orario di lavoro, ma dopo esse vivono anche senza di lui, hanno una vita propria ed indipendente.</li>
<li>La <i>persona</i> e la <i>posizione</i> ricoperta da essa hanno un <b>associazione</b> bi-direzionale. Questa associazione, nonspecifica niente al riguardo di come è stata implementata e da chi è controllata.<br />E'possibile anche, che al momento attuale non esista una <i>persona</i> che lavora per un certo <i>datore di lavoro. </i>Questa relazione può essere verificata, chiamando un metodo (in sintassi C++) Posizione::dammiDatoreDiLavoro(); , che ritornaerà NULL.<br />Anche se il diagramma indica una relazione 1:1 tra la persona e posizione, è possibile che una <i>persona</i> possa contenere più <i>posizioni</i>, oppure un <i>datore di lavoro</i> possa assumere molte <i>persone</i> con la stessa <i>posizione</i>.<br />Per descrivere un sistema in grado di gestire tali casi, la cardinalità, parleremo di relazione molti-a-molti.</li>
</ol>
</ol>
<div>
<br /></div>
Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-46067301461757498722015-06-08T01:15:00.000+02:002016-03-23T14:03:40.087+01:00Linux Microsoft Code NodeJs e Google Starterkit - Introduzione <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig7_nu2nv5H3xyyNk3tqJO_hHbGcaiP6kYjc0I3eixbtUBlsHFbMeSXNUR87dHzOsHVv-JZ0k1SVF8sxgPcaD062RPr758dLH9Kln_CG75N0FEF-iTeX6CGYRhORKmPnqDeRqWysQIcRs/s1600/MacWinLinux2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig7_nu2nv5H3xyyNk3tqJO_hHbGcaiP6kYjc0I3eixbtUBlsHFbMeSXNUR87dHzOsHVv-JZ0k1SVF8sxgPcaD062RPr758dLH9Kln_CG75N0FEF-iTeX6CGYRhORKmPnqDeRqWysQIcRs/s640/MacWinLinux2.png" width="640" /></a></div>
<h4>
</h4>
<h4>
<br /></h4>
<h4>
Prefazione</h4>
<div>
<br /></div>
Sentire parlare di starterkit mi ricorda gli inizi della mia carriera lavorativa. quando giocavo con gli asp.net starterkit per creare i miei primi siti web interattivi.<br />
Da qualche giorno c'è stato un restiling della sezione Google developers. Sotto la voce web, troviamo in beta un nuovo starter kit. Ma di cosa si tratta?<br />
<br />
In poche parole, questo starterkit, è un punto di partenza per far vedere come sia possibile visualizzare web application compatibili su tutti i device, dagli smartphone alle tv, garantendo alte performance in termini di leggerezza, responsività e velocità di caricamento. Inoltre è possibile sincronizzare in realtime layout e dati su diversi device e tenere traccia delle metrice di performance, mobile e desktop.<br />
<br />
<h4>
</h4>
<h4>
Iniziamo</h4>
<div>
<br /></div>
Lo starterkit è basato sui seguenti componenti:<br />
<br />
<b>NodeJs</b>: Possiamo definirlo un framework che permette l'utilizzo server-side di Javascript.<br />
<b>Npm</b>: E' per Node cio che NuGet è per .Net, e cioè un package manager, che permette di produrre e consumare pacchetti di software (addin, frameworks, ecc..)<br />
<b>Sass</b>: Syntactically Awesome Style Sheets, un preprocessore CSS serve a definire fogli di stile con una forma più semplice, completa e potente rispetto ai CSS e a generare file CSS ottimizzati, aggregando le strutture definite anche in modo complesso.<br />
<br />
Controlliamo che node sia installato correttamente, da terminal digitate:<br />
<pre class="brush: bash;">node -v
</pre>
Se non siete all’ultima versione potete aggiornare il tutto tramite Npm con i seguenti comandi:
<br />
<pre class="brush: bash;">sudo npm cache clean -f
sudo npm install -g n
sudo n stable
</pre>
<h4>
Setup del Google starterkit</h4>
<div>
<br /></div>
Per prima cosa scaricare lo starterkit da qui: <a href="http://bit.ly/1KUB85H" rel="nofollow" target="_blank">download</a><br />
Decomprimete i file in una nuova cartella ed aggiungervi il componente Glup tramite Npm:<br />
<pre class="brush: bash;">cd my-project
npm install #(mi raccomando è un processo lungo, abbiate pazienza...)
npm install gulp -g</pre>
Ora per fare una prova lanciamo il server locale tramite il comando<br />
<pre class="brush: bash;">gulp serve #(si apre il browser Chrome, premte Ctrl-R per attivare reload automatico)</pre>
<h4>
Installare Code</h4>
<br />
A questo punto abbiamo bisogno di un editor. Google ci consiglia Sublime, ma io ho optato per Microsoft Code perchè mi piace l'idea di vedere girare sotto Linux cose Microsoft e per imparare ad usarlo.<br />
<br />
Scaricate Code al seguente indirizzo web: <a href="http://bit.ly/1KUA0PD" rel="nofollow" target="_blank">download</a><br />
<br />
Seguite le istruzioni di installazione qui: <a href="http://bit.ly/1bKw0BZ" rel="nofollow" target="_blank">istruzioni setup</a><br />
<br />
Se volete fare l’update, su windows è abilitato di defaut, su MAC lo includeranno ma non sarà automatico, su Linux non è previsto (anche se nel menu lo ho trovato ma non fa niente), quindi dobbiamo verificare ogni tanto e farlo da soli.<br />
<br />
Su Linux mi raccomando di estrarre i file dallo zip, con il comando: unzip VSCode-linux-x64.zip -d /home/rudy/Develop/VSCode<br />
se usate un gestore d’archivi grafico vi può dare errori strani.<br />
<br />
<h4>
</h4>
<h4>
Funzionalità</h4>
<div>
<br /></div>
Per compilare il nostro progetto Code supporta Glup (che possiamo definire un compressore di html, javascript, css ed immagini. Unisce più file assieme e rimuove le parti superflue che non incidono sul normale funzionamento).<br />
<br />
<h4>
</h4>
<h4>
Connessione di device fisici</h4>
<div>
<br /></div>
Per connettere i nostri device (nel mio caso Nexus 5 e Nexus 9) per prima cosa abilitiamo il debug USB (link ad abilitazione) e colleghiamoli al PC tramite USB.<br />
Apriamo il browser al seguente URL: chrome://inspect<br />
Ed abilitiamo il port forwarding.<br />
<br />
Debug dei device in realtime<br />
Ogni device ha il suo modo per eseguire il debug.<br />
<br />
<h2>
Con Android</h2>
<br />
utilizziamo i Chrome DevTools che possiamo impostare al seguente indirizzo: chrome://inspect per impostare il tuo device leggi qui: <a href="http://bit.ly/1KVAZiD" rel="nofollow" target="_blank">debug setup</a><br />
<br />
<h2>
Con Safari for iOS</h2>
<br />
Apri Safari su tuo device iOS.<br />
Connettilo via USB.<br />
Apri Safari sul tuo PC.<br />
Nel menu di Safari’s menu vai su Develop e seleziona il nome del tuo dispositivo.<br />
Seleziona quale tab vuoi debuggare.<br />
<br />
<h2>
Con IE Windows Phone</h2>
<br />
Al momento non esiste un supporto al debug nativo, ma si può emulare il browser mobile sul desktop con IE 11, vedi qui: <a href="http://bit.ly/1KVB3yO" rel="nofollow" target="_blank">win emulator</a><br />
<br />
<h4>
Debug Nexus 5 e Nexus 9 in realtime</h4>
<br />
Per prima cosa collego i 2 device alle porte USB del PC e vado all’indirizzo: chrome://inspect su Google Chrome<br />
<br />
Otteniamo l’indirizzo ip del PC, nel caso Linux tramite riga di comando “ifconfig”, con windows “ipconfig”.<br />
<br />
Sui device apriamo il browser Chrome all’indirizzo ip del PC ottenuto precedentemente e ci colleghiamo alla porta del server Gulp: x.y.z.n:3000 (Es.: 192.168.1.2:3000)<br />
<br />
Dal PC all’indirizzo chrome://inspect, vediamo comparire i device collegati e a quale URL.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgAwAyHRW76AFtPt_rZgHlYUxi-IgE2tlUn-1Y41HB9adGeA7iu96ZKB4gJqVt-JNqKChprmhtyie820usz_nRD5iCH64Yki2Y6SFkKRAGgcr4sKaIOmbxM57ZZQ6FY8bThDMwzIGb8II/s1600/IMG_20150607_145320.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgAwAyHRW76AFtPt_rZgHlYUxi-IgE2tlUn-1Y41HB9adGeA7iu96ZKB4gJqVt-JNqKChprmhtyie820usz_nRD5iCH64Yki2Y6SFkKRAGgcr4sKaIOmbxM57ZZQ6FY8bThDMwzIGb8II/s400/IMG_20150607_145320.jpg" width="400" /></a></div>
<br />
<h4>
Editing con Code in realtime</h4>
<br />
A questo punto da linea di comando raggiungiamo la cartella dello starter kit ed apriamo Code con il comando: “code .”<br />
Clicchiamo sul menu “File” ed abilitiamo il flag “Enable autosave”.<br />
<br />
A questo punto possiamo modificare il codice sorgente del programma e vedere in realtime il cambiamento. Inoltre scrollando e navigando sui vari link, da uno device collegati al PC (o dal PC stesso), tutti gli altri lo seguiranno (questo è possibile tramite la funzionalità “browsersync”).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ttrO0esScyA/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/ttrO0esScyA?feature=player_embedded" width="320"></iframe></div>
<br />Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-21182723244542446582015-06-01T00:42:00.000+02:002015-06-01T00:49:45.625+02:00Mono 4.0 e C# 6.0Mono 4.0 è la prima versione di Mono che contiene codice Microsoft .NET open source. In questa versione sono abilitate per default le nuove funzionalità del C# 6.0.<br />
<br />
<h4>
Queste sono le nuove funzionalità</h4>
<ul>
<li>Auto property initializers</li>
<li>Static members</li>
<li>String interpolation</li>
<li>Expression-bodied methods</li>
<li>Expression-bodied properties</li>
<li>Index initializers</li>
<li>Null-conditional operators</li>
<li>The nameof operator</li>
<li>Exception filters</li>
<li>Await in catch and finally</li>
</ul>
<h4>
E questo un esempio di utilizzo (ho usato MonoDevelop 5.9)
</h4>
<pre class="brush: csharp;">using System;
using Newtonsoft.Json.Linq;
using System.Configuration;
//Con - Static members
using static System.Math;
namespace Azzan.Mono4Sample
{
public class Point
{
/*
//Prima di - Auto property initializers
public int X {get; private set;}
public int Y {get; private set;}
public Point()
{
X = 4;
Y = 9;
}
*/
//Con - Auto property initializers
public int X {get; } = 4;
public int Y {get; } = 9;
public Point(int x, int y) { X = x; Y = y; }
//Prima di Expression-bodied properties
/*
public double Dist
{
//Prima di - Static members
//get { return Math.Sqrt(X * X + Y * Y); }
//Con - Static members
get { return Sqrt(X * X + Y * Y); }
}
*/
//Con - Expression-bodied properties
public double Dist => Sqrt(X * X + Y * Y);
//Prima di - Expression-bodied methods
/*
public override string ToString()
{
//Prima di - String interpolation
//return string.Format("[Point: X={0}, Y={1}, Dist={2}]", X, Y, Dist);
//Con - String interpolation
return $"[Point: X={X}, Y={Y}, Dist={Dist}]";
}
*/
//Con - Expression-bodied methods
public override string ToString() => $"[Point: X={X}, Y={Y}, Dist={Dist}]";
//Prima di - Index initializers
/*
public JObject ToJson()
{
var result = new JObject();
result["x"] = X;
result["y"] = Y;
return result;
}
*/
//Con - Index initializers
public JObject ToJson() => new JObject() { ["x"] = X, ["y"] = Y };
//Prima di - Null-conditional operators
/*
public static Point FromJson(JObject json)
{
if(json != null &&
json["x"] != null &&
json["x"].Type == JTokenType.Integer &&
json["y"] != null &&
json["y"].Type == JTokenType.Integer)
{
return new Point((int)json["x"], (int)json["y"]);
}
return null;
}
*/
//Con - Null-conditional operators
public static Point FromJson(JObject json)
{
if(json?["x"]?.Type == JTokenType.Integer &&
json?["y"]?.Type == JTokenType.Integer)
{
return new Point((int)json["x"], (int)json["y"]);
}
return null;
}
public Point Add(Point point)
{
if(point == null)
{
//Prima di - The nameof operator
//throw new ArgumentNullException("point");
//Con - The nameof operator
throw new ArgumentNullException(nameof(point));
}
return point;
}
public void DoSomething()
{
//Prima di - Exception filters
try
{
} //Con - Exception filters
catch(ConfigurationException ex) //when (ex.IsSevere)
{
//Con - Await in catch and finally
//await LogAsync(ex);
}
finally
{
//Con - Await in catch and finally
//await CloseAsync();
}
}
}
}
</pre>
Qui trovate i sorgenti dell'esempio creati con MonoDevelop 5.9: <a href="http://bit.ly/1GPbYmO">Download esempio</a><br />
<br />
Purtroppo ho notato però che l'editor di MonoDevelop 5.9 ha ancora qualche problema nel riconoscere la sintassi C# 6.0 ma non sono cose gravi.<br />
Invece gli "Exception filters" proprio non funzionano, se de-commentate il codice del mio esempio il compilatore vi da errore.<br />
<br />
<h4>
Che versione di Mono è installata?</h4>
<div>
<br /></div>
Questo è un comando che potete lanciare tramite shell Linux, per vedere i dettagli della versione che avete installato:<br />
<br />
<pre class="brush: shell;">mono --version</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMvy15G52jtY7MVei8UeJAvZj16YaLVxZPZ7qKRv1-4mCXgVZnQPvAHXGuXiL6EZsusUF_Kf_H37DIOJaFulriTayynrBWm5KDH7MIhNVk6xXfpF33jmLA7Y4U4M-MtZwSJSDQQus9NC0/s1600/Screenshot+from+2015-05-31+09%253A49%253A44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMvy15G52jtY7MVei8UeJAvZj16YaLVxZPZ7qKRv1-4mCXgVZnQPvAHXGuXiL6EZsusUF_Kf_H37DIOJaFulriTayynrBWm5KDH7MIhNVk6xXfpF33jmLA7Y4U4M-MtZwSJSDQQus9NC0/s640/Screenshot+from+2015-05-31+09%253A49%253A44.png" width="640" /></a></div>
Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-81902344528949217432014-07-07T13:43:00.000+02:002014-07-07T13:48:48.652+02:00Lista comandi Google Now<div dir="ltr">
Oggi mi è arrivato l'orologio di LG con Android Wear. Per l'occasione e perché ne avrò bisogno ecco la lista dei comandi Google Now che ho trovato qua e la su internet:<br />
<br /></div>
<div dir="ltr">
<b>Inizia nuova telefonata</b></div>
<ul>
<li>chiama [nome persona] [cognome] [tipo: cellulare, lavoro, casa, ecc..]</li>
</ul>
<b>
Invia messaggio di testo</b><br />
<ul>
<li>invia messaggio a [nome persona] [cognome] [tipo: cellulare, lavoro, casa, ecc..] [messaggio] </li>
<li>email a [nome persona] [cognome] [messaggio] </li>
</ul>
<b>
Foto online di qualcosa</b><br />
<ul>
<li>foto [soggetto: luogo, persona, oggetto, ecc..] [quando? Momento temporale o condizione ]<br />Es.: foto di Roma al tramonto</li>
</ul>
<b>
Navigazione web</b><br />
<ul>
<li>apri [indirizzo web]</li>
<li>accedi a [sito web] </li>
</ul>
<b>
Cose nei paraggi</b><br />
<ul>
<li>ristorante, pizzeria, pub, ecc.. vicino a me</li>
</ul>
<b>
Informazioni turistiche</b><br />
<ul>
<li>chiesa, monumento, teatro, ecc.. [nome dell'oggetto della ricerca]</li>
</ul>
<b>
Informazioni generiche</b><br />
<ul>
<li>quando, quanto, quanti, dove, ecc.. [richiesta]<br />Es.: quando sorge il sole</li>
<li>che cos'è [oggetto] </li>
<li>chi ha inventato [oggetto]</li>
<li>quale è il significato di [parola] </li>
<li>chi è [nome di personaggio famoso] </li>
<li>l'autore di [nome libro]</li>
<li>orario a [nome luogo]</li>
<li>che ore sono a [nome luogo]</li>
<li>fuso orario [nazione] </li>
</ul>
<div>
<b>Musica</b></div>
<ul>
<li>ascolta [titolo canzone] </li>
<li>come si intitola questo brano? </li>
<li>... (lui ascolta e ti dice che brano stai sentendo)</li>
</ul>
<b>
Informazioni meteo specifiche</b><br />
<div dir="ltr">
</div>
<ul>
<li>che tempo fa [oggi, domani] [a: nome luogo]</li>
<li>[domanda] [periodo temporale] <br />Es.: pioverà domani? </li>
</ul>
<b>
Informazioni meteo generiche</b><br />
<ul>
<li>meteo [luogo] </li>
</ul>
<b>
Calcoli matematici somma</b><br />
<ul>
<li>numero più numero</li>
</ul>
<b>
Calcoli matematici sottrazione</b><br />
<ul>
<li>numero meno numero</li>
</ul>
<b>
Calcoli matematici divisione</b><br />
<ul>
<li>numero diviso numero</li>
</ul>
<b>
Calcoli matematici moltiplicazione</b><br />
<ul>
<li>numero moltiplicato per numero</li>
<li>numero X numero</li>
</ul>
<b>
Calcoli matematici percentuale</b><br />
<ul>
<li>numero percento di numero</li>
</ul>
<b>
Calcoli matematici modulo</b><br />
<ul>
<li>numero modulo numero</li>
</ul>
<b>
Calcoli matematici radice</b><br />
<ul>
<li>radice quadrata di [numero] </li>
</ul>
<b>
Conversioni di unità</b><br />
<ul>
<li>numero [unità] in [unità]<br />Es.: 3 litri in ettolitri</li>
</ul>
<b>
Sport classifiche</b><br />
<ul>
<li>classifica [serie: A, B, ecc..]</li>
</ul>
<b>
Sport eventi</b><br />
<ul>
<li>quando giocherà [nome squadra]</li>
</ul>
<b>
Sport risultati</b><br />
<ul>
<li>chi ha vinto tra [squadra] e [squadra]</li>
</ul>
<b>
Sport domanda risultato</b><br />
<ul>
<li>[squadra] ha [vinto, perso] </li>
</ul>
<b>
Programmazione di un film</b><br />
<ul>
<li>cinema, film [nome del film] </li>
</ul>
<b>
Film con un certo attore</b><br />
<ul>
<li>film [nome cognome attore] </li>
</ul>
<b>
Serie tv</b><br />
<ul>
<li>serie tv [nome serie, attore] </li>
</ul>
<b>
Appunti</b><br />
<ul>
<li>ricordami di [cosa da ricordare] alle [ora e minuto] di [giorno] (oppure si può specificare: mattina, pomeriggio, sera, notte) </li>
<li>scrivi nota [nota da scrivere]</li>
</ul>
<b>
Sveglia programmata</b><br />
<ul>
<li>sveglia [giorno] alle [ora e minuto]</li>
<li>svegliami tra [numero] minuti</li>
</ul>
<b>
Appuntamento su calendario</b><br />
<ul>
<li>appuntamento [giorno] alle [ora e minuto] [descrizione] </li>
</ul>
<b>
Avvio applicazioni </b><br />
<ul>
<li>avvia, lancia [nome applicazione] </li>
</ul>
<b>
Voli aerei</b><br />
<ul>
<li>volo [partenza] [destinazione] </li>
</ul>
<b>
Pubblicazione social</b><br />
<ul>
<li>pubblica su [google plus, twitter, facebook] [descrizione]</li>
</ul>
<b>
Navigatore</b><br />
<ul>
<li>naviga fino a [nome città] </li>
<li>mappa di [nome città] </li>
<li>foto di [nome città]</li>
<li>vai a [nome città] </li>
<li>quanto è lontano [luogo] </li>
<li>portami a [luogo] </li>
<li>traffico [località, nome autostrada]</li>
</ul>
<br />
<div dir="ltr">
Man mano che scopro nuovi comandi vocali li aggiungerò a questa lista.</div>
Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-72671293013680131682014-07-04T09:15:00.001+02:002014-07-04T09:15:38.733+02:00From C# to Qt: Thread sleepEccomi alla prima parte della rubrica dedicata al confronto fra C# e Qt.
In C# quando vogliamo mettere in pausa il thread corrente in cui ci troviamo per tot millisecondi usiamo la funzione statica: Thread.Sleep([numero di millisecondi]).<br />
In Qt invece ci sono almeno 3 possibilità diverse:
<br />
<pre class="brush: cpp;">
//METODO 1:
//Usare la classe QTest
QTest::qSleep(100); // blocca l' event processing
QTest::qWait(100); // non blocca l' event processing
//METODO 2:
//Usare QWaitCondition / QMutex
QWaitCondition waitCondition;
QMutex mutex;
waitCondition.wait(&mutex, 100);
//METODO 3:
//Oppure fare derivare la nostra classe da QThread.
class Thread : public QThread
{
public:
static void msleep(int ms)
{
QThread::msleep(ms);
}
};
Thread::msleep(100);
</pre>Rudyhttp://www.blogger.com/profile/02535421968734761619noreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-82732821767105900762013-03-27T12:39:00.001+01:002014-07-07T13:55:17.928+02:00The operation cannot be completed. “Puntatore non valido”Se per caso vi dovesse capitare con Visual Studio 2012 di ricevere il messaggio: The operation cannot be completed. “Puntatore non valido”, quando state tentando di visualizzare un file di risorse .resx, per ripristinarlo, vi basta aprire il file incriminato con un editor di testo e rimuovere tutti gli elementi “data”, dell’xml che contengono l’attributo type="System.Resources.ResXNullRef, System.Windows.Forms".<br />
Es. va eliminato:<br />
<pre class="brush: html;"><data name="lblLavoroSuLinea.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-25440306477861462292012-09-05T20:00:00.001+02:002012-09-05T20:04:45.628+02:00Rimuovere elementi da una lista in maniera intelligenteDi solito quando vogliamo fare eseguire un operazione e poi rimuovere degli elementi da una lista, come facciamo?<br />
<br />
Verrebbe naturale di fare un ciclo su ogni elemento della lista, eseguire l’operazione e rimuovere l’elemento:<br />
<br />
<pre class="brush: csharp;">foreach (Command c in itsCommands)
{
c.Execute();
itsCommands.Remove(c);
}</pre><br />
Purtroppo però così facendo otteniamo un eccezione che ci avvisa che la collezione è stata modificata (in effetti abbiamo rimosso un elemento) e quindi l’operazione di ciclo sulla collezione non è più valida.<br />
<br />
Come soluzione al problema si potrebbe crea un altra collezione con gli elementi da rimuovere ed eseguire un altro ciclo per eliminare i comandi eseguiti:<br />
<br />
<pre class="brush: csharp;">Commands itsCommandsForDelete = new Commands();
foreach (Command c in itsCommands)
{
c.Execute();
itsCommandsForDelete.Add(c);
}
foreach (Command c in itsCommandsForDelete)
{
itsCommands.Remove(c);
}</pre><br />
Questa soluzione non è molto performante perchè ci obbliga ad eseguire il ciclo su ogni elemento per due volte.<br />
<br />
Ecco una soluzione alternativa per eseguire il tutto in un solo ciclo:<br />
<br />
<pre class="brush: csharp;">while (itsCommands.Count > 0)
{
Command c = (Command) itsCommands[0];
itsCommands.RemoveAt(0);
c.Execute();
}</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-23427602886299761972012-06-26T17:06:00.000+02:002012-06-26T17:20:24.659+02:00Carta di credito su internetSpesso le informazioni che ci arrivano dai media e soprattutto dai telegiornali, sono storie sentite raccontare da altri, gonfiate e mal capite ed esposte che incutono paura al consumatore. Ad esempio:<br />
<br />
<b>E'sicuro usare la carta di credito su internet?<br /></b><br />
Il giorno prima di Pasqua ho avuto una discussione con amici di mio padre, i quali, non si fidano ad usare la carta di credito su web, perché hanno sentito al tg che non va bene e che si viene spesso e volentieri truffati.<br />
<br />
La mia prima reazione è stata quella di tentare di rassicurarli spiegando che in realtà, esitono anche siti famosi e sicuri, nei quali si hanno vantaggi economici e si trovano prodotti altrimenti introvabili.<br />
<br />
Un altro aspetto negativo è che questa mancanza di fiducia è alimentata dall'idea di voler tastare con mano il prodotto, prima di comprarlo.<br />
<br />
Inoltre si ha il timore che una volta effettuato l'acquisto non ci siano garanazie nel caso arrivasse rotto o difettoso.<br />
<br />
Per esperienza, sono anni ormai che faccio acquisti su internet e non ho mai avuto problemi. Per prima cosa se mi piace un prodotto, mi reco al primo centro commerciale per tastarmelo e provarlo. Nel caso non fosse disponibile, cerco eventuali video <span style="background-color: white;">ed informazioni</span><span style="background-color: white;"> su <a href="http://www.youtube.com/" rel="nofollow" target="_blank">YouTube</a> o nei blog del settore di competenza.</span><br />
Se decido di effettuare l'acquisto ci sono due strade da percorrere:<br />
<br />
La prima è l'acquisto da siti più famosi tipo <a href="http://www.amazon.it/" rel="nofollow" target="_blank">Amazon</a>. Qui mi sento sicuro al 100% perché non ho mai avuto problemi ed inoltre quasi sempre il prezzo è nettamente inferiore rispetto ai comuni centri commerciali (per alcuni prodotti ho risparmiato anche 200 euro). Su amazon inoltre il prezzo di un prodotto è molto variabile di giorno in giorno.<br />
<br />
E tutto semplicissimo. Mi basta accede al sito con le mie credenziali, guardare i prodotti, metterli nel carrello virtuale, completare l'acquisto fornendo il numero della carta di credito (la prima volta, poi viene memorizzata sul sito), e attendere il pacco comodo a casa in poltrona.<br />
<br />
In caso di prodotto rotto o difettoso si hanno 30 giorni per restituirlo e farselo rimborsare. Passati i 30 giorni (ed entro 2 anni dati dalla garanzia e come qualsiasi altro prodotto acquistato in un normale negozio) bisogna cercare il più vicino centro di assistenza che si occupa della marca del prodotto acquistato (basta una piccola ricerca su <a href="http://www.google.it/" rel="nofollow" target="_blank">Google</a> per trovarlo).<br />
<br />
Nel secondo caso cioè quello di siti sconosciuti ci sono un paio di regole da seguire ma niente di complicato:<br />
<br />
- Prima di tutto dobbiamo fare una ricerca, per capire l'opinione della gente riguardo al negozio, se si sono trovati bene, in quanto tempo la merce ordinata è arrivata, se hanno avuto esperienze negative, se c'è e se è buona l'assistenza post vendita. Riassumendo è importante conoscere la reputazione online del negozio (<span style="background-color: white;">feedback positivi e negativi)</span><span style="background-color: white;">.</span><br />
<br />
- Bisogna confrontare l'offerta con quella di altri negozi e se è eccessivamente bassa stare molto attenti perché si tratta di una provabile trappola, o ci sono delle clausole nascoste. Molte volte ad esempio la tecnica di marketing usata è proporre un prezzo molto basso rispetto alla concorrenza, ma prima di terminare l'acquisto vi vengono richieste spese di spedizione molto alte che riportano la spesa totale allo stesso livello o superiore a quella dei concorrenti.<br />
<br />
- Controllate che sia presente un servizio post vendita e che i numeri di telefono esitano veramente (si può contollare sul sito delle pagine bianche).<br />
<br />
Una volta che avete appreso abbastanza informazioni e vi fidate, effettuate l'acquisto.<br />
<br />
Se proprio vi va male denunciate l'accaduto alla polizia postale.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-52042896057479708752012-01-27T12:32:00.001+01:002014-07-07T13:59:38.869+02:00String format .NET semplificato e naturaleMolte volte ci troviamo a dover inserire delle stringhe in una stringa più grande (di solito una frase, per notificare un messaggio all’utente dell’applicazione).<br />
Per fare ciò usiamo il metodo “<strong>String.Format()</strong>” che accetta in input la stringa da formattare, e un array contenete le altre stringhe da inserire, al posto di segna posti speciali, costruiti con la regola: <strong>{indice dell’array}.</strong><br />
Es.:<br />
<pre class="brush: csharp;">MessageBox.Show(String.Format("Errore numero {0}, l'utente {1}, non ha i permessi di lettura del file
{2}, inoltre {1}, non appartiene al ruolo {3}", new String[]{"123", "Mario", "file.txt", "admin"}));</pre>
Di solito la scrittura di questo codice avviene nella seguente maniera:<br />
<ol>
<li>Si scrive: <strong>MessageBox.Show(</strong></li>
<li>Si pensa al messaggio e si inizia a scriverlo: <strong>"Errore numero …</strong></li>
<li>Ci si accorge che il messaggio dovrà contenere dei pezzi di stringa all’interno della stringa principale.</li>
<li>Si aggiungono i segna posto per i pezzi di stringa: <strong>numero <span style="color: blue;">{0}</span>, l'utente <span style="color: blue;">{1}</span>, non</strong></li>
<li>Completata la frase, ci si posiziona all’inizio della frase stessa.</li>
<li>Si digita <strong>String.Format(</strong></li>
<li>Si va alla fine della frase e si chiude la parentesi <strong>)</strong></li>
</ol>
Come si vede a lungo andare si perde molto tempo a compiere tale operazione e non è del tutto naturale, perché ci impegna a cercare l’inizio della frase scritta per aggiungere un pezzo di codice e a tornare alla fine di essa, per chiudere la parentesi.<br />
Per risparmiare tempo e trovare più naturalezza nella scrittura, ho implementato la seguente classe per estendere la classe <strong>System.String</strong>:<br />
<pre class="brush: csharp;">namespace System
{
/// <summary>
/// Estensioni per le classi stringa
/// </summary>
public static class StringEx
{
/// <summary>
/// Formatta la stringa
/// </summary>
/// <param name="pValue">Stringa</param>
/// <param name="args">Parametri</param>
/// <returns>Stringa formattata</returns>
public static string Formatting(this String pValue, params object[] args)
{
return String.Format(pValue, args);
}
/// <summary>
/// Formatta la stringa
/// </summary>
/// <param name="pValue">Stringa</param>
/// <param name="format">Format provider</param>
/// <param name="args">Parametri</param>
/// <returns>Stringa formattata</returns>
public static string Formatting(this String pValue, IFormatProvider format, params object[] args)
{
return String.Format(format, pValue, args);
}
}
}</pre>
Ora potere scrivere lo stesso codice dell’esempio di prima in maniera naturale, senza bisogno di tornare a cercare dove inizia la vostra Stringa:<br />
<pre class="brush: csharp;">MessageBox.Show("Errore numero {0}, l'utente {1}, non ha i permessi di lettura del file {2}, inoltre {1},
non appartiene al ruolo {3}".Formatting(new String[] { "123", "Mario", "file.txt", "admin" }));</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-80498465297705855602012-01-14T00:09:00.001+01:002012-01-14T00:29:39.853+01:00Implementare il Databindings di oggettiOggi mi è capitato di dover implementare il databindings di un controllo che ne era sprovvisto (il treenode). Per aggiungere il databindings ad un oggetto TreeNode, come nel mio caso, ma anche per qualsiasi altro oggetto, basta implementare l’interfaccia IBindableComponent.<br />
<br />
In questo modo potete usare il Binding su tutte le proprietà del TreeNode; in particolare a me interessava collegare la proprietà “Name” di un mio oggetto alla proprietà “Text” di un TreeNode.<br />
<br />
Ecco un esempio in C# dell’implementazione del databindings per la proprietà “Text” di un oggetto TreeNode:<br />
<pre class="brush: csharp;">public class TreeNodeBind : TreeNode, IBindableComponent
{
//Implementazione dei costruttori base
public TreeNodeBind()
: base()
{
}
public TreeNodeBind(string text)
: base(text)
{
}
public TreeNodeBind(string text, TreeNode[] children)
: base(text, children)
{
}
public TreeNodeBind(string text, int imgIndex, int selImgIndex)
: base(text, imgIndex, selImgIndex)
{
}
public TreeNodeBind(string text, int imgIndex, int selImgIndex, TreeNode[] children)
: base(text, imgIndex, selImgIndex, children)
{
}
//Implementazione di IBindableComponent
#region IBindableComponent Members
private BindingContext _bindingContext;
private ControlBindingsCollection _dataBindings;
[Browsable(false)]
public BindingContext BindingContext
{
get
{
if (_bindingContext == null)
{
_bindingContext = new BindingContext();
}
return _bindingContext;
}
set
{
_bindingContext = value;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ControlBindingsCollection DataBindings
{
get { return _dataBindings ?? (_dataBindings = new ControlBindingsCollection(this)); }
}
public ISite Site { get; set; }
public event EventHandler Disposed;
public void Dispose()
{
if (Disposed != null)
Disposed(this, EventArgs.Empty);
}
#endregion
}</pre>
Ora potete creare ed usare nodi di tipo TreeNodeBind che supportano il Binding:<br />
<pre class="brush: csharp;">TreeNodeBind nodoBind = new TreeNodeBind();
nodoBind.DataBindings.Add(new System.Windows.Forms.Binding("Text", oggettoConDati, "Name", true));
tree.Nodes.Add(nodoBind);</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-13113673552755416572011-12-22T16:54:00.000+01:002011-12-29T23:22:39.674+01:00Sviluppo Python su Android con SL4AIn questo articolo vi parlerò di come collegare un dispositivo Android al vostro PC windows per utilizzare da remoto SL4A, un programma che invia istruzioni in diversi linguaggi scripting (fra cui Python) ad Android tramite chiamate RPC e permette di scrivere programmi o pezzi di script direttamente sul dispositivo.<br />
<br />
Per prima cosa scaricare e installare SL4A sul dispositivo Android. Lo potete trovare qui:<br />
<a href="http://code.google.com/p/android-scripting/downloads/list" target="_blank">http://code.google.com/p/android-scripting/downloads/list</a><br />
file: sl4a_r4.apk (o ultima versione)<br />
<br />
Scarichiamo anche l'ultimo interprete del linguaggio Python:<br />
<a href="http://code.google.com/p/python-for-android/downloads/list" target="_blank">http://code.google.com/p/python-for-android/downloads/list</a><br />
file: PythonForAndroid_r6.apk (o ultima versione)<br />
<br />
Sul PC installate Android SDK:<br />
<a href="http://developer.android.com/sdk/index.html" target="_blank">http://developer.android.com/sdk/index.html</a><br />
<br />
Sul PC avviate Android SDK Manager e installate il driver USB:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaPUbK7JXUq9g-riOZpIt4MVoY5pUi0MxcNxnF5999GcW5aIIAChT9lRrUxTo-9alwgzeRT_29r1ulrSulBI-rHmtOaWbXO_Qi_WeLoS1sxLAqk2aaKHw2uZlQ1wf3bsQqnIyhEimhqKsG/s1600/29-12-2011+19-30-21.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaPUbK7JXUq9g-riOZpIt4MVoY5pUi0MxcNxnF5999GcW5aIIAChT9lRrUxTo-9alwgzeRT_29r1ulrSulBI-rHmtOaWbXO_Qi_WeLoS1sxLAqk2aaKHw2uZlQ1wf3bsQqnIyhEimhqKsG/s320/29-12-2011+19-30-21.png" width="320" /></a></div>
<br />
Sul device andare in: "Impostazioni" -> "Applicazioni" -> "Sviluppo" -> e spuntare l'opzione "Debug USB"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUy988DrxDUp5bfEFLEEEVoeDKSaRh7XJmXdUAe2YrMJ6ugW680CzYjqrcj0TbgUTlcbaO_SMBhmXQF0xb3beBx5TP27_iNcEiOZdAKdicuf_zT3W31Vl8MyWhy_cyl33Oorzl06V3QIkQ/s1600/20111229211301.png" imageanchor="1"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUy988DrxDUp5bfEFLEEEVoeDKSaRh7XJmXdUAe2YrMJ6ugW680CzYjqrcj0TbgUTlcbaO_SMBhmXQF0xb3beBx5TP27_iNcEiOZdAKdicuf_zT3W31Vl8MyWhy_cyl33Oorzl06V3QIkQ/s320/20111229211301.png" width="320" /></a></div>
<br />
Sul PC aggiungete "C:\Program Files (x86)\Android\android-sdk\tools\" alla variabile ambiente di windows PATH<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghDu90BYTGTEnLGcfmxO16fZpyPxdkQe9l6nk28WXw2cJ_qtw4Mlov8Ul0Ew-r9V4WlJdKRMuzKGQmtOYPiqXWRHdKCKkmNtI38kahHa5aoFai2nKPhx2KFW5WiSqW17zjik1Yy-vGXD8-/s1600/29-12-2011+19-36-31.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghDu90BYTGTEnLGcfmxO16fZpyPxdkQe9l6nk28WXw2cJ_qtw4Mlov8Ul0Ew-r9V4WlJdKRMuzKGQmtOYPiqXWRHdKCKkmNtI38kahHa5aoFai2nKPhx2KFW5WiSqW17zjik1Yy-vGXD8-/s320/29-12-2011+19-36-31.png" width="283" /></a></div>
<br />
Dal prompt di windows digitare "gestione dispositivi" e su "Altri dispositivi" tasto destro e "Aggiornamento software driver"<br />
fare cerca nel computer nella cartella: "C:\Program Files (x86)\Android\android-sdk\extras\google\usb_driver" (o dove avete installato l'sdk)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qT0ZGCnZPYj0E5SpAUefiKQRSBnb08bLuqRL1SLxD7bg6Z5aiiwWTm_TAvDRim-lwR8n9ZXPirTmw5-dkAhOuWeF4aqbfot3cT8sHqEI3_FahhTx-lNDLkmpmqxwb16pivsTjkylGF5j/s1600/29-12-2011+19-45-52.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qT0ZGCnZPYj0E5SpAUefiKQRSBnb08bLuqRL1SLxD7bg6Z5aiiwWTm_TAvDRim-lwR8n9ZXPirTmw5-dkAhOuWeF4aqbfot3cT8sHqEI3_FahhTx-lNDLkmpmqxwb16pivsTjkylGF5j/s320/29-12-2011+19-45-52.png" width="320" /></a></div>
<br />
Se il dispositivo non viene riconosciuto fate proprietà -> dettagli e annotardi le 2 righe con gli hardware id:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbV8w8iJ9zOeKGhfnAe3gOooIP_kLmrUxyW3EI3qq0U_wWw5iVFRA5kSr9oydiEpKYzDk68pzvRuT-QCOny8fRoBixUJrWi7RBem8COuSHqXSXIup7beH6cGB20OvpuHWiMW7X9L7GDLZI/s1600/29-12-2011+19-48-11.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbV8w8iJ9zOeKGhfnAe3gOooIP_kLmrUxyW3EI3qq0U_wWw5iVFRA5kSr9oydiEpKYzDk68pzvRuT-QCOny8fRoBixUJrWi7RBem8COuSHqXSXIup7beH6cGB20OvpuHWiMW7X9L7GDLZI/s320/29-12-2011+19-48-11.png" width="320" /></a></div>
<br />
Aprite il file "android_winusb.inf" per inserire gli hardware id annotati in precedenza:.<br />
<br />
Per il tablet iconia A500 come il mio aggiungete le seguenti righe:<br />
<br />
(sia alla fine sella sezione [Google.NTx86] che di [Google.NTamd64])<br />
<pre>;
;Iconia A500
%SingleAdbInterface% = USB_Install, USB\VID_0502&PID_3325
%CompositeAdbInterface% = USB_Install, USB\VID_0502&PID_3325&MI_01
</pre>
<br />
ripetete il riconoscimento del driver, tramite aggiornamento ed ora verrà trovato:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEoifxA5LtYw1lsmnZuofRnXy_gzBRqkry7TOXFxvCOOczaDAEr4jjKP19CicTBDSRocOGZZP4CwyXsbhdjvdgkMsScMZwnRRJ35Iy3gBahpXPtn8HfZRFVF22D5fEINc-hhIW0CpWHzgh/s1600/29-12-2011+19-54-12.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEoifxA5LtYw1lsmnZuofRnXy_gzBRqkry7TOXFxvCOOczaDAEr4jjKP19CicTBDSRocOGZZP4CwyXsbhdjvdgkMsScMZwnRRJ35Iy3gBahpXPtn8HfZRFVF22D5fEINc-hhIW0CpWHzgh/s320/29-12-2011+19-54-12.png" width="320" /></a></div>
<br />
fate una prova lanciando il comando dal prompt di windows (con privilegi di amministratore): adb devices<br />
dovrebbe restituirvi una stringa che rappresenta l'id del dispositivo connesso<br />
<br />
Avviamo SL4A dal dispositivo Android. Ora dal menu del programma selezionate: View -> Interpreters<br />
premiamo di nuovo il bottone menu, selezioniamo "start server". Selezioniamo "private" (public è usato per la connessione via wifi).<br />
<br />
Ora siamo pronti alla connessione:<br />
per prima cosa dobbiamo creare la seguente variabile d'ambiente per utente: AP_PORT con valore di default: 9999, poi abilitare il port forwarding<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin-3ub8QJU-gsbRXM_r6cxnDQAx8523iL4l5plzJtTMZTjilGb2LD17VMAVny8w0QhOpaUqmJoLKEE_IIq7rVOnkzSeJ1f1zIlv-Th16fUQ7Tau_nDekEQYePt5eYj-9ZdUrn6DnbofrVG/s1600/29-12-2011+20-21-55.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin-3ub8QJU-gsbRXM_r6cxnDQAx8523iL4l5plzJtTMZTjilGb2LD17VMAVny8w0QhOpaUqmJoLKEE_IIq7rVOnkzSeJ1f1zIlv-Th16fUQ7Tau_nDekEQYePt5eYj-9ZdUrn6DnbofrVG/s320/29-12-2011+20-21-55.png" width="278" /></a></div>
<br />
Nel caso abbiate un tablet cliccate sull'icona di SL4A nella tray e poi nel riquadro nero che compare per vedere a video il numero della porta usata dal server del dispositivo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6kDVzu5pjJCR-Eyw_rKG0i_B7HDHJX8lYdkkWEsTMYl9gwRhlVwfoIdeEqotuuoP6MChdIOWeQmZ3YMzkSJ2bNgvaZleZnaRspiyM_rUdKTOnkp9qY-3R3Kx1R_cb-XuvME0HFUEGE_48/s1600/20111229212109.png" imageanchor="1"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6kDVzu5pjJCR-Eyw_rKG0i_B7HDHJX8lYdkkWEsTMYl9gwRhlVwfoIdeEqotuuoP6MChdIOWeQmZ3YMzkSJ2bNgvaZleZnaRspiyM_rUdKTOnkp9qY-3R3Kx1R_cb-XuvME0HFUEGE_48/s320/20111229212109.png" width="320" /></a></div>
<br />
Aggiungiamo alla variabile d'ambiente PATH anche il percorso del file della shell Python Es.: ";C:\Python26"<br />
<br />
Nella cartella lib della cartella dove avete installato Python Es.: "C:\Python26\Lib" salviamo il file "<a href="http://android-scripting.googlecode.com/hg/python/ase/android.py">android.py</a>"<br />
<br />
Sul PC lanciamo un prompt windows come amministratore e digitiamo:<br />
<pre class="brush: bash;">set AP_PORT=9999
adb forward tcp:9999 tcp:[numero di porta server SL4A]
python
</pre>
Ora la vostra shell Python esegue i comandi sul dispositivo Android.<br />
<br />
Ecco il codice per una piccola prova che stampa sul video del dispositivo il messaggio "Ciao sono il PC!"<br />
<pre class="brush: py;">import android # dal file android.py che abbiamo aggiunto sul PC
droid = android.Android()
droid.makeToast("Ciao sono il PC!")
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-62297219867863869622011-12-21T17:00:00.000+01:002011-12-21T19:16:27.658+01:00Appunti base relativi ai Design Patterns<b>Appunti sui Design patterns:</b><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5xGw8EiZOW-DcAZSoKExZR59TzJ4vLKUpF4Arb7vWXBWnbiKMQKPqZ8kUQE3QA1yGL2FCqF54LWbiU7v29QGW30XF-Ozxy91Tzsflm63tpGIawyNOVD2pG72HjMz5ihFTb1aJxZELKje2/s1600/Patterns+%25282%2529.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5xGw8EiZOW-DcAZSoKExZR59TzJ4vLKUpF4Arb7vWXBWnbiKMQKPqZ8kUQE3QA1yGL2FCqF54LWbiU7v29QGW30XF-Ozxy91Tzsflm63tpGIawyNOVD2pG72HjMz5ihFTb1aJxZELKje2/s320/Patterns+%25282%2529.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">appunti design patterns</td></tr>
</tbody></table>
I design patterns sono suddivisi in queste tre principali categorie:<br />
<br />
<b>Creationals (Creazionali):</b><br />
<ul>
<li>Permettono di astrarre il processo di creazione degli oggetti</li>
<li>Rendono un sistema indipendente da come i suoi oggetti sono stati creati, composti e rappresentati</li>
<li>Incapsulano la conoscenza sulle classi concrete che un sistema usa</li>
<li>Nascondono l'implementazione delle classi e della loro creazione</li>
</ul>
<i><span style="font-size: x-small;">da immagine appunti design patterns</span></i>
<br />
<pre>1.1, Creational
1.1.1, AbstractFactory
1.1.1.1, Crea oggetti che appartengono alla stessa famiglia e sono connessi o dipendenti tra loro
1.1.1.2, Possibilità di utilizzare una famiglia diversa di prodotti a seconda della factory usata. L'interfaccia del client non cambia
1.1.2, FactoryMethod
1.1.2.1, Fornische un interfaccia per creare un oggetto ma sono le sottoclassi a decidere cosa istanziare
1.1.3, Prototype
1.1.3.1, Crea nuovi oggetti clonando quello base
1.1.4, Builder
1.1.4.1, Separa la costruzione di un oggetto complesso dalla sua rappresentazione. Lo stesso costruttore puó creare più rappresentazioni diverse
1.1.5, Singleton
1.1.5.1, Fa in modo che una classe abbia una sola istanza e possa essere usata da tutti
</pre>
<br />
<b>Structural (Strutturali):</b>
<br />
<div>
<ul>
<li>Sono dedicati alla composizione di classi e oggetti per creare delle strutture più grandi</li>
<li>Gli Structural class pattern utilizzando l'ereditarietà per creare interfacce o implementazioni</li>
<li>Gli Structural object pattern descrivono il modo in cui comporre gli oggetti per realizzare nuove funzionalità</li>
</ul>
<i><span style="font-size: x-small;">da immagine appunti design patterns</span></i>
<br />
<pre>1.2, Structural
1.2.1, Proxy
1.2.1.1, Inizializzare un oggetto solo quando viene chiamato il metodo
1.2.2, Bridge
1.2.2.1, Separa cosa si puó fare da cosa si fà
1.2.2.2, Permette di eseguire la stessa operazione ma in maniera diversa a seconda del caso
1.2.2.3, Costruisce un oggetto composto da varie parti. Le parti che servono sono dinamiche a seconda del builder usato
1.2.3, Facade
1.2.3.1, Interfaccia di alto livello per richiamare sottosistemi diversi
1.2.4, Adapter
1.2.4.1, Adatta l'interfaccia di un elemento alla richiesta del client
1.2.5, Decorator
1.2.5.1, Aggiunge metodi all'oggetto in maniera dinamica
1.2.5.2, Propone alternativa all'ereditarietà (anche multipla)
1.2.6, Flyweight
1.2.6.1, Condivide la parte riusabile di un oggetto
1.2.6.2, La factory estra un oggetto dalla collezione interna o lo crea nuovo per risparmiare memoria, istanziando l'oggetto normalmente si accede alla parte non condivisa
1.2.7, Composite
1.2.7.1, Crea oggetti in strutture ad albero
1.2.7.2, Esempio: il trapezio è composto da 2 triangoli e un rettangolo
</pre>
<pre></pre>
<pre></pre>
<div>
<b>Behavioral (Comportamentali):</b></div>
</div>
<div>
<ul>
<li>Si focalizzano sul controllo di flusso degli oggetti</li>
<li>Descrivono le comunicazioni fra gli oggetti</li>
<li>Aiutano a valutare le responsabilità assegnate agli oggetti</li>
<li>Suggeriscono modi per incapsulare algoritmi dentro classi</li>
</ul>
</div>
<i><span style="font-size: x-small;">da immagine appunti design patterns</span></i>
<br />
<pre>1.3, Behavioral
1.3.1, TemplateMethod
1.3.1.1, Permette di variare una parte di un algoritmo e non toccare il resto
1.3.2, Strategy
1.3.2.1, Crea una classe con algoritmi intercambiabili ma interfaccia per richiamarli uguale
1.3.3, Observer
1.3.3.1, Crea eventi che si scatenano in tutti gli oggetti registrati quando viene notificato dall'oggetto principale
1.3.4, Mediator
1.3.4.1, Permette l'iterazione fra oggetti senza che uno abbia a che fare con l'altro
1.3.4.2, L'oggetto principale incapsula l'iterazione fra gli oggetti contenuti
1.3.5, State
1.3.5.1, Cambia il comportamento a run-time dell'oggetto a seconda dello stato in cui si trova
1.3.6, Interpreter
1.3.6.1, Trasforma una sintassi, un linguaggio in entrata e interpretandone le espressioni produce un risultato in uscita
1.3.6.2, L'interpreter precisa come valutare le frasi in una determinata lingua o linguaggio
1.3.7, Visitor
1.3.7.1, Rappresenta un operazione che puó essere eseguita sugli elementi di una struttura oggetto.
1.3.7.2, Permette di definire una nuova operazione senza modificare la struttura stessa
1.3.7.3, Delega una funzionalità a una gerarchia di classi senza inquinarle
1.3.7.4, Separa un algoritmo dalla struttura di oggetti compositi a cui è applicato
1.3.7.5, Il visitor incapsula la funzionalità e la gerarchia viene dotata solo di un metodo per accedere ad uno di questi visitor
1.3.8, Command
1.3.8.1, Isola la porzione di codice che effettua un azione dal codice che ne richiede l'esecuzione; l'azione è incapsulata nell'oggetto command
1.3.8.2, Utile da usare per associare azioni dell'interfaccia grafica(esempio click sul un bottone) al codice che esegue l'azione
1.3.9, Iterator
1.3.9.1, Fornisce un metodo per accedere agli oggetti di una collezione senza esporli direttamente
1.3.10, Memento
1.3.10.1, Estrae lo stato di un oggetto per ripristinarlo successivamente (come undo)
1.3.11, Chain of responsability
1.3.11.1, Separa oggetti che fanno le richieste da quelli che le gestiscono
1.3.11.2, Usa un determinato oggetto che si incarica di soddisfare la richiesta effettuata
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-75002477627579153042011-12-09T12:53:00.001+01:002011-12-15T09:39:37.925+01:00Factory Method Design Pattern in praticaIl Factory Method, fa parte dei creational patterns, esso consente di utilizzare un'interfaccia per la creazione di un oggetto, ma sono le sottoclassi a decidere quale classe istanziare.<br />
L’obbiettivo principale è l’estensibilità, consente di istanziare un oggetto senza specificare una classe.<br />
Il Factory Method è spesso utilizzato in applicazioni che:<br />
<ul>
<li>necessitano che la creazione o la rappresentazione di oggetti sia nascosta ed indipendente dalla struttura principale. </li>
<li>gestiscono, mantengono, o manipolano collezioni di oggetti diverse, ma con molte caratteristiche in comune. </li>
<li>se il sistema principale viene modificato si possono modificare facilmente anche le caratteristiche comuni fra gli oggetti </li>
<li>forniscono una libreria di classi in cui è visibile solo l’interfaccia, ma non l’implementazione della classe </li>
</ul>
Ci sono 3 regole principali che il pattern Factory Method deve rispettare:<br />
<ol>
<li>Il metodo crea un nuovo oggetto </li>
<li>Il metodo ritorna una classe astratta o un interfaccia </li>
<li>La classe astratta o l’interfaccia viene implementata da più classi </li>
</ol>
<br />
Ora vediamo un piccolo esempio di implementazione per capire meglio come funziona il pattern Factory Method nei seguenti linguaggi: <br />
(questi ultimi due comunque non supportano interfacce o classi astratte, quindi bisogna prestare la massima attenzione all’implementazione, magari usando una buona convenzione sui nomi delle classi e dei metodi, in maniera di evitare di utilizzare classi o metodi sbagliati per distrazione)<br /><br />
Diagramma UML:<br />
<img src="http://yuml.me/diagram/scale:64/class/[Persona]^-[ConcreteDipendente], [Persona]^-[ConcreteDatoreDiLavoro], [ConcreteDipendente]^-.-[ConcreteCreatorDipendente], [ConcreteDatoreDiLavoro]^-.-[ConcreteCreatorDatoreDiLavoro],[PersonaleAziendaCreator]^-[ConcreteCreatorDipendente],[PersonaleAziendaCreator]^-[ConcreteCreatorDatoreDiLavoro]." />
In un nuovo progetto di tipo Console aggiungo il file “Persona” e creo la classe persona (questa classe sarà usata anche nei miei prossimi post sui design patterns):<br />
<pre class="brush: csharp;">//C#
using System;
namespace Netrudy.Patterns
{
//Classe che rappresenta una persona fisica
class Persona
{
//Costruttore
public Persona(string nome, string cognome)
{
this.Nome = nome;
this.Cognome = cognome;
}
//Nome
public String Nome { get; set; }
//Cognome
public String Cognome { get; set; }
}
}</pre>
<pre class="brush: vb;">'VB.NET
Namespace Netrudy.Patterns
'Classe che rappresenta una persona fisica
Class Persona
'Costruttore
Public Sub New(nome As String, cognome As String)
Me.Nome = nome
Me.Cognome = cognome
End Sub
'Nome
Public Property Nome() As [String]
Get
Return m_Nome
End Get
Set(value As [String])
m_Nome = value
End Set
End Property
Private m_Nome As [String]
'Cognome
Public Property Cognome() As [String]
Get
Return m_Cognome
End Get
Set(value As [String])
m_Cognome = value
End Set
End Property
Private m_Cognome As [String]
End Class
End Namespace
</pre>
<pre class="brush: java;">//Java
package Netrudy.Patterns;
//Classe che rappresenta una persona fisica
public class Persona
{
//Costruttore
public Persona(String nome, String cognome)
{
this.setNome(nome);
this.setCognome(cognome);
}
//Nome
private String privateNome;
public final String getNome()
{
return privateNome;
}
public final void setNome(String value)
{
privateNome = value;
}
//Cognome
private String privateCognome;
public final String getCognome()
{
return privateCognome;
}
public final void setCognome(String value)
{
privateCognome = value;
}
}
</pre>
<pre class="brush: cpp;">//C++/CLI file .h
#pragma once
using namespace System;
namespace Netrudy
{
namespace Patterns
{
//Classe che rappresenta una persona fisica
private ref class Persona
{
//Costruttore
public:
Persona(String ^nome, String ^cognome);
//Nome
property String ^Nome;
//Cognome
property String ^Cognome;
};
}
}
//file .cpp
#include "Persona.h"
using namespace System;
namespace Netrudy
{
namespace Patterns
{
Persona::Persona(String ^nome, String ^cognome)
{
this->Nome = nome;
this->Cognome = cognome;
}
}
}
</pre>
<pre class="brush: cpp;">//C++ Nativo file .h
#pragma once
#include <string>
namespace Netrudy
{
namespace Patterns
{
//Classe che rappresenta una persona fisica
class Persona
{
//Costruttore
public:
Persona(const std::string &nome, const std::string &cognome);
//Nome
private:
std::string privateNome;
public:
std::string getNome();
void setNome(const std::string &value);
//Cognome
private:
std::string privateCognome;
public:
std::string getCognome();
void setCognome(const std::string &value);
};
}
}
//file .cpp
#include "Persona.h"
namespace Netrudy
{
namespace Patterns
{
Persona::Persona(const std::string &nome, const std::string &cognome)
{
this->Nome = nome;
this->Cognome = cognome;
}
std::string Persona::getNome()
{
return privateNome;
}
void Persona::setNome(const std::string &value)
{
privateNome = value;
}
std::string Persona::getCognome()
{
return privateCognome;
}
void Persona::setCognome(const std::string &value)
{
privateCognome = value;
}
}
}</pre>
<pre class="brush: py;">#Python
"""Classe che rappresenta una persona fisica"""
class Persona(object):
#Costruttore
def __init__(self, nome, cognome):
self._nome = nome
self._cognome = cognome
#Nome
def getNome(self):
return self._nome
def setNome(self, value):
self._nome = value
Nome = property(getNome, setNome)
#Cognome
def getCognome(self):
return self._cognome
def setCognome(self, value):
self._cognome = value
Cognome = property(getCognome, setCognome)
</pre>
<pre class="brush: js;">//Javascript
//Classe che rappresenta una persona fisica
//Costruttore
Netrudy.Patterns._persona = function Netrudy_Patterns__persona(nome, cognome) {
this.set_nome(nome);
this.set_cognome(cognome);
}
Netrudy.Patterns._persona.prototype = {
//Nome
_nome: null,
get_nome: function Netrudy_Patterns__persona$get_nome() {
return this._nome;
},
set_nome: function Netrudy_Patterns__persona$set_nome(value) {
this._nome = value;
return value;
},
//Cognome
_cognome: null,
get_cognome: function Netrudy_Patterns__persona$get_cognome() {
return this._cognome;
},
set_cognome: function Netrudy_Patterns__persona$set_cognome(value) {
this._cognome = value;
return value;
}
}</pre>
N.B.: Per Javascript ho usato Script#: <a href="http://projects.nikhilk.net/ScriptSharp">http://projects.nikhilk.net/ScriptSharp</a>
alcune funzioni utilizzano parte di codice della libreria “mscorlib.js” di Script#, che è un misto di AJAX e funzioni di .NET Framework riadattate al Javascript (per esempio le collezioni Enumerable).<br />
Aggiungiamo il file “FactoryMethod” e iniziamo a scrivere il seguente codice:<br />
Dichiaro gli oggetti dipendente e datore di lavoro che derivano da persona (e rappresentano delle persone fisiche) questi sono i nostri oggetti nascosti:<br />
<pre class="brush: csharp;">//C#
//Personale di tipo: dipendente
class ConcreteDipendente : Persona
{
public ConcreteDipendente(string nome, string cognome)
: base(nome, cognome) {}
}
//Personale di tipo: datore di lavoro
class ConcreteDatoreDiLavoro : Persona
{
public ConcreteDatoreDiLavoro(string nome, string cognome)
: base(nome, cognome) {}
}</pre>
<pre class="brush: vb;">'VB.NET
'Personale di tipo: dipendente
Class ConcreteDipendente
Inherits Persona
Public Sub New(nome As String, cognome As String)
MyBase.New(nome, cognome)
End Sub
End Class
'Personale di tipo: datore di lavoro
Class ConcreteDatoreDiLavoro
Inherits Persona
Public Sub New(nome As String, cognome As String)
MyBase.New(nome, cognome)
End Sub
End Class
</pre>
<pre class="brush: java;">//Java
//Personale di tipo: datore di lavoro
public class ConcreteDatoreDiLavoro extends Persona
{
public ConcreteDatoreDiLavoro(String nome, String cognome)
{
super(nome, cognome);
}
}
//Personale di tipo: dipendente
public class ConcreteDipendente extends Persona
{
public ConcreteDipendente(String nome, String cognome)
{
super(nome, cognome);
}
}
</pre>
<pre class="brush: cpp;">//C++/CLI file .h
//Personale di tipo: dipendente
private ref class ConcreteDipendente : Persona
{
public:
ConcreteDipendente(String ^nome, String ^cognome);
};
//Personale di tipo: datore di lavoro
private ref class ConcreteDatoreDiLavoro : Persona
{
public:
ConcreteDatoreDiLavoro(String ^nome, String ^cognome);
};
//file .cpp
ConcreteDipendente::ConcreteDipendente(String ^nome, String ^cognome) : Persona(nome, cognome)
{
}
ConcreteDatoreDiLavoro::ConcreteDatoreDiLavoro(String ^nome, String ^cognome) : Persona(nome, cognome)
{
}
</pre>
<pre class="brush: cpp;">//C++ Nativo file .h
//Personale di tipo: dipendente
class ConcreteDipendente : public Persona
{
public:
ConcreteDipendente(const std::string &nome, const std::string &cognome);
};
//Personale di tipo: datore di lavoro
class ConcreteDatoreDiLavoro : public Persona
{
public:
ConcreteDatoreDiLavoro(const std::string &nome, const std::string &cognome);
};
// file .cpp
ConcreteDipendente::ConcreteDipendente(const std::string &nome, const std::string &cognome) : Persona(nome, cognome)
{
}
ConcreteDatoreDiLavoro::ConcreteDatoreDiLavoro(const std::string &nome, const std::string &cognome) : Persona(nome, cognome)
{
}
</pre>
<pre class="brush: py;">#Python
#Personale di tipo: dipendente
class ConcreteDipendente(Persona):
def __init__(self, nome, cognome):
Persona.__init__(self, nome, cognome)
#Personale di tipo: datore di lavoro
class ConcreteDatoreDiLavoro(Persona):
def __init__(self, nome, cognome):
Persona.__init__(self, nome, cognome)
</pre>
<pre class="brush: js;">//Javascript
//Personale di tipo: dipendente
Netrudy.Patterns._concreteDipendente = function Netrudy_Patterns__concreteDipendente(nome, cognome) {
Netrudy.Patterns._concreteDipendente.initializeBase(this, [ nome, cognome ]);
}
//Personale di tipo: datore di lavoro
Netrudy.Patterns._concreteDatoreDiLavoro = function Netrudy_Patterns__concreteDatoreDiLavoro(nome, cognome) {
Netrudy.Patterns._concreteDatoreDiLavoro.initializeBase(this, [ nome, cognome ]);
}</pre>
Come possiamo notare se c’è un costruttore nella classe base (persona) è necessario implementarlo anche nelle classi derivate.
<br />
Queste due classi appena create sono quelle concrete, cioè quelle con i campi e i metodi delle persone, e verranno create o meno a seconda di cosa scriveremo nel metodo di creazione FactoryMethod che implementeremo derivando la nostra nuova classe dalla seguente classe astratta:<br />
<pre class="brush: csharp;">//C#
//Classe astratta che rappresenta il personale dell'azienda
abstract class PersonaleAziendaCreator
{
//Costruttore che chiama il metodo astratto
//FactoryMethod
//che verrà implementato nella classe figlia
protected PersonaleAziendaCreator()
{
Persone = new List<persona>();
this.FactoryMethod();
}
//Metodo astratto da implementare
protected abstract void FactoryMethod();
//Lista del personale aziendale (che sarà legato
//alla categoria della classe figlia)
public List<persona> Persone { get; protected set; }
}</persona></persona></pre>
<pre class="brush: vb;">'VB.NET
'Classe astratta che rappresenta il personale dell'azienda
MustInherit Class PersonaleAziendaCreator
'Costruttore che chiama il metodo astratto FactoryMethod
'che verrà implementato nella classe figlia
Protected Sub New()
Persone = New List(Of Persona)()
Me.FactoryMethod()
End Sub
'Metodo astratto da implementare
Protected MustOverride Sub FactoryMethod()
'Lista del personale aziendale (che sarà legato alla categoria della classe figlia)
Public Property Persone() As List(Of Persona)
Get
Return m_Persone
End Get
Protected Set(value As List(Of Persona))
m_Persone = Value
End Set
End Property
Private m_Persone As List(Of Persona)
End Class
</pre>
<pre class="brush: java;">//Java
//Classe astratta che rappresenta il personale dell'azienda
public abstract class PersonaleAziendaCreator
{
//Costruttore che chiama il metodo astratto FactoryMethod
//che verrà implementato nella classe figlia
protected PersonaleAziendaCreator()
{
setPersone(new java.util.ArrayList<Persona>());
this.FactoryMethod();
}
//Metodo astratto da implementare
protected abstract void FactoryMethod();
//Lista del personale aziendale (che sarà legato alla categoria della classe figlia)
private java.util.ArrayList<Persona> privatePersone;
public final java.util.ArrayList<Persona> getPersone()
{
return privatePersone;
}
protected final void setPersone(java.util.ArrayList<Persona> value)
{
privatePersone = value;
}
}
</pre>
<pre class="brush: cpp;">//C++/CLI file .h
//Classe astratta che rappresenta il personale dell'azienda
private ref class PersonaleAziendaCreator abstract
{
//Costruttore che chiama il metodo astratto FactoryMethod
//che verrà implementato nella classe figlia
protected:
PersonaleAziendaCreator();
//Metodo astratto da implementare
virtual void FactoryMethod() abstract;
//Lista del personale aziendale (che sarà legato alla categoria della classe figlia)
public:
property List<Persona^> ^Persone;
};
//file .cpp
PersonaleAziendaCreator::PersonaleAziendaCreator()
{
Persone = gcnew List<Persona^>();
this->FactoryMethod();
}
</pre>
<pre class="brush: cpp;">//C++ Nativo file .h
//Classe astratta che rappresenta il personale dell'azienda
class PersonaleAziendaCreator
{
//Costruttore che chiama il metodo astratto FactoryMethod
//che verrà implementato nella classe figlia
protected:
PersonaleAziendaCreator();
//Metodo astratto da implementare
virtual void FactoryMethod() = 0;
//Lista del personale aziendale (che sarà legato alla categoria della classe figlia)
private:
std::vector<Persona*> privatePersone;
public:
std::vector<Persona*> getPersone();
void setPersone(std::vector<Persona*> value);
};
//file .cpp
PersonaleAziendaCreator::PersonaleAziendaCreator()
{
Persone = std::vector<Persona*>();
this->FactoryMethod();
}
std::vector<Persona*> PersonaleAziendaCreator::getPersone()
{
return privatePersone;
}
void PersonaleAziendaCreator::setPersone(std::vector<Persona*> value)
{
privatePersone = value;
}
</pre>
<pre class="brush: py;">#Python
"""Classe astratta che rappresenta il personale dell'azienda"""
#Python non supporta interfacce o classi astratte quindi utilizziamo il seguente workaround
class PersonaleAziendaCreator(object):
def __init__(self):
self._persone = []
self.FactoryMethod()
#workaround per metodo astratto
def FactoryMethod(self, arg):
raise NotImplementedError("Metodo astratto!")
def getPersone(self):
return self._persone
def setPersone(self, value):
self._persone = value
Persone = property(getPersone, setPersone)
</pre>
<pre class="brush: js;">//Javascript
//Classe che rappresenta il personale dell'azienda
Netrudy.Patterns._personaleAziendaCreator = function Netrudy_Patterns__personaleAziendaCreator() {
this.set_persone([]);
//Metodo astratto da implementare
this.factoryMethod();
}
Netrudy.Patterns._personaleAziendaCreator.prototype = {
_persone: null,
//Lista del personale aziendale (che sarà legato alla categoria della classe figlia)
get_persone: function Netrudy_Patterns__personaleAziendaCreator$get_persone() {
return this._persone;
},
set_persone: function Netrudy_Patterns__personaleAziendaCreator$set_persone(value) {
this._persone = value;
return value;
}
}
</pre>
Ora creiamo le classi di creazione del personale dell’azienda che implementeranno il FactoryMethod poiché derivando dalla classe base PersonaleAziendaCreator:<br />
<pre class="brush: csharp;">//C#
//Classe che si occupa di creare i dipendenti
//dell'azienda
class ConcreteCreatorDipendente : PersonaleAziendaCreator
{
protected override void FactoryMethod()
{
Persone.Add(new ConcreteDipendente("Luigi", "Bross"));
Persone.Add(new ConcreteDipendente("Toad", "Fungo"));
}
}
</pre>
<pre class="brush: csharp;">//Classe che si occupa di creare i datori di lavoro
//dell'azienda
class ConcreteCreatorDatoreDiLavoro : PersonaleAziendaCreator
{
protected override void FactoryMethod()
{
Persone.Add(new ConcreteDatoreDiLavoro("Mario", "Boss"));
}
}</pre>
<pre class="brush: vb;">'VB.NET
'Classe che si occupa di creare i dipendenti dell'azienda
Class ConcreteCreatorDipendente
Inherits PersonaleAziendaCreator
Protected Overrides Sub FactoryMethod()
Persone.Add(New ConcreteDipendente("Luigi", "Bross"))
Persone.Add(New ConcreteDipendente("Toad", "Fungo"))
End Sub
End Class
'Classe che si occupa di creare i datori di lavoro dell'azienda
Class ConcreteCreatorDatoreDiLavoro
Inherits PersonaleAziendaCreator
Protected Overrides Sub FactoryMethod()
Persone.Add(New ConcreteDatoreDiLavoro("Mario", "Boss"))
End Sub
End Class
</pre>
<pre class="brush: java;">//Java
//Classe che si occupa di creare i dipendenti dell'azienda
public class ConcreteCreatorDipendente extends PersonaleAziendaCreator
{
@Override
protected void FactoryMethod()
{
getPersone().add(new ConcreteDipendente("Luigi", "Bross"));
getPersone().add(new ConcreteDipendente("Toad", "Fungo"));
}
}
//Personale di tipo: datore di lavoro
public class ConcreteDatoreDiLavoro extends Persona
{
public ConcreteDatoreDiLavoro(String nome, String cognome)
{
super(nome, cognome);
}
}
</pre>
<pre class="brush: cpp;">//C++/CLI file .h
//Classe che si occupa di creare i dipendenti dell'azienda
private ref class ConcreteCreatorDipendente : PersonaleAziendaCreator
{
protected:
virtual void FactoryMethod() override;
};
//Classe che si occupa di creare i datori di lavoro dell'azienda
private ref class ConcreteCreatorDatoreDiLavoro : PersonaleAziendaCreator
{
protected:
virtual void FactoryMethod() override;
};
//file .cpp
void ConcreteCreatorDipendente::FactoryMethod()
{
Persone->Add(gcnew ConcreteDipendente("Luigi", "Bross"));
Persone->Add(gcnew ConcreteDipendente("Toad", "Fungo"));
}
void ConcreteCreatorDatoreDiLavoro::FactoryMethod()
{
Persone->Add(gcnew ConcreteDatoreDiLavoro("Mario", "Boss"));
}
</pre>
<pre class="brush: cpp;">//C++ Nativo file .h
//Classe che si occupa di creare i dipendenti dell'azienda
class ConcreteCreatorDipendente : public PersonaleAziendaCreator
{
protected:
virtual void FactoryMethod();
};
//Classe che si occupa di creare i datori di lavoro dell'azienda
class ConcreteCreatorDatoreDiLavoro : public PersonaleAziendaCreator
{
protected:
virtual void FactoryMethod();
};
//file .cpp
void ConcreteCreatorDipendente::FactoryMethod()
{
Persone->Add(new ConcreteDipendente("Luigi", "Bross"));
Persone->Add(new ConcreteDipendente("Toad", "Fungo"));
}
void ConcreteCreatorDatoreDiLavoro::FactoryMethod()
{
Persone->Add(new ConcreteDatoreDiLavoro("Mario", "Boss"));
}
</pre>
<pre class="brush: py;">#Python
#Classe che si occupa di creare i dipendenti dell'azienda
class ConcreteCreatorDipendente(PersonaleAziendaCreator):
def FactoryMethod(self):
self.Persone.append(ConcreteDipendente("Luigi", "Bross"))
self.Persone.append(ConcreteDipendente("Toad", "Fungo"))
#Classe che si occupa di creare i datori di lavoro dell'azienda
class ConcreteCreatorDatoreDiLavoro(PersonaleAziendaCreator):
def FactoryMethod(self):
self.Persone.append(ConcreteDatoreDiLavoro("Mario", "Boss"))
</pre>
<pre class="brush: js;">//Javascript
//Classe che si occupa di creare i dipendenti dell'azienda
Netrudy.Patterns._concreteCreatorDipendente = function Netrudy_Patterns__concreteCreatorDipendente() {
Netrudy.Patterns._concreteCreatorDipendente.initializeBase(this);
}
Netrudy.Patterns._concreteCreatorDipendente.prototype = {
factoryMethod: function Netrudy_Patterns__concreteCreatorDipendente$factoryMethod() {
this.get_persone().add(new Netrudy.Patterns._concreteDipendente('Luigi', 'Bross'));
this.get_persone().add(new Netrudy.Patterns._concreteDipendente('Toad', 'Fungo'));
}
}
//Classe che si occupa di creare i datori di lavoro dell'azienda
Netrudy.Patterns._concreteCreatorDatoreDiLavoro = function Netrudy_Patterns__concreteCreatorDatoreDiLavoro() {
Netrudy.Patterns._concreteCreatorDatoreDiLavoro.initializeBase(this);
}
Netrudy.Patterns._concreteCreatorDatoreDiLavoro.prototype = {
factoryMethod: function Netrudy_Patterns__concreteCreatorDatoreDiLavoro$factoryMethod() {
this.get_persone().add(new Netrudy.Patterns._concreteDatoreDiLavoro('Mario', 'Boss'));
}
}</pre>
A questo punto proviamo il programma implementando il metodo main del nostro progetto:<br />
<pre class="brush: csharp;">//C#
//Istanzio la classe per creare i dipendenti
PersonaleAziendaCreator creaDipendenti = new ConcreteCreatorDipendente();
//Istanzio la classe per creare i datori di lavoro
PersonaleAziendaCreator creaDatori = new ConcreteCreatorDatoreDiLavoro();
//Unisco il gruppo di persone create
List<persona> persone = new List<persona>(creaDatori.Persone.Union(creaDipendenti.Persone));
//Per ogni persona scrive a video il tipo di oggetto
//della persona e il nome
foreach (Persona persona in persone)
{
Console.WriteLine("Persona (di tipo: {0}): {1}", persona.GetType(), persona.Nome);
}</persona></persona></pre>
<pre class="brush: vb;">'VB.NET
'Istanzio la classe per creare i dipendenti
Dim creaDipendenti As PersonaleAziendaCreator = New ConcreteCreatorDipendente()
'Istanzio la classe per creare i datori di lavoro
Dim creaDatori As PersonaleAziendaCreator = New ConcreteCreatorDatoreDiLavoro()
'Unisco il gruppo di persone create
Dim persone As New List(Of Persona)(creaDatori.Persone.Union(creaDipendenti.Persone))
'Per ogni persona scrive a video il tipo di oggetto della persona e il nome
For Each persona As Persona In persone
Console.WriteLine("Persona (di tipo: {0}): {1}", persona.[GetType](), persona.Nome)
Next</pre>
<pre class="brush: java;">//Java
//Istanzio la classe per creare i dipendenti
PersonaleAziendaCreator creaDipendenti = new ConcreteCreatorDipendente();
//Istanzio la classe per creare i datori di lavoro
PersonaleAziendaCreator creaDatori = new ConcreteCreatorDatoreDiLavoro();
//Unisco il gruppo di persone create
java.util.ArrayList<Persona> persone = new java.util.ArrayList<Persona>(creaDatori.getPersone().Union(creaDipendenti.getPersone()));
//Per ogni persona scrive a video il tipo di oggetto della persona e il nome
for (Persona persona : persone)
{
System.out.println("Persona (di tipo: {0}): {1}", persona.getClass(), persona.getNome());
}</pre>
<pre class="brush: cpp;">//C++/CLI file .cpp
//Istanzio la classe per creare i dipendenti
PersonaleAziendaCreator ^creaDipendenti = gcnew ConcreteCreatorDipendente();
//Istanzio la classe per creare i datori di lavoro
PersonaleAziendaCreator ^creaDatori = gcnew ConcreteCreatorDatoreDiLavoro();
//Unisco il gruppo di persone create
List<Persona^> ^persone = gcnew List<Persona^>(creaDatori->Persone->Union(creaDipendenti->Persone));
//Per ogni persona scrive a video il tipo di oggetto della persona e il nome
for each (Persona ^persona in persone)
{
Console::WriteLine("Persona (di tipo: {0}): {1}", persona->GetType(), persona->Nome);
}</pre>
<pre class="brush: cpp;">//C++ Nativo .cpp
//Istanzio la classe per creare i dipendenti
PersonaleAziendaCreator *creaDipendenti = new ConcreteCreatorDipendente();
//Istanzio la classe per creare i datori di lavoro
PersonaleAziendaCreator *creaDatori = new ConcreteCreatorDatoreDiLavoro();
//Unisco il gruppo di persone create
std::vector<Persona*> persone = std::vector<Persona*>(creaDatori->Persone->Union(creaDipendenti->Persone));
//Per ogni persona scrive a video il tipo di oggetto della persona e il nome
for (std::vector<Persona*>::const_iterator persona = persone.begin(); persona != persone.end(); ++persona)
{
std::cout << "Persona (di tipo: " << (*persona)->GetType() << "): " << (*persona)->Nome << std::endl;
}</pre>
<pre class="brush: py;">#Python
#Istanzio la classe per creare i dipendenti
creaDipendenti = ConcreteCreatorDipendente()
#Istanzio la classe per creare i i datori di lavoro
creaDatori = ConcreteCreatorDatoreDiLavoro()
#Unisco il gruppo di persone create
persone = list(set(creaDipendenti.getPersone()) | set(creaDatori.getPersone()))
#Per ogni persona scrive a video il tipo di oggetto della persona e il nome
for persona in persone:
print "Persona (di tipo: {0})): {1}".format(type(persona), persona.Nome)</pre>
<pre class="brush: js;">//Javascript
//Istanzio la classe per creare i dipendenti
var creaDipendenti = new Netrudy.Patterns._concreteCreatorDipendente();
//Istanzio la classe per creare i datori di lavoro
var creaDatori = new Netrudy.Patterns._concreteCreatorDatoreDiLavoro();
//Unisco il gruppo di persone create
var persone = creaDipendenti.get_persone().concat(creaDatori.get_persone());
//Per ogni persona scrive a video il tipo di oggetto della persona e il nome
var $enum1 = ss.IEnumerator.getEnumerator(persone);
while ($enum1.moveNext()) {
var persona = $enum1.current;
ss.Debug.writeln(String.format('Persona (di tipo: {0}): {1}', Type.getInstanceType(persona), persona.get_nome()));
}</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-86043875200462382212011-12-05T16:30:00.000+01:002011-12-05T16:50:56.788+01:00Istallazione Windows 8 Developer Preview with developer tools 64bit su VMWare Workstation 8Per prima cosa scarichiamo l’immagine ISO da qui: <a href="http://msdn.microsoft.com/en-us/windows/apps/br229516" target="_blank" title="Immagini ISO Windows 8">Windows 8 Developer Preview with developer tools English, 64-bit (x64)</a><br />
Avviamo VMware Workstation, e selezioniamo dal menu file, nuova, virtual machine, in questo modo partirà il wizard di creazione.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6isYlsBHvQN1MBUj5VnllaaDnoc8cTpKJvmsZF6cSCrs0q5eT42noG76EHdkvaeC0rnecn0s1xUMhx88RU8WJSRjAoOF6IKytIWeVya042i3HZzHXQBrbh_DDTfn2Kq6H1lkutA7xdJAf/s1600-h/05-12-2011%25252011-08-22%25255B2%25255D.png"><img alt="05-12-2011 11-08-22" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUtc11pz92k2DNl8KRLV2_Akz7dAHBnFafKjNodOovyaDQlEuZYqKM-7DUkWAMx86KqEwVUe2X37bC_zhLpzOTnmQZ3cPMffdgtH-ms_YZv3OcZqFwLxWbxwIWI6VQ_K7Ii3u8olJF4Y2L/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 11-08-22" width="244" /></a></div>
Scegliamo tipical e premiamo next.<br />
A questo punto selezioniamo installer disk image file (iso) e selezioniamo il percorso del file dove si trova la nostra immagine scaricata:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWVHuOREu_zp3UsGrXhnkOAqprpkCzAspFMFUMYJ1RpdVvmT3_m3Sfb2SX7CyC7rzOLSiK8a-SYi2atsgIcqhDgDjWmd9DYNXFClgFPxeA8sWctifaCsh92DyilZVLrv4HEBSBVmCNQSUy/s1600-h/05-12-2011%25252015-56-04%25255B2%25255D.png"><img alt="05-12-2011 15-56-04" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSGAt19PZ5C51ayMcTduWcUgKAxcfDbpAKMzaqwNO9gIwbxLSGcxMweN0kln2A-9y2EJExlwKX7Om4gU5kzHSQ3wE9tmXXpU2PwEqKowWpUn_NjIAM3K4GyUajOoHTfP8g7OAewHsC-OqR/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 15-56-04" width="244" /></a></div>
Nella fase successiva selezioniamo Miscrosoft Windows dalla lista dei sistemi operativi e Windows 7 64-bit dalla lista delle versioni:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmqEFwW8kTGcuMnYeD-BX7SpU8ULvbaqU_vTJI8G8JilGqTWVeC0VXiaaZSxZQh9lKD29kSvdUOGGsQc9p1cHN35iyIom-68EKDZPK-ShyL34cnToHXySOoC-yAHS7rpZR8RYYjR28gn2s/s1600-h/05-12-2011%25252015-58-14%25255B2%25255D.png"><img alt="05-12-2011 15-58-14" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsnJzrm8m2aLzUsRQr4FAPlZjJBiWUZxpZTjep5HDofNNkHWkh8ejvu72OuNUKqlmCevKcGyU-XxUZeSEJiQA26hOLU7BoourpvVyjUCYAyn5BjBsdz2YyhedH5RyLErv1IjRC8zO7h3ee/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 15-58-14" width="244" /></a></div>
Lasciamo libero il product key di windows e scriviamo una nostra password:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHklqnZt8gkW9uXwQrmhD08HFwSHTRHh8QxXuM6oQ7pXULdEuBC-IDSaru2Fo8mpsWfS-bEJAcN7bGMsDCyMXvUvsysanVKuls_Dy5_LYQhsosZyi-0BhGIs8gIbn11aLmBl6NuRJoFxEA/s1600-h/05-12-2011%25252016-00-51b%25255B2%25255D.png"><img alt="05-12-2011 16-00-51b" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtDvPcvynm8x8tI2mXBFGLwsJWbJ1T5zz1wSJF-q_ks5QdcK9glZpQMH03e37nllFwb6KVeAXkb6XQmLtGYT82N0LCtOQCcBg_wR3p6l5U-ddHoBXNV6FzgWsVg_KS_hS8FrHYMUgFRCN/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-00-51b" width="244" /></a></div>
Diamo un nome alla nostra macchina virtuale e selezioniamo un percorso dove verranno salvati i files:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfTZqJY11x1ZsvVvNlRMHaWm3O0TBoKjqbc_MOXhig4jln2gYR0efOdMBTP4PUBLoxETUjWkcZRvJSsIgnj30w59t6NjAQE_o5fauMfQhTNFA4xwIbLmPCJ4QhFp6-uWnhqjGYjOB2TFhJ/s1600-h/05-12-2011%25252016-05-41%25255B2%25255D.png"><img alt="05-12-2011 16-05-41" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipqXK3ZZya76m9f08b1sf_2-KWxPXYzg16zO44TjP_KG32N2m5CcgzJJ1T78oaq9kUvARuCKXAxP7-aovb04uq7uYoh5WMuyizcgeyHom2EM_Qw_0bRB0BVFIGEzuhMmippJp_1TzbKfoP/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-05-41" width="244" /></a></div>
Selezioniamo la quantità di memoria del disco rigido virtuale, desiderata (io avendo spazio ho messo 40gb, ma credo bastino 20), e se vogliamo che il disco sia diviso in più files o su uno solo:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMQ9L45U9YOQx98PO8-mvqHCNAqOKld7YHmNpwzb46IC-gVnwB6Fvl3exuMxf_CQY031eMyIRwcXiNwst3FKtWDXSpqZ-9SUa5RVr5c6uYKEojhDdpMtM-sHaYN9jfoboDhOhJGbJ4AkYk/s1600-h/05-12-2011%25252016-06-25%25255B2%25255D.png"><img alt="05-12-2011 16-06-25" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie84oSjOR9XHLiNjHDzeaiU57b7OLDJCQS9O2tWcg___3n_DC1AaduHvtBzCbbKBIMk5CX9He61E9clogzMEGaSnFViv-quPzvouybR-ARyEfNXkheIM0d_oUfi5sow2rV2Z10SAMNS0UK/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-06-25" width="244" /></a></div>
A questo punto rileggiamo se abbiamo impostato tutto correttamente e premiamo Finish per fare partire la macchina virtuale.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZFUeiGHkxHABQgogcf3B9MP95jBRtqXY_decYnkAgF96UAkeRNxKbLpiUIieOZ6wso7iomE0MjGY2FBqXgzkpM-WQ2L4dIjiX79kV-npjWFXzrmJcNhySuZ8y0uwWIPcm6oJbMedDvo4b/s1600-h/05-12-2011%25252016-07-22%25255B2%25255D.png"><img alt="05-12-2011 16-07-22" border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPuWgZfd1wfh76b2t0efak-g5IArAmWCDhPy3u9u5tS_SJ0LZ7A2El-ZR2yW-QxEbmiOLrUaopf6FfyL8NhtO3VUXNd_lmepRVHacjPc0djd934UG3149bo0RXWquvPYtyAm5qigdZ2Tqu/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-07-22" width="244" /></a></div>
<br />
Se è andato tutto bene dovreste vedere partire l’installazione di Windows 8:<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBW3YJ1vTQk9qMul2CN13QNhBe2-BnclbOoPZywFbhagHgj4IRAAT-gj5zBvVjFW3f8aK-F3uqMi8CQmoKtcvgnHXTgxovG37tyFc-NTYjaluXPobErcUoINxvlhc-ARgcskCjQgfaYn-/s1600-h/05-12-2011%25252016-08-33%25255B2%25255D.png"><img alt="05-12-2011 16-08-33" border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit3o4oRFumxqPwUKPy0aymDTUEWqlKYtCABkzNE20NqYOMcGVp4m-oivWeqCM9uoBUzY5CggpUg3lJqTwt75X_66n12KLtzUO_dOxUXss7X4oDkg1k_NQgvOmc-84zZjo0BiuiLsuHPbYs/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-08-33" width="244" /></a></div>
Ad un certo punto però otterrete questo messaggio d’errore:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Vp3co88g6mevXRmhnhuCHlPaq2mwrkZhNUVImCmLCUlzVHtZBrYYS3Py-GZk0Kzl6gorLcafyrf8Umj8DkhcaEgmcc_CZgfsTjkojP1OkyUSPDCdD5uRQkJwStIzUJr5ALl3uZOziv8m/s1600-h/05-12-2011%25252016-10-14%25255B2%25255D.png"><img alt="05-12-2011 16-10-14" border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVO35L8tvrBoKPnNpC4sUK89j5Yvqj_74-1d_yDk2ruDifvou2JHhEjyjEihqEtMcOBi6w-g5Gu4xVCjYFNZY0usbRYieX4pqLY3-Ncw1k2qM0trizIkVtXpxOMrA6d_D0NYlOmCKTl3AN/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-10-14" width="244" /></a></div>
Spegnete la macchina virtuale, andate nelle menu delle impostazioni (VM –> Settings), e rimuovete il Floppy dall’elenco dei devices:<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzaWzh7Kis-_tAL2KXs86AoZLffJ-0MCrSImOhyphenhyphenaTaly3cLletttW-YJ_twobxxo0g50crMVb7a1bMgZ_kh-jZpPYs1tjPKhcTcUfdB_tLhY8gPPyplHIS_Hl9fU93NNLavWmc2ymMqWYv/s1600-h/05-12-2011%25252016-16-25%25255B2%25255D.png"><img alt="05-12-2011 16-16-25" border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMYHZYqKVPKnxsLkRz3GHK-oulTctbd0rxEYlHbtfd2BXRUK1-BnoVhyphenhyphendZSgLUmUB_s8NoD3Gx8p2u0PME1s5q-xngwnEbneVpDI9pFt3AWBVhknbkS3uIp-TSJWXBdMOHKbLNPTuV958h/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-16-25" width="244" /></a></div>
Date OK e riavviate la macchina virtuale.<br />
Ora l’installazione partirà correttamente e arriverete alla finestra di selezione delle opzioni internazionali del sitema operativo.<br />
Come prima opzione lasciamo “Language to install”: English (è anche l’unica selezionabile).<br />
Come “Time and currency format”, possiamo impostare Italiano.<br />
Come “Keyboar or input method”, possiamo impostare Italiano (se abbiamo una tastiera italiana naturalmente).<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3AiUOaAq8ZJoJRWQ_IPkMP2YJ7hWiaNAuTAlCVnFPHpr0z9qSmdTBYrPM9KW7SscvJ9N3KwAvTXTdJPdZk5RyB09Vx5_UcQsw1r396XVcQkPtVnoyDENEJspKI8cwbaXErcDqzkFVHIYe/s1600-h/05-12-2011%25252016-20-17%25255B2%25255D.png"><img alt="05-12-2011 16-20-17" border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQWbeY2e1O7RTMkW7SNoHgUur_fEdqQSnwLB376zut7HU2qafUFJGT9UGn-3ukJcjQYIfSOQ0ekq3j1DMMtgqCIQd6i9HArWdm0DLKjQVQrTdt6UdE34MHIfZqGdEDvIp9lKxzKMokfR10/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="05-12-2011 16-20-17" width="244" /></a></div>
Portiamo a termine i vari passaggi successivi come sempre e abbiamo finito.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-43217890572259515162011-12-05T12:42:00.001+01:002011-12-05T15:01:19.713+01:00Libri gratis per programmatoriQui, trovate i libri della rivista IO Programmo, degli ultimi 2,3 anni, formato PDF: <a href="http://punto-informatico.it/PILibri/Libri.aspx?id=1" target="_blank">“Libri di programmazione gratis”</a>, c'è un po’di tutto per .NET, Java, C++, Python, SQL Server.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5sGNV8ojOFt9BePin5ZTONNWH9Z8qZAs2y859ADRmRba82tIXeeHgjlYgzdd-iVENjb08n7g3AYfRseEVeIiYBluS9Wsq6StwzYKgOu2GCaj2Lzbkush0piDdVpXVg4A1PgnMKE4PUOp/s1600/libri.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5sGNV8ojOFt9BePin5ZTONNWH9Z8qZAs2y859ADRmRba82tIXeeHgjlYgzdd-iVENjb08n7g3AYfRseEVeIiYBluS9Wsq6StwzYKgOu2GCaj2Lzbkush0piDdVpXVg4A1PgnMKE4PUOp/s320/libri.jpeg" width="320" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-1906194044408667992011-12-05T12:41:00.000+01:002011-12-14T10:30:30.164+01:00Conversione di un numero in colonna ExcelEcco il codice per convertire un numero nell'indice alfanumerico di una colonna Excel:
<br />
<pre class="brush: csharp;">public static class ExcelFunc
{
public static string ConvertToLetter(int colIndex)
{
string ret = string.Empty;
var alpha = colIndex/27;
var remainder = colIndex-(alpha*26);
if (alpha > 0)
ret = Char.ConvertFromUtf32(alpha+64);
if (remainder > 0)
ret += Char.ConvertFromUtf32(remainder+64);
return ret;
}
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-23280198992954904742011-12-05T12:39:00.001+01:002011-12-14T11:29:12.094+01:00Convertire un click in doubleclickUtilzzando un controllo di terze parti, mi sono accorto che il suo produttore non aveva implementato l’evento double click in un punto che secondo me era essenziale, allora con qualche riga di codice mi sono trasformato un evento click in double click:<br />
<pre class="brush: csharp;">
private DateTime mTimeToDoubleC = DateTime.Now;
private void button1_Click(object sender, EventArgs e)
{
DateTime adesso = DateTime.Now;
if ((adesso - mTimeToDoubleC) < new TimeSpan(0, 0, 0, 0, SystemInformation.DoubleClickTime))
{
//Esegui il metodo per il double click...
}
else
{
//Esegui il metodo per il click normale...
}
}
</pre>
Come si può vedere utilizzando la proprietà SystemInformation.DoubleClickTime ottengo un double click perciso come impostato nel sistema.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-10496801336304175552011-12-05T12:38:00.000+01:002011-12-05T12:38:16.270+01:00Windows Live Mail – Correttore in ItalianoEcco come fare per aggiungere la correzione ortografica in Italiano a Windows Live Mail.<br />
Requisiti:<br />
aver installato MSOffice con incluso controllo ortografico e grammaticale in Italiano.<br />
<br />
Cosa fare:<br />
creare una directory 'prf0010' (notare il codice 0010. Se fosse stato per la lingua tedesca sarebbe dovuta essere 'prf0007', per l'inglese 'prf0009' etc.) in 'C:\Users\\AppData\Local\Microsoft\Windows Live Mail\Proof'<br />
creare la directory '1' dentro prf0010<br />
copiare i file 'MSSP3IT.DLL' e 'MSSP3IT.LEX' presenti di norma in 'C:\Program Files\Common Files\microsoft shared\Proof' dentro 'C:\Users\\AppData\Local\Microsoft\Windows Live Mail\Proof\prf0010\1\'<br />
creare un file di testo in 'prf0010\1\' da rinominare poi 'spell.ini' (notare l'estensione INI) con dentro (senza lasciare righe vuote all'inizio):<br />
Codice:<br />
<pre>
[Spellchecker]
Engine=MSSP3IT.DLL
Lex=MSSP3IT.LEX
Lang=1040(premere RETURN per creare una nuova linea vuota subito alla fine di '...1040' e salvare il file)
</pre>
Riassumendo alla fine avrete: in C:\Users\\AppData\Local\Microsoft\Windows Live Mail\Proof\prf0010\1\ i 2 file (DLL e LEX) + il file spell.ini.<br />
Fine.<br />
A questo punto riaprendo WLM e andando alla pagina del correttore ortografico nelle preferenze di WLM vedrete apparire finalmente l'Italiano installato (e anche la spunta su 'controlla ortografia nella lingua corrente di input' per cambiare lingua e vocabolario al volo tramite la Barra delle lingue di Vista funzionerà a dovere).Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-61019746537229825782011-12-05T12:34:00.001+01:002011-12-14T11:29:01.342+01:00Evento minimize e forms ridotti a icona nella TrayEcco il codice per gestire una form che passa dalla visualizzazione normale alla tray bar e dopo avere fatto doppio click sull’icona ritorna alla posizione iniziale in primo piano:<br />
<br />
Come prima cosa aggiungiamo a design il componente “NotifyIcon” e lo chiamiamo “notifyIcon”.<br />
Impostiamo la proprietà visible a false.<br />
Siccome non abbiamo un evento minimized, implementiamo il seguente codice usando l’evento Resize della form:<br />
<pre class="brush: csharp;">
private void FrmMain_Resize(object sender, EventArgs e)
{
if (System.Windows.Forms.FormWindowState.Minimized == WindowState)
{
this.Hide();
notifyIcon.Visible = true;
}
}
</pre>
Ora implementiamo il seguente codice per l’evento DoubleClick sulla notifyIcon e il gioco è fatto:<br />
<pre class="brush: csharp;">
private void notifyIcon_DoubleClick(object sender, EventArgs e)
{
this.Show();
this.WindowState = FormWindowState.Normal;
notifyIcon.Visible = false;
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-6492615941638248992011-12-05T12:31:00.001+01:002011-12-14T11:28:46.579+01:00Localizzare i mesi dell'annoPer ottenere i nomi dei mesi dell'anno localizzati in base alla lingua corrente del vostro programma potete usare questa semplice funzione:
<br />
<pre class="brush: csharp;">
//C#
int iMonth = 1; //Numero intero che corrisponde al mese da localizzare (in questo caso Gennaio)
string month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(iMonth);
</pre>
<pre class="brush: vb;">
'VB.NET
Dim iMonth As Integer = 1
'Numero intero che corrisponde al mese da localizzare (in questo caso Gennaio)
Dim month As String = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(iMonth)
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-681001252699729419.post-35812409788753413572011-12-02T02:10:00.001+01:002011-12-02T02:14:37.599+01:00Disabilitare il blocco degli script per le risorse locali di Internet ExplorerSe aprite una pagina html da un file di risorse locale del vostro disco (Es.: "C:\temp\miofile.htm") che contiene del codice javascript con Internet Explorer, vi appare un fastidiosissimo messaggio che dice: "Per facilitare la protezione, è stato impedito a questa pagina web di eseguire script o controlli ActiveXc potrebbero accedere al computer. Fare click qui per ulteriori opzioni...". A questo punto cosa fate? Fate click e selezionate "Consenti contenuto bloccato..". Tutto ok, peccato che la prossima volta che tornate su quella pagina dovete ripetere l'operazione.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIj_3vp1CemV5hFty-YQujfvFjsLrIX86zF067RmKW1BgJoOsq_oTEegURNCe_4D2aoSWN_b3YZmKSDxMven8xk3V9VJ5l6eopcH8AU7b64D2rPr7ELVSpWWlgXE1tJUyEHXwpf7RzLkQ8/s1600/o_ProtezioneScript.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIj_3vp1CemV5hFty-YQujfvFjsLrIX86zF067RmKW1BgJoOsq_oTEegURNCe_4D2aoSWN_b3YZmKSDxMven8xk3V9VJ5l6eopcH8AU7b64D2rPr7ELVSpWWlgXE1tJUyEHXwpf7RzLkQ8/s320/o_ProtezioneScript.gif" width="320" /></a></div>
<br />
<div style="background-color: white; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; margin-bottom: 14px;">
<br /></div>
<div style="background-color: white; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; margin-bottom: 14px;">
Se siete uno sviluppatore web e usate la funzione di "Preview" con un software tipo Microsoft Expressions, potete capire come ciò dopo 2, 3 volte cominci ad essere insopportabile!</div>
<div style="background-color: white; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; margin-bottom: 14px;">
Dopo un po' di ricerche e tentativi ho trovato il flag che vi da una mano: Da menu "Opzioni internet" di Internet Explorer selezionate l'etichetta "Avanzate", scorrete fino alla sezione "Protezione" e spuntate il flag "Consenti l'esecuzione di contenuto attivo in file di Risorse del computer*" e premete OK. Adesso riavviate il browser e potete dire addio al messaggio.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlr_31zgPtPvkrhJ78LXL_8fill7KX6Vrh4Er5qG47M1aMUoccl-dcBo9KORByzvg7no6Y3OeC2vd0lfCjgluJZ5zc97GqmrMd9obXDN8g7NFrXu6WfowLlSSratrt4Zl9PxWd8W2dh6pr/s1600/o_OpzioniProtezione.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlr_31zgPtPvkrhJ78LXL_8fill7KX6Vrh4Er5qG47M1aMUoccl-dcBo9KORByzvg7no6Y3OeC2vd0lfCjgluJZ5zc97GqmrMd9obXDN8g7NFrXu6WfowLlSSratrt4Zl9PxWd8W2dh6pr/s320/o_OpzioniProtezione.gif" width="232" /></a></div>
<div style="background-color: white; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; margin-bottom: 14px;">
<br /></div>Unknownnoreply@blogger.com0