Create Windows bootable USB with macOS

If you need to create a Windows 10 installation USB key using a macOS, you can use these commands to do it simply.
This procedure deletes all data from the USB stick, so be careful 🙂

Open Terminal and use the following commands

diskutil list
diskutil eraseDisk MS-DOS "WIN10" GPT <USB disk>
hdiutil mount <path to the Windows 10 ISO file>
cp -rp /Volumes/<ISO mounting point> /Volumes/WIN10
hdiutil unmount /Volumes/<ISO mounting point>
hdiutil unmount /Volumes/WIN10

About autonomous driving

In these days I’m driving an Infiniti Q30, I find it very pretty and even if it has the wrong wheel drive, it can be fun too 🙂

One of the things I like best about this machine is electronic stuff. One of the driving aids I noticed is the autonomous reading of the road signs. I found the thing interesting also because I immediately looked at it from the standpoint of autonomous driving. Right about this context yesterday I noticed something that I did not like. Passing behind a tourist bus I noticed that the car read as a speed limit, as reported by the heavy vehicle that preceded me in a sticker that reported its maximum speed on the highway. In the picture you can see little because I was driving and I took it at a run. However, you can guess what happens: the car signals me as a speed limit of 80 km / h (instead of the 50 real ones) because the coach in front has a sticker that indicates its maximum speed on the highway in 80 km / h.

I noticed this behavior on several occasions between yesterday and today.

Today this is not a big problem, I guide and I know the limits and I know what directions to follow. But if she were driving, wouldn’t it be too easy to deceive her? And in the case of autonomous driving, any fines, who should pay them? Who was in the car? No, he wasn’t driving! The owner? No, he didn’t even drive! The manufacturer of the vehicle? Who hadn’t passed a patch in time?

I leave you with these doubts and with the invitation to use the right pedal until we can do it 🙂

Wait for an event in a WaterfallDialog

Working on a Skill, I needed to block the execution of a WaterfallDialog while waiting for a specific event to arrive.
The solution is simple and based on the use of EventPrompt. Below I show how to use it.

Register EventPrompt in the constructor

AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
	HelloAsync,
	WaitForEventAsync,
	DoneAsync
}));

AddDialog(new EventPrompt(nameof(EventPrompt), "SampleEvent", Validate));

InitialDialogId = nameof(WaterfallDialog);

Implement the three dialog steps

private async Task<DialogTurnResult> HelloAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
	await stepContext.Context.SendActivityAsync(MessageFactory.Text("Hello :)"), cancellationToken);

	return await stepContext.NextAsync(cancellationToken);
}

private async Task<DialogTurnResult> WaitForEventAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
	return await stepContext.PromptAsync(nameof(EventPrompt), new PromptOptions { Prompt = MessageFactory.Text("Waiting for the event") });
}

private async Task<DialogTurnResult> DoneAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
	await stepContext.Context.SendActivityAsync(MessageFactory.Text("After I receive the event."), cancellationToken);

	return await stepContext.NextAsync(cancellationToken);
}

Implement the event validator

async Task<bool> Validate(PromptValidatorContext<Activity> promptContext, CancellationToken cancellationToken)
{
	var activity = promptContext.Recognized.Value;
	if (activity.Type == ActivityTypes.Event)
	{
		try
		{
			string eventValue = (string)activity.Value;
			
			if(eventValue == "OK")
			{
				return true;
			}
		}
		catch { }
	}

	return false;
}

macOS disable WIFI on logout

I recently started using an Apple notebook as a development laptop. I realized that when I block the screen the WIFI connection goes down. This is a wanted behavior and can be changed using this command:

cd /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources
sudo ./airport en1 prefs DisconnectOnLogout=NO

Obviously you need to replace “en1” with the identifier of your WIFI interface.

Share data from Virtual Assistant to Skill

For some weeks I have been working on a project based on Bot Framework. Things were going well until I found myself in the position of having to share information between a Virtual Assistant and a Skill … Given that it gave me problems and that my requests made on Stackoverflow did not produce answers, I share the solution here.

This post expects the user to be clear what Virtual Assistant and Skill are and has already installed the prerequisites as described here:
https://microsoft.github.io/botframework-solutions/tutorials/csharp/create-assistant/1_intro/

Create a Virtual Assistant using the Virtual Assistant Template and name it SampleVirtualAssistant

Add to the solution SampleVirtualAssistant a new project (the Skill) using the Skill Template and name it SampleSkill

Rebuild the solution.

In the following example I’ll show the commands as execute on my system, where my sources path is C:\Users\emili\source\lab, be aware to replace it with your correct path!

Open PowerShell Core to execute the following commands.

Deploy to Azure the required resources.

cd c:\users\emili\source\lab\SampleVirtualAssistant\SampleVirtualAssistant\SampleVirtualAssistant
.\Deployment\Scripts\deploy.ps1
cd C:\Users\emili\source\lab\SampleVirtualAssistant\SampleSkill\SampleSkill
.\Deployment\Scripts\deploy.ps1

Now we go to work on the code.

In the project SampleSkill, edit the file manifestTemplate.json to add the required slot.

cd C:\users\emili\source\lab\SampleVirtualAssistant\SampleVirtualAssistant\SampleVirtualAssistant
botskills connect --botName SampleVirtualAssistant --remoteManifest "http://<your resource>.azurewebsites.net/api/skill/manifest" --luisFolder C:\Users\emili\source\lab\SampleVirtualAssistant\SampleSkill\SampleSkill\Deployment\Resources\LU\en\ --cs

In the project SampleVirtualAssistant edit the file skills.json to add the required slot.

In the project SampleVirtualAssistant edit the file MainDialog.cs to update the class Events

In the same file, in the method OnEventAsync add the code that handle the event to set the UserEmail

In the project SampleSkill, in the file MainDialog.cs in the RouteAsync method insert this code after the call to PopulateSateFromSemanticAcion

Rebuild all.

Publish the skill and the VA.

Start the chat and test it 🙂

Solitamente amo il mio lavoro

Ho cominciato a programmare a 13 anni in QBasic, poi GWBasic, poi ho installato il mio primo Unix, era uno Xenix e grazie a lui ho scoperto il C. La scintilla è scoccata subito, più per me che per lui a onor del vero: ha fatto di tutto di evitarmi ed ostacolarmi, alla fine però siamo diventati amici! Comunque, dopo quasi trent’anni passati in questo mondo, ho la fortuna di essere ancora immensamente innamorato del mio lavoro. Da qualche giorno sta lavorando ad un progetto che mi piace molto e questo lo considero un grande privilegio.

Diversamente invece vanno le cose su altri fronti. Si perché dopo aver fatto il freelance per circa quindici anni, nel 2011 ho avuto la pessima idea di aprire una società mia. Le premesse c’erano: la richiesta era tanta e io da solo non riuscivo a stare dietro a tutti. Quale idea migliore di aprire un’azienda, mettere insieme un bel gruppo di appassionati e fare qualcosa di qualità? Meglio delle straviste società che fanno body rental e che tanto vanno di moda in questo devastato paese. O no? A vederla oggi, no.

A luglio 2011 ha inizio la mia avventura. Il nome scelto per la società è IT Attitude. Non è una mia idea ma di un mio caro amico (grazie Ric), mi piace e partiamo a mille. Tempo sei mesi e abbiamo già diversi progetti in piedi: uno è per conto di una delle principali aziende di software del pianeta, stanno rifacendo lo sportello di un’importante banca italiana e mi chiedono di partecipare. Accetto e così io e due dei miei (eravamo cinque in azienda all’epoca) ci buttiamo in questo primo progetto enterprise. Oltre a questo portiamo avanti altri progetti minori.

Mentre lavoriamo a questo progetto si apre un’opportunità molto interessante: un progetto in ambito Fraud Management presso UniCredit. Do la mia disponibilità ed entro poche settimane iniziamo a lavorare. Il progetto è interessante e le persone del team del cliente sono molto disponibili. C’è un bel clima e si lavora bene. Il responsabile del team, Andrea, è una persona preparata e molto seria (e simpatica allo stesso tempo). Il progetto si chiama Sniper.

Passano circa due anni e sempre nell’ambito Cyber Security di UniCredit , a fronte di cambiamenti organizzativi, partono nuovi progetti. Noi siamo dentro su Sniper e ci proponiamo di lavorare su nuovi task presso altri gruppi, sempre nella sicurezza. Ci affidano piccoli task e col tempo arriviamo ad essere un importante fornitore per la sicurezza di UniCredit . Iniziamo la procedura per diventare fornitori diretti e al termine della stessa cominciamo a partecipare a gare, all’inizio piccole ma col tempo i volumi crescono. La società, siamo intorno al 2015, ha circa 15 tra dipendenti e consulenti. Le cose sembrerebbero andare bene, o meglio, vanno molto bene dal punto di vista tecnico. Quello che sviluppiamo piace e diventa sempre più core. Dal punto di vista amministrativo invece le cose sono problematiche, adesso racconto perché, prima però dove spiegare come funzionano i processi di procurement in UniCredit.

Quando un utente (che ha potere di acquisto) in UniCredit ha bisogno di qualcosa (un computer, un servizio in abbonamento, un software, una consulenza), il cui costo super una certa soglia (molto basse per la verità), deve interessare una funzione specifica che si occupa di procurare il servizio al miglior prezzo (si chiama appunto procurement). Per fare questo il procurement contatta una serie di fornitore censiti (ed eventualmente quelli che indica l’utente che ha bisogno del servizio) e dopo una trattativa più o meno lunga, acquista quello che ritiene meglio. Da notare che, almeno per quello che ho visto io, le persone che lavorano al procurement non hanno alcuna competenza tecnica, quindi se non indirizzati correttamente, rischiano di comprare non sempre la cosa migliore. Altro aspetto fondamentale, le persone che lavorano al procurement vengono valutate e di conseguenza premiate, in base al risparmio che procurano con il loro operato all’azienda UniCredit.

Questa premessa perché tutti (o comunque in grandissima parte) i problemi che sta avendo la mia società sono da individuarsi in un momento specifico: maggio 2017, quando abbiamo vinto una gara triennale per a fornitura di servizi professionali presso il team di Cyber Security di UniCredit. La cosa era partita con il piede sbagliato e io ad un certo punto avevo avuto la tentazione di lasciare perdere tutto e dedicarmi ad altri progetti che mi si prospettavano, purtroppo mi sono fidato delle mie controparti e viste le dimensioni di UniCredit e la durata del contratto, ho accettato di proseguire. Uno dei fattori che mi ha fatto andare avanti e non lasciare è stato il credito che avevo con UniCredit dovuto ad attività lavorate senza aver la copertura di un ordine. All’epoca la cifra mi sembrava importante e non volevo perdere quei 40000 euro, adesso maledico il giorno che non ho lasciato perdere. Ne avrei persi solo 40000 ma adesso non mi troverei nel casino attuale. Comunque, ormai è andata. Andata male purtroppo. Si perché la gara l’abbiamo si vinta, ma dopo quattro round ed altrettanti ribassi di tariffa: siamo partiti da 450 euro e siamo arrivati a 320. Possono sembrare cifre alte ma per certi professionalità non lo sono. I dipendenti della mia società erano tutti assunti a tempo indeterminato con RAL dai 30 ai 55 mila euro. Insomma la qualità c’era e di conseguenza i costi. Serviva un cliente serio e un progetto importante. Purtroppo sembravano esserlo, invece è stato un massacro.

Scrivere non è il mio forte e perdo il filo, torniamo al racconto di quella gara. Quel giorno mi trovavo a Milano e aspettavo impaziente che si chiudesse il quarto round, pensavo sarebbe stato uno dei giorni più felici della mia vita, quel contratto ci avrebbe permesso di mettere su il laboratorio avviare un progetto che avevo in mente. Volevo usare i soldi che avremmo guadagnato con UniCredit per fare qualcosa di mio. Le cose sono andate diversamente. A novembre 2017 gli ordini finiscono, il cliente però mi rassicura che a gennaio sarebbero arrivati ordini nuovi e che fino ad allora gli avremmo dovuto fare la cortesia di lavorare senza copertura. Decisi di farlo, due mesi senza copertura li avevamo già gestiti in passato (anche se con meno persone) e non potevamo non dare continuità vista la delicatezza del progetto. Un po’ di timore lo avevo visto che negli anni precedenti eravamo già andati sotto di cifre importanti, in questo caso però avevamo un contratto e questo mi sembrava una garanzia.

Arriva gennaio, poi febbraio, poi marzo e dell’ordine non c’è traccia. Il cliente tenta di prendere tempo con scuse sempre più complesse, ad aprile la verità. Sono cambiati gli equilibri nel team di sicurezza e adesso lui non conta più nulla e quindi non sa dove prendere i soldi. Mi promette di impegnarsi a risolvere ma decidiamo di ridurre il numero di persone per limitare i danni. Abbiamo lavorato sui progetti di UniCredit sino a settembre 2018. Gli ordini che sono arrivati non coprivano minimamente le nostre spese e cosi decido di andare a parlare con il nuovo responsabile della funzione. Mi trovo così di fronte ad un personaggio di dubbie capacità che l’unica cosa che riesce a dirmi è che sono situazioni normali che devono essere accettate quando si decide di lavorare con UniCredit. Buono a sapersi, magari prima.

A fine 2018 la mia società, che l’anno prima aveva fatturato poco più di un milione, si trova con un credito di 380000 euro. Arriva qualche ordine che riduce la cifra di circa un terzo, ma ormai il problema è esploso. Cominciamo a ritardare gli stipendi, i dipendenti cominciano ad andare via (per fortuna sono persone valide e in poche settimane trovano tutte una nuova sistemazione) e così restiamo quattro gatti.

Oggi propio è arrivata un’ingiunzione di pagamento da parte di un ex dipendete che avanza due stipendi e il TFR. Non è stata una bella giornata, mi girano parecchio le scatole.

In questi mesi ho cercato in tutti i modi di recuperare questi soldi, purtroppo senza successo. Ieri sono andato dal nostro avvocato per fare un ingiunzione di pagamento, per una somma di tutto rispetto, che UniCredit ha un in primo tempo riconosciuto come dovuti, ma che in seguito a ritrattato.

Questa la situazione semplice. 

C’è poi la parte complicata, quella che ci ha portato a maturare un credito così importante. Si perchĂ©, oltre a fare il nostro lavoro in UniCredit, negli anni si siamo trovati anche a fare da fornitore a 360 gradi del team di security. Loro ci chiedevano qualcosa e noi glielo compravamo. I soldi li recuperavamo (quando non li abbiamo persi) fatturando piĂą giornate a fine mese. Quindi, se c’era da comprare un iPhone da 600 euro, nel timesheet di fine mese venivano aggiunte due giornate in piĂą. Qui però non si parla di un iPhone… In circa due anni, solo di iPhone, ne sono stati comprati piĂą di 10, 5-6 mac book pro e molti vari accessori. Solo per parlare del mondo Apple! 

Le richieste erano le più variegate: storage, computer, servizi, licenze e persino consulenze di altre aziende che noi dovevamo pagare per poi prendere i soldi mesi dopo (senza neanche fare markup). Si perché se uno di UniCredit decide di far lavorare l’azienda di un amico e non può chiamarlo direttamente, cosa fa? Chiama un fornitore accreditato, su cui ha del budget (e quindi potere), e gli dice di far lavorare l’azienda “amica” e poi di aumentare gli importi delle fatture verso UniCredit per rientrare della spesa. Questo ovviamente non è previsto dai processi di UniCredit ed anzi è considerato molto grave come comportamento, ma siamo in Italia e visto che lo fanno tutti, che così si lavora se si vuole lavorare in UniCredit, come un cretino, anche io ci sono stato.

In qualche anno li dentro di aziende di “amici” ne ho viste parecchie ed in molti casi noi abbiamo dovuto rifare il lavoro che qualche azienda “amica” aveva fatto a cavolo, facendoselo strapagare e poi andando via lasciando un cumulo di immondizia al posto del sistema richiesto. Il caso più eclatante furono due progetti che vennero affidati, mi pare per quasi 400000 euro, ad un’azienda che non solo non consegnò mai nulla di decente, ma fu addirittura cacciata per (dicono voci di corridoio) gravi problemi di violazione della privacy. Da notare che quando si cominciò a parlare di quei due progetti, io mi presentai dal cliente con un offerta di 80000 per prenderli tutti e due. Ovviamente l’azienda “amica” vinse la gara. Altrettanto ovviamente, indovina un po’ tre anni dopo da chi andò il cliente per dirgli che VUMA e VMA (i due progetti in questione) andavano rifatti? Da IT Attitude, esatto. Sempre ovviamente, non fu rifatta una gara; come avrebbero potuto infatti giustificare i 400000 regalati all’altra azienda? No, vennero da noi e ci dissero di rifare i due sistemi e di aumentare il computo delle giornate ad ogni fine mese, in modo da coprire i giorni lavorati sui due progetti che andavano portati avanti “di nascosto”.

Una cosa importante mi sono dimenticato! Alla fine la famosa gara venne chiusa a 320 euro/giorno, c’era però un tacito accordo che la tariffa reale sarebbe stata di 400 (invece dei 450 iniziali) e che gli 80 euro di differenza di ogni giorno/uomo l’avremmo bilanciato aggiungendo giornate. Il giochino era noto a tutti. Al cliente che l’aveva proposto pur di farci vincere la gara, a noi ovviamente, ma anche al procurement, a cui alla fine andava bene perché avrebbe potuto comunque segnare un bel taglio sulla tariffa giornaliera. Ovviamente UniCredit avrebbe speso uguale, ma tanto dei soldi di UniCredit non interessa a nessuno, soprattutto ai suoi dipendenti.

Come si sa quando le cose vanno bene tutto funziona, quando cominciano ad andare male tutto va peggio. Ecco così è successo anche a me. Io comunque non mi scoraggio. Questo è l’inizio di un’altra storia.