Modern PHP
Ari Stopassola Junior
20 anos
http://haphpy-birthday.net
https://plus.google.com/115682389249477476280/posts
O começo…
• Rasmus Lerdorf
• Conjunto de scripts
• "Personal Home Page
Tools"
• Viveu em Porto Alegre de
1991 a 1993
Extraído de: http://lerdorf.com/resume/
História
Popularidade
http://w3techs.com/technologies/overview/programming_language/
all
+82% de TODA a internet usa PHP
Renascimento
https://pt.wikipedia.org/wiki/Homem_Vitruviano_%28desenho_de_Leonardo_da_Vinci%29
Framework Interoperability Group
PSR
PHP Standards
Recommendations
http://www.php-fig.org/psr/
PSR-1
http://www.php-fig.org/psr/psr-
1/
<?php
namespace AgenciaReceptivo;
class ItinerarioDePasseio
{
const IDADE_MIN = 5;
public function montaRoteiro()
{
}
}
<?php ou <?= ?>
Namespace
s
StudlyCap
s
MAIÚSCULA
S
camelCas
e
PSR-2
http://www.php-fig.org/psr/psr-2/<?php
namespace AgenciaReceptivo;
class ItinerarioDePasseio
{
const IDADE_MIN = 5;
public function montaRoteiro()
{
}
}
Identação com 4 espaços
Não fecha ?>
Visibilidade
Chaves (classes e métodos) sempre em nova linha
Linha em branco após a declaração de namespace
Coding Standards
http://pear.php.net/package/PHP_CodeSniffer
Instalação:
pear install PHP_CodeSniffer
ou
apt-get install php-codesniffer (Linux)
phpcs hello.php
phpcs --standard=zend hello.php
Checar e corrigir
• Para checar o PSR-1 e PSR-2 utilize o
CodeSniffer:
phpcs --standard=PSR2 arquivo.php
• Para corrigir de eventuais problemas utilize
Code Beautifier and Fixer:
phpcbf --standard=PSR2 arquivo.php
Boas
práticas vão
além...
• Controle de versão. Ex.: git
• Metodologias ágeis. Ex.: Scrum
• Padrões de Projeto (design patterns)
• Ambientes homogêneos. Ex.: Vagrant e
Docker
• Mecanismos de implantação
(deployment)
• Testes
• API-centric
• Conduta
https://cleancoders.com
QA: quality assurance
http://phpqatools.org
Outros padrões
recomendados
• PSR-3 Logger Interface
• PSR-4 Autoloading Standard
• PSR-6 Caching Interface
• PSR-7 HTTP Message Interface
Componentes
Gestor de dependências para PHP
http://getcomposer.org
Packagist: repositório de
pacotes
https://packagist.org
php composer.phar require phpoffice/phpword
https://packagist.org/statistics
<?php
require "vendor/autoload.php";
$mail = new PHPMailer;
$mail = null;
$pdf = new fpdfFPDF();
$pdf->output("documento.pdf", "F");
$pdf = null;
use PhpOfficePhpWordPhpWord;
$doc = new PhpWord;
$doc->save("documento.doc", 'Word2007');
use InterventionImageImageManagerStatic as Image;
$img = Image::make('IMG_8529.JPG');
$img->resize(50, 50);
$img->save('miniatura.jpg');
Instalação de componentes
curl -sS https://getcomposer.org/installer | php
php composer.phar require phpmailer/phpmailer
php composer.phar require itbz/fpdf
php composer.phar require phpoffice/phpword
php composer.phar require intervention/image
composer.json
Namespaces
• Definições de classes são globais, portanto o
desenvolvedor precisava ter cuidado ao nomear suas
classes – podendo sobrescrever outras bibliotecas
(de terceiros)
• Uma estratégia de nomenclatura era criar algo como:
Perito_Biblioteca_TrataImagem
• Encapsula classes, funções e constantes
• Resolve problemas no reuso de código, dentre eles:
• Colisão entre nomes
• Habilidade de abreviar nomes longos
Documentação
Documentação
• Faz parser do código em busca de DocBlocks
• Auto-documentação
• Converte em HTML, PDF, CHM e XML
(DocBook)
• phpDocumentor
http://www.phpdoc.org
• DocBlox
http://www.docblox-project.org
• Doxygen
http://www.doxygen.org
• PHP Dox
http://phpdox.net/
phpdoc -t docs/ -o PDF:default:default -d .
Diretório
local
Frameworks
“They all suck!”
Rasmus Lerdorf – PHP Frameworks Day 2013
I'm kidding!
Life is full of choices...
Frameworks
full-stack
Fonte: http://microphp.org
Provisionamento
www.phansible.com
xDebug
• Extensão PHP criada em 2002 por Derick
Rethans
• Ferramenta de debug e profiling para PHP
• Empilhamento de funções e rastreamento de
erros
• Profiling detecta gargalos de performance
• Permite uma execução passo-a-passo, mesmo
remotamente (observando o conteúdo das
variáveis)
• Não utilize em servidores de produção!
• Exibe informações privilegiadas e expõe
brechas de segurança
Otimização
Profiling
• Identificar gargalos
• Analisa a execução do script e mede uso de
memória, tempo de execução e frequência das
chamadas de função
• Ferramentas que fazem a leitura da saída
cache grind:
• KCachegrind
• Webgrind
• MacCallGrind
• WinCacheGrind
• xdebugtoolkit ou CachegrindVisualizer (geram .dot)
• Graphviz (lê o .dot e gera uma árvore)
Profiler: KCachegrind
Profiler: webgrind
https://github.com/jokkedk/webgrind
Opcode Cache
• Scripts PHP são compilados on-the-fly
• Supostamente mais lento que as linguagens
pré-compiladas
• Zend Optimizer+ tornou-se open source e foi
renomeado para OPcache
• Opcache gera um bytecode e o armazena em
memória
• É nativo no PHP 5.5 (desde que o PHP seja
compilado com a opção --enable-opcache)
Lab: ApacheBench
ab -n 100 -c 5 http://www.site.com/
Compare com e sem Opcache, onde diz:
Time taken for tests
Cenário…
Nesse caso o método CargaDescarga
(também útil na classe Transfer) deverá
ser copiado
✗
<?php
class Passeios {
function PagaComissao(){
return "Paga comissao...";
}
}
trait Recursos {
function CargaDescarga(){
return "Realiza carga e
descarga";
}
}
class Transfer extends Passeios {
use Recursos;
}
$obj = new Transfer;
echo $obj->CargaDescarga();
Traits
Ecossistem
a
Editores
Editores (IDEs)
• Commits rápidos
• Trabalha offline
• Todos tem cópia
Controle de versão compartilhado
Hospedado
• GitHub
• BitBucket
• Atlassian
Stash
Servidor próprio
• Gitosis
• Gitorious
• GitLab
• GitBlit
Fonte: http://abload.de/img/in_case_of_fireirrtb.jpg
O que seria um build no PHP?
• Submeter aos testes (unitário, comportamento e
integração)
• Executar as migrations
• Concatenar e minificar arquivos JavaScript e CSS
• Comprimir imagens
• Compilar Sass e LESS
• Atribuir permissões em arquivos/pastas
• Produzir arquivos estáticos, como HTMLs
• Agendamentos na CRON
• php.ini local x php.ini do servidor x php.ini do CLI
• Transformar código de ECMA6 para ECMA5
<?xml version="1.0" encoding="UTF-8"?>
<!-- Demonstração de como alterar as credenciais de BD - by Ari Jr. arijunior@gmail.com (25/4/2013)-->
<project name="CartridgeMagento" default="principal" basedir=".">
<target name="ConfiguraVarAmbiente">
<property name="db_host" value="${env.DBHOST}" override="yes" />
<property name="db_user" value="${env.DBUSER}" override="yes" />
<property name="db_pass" value="${env.DBPASS}" override="yes" />
<property name="db_name" value="${env.DBNAME}" override="yes" />
</target>
<target name="principal" depends="ConfiguraVarAmbiente" description="Altera o arquivo de conf. do
Magento">
<!-- Copia o template e aplica uma cadeia de filtros -->
<copy file="app/etc/local.xml.template" tofile="app/etc/local_outro.xml" overwrite="true">
<filterchain>
<replacetokens begintoken="{{" endtoken="}}">
<token key="db_host" value="${db_host}" />
<token key="db_user" value="${db_user}" />
<token key="db_pass" value="${db_pass}" />
<token key="db_name" value="${db_name}" />
</replacetokens>
</filterchain>
</copy>
</target>
</project>
IaaS
PaaS
SaaS
OpenShift, Heroku, Google App Engine (Google Cloud), AppFog,
Pagoda Box, Fortrabbit, Laravel Forge
Digital Ocean, AWS, Linode, Azure, Rackspace, Open Stack
Hospedagem: cloud
Implantação: simples, previsível e reversível
Foto:https://flic.kr/p/6mNHcj
Deployment
•Capistrano
http://capistranorb.com
•Phing (manual)
http://www.phing.info
•Rocketeer
http://rocketeer.autopergamene.eu
•Magallanes
http://magephp.com
Testes
Codeception
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('Me autenticar no sistema');
$I->amOnPage('/login');
$I->fillField('email', 'arijunior@gmail.com');
$I->fillField('senha', 'p@$$w0#d');
$I->click('Entrar');
$I->see('Agenda', 'h1');
?>
Migrations: Phinx
https://phinx.org
Segurança
API para hashing de senha
• Converte a senha em um token de uma
só via
• Haviam bibliotecas separadas para essa
finalidade:
http://openwall.com/phpass/
• Dificilmente se consegue aplicar
engenharia reversa para decifrar a senha
original
Funções
<?php
$pass1 = password_hash("senha", PASSWORD_BCRYPT);
echo $pass1;
//$2y$10$bi8RpsxOvEt5mdmZRQjPqewPpw5OhRQcIQZWDld3/GDC3t6dL6wFC
//Tornando a hash ainda mais difícil de decifrar:
//salt (tempero) deve conter 22 caracteres
//cost representa o tempo de CPU utilizado. Deve ser de 4 a 31.
//Obs. a partir de 10 começa a comprometer significativamente a performance
$pass2 = password_hash("senha", PASSWORD_BCRYPT, array('salt'=>'Junicao2k14AriNetoPalo',
'cost'=>8));
echo $pass2;
//$2y$11$Junicao2k14AriNetoPalea7XU5I/HU2TBiIy1ISQPliFAawO8ptq
• Gera uma hash de 60 caracteres
• Constante PASSWORD_BCRYPT representa o algoritmo
BlowFish
• Constante PASSWORD_BCRYPT_DEFAULT_COST possui 10 como
padrão
Mapeamento Objeto Relacional (ORM)
• Persistir o objeto numa
estrutura de dados
relacional
• Tradução para tabelas,
campos e linhas
• ORM mascara detalhes
obscuros
• Overhead
• Requer aprendizagem de
outras tencnologias. Ex.:
DQL (Doctrine), Propel,
Eloquent etc.
http://www.edzynda.com/use-laravels-eloquent-orm-outside-of-laravel/
Object-relational mapping
<?php
//SELECT * FROM artigos WHERE id=23
$artigo = AppArtigos::find(23);
$artigo->titulo = "Apresentando Modern PHP";
$artigo->publicado_em = CarbonCarbon::now();
$artigo->save();
//SELECT * FROM artigos WHERE titulo='Ari'
$artigo = AppArtigos::where('titulo', 'Ari')->get();
//SELECT * FROM artigos WHERE assunto='PHP' ORDER BY
publicado_em DESC LIMIT 10
$artigo = AppArtigos::where('assunto', 'PHP')
->orderBy('publicado_em', 'desc')
->take(10)
->get();
$artigos = AppArtigos::all();
return $artigos;
HHVM, Hack e PHP7
http://alshain4.deviantart.com/art/Elephant-whisperer-292023268
Facebook
• 12.5 milhões de
requisições por segundo
(tráfego dinâmico!)
• 260 milhões de
conexões abertas
simultaneamente
• 1.1 bilhão de usuários
ativos/mês
Dados extraídos da palestra do gaúcho
Marlon Dutra no FISL14 (em julho/2013)
intitulada "Facebook: gerenciando
tráfego globalmente para atender 1
bilhão de usuários":
https://www.youtube.com/watch?v=Sv_xpGzRiOo
http://wp.clicrbs.com.br/login/2013/07/05/conheca-marlon-o-gaucho-que-controla-os-numeros-do-facebook/?topo=13,1,1,,11,13
Declaração de tipos
<?php
declare(strict_types=1);
function obterTotal(float $a, float $b) : float {
return $a + $b;
}
obterTotal(2, "Ari"); //Fatal error
obterTotal(2.8, "3.2"); //Fatal error
obterTotal(2.5, 1);
//int(1) muda para float(1.0) e retorna float(3.5)
Tratamento de erros fatais
<?php
declare(strict_types=1);
function soma(int $a, int $b) : int {
return $a + $b;
}
try {
$total = soma(3, 5.6);
echo $total;
} catch (Throwable $e) {
echo $e->getMessage();
} finally {
echo "Finaliza independentemente";
}
Comunidades
Por onde eu começo?
Fonte: http://doc.php.net/revcheck.php
http://vitaly-sokol.deviantart.com/art/An-African-Elephant-Underwater-583948615
Ao infinito e além
Fonte:https://leanpub.com/php
• Linha de
comando (CLI)
• GUI
• Daemons
• Impressão
• Raspberry Pi e
Arduino
e MUITO mais…
Code Climate
https://codeclimate.com
Travis CI
www.travis-ci.org
.travis.yml
• TeamCity (by JetBrains)
www.jetbrains.com/teamcity
• Continuous PHP
www.continuousphp.com
• PHPCI
www.phptesting.org
• Semaphore
www.semaphoreci.com
• Scrutinizer
www.scrutinizer-ci.com
• SensioLabs Insight
www.insight.sensiolabs.com
• Buildkite
www.buildkite.com
• Codacy
www.codacy.com
Mercado de
Trabalho
Fonte: Craigslist em http://www.langpop.com
Comparativo de ofertas
"Life" by Edward Monkton
Josh Lockhart
PHP do jeito certo:
http://br.phptherightway.com
Awesome PHP
https://github.com/ziadoz/awesome-
phpJamie York
AMP
Década
passada
Hoje
Dicas
• Estruturada x Orientada à Objetos
• Relacional x NoSQL
• Waterfall x Agile
• FTP x git push
• Equipes remotas
• Virtualização
• Curriculum Vitae x GitHub | Stack
Overflow
• Cloud
"Modern PHP development isn't as
much about changes in the language
as it is about changes in how we build
software with PHP."
Ben Ramsey
E-mail:
arijunior@gmail.com
Twitter: @stopassola
Skype: stopassola
LinkedIn:
http://pt.linkedin.com/in/stopassola
Facebook:
http://www.facebook.com/arijunior
Sites:
http://slideshare.net/arijunior
http://www.perito.inf.br
http://www.certificamp.com
http://www.rumoacertificacaophp.com
Contatos
Obrigado!
[ tem brinde ]

Modern PHP

Notas do Editor

  • #7 Mesmo com 11 anos de diferença entre a versão 7 e 5, a comunida jamais esteve parada.
  • #9 https://github.com/trending?l=php
  • #10 Fonte: http://w3techs.com/technologies/overview/programming_language/all
  • #11 O novo PHP
  • #12 Php|tek de 2009 os líderes dos principais frameworks se encontraram.
  • #14 Basic Code Style Basic Coding Standard
  • #15 Coding Style Guide
  • #16 Tela do editor Coda (Panic) for Mac, só para ilustração
  • #17 http://pear.php.net/manual/pt_BR/package.php.php-codesniffer.coding-standard-tutorial.php Pode checar outros formatos além do PHP, com por exemplo JS e XML.
  • #21 Garantia de qualidade
  • #22 Autoload mudou significativamente a forma de desenvolver aplicações. Antes da versão 5, era necessário fazer include/require em cada arquivos de classes que desejava incorporar. Introduziu-se o __autoload();
  • #24 PEAR: PHP Extension and Application Repository PEAR são classes em PHP (incluídas no código), enquanto que PECL são extensões escritas em C Instala pacotes num repositório central Requer privilégios de administrador/root Estagnada Força a qualidade de código com inúmeras regras.
  • #25 Mais moderno que os demais
  • #27 Diferentes estratégias de autocarregamento: PSR-0, PSR-4, classpath, files…
  • #28 composer.json composer.lock vendor (diretório)
  • #29 A medida que a funcionalidade aumenta, mais prefixos são adicionados, deixando os nomes extremamente grandes e consequentemente difícil de manusear.
  • #31 Compilação do conteúdo, mapas mentais, sínteses.
  • #32 pear install PhpDocumentor Converte para HTML, PDF e CHM (windows help files) Define os “DocBlocks”
  • #34 phpdoc -t docs/ -o PDF:default:default -d . -t é o target, -d diretório que sofrerá o parser para mais informações acesse: vim /Applications/MAMP/bin/php/php5.3.6/lib/php/data/PhpDocumentor/phpDocumentor.ini Se aparecer um “ERROR: nothing parsed” verifique o local onde você se encontra.
  • #36 phpdoc -t docs/ -o HTML:frames:phpedit -d .
  • #38 https://www.youtube.com/watch?v=anr7DQnMMs0#t=1904 Aproximadamente aos 31m 47s de palestra.
  • #43 Espelhamento de ambientes. Qual a imagem usar, que script Chef executar, habilitar rede, pastas compartilhadas. Com uma linha é possível testar em diferentes versões de sistema operacional e combinações de configuração. Usa Hyper-V (Microsoft), VirtualBox (Oracle), KVM, VMWare etc. Orientado a ambientes de desenvolvimento, pois utilizam uma camada de vitualização – prejudicando a performance. Criar um ambiente que possa ser reproduzido, quando se precisa de algo que fuja do LAMP, compatibilidade cross-platform, time trabalhando em diferentes SO. Provisionamento: setup automatizado, quanto tempo para subir uma máquina, maximizar dev/prod parity, isolamento de ambientes,
  • #47 https://pt.wikipedia.org/wiki/Brian_Kernighan
  • #49 Usar a intuição, remover partes e testar. Arquivos Cachegrind xdebugtoolkit é escrito em Python e o CachegrindVisualizer é Adobe Air (multiplataforma).
  • #50 Para utilizar em modo trigger, passe como parâmetro na URL o XDEBUG_PROFILE=1 cachegrind.out.%p (process ID) %t (timestamp) e %R (raiz) Ex.: cachegrind.out.1370217130-_LiveDemoxDebug_funcoes_inc_php_XDEBUG_PROFILE=1
  • #51 Instalando o KCacheGrind via MacPort: sudo port install kcachegrind kcachegrind (para executar a aplicação)
  • #52 xdebug.max_nesting_level = 4 impacta na execução do WebGrind Mostrar 100% e em microsegundos.
  • #54 Teste no WordPress para ter resultados mais expressivos.
  • #56 Pode-se utilizar um álias com AS function NomeDoNamespace(){ return "Namespace &eacute;: ".__NAMESPACE__."<br />"; }
  • #60 Ferramentas
  • #62 WYSIWYG, suporte a BD, inspeção de classes (para saber que métodos oferecem)
  • #63 Eclipse PDT (PHP Developer Tools). Os “genéricos” deve escolher a perspectiva PHP. phpStorm
  • #65 Excelente exercício: http://www.codeschool.com/courses/try-git O Linux utilizava o BitKeeper (que é um software comercial) Conhecido como um “Filesystem distribuiído”
  • #67 Gitosis e Gitorious pode-se baixar e instalar num servidor local. Através de um servidor, é possível ter maior controle sobre os dados. Existe também o Garrit e outros...
  • #69 Habilitar SSL (Certificação digital) nos servidores, gerar documentação, Stress test: Apache Bench e Seige ECMAScript 5 é mais compatível.
  • #70 Abra o terminal:sudo pear install http://phing.info/pear/phing-current.tgz Testando se foi realmente instalado:phing –v Deve aparecer algo como: "Phing version 2.1.1"
  • #73 Siga esse mantra Simples: procure concentrar o processo de implantação e dispará-lo em apenas UM comando. Previsível : saber o que está acontecendo. Se houver efeitos colaterais, mantenha a versão corrente. Reversível: UM comando e o sistema volta ao que era.
  • #74 Phing é baseado no Apache Ant.
  • #75 Workflow bastante utilizado
  • #77 Testes funcionais usam PhpBrowser, enquanto que os testes de aceitação rodam através do PhantomJS
  • #79 Testes de aceitação (Codeception) são mais proveitosos para times pequenos. Emulam a navegação no site/sistema, experimentando o funcionamento como um todo.
  • #82 Segurança
  • #84 print_r(get_defined_constants()); //para exibir todas as constantes pré-definidas
  • #85 Memcache quando o conteúdo é o mesmo, independente de servidor. Facebook tem 805 servidores em memcache, do total de 10 mil (fizeram um fork do projeto, com suporte a UDP) – dados de 2008. Flickr – 38mil requisições/seg Memcache integra com Nagios Gearman pode rodar de forma síncrona (em primeiro plano) ou assíncrona (em background). Digg possui 400 mil jobs por dia
  • #86 Experimente fazer um left outer join num ORM, ou uma função de agregação como média. Alguns falharam ao executar transações, passando a responsabilidade para a aplicação. Não há necessidade de cache, pois o mongoDB já fica em memório – o quanto houver de RAM disponível. Usar monboDB simplifica o desenvolvimento da aplicação pois não requer tratar de atualizações de registros, cache expirado etc.
  • #87 Hibernate do Java e ao ActiveRecord do Rails. Mapeamento em arquivos .ini ou XML Propel e Doctrine usam o design pattern ActiveRecord, enquanto que o Zend_Db_Table usa Table Data Gateway pattern e Row Data Gateway pattern. Livro "Patterns of Enterprise Application Architecture" do Martin Fowler de 2003.
  • #88 http://www.edzynda.com/use-laravels-eloquent-orm-outside-of-laravel/
  • #90 Patrick Shuff https://www.youtube.com/watch?v=MKgJeqF1DHw http://investor.fb.com/releasedetail.cfm?ReleaseID=893395
  • #91 Criado pelo Facebook Gerou competição
  • #92 Dialeto do PHP (e não uma linguagem totalmente nova)
  • #93 Por que pularam o PHP6?
  • #94 http://www.zend.com/en/resources/php7_infographic Tempo de execução quase 2 vezes mais rápido que o PHP 5.6 e 30% a menos de consumo de memória, suporta 3x mais requisições que um servidor rodando PHP 5.6.
  • #95 http://www.zend.com/en/resources/php7_infographic Drupal 8 roda 72% mais rápido com PHP7
  • #96 http://www.zend.com/en/resources/php7_infographic 25% dos sites no mundo rodam em WordPress
  • #97 http://www.zend.com/en/resources/php7_infographic
  • #98 http://www.zend.com/en/resources/php7_infographic https://pt.wikipedia.org/wiki/Conjunto_de_Mandelbrot
  • #99 Aceita int, bool, string e float (scalar). O TypeHint tradicional funciona com objetos e arrays. Declare é habilitado por aquivo e não no php.ini (para todos). Antes do PHP7 fazia-se muitos testes unitários para checar o tipo de variável. Pode usar híbrido.
  • #100 Throwable é uma interface que a Exception e a classe Error implementam. Erros fatais chamam especificamente a Error. Error é a classe pai de TypeError, ParseError, ArithmeticError e AssertionError.
  • #101 http://www.tonarua.nu/#!phpconf2015/amx19
  • #103 Detalhes em: http://doc.php.net/revcheck.php?p=graph&lang=pt_BR
  • #107 Usa a GIMP Tool Kit para aplicações gráficas desktop, suporte a skin (tema), orientada a eventos, janelas, acesso aos recursos da máquina no cliente, suporte a Widget (caixas de texto, botão, frame etc). Ex.: GNUTeca da Univates, Agata Report.
  • #108 Issue tracking: Jira é comercial, mas integra com metodologias ágeis (através de plug-in). Trac é feito em Python.
  • #109 One time now (da Axosoft), porém mais focado em Scrum. Ele não permitia dois responsável por uma tarefa (princípio fundamental do Pair programming – XP). Target Process, Mantis, Bugzilla É possível agrupar as tarefas realizadas (“Done”) em uma release específica e automaticamente o Jira retira do dashboard.
  • #111 Ele confronta o código com uma série de ferramentas de QA: http://phpqatools.org Sumariza a saida das principais ferramentas de qualidade. Roda uma série de análises. Métricas. Faz revisão do código, atribui badges (selos) onde a nota 4 é a máxima,
  • #112 Antecipar gargalos e problemas ANTES de colocar em produção. Progresso incremental. É possível realizar o commit e evitar o disparo do CI. Ex.: git commit –m "mensagem [CI SKIP]" http://docs.travis-ci.com/user/languages/php/
  • #113 Jenkins, Travis, GitLab CI, Bamboo, Liquibase, TeamCity e Code Climate.
  • #114 Mercado de trabalho
  • #117 Livro lançado em fevereiro/2015.
  • #118 Apacha está sendo substituído pelo NGINX
  • #119 Faltou visualizar os arquivos ocultos. Ex.: .gitignore, .env etc.
  • #120 Workers (mecanismo de filas como ActiveMQ), Querys SQL x MapReduce. Recomenda-se autenticar via par de chaves, ao invés de login/senha. Karma Level. Arquitetura de cloud: IaaS x Paas - Exexmplos de IaaS: Digital Ocean, AWS, Linode, Azure, Rackspace e Open Stack - Exemplos de PaaS: OpenShift, Heroku, Google App Engine (Google Cloud), AppFog, Pagoda Box, Fortrabbit, Laravel Forge
  • #122 entregar adesivos!
  • #123 Brinde