Welcome

This is the generic homepage (aka Aggregate Blog) for a Subtext community website. It aggregates posts from every blog installed in this server. To modify this page, edit the default.aspx page in your Subtext installation.

To learn more about the application, check out the Subtext Project Website.

Powered By:

Blog Stats

  • Blogs - 715
  • Posts - 31018
  • Articles - 310
  • Comments - 104916
  • Trackbacks - 591148

Bloggers (posts, last update)

Latest Posts

ASP.NET AngularJS seed

Quando iniziai (un po’ di tempo fa a dire il vero) a voler provare/utilizzare AngularJS su alcuni progetti web, mi sono scontrato contro alcuni problemi tra i quali:

  • Non voler cambiare “troppo” le tecnologie utilizzate e conosciute dal team (asp.net, webapi, sql server… e quindi niente node, mongo, php, gruntjs…),
  • Utilizzare Visual Studio e avere una struttura chiara della solution,
  • Creare una SPA, e non solo il motore di binding di ng per le singole view asp.net.

Poichè ai tempi (mesi e mesi fa) non trovai un esempio/template che mi soddisfacesse appieno, in quanto:

  • o veniva usato nodejs e niente vs
  • o l’organizzazione dell’applicazione ng era a cura del developer
  • o gli script ng erano separati dalle view (e per me è una cosa fastidiosa dopo un paio di esperienze tra cui anche la struttura di default di durandaljs)

Ho creato un progetto su github, https://github.com/sierrodc/ASP.NET-MVC-AngularJs-Seed, dove:

  • viene utilizzato nuget solo per le libraries .net; ho scelto di non usarlo per i package js perchè altrimenti non avrei potuto organizzarli come segue
    image
    ovvero una sorta di struttura a strati con le librerie senza dipendenze in Ring0, e con Ring(N) dipendente da Ring(N-1)
  • è configurato angularjs e una semplice SPA con alcune features con la seguente struttura:
    image 
    dove:
    1. emixApp.js definisce l’applicazione angularjs, impostando tutte le dipendenze e le regole di routing (forse lo estrarrò da qui),
    2. la cartella directives contiene tutte le directive custom,
    3. la cartella services contiene i servizi angular, in questo caso solo un proxy alle chiamate verso webapi
    4. la cartella pages che contiene le pagine che costituiscono la SPA, ogni pagina definita tramite coppia #pagina.html, pagina.js#
  • tutte le librerie che ritengo utili (anche per una demo veloce) sono già incluse, configurate e utilizzabili;
    Per una lista completa di librerie incluse faccio riferimento al file readme.md presente su repository (cercherò ti mantenerle il più possibile aggiornate).

E dopo questa condivisione, ogni domanda, suggerimento  o critica è ben accetta.

posted @ 28/11/2014 0.38 by Roberto Sarati

La sanità, il muratore e la cattedrale

In Italia non esiste una classe dirigente che capisca l'importanza del software. Questa classe dirigente--a cominciare dal piu tennologico e italiota dei primi ministri--si riempie la bocca di cose-da-cominciare-a-fare e di cose-da-smettere-di-fare ma non va mai oltre il paroleggio. E le parole, anche quelle dorate di uno "ubiquitous language" perfetto, restano parole e non diventano quasi mai implementazione. La mia riflessione è che questo accada certamente perché la politica è un mestiere con forti tradizioni di famiglia. Ma andando oltre, provando ad avvicinarsi al cuore del problema, io mi azzarderei a dire che accade perché nessuno sa bene cosa sia il software e a cosa serva. E nessuno ha idea di quanto sia vitale. E nessuno si azzarda a dotarsi di advisor giusti. Gli advisor ci sono ma sono pescati tra coloro che non sono riusciti a fare politica. Se già un politico è scarso, l'advisor di un politico è ancora più scarso. Entri in un ospedale--almeno un grande ospedale--e ti rendi conto che le procedure ci sono; che gli operatori seguono delle regole di business chiare e definite. Ti rendi pure conto che quelle regole determinano processi che funzionano. E quando ci sono storture e brutture è soprattutto per l'ossessione burocratica e numerica dei costi. E ti rendi conto, però, che queste regole di business e questi processi sono implementati come se fossimo fermi al 1980. E' tutto di carta--ed è un costo. E' tutto un tracciare di carta--ed un doppio costo. E' tutto di una lentezza esasperante e burocratica--ed un costo. Così finisce che la burocrazia ritarda l'intervento se per caso il nome del medico curante non è scritto a penna sulla cartella di carta. E però non ti fanno entrare se non hai la tessera sanitaria. E la tessera sanitaria viene usata, udite udite, solo per fare una fotocopia. Follia. C'è sulla gazzetta ufficiale firmata da monti (!!!) l'istituzione della cartella clinica elettronica. Ma nessuno al ministero ha mai fatto un passo per capire come implementarla. Cioè monti (o chi per lui) si limita a dire dal 1. gennaio entra in vigore la cartella elettronica. Cazzi vostri. E comimcia un "cazzi vostri" burocratico che prima o poi raggiunge la foglia del grafo. Ma la foglia non può fare nulla. E nulla si fa. Sono stati fatti timidi tentativi di implementazione, ma ciascuna ASL ha chiamato la sua software house di fiducia e si sono arenati per manifesta incapacità di gestire un progetto "così complesso". Ma come "ciascuna ASL"? Già, proprio così: niente centralizzazione. Eppure il software complesso nel mondo reale esiste e viene scritto; e avviene anche in Italia. Basta prendere le persone giuste, con skills reali e misurabili, prenderli dal mondo reale e non dal sottobosco della politica e pagarli come si deve per fargli elaborare un progetto. I costi? Follia. Giusto per dare un'idea: le mie tariffe (altissime per gli standard italiani, ma nella media europea) produrrebbero un costo di gran lunga inferiore (!!!) a quanto si paga normalmente nel sottobosco della politica; per il nulla. Si vede che siamo un paese di letterati: tutti devono aver letto i pilastri della terra di Ken Follett. Dove un muratore, Tom, pagato da un priore costruisce una cattedrale. A dire il vero, Tom costruisce mezza cattedrale. E la cattedrale poi crolla. Ecco, appunto. Ma quello era il medioevo; noi saremmo nel 2015.

posted @ 27/11/2014 11.01 by Dino Esposito

Registrazione: Essere uno sviluppatore software in Red Gate (UK).

 

Ecco la registrazione dell’evento “Essere uno sviluppatore software in Red Gate (UK)”.

Se sei interessato ad applicare scrivi una mail ad andrea.angella@red-gate.com

https://www.youtube.com/watch?v=UTdEdPT25tk

posted @ 24/11/2014 10.19 by Andrea Angella

Lean-Agile Coach self-assessment radars


These slides show 3 self-assessment radars for Lean-Agile Coaches.


The first slide is based on the Agile-Coach Competency Framework by Michael K. Spayd and Lyssa Adkins.
The second and third slide come from a blog post by Esther Derby.


Feels free to comment and to question the skills, the traits, and the levels.



Lean-Agile Coach self-assessment radars from Luca Minudel

posted @ 23/11/2014 11.54 by Luca Minudel

Asp.Net 5, MVC 6 e Web Api

E’ qualche mese che non scrivo nulla sul blog, ma gli studi, come la vita, sono andata avanti. Ora eccoci qui a fare qualche test con le nuove versioni delle ultime tecnologie\framework web del mondo Microsoft, che ci regala ogni giorno qualcosa di tecnlogicamente fantastico…alla faccia dei soliti criticoni Smile. Torniamo con i piedi per terra e proviamo ad utilizzare le Web Api in un progetto MVC 6 (attualmente in versione beta, ASP.NET 5 fonde i framework MCV e Web Api). Apriamo il nostro VS 2015 preview (scaricabile nella versione ultimate a questo indirizzo: ) e creiamo un nuovo progetto “ASP.NET Web Application”:

image

Poi selezioniamo il template ASP.NET 5 Empty:

image

Attendiamo qualche secondo che Visual Studio crei l’alberatura della soluzione con tutti i relativi file:

image

Notiamo due file in formato “.json”, global.json e project.json, che possiamo editare rispettivamente per i settings e per le references a livello globale (solution) o di singolo progetto. La classe Startup.cs ed in particolare il metodo Configure(…) definisce l’entry point della pipeline di ASP.NET, ed è qui che andremo ad aggiungere il codice necessario all’esecuzione dell’applicazione. Prima, apriamo il file project.json, e nella sezione dependencies aggiungiamo la riga seguente:

"Microsoft.AspNet.Mvc": "6.0.0-beta1"

Notare come l’editor sia completo di IntelliSense che ci permette di scegliere dinamicamente package e versione (tra quelle disponibili):

image

Inizializziamo MVC nella classe Startup.cs, aggiungendo il metodo ConfigureServices:

1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddMvc(); 4 }

il quale aggiunge tutte le dipendenze di cui MVC 6 ha bisogno. Utilizziamo il metodo d’estensione UseMvc nel metodo Configure:

1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseMvc(); 4 }

Aggiungiamo una classe ItemsController (“Web Api Controller Class”) nella classica cartella di progetto Controllers:

image

1 [Route("api/[controller]")] 2 public class ItemsController : Controller 3 { 4 // GET: api/values 5 [HttpGet] 6 public IEnumerable<Item> Get() 7 { 8 return new List<Item>( 9 new Item[]{ 10 new Item() { Code= "Item#1", Description= "Item_Description#1" }, 11 new Item() { Code = "Item2", Description = "Item_Description#2"} }); 12 } 13 }

Poi aggiungiamo la classe Item:

1 public class Item 2 { 3 public string Code { get; set; } 4 public string Description { get; set; } 5 }

Avviamo il progetto ed invochiamo via browser il servizio:

image

Il servizio dovrebbe restituire il seguente json :

1 [{"Code":"Item#1","Description":"Item_Description#1"} 2 ,{"Code":"Item2","Description":"Item_Description#2"}]

Notiamo come la classe ItemsController a differenza delle versioni precedenti, non derivi piu’ dalla classe ApiController, ma direttamente da Controller. Se proviamo ad utilizzare uno strumento come Fiddler per analizzare le request e le response delle nostre Api, possiamo scoprire qualcosa di interessante, se ad esempio, modifichiamo la nostra Web Api in modo da tornare null, con l’attuale versione di ASP.NET Web Api otterremmo:

image

Ovvero una response con status 200 e corpo del messaggio vuoto, con la versione MVC 6 invece:

image

Una response con status 204 (No Content), che logicamente parlando IMHO è piu’ corretta (la risposta è OK, ma il contenuto del body è vuoto). Ulteriori dettagli sui Formatters in MVC6 possono essere trovati in questo post di Filip W. Per ritornare ad avere un comportamento Old Style è sufficiente agire a livello di configurazione, in ConfigureServices:

1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddMvc().Configure<MvcOptions>(o => o.OutputFormatters 4 .RemoveAll(f => f.Instance.GetType() == typeof(HttpNoContentOutputFormatter))); 5 }

Ovviamente di novità ci sono e tante, ma almeno sappiamo da dove iniziare Smile .

posted @ 23/11/2014 9.17 by Pietro Libro

Dati di accesso: Essere uno sviluppatore software in Red Gate (UK)


Red Gate Ingeniously Simple

Giovedi' 13 Novembre 2014


Sede: evento online
Ora: 17:30 - 18:30
Speaker: Andrea Angella
Q/A: Jodie Pinkowski

Accedi al webcast oggi alle ore 17:30 italiane usando questo indirizzo:
https://www.livemeeting.com/cc/mvp/join?id=SJ33B7&role=attend&pw=jKxft%2F%289R

Andrea Angella e' un italiano che lavora in UK da 5 anni e presentera' tutti i vantaggi di lavorare in Red Gate dando risposta a molte delle domande che un italiano si pone prima di compiere il grande passo. Durante l'intero webcast, la responsabile delle risorse umane, Jodie Pinkowski, sara' a disposizione per rispondere direttamente alle vostre domande (Only In English).

  • Ti sei mai chiesto come possa essere l'esperienza di uno sviluppatore software in UK?
  • Sei alla ricerca di un ambiente di lavoro piu' stimolante e gratificante che possa veramente farti crescere professionalmente?
  • Sei alla ricerca di un migliore bilanciamento tra lavoro e vita privata?
  • Stai considerando la possibilita' di fare una esperienza all'estero?

Vi aspettiamo numerosi!

Iscriviti all'evento

posted @ 13/11/2014 13.17 by Andrea Angella

Microsoft news

La giornata di oggi è stata particolarmente ricca di news per noi sviluppatori:

  1. E’ disponibile l’update 4 di Visual Studio 2013 (non ancora segnalato in VS2013 ma scaricabile qui Download Visual Studio 2013 Update 4 (2013.4) RTM)
    La lista delle novità e delle correzioni è disponibile alla seguente pagina: http://www.visualstudio.com/news/vs2013-update4-rtm-vs
  2. E’ stata rilasciata una nuova edizione di VS ovvero la Visual Studio 2013 Community, che include gli ultimi updates, e che supporta sviluppo web, cloud, mobile, Kinect, Unity… permettendo inoltre di installare estensioni. Un cambio di rotta rispetto all’ultima tornata di VS express frammentato in più versioni e con estensioni bloccate.
    Interessante notare la seguente frase presente su sito microsoft:
    ”For all other usage scenarios: In non-enterprise organizations, up to 5 users can use Visual Studio Community. In enterprise organizations (meaning those with >250 PCs or > $1MM in annual revenue), no use is permitted beyond the open source, academic research, and classroom learning environment scenarios described above”
    Questo significa che in piccole aziende è possibile utilizzare VS Community senza oneri anche per fini commerciali (correggetemi se sbaglio).
  3. Disponibile Visual Studio 2015 preview (http://www.visualstudio.com/news/vs2015-preview-vs#Net) con EF7, Rosylin, .net4.6, asp.net 5 e chi più ne ha più ne metta
  4. L’apertura sempre più consistente da parte di Microsoft verso il mondo opensource e sistemi “non-windows”:
    1. sono stati rilasciati parti importanti di .net framework su github (http://blogs.msdn.com/b/dotnet/archive/2014/11/12/net-core-is-open-source.aspx)
    2. si è (forse) presa consapevolezza di ciò che molti avrebbero voluto da .NET, ovvero la multipiattaforma (forse dovuto anche al successo di Xamarin [che tra parentesi, tra le altre cose, prevede di aggiungere il supporto a VS anche nella versione free]). ScottGu ha infatti annunciato la volontà di rilasciare una versione ufficiale e supportata di .net core per linux e osx (http://weblogs.asp.net/scottgu/announcing-open-source-of-net-core-framework-net-core-distribution-for-linux-osx-and-free-visual-studio-community-edition)

Che dire… senza parole.

posted @ 13/11/2014 2.22 by Roberto Sarati

SharePoint Hosted App - Ribbon Custom Action Icons

Dovendo realizzare una ribbon custom action su uno SharePoint online ho dovuto affrontare il problema di come caricare l'icona da mostrare sul bottone.

Chiaramente si può caricare sulla hosted app e far puntare il ribbon alla nostra immagine esterna, ma era una soluzione che non mi piaceva molto.

Ho trovato così un articolo che mostrava una soluzione più interessante, che sfruttava sostanzialmente la tecnica del Data Uri

Technorati Tags:

posted @ 07/11/2014 11.40 by Daniele Proietti

Libro Su Windows 8.1

Windows 8.1 è l’ultimo sistema operativo rilasciato da Microsoft. Vista la sua nuova veste grafica e le modifiche fatte al core può risultare di difficile utilizzo per l’utente medio

MANUALE WINDOWS 8.1per imparare a usare Windows 8 e sfruttarne tutte le potenzialità in ambito lavorativo e in ambito IT.

Windows 8.1. Reti, sicurezza, tecniche avanzate

di Adriano Arrigo (Autore), Marco Maltraversi (Autore)

LIBRO WINDOWS 8.1

Buona lettura.

posted @ 04/11/2014 12.03 by Marco Maltraversi

Svg Rendering Engine



Ieri avevo il problema di riuscire a salvare sul server, come png, un grafico prodotto da una libreria javascript (morris.js) in formato svg. Per risolvere questo problema ho utilizzato questa libreria https://svg.codeplex.com

posted @ 04/11/2014 8.45 by Alessandro Gervasoni

PostgreSQL sull'uso della funzione row_number()

Qualche giorno fa era nata la necessità di dovere modificare una funzione in PostgreSQL  rendendo parametrizzatile il tipo di ordinamento (ASC o DESC) finale del set di dati restituito in output.

La soluzione più semplice, ma probabilmente, meno efficiente era quello di rendere dinamico tutto lo script ed eseguirlo con il comando EXECUTE, parametrizzando l'ordinamento ed eseguendo il tutto all'interno della funzione stessa.

Per esempio:

CREATE OR REPLACE FUNCTION funct_1(IN p_1, IN p_order_type text)
  RETURNS TABLE( [. . .] ) AS
$BODY$
RETURN QUERY EXECUTE '
SELECT [ . . .]
FROM my_table
WHERE [. . . ]
ORDER BY col_1 ' ||  p_order_type || '
LIMIT 1
';
$BODY$
  LANGUAGE sql STABLE
  COST 100
  ROWS 1;

Ma questa è una delle condizioni dove le funzioni "window":
http://www.postgresql.org/docs/9.1/static/functions-window.html
possono venirci in aiuto.
In particolare quella che fa al caso nostro è: row_number() che si fa carico di numerare (partendo da 1) ogni riga del nostro set di dati, in base ad un ordinamento pre-impostato.

 
CREATE OR REPLACE FUNCTION funct_1(IN p_1, IN p_order_asc bool)
  RETURNS TABLE( [. . .] ) AS
$BODY$

SELECT [ . . .]
FROM my_table
WHERE [. . . ]
ORDER BY 
CASE
 WHEN p_order_asc THEN
  ( row_number() over (ORDER BY col_1 asc ) )   --L'ordinamento ASC viene garantito
--
dalla funzione row_number()
--applicato alla colonna " 'col_1' ASC "
 ELSE
  ( row_number() over (ORDER BY col_1 desc ) )   --L'ordinamento DESC stessa impostazione di quello ASC.
END
LIMIT 1
;
$BODY$
  LANGUAGE sql STABLE
  COST 100
  ROWS 1;


Faccio notare l'ordinamento:

ORDER BY 
CASE
 WHEN p_order_asc THEN
  ( row_number() over (ORDER BY col_1 asc )
 ELSE
  ( row_number() over (ORDER BY col_1 desc ) )
END

 

Il piano di esecuzione, senza l'utilizzo e con l'utilizzo della funzione 'row_number()'.
La differenza è minima, e lavorando su una migliore indicizzazione dei campi interessati, probabilmente si può ulteriormente migliorare.
Va considerato che il piano di esecuzione senza l'utilizzo della funzione  'row_number()' (il primo) è al netto del costo della funzione 'EXECUTE'.

 

Limit  (cost=445.73..445.73 rows=1 width=42)
  ->  Sort  (cost=445.73..446.16 rows=172 width=42)
        Sort Key: "timestamp", state_id
        ->  Index Scan using [...]  (cost=0.57..444.87 rows=172 width=42)
              Index Cond: (ad_id = 123)

Limit  (cost=455.55..455.56 rows=1 width=42)
  ->  Sort  (cost=455.55..455.98 rows=172 width=42)
        Sort Key: (row_number() OVER (?))
        ->  WindowAgg  (cost=451.25..454.69 rows=172 width=42)
              ->  Sort  (cost=451.25..451.68 rows=172 width=42)
                    Sort Key: "timestamp", state_id
                    ->  Index Scan using [...]  (cost=0.57..444.87 rows=172 width=42)
                          Index Cond: (ad_id = 123)
 

 

posted @ 02/11/2014 11.30 by pietro partescano

What is Markdown?

Markdown is a plain text formatting syntax designed so that it can be converted to html using a tool by the same name.

http://whatismarkdown.com

per window potete usare il seguente tool:

http://markdownpad.com

posted @ 29/10/2014 8.44 by Alessandro Gervasoni

Webcast: Vuoi essere uno sviluppatore software in Red Gate (UK)?


Red Gate Ingeniously Simple


Giovedi' 13 Novembre 2014


Sede:
evento online
Ora: 17:30 - 18:30
Speaker: Andrea Angella
Q/A: Jodie Pinkowski

Red Gate Software produce "ingeniously simple tools" per professionisti e sviluppatori Microsoft in tutto il mondo. L'azienda e' principalmente specializzata in MS SQL Server, Cloud, .NET e Oracle con l'obiettivo di diventare leader nel Database Lifecycle Management (DLM), la componente database dell' Application Lifecycle Management (ALM). Sviluppatori e DBA saranno in grado di trattare database come ogni altra parte dell'applicazione adottando processi di sviluppo moderni, come continuous integration e continuous delivery, per rilasciare spesso e in modo sicuro.

Stats board mounted (on velcro) and holders for pens and stickies are back up. We also grabbed a couple of pedestals for supplies. The sharp-eyed among you may spot the empty Rum bottle. We're now up to 4!

Per raggiungere questo obiettivo ambizioso, Red Gate e' anche alla ricerca di sviluppatori software italiani.

  • Ti sei mai chiesto come possa essere l'esperienza di uno sviluppatore software in UK?
  • Sei alla ricerca di un ambiente di lavoro piu' stimolante e gratificante che possa veramente farti crescere professionalmente?
  • Sei alla ricerca di un migliore bilanciamento tra lavoro e vita privata?
  • Stai considerando la possibilita' di fare una esperienza all'estero?

Andrea Angella e' un italiano che lavora in UK da 5 anni e presentera' tutti i vantaggi di lavorare in Red Gate dando risposta a molte delle domande che un italiano si pone prima di compiere il grande passo. Durante l'intero webcast, la responsabile delle risorse umane, Jodie Pinkowski, sara' a disposizione per rispondere direttamente alle vostre domande (Only In English).

Vi aspettiamo numerosi!

Iscriviti all'evento

posted @ 28/10/2014 16.49 by Andrea Angella

jsPDF

A HTML5 client-side solution for generating PDFs
http://parall.ax/products/jspdf

posted @ 27/10/2014 23.59 by Alessandro Gervasoni

“Don't bring me problems,bring me solutions." Really?!?!







“The thought that disaster is impossible often leads to an unthinkable disaster.”
Gerald M. Weinberg










Modern leadership is servant, modern managers are like hosts that receive and entertain guests.
Team members have ownership and autonomy in the way, in the ‘how’, they pursue the value they are asked to create.

When team members face difficulties, they raise obstacles to management attention. And managers act on the obstacles that bubble up from the team. This follows the principle of transparency and feedback.

Are managers ready to hear about all these problems?   Continue...

posted @ 20/10/2014 23.02 by Luca Minudel

JavaScript : the right way

http://jstherightway.org/

posted @ 13/10/2014 17.48 by Alessandro Gervasoni

Webapi-like controllers in NodeJS+ExpressJS

Lavorando su un progetto ~MEAN (MongoDB + ExpressJS + AngularJS + nodeJS) mi sono chiesto: “perchè non creare un modulo di registrazione custom dei controller simile a quella delle webapi di asp.net”? da qui è nato il seguente modulo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var path = require('path');
var fs = require('fs');
var config = require('./config');
var _ = require('lodash');

var getControllersInServerFolder = function (serverFolder) {
    if (_.isEmpty(serverFolder)) {
        serverFolder = config.settings.controllersFolder;
    }

    var controllers = [];

    var fileSystemObjects = fs.readdirSync(serverFolder); //read folder content
    if (_.isArray(fileSystemObjects)) {
        _.forEach(fileSystemObjects, function (fso) {
            var fsoFullPath = path.join(serverFolder, fso);
            var fsoStat = fs.statSync(fsoFullPath);
            if (fsoStat.isFile() && fso.endsWith('controller.js')) {
                controllers.push(require(path.relative(__dirname, fsoFullPath)));
            } else if (fsoStat.isDirectory()) {
                _.union(controllers, getControllersInServerFolder(fsoFullPath));
            }
        });
    }

    return controllers;
};

exports.getControllers = getControllersInServerFolder;

Quindi nello startup del server nodejs:

1
2
3
_.forEach(require('controllers-manager')..getControllers(), function(controller) {
	server.use(controller.path, controller.router); // register route into expressjs
});

Ora i controller sono tutti quei files definiti nella cartella config.settings.controllersFolder (o sottocartelle) che terminano con ‘controller.js’ e hanno tutti la seguente struttura:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
var express = require('express');
var router = express.Router();

//apply before any actions (check authorizations...)
router.use(function(req, res, next) {
	next(); //go to next 
});

router.get('/message', function(req, res, next) {
	res.send({'Hello world'});
});

exports.path = '/api/sample';
exports.router = router;

Facile, semplice e veloce.

posted @ 12/10/2014 15.49 by Roberto Sarati

L’importanza del contesto

Penso di non essere il solo ormai così abituato ad usare Entity Framework e LINQ da dimenticarmi i principi fondamentali tra su cui si basa Entity Framework finché non ci sbatto il muso…. Come oggi Smile

Sto sviluppando la classica applicazioni di scambio dati tra sistemi legacy che fa un uso (ovviamente) importate dell’accessoacesso ai dati. Per cui cosa c’è di più comodo che un bel “reverse engineering” del database legacy per poi poterci operare con LINQ?Smile with tongue out

Tutto filava per il meglio con mia grande soddisfazione finché non si è presentato il caso di dover chiamare un applicativo esterno che era preposto a fare delle modifiche allo stesso database ma la cui logica era cablata nell’eseguibile e quindi “doveva essere usata così com’era”.

Vi riporto la parte di codice “incriminata”. Il programma reale è (ovviamente) un po’ più complesso e la logica è distribuita su più funzioni (altrimenti il problema mi sarebbe saltato subito all’occhio) ma rende l’idea del “pitfall” in cui si può cadere usando Entity Framework (o un qualsiasi altro ORM) come usiamo (o usavamo) ADO.NET.

N.d.R. “ShellandWait” è una funzione che si preoccupa di lanciare un programma con un parametro ed attenderne la chiusura e…. scusate la sintassi VB Embarrassed smile

Using ctx = provider.GetDataContext() Dim ordini = From p In ctx.PortafoglioOrdini Where p.Ordine = ordine Select p If ordini IsNot Nothing Then For Each ordine In ordini Dim res = ShellandWait(programmaEsterno, ordine.Riga) Next End If Dim ordineModificato = (From p In ctx.PortafoglioOrdini Where p.Ordine = ordine Select p).FirstOrDefault() Return (ordineModificato IsNot Nothing AndAlso ordineModificato.Stato = "X") End Using

 

Diciamo (sempre per semplificare) che tra le varie cose che fa il programma esterno una di quelle è cambiare una colonna della tabella PortafoglioOrdini e io uso questa modifica per verificare che il programma abbia girato correttamente.

Ma il controllo mi tornava sempre false, benché la verifica sul database rendesse evidente che tutto funzionasse al meglio. Surprised smile

Quello che mi ero dimenticato è che il DbContext di Entity Framework implementa i pattern della Unit Of Work e Identity Map per cui una volta letti i dati non li rilegge più dal DB poiché, correttamente in quasi tutti i casi, ritiene di avere conoscenza dello stato letto e di tutte le modifiche apportate al dato che siano state persistite o meno.

Capito il problema (e per una volta senza ricorrere a Stack Overflow Winking smile ) ho risolto facilmente il problema dividendo il singolo DbContext in due differenti, uno prima e uno dopo la chiamata al programma esterno.

Technorati Tags: ,

posted @ 02/10/2014 23.32 by Nazareno

Quando faccio git push quali branch sto pushando?

Lavorando in command line in Git si potrebbe erroneamente pensare che facendo un

git push

Si effettui il push della sola branch che è in checkout, ma questo non è vero, dato che il reale comando per effettuare il push di una branch è

git push remotename branchname

Quindi se state nella branch XYZ ed avete un  unico remote chiamato origin dovete fare

git push origin XYZ

Il comportamento adottato da git se non specificate ne il remote ne la branch è determinato dalla impostazione push.default e come possiamo leggere dalla documentazione le possibilità sono.

nothing - do not push anything.

matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.

upstream - push the current branch to its upstream branch.

tracking - deprecated synonym for upstream.

current - push the current branch to a branch of the same name.

Il default è matching, per cui facendo un git push state effettuando il push di tutte le vostre branch. Questa opzione probabilmente non è il miglior default che si possa avere, per questo in Git 2.0 il default verrà modificato in “Simple”, un ulteriore nuovo possibile valore per push.default:

simple - in centralized workflow, work like upstream with an added safety to refuse to push if the upstream branch’s name is different from the local one. When pushing to a remote that is different from the remote you normally pull from, work as current. This is the safest option and is suited for beginners. This mode has become the default in Git 2.0.

Fate quindi attenzione al modo che avete selezionato per evitare sorprese.

Gian Maria.

posted @ 27/09/2014 12.09 by Gian Maria Ricci

A noi c'ha rovinato l'autsursing

E' un vecchio tormentone sempre attuale quello che Petrolini prima, e Sordi poi, hanno genialmente proposto e riproposto nel passato. "A me m'ha rovinato la guera", diceva il personaggio Gastone, fatuo e inconcludente, riferendosi negli anni 20 alla Grande Guerra che gli avrebbe impedito l'affermazione professionale e umana. A mio modo di vedere, invece, un fondamentale malinteso sul senso ultimo dell'outsourcing è alla base di molti problemi di digitalizzazione di molte aziende italiane e, manco a dirlo, della PA. Outsourcing è l'atto di "ricorrere ad altre imprese per lo svolgimento di alcune fasi del processo produttivo". In sostanza, un'azienda trova più economico e scalabile per il proprio business acquistare servizi da altre aziende specializzate invece che costruirsi al proprio interno una struttura ad hoc. Autsursing all'italiana, invece, è l'atto di "ricorrere ad altre imprese per lo svolgimento di alcune fasi del processo produttivo" delegando COMPLETAMENTE ad esse tempistica (salvo vaghe alzate di voce), documentazione e soprattutto controllo di qualità. In sostanza, un'azienda trova più comodo pagare e lavarsi le mani dell'implementazione di parte dell'infrastruttura del proprio business. Nell'IT che succede? Che l'azienda X (che può tanto essere una mini SRL, quanto una PMI o un mastodonte parastatale) si rivolge ad un vendor hw/sw il quale gli suggerisce un'azienda partner--tipicamente un aggregatore/integratore di sistemi. E fin qui nulla da dire. Il portfolio naturalmente fa la differenza e quindi l'azienda partner viene scelta sulla base della credibilità dimostrabile. E fin qui tutto bene. Aziende di consulenza nazionali o più finiscono per dividersi la torta--che siano quelle che hanno a che fare con motori, che si occupino di accenti o repliche. Il problema nasce dal fatto che queste aziende che prosperano sul autsursing hanno strutture poco agili e non possono permettersi di tenere il personale a spasso in attesa di allocazione. Ciò che finisce per contare quindi NON è la qualità del lavoro, l'innovazione fornita, il valore aggiunto e duraturo. Conta portare il "progetto a casa" così da avere l'approvazione per inserire un'altra casella nel portfolio in vista del prossimo cliente. Ciò che manca è la valutazione oggettiva soprattutto da parte del cliente finale della qualita del lavoro. E nel caso in cui il lavoro NON sia fatto a regola d'arte manca COMPLETAMENTE il senso della "punizione". Lo scorecard resta immacolato; manco fosse una roba read-only. Uno dice "ho chiamato la super azienda X che mi ha raccomandato il super vendor Y. Che altro potevo fare di meglio? Se fanno un lavoro di merda mica è colpa mia? Non è mia responsabilità". Tocca inserire su wikipedia anche la definizione diautsursing.

posted @ 26/09/2014 9.49 by Dino Esposito

Latest Images

From Immagini
From Immagini
From Immagini
From Immagini
From Foto
From Foto
From Foto
From Immagini
From Immagini
From Immagini
From PrivateImage
From image
From post
From post
From Immagini
From Messaggi
From BlogImagesLayout
From Screenshots
From Messaggi strani
From Sidebar