Grazie Fastweb non mi hai fatto annoiare nella prima domenica post cambio dell'ora... Pensavo di passarla steso sul divano a guardare la luce andare via dietro ai palazzi e invece.
La notizia è che il modem-router in oggetto non funziona correttamente con Windows 8.1 il sintomo è l'impossibilità a navigare con la presa ethernet mentre tutto è normale usando la connessione wi-fi.
La soluzione è cambiare i dns usando quelli di google dns primario 8.8.8.8 e dns secondario 8.8.4.4
Grazie Fastweb per aver scelto un apparato così efficace.
"Nessun bambino si è mai intromesso nel partito repubblicano ed è sopravvissuto per raccontarlo" TB
Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post
lunedì 27 ottobre 2014
martedì 21 ottobre 2014
Why People hate ASP.NET
La risposta più comune è: "Non vogliamo usare asp.net perchè preferiamo prodotti opensource".
Asp.net è un prodotto Microsoft e come tutte le grandi aziende a volte fa scelte criticabili.
Facciamo però chiarezza: asp.net è un prodotto opensource ed è possibile trovare tutto il framework su github. E' possibile sviluppare anche in ambiente mac. La prossima versione non avrà più bisogno di IIS.
venerdì 17 ottobre 2014
Modern Web Development
I buoni propositi per questo nuovo anno di lavoro:
1) Abbandonare definitivamente tricks per funzionare le mie pagine su Internet Explorer 6 o 7, le percentuali di visitatori che ancora usano queste due versioni di Internet Explorer ormai sono infinitesimali inutile e costoso continuare a considerarle. I browser moderni sono veloci nell'interpretare l'html e ancora di più il javascript
2) Html5 e Css3 sono largamente supportati e tante cose che tempo fa richiedevano righe di codice javascript si possono risolvere usando esclusivamente html5 e css3 e se proprio non vengono supportate considerare scenari di degradazione.
3) Per rendere scalabili e riutilizzabili i css ricordare l'esistenza di preprocessori come Less, Sass e Stylus.
4) Utilizzare framework quali Foundation o Bootstrap per realizzare il front end. Garantiscono uniformità visuale e la soluzione semplice ai problemi della responsività della pagina. Usare sempre l'approccio mobile-first.
5) Javascript è diventato il linguaggio imprescindibile per le web application e allora vale la pena implementare soluzioni basate su librerie come Angular o su pattern MVVM con Knockout
6) Non trascurare i sistemi per gestire il versioning e la fase di delivery il classico ftp non basta più.
7) Node.js
8) Infine asp.net vnext se mantiene quello che promette non vorrò più sentire qualcuno che mi parla di php ...
1) Abbandonare definitivamente tricks per funzionare le mie pagine su Internet Explorer 6 o 7, le percentuali di visitatori che ancora usano queste due versioni di Internet Explorer ormai sono infinitesimali inutile e costoso continuare a considerarle. I browser moderni sono veloci nell'interpretare l'html e ancora di più il javascript
2) Html5 e Css3 sono largamente supportati e tante cose che tempo fa richiedevano righe di codice javascript si possono risolvere usando esclusivamente html5 e css3 e se proprio non vengono supportate considerare scenari di degradazione.
3) Per rendere scalabili e riutilizzabili i css ricordare l'esistenza di preprocessori come Less, Sass e Stylus.
4) Utilizzare framework quali Foundation o Bootstrap per realizzare il front end. Garantiscono uniformità visuale e la soluzione semplice ai problemi della responsività della pagina. Usare sempre l'approccio mobile-first.
5) Javascript è diventato il linguaggio imprescindibile per le web application e allora vale la pena implementare soluzioni basate su librerie come Angular o su pattern MVVM con Knockout
6) Non trascurare i sistemi per gestire il versioning e la fase di delivery il classico ftp non basta più.
7) Node.js
8) Infine asp.net vnext se mantiene quello che promette non vorrò più sentire qualcuno che mi parla di php ...
giovedì 26 giugno 2014
Unable to launch the IIS Express Web Server
Un problema che può capitare al lancio di IIS Express.
La causa è la porta utilizzata da un altro processo, per scoprire quale:
netstat -aon | find ":<numerodellaporta>"
L'ultimo numero sulla riga risultante è l'id del processo che sta utilizzando la porta richiesta da IIS.
La causa è la porta utilizzata da un altro processo, per scoprire quale:
netstat -aon | find ":<numerodellaporta>"
L'ultimo numero sulla riga risultante è l'id del processo che sta utilizzando la porta richiesta da IIS.
martedì 31 dicembre 2013
L'html non è un linguaggio di programmazione
Ci si chiede come mai in Italia non nascano idee come Facebook o Google... A parte ovvie questioni dovute alle infrastrutture, alle metodologie di studio universitarie e alle condizioni del sistema bancario che mai finanzierebbe un diciottenne senza babbo plurimiliardario. Poi ci sono gli imprenditori che spesso dimostrano una ignoranza fuori dal comune: "Mio nipote mi ha detto ..."
La formazione via nipote.
La formazione via nipote.
mercoledì 17 luglio 2013
Aggiornare complex type in entity framework 4
1) Caricare il file .edmx nel solution explorer
2) cliccare con il tasto destro in una parte vuota del modello edmx e scegliere aggiorna dal database e infine cliccare su finish
3) aprire il model browser
4) aprire la voce function import
5) selezionare le stored procedure da aggiornare
6) cliccare sul tasto destro e poi edit
7) cliccare su "Get Column Information" e seezionare il complex type da aggiornare e infine cliccare su update....
Tanto per ricordare la cosa la prossima volta
2) cliccare con il tasto destro in una parte vuota del modello edmx e scegliere aggiorna dal database e infine cliccare su finish
3) aprire il model browser
4) aprire la voce function import
5) selezionare le stored procedure da aggiornare
6) cliccare sul tasto destro e poi edit
7) cliccare su "Get Column Information" e seezionare il complex type da aggiornare e infine cliccare su update....
Tanto per ricordare la cosa la prossima volta
mercoledì 27 febbraio 2013
Piccoli esperimenti
SignalR: fatto
a presto i dettagli
a presto i dettagli
martedì 3 aprile 2012
Blink e arduino fu
Il primo esempio è andato.
1) Scaricare l'Arduino sdk adatto al proprio ambiente di sviluppo http://arduino.cc/en/Main/Software
2) Collegare Arduino all'usb del computer
3) Scaricare il driver corretti
4) Caricare il primo esempio che non richiede hardware aggiuntivo e cliccare su upload nell'ide. In pochi secondi si vedrà lampeggiare il led collegato al pin 13.
1) Scaricare l'Arduino sdk adatto al proprio ambiente di sviluppo http://arduino.cc/en/Main/Software
2) Collegare Arduino all'usb del computer
3) Scaricare il driver corretti
4) Caricare il primo esempio che non richiede hardware aggiuntivo e cliccare su upload nell'ide. In pochi secondi si vedrà lampeggiare il led collegato al pin 13.
martedì 27 marzo 2012
Arduino non ti temo
Comprato tra qualche giorno arriverà a casa.
venerdì 17 febbraio 2012
Knockoutjs e il pattern MVVM lato client - Introduzione
In questi giorni sto sperimentando l'utilizzo della libreria Knockoutjs per realizzare un box di offerte.
Nel post precedente descrivevo la parte server del progetto e il caricamento dei dati via jquery.
Avendo sperimentato i vantaggi dell'utilizzo del ViewModel nella costruzione delle pagine ho pensato se fosse possibile fare una cosa simile anche sul client realizzando un Model View ViewModel lato client.
Googolando un pò ho trovato Knockoutjs leggendo la documentazione mi è sembrata la soluzione al problema che volevo risolvere.
E' possibile definire un viewmodel, definire l'associazione del viewmodel con gli elementi della pagina e infine eseguire il binding. E' definito anche un sistema di templating con un minimo di funzioni di elaborazioni quali istruzioni condizionali e cicli.
Questo blocco di codice è il cuore del gioco. Abbiamo il caricamento di un json con i dati e l'associazione della pagina al viewmodel, infine il binding dei dati. La funzione carica dati è quella che prende i dati dal json e carica le proprietà di HomeViewModel. Ad esempio:
Nel post precedente descrivevo la parte server del progetto e il caricamento dei dati via jquery.
Avendo sperimentato i vantaggi dell'utilizzo del ViewModel nella costruzione delle pagine ho pensato se fosse possibile fare una cosa simile anche sul client realizzando un Model View ViewModel lato client.
Googolando un pò ho trovato Knockoutjs leggendo la documentazione mi è sembrata la soluzione al problema che volevo risolvere.
E' possibile definire un viewmodel, definire l'associazione del viewmodel con gli elementi della pagina e infine eseguire il binding. E' definito anche un sistema di templating con un minimo di funzioni di elaborazioni quali istruzioni condizionali e cicli.
<div class="Informazioni">La libreria sfrutta l'attributo data-bind, l'istruzione template istituisce l'associazione del div ad un blocco di codice che verrà ripetuto per quanti oggetti verranno trovati nel vettore "primoBox".
<div style="float:left; width: 150px; margin:0px 14px 0px 14px;">
<strong>1 adulto + 1 bambino</strong>
<div data-bind="template: { name: 'offerta-template', foreach: primoBox}"></div>
</div>
Questo blocco definisce il template, si può notare l'associazione tra l'html e le proprietà del viewmodel ad esempio il tag a avrà come valore dell'attributo href il valore della proprietà urlInfoStruttura associato all'oggetto attuale del vettore primoBox.<script type="text/html" id="offerta-template"><a data-bind="attr: {href: urlInfoStruttura}"><img data-bind="attr: {src: imagePath}" border="0" /></a><br /><p><a data-bind="attr: {href: urlInfoStruttura}"><h2><span data-bind="text: nomeStruttura" style="font-size: 11px;"></span></h2></a><span data-bind="text: localitaStruttura" style="font-size: 11px; color: #E15204"></span><br /><strong>da <span data-bind="text: puntiStep" style="color: #E15204"></span> <span style="color: #E15204">punti</span></script></p></script>
questa è la definizione del viewmodel associato alla pagina.var HomeViewModel = {primoBox: ko.observableArray([]),secondoBox: ko.observableArray([]),terzoBox: ko.observableArray([]),quartoBox: ko.observableArray([]),offerteCompleto: ko.observableArray([]),};
ko.dependentObservable(function() {$.getJSON("http://..?num=8&callback=?",function(data) {CaricaDati(data);})},HomeViewModel);ko.applyBindings(HomeViewModel);
Questo blocco di codice è il cuore del gioco. Abbiamo il caricamento di un json con i dati e l'associazione della pagina al viewmodel, infine il binding dei dati. La funzione carica dati è quella che prende i dati dal json e carica le proprietà di HomeViewModel. Ad esempio:
HomeViewModel.offerteCompleto.push({nomeStruttura: item.NomeStruttura, imagePath: imgpath, idStruttura: item.IdStruttura, localitaStruttura: item.Localita,puntiStep: "2000", urlInfoStruttura: urlitem});Knockoutjs è un file da 39 kb per ora il grosso vantaggio è una maggiore leggibilità e la migliore modularità del codice... Ma è solo l'inizio.
lunedì 13 febbraio 2012
jquery asp.net mvc e chiamate cross domain
Pensavo fosse una cosa semplicissima.
Il progetto: chiamare una pagina nel dominio del motore di ricerca e ottenere le strutture messe in offerta in tempo reale.
La soluzione: creare un nuovo controllore, la relativa azione, configurare il routing in modo che la richiesta di un indirizzo corrisponda la restituzione di json completo di tutte le strutture.
Sembrava una cosa semplicissima il controller sfruttando la potenza del framework .Net:
[HttpGet]Il passo successivo è stata la scrittura del javascript:
public JsonResult GetListaOfferte(int num = 0)
{
IEnumerable<ProdottoListinoViewModel> listaRisultati = _siteService.GetProdottoOffertaCatalogo();
return Json(listaRisultati.Distinct(new ProdottoListinoViewModelComparer()).ToList().Take(num), JsonRequestBehavior.AllowGet);
}
$.ajax({
url: "(..)/api/GetListaOfferte",
data: {num: "8"},
type: "GET", contentType: "application/json; charset=utf-8", success: function(response) {
alert(response);
}, dataType: "json"
});
Da questo punto in poi sono cominciati i guai. Il problema è che $.ajax subisce i limiti di sicurezza definiti dalla same-domain policy.
La soluzione è stata utilizzare JSONP e quindi implementare un action filter (grande .Net) e poi cambiare la chiamata ajax:
public class JsonpFilterAttribute : ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
string callback = filterContext.HttpContext.Request.QueryString["callback"];
if (callback != null && callback.Length > 0)
{
JsonResult result = filterContext.Result as JsonResult;
if (result == null)
{
throw new InvalidOperationException("JsonpFilterAttribute must be applied only " +
"on controllers and actions that return a JsonResult object.");
}
filterContext.Result = new JsonpResult {
ContentEncoding = result.ContentEncoding,
ContentType = result.ContentType,
Data = result.Data,
Callback = callback
};
}
}
}
aggiungere l'attributo [JsonpFilter] all'azione del controller.
E infine modificare la chiamata ajax:
$.getJSON(
"http://(...)/api/GetListaOfferte?callback=?",
{num: "8" },
function(data) {
alert(data);
});
mercoledì 11 gennaio 2012
IE8 e il metodo find() di jquery
Internet Explorer 8 presenta un bug: il metodo find() non funziona con tag xml a meno di non costruire un oggetto ActiveX.
Se la variabile xml rappresenta il codice da analizzare la soluzione è la seguente:
su data adesso è possibile utilizzare il metodo find() per individuare un nodo particolare.
Se la variabile xml rappresenta il codice da analizzare la soluzione è la seguente:
var data; if ($.browser.msie) { data = new ActiveXObject("Microsoft.XMLDOM"); data.async = false; data.loadXML(xml); } else { data = xml; }
su data adesso è possibile utilizzare il metodo find() per individuare un nodo particolare.
giovedì 29 dicembre 2011
OrientDb e i database NoSql
Da circa un anno l'azienda ha avviato un sistema che sostanzialmente riprende i criteri del multilevel marketing.
L'ambiente informatico che supporta questo sistema è nato e cresciuto in modo disomogeneo, è arrivato il momento di riprogettarlo.
Per ora siamo ancora ad una fase esplorativo e io mi sono preso la strada più lontana da quello che è l'attuale implementazione.
Ho un albero perciò lo voglio rappresentare con un grafo e poi persistere su un database NoSql. Il prodotto su cui ho messo gli occhi è OrientDb.
Per ora mi sta facendo impazzire, ma è un oggetto molto interessante. Nei prossimi post fisserò le operazioni che sto compiendo.
giovedì 22 dicembre 2011
97???
97 suggerimenti a chi si occupa di programmazione.Il primo: "Agisci con prudenza"
http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book
http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book
martedì 13 settembre 2011
Php e Sql Server: come recuperare il return code di una stored procedure
$tsql_callSP = "{?=call sp_LoginUtente(?,?)}";il trucco è definire un parametro di output uguale al valore di ritorno della stored procedure.
$risultato=1;
$params = array(
array(&$risultato,SQLSRV_PARAM_OUT),
array($username, SQLSRV_PARAM_IN),
array($password, SQLSRV_PARAM_IN)
);
lunedì 1 agosto 2011
Symfony 2
Dopo circa 3 anni di sviluppo esce finalmente la versione 2.0 del framework Symfony... devo assolutamente trovare il tempo di studiarmela.
mercoledì 27 luglio 2011
755 è meglio di 777
L'avventura di oggi riguarda Wordpress. In particolare uno script che si occupa di ridimensionare le immagini.
Tutto bene, installazione e configurazione velocissima il sito funziona perfettamente arriva il momento di caricare le immagini della galleria e niente la galleria non funziona. Il server di Aruba restituisce un magnifico Internal Server Error.
Analizzando l'errore mi imbatto nel seguente messaggio di log: Directory "/home/(...)/public_html/wp-content" is writeable by others
Premature end of script headers: timthumb.php
Premature end of script headers: timthumb.php
La spiegazione è che alcuni server non permettono agli script php di girare se la cartella è scrivibile da utenti che non fanno parte dello stesso gruppo. Ovvero la soluzione è stata cambiare i permessi della cartella da 777 a 755.
mercoledì 8 giugno 2011
Enterprise Design: Repository Pattern
In accordo con Martin Fowler il repository pattern è: "layer of abstraction over the mapping layer where query construction code is concentrated". In pratica è una collezione di metodi per l'accesso ai dati e visibili alle classi di dominio. Ancora meglio: il repository pattern crea un livello di astrazione sopra l'ORM. Abbiamo subito tre vantaggi concreti:
Il secondo passo è costruire una classe che implementa i metodi definiti nella interfaccia. Nel mio caso questa classe interagisce con l'ORM sottostante: Entity Framework.
Dove avviene la magia?
Nel progetto del sito MVC ho creato una classe BootStrapper che si occupa di assegnare ad una richiesta di un tipo astratto un tipo concreto:
Nell'evento Application_start:
- Testabilità: utilizzando il repository pattern otteniamo un layer su cui è semplice sostituire i dati con delle classi stub per effettuare test sulla logica di business senza interessare il codice di accesso ai dati.
- Astrazione: questa atrazione permette di modificare di disaccoppiare la logica di business dallo strato di accesso ai dati.
- Dependency Injection: permette di utilizzare containers Di per iniettare oggetti che si vogliono utilizzare nel codice.
In questo caso abbiamo solo operazioni di "select", in generale avremo tutte le operazioni cosidette CRUD (create, read, update, delete).public interface IShopRepository
{
IList<Shop> FindAll();
IList<Shop> FindAll(int index, int count);
IList<Shop> GetShopByCategory(int idcategory);
IList<Shop> GetPrimoPiano();
IList<Shop> GetAltri();
Shop FindById(int id);
Shop FindByName(string name);
IList<Category> GetAllCategory();
IList<Product> GetProductBoxMostSell();
IList<ShopAffiliato> GetAllShopAffiliati();
(...)
}
Il secondo passo è costruire una classe che implementa i metodi definiti nella interfaccia. Nel mio caso questa classe interagisce con l'ORM sottostante: Entity Framework.
Ora non rimane che dire implementare nel layer dei servizi una classe che istanzi un oggetto di tipo IShopRepository e ne utilizzi i metodi per ottenere collezioni che possibilmente abbiano implementata l'interfaccia IEnumerableIList<Shop> IShopRepository.FindAll()
{
var negozi = from n in new IperclubShopEntities().tShops
where n.attivo == true
select new Shop
{
Id = n.ShopId,
Nome = n.nome,
Attivo = (bool)n.attivo,
CodiceZanox = n.codicezanox,
Descrizione = n.descrizione,
Logo1 = n.logo1,
Logo2 = n.logo2,
PrimoPiano = (bool)n.primopiano,
ScopriAltri = (bool)n.scoprialtri,
TipoConversione = 1,
TassoConversione = n.tassoconversione,
IndiceConversione = (float)n.conversione,
UrlNegozio = n.url,
TestoVetrina=n.testovetrina,
ListaBrand = from b in n.tBrands
where b.attivo == true
select new Brand
{
Attivo = (bool)b.attivo,
BrandId = b.BrandId,
Descrizione = b.descrizione,
Logo1 = b.logo1,
Logo2 = b.logo2,
Nome = b.nome
},
ListaTag = from t in n.tTags
select new Tag
{
Id = t.TagId,
Nome = t.tag
},
ListaCategory = from c in n.tCategories
select new Category
{
Id = c.CategoryId,
Nome = c.nome
},
ListaRegole = from r in n.tRules
select new Rules
{
RegolaId = r.RegolaId,
Attiva = (bool)r.attiva,
Conversione = (float)r.conversione,
Note = r.note,
Punti = (int)r.punti,
Shopid = (int)r.Shop_id,
TestoRegola = r.testoregola,
TipoRegola = (int)r.tiporegola,
ValoreMassimo = (decimal)r.valoremassimo,
ValoreMinimo = (decimal)r.valoreminimo
},
Tiponegozio = new TipiNegozio{ Id=n.tTipiNegozio.id, Nome=n.tTipiNegozio.tipo},
};
return negozi.ToList();
}
In questo spezzone di codice viene fatto anche il mapping tra gli oggetti del model e gli oggetti del viewmodel.public class ShopService
{
private IShopRepository _shoprepository;
public ShopService(IShopRepository shoprepository)
{
_shoprepository = shoprepository;
}
public IEnumerable<ShopViewModel> GetAll()
{
return _shoprepository.FindAll().ConvertToShopViewList();
}
(....)
}
Dove avviene la magia?
Nel progetto del sito MVC ho creato una classe BootStrapper che si occupa di assegnare ad una richiesta di un tipo astratto un tipo concreto:
public class BootStrapper
{ public static void ConfigureDependencies()
{ ObjectFactory.Initialize(x=>
{
x.AddRegistry<ControllerRegistry>();
}); }
public class ControllerRegistry : Registry
{
public ControllerRegistry()
{
ForRequestedType<ICategoryRepository>().TheDefault.Is.OfConcreteType<CategoryRepository>();
ForRequestedType<IShopRepository>().TheDefault.Is.OfConcreteType<ShopRepository>();
ForRequestedType<IPartnerRepository>().TheDefault.Is.OfConcreteType<PartnerRepository>(); }
}
}
Nell'evento Application_start:
E il gioco è fatto. Il layer dei servizi è completamente disaccoppiato dal modo con cui si accede ai dati.protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
BootStrapper.ConfigureDependencies();
ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory());
}
martedì 17 maggio 2011
Google Tv e Android
Android sta diventando sempre più il sistema operativo dei dispositivi mobili. IOs ha probabilmente raggiunto la massima quota di mercato e Windows Phone 7 non sfonda.
Cercando un nuovo televisore mi sono imbattuto nella Google Tv, probabilemente non sarà la mia prossima televisione, ma intanto mi ha incuriosito.
Google Tv utilizza una versione di Android, durante questa estate verrà fatto l'upgrade a Android 3.1 ma cosa bisogna tener conto per poter sviluppare applicazioni per Google Tv?
Due sono gli aspetti fondamentali: la dimensione dello schermo e l'interazione con l'utente.
Si hanno due possibilità di risoluzione la prima definita HD è: 1280x720 ovvero più bassa di quella utilizzata dai tablet. L'altra risoluzione possibile è quella definita Full HD: 1920x1080.
Ma non basta considerare le dimensioni in pixel, nel disegnare la grafica va considerato che mentre i tablet e i telefoni sono device che si possono capovolgere, questo non può essere fatto con la tv che verrà utilizzata sempre in modalità landscape. In genere i tablet vengono usati in modalità landscape mentre i telefoni in modalità portrait.
Anche la densità dei pixel è diversa, nei televisori è di 96dpi.
Infine l'interazione: nei tablet e nei phone avviene tramite touchscreen mentre il televisore non si tocca dato che in genere si trova ad alcuni metri di distanza dall'utilizzatore...
La distribuzione delle applicazioni ricalca lo schema di quella dei cellulari e dei tablet ovvero avviene tramite l'android market.
Sono curioso di vedere come andrà a finire, certo è che l'introduzioni di televisori smart cambia le regole ormai fossilizzate del mercato televisivo con tutto quello che comporta non solo sul piano economico.
Cercando un nuovo televisore mi sono imbattuto nella Google Tv, probabilemente non sarà la mia prossima televisione, ma intanto mi ha incuriosito.
Google Tv utilizza una versione di Android, durante questa estate verrà fatto l'upgrade a Android 3.1 ma cosa bisogna tener conto per poter sviluppare applicazioni per Google Tv?
Due sono gli aspetti fondamentali: la dimensione dello schermo e l'interazione con l'utente.
Si hanno due possibilità di risoluzione la prima definita HD è: 1280x720 ovvero più bassa di quella utilizzata dai tablet. L'altra risoluzione possibile è quella definita Full HD: 1920x1080.
Ma non basta considerare le dimensioni in pixel, nel disegnare la grafica va considerato che mentre i tablet e i telefoni sono device che si possono capovolgere, questo non può essere fatto con la tv che verrà utilizzata sempre in modalità landscape. In genere i tablet vengono usati in modalità landscape mentre i telefoni in modalità portrait.
Anche la densità dei pixel è diversa, nei televisori è di 96dpi.
Infine l'interazione: nei tablet e nei phone avviene tramite touchscreen mentre il televisore non si tocca dato che in genere si trova ad alcuni metri di distanza dall'utilizzatore...
La distribuzione delle applicazioni ricalca lo schema di quella dei cellulari e dei tablet ovvero avviene tramite l'android market.
Sono curioso di vedere come andrà a finire, certo è che l'introduzioni di televisori smart cambia le regole ormai fossilizzate del mercato televisivo con tutto quello che comporta non solo sul piano economico.
giovedì 28 aprile 2011
Enterprise Design: Service Layer
In ambito enterprise è molto comune poter distinguere operazioni che possono essere modellate come servizi ovvero funzionalità indipendenti e condivise da più moduli.
Nell'ambito della reingegnerizzazione del sistema informatico dell'azienda si è pensato di applicare alcuni principi di design cosidetti SOA (Service Oriented Archicture) e in particolare l'idea principale è stata la gestione del motore di ricerca dell'offerta turistica come modulo indipendente a tutti i sistemi.
Prima un pò di teoria.
I 4 principi del design SOA sono:
I confini devono essere espliciti
L'interfaccia del servizio deve essere semplice e chiara più che possibile e avere un approccio consistente con i dati scambiati.
I servizi sono autonomi
Il client deve essere in grado di collegarsi al servizio e con un'unica operazione atomica ottenere il risultato sperato.
I servizi condividono contratti e non classi
Il nucleo dell'architettura SOA è l'interoperabilità questa viene garantita con lo scambio di informazioni relative a come comunicare ma non dell'implementazione del servizio. Questo viene fatto tramite lo scambio di messaggi xml che sono neutrali rispetto alla piattaforma.
I servizi basano il loro consumo su regole di policy
I servizi dovrebbero esporre una policy su come devono essere usati e su questa i client basano il loro utilizzo.
L'interconnessione tra le applicazioni e i motori di ricerca aveva portato ad avere 5 implementazioni diverse di un oggetto che si occupasse dic ercare nella stessa base dati con tutti i relativi problemi di manutenzione e scalabilità.
Oggi è concluso il primo step del nuovo progetto.
Il motore di ricerca è quindi realizzato con la tecnologia Windows Communication Fondation 4.0, in ingresso si aspetta: un xml contentente i parametri di ricerca, il set corrente e la lunghezza in termini di risultati del set di risultati da esporre. In uscita i dati sono incapsulati in un vettore JSON.
Nell'ambito della reingegnerizzazione del sistema informatico dell'azienda si è pensato di applicare alcuni principi di design cosidetti SOA (Service Oriented Archicture) e in particolare l'idea principale è stata la gestione del motore di ricerca dell'offerta turistica come modulo indipendente a tutti i sistemi.
Prima un pò di teoria.
I 4 principi del design SOA sono:
I confini devono essere espliciti
L'interfaccia del servizio deve essere semplice e chiara più che possibile e avere un approccio consistente con i dati scambiati.
I servizi sono autonomi
Il client deve essere in grado di collegarsi al servizio e con un'unica operazione atomica ottenere il risultato sperato.
I servizi condividono contratti e non classi
Il nucleo dell'architettura SOA è l'interoperabilità questa viene garantita con lo scambio di informazioni relative a come comunicare ma non dell'implementazione del servizio. Questo viene fatto tramite lo scambio di messaggi xml che sono neutrali rispetto alla piattaforma.
I servizi basano il loro consumo su regole di policy
I servizi dovrebbero esporre una policy su come devono essere usati e su questa i client basano il loro utilizzo.
L'interconnessione tra le applicazioni e i motori di ricerca aveva portato ad avere 5 implementazioni diverse di un oggetto che si occupasse dic ercare nella stessa base dati con tutti i relativi problemi di manutenzione e scalabilità.
Oggi è concluso il primo step del nuovo progetto.
Il motore di ricerca è quindi realizzato con la tecnologia Windows Communication Fondation 4.0, in ingresso si aspetta: un xml contentente i parametri di ricerca, il set corrente e la lunghezza in termini di risultati del set di risultati da esporre. In uscita i dati sono incapsulati in un vettore JSON.
Iscriviti a:
Post (Atom)