Archive for Maggio 2015
Installazione di Office 2016 e primo sguardo
E’ da poco disponibile la Preview di Office 2016.
In questo articolo vedremo i passi per l’installazione e daremo uno primo sguardo alle novità più importanti.
Possiamo scaricare l’eseguibile da questo link: https://products.office.com/en-us/office-2016-preview
La versione disponibile mentre scriviamo questo articolo è la 16.0.3930.1008.
Una volta scaricato, lo lanciamo. La prima schermata che apparirà è questa:
Questo arancione già mi piace.
L’installazione poi continuerà in background.
Una volta finita l’installazione, troviamo il pacchetto nel menù Tutti i programmi.
Proviamo ad aprire Excel.
Dobbiamo attivare prima il prodotto:
Inseriremo un Product key, che troviamo in questo link:
https://products.office.com/en-us/office-2016-preview#howToGet
e concludiamo l’installazione.
Poi la solita finestra dei tipi di file
Ed ecco come si presenta Excel:
Vedete che nel Ribbon abbiamo delle schede nuove (sul pc c’è installato Dynamic NAV).
Una delle cose belle notate “al volo” è che può connettersi ai nostri progetti in TFS per avere la lista degli items aperti di un progetto, i bug etc etc.
Nei successivi articoli proveremo questa e altre nuove funzionalità. Non dimenticate di seguirci e mettere il blog fra i vostri preferiti e di dare uno sguardo a www.crystalweb.it
Articolo scritto da Piero Sbressa (@pieer11) e Carmelo La Monica, Microsoft Contributor (http://community.visual-basic.it/carmelolamonica/default.aspx)
Leggi l'articolo intero | Make a Comment ( None so far )Visual Studio 2015 RC
Alla Build 2015, consueto appuntamento annuale dove Microsoft presenta le novità per gli sviluppatori, è stata annunciato il rilascio di Visual Studio 2015 RC. Noi l’abbiamo scaricata e installata.
Il link alla pagina per il download è questo: https://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs?CR_CC=200626829
Noi abbiamo scaricato la Enterprise e useremo questa.
Appena scaricata la ISO, la montiamo e lanciamo il setup.
La prima schermata che appare è questa:
Scegliamo l’installazione personalizzata per vedere le opzioni nascoste dall’installazione tipica.
Selezioniamo quindi tutte le opzioni e poi le proveremo.
La successiva schermata è questa:
Procediamo quindi all’installazione vera e propria.
E finalmente dopo diverse ore ha finito:
Riavviamo quindi il computer e proviamo subito qualcosa.
Prima di creare qualcosa di nuovo, c’è da dire che progetti creati con le CTP non sono compatibili.
Vediamo adesso un nuovo progetto Windows Phone Universal App.
Come possiamo vedere, non c’ è il template “Windows 10”, ma è diventato Windows –> Windows Universal, mentre il “vecchio” Universal App di Windows 8.1 è diventato “Windows 8”. C’ è stato insomma una rinomina dei vari Template.
Apriamo quindi il Windows (ex Windows 10):
Creiamo una Blank App.
E come già sappiamo ecco la nostra universal App su Windows 10
mentre su Windows Phone 10 (Emulatori).
Gravità Codice Descrizione Progetto File Riga
Errore Errore: DEP6100 : Durante la fase di avvio ‘Connessione al dispositivo ’48EC04AE-0256-4908-9837-E72AD2191057’. si è verificato il seguente errore imprevisto:
SmartDeviceException – Impossibile trovare il file specificato. App1
Come potete vedere non parte l’emulatore per Windows 10 for Mobile.
Ma non parte neanche sul dispositivo in quanto ottengo questo errore:
Gravità Codice Descrizione Progetto File Riga
Errore Errore: DEP0001 : Errore imprevisto: A Prerequisite for an install could not be satisfied. (Exception from HRESULT: 0x80073CFD) App1
Abbiamo mandato la segnalazione su Microsoft Connect e vi aggiorneremo su come risolverli in un successivo articolo.
Articolo scritto da Piero Sbressa (www.crystalweb.it) e Carmelo La Monica, Microsoft Contributor (http://community.visual-basic.it/carmelolamonica/default.aspx)
Leggi l'articolo intero | Make a Comment ( 2 so far )Chiamate sincrone su Windows Phone
Sappiamo tutti che l’SDK per Windows Phone permette solo chiamate asincrone, in modo che la UI resti sempre funzionante e non bloccandosi mentre scarica i dati da un servizio Web.
E se invece dovessimo aspettare il risultato di una chiamata per avere i dati da mandare ad un’altra chiamata? Ecco che in questo caso sono dolori.
In questo articolo vedremo quindi come effettuare delle semplici chiamate sincrone e aspettare il risultato da un’altra chiamata.
Useremo come esempio un servizio OCR per il riconoscimento dei caratteri da un biglietto da visita e dividendoli per campo Nome, Cognome, Indirizzo etc etc.
Siete curiosi? Partiamo.
Il servizio al quale ci appoggeremo per questo articolo è ABBYY Cloud OCR SDK.
Dobbiamo, prima di usare il servizio, registrare un account. Quello Free permette 50 scansioni e 250 campi, che credetemi, sono veramente pochi se dovete sviluppare un’applicazione di questo genere. Noi per i test, abbiamo dovuto creare diversi account.
Una volta che abbiamo registrato l’Account, inserendo credenziali e generalità, dobbiamo poi creare un’app. Il nome la decidiamo noi, la password ci verrà recapitata via email all’indirizzo con il quale ci siamo registrati.
Una volta che abbiamo questi parametri li andremo a mettere su delle variabili che assieme ad altre, costituiranno la chiamata da fare al servizio.
Scarichiamo il progetto Demo e l’SDK da questo link: http://ocrsdk.com/documentation/code-samples/WindowsPhone.zip.
Questo esempio non supporta il riconoscimento campo per campo, funzionalità che andremo ad implementarla in questo articolo.
L’operazione si compone di tre passaggi:
1) invio della foto che contiene i dati del biglietto da visita e delle credenziali di accesso
2) invio del task ID risultante dal punto 1
3) invio dell’URL risultante dal punto 2
Per il punto 1, l’URL sarà qualcosa di simile a questo:
al quale passare anche username e Password per l’autenticazione HTTP.
Il metodo è POST.
In un form HTML il codice sarebbe questo:
<form action="http://username:password@cloud.ocrsdk.com/processBusinessCard" method="post" enctype="multipart/form-data">
<input type="text" value="English,French,German,Dutch,French,Italian,PortugueseStandard,Spanish,Swedish" name="language">
<input type="text" value="true" name="xml:writeFieldComponents">
<input type="text" value="xml" name="exportFormat">
<input type="text" value="photo" name="imageSource">
<input type="text" value="true" name="correctSkew">
<input type=’file’ name="fileContents" id="image" accept="image/jpeg, image/png"/>
<input type="submit" value="UPLOAD CARD">
</form>
Il file che inviamo è questo:
Il codice C# da implementare in una Windows Phone App è questo:
public Processing()
{
InitializeComponent();
RestServiceClient syncClient = new RestServiceClient();
// To create an application and obtain a password,
// register at http://cloud.ocrsdk.com/Account/Register
// More info on getting your application id and password at
// http://ocrsdk.com/documentation/faq/#faq3
// Name of application you created
syncClient.ApplicationId = "ApplicationId";
// Password should be sent to your e-mail after application was created
syncClient.Password = "password";
abbyyClient = new RestServiceClientAsync(syncClient);
//abbyyClient.UploadFileCompleted += UploadCompleted;
abbyyClient.TaskProcessingCompleted += ProcessingCompleted;
abbyyClient.DownloadFileCompleted += DownloadCompleted;
}
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
var imageName = "Imagehomepage.png";
BitmapImage image = new BitmapImage(ResolutionHelper.GetImagePath(imageName));
imgHomePage.Source = image;
Stream imageStream = AppData.Instance.Image;
if (imageStream == null)
return;
string localPath = "image.jpg";
saveImageToFile(imageStream, localPath);
ProcessingSettings settings = new ProcessingSettings();
settings.SetLanguage("English,French,German,Dutch,French,Italian,PortugueseStandard,Spanish,Swedish");
settings.OutputFormat = OutputFormat.xml;
abbyyClient.ProcessBusinessCardAsync(localPath, settings, settings);
}
Questo è invece il codice della chiamata:
public void ProcessBusinessCardAsync(string filePath, ProcessingSettings settings, object userState)
{
BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler((sender, e) =>
{
Task task = null;
try
{
task = _syncClient.ProcessBusinessCard(filePath);
UploadCompletedEventArgs uploadArgs = new UploadCompletedEventArgs(task, userState);
onUploadFileCompleted(sender, uploadArgs);
// Wait until task finishes
while (true)
{
task = _syncClient.GetTaskStatus(task.Id);
if (!task.IsTaskActive())
{
break;
}
Thread.Sleep(1000);
}
Questa è invece il codice che prepara la chiamata vera e propria:
public Task ProcessBusinessCard(string filePath)
{
string url = "http://cloud.ocrsdk.com/processBusinessCard?language=English&exportFormat=xml&imageSource=photo&correctSkew=true&xml:writeFieldComponents=true";
try
{
// Build post request
WebRequest request = WebRequest.Create(url);
setupPostRequest(url, request);
writeFileToRequest(filePath, request);
XDocument response = performRequest(request);
Task task = ServerXml.GetTaskStatus(response);
return task;
}
catch (System.Net.WebException e)
{
throw new ProcessingErrorException("Cannot upload file: " + e.Message + ". Please make sure that application Id and password are correct.", e);
}
}
Andiamo ora a vedere il codice che gestisce la risposta:
public Task GetTaskStatus(TaskId task)
{
string url = String.Format("{0}/getTaskStatus?taskId={1}", ServerUrl,
Uri.EscapeDataString(task.ToString()));
WebRequest request = WebRequest.Create(url);
setupGetRequest(url, request);
XDocument response = performRequest(request);
Task serverTask = ServerXml.GetTaskStatus(response);
return serverTask;
}
Avremo quindi un XML che sarà scaricato nella IsolatedStorage e da questo XML serve un parametro che comporrà la seconda url:
string url = String.Format("{0}/getTaskStatus?taskId={1}", ServerUrl,
Uri.EscapeDataString(task.ToString()));
Ecco un esempio di questo primo XML:
<response>
<task id="d49e7d8c-ee64-4cdf-b622-b5dda6ff2242" registrationTime="2015-04-24T04:55:15Z" statusChangeTime="2015-04-24T04:55:15Z" status="Queued" filesCount="1" credits="0" estimatedProcessingTime="5"/>
</response>
Il parametro che ci interessa è il task id.
La seconda chiamata avrà quindi un url simile alla seguente: http://cloud.ocrsdk.com/getTaskStatus?taskId=d49e7d8c-ee64-4cdf-b622-b5dda6ff2242 da passare in GET.
Questo ci restituirà un altro file XML che conterrà l’URL del file finale con i campi del nostro biglietto da visita.
Ecco un esempio di tale file:
<response>
<task id="d49e7d8c-ee64-4cdf-b622-b5dda6ff2242" registrationTime="2015-04-24T04:55:15Z" statusChangeTime="2015-04-24T04:55:20Z" status="Completed" filesCount="1" credits="0"resultUrl="https://ocrsdk.blob.core.windows.net/files/d49e7d8c-ee64-4cdf-b622-b5dda6ff2242.result?se=2015-04-24T15%3A00%3A00Z&sr=b&si=downloadResults&sig=Xrn3XSZ9%2F3w39fjWyeZW%2Bzu9rnJ%2BTqFfMjoz12CHszw%3D"/>
</response>
Di questo ci interesserà l’URL https://ocrsdk.blob.core.windows.net/files/d49e7d8c-ee64-4cdf-b622-b5dda6ff2242.result?se=2015-04-24T15%3A00%3A00Z&sr=b&si=downloadResults&sig=Xrn3XSZ9%2F3w39fjWyeZW%2Bzu9rnJ%2BTqFfMjoz12CHszw%3D
che scaricherà il file xml finale.
Dobbiamo quindi rilevare l’URL dal file scaricato.
public void DownloadResult(Task task, string outputFile)
{
if (task.Status != TaskStatus.Completed)
{
throw new ArgumentException("Cannot download result for not completed task");
}
try
{
if (task.DownloadUrl == null)
{
throw new ArgumentException("Cannot download task without download url");
}
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
if (storage.FileExists(outputFile))
storage.DeleteFile(outputFile);
string url = task.DownloadUrl;
WebRequest request = WebRequest.Create(url);
setupGetRequest(url, request);
using (HttpWebResponse result = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = result.GetResponseStream())
{
// Write result directly to file
using (Stream file = storage.OpenFile(outputFile, FileMode.Create))
{
copyStream(stream, file);
}
}
}
}
}
catch (System.Net.WebException e)
{
throw new ProcessingErrorException(e.Message, e);
}
}
Con l’URL appena calcolato andremo a scaricare un file che conterrà tutti i campi differenti da un biglietto da visita come quello sotto:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" xmlns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd">
<businessCard>
<field type="Mobile">
<value>+39 334 7400969</value>
<fieldComponents>
<fieldComponent type="PhonePrefix">
<value>+</value>
</fieldComponent>
<fieldComponent type="PhoneCountryCode">
<value>39</value>
</fieldComponent>
<fieldComponent type="PhoneCode">
<value>334</value>
</fieldComponent>
<fieldComponent type="PhoneBody">
<value>7400969</value>
</fieldComponent>
</fieldComponents>
</field>
<field type="Email">
<value>pierosbressa@crystalweb.it</value>
</field>
<field type="Web">
<value>www.crystalweb.it</value>
</field>
<field type="Name">
<value>Piero Sbressa</value>
<fieldComponents>
<fieldComponent type="FirstName">
<value>Piero</value>
</fieldComponent>
<fieldComponent type="LastName">
<value>Sbressa</value>
</fieldComponent>
</fieldComponents>
</field>
<field type="Company">
<value>crystalweb</value>
</field>
<field type="Job">
<value>Sviluppo gestionali personalizzati – Siti web e mobile apps – Corsi di informatica e programmazione – Assistenza e riparazione computer</value>
<fieldComponents>
<fieldComponent type="JobPosition">
<value>Sviluppo gestionali personalizzati – Siti web e mobile apps – Corsi di informatica e programmazione – Assistenza e riparazione computer</value>
</fieldComponent>
</fieldComponents>
</field>
<field type="Text">
<value>PIERO SBRESSA
http://www.crystalweb.it
email: pierosbressa@crystalweb.it | mobile: +39 334 7400969
Sviluppo gestionali personalizzati – Siti web e mobile apps – Corsi di
informatica e programmazione – Assistenza e riparazione computer.</value>
</field>
</businessCard>
</document>
Articolo scritto da Piero Sbressa (www.crystalweb.it) e Carmelo La Monica, Microsoft Contributor (http://community.visual-basic.it/carmelolamonica/default.aspx)
Leggi l'articolo intero | Make a Comment ( None so far )