Photo by https://www.flickr.com/photos/zergev/ La Caja de Herramientas del Desarrollador Moderno Pablo Godel @pgodel Buenos Aires 08 Nov 2014
Jul 02, 2015
Photo by https://www.flickr.com/photos/zergev/
La Caja de Herramientas !del Desarrollador Moderno
Pablo Godel @pgodel
Buenos Aires 08 Nov 2014
Hola, soy Pablo.
Hola, soy Pablo. !
@pgodel
A GUIDING LIGHT FOR STUDENT SUCCESS
We are Hiring!
A GUIDING LIGHT FOR STUDENT SUCCESS
La Caja de Herramientas Moderna
Moderno?
[root@prod] # vi index.php
La Caja de Herramientas Moderna
Nunca dejes !de mejorar
La Caja de Herramientas Moderna
La Caja de Herramientas
La Caja de Herramientas Moderna
Entorno de Desarrollo
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing !
Debugging
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing !
Debugging !
Profiling
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing !
Debugging !
Profiling !
Deployment
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing !
Debugging !
Profiling !
Deployment !
Logging
La Caja de Herramientas Moderna
Entorno de Desarrollo !
Testing !
Debugging !
Profiling !
Deployment !
Logging !
Monitoring
La Caja de Herramientas Moderna
Entorno de Desarrollo
La Caja de Herramientas Moderna
Entorno de Desarrollo
Todo empieza con un entorno de desarrollo sólido
Eligiendo un OS
Entorno de Desarrollo
Regla #1
Entorno de Desarrollo
Regla #1: Trabajá “cerca” de Producción
Entorno de Desarrollo
Regla #2
Entorno de Desarrollo
Regla #2: Dejá Windows
Entorno de Desarrollo
Regla #3
Entorno de Desarrollo
Regla #3: No te olvides de la Regla #2
Entorno de Desarrollo
Entorno de Desarrollo
Automatizá tu configuración
Entorno de Desarrollo
Automatizá tu configuración !
#1 Guardá tus “dot-files” en Git/GitHub
Entorno de Desarrollo
https://github.com/pgodel/dotfiles
Dot files .profile / .bash_profile / .bashrc .gitconfig .gitignores.ssh/config
https://github.com/everzet/dotfiles
Entorno de Desarrollo
Automatizá tu configuración !
#2 Automatizá la instalación de tu software
Entorno de Desarrollo
Homebrew!!
• hhvm • wget • git • tmux • ssh-copy-id • brew-cask • ansible
Entorno de Desarrollo
Incluso .dmg’s! !
!
• google-chrome • vagrant • virtualbox • iterm2 • alfred • phpstorm
$ brew cask install …
!https://github.com/caskroom/homebrew-cask
Entorno de Desarrollo
Corré Linux nativa o localmente !
• REMI repo para CentOS • PPAs para Ubuntu / Debian
Instalando PHP
Entorno de Desarrollo
Corré Linux en VPS ó servidor remoto !
• REMI repo para CentOS • PPAs para Ubuntu / Debian
Entorno de Desarrollo
Instalando PHP
Mac OSX !
• MAMP • Instalador de PHP de Liip
Entorno de Desarrollo
Instalando PHP
http://php-osx.liip.ch/
Máquina Virtual • VirtualBox / Parallels / VMware • Vagrant • Docker
Entorno de Desarrollo
Instalando PHP
Entorno de Desarrollo
Instalando PHP
$ php -S localhost:8080
PHARS!!
• Composer • PHPUnit • behat • WP-CLI • versionscan
Entorno de Desarrollo
Vagrant!!
• PuPHPet • Phansible
Entorno de Desarrollo
VagrantHost
Vagrant
VM VM VM
Web Server
DB Server
App Server
Entorno de Desarrollo
Entorno de Desarrollo
DockerHost
Docker client
CVM
Web Server
DB Server
App Server
C C
Entorno de Desarrollo
DockerHost
Docker client
C
VM
Web Server
DB Server
App Server
C C
Entorno de Desarrollo
DockerHost
Docker client
C
VM
Web Server
DB Server
App Server
C C
Entorno de Desarrollo
DockerHost
Docker client
C
VM
Web Server
DB Server
App Server
C C
Host
C
VM
Web Server
DB Server
App Server
C C
Entorno de Desarrollo
DockerHost
Docker client
C
VM
Web Server
DB Server
App Server
C C
Host
C
VM
Web Server
DB Server
App Server
C C
Host
C
Web Server
DB Server
App Server
C C
Docker Kernel
Entorno de Desarrollo
$ ansible-playbook -i inventories/dev \ playbook.yml -v -K
https://github.com/pgodel/ansible-local-dev
Entorno de Desarrollo
Usá el Editor/IDE correcto para vos
Entorno de Desarrollo
Entorno de Desarrollo
Usá el Editor/IDE correcto para vos!!
• PHPStorm • Zend Studio • TextMate • Vim
Usá el Editor/IDE correcto para vos!!
• PHPStorm!• Zend Studio • TextMate • Vim
Entorno de Desarrollo
Usá el Editor/IDE correcto para vos!!
• PHPStorm!• Rápido • Syntax highlighting para PHP 5.6 • Diffs de Git y otras acciones • Breakpoints • y mucho más!
!
!
Entorno de Desarrollo
Configurando SSH
$ ssh-keygen -t dsa ~/.ssh/id_dsa.pub !
$ ssh-copy-id user@remote-host ~/.ssh/authorized_keys ~/.ssh/authorized_keys2 !
$ ssh-add
Entorno de Desarrollo
Host * ForwardAgent yes Port 22123 !
Host gh HostName github.com Port 22 PreferredAuthentications publickey IdentityFile ~/.ssh/me_rsa
~/.ssh/config
Entorno de Desarrollo
Configurando SSH
Virtual Document RootUseCanonicalName Off !VirtualDocumentRoot /var/www/vhosts/%0/web !<Location /var/www/vhosts> AllowOverride All Options +FollowSymLinks </Location>
example.com => /var/www/vhosts/example.com/webexample2.com => /var/www/vhosts/example2.com/web
Entorno de Desarrollo
DNSmasq
$ brew install dnsmasq !… !# Editar /usr/local/etc/dnsmasq.conf !address=/dev/127.0.0.1
app-1.dev => /var/www/vhosts/app-1.dev/webapp-22.dev => /var/www/vhosts/app-22.dev/web
Entorno de Desarrollo
Testing
La Caja de Herramientas Moderna
Testing!
!
• Unit testing con PHPUnit
Testing!
!
• Unit testing con PHPUnit • BDD con Behat
Testing!
!
• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l
Testing!
!
• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins
Testing!
!
• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI
!
Testing!
!
• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI • CircleCI
Testing!
!
• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI • CircleCI • JoliCI
!
!
• phpmd / PHP Depend • PhpMetrics • SensioLabs Insight • Scrutinizer
Testing
Debugging
La Caja de Herramientas Moderna
print_r($data);
Debugging
LadyBug<?php $var = array( array( 'name' => 'Raul', 'age' => 29 ), array( 'name' => 'John', 'age' => 27 ) ); !ladybug_dump($var)
Debugging
LadyBug
Debugging
XDebug + PHPStorm
Debugging
The Modern Developer Toolbox
Debug de comandos CLI con PHPStorm !
Debugging PRO TIP
$ export \ XDEBUG_CONFIG=“idekey=PHPSTORM"
Symfony Developer Toolbar
Debugging
Zend Studio + Zend Server + Z-RayDebugging
Profiling
La Caja de Herramientas Moderna
Profiling!
!
XDebug
Profiling!
!
XHProf + XHProf.io
Profiling!
Opciones comerciales !
• Zend Server • Blackfire.io (SensioLabs Profiler)
Deployment
La Caja de Herramientas Moderna
Deployment
• Capistrano (Ruby) / Capifony • Fabric (Python) • Idephix (PHP) • Magellanes (PHP) • Deployer (PHP) • Laravel / envoy (PHP) • Rocketeer (PHP) • Ansible (YAML)
Pasos comunes
Deployment
Deployment!
!
• Definí los hosts
Deployment!
!
• Definí los hosts • Definí tasks / acciones
Deployment!
!
• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso
Deployment!
!
• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso
• Operación confiable
Deployment!
!
• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso
• Operación confiable • Migraciones
Deployment!
!
• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso
• Operación confiable • Migraciones • Rollbacks
Deployment con
Deployment
Deployment con Ansible!
!
Definí los hosts[webservers] foo.example.com bar.example.comwww[01:50].example.com ![dbservers] one.example.com two.example.com three.example.com
!
!
Definí tasks / acciones--- - hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started
Deployment con Ansible
- hosts: webservers roles: - { role: servergrove.symfony2, symfony2_project_root: /var/www/vhosts/example.com/, symfony2_project_name: demo, symfony2_project_branch: master , symfony2_project_release: 1 }
!
!
Definí tasks / acciones
Deployment con Ansible
!
!
Ejecutá el proceso
$ ansible-playbook -i inventories/servers \ playbook.yml -v
Deployment con Ansible
Deployment con Ansible!
!
Ejecutá el proceso
Effing Package Management
https://github.com/jordansissel/fpm
Armá paquetes para múltiples plataformas (deb, rpm, etc) sin volverte loco.
fpm -s dir -t rpm -n "webapp" -v 1.0 /var/www/webapp !fpm -s dir -t deb -a all -n webapp -v 1.0 /etc/apache2/conf.d/my.conf /var/www/webapp
Deployment
Logging
La Caja de Herramientas Moderna
Monolog
Logging
use Monolog\Logger; use Monolog\Handler\StreamHandler; !// crear canal de log $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); !// Agregar registros al log $log->addWarning('Foo'); $log->addError('Bar');
Logging
!
• Rota los archivos de logs • Syslog / AMQP • Email / Chat servers • Redis / MongoDB / ElasticSearch • NullHandler • FingersCrossedHandler
Monolog
tail -f /var/log/apache2/*log
Logging
tail -f /var/log/apache2/*log | grep “Fatal error”
Logging
Logging
App / Logstash
Redis Logstash filter/processor
ElasticSearch Kibana
App / Logstash App / Logstash
Logstash + ElasticSearch + Kibana
Logstash
Logging
input { file { path => “/var/log/apache2/access_log” } } output { elasticsearch { host => localhost } }
Kibana
Logging
Monitoring
La Caja de Herramientas Moderna
Monitoring
Medí todo!
Monitoring
App
StatsD Graphite
Grafana
App App
StatsD + Graphite + Grafana
StatsD + liuggio/statsd-php-client
$ composer require liuggio/statsd-php-client:dev-master
Monitoring
$sender = new SocketSender(/*'localhost', 8126, 'udp'*/); !$client = new StatsdClient($sender); $factory = new StatsdDataFactory('\Liuggio\StatsdClient\Entity\StatsdData'); !// create the data with the factory $data[] = $factory->timing('usageTime', 100); $data[] = $factory->increment('visitor'); $data[] = $factory->decrement('click'); $data[] = $factory->gauge('gaugor', 333); $data[] = $factory->set('uniques', 765); !// Enviá los datos como array o objecto $client->send($data);
Monitoring
StatsD + liuggio/statsd-php-client
$data[] = $factory->timing('usageTime', 100);!!
// Enviá los datos como array o objecto $client->send($data);
Monitoring
StatsD + liuggio/statsd-php-client
$data[] = $factory->increment('visitor');!!
// Enviá los datos como array o objecto $client->send($data);
Monitoring
StatsD + liuggio/statsd-php-client
$data[] = $factory->decrement('click');!!
// Enviá los datos como array o objecto $client->send($data);
Monitoring
StatsD + liuggio/statsd-php-client
$data[] = $factory->gauge('gaugor', 333);!!
// Enviá los datos como array o objecto $client->send($data);
Monitoring
StatsD + liuggio/statsd-php-client
Graphite
Monitoring
Graphite
Monitoring
Grafana
Monitoring
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from .your_domain.com </Location> !ExtendedStatus On
Apache Requests
Monitoring
Apache Requests
Monitoring
Apache Requests
Monitoring
MonitoringCPU / Memory / IOtop
Monitoring
IOiotop
https://www.flickr.com/photos/jaquiza
La Caja de Herramientas Moderna
¡Preguntas!
La Caja de Herramientas Moderna
!
!
!
!
!
http://slideshare.net/pgodel @pgodel
¡Muchas Gracias!
La Caja de Herramientas Moderna