SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
Come sviluppo
le applicazioni web
Andrea Lazzarotto — andrealazzarotto.com
Mi presento
Sviluppatore software e
consulente informatico
Autore di vari software open
source (script, RecuperaBit, …)
Socio fondatore GrappaLUG
Percorso
A proposito di PHP
Sviluppare il software
Fare il deploy
A proposito di PHP
Sviluppo web
Tantissimi usano PHP (e MySQL)
WordPress, Wikipedia, Digg, Facebook
Parliamone...
Inconsistenza dei nomi
strpos
bin2hex
usleep
str_rot13
strtotime
microtime
Riguardo a htmlspecialchars
«htmlspecialchars fu una tra le prime funzioni.
Al tempo in cui PHP aveva meno di 100 funzioni e
il meccanismo di hashing per i nomi di
funzione era strlen().»
— Rasmus Lerdorf, creatore di PHP
I’m sick of this s***, don’t deny
You’re a waste of time
I’m sick of this s***, don’t ask why
— Avril Lavigne, “I Can Do Better”
Tipi e operatori
NULL < -1
NULL == 0
2000 == "2e3"
Tutti questi confronti
danno come risultato il
valore TRUE
Ah ecco...
«Non so come fermarlo, non c’era nessuna
intenzione di scrivere un linguaggio di
programmazione. […] Non ho idea di come si
scriva un linguaggio di programmazione»
— Rasmus Lerdorf, creatore di PHP
You’re so full of s***
I can’t stand the way you act
I just can’t comprehend
— Avril Lavigne, “I Can Do Better”
Messaggi di errore
<?php $x = ?>
syntax error, unexpected ';'
function foo(string $s){}
foo("hello world");
Argument 1 passed to foo() must be
an instance of string, string given
Chi l’avrebbe mai detto!
«Ero molto, molto scarso nello scrivere i parser.
Sono ancora molto scarso nello scrivere i parser.»
— Rasmus Lerdorf, creatore di PHP
I will drink as much limoncello as I can
And I’ll do again and again
— Avril Lavigne, “I Can Do Better”
Sviluppare il software
Oltre a bere per dimenticare…
Python
I tipi di dato hanno senso
I messaggi di errore hanno senso
Facilissimo e “batterie incluse”
It’s a state of bliss, you think you’re dreaming
It’s the happiness inside that you’re feeling
It’s so beautiful it makes you wanna cry
— Avril Lavigne, “Innocence”
Flask
Micro-framework web per Python
Poco invasivo, veloce da imparare
Estendibile con altri moduli (es. Flask-Login)
Il workfow
Git
Creazione repository:
$ mkdir banana
$ cd banana
$ git init
$ git remote add origin […]
In remoto si può usare
GitHub o Bitbucket
File .gitignore:
__pycache__/
*.py[cod]
*$py.class
*.so
*.db
*-journal
config.py
venv
Virtualenv
Racchiude tutte le
dipendenze in una
directory!
$ pip install virtualenv
Nel nostro progetto:
$ virtualenv venv
$ source venv/bin/activate.fish
Per chi usa Bash, c’è lo
script activate
Scheletro del progetto
Struttura:
banana/
├── banana.py Applicazione Flask
├── banana.wsgi Confgurazione per Apache
├── config.py File di confgurazione (escluso da Git)
├── config.py.example File di esempio (parametri fttizi)
├── requirements.txt Moduli Python da installare (Flask e altro)
├── static
│   ├── favicon.ico Favicon (in realtà una PNG 128x128)
│   └── robots.txt Indicazioni per i motori di ricerca
└── templates
└── home.html Template Jinja
File principale
from flask import Flask, render_template, request, send_from_directory
app = Flask(__name__)
@app.route("/")
def index():
return render_template('home.html')
@app.route('/favicon.ico')
@app.route('/robots.txt')
def static_from_root():
return send_from_directory(app.static_folder, request.path[1:])
if __name__ == '__main__':
app.run(port=5000, debug=True)
File per Apache WSGI
import os
import sys
wd = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, wd)
from banana import app as application
Esempio di DB
CREATE TABLE `guestbook` (
`date` TEXT NOT NULL,
`name` TEXT NOT NULL
);
$ sqlite3 data.db < data.sql
Aggiungiamo una rotta
@app.route("/guestbook")
def guestbook():
name = request.args.get('name')
if name:
message = 'Benvenuto {}!'.format(name)
# TODO: inserire visita nel database con timestamp
else:
message = 'Mmm... chi sei?'
return render_template('guestbook.html', message=message)
Il template guestbook.html contiene: <h1>{{ message }}</h1>
Avviando ./banana.py
Fare il deploy
Flusso del codice
Proflo utente sul server
# cd /var/www/
# mkdir Banana
# adduser banana
# chown banana:banana Banana
# su banana
Clone del repository
$ git clone git@github.com:Lazza/flask-banana.git /var/www/Banana
$ cd /var/www/Banana
$ pip install -u -r requirements.txt
$ sqlite3 data.db < data.sql
$ cp config.py.example config.py
$ nano config.py
Confgurazione di Apache
<VirtualHost *:443>
ServerName example.com
ErrorLog ${APACHE_LOG_DIR}/banana_error.log
CustomLog ${APACHE_LOG_DIR}/banana.log combined
Alias /.well-known /var/www/Banana/.well-known
WSGIDaemonProcess banana user=banana group=banana threads=20
WSGIScriptAlias / /var/www/Banana/banana.wsgi
<Directory /var/www/Banana>
WSGIProcessGroup banana
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
SSLEngine On
SSLCertificateFile /path/fullchain.pem
SSLCertificateKeyFile /path/privkey.pem
</VirtualHost>
Salvato in sites-available/banana.conf
*:80 fa solo redirect a HTTPS
# a2ensite banana
Successivi aggiornamenti
dev@laptop $ git push
banana@server $ git pull
root@server # service apache2 reload
Grazie per l’attenzione
Andrea Lazzarotto
@thelazza
https://andrealazzarotto.com

Más contenido relacionado

Similar a Come sviluppo le applicazioni web

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
Tommaso Torti
 
Gianfrasoft Corso Di Php Parte 1
Gianfrasoft   Corso Di Php   Parte 1Gianfrasoft   Corso Di Php   Parte 1
Gianfrasoft Corso Di Php Parte 1
Gianfranco Fedele
 
JAMP DAY 2010 - ROMA (1)
JAMP DAY 2010 - ROMA (1)JAMP DAY 2010 - ROMA (1)
JAMP DAY 2010 - ROMA (1)
jampslide
 
Malware Analysis. A Case Study
Malware Analysis. A Case StudyMalware Analysis. A Case Study
Malware Analysis. A Case Study
Gianni Amato
 
Laboratorio Di Basi Di Dati 09 Il Linguaggio P H P
Laboratorio Di  Basi Di  Dati 09  Il Linguaggio  P H PLaboratorio Di  Basi Di  Dati 09  Il Linguaggio  P H P
Laboratorio Di Basi Di Dati 09 Il Linguaggio P H P
guestbe916c
 

Similar a Come sviluppo le applicazioni web (20)

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015
 
Profilazione di applicazioni PHP con XHProf.
Profilazione di applicazioni PHP con XHProf.Profilazione di applicazioni PHP con XHProf.
Profilazione di applicazioni PHP con XHProf.
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Gianfrasoft Corso Di Php Parte 1
Gianfrasoft   Corso Di Php   Parte 1Gianfrasoft   Corso Di Php   Parte 1
Gianfrasoft Corso Di Php Parte 1
 
Working between the clouds
Working between the cloudsWorking between the clouds
Working between the clouds
 
JAMP DAY 2010 - ROMA (1)
JAMP DAY 2010 - ROMA (1)JAMP DAY 2010 - ROMA (1)
JAMP DAY 2010 - ROMA (1)
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
Javascript - 1 | WebMaster & WebDesigner
Javascript - 1 | WebMaster & WebDesignerJavascript - 1 | WebMaster & WebDesigner
Javascript - 1 | WebMaster & WebDesigner
 
Node js dev day napoli 2016
Node js dev day napoli 2016Node js dev day napoli 2016
Node js dev day napoli 2016
 
Malware Analysis. A Case Study
Malware Analysis. A Case StudyMalware Analysis. A Case Study
Malware Analysis. A Case Study
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Laboratorio Di Basi Di Dati 09 Il Linguaggio P H P
Laboratorio Di  Basi Di  Dati 09  Il Linguaggio  P H PLaboratorio Di  Basi Di  Dati 09  Il Linguaggio  P H P
Laboratorio Di Basi Di Dati 09 Il Linguaggio P H P
 
Web Application Insecurity Uncensored
Web Application Insecurity UncensoredWeb Application Insecurity Uncensored
Web Application Insecurity Uncensored
 
Al telefono con Adhearsion e Ruby
Al telefono con Adhearsion e RubyAl telefono con Adhearsion e Ruby
Al telefono con Adhearsion e Ruby
 

Más de Andrea Lazzarotto

Más de Andrea Lazzarotto (14)

Abel, il sistema di build della nuova CAINE
Abel, il sistema di build della nuova CAINEAbel, il sistema di build della nuova CAINE
Abel, il sistema di build della nuova CAINE
 
Reverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoTReverse Engineering per dispositivi IoT
Reverse Engineering per dispositivi IoT
 
Pubblicità invasiva e spiona: come proteggersi su Android
Pubblicità invasiva e spiona: come proteggersi su AndroidPubblicità invasiva e spiona: come proteggersi su Android
Pubblicità invasiva e spiona: come proteggersi su Android
 
Ricostruzione forense di NTFS con metadati parzialmente danneggiati
Ricostruzione forense di NTFS con metadati parzialmente danneggiatiRicostruzione forense di NTFS con metadati parzialmente danneggiati
Ricostruzione forense di NTFS con metadati parzialmente danneggiati
 
Recuperare dati da partizioni NTFS danneggiate
Recuperare dati da partizioni NTFS danneggiateRecuperare dati da partizioni NTFS danneggiate
Recuperare dati da partizioni NTFS danneggiate
 
Come funziona Internet e perché il software libero è fondamentale
Come funziona Internet e perché il software libero è fondamentaleCome funziona Internet e perché il software libero è fondamentale
Come funziona Internet e perché il software libero è fondamentale
 
RecuperaBit: Forensic File System Reconstruction Given Partially Corrupted Me...
RecuperaBit: Forensic File System Reconstruction Given Partially Corrupted Me...RecuperaBit: Forensic File System Reconstruction Given Partially Corrupted Me...
RecuperaBit: Forensic File System Reconstruction Given Partially Corrupted Me...
 
Dallo scatto al volantino
Dallo scatto al volantinoDallo scatto al volantino
Dallo scatto al volantino
 
Presentazione del progetto Itis Linux
Presentazione del progetto Itis LinuxPresentazione del progetto Itis Linux
Presentazione del progetto Itis Linux
 
Data Visualization — Le funzionalità matematiche di Sage per la visualizzazio...
Data Visualization — Le funzionalità matematiche di Sage per la visualizzazio...Data Visualization — Le funzionalità matematiche di Sage per la visualizzazio...
Data Visualization — Le funzionalità matematiche di Sage per la visualizzazio...
 
Italy... in pictures
Italy... in picturesItaly... in pictures
Italy... in pictures
 
Matematica di base e avanzata con Sage
Matematica di base e avanzata con SageMatematica di base e avanzata con Sage
Matematica di base e avanzata con Sage
 
Presentazioni di qualità professionale con Impress
Presentazioni di qualità professionale con ImpressPresentazioni di qualità professionale con Impress
Presentazioni di qualità professionale con Impress
 
Network Forensics
Network ForensicsNetwork Forensics
Network Forensics
 

Come sviluppo le applicazioni web

  • 1. Come sviluppo le applicazioni web Andrea Lazzarotto — andrealazzarotto.com
  • 2. Mi presento Sviluppatore software e consulente informatico Autore di vari software open source (script, RecuperaBit, …) Socio fondatore GrappaLUG
  • 3. Percorso A proposito di PHP Sviluppare il software Fare il deploy
  • 5. Sviluppo web Tantissimi usano PHP (e MySQL) WordPress, Wikipedia, Digg, Facebook Parliamone...
  • 7. Riguardo a htmlspecialchars «htmlspecialchars fu una tra le prime funzioni. Al tempo in cui PHP aveva meno di 100 funzioni e il meccanismo di hashing per i nomi di funzione era strlen().» — Rasmus Lerdorf, creatore di PHP
  • 8. I’m sick of this s***, don’t deny You’re a waste of time I’m sick of this s***, don’t ask why — Avril Lavigne, “I Can Do Better”
  • 9. Tipi e operatori NULL < -1 NULL == 0 2000 == "2e3" Tutti questi confronti danno come risultato il valore TRUE
  • 10. Ah ecco... «Non so come fermarlo, non c’era nessuna intenzione di scrivere un linguaggio di programmazione. […] Non ho idea di come si scriva un linguaggio di programmazione» — Rasmus Lerdorf, creatore di PHP
  • 11. You’re so full of s*** I can’t stand the way you act I just can’t comprehend — Avril Lavigne, “I Can Do Better”
  • 12. Messaggi di errore <?php $x = ?> syntax error, unexpected ';' function foo(string $s){} foo("hello world"); Argument 1 passed to foo() must be an instance of string, string given
  • 13. Chi l’avrebbe mai detto! «Ero molto, molto scarso nello scrivere i parser. Sono ancora molto scarso nello scrivere i parser.» — Rasmus Lerdorf, creatore di PHP
  • 14. I will drink as much limoncello as I can And I’ll do again and again — Avril Lavigne, “I Can Do Better”
  • 16. Oltre a bere per dimenticare…
  • 17. Python I tipi di dato hanno senso I messaggi di errore hanno senso Facilissimo e “batterie incluse”
  • 18. It’s a state of bliss, you think you’re dreaming It’s the happiness inside that you’re feeling It’s so beautiful it makes you wanna cry — Avril Lavigne, “Innocence”
  • 19. Flask Micro-framework web per Python Poco invasivo, veloce da imparare Estendibile con altri moduli (es. Flask-Login)
  • 21. Git Creazione repository: $ mkdir banana $ cd banana $ git init $ git remote add origin […] In remoto si può usare GitHub o Bitbucket File .gitignore: __pycache__/ *.py[cod] *$py.class *.so *.db *-journal config.py venv
  • 22. Virtualenv Racchiude tutte le dipendenze in una directory! $ pip install virtualenv Nel nostro progetto: $ virtualenv venv $ source venv/bin/activate.fish Per chi usa Bash, c’è lo script activate
  • 23. Scheletro del progetto Struttura: banana/ ├── banana.py Applicazione Flask ├── banana.wsgi Confgurazione per Apache ├── config.py File di confgurazione (escluso da Git) ├── config.py.example File di esempio (parametri fttizi) ├── requirements.txt Moduli Python da installare (Flask e altro) ├── static │   ├── favicon.ico Favicon (in realtà una PNG 128x128) │   └── robots.txt Indicazioni per i motori di ricerca └── templates └── home.html Template Jinja
  • 24. File principale from flask import Flask, render_template, request, send_from_directory app = Flask(__name__) @app.route("/") def index(): return render_template('home.html') @app.route('/favicon.ico') @app.route('/robots.txt') def static_from_root(): return send_from_directory(app.static_folder, request.path[1:]) if __name__ == '__main__': app.run(port=5000, debug=True)
  • 25. File per Apache WSGI import os import sys wd = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, wd) from banana import app as application
  • 26. Esempio di DB CREATE TABLE `guestbook` ( `date` TEXT NOT NULL, `name` TEXT NOT NULL ); $ sqlite3 data.db < data.sql
  • 27. Aggiungiamo una rotta @app.route("/guestbook") def guestbook(): name = request.args.get('name') if name: message = 'Benvenuto {}!'.format(name) # TODO: inserire visita nel database con timestamp else: message = 'Mmm... chi sei?' return render_template('guestbook.html', message=message) Il template guestbook.html contiene: <h1>{{ message }}</h1>
  • 31. Proflo utente sul server # cd /var/www/ # mkdir Banana # adduser banana # chown banana:banana Banana # su banana
  • 32. Clone del repository $ git clone git@github.com:Lazza/flask-banana.git /var/www/Banana $ cd /var/www/Banana $ pip install -u -r requirements.txt $ sqlite3 data.db < data.sql $ cp config.py.example config.py $ nano config.py
  • 33. Confgurazione di Apache <VirtualHost *:443> ServerName example.com ErrorLog ${APACHE_LOG_DIR}/banana_error.log CustomLog ${APACHE_LOG_DIR}/banana.log combined Alias /.well-known /var/www/Banana/.well-known WSGIDaemonProcess banana user=banana group=banana threads=20 WSGIScriptAlias / /var/www/Banana/banana.wsgi <Directory /var/www/Banana> WSGIProcessGroup banana WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> SSLEngine On SSLCertificateFile /path/fullchain.pem SSLCertificateKeyFile /path/privkey.pem </VirtualHost> Salvato in sites-available/banana.conf *:80 fa solo redirect a HTTPS # a2ensite banana
  • 34. Successivi aggiornamenti dev@laptop $ git push banana@server $ git pull root@server # service apache2 reload
  • 35. Grazie per l’attenzione Andrea Lazzarotto @thelazza https://andrealazzarotto.com