Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post

lunedì 27 ottobre 2014

technicolor tg587n v3 fastweb e windows 8.1

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.

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 ...

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.

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.

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

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.

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.


<div class="Informazioni">
        <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>
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".

 <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>
 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.

var HomeViewModel = {
primoBox: ko.observableArray([]),
secondoBox: ko.observableArray([]),
terzoBox: ko.observableArray([]),
quartoBox: ko.observableArray([]),
offerteCompleto: ko.observableArray([]),
};
questa è la definizione del viewmodel associato alla pagina.

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]
        public JsonResult GetListaOfferte(int num = 0)
        {
            IEnumerable<ProdottoListinoViewModel> listaRisultati = _siteService.GetProdottoOffertaCatalogo();
            return Json(listaRisultati.Distinct(new ProdottoListinoViewModelComparer()).ToList().Take(num), JsonRequestBehavior.AllowGet);
        } 
Il passo successivo è stata la scrittura del javascript:


$.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:

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.

martedì 13 settembre 2011

Php e Sql Server: come recuperare il return code di una stored procedure

$tsql_callSP = "{?=call sp_LoginUtente(?,?)}";
  $risultato=1;
  $params = array(
   array(&$risultato,SQLSRV_PARAM_OUT),
   array($username, SQLSRV_PARAM_IN),
   array($password, SQLSRV_PARAM_IN)  
   );
il trucco è definire un parametro di output uguale al valore di ritorno della stored procedure.

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
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:
  1. 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.
  2. Astrazione: questa atrazione permette di modificare di disaccoppiare la logica di business dallo strato di accesso ai dati.
  3. Dependency Injection: permette di utilizzare containers Di per iniettare oggetti che si vogliono utilizzare nel codice.
Si parte dalla creazione di un'interfaccia, nel mio caso:
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();
(...)

}
In questo caso abbiamo solo operazioni di "select", in generale avremo tutte le operazioni cosidette CRUD (create, read, update, delete).

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.

 IList<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();
}

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 IEnumerable
public class ShopService
{
private IShopRepository _shoprepository;
public
ShopService(IShopRepository shoprepository)
{
_shoprepository = shoprepository;
}

public
IEnumerable<ShopViewModel> GetAll()
{
return
_shoprepository.FindAll().ConvertToShopViewList();
}
(....)
}

In questo spezzone di codice viene fatto anche il mapping tra gli oggetti del model e gli oggetti del viewmodel.

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:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
BootStrapper.ConfigureDependencies();
ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory());
}


E il gioco è fatto. Il layer dei servizi è completamente disaccoppiato dal modo con cui si accede ai dati.

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.

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.