123
Photo by https://www.flickr.com/photos/zergev/ La Caja de Herramientas del Desarrollador Moderno Pablo Godel @pgodel Buenos Aires 08 Nov 2014

La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Embed Size (px)

DESCRIPTION

En los últimos años ha habido un tremendo progreso e innovación en herramientas y aplicaciones disponibles para que el desarrollador web mejore la calidad, eficiencia y velocidad de sus aplicaciones. Es difícil estar al tanto de todas estas actualizaciones. En esta charla introduciremos y exploraremos las herramientas que marcan una real diferencia en las siguientes áreas: Desarrollo, testeo y debugging con Vagrant, Ansible, y Docker Monitoreo y logging con Logstash, Kibana, Redis, y Elasticsearch Deployment con Capistrano, Capifony y similares Todas estas herramientas, además de consejos y trucos aprendidos a lo largo de años de experiencia harán de esta charla muy interesante para desarrolladores de diversos niveles.

Citation preview

Page 1: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Photo by https://www.flickr.com/photos/zergev/

La Caja de Herramientas !del Desarrollador Moderno

Pablo Godel @pgodel

Buenos Aires 08 Nov 2014

Page 2: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Hola, soy Pablo.

Page 3: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Hola, soy Pablo. !

@pgodel

Page 4: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
Page 5: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

A GUIDING LIGHT FOR STUDENT SUCCESS

Page 6: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

We are Hiring!

A GUIDING LIGHT FOR STUDENT SUCCESS

Page 7: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

La Caja de Herramientas Moderna

Moderno?

Page 8: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
Page 9: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

[root@prod] # vi index.php

La Caja de Herramientas Moderna

Page 10: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Nunca dejes !de mejorar

La Caja de Herramientas Moderna

Page 11: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

La Caja de Herramientas

La Caja de Herramientas Moderna

Page 12: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

La Caja de Herramientas Moderna

Page 13: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing

La Caja de Herramientas Moderna

Page 14: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing !

Debugging

La Caja de Herramientas Moderna

Page 15: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing !

Debugging !

Profiling

La Caja de Herramientas Moderna

Page 16: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing !

Debugging !

Profiling !

Deployment

La Caja de Herramientas Moderna

Page 17: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing !

Debugging !

Profiling !

Deployment !

Logging

La Caja de Herramientas Moderna

Page 18: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo !

Testing !

Debugging !

Profiling !

Deployment !

Logging !

Monitoring

La Caja de Herramientas Moderna

Page 19: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

La Caja de Herramientas Moderna

Page 20: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

Todo empieza con un entorno de desarrollo sólido

Page 21: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Eligiendo un OS

Entorno de Desarrollo

Page 22: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #1

Entorno de Desarrollo

Page 23: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #1: Trabajá “cerca” de Producción

Entorno de Desarrollo

Page 24: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #2

Entorno de Desarrollo

Page 25: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #2: Dejá Windows

Entorno de Desarrollo

Page 26: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #3

Entorno de Desarrollo

Page 27: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Regla #3: No te olvides de la Regla #2

Entorno de Desarrollo

Page 28: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

Page 29: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Automatizá tu configuración

Entorno de Desarrollo

Page 30: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Automatizá tu configuración !

#1 Guardá tus “dot-files” en Git/GitHub

Entorno de Desarrollo

Page 31: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

https://github.com/pgodel/dotfiles

Dot files .profile / .bash_profile / .bashrc .gitconfig .gitignores.ssh/config

https://github.com/everzet/dotfiles

Entorno de Desarrollo

Page 32: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Automatizá tu configuración !

#2 Automatizá la instalación de tu software

Entorno de Desarrollo

Page 33: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Homebrew!!

• hhvm • wget • git • tmux • ssh-copy-id • brew-cask • ansible

Entorno de Desarrollo

Page 34: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Incluso .dmg’s! !

!

• google-chrome • vagrant • virtualbox • iterm2 • alfred • phpstorm

$ brew cask install …

!https://github.com/caskroom/homebrew-cask

Entorno de Desarrollo

Page 35: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Corré Linux nativa o localmente !

• REMI repo para CentOS • PPAs para Ubuntu / Debian

Instalando PHP

Entorno de Desarrollo

Page 36: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Corré Linux en VPS ó servidor remoto !

• REMI repo para CentOS • PPAs para Ubuntu / Debian

Entorno de Desarrollo

Instalando PHP

Page 37: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Mac OSX !

• MAMP • Instalador de PHP de Liip

Entorno de Desarrollo

Instalando PHP

http://php-osx.liip.ch/

Page 38: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Máquina Virtual • VirtualBox / Parallels / VMware • Vagrant • Docker

Entorno de Desarrollo

Instalando PHP

Page 39: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

Instalando PHP

$ php -S localhost:8080

Page 40: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

PHARS!!

• Composer • PHPUnit • behat • WP-CLI • versionscan

Entorno de Desarrollo

Page 41: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Vagrant!!

• PuPHPet • Phansible

Entorno de Desarrollo

Page 42: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

VagrantHost

Vagrant

VM VM VM

Web Server

DB Server

App Server

Entorno de Desarrollo

Page 43: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

Page 44: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

DockerHost

Docker client

CVM

Web Server

DB Server

App Server

C C

Entorno de Desarrollo

Page 45: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

DockerHost

Docker client

C

VM

Web Server

DB Server

App Server

C C

Entorno de Desarrollo

Page 46: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

DockerHost

Docker client

C

VM

Web Server

DB Server

App Server

C C

Entorno de Desarrollo

Page 47: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 48: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 49: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
Page 50: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$ ansible-playbook -i inventories/dev \ playbook.yml -v -K

https://github.com/pgodel/ansible-local-dev

Entorno de Desarrollo

Page 51: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Usá el Editor/IDE correcto para vos

Entorno de Desarrollo

Page 52: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Entorno de Desarrollo

Usá el Editor/IDE correcto para vos!!

• PHPStorm • Zend Studio • TextMate • Vim

Page 53: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Usá el Editor/IDE correcto para vos!!

• PHPStorm!• Zend Studio • TextMate • Vim

Entorno de Desarrollo

Page 54: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 55: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 56: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 57: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 58: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 59: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing

La Caja de Herramientas Moderna

Page 60: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit

Page 61: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat

Page 62: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l

Page 63: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins

Page 64: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI

!

Page 65: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI • CircleCI

Page 66: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Testing!

!

• Unit testing con PHPUnit • BDD con Behat • Git hooks + php -l • Jenkins • Travis CI • CircleCI • JoliCI

Page 67: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

!

!

• phpmd / PHP Depend • PhpMetrics • SensioLabs Insight • Scrutinizer

Testing

Page 68: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Debugging

La Caja de Herramientas Moderna

Page 69: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

print_r($data);

Debugging

Page 70: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

LadyBug<?php $var = array( array( 'name' => 'Raul', 'age' => 29 ), array( 'name' => 'John', 'age' => 27 ) ); !ladybug_dump($var)

Debugging

Page 71: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

LadyBug

Debugging

Page 72: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

XDebug + PHPStorm

Debugging

Page 73: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

The Modern Developer Toolbox

Debug de comandos CLI con PHPStorm !

Debugging PRO TIP

$ export \ XDEBUG_CONFIG=“idekey=PHPSTORM"

Page 74: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Symfony Developer Toolbar

Debugging

Page 75: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Zend Studio + Zend Server + Z-RayDebugging

Page 76: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Profiling

La Caja de Herramientas Moderna

Page 77: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Profiling!

!

XDebug

Page 78: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Profiling!

!

XHProf + XHProf.io

Page 79: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Profiling!

Opciones comerciales !

• Zend Server • Blackfire.io (SensioLabs Profiler)

Page 80: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment

La Caja de Herramientas Moderna

Page 81: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment

• Capistrano (Ruby) / Capifony • Fabric (Python) • Idephix (PHP) • Magellanes (PHP) • Deployer (PHP) • Laravel / envoy (PHP) • Rocketeer (PHP) • Ansible (YAML)

Page 82: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Pasos comunes

Deployment

Page 83: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts

Page 84: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts • Definí tasks / acciones

Page 85: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso

Page 86: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso

• Operación confiable

Page 87: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso

• Operación confiable • Migraciones

Page 88: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment!

!

• Definí los hosts • Definí tasks / acciones • Ejecuta el proceso

• Operación confiable • Migraciones • Rollbacks

Page 89: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment con

Deployment

Page 90: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 91: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

!

!

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

Page 92: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

- 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

Page 93: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

!

!

Ejecutá el proceso

$ ansible-playbook -i inventories/servers \ playbook.yml -v

Deployment con Ansible

Page 94: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Deployment con Ansible!

!

Ejecutá el proceso

Page 95: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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

Page 96: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Logging

La Caja de Herramientas Moderna

Page 97: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

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');

Page 98: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Logging

!

• Rota los archivos de logs • Syslog / AMQP • Email / Chat servers • Redis / MongoDB / ElasticSearch • NullHandler • FingersCrossedHandler

Monolog

Page 99: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

tail -f /var/log/apache2/*log

Logging

Page 100: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

tail -f /var/log/apache2/*log | grep “Fatal error”

Logging

Page 101: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Logging

App / Logstash

Redis Logstash filter/processor

ElasticSearch Kibana

App / Logstash App / Logstash

Logstash + ElasticSearch + Kibana

Page 102: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Logstash

Logging

input { file { path => “/var/log/apache2/access_log” } } output { elasticsearch { host => localhost } }

Page 103: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Kibana

Logging

Page 104: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Monitoring

La Caja de Herramientas Moderna

Page 105: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Monitoring

Medí todo!

Page 106: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Monitoring

App

StatsD Graphite

Grafana

App App

StatsD + Graphite + Grafana

Page 107: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

StatsD + liuggio/statsd-php-client

$ composer require liuggio/statsd-php-client:dev-master

Monitoring

Page 108: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$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

Page 109: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$data[] = $factory->timing('usageTime', 100);!!

// Enviá los datos como array o objecto $client->send($data);

Monitoring

StatsD + liuggio/statsd-php-client

Page 110: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$data[] = $factory->increment('visitor');!!

// Enviá los datos como array o objecto $client->send($data);

Monitoring

StatsD + liuggio/statsd-php-client

Page 111: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$data[] = $factory->decrement('click');!!

// Enviá los datos como array o objecto $client->send($data);

Monitoring

StatsD + liuggio/statsd-php-client

Page 112: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

$data[] = $factory->gauge('gaugor', 333);!!

// Enviá los datos como array o objecto $client->send($data);

Monitoring

StatsD + liuggio/statsd-php-client

Page 113: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Graphite

Monitoring

Page 114: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Graphite

Monitoring

Page 115: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Grafana

Monitoring

Page 116: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from .your_domain.com </Location> !ExtendedStatus On

Apache Requests

Monitoring

Page 117: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Apache Requests

Monitoring

Page 118: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Apache Requests

Monitoring

Page 119: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

MonitoringCPU / Memory / IOtop

Page 120: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

Monitoring

IOiotop

Page 121: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

https://www.flickr.com/photos/jaquiza

La Caja de Herramientas Moderna

Page 122: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

¡Preguntas!

La Caja de Herramientas Moderna

Page 123: La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR

!

!

!

!

!

http://slideshare.net/pgodel @pgodel

¡Muchas Gracias!

La Caja de Herramientas Moderna