Come portare il profiler di symfony2 in drupal8Luca Lusso
Molti progetti PHP open source hanno adottato Symfony2 come base per la loro prossima versione, tra questi c'è anche il CMS Drupal (http://drupal.org). In questo talk vedremo come scrivere un modulo per Drupal8 in modo da sfruttare il più possibile il suo nuovo motore Symfony2, dall'integrazione con il service container alla gestione degli eventi, dal routing a Twig. Verrà usato come esempio il modulo webprofiler (http://drupal.org/project/webprofiler) per dimostrare come un bundle per Symfony2 possa essere trasformato in un modulo per Drupal8 e integrato facilmente nel sistema.
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
Come portare il profiler di symfony2 in drupal8Luca Lusso
Molti progetti PHP open source hanno adottato Symfony2 come base per la loro prossima versione, tra questi c'è anche il CMS Drupal (http://drupal.org). In questo talk vedremo come scrivere un modulo per Drupal8 in modo da sfruttare il più possibile il suo nuovo motore Symfony2, dall'integrazione con il service container alla gestione degli eventi, dal routing a Twig. Verrà usato come esempio il modulo webprofiler (http://drupal.org/project/webprofiler) per dimostrare come un bundle per Symfony2 possa essere trasformato in un modulo per Drupal8 e integrato facilmente nel sistema.
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
Ecco giunti all'ultima tappa del percorso introduttivo su HTML, PHP e gestione di dati su MySQL:
L'accesso ai dati e la visualizzazione delle informazioni contenute nel database tramite pagine dinamiche scritte in PHP.
Lo Spring Framework viene ancora una volta incontro agli sviluppatori Java semplificandone la vita, questa volta vedremo come implementare facilmente uno strato servizi stateless da rendere disponibile remotamente nei diversi formati fruibili dalle diverse tecnologie client RIA, introducendo i concetti di Exporter e Proxy di Spring Remoting. Tutto questo tramite pura configurazione, via XML o annotation a seconda dei gusti, e con un esempio specifico in Flex con Spring BlazeDS Integration.
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
Nicola e Davide vi guideranno in uno spericolato refactoring di un codice poco gradevole alla vista di qualsiasi buon programmatore con lo scopo di illustrare i principali problemi che normalmente affligono il nostro povero codice rendendo difficile la scrittura di fantastici e utili test unitari. Verranno spiegati i principi da rispettare per ottenere un codice facile da testare quali: dependency injection, law of demeter, uso del pattern factory e builder, corretta scrittura dei costruttori, come scovare nomi pericolosi. Ed illustrate le pratiche da evitare: pattern singleton, stati globali, service locator, scrittura di classi con troppa responsabilità. Alla fine del talk verranno presentati alcuni link, software e libri utili nella scrittura di test unitari.
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
Codemotion Rome 2015 - Costruiamo con Spring Boot una applicazione Java EE con transazioni multiple JDBC-JMS utilizzando H2 e HornetQ (embedded in memory), il supporto di autoconfiguration JAX-RS (Jersey), le annotazioni JSR 250 per i lifecycle hooks, e le annotazioni JSR 330 utilizzabili per AS proprietari e per la portabilità in container di dependency injection come Spring. Per finire distribuiremo su Undertow embedded HTTTP server, su un AS standalone (Apache TomEE) e come PAAS su Cloud Foundry.
Hai mai pensato a cosa succede quando una richiesta HTTP arriva al tuo sito Drupal? Come Drupal trova il codice corretto da eseguire? Quali parti di una pagina provengono dalla cache e quali sono costruite da zero? Quante e quali query vengono eseguite sul database? E, perché no, quanto tempo e quanto memoria richiede convertire la richiesta in una risposta?
Che tu sia una persona che sviluppa moduli o solo curiosa, le risposte a queste domande ti aiuteranno a comprendere meglio come funziona internamente il tuo CMS preferito (perché se non lo è già, lo diventerà).
Per fare questo useremo il modulo Webprofiler, che ci aiuterà a capire come le varie componenti di Drupal interagiscono per convertire una richiesta in una risposta. Webprofiler raccoglie dati durante la costruzione di ogni pagina del sito e ci permette di esplorare facilmente cosa succede all’interno di Drupal.
Seguiremo il percorso di una richiesta iniziando dai middleware, passeremo dal routing al controller per finire a Twig. Scopriremo come i servizi forniscono funzionalità e come gli eventi danno la possibilità (o l’opportunità) di scrivere codice disaccoppiato. Il tutto senza perdere di vista le performance e tenendo un occhio sulle risorse, il tempo, le cache e le query.
Ecco giunti all'ultima tappa del percorso introduttivo su HTML, PHP e gestione di dati su MySQL:
L'accesso ai dati e la visualizzazione delle informazioni contenute nel database tramite pagine dinamiche scritte in PHP.
Lo Spring Framework viene ancora una volta incontro agli sviluppatori Java semplificandone la vita, questa volta vedremo come implementare facilmente uno strato servizi stateless da rendere disponibile remotamente nei diversi formati fruibili dalle diverse tecnologie client RIA, introducendo i concetti di Exporter e Proxy di Spring Remoting. Tutto questo tramite pura configurazione, via XML o annotation a seconda dei gusti, e con un esempio specifico in Flex con Spring BlazeDS Integration.
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
Nicola e Davide vi guideranno in uno spericolato refactoring di un codice poco gradevole alla vista di qualsiasi buon programmatore con lo scopo di illustrare i principali problemi che normalmente affligono il nostro povero codice rendendo difficile la scrittura di fantastici e utili test unitari. Verranno spiegati i principi da rispettare per ottenere un codice facile da testare quali: dependency injection, law of demeter, uso del pattern factory e builder, corretta scrittura dei costruttori, come scovare nomi pericolosi. Ed illustrate le pratiche da evitare: pattern singleton, stati globali, service locator, scrittura di classi con troppa responsabilità. Alla fine del talk verranno presentati alcuni link, software e libri utili nella scrittura di test unitari.
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
Codemotion Rome 2015 - Costruiamo con Spring Boot una applicazione Java EE con transazioni multiple JDBC-JMS utilizzando H2 e HornetQ (embedded in memory), il supporto di autoconfiguration JAX-RS (Jersey), le annotazioni JSR 250 per i lifecycle hooks, e le annotazioni JSR 330 utilizzabili per AS proprietari e per la portabilità in container di dependency injection come Spring. Per finire distribuiremo su Undertow embedded HTTTP server, su un AS standalone (Apache TomEE) e come PAAS su Cloud Foundry.
Hai mai pensato a cosa succede quando una richiesta HTTP arriva al tuo sito Drupal? Come Drupal trova il codice corretto da eseguire? Quali parti di una pagina provengono dalla cache e quali sono costruite da zero? Quante e quali query vengono eseguite sul database? E, perché no, quanto tempo e quanto memoria richiede convertire la richiesta in una risposta?
Che tu sia una persona che sviluppa moduli o solo curiosa, le risposte a queste domande ti aiuteranno a comprendere meglio come funziona internamente il tuo CMS preferito (perché se non lo è già, lo diventerà).
Per fare questo useremo il modulo Webprofiler, che ci aiuterà a capire come le varie componenti di Drupal interagiscono per convertire una richiesta in una risposta. Webprofiler raccoglie dati durante la costruzione di ogni pagina del sito e ci permette di esplorare facilmente cosa succede all’interno di Drupal.
Seguiremo il percorso di una richiesta iniziando dai middleware, passeremo dal routing al controller per finire a Twig. Scopriremo come i servizi forniscono funzionalità e come gli eventi danno la possibilità (o l’opportunità) di scrivere codice disaccoppiato. Il tutto senza perdere di vista le performance e tenendo un occhio sulle risorse, il tempo, le cache e le query.
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Marcello Missiroli
Una introduzione semplice e (spero) intuitiva al mondo della programmazione a oggetti usando come riferimento una macchina del caffé (tipo Nespresso)
Slides 2 di 3
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
Slide e codice lo potete trovare a questo link:
http://blog.dottor.net/post/2012/09/18/Codice-e-slide-della-sessione-Whats-New-in-ASPNET-45-and-Visual-Studio-2012.aspx
Il Microsoft .NET Framework è in continua evoluzione, e con la prossima versione verranno rilasciate interessanti funzionalità riguardanti ASP.NET.All'interno di questa sessione conosceremo tutte queste novità, ed andremo invece più in dettaglio in alcune di esse, permettendo a chi conosce già ASP.NET di poter essere più produttivo (Strongly Typed Data Controls, Model Binding, Asynchronous, WebSocket, ... ), mentre, per chi invece non ha molta esperienza con questa tecnologia, potrà vedere come i nuovi template di progetto e Visual Studio 2012 potranno aiutarlo ad approcciare correttamente queste tipologie di applicazioni.
Asp.NET MVC è un nuovo framework per lo sviluppo di applicazioni web alternativo al modello webform. Questo consente di utilizzare il pattern MVC per lo sviluppo di applicazioni Asp.NET, permettendo quindi una miglior separazione delle responsabilità che a sua volta porta ad una maggior manutenibilità, riusabilità e facilità nel testing.
La sessione illustrerà i motivi che hanno portato alla nascita di Asp.NET MVC e le sue caratteristiche fondamentali.
Agenda:
- Storia dei framework MS per lo sviluppo web
- Introduzione a Asp.NET MVC
- Vantaggi di Asp.NET MVC
- Il pattern MVC
- Hello MVC: DEMO
- Componenti di MVC: Routing, Controller, Model, View
A very introductive presentation about reactive programming principles. Starting from synchronous standard programming, I try to present the needs that driven to reactive programming. Callbacks, Future, Promises, Observables and Actor model are the main issues. I also make an introduction to the Reactive Manifesto.
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
by Davide Cerbo e Stefano Linguerri
La programmazione web sta facendo passi da gigante e oggi l’utente si aspetta che l’esperienza di utilizzo si avvicini sempre di più a quella a cui è abituato nei classici applicativi desktop. Il mondo degli sviluppatori ha risposto inventanto una nuova sigla: RIA, cioè Rich Internet Application. Google non è stata a guardare e ha fornito la sua risposta a questa esigenza donando alla community Google Web Toolkit. Questo nuovo framework permette di sviluppare in Java tutta l’interfaccia utente per poi ottenere un codice javascript che funzionerà su qualsiasi browser web senza l’installazione di plugin aggiuntivi. In questa presentazione vedremo:
* perchè sviluppare applicazioni RIA
* perchè usare GWT
* come GWT utilizza AJAX per comunicare con il server
* le ottimizzazione che avremo utilizzando GWT
* come uscire dal browser con Google Gear e Mozilla Prism
* e non solo…
2. Model 2 (MVC):
La richiesta del client viene sempre acquisita da una servlet che poi smista il flusso
verso l’opportuna pagina JSP.
La servlet quindi funge da processore di interfaccia con l’utente e gestisce
operazioni come l’autenticazione, il logging.
3. Modello MVC:
Il controller servlet incoraggia una maggiore estendibilità e riuso delle classi. Infatti
nel modello MVC si ha una netta separazione tra la business-logic, la presentazione
e la gestione delle richieste.
Il modello MVC può sembrare complesso, ma in realtà semplifica le applicazioni,
soprattutto per ciò che riguarda il loro mantenimento e la loro estendibilità.
Model
Si tratta di normali classi Java o Bean che sono in contatto diretto con una base di
dati. Nei casi delle applicazioni più complesse si avranno degli EJB.
View
Si tratta di pagine HTML, di JSP.
Control
Si tratta di una servlet con i compiti di unico punto d’ingresso dell’applicazione e di
supervisor.
4. Redirect e Forward
Il controller ha il compito, come detto, di smistare il flusso dell’applicazione a diversi
viewer (JSP). Esistono due modalità per effettuare questo:
response.sendRedirect(response.encodeRedirectURL(redirectStr));
in tal caso si ha una richiesta completamente nuova
verso la pagina di
destinazione e lo stato attuale memorizzato in request
viene perso.
Spesso tuttavia è necessario conservare il contenuto di
request, considerando soprattutto che nel caso del controller
il request contiene i parametri inviati dall’utente:
RequestDispatcher dispatcher =req.getRequestDispatcher(
redirectStr );
dispatcher.forward( req, resp );
5. Connection Pooling
Una delle operazioni più dispendiose di un’applicazione è l’apertura della connesione
con il database, soprattutto se si apre una connessione per eseguire solo poche
query. E’ quindi preferibile aprire un certo numero di connessioni all’avvio
dell’applicazione e porle in un ‘pool’ in modo che possano essere utilizzate
all’occorrenza.
In pratica la il pool di connessioni contiene un Vector di Connection da cui posso
recuperarne una in caso di necessità, segnandola come occupata, e restituendola al
pool quando non serve più.
Questo può essere fatto in modo manuale crendo delle classi opportune, oppure è
possibile utilizzare il package javax.sql.
6. PooledConnection
import java.sql.*;
public class PooledConnection {
private Connection connection = null;
private boolean inuse =false;
// Costruttore che memorizza la connessione JDBC
public PooledConnection(Connection value){ if(value != null){connection = value;} }
// Restituisce un riferimento alla connessione JDBC
public Connection getConnection() {return connection;}
// Imposta lo stato di PooledConnection.
public void setInUse(boolean value) {inuse = value;}
// Restituisce lo stato corrente di PooledConnection.
public boolean inUse() {return inuse;}
// Chiude la connessione JDBCreale
public void close ()
{ try { connection.close();
}
catch(SQLException sqle){System.err.println(sqle.getMessage()) ; }
}
}
7. Connection Pool – prima parte
import java.sql.*;
import java.util.*;
import java.io.Serializable;
public class ConnectionPool implements Serializable{
private String driver = null;
private String url = null;
private int size = 0; // Numero iniziale di connessioni.
private String username = new String("");
private String password = new String("");
private Vector pool = null; // Vettore di connessioni JDBC
public ConnectionPool(){}
public void setDriver(String value){if(value != null){driver = value;}}
public String getDriver(){return driver; }
public void setURL(String value){if(value != null){url = value;}}
public String getURL(){return url;}
public void setSize(int value){if(value > 1){size = value;}}
public int getSize(){return size;}
public void setUsername(String value){if(value != null){username= value;}}
public String getUserName(){return username;}
public void setPassword(String value){if(value != null){password = value;}}
public String getpassword(){return password;}
8. Connection Pool – seconda parte
// Crea e restituisce una connessione
private Connection createConnection() throws Exception{
Connection con = null;
con = DriverManager.getConnection(url,username,password);
return con;
}
// Aggiunge PooledConnectional pool
private void addConnection(PooledConnection value){
// Se il pool è null, crea un nuovo vettore
// con la dimensione iniziale "size"
if(pool == null){pool = new Vector(size);}
// Aggiunge l'oggetto PooledConnection al vettore
pool.addElement(value) ;
}
9. Connection Pool – terza parte
// Inizializza il pool
public synchronized void initializePool() throws Exception{
if(driver == null) throw new Exception("No Driver Name Specified!");
if(url == null) throw new Exception("No URL Specified!");
if(size < 1) throw new Exception("Pool size is less than 1!");
// Crea le connessioni
try{ Class.forName(driver);
for(int x = 0; x < size; x++){
Connection con = createConnection();
if(con != null)
{ PooledConnection pcon = new PooledConnection(con);
addConnection(pcon) ; }
}
}catch(Exception e){
System.err.println(e.getMessage());
throw new Exception(e.getMessage());}
}
10. Connection Pool – quarta parte
public synchronized void releaseConnection(Connection con){
// trova l'oggetto PooledConnection
for(int x = 0; x < pool.size(); x++){
PooledConnection pcon = (PooledConnection)pool.elementAt(x);
// Verifica se la connessione è corretta
if(pcon.getConnection() == con){
System.err.println("Releasing Connection " + x);
// Imposta l'attributo inuse a false, che
// rilascia per l'uso
pcon.setInUse(false);
break;
}
}
}
11. Connection Pool – quinta parte
// Trova una connessione disponibile
public synchronized Connection getConnection() throws Exception{
PooledConnection pcon = null;
for(int x = 0; x < pool.size(); x++){
pcon = (PooledConnection)pool.elementAt(x);
if(pcon.inUse() == false)
{pcon.setInUse(true);
return pcon.getConnection();}
}
// Non è riuscito a trovare una connessione libera, ne crea e aggiunge una
try{ Connection con = createConnection();
pcon = new PooledConnection(con);
pcon.setInUse(true);
pool.addElement(pcon);
}catch (Exception e){ System.err.println(e.getMessage());
throw new Exception(e.getMessage());}
return pcon.getConnection();
}
12. Connection Pool – sesta parte
// Quando si chiude il pool, occorre prima svuotarlo.
public synchronized void emptyPool(){
for(int x = 0; x < pool.size(); x++){
System.err.println("Chiusura connessione JDBC" + x);
PooledConnection pcon =(PooledConnection)pool.elementAt(x);
if(pcon.inUse() == false) pcon.close();
else{ // Se è in uso, attende 30 secondi e forza la chiusura.
try{ java.lang.Thread.sleep(30000);
pcon.close();
}catch(InterruptedException ie){
System.err.println(ie.getMessage());
}
}
}
}
}
13. Un sito di e-commerce
Un utente deve poter effettuare le seguenti operazioni:
•Ricerca di un prodotto per nome o descrizione
•Scorrere la lista dei prodotti scelta la categoria
•Vedere i dettagli dei prodotti
•Porre un prodotto in un carrello della spesa
•Vedere e modificare il contenuto del carrello
•Eseguire un ordine
20. Il controller (inizializzazione)
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.brainysoftware.burnaby.DbBean;
public class ControllerServlet extends HttpServlet {
/**Initialize global variables*/
public void init(ServletConfig config) throws ServletException {
ServletContext context = config.getServletContext();
context.setAttribute("base", config.getInitParameter("base"));
context.setAttribute("imageUrl", config.getInitParameter("imageUrl"));
DbBean dbBean = new DbBean();
dbBean.setDbUrl(config.getInitParameter("dbUrl"));
dbBean.setDbUserName(config.getInitParameter("dbUserName"));
dbBean.setDbPassword(config.getInitParameter("dbPassword"));
context.setAttribute("dbBean", dbBean);
try { // loading the database JDBC driver
Class.forName(config.getInitParameter("jdbcDriver"));
} catch (ClassNotFoundException e)
{ System.out.println(e.toString()); }
super.init(config);
}
Si noti l’utilizzo so ServletContext per rendere disponibili le variabili per
tutta l’applicazione
21. Il controller doGet doPost
/**Process the HTTP Get request*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException
{ doPost(request, response); }
/**Process the HTTP Post request*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException
{ String base = "/jsp/";
String url = base + "Default.jsp";
String action = request.getParameter("action");
if (action!=null)
{ if (action.equals("search")) url = base + "SearchResults.jsp";
else if (action.equals("browseCatalog")) url = base + "BrowseCatalog.jsp";
else if (action.equals("productDetails")) url = base + "ProductDetails.jsp";
else if (action.equals("addShoppingItem") || action.equals("updateShoppingItem") ||
action.equals("deleteShoppingItem") || action.equals("displayShoppingCart"))
url = base + "ShoppingCart.jsp";
else if (action.equals("checkOut")) url = base + "CheckOut.jsp";
else if (action.equals("order")) url = base + "Order.jsp";
}
RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher(url);
requestDispatcher.forward(request, response);
}
}
22. Classi di supporto
Product.java
package com.brainysoftware.burnaby;
public class Product
{
public int id;
public String name;
public String description;
public double price;
}
ShoppingItem.java
package com.brainysoftware.burnaby;
public class ShoppingItem
{
public int productId;
public String name;
public String description;
public double price;
public int quantity;
}
23. File Inclusi: header.jsp
Si recuperano dal ServerContext i valor base e imageUrl:
<% String base = (String) application.getAttribute("base");
String imageUrl = (String) application.getAttribute("imageUrl"); %>
<TABLE WIDTH="740" CELLPADDING="0" HEIGHT="75" CELLSPACING="0" BORDER="0">
<TR>
<TD ALIGN="left" BGCOLOR="F6F6F6">
<FONT FACE="Verdana" SIZE="4">Burnaby e-Mall</FONT>
</TD>
<TD ALIGN="RIGHT" BGCOLOR="F6F6F6">
<A HREF="<%=base%>?action=displayShoppingCart">
<IMG BORDER="0" SRC="<%=(imageUrl + "cart.gif")%>">
</A>
</TD>
</TR>
</TABLE>