Categorias
Desenvolvimento Web Ócio

De “webmaster” a “fullstack”

Num passado remoto, tínhamos o (D)HTML, Frontpage, Macromedia Flash, Fireworks, banco de dados MySQL junto ao ASP ou PHP. Tudo era novidade. Nem tudo funcionava. Duas categorias de trabalho surgiam: o webmaster e o webdesign. Cada um no seu quadrado, trabalhando com ferramentas bem delimitadas.

Os anos foram passando, o mundo evoluindo e novas novas novas novas tecnologias surgindo – HTML, JS, CSS amadureceram, bancos de dados especializados se popularizaram, como Redis, MongoDB, Cassandra; linguagens se multiplicaram.

Ser especialista em PHP não é mais suficiente; é preciso ter domínio de Bash, Python, Ruby, Java, Javascript, Scala, Go e por aí vai.

Querer desenvolver sem saber configurar uma máquina do zero com todos os seus requisitos é impensável – e olha que não são poucos os requisitos: um servidor http (nginx ou apache), o módulo para processamento da linguagem desejada, seu(s) banco(s) de dados (mysql, postgresql, mongodb, redis), ativar cache, serviço de fila de processos, monitoramento de logs, compilador para linguagens intermediárias (typescript, scss, sass).

Acho que só os detalhes para configuração da máquina já renderia um curso superior. Enfim, o mundo da TI está cada vez mais heterogêneo, graças a necessidade de interoperabilidade e em especial, ao movimento opensource – não há como lutar contra.

Nos idos dos anos 2004 iniciei minha carreira como webmaster – embora já me interessasse pelas áreas correlatas.

Hoje, após  13 anos, caminho cada vez mais para o perfil fullstack: gerenciando configurações de máquinas de desenvolvimento e produção, com ferramentas como o Ansible e SaltStack; utilização de linguagens que vão do Javascript ao C++, passando por PHP, Java(EE), Python; bancos de dados diversos (uso e gerenciamento); definição, configuração e acompanhamento de ferramentas para QA (builds e testes automatizados) – como Gitlab + CI, Jenkins, Trevis-CI, Bamboo e SonarQube.

Quando paro para pensar na quantidade de projetos que já participei e nas tecnologias envolvidas, tenho uma imensa satisfação, acompanhada de descrença. No dia-a-dia não vemos o quanto nos adaptamos, e quão rápido é o processo, por isso é legal parar vez ou outra para pensar no que já construímos.

Não consigo imaginar qual será o nome da minha função no futuro, mas espero ter uma lista ainda mais interessante de estudos e trabalhos realizados: que venham novas linguagens, patterns e cervejas.

Categorias
CakePHP Desenvolvimento Web Programação

CakePHP 3.0 – O Fim do Locale

 

A nova versão do meu framework favorito está em estágio avançado e trás uma infinidade de coisas legais.

Dentre as novidades, quero deixar uma dica rápida para um problema comum a qualquer um que não use data/decimais em formato dos EUA: até hoje, para o Cake 1.3 e 2.x eu utilizo o plugin Locale, que já falei a respeito aqui antes.

Com o CakePHP 3.0, o plugin é completamente desnecessário: o novo ORM é capaz de interpretar os dados enviados em formato local para o formato nativo da máquina, de forma transparente.

Você só precisa registrar que os tipos do ORM deve utilizar localização…

Diga ao seu ambiente qual seu locale (pode fazer isso no bootstrap.php):

ini_set('intl.default_locale', 'pt_BR');

Inclua as linhas abaixo no início do seu AppController:

use Cake\Database\Type;
// Habilita o parseamento de datas localizadas
Type::build('date')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy');
Type::build('datetime')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy HH:mm:ss');
Type::build('timestamp')
 ->useLocaleParser()
 ->setLocaleFormat('dd/MM/yyyy HH:mm:ss');

// Habilita o parseamento de decimal localizaddos
Type::build('decimal')
 ->useLocaleParser();
Type::build('float')
 ->useLocaleParser();

Pronto, os dados do seu formulário serão interpretados e convertidos antes de serem salvos.

Para alterar a validação de data, você deve usar algo assim:

$validator->add('birthday', 'valid', [
 'rule' => ['date', 'dmy'], // esse é o importante, onde você avisa que a data estará localizada
 'message' => __('Informe uma data válida')
 ]);

E em substituição ao LocaleHelper, você pode formatar suas datas com o método format disponível (já que o registro agora é um objeto), e no caso de float/decimal, você usa a lib Number.

use Cake\I18n\Number;
$data = $user->birthday->format('d/m/Y');
$salary = Number::format($user->salary);

E é isso, sem nenhum plugin, sua aplicação estará falando português (ou qualquer outra linguagem/localização que você deseje utilizar).

Categorias
noticias PHP

PHPMS Conf’14

banner de divulgaçãoÉ isso mesmo galerinha, seguindo bravamente a frente da organização, meu brother Marcelo Siqueira assumiu a responsa e juntamente com a SUCESU-MS está organizando a edição 2014 do nosso evento favorito: PHPMS Conf’14.

A grande novidade deste ano é que não vamos ficar preso a capital do estado, desta vez o evento ocorre em Dourados. Mas se você está em Campo Grande, tem ônibus grátis para os primeiros inscritos, que coisa linda não? O evento ocorre então dias 11 e 12 de Setembro de 2014, e a grade completa você confere na página dele.

Terei a honra de palestrar no sábado sobre a linguagem e tópicos relacionados (posto link para ela depois). Varias feras irão palestrar no evento como o Bruno PorKaria, Ricardo Coelho, Saulo Arruda, Alê Borba e o próprio Marcelo Siqueira. Imperdível.

Se quiser bater um papo, eu e quase toda a equipe da Radig estaremos lá nos dois dias.

Ainda da tempo de se inscrever, mas corra!

Até breve!

Categorias
noticias

Ainda estou aqui…

It's alive!

Faz pouco mais de 2 anos desde minha última postagem.

De lá para cá minha vida passou por algumas reviravoltas, em especial minha formatura (hell’yea’h), mudança de casa e amadurecimento da Radig.

Este post marca a última migração de servidor do blog, que saí de um plano compartilhado na Dreamhost e passa a ser hospedado na cloud da Amazon em São Paulo (muito mais rápido para mim e para vocês).

A cabeça está cheia de ideias para compartilhar, mas ficarei por aqui. Em breve retorno com algumas novidades importantes.

Categorias
Ciclismo

Pedalando: Segundas impressões

Como comentei no último post estou tentando adotar a bicicleta como meio de transporte principal para o trabalho. Depois de um primeiro dia tranquilo na sexta-feira, nessa última segunda feira fiz pela primeira vez o caminho “casa -> trabalho” e as impressões foram bem diferentes… vamos lá:

  • Começar o dia pedalando é muito mais difícil do que terminar o dia. Provavelmente pelo corpo frio, falta de aquecimento/alongamento. Fato é que após andar 2 quadras já sentia algum cansaço e no final do trajeto cheguei a carregar a bicicleta a pé por conta da exaustão.
  • A falta de segurança na pedalada derivada da falta de precisão na troca de marchas é muito mais encomoda quando você está cansado. E o cansaço só aumenta com isso.
  • Quando cheguei no trabalho parecia que havia subido uma montanha durante os 11Km do trajeto, mas passando de carro pelo mesmo local da pra ver que a quantidade de subidas e descidas são equivalentes em ambos os sentidos ( o que reforça o primeiro ponto ).
  • Comer antes de pedalar não é uma boa ideia: comi um copinho de iogurte (desses em embalagem com 6) + granola, achando ser uma boa medida por conta da energia mas depois de um certo esforço o iogurte parecia azedar em minha barriga =]

Por conta dessas dificuldades fiquei dois dias sem pedalar e decidi fazer apenas o trecho “trabalho -> casa” até ganhar alguma resistência física.

Espero encorajar e ajudar outros a adotarem um meio de transporte alternativo, faz bem pra você e pra cidade ;]

Categorias
Ciclismo

Pedalando: Primeiras impressões

Ultimamente tenho usado o blog apenas pra falar de programação, desenvolvimento e coisas do gênero, mas vou voltar a dividir o espaço com alguns assuntos “OFF-TOPIC”.

Como muitos da minha área não tenho o habito de praticar exercícios e depois de esperar uma oportunidade cair do céu pra iniciar algo acabei lembrando que tinha uma bicicleta encostada nos fundos de casa. Juntando os pontos, resolvi que iria adota-la como meio de transporte.

Como não pedalava há muito tempo (e nunca fui especialista nisso), passei um bom tempo lendo e conversando a respeito até que hoje surgiu a oportunidade e fiz o caminho de volta do trabalho com a “magrela”.

Essa introdução toda é só para contextualizar um pouco as minhas primeiras impressões:

  • Nunca tinha andando em ciclo-vias – a sensação de segurança proporcionada é enorme; O problema é que apenas metade do meu caminho possuí ciclo-via.
  • Apesar da segurança em relação aos automóveis, muitos usam ciclo-vias para caminhar, sentar, brincar com bebês e cachorros, então toda atenção é necessária.
  • Meu trajeto tem mais ou menos 11Km, fiz hoje em 45min e me surpreendi por isso. Esperava um tempo bem maior.
  • Apesar de não pedalar há muito tempo, consegui fazer todo o percurso sem dificuldades =P
  • Não tenho uma bicicleta top, é uma dessas comuns que podem ser compradas em supermercados (uma Sundown Brisk) e hoje já deu pra ver o porque de ler em todo texto sobre ciclismo que ter uma boa bicicleta faz a diferença: marchas travando, correia pulando de uma coroa para outra sozinha, o que nos deixa um pouco inseguro e desperdiça nosso esforço.

Encontrei várias dificuldades pra iniciar a pedala: dias dia chuva, trabalho até tarde, compromissos sociais no inicio da noite; mas acho que isso é normal e o negócio persistir =]

Categorias
CakePHP Desenvolvimento Web PHP

CakePHP: Plugin Locale

Vamos falar um pouco sobre outro plugin para CakePHP que surgiu no coração da Radig: o Locale.

Meu amigo José Agripino já apresentou o plugin no próprio blog da Radig, mas como reescrevi quase que totalmente o plugin nos últimos dias, acredito ser a hora de falar dele novamente.

Nada melhor para ver a utilidade de algo como imaginar uma situação de uso real, então vamos lá…

Cenário 1: você desenvolve um sistema para brasileiros, e quer permitir a entrada de informações em formato local, isto é, datas com dia/mês/ano e números com vírgula separando decimais. O problema é que estes dados são inválidos em um banco de dados convencional (como MySQL e PostgreSQL). Ao tentar salvar uma data formatada com dia/mês/ano você receberá um erro como resposta. Como resolver isso? Use o behavior Locale no seu modelo.

Basta adicionar o behavior Locale no modelo que ele fará a conversão de datas e números para o formato americano.

public $actsAs = array('Locale.Locale');

É possível converter automaticamente datas, datas acompanhadas de horas e decimais/floats.

Cenário 2: você já tem os dados do seu usuário armazenados no banco (formato padrão/americano) e quer apresenta-los em um formato local na sua View, o que fazer? Use o Helper Locale em sua view. Primeiro ative o helper no seu controller:

public $helpers = array('Locale.Locale');

Agora basta usa-lo na view:

echo $this->Locale->date($this->data['User']['birthday']);

É possível formatar data, data com hora, data literal (quarta-feira 18 de abril de 2012, por exemplo), decimais como 53,42 e valores monetários ( R$ 53,42 ).

Além do Behavior e do Helper, você pode carregar as libs Localize e Unlocalize em qualquer parte de seu sistema para converter entre os dois diferentes formatos. As libs são estáticas e suportam aninhamento de método, assim você pode fazer:

echo Localize::setLocale('pt_BR')->decimal(12.45); // 12,45

A unica configuração necessária é a definição do locale de sua aplicação, que pode ser feito no próprio bootstrap.php do Cake:

setlocale(LC_ALL, 'pt_BR');

Assim como outros plugins da Radig, você pode consultar os testes incluídos para ver melhor o funcionamento deste.

Se for utilizar, nos avise, será uma grande satisfação ver que o plugin é util para outros.

Há uma versão compatível com o CakePHP 1.3 e outra com o CakePHP 2.x, basta usar o branch correspondente.

Categorias
Desenvolvimento Web

CakePHP: Plugin Auditable

Cenário: você desenvolve um sistema para uma empresa e 4 meses depois a gerência da empresa detecta um problema nos dados e solicita uma auditoria pra saber o que causou aquilo e quem é o responsável.

Este cenário é mais comum do que parece, em várias situações talvez não chegue a diretoria, mas algum usuário pede informação de como dada informação chegou ou saiu do sistema. Como você atenderia a solicitação? Se você não tem ainda uma resposta, vou apresentar uma alternativa, um plugin para CakePHP desenvolvido pela equipe da Radig (eu incluso) e disponível no seu github: github.com/radig/auditable

O objetivo do Auditable é muito simples: tornar qualquer sistema em CakePHP auditável.

O plugin é composto de duas peças chaves: uma classe de configuração e um behavior. Para tornar um modelo auditável, basta “plugar” o behavior à ele, a partir daí todas as informações criadas, alteradas ou removidas.

Há ainda um helper para ajudar na formatação das entradas do log e um controller simples que pode ser usado para visualizar o log.

Há casos de teste para todo o behavior e informações sobre sua configuração em seu readme: https://github.com/radig/auditable/blob/master/README.textile

Bom proveito =]

————–

Conforme o assunto se desenrolou nos comentários, implementamos os modelos Logger e LogDetail para uso junto ao CakeMongoDb para armazenar os logs no banco de dados MongoDB. Você pode conferir no plugin AuditableMongoLogger

Qualquer dúvida ou sugestão pode usar os comentários ou o Github ;]

Categorias
CakePHP Desenvolvimento Web PHP

[CakePHP] Acl: Problema com Acos “duplicados”

Quando falamos em Acl e CakePHP muitos tem a lembrança de horas lutando contra um monte de código para tentar fazer funcionar a autenticação e permissionamento. Bastam algumas dezenas de projetos e você fica craque em configura-lo.

Porém vez ou outra aparece uma dúvida que te faz perder várias horas debugando e as vezes termina isso sem uma solução razoável.

Trabalhamos muito com Plugins na Radig e um problema que enfrentávamos de vez em quando era o de ter um plugin com o mesmo nome de uma ação de controller. Nestes, quando você verifica a permissão para a ação usando uma sintaxe de caminho parcial, isto é, algo como:

$this->Acl->check('acao', 'Fulano');
$this->Acl->check('Controller/acao', 'Fulano');
$this->Acl->check('Plugin/Controller/acao', 'Fulano');

Um erro é retornado, dizendo que o Aco não pode ser verificado (lembrando que para o exemplo, Plugin teria o mesmo nome de acao).

Isso foi até assunto de um bug reportado para o CakePHP, afirmando que a falha estava no fato das comparações no banco de dados serem, na maioria das vezes, case-insensitive. De fato, como respondeu o Mark Story, uma forma de resolver este “problema” é utilizar no banco de dados um COLLATION que seja de fato case-sensitive. O problema nisso é que a maioria dos conjuntos de caracteres, ao menos no MySQL, são case-insensitive, então você teria de mudar todos os seus banco de dados para corrigir isso.

Porém o usuário nlcO postou uma dica interessante: basta usar o caminho completo do Aco que não haverá conflito, mesmo quando controllers, plugins ou actions tiverem os mesmos nomes. Mas como usar o caminho completo? Basta ver qual é seu Aco raiz (que possuí o parent_id = NULL) e ir incluindo após ele todos os subsequêntes – plugins, controllers e actions, até formar o caminho completo.

No meu exemplo ficaria:

$this->Acl->check('aplicacao/Plugin/Controller/acao', 'Fulano');
Categorias
CakePHP Desenvolvimento Web PHP

HTML5: Problemas com Input type=”number”

Opa, esse é mais um aviso.

Recentemente estava trabalhando em um sistema com CakePHP 2.1 e ao tentar editar um registro onde um dos campos era do tipo float, o valor que estava no banco não era apresentado no formulário, embora a tag input estivesse com o atributo value preenchido corretamente. Isso aconteceu comigo no Chrome 17, no Firefox 10 não houve problema porque ele utiliza input text normal.

Um detalhe importante é que eu utilizo o Helper Locale para formatar os números decimais para meus usuários, assim o que vem do banco como “12.58” vira “12,58” formato que usamos no Brasil. Talvez se usasse ponto como separador de decimais não teria problema – o que não é possível pra mim.

Ao pesquisar um pouco descobri um bug no Chromium relacionado a isso reportado no link http://code.google.com/p/chromium/issues/detail?id=44116 . Não consegui entender o motivo mas foi marcado como Wontfix.

A saída foi sobrescrever o FormHelper para utilizar input do tipo text quando o número vindo é um ponto flutuante/decimal. Se você não trabalha com CakePHP, mas trabalha com números decimais separados por vírgula, a dica continua valendo: utilize input com o tipo text ao invés de number.

Aqui tem um commit onde implementamos a “correção” em um FormHelper que estende o do CakePHP.