Léo Hackin 0.2cEternamente beta, geralmente funcional

Iniciando com o SimpleTest 5

Léo Hackin to PHP — Tags: , ,  
Salve people,

Vamos iniciar hoje uma pequena jornada à terras que possivelmente muita gente só viu/leu em sites especializados e muito pouco comentadas em PHP: a terra do desenvolvimento orientado a testes, ou TDD.

Se você não sabe ou nem faz idéia do que é TDD, dê uma procura no Google pois existem dezenas de sites muito bacanas destilando idéias e tudo mais sobre isso.

Em poucas palavras, TDD (Test Driven Development) é um técnica de desenvolvimento de software que nos diz que devemos escrever os testes antes de escrever o código da aplicação propriamente dito.

Inicialmente isso parece meio louco: afinal, você sempre testa DEPOIS de escrever seus programas ou durante, enquanto debuga tudo, correto ? Mas com o passar do tempo, a verdadeira natureza e vantagem do TDD, quando aplicada corretamente, se faz presente.

Você se torna capaz de antecipar a detecção e correção de várias falhas, reduzindo dramaticamente o tempo gasto com correções em cima de implementações muito complexas já praticamente no final do seu cronograma.

Hoje em dia, existem várias frameworks que auxiliam nessa tarefa de escrever testes. O foco aqui é algo que poucos sites (principalmente em português) abordam de forma prática que é o uso da SimpleTest, uma framework para testes unitários que vem ganhando o espaço antes ocupado pelo PHPUnit.

No decorrer dos próximos posts sobre o SimpleTest, você poderá adquirir um pouco de conhecimento que poderá ser útil em seus futuros projetos. Então, vamos simbora.

Instalando o SimpleTest

A instalação do SimpleTest em si é muito fácil.

  1. Baixe a versão mais atual do SimpleTest no site http://www.simpletest.org (a versão que usaremos nessa sequência de tutoriais é a 1.0.1). A framework é composta por uma pasta simples;
  2. Descompacte o arquivo dentro de sua aplicação. Para fins de organização, vamos criar uma pasta “tests” na raíz de nossa aplicação: ao descompactar você verá uma pasta chamada simpletest sendo criada.
Em tese, nossa aplicação pode ter qualquer estrutura de diretórios. O SimpleTest funciona tanto com functions como com classes. Vamos abordar o uso de classes, dado que o TDD é amplamente usado em sua maioria em soluções OO (Orientadas a Objeto) e acho que já passou da hora da comunidade PHP pensar OO. :D

Partindo desse pressuposto, vamos criar a pasta “classes” na raíz de nossa aplicação: lá iremos botar todas as nossas classes que serão usadas nos testes.

Teremos então, uma estrutura de arquivos como abaixo:

imagem5

A pasta app_tdd é a posta onde está nossa aplicação: uma pasta criada dentro do meu htdocs (raíz do Apache).

Se o seu servidor web estiver instalado com confiurações padrão, provavelmente você poderá acessar usando: http://localhost/app_tdd

Nosso problema: uma calculadora

Com o SimpleTest “instalado” em nossa aplicação e nossa estrutura de diretórios resolvida, vamos escrever nosso primeiro caso de teste.

O cenário de nossa aplicação é uma calculadora: nossa calculadora conseguirá efetuar apenas a operação de soma.

Com uma análise rápida do problema, já nos vem à cabeça que:

  • Uma classe chamada “Calculadora” com um método chamado “soma”;
  • Nosso método soma recebendo dois números
  • Nosso método retornando o valor da soma entre os dois números
Nossa abordagem não TDD seria: vamos fazer a classe, implementar o método e depois testa-lo em uma página teste. Correto ? Num primeiro momento isso seria ótimo: afinal, o código e complexidade das classes inicialmente são lindos.

Mas imagine agora sua aplicação crescendo e crescendo: classes extendendo e usando outras classes. Você extende a Calculadora, outra classe utiliza o método soma e você vai testando apenas “o que vem depois”.

Num dado momento, você tem um resultado incorreto de soma: uma entrada incorreta de parâmetros, um deles ser uma letra e não um número, termos uma passagem de um objeto ao invés de um número propriamente dito … De quem é a culpa ? Da classe nova, que esqueceu de filtrar a entrada de parametros ? Do designer, que esqueceu de limitar a entrada dos valores no form para apenas números ? Do outro programador, que foi descuidado e não validou se os dados passados eram realmente números antes de chamar a soma ?

Enfim, temos N cenários onde a detecção do erro pode ser muito custosa, seja pelo método para encontra-lo (que varia do debug minucioso ao “achismo”) e/ou pelo custo em termos de tempo para concerta-lo. Tudo isso pode gerar um custo/prejuízo que seria reduzido com a implementação do pensando TDD.

Pensando primeiro em testes

Mentalize: “Quais as situações que podem quebrar meu método soma? Se acontecer, como devo tratar esse erro ?”

Com base nesse pensamento, podemos deduzir:

  • Para somar, nossa calculadora terá que receber sempre dois números;
  • A soma sempre ocorre entre dois números, nunca entre letras, objetos ou qualquer coisa que não seja exatamente um número;
  • Se algo der erro, devo retornar falso;
Interessante! Não implementamos nenhuma linha de nossa solução e já sabemos:

  • Que vamos precisar de uma classe (Calculadora) com um método de soma;
  • Sabemos que o método deverá receber dois parâmetros que deverão ser sempre números;
  • Que se for passado qualquer coisa que não sejam dois números, eu devo retornar falso;
Bom, então vamos implementar a classe ? Não, pequeno gafanhoto: vamos implementar primeiro os testes, porque é com base neles que vamos ter certeza que nossa classe se comportará exatamente como pensamos que ela deve se comportar sob os mais diversos cenários.

Escrevendo nosso primeiro teste

Implementar um teste com SimpleTest é, como o nome já diz, “simples”.

Vamos criar todos os nossos testes dentro da pasta tests. Para cada classe que tivermos que testar, vamos criar um caso de teste (unit test case) que será representado em um arquivo php.

Então, nosso primeiro caso de teste será o calculadora_test.php. O nome do arquivo não tem um padrão de nomenclatura, mas por convenção usa-se sempre _test.php.

calculadora.php -> calculadora_test.php

A estrutura inicial do nosso arquivo calculadora_test.php será a seguinte:

 PHP |  copy code |? 
1
require_once('simpletest/autorun.php');
2
require_once('../classes/calculadora.php');
3
 
4
class TestOfCalculadora extends UnitTestCase {
5
    // os testes vão aqui ;)
6
}
7

Pronto! Nosso caso de teste da classe Calculadora está feito. Para testa-lo, vamos apontar o browser para http://localhost/app_tdd/tests/calculadora_test.php. O resultado será:

 PHP |  copy code |? 
1
Warning: require_once(../classes/calculadora.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/app_tdd/tests/calculadora_test.php on line 4
2
 
3
Fatal error: require_once() [function.require]: Failed opening required '../classes/calculadora.php' (include_path='.:/Applications/MAMP/bin/php5/lib/php:/Users/leohackin/PEAR') in /Applications/MAMP/htdocs/app_tdd/tests/calculadora_test.php on line 4

Ops! Não criamos nossa classe ainda, por isso obtemos esse erro. Quando disse que escrevemos testes antes de implementar nossa lógica, estava falando sério. =)

Vamos criar nossa classe Calculadora então.

 PHP |  copy code |? 
1
class Calculadora {	
2
  function soma($a,$b) {
3
  }
4
 }
5

Legal, agora vamos acessar nosso caso de teste denovo.

imagem6

Analisando o código:

  • fazemos o include de dois arquivos:

    • o arquivo autorun.php é o arquivo que faz a “mágica” acontecer: é ele quem roda os testes e exibe os resultados;

    • o outro arquivo é a classe que desejamos usar no teste, no caso calculadora.php
  • Criamos uma classe chamada TestOfCalculadora extendendo UnitTestCase, que será a classe que o SimpleTest usará para fazer o teste. É obrigatório que a classe inicie com o nome “test” para que o SimpleTest execute automaticamente a mesma como um caso de teste. Existe uma forma de faze-lo sem iniciar o nome com “test”, mas isso não vem ao caso agora.
Maneiro né ? Mas como puderam notar, nosso caso de teste não testa nada ainda. Hahahah

Vamos adicionar agora um teste: o teste vai verificar se a soma está realmente “somando” dois números. Para isso, devemos adicionar um método à nossa classe de testes. Vamos chamar esse teste de “testSomaDoisNumerosInteiros“, onde vamos passar dois números inteiros esperando que a soma deles esteja correta.

Usar nomes grandes assim no nome do método são uma boa prática, já que deixam os testes mais legíveis na hora de rodar o caso de teste.

 PHP |  copy code |? 
01
<code lang="php[lines]">require_once('simpletest/autorun.php');
02
require_once('../classes/calculadora.php');
03
 
04
class TestOfCalculadora extends UnitTestCase { 
05
 
06
    function testSomaDoisNumerosInteiros() { 
07
        $calculadora = new Calculadora(); 
08
        $this->assertEqual($calculadora->soma(1,1), 2);
09
    }
10
 
11
}
12


Como visto, temos nosso método testSomaDoisNumerosInteiros que instancia nossa classe Calculadora e depois executa um método chamado assertEqual. Esse método é o responsável por testar nossa soma. Ele significa:

Verifique se a chamada $calculadora->soma(1,1) retornará um resultado igual à 2

Se a chamada retornar qualquer coisa diferente de dois, nosso teste irá falhar, indentificando que algo de podre está acontecendo em nosso método soma.

Se rodarmos esse script teremos enfim:

imagem1

Tivemos uma falha. Traduzindo a mensagem de forma prática:

O seu teste testSomeDoisNumerosInteiros, do caso de teste TestOfCalculadora, falhou porque NULL (que foi retornado pela chamada ao nosso método soma) não é igual a 2 (que seria nossa resposta esperada).

A resposta para isso é que ainda nem implementamos nosso método soma. Mas vejamos que nesse ponto já sabemos exatamente como deve ser comportar nosso método para o funcionamento com dois números. :)

Vamos implementar nossa classe então:

 PHP |  copy code |? 
1
 class Calculadora {	
2
    function soma($a,$b) {
3
        return $a + $b;
4
    }
5
 }
6

Com nosso método agora implementado, vamos executar nosso caso de teste denovo.

imagem2

Agora sim! Temos um caso de teste funcional que testa uma classe implementada. Parabéns por chegar até aqui.

Nesse ponto, já temos conhecimento suficiente para escrever vários casos de teste para nossas classes. Um caso de teste pode conter vários testes diferentes: cada teste é feito através de um método da classe do caso de teste.

Revisando aquelas possibilidades de cenário que poderiam “quebrar” nossa calculadora, já testamos se a soma está correta. Agora, podemos testar as possibilidades que podem gerar um erro na calculadora.

Uma delas é se passarmos letras no lugar de números: haviamos combinado que nessa situação, devolveriamos falso para o resultado, correto ? Então, vamos escrever o teste: vamos chama-lo de “testSomaNaoNumeros“:

 PHP |  copy code |? 
1
function testSomaNaoNumeros() { 
2
        $calculadora = new Calculadora(); 
3
        $this->assertEqual($calculadora->soma(1,'A'), false);
4
}

Adicionamos essa função à nossa classe. Rodamos nosso teste novamente e …

imagem3

Previsivelmente, temos um erro pois nosso método soma ainda não verifica se os parâmetros recebidos são números válidos. Ai você irá pensar:

Mas eu vou escrevendo os testes e vou implementando toda a minha lógica de negócio ao mesmo tempo ?

A TDD tem uma característica bacana, que anda de mãos dados ao refactoring: a TDD nos diz que devemos SIM escrever os testes primeiro e fazer as classes “passarem no teste” usando o mínimo de código possível: se a lógica for complexa, retorne uma resposta “hardcode” para “enganar” o teste e depois faça o refactory do código.

O refactory deve ser feito apenas depois de todos os testes serem feitos, pois nesse ponto você terá certeza de como o funcionamnento de sua classe atenderá a todos as respostas que são requisitadas nos testes como “corretos”.

Pensando nisso, vamos fazer nosso método soma “passar” no teste:

 PHP |  copy code |? 
1
class Calculadora {		
2
    function soma($a,$b) {
3
        if (is_int($a) && is_int($b)){
4
            return $a + $b;
5
        } else {
6
            return false;
7
        }
8
    }	
9
}

Agora, vamos rodar nosso teste.

imagem4

Blz! Nosso teste passou, mas testamos apenas se os valores são inteiros e se forem, efetuamos a soma. Se não forem, a gente retorna false, como nosso teste pediu. Podemos depois refatorar isso: verificar se o valor é uma string com um número dentro e por ai vai.

Finalizando

Você pode estar se perguntando: “Uai, mas podemos ter muito mais ocasiões que podem quebrar a soma! Podemos também extender algumas funcionalidades e exibir mensagens de erro”.

Tivemos uma amostra do que é o SimpleTest em seu cenário mais simples: apesar do tamanho do post, o conceito e a aplicação são bem simples como puderam ver.

Além do assetEqual, a SimpleTest tem um set de ações enorme de validações, além de recursos mais avançados, como suites, mocks e web tests que veremos em breve.

Crie outras classes, pense nos testes, escreva seus casos de teste e vá executando: com a prática isso vai ficar tão automático que o ganho com a diminuição dos testes e bugs no final da aplicação vão ser notórios.

Testes nos tornam programadores melhores. Pense nisso.

Algumas coisas para se pensar quando começar a abordar isso:

  • Não precisamos escrever TODOS os testes: é completamente normal se esquecermos algo ou houver alguma necessidade de mudança de negócio do cliente que nos fará escrever novos testes ou re-escrever os existentes. Tenha em mente que o TDD é para ajudar e não para ser mais uma fase carrancuda e intransponível no desenvolvimento;
  • A análise para chegar aos casos de teste faz bem ao início do projeto: com essa abordagem, você pode fazer perguntas ao cliente (e ele a você) sobre algumas coisas que possívelmente só apareceriam no final do projeto gerando assim muito re-trabalho;
Bom, por enquanto é isso pessoal. No próximo post falaremos um pouco sobre agrupamentos de teste e partir para um exemplo mais complexo. :)

Espero que tenham gostado do post.

Simbora! :D

1º Curso Oficial de Scrum Master do ES 2

Léo Hackin to cursos, giran — Tags: , ,  
Que rufem os tambores: é com imenso prazer que anuncio que a Giran está trazendo para o estado o 1º Curso Oficial de Scrum Master (CSM) para terras capixabas. Fruto da parceria entre a Giran e Caelum, nossa parceira em cursos Java, vai ser uma puta oportunidade para todos que quiserem ter esse belo upgrade no currículo.

As inscrições já estão abertas e o curso será ministrado em setembro, dependendo do número de inscritos atingir a quantidade mínima. Ele será ministrado num lugar compatível com o número de inscritos e tem uma duração de 16 horas.

O curso inédito será ministrado pelo instrutor Alexandre Magno, da AdaptWorks, único instrutor certificado pela Scrum Alliance no Brasil. O curso é um sucesso no Brasil inteiro e altamente requisitado em vários estados, tanto pelo fato de ser um curso oficial quanto por ser a porta de abertura para quem deseja não apenas conhecer mas também se certificar nessa metodologia ágil.

Sim! O participante ganha ao final do curso um certificado de Scrum Master, que é o início para ir se especializando na metodologia e ir tentando as certificações mais avançadas junto à Scrum Alliance.

Para garantir sua vaga, envie um e-mail para contato@giran.com.br com seus dados de contato. Entraremos em contato para informar sobre o curso, preço, modos de pagamento e afins.

Mais detalhes sobre o curso, em breve no blog da Giran (http://blog.giran.com.br).

Simbora.

Dica de chave do model no CakePHP 0

Léo Hackin to PHP, cakephp — Tags: ,  
Estava rascunhando algumas coisas e fazendo umas melhorias num sistema na Giran, quando lembrei de duas perguntas que haviam sido feitas no 1º Workshop PHP-ES sobre CakePHP.

Aproveitando que lembrei delas mas não tinha a resposta na ponta da língua, ai vai uma dica sobre chaves primárias para ser feita no model de sua app. Isso está explicito no Cookbook, mas não muito à mão para quem está começando ou nos bilhares de screencasts existentes. ;)

Modificando a chave primária ID

Se você está portando uma base de dados que já exista e que não segue a nomenclatura padrão do CakePHP, onde a chave primária da tabela é sempre chamada por id, utilize o atributo primaryKey do seu model para usar outro campo.
 PHP |  copy code |? 
1
class Cliente extends AppModel {
2
 
3
var primaryKey = "CdCliente";
4
 
5
}

Essa semana o mundo geek da tecnologia parou para conferir a E3 2009, a maior feira de entretenimento eletrônico do planeta. A feira é a oportunidade perfeita para as empresas lançarem produtos, tirarem onda e principalmente mostrarem o que está por vir.

Claro que como nerd/geek tarado por video games (um dia ainda vou ganhar grana com isso) eu pirei com todos os jogos e tecnologias que estão por vir. Mas nada se compara a extremamente grata surpresa proposta pela (cof,cof) Micro$oft.

Sim, a Micro$oft: na época que todo mundo duvidava dela quando o Xbox chegou pra bater de frente com consoles como o PS2, eles botaram pra quebrar com o XBOX 360. O fato dele ter sido “destravado” primeiro foi um impulso e tanto aqui no Brasil, movido pela pirataria, pra todo mundo compra-lo: o PS3, quem diria, perdeu espaço pra ele e pro Nintendo Wii.

A Nintendo, depois de amargar uma “menopausa tecnológica”, emplacou o Nintendo Wii, com um detalhe ignorado num mundo por tempos regido mais pelo processamento do videogame do que suas formas de iteração: a forma de controle do jogo.

Sem um controle de duzentos botões como seus concorrentes, impeditivo e carrancudo para muitos “mortais”, o Nintendo Wii primou pela simplicidade em seu controle, mas de uma forma inusitada: o controle com quase nenhum botão mas com uma forma de iteração por movimento que revolucionou o mundo do video game.

Quem já teve uma experiência num Wii pode dizer que não existe nada igual. A liberdade é impressionante e a forma de iteração com os jogos um trunfo: foi a volta dos jogos simples pra família inteira jogar, sem se preocupar com aquela monstruosidade de botões. Hoje, até o papai e a mamãe podem jogar finalmente, como nos bons tempos do Atari. O video game enfim voltou a ser uma “diversão família” novamente.

Isso era impressionante até a E3 2009, quando a M$ apresentou o Project Natal: uma forma de iteração que não usará nem controles físicos, nem botões. O Project Natal vai permitir a iteração pura e simplesmente por captação de movimentos e voz! oO

Confesso que havia MUITO tempo que não ficava abismado com algo: desde os tempos do primeiro iPhone, do Ubiquity, do Google Earth e do próprio Wii, eu não sentia aquela sensação que dá vontade de falar “Puta queo pareo!”.

O projeto se baseia em camêras, sensores e um microfone para que a pessoa possa iteragir com o game. Game ??? Agora cheguei ao ponto que queria chegar.

Que os video games estão aos poucos se tornando portas viáveis para os mais diversos tipos de aplicação ja é notório: os jogos educativos foram o início dessa revolução, mas hoje com o advento das conexões de banda larga em praticamente todos os video games, as atualizações e customizações das característica dos games, como novos personagens, fases, músicas e afins, deram um poder INFINITO de extensão dos jogos.

E-learning aplicado à tantas áreas que não conseguiria enumerar aqui, RPGs com cunho educativo, MMORPGs sociais com “quests” do tipo “Estude isso, faça a prova para ganhar tal coisa”. É tanta coisa que passa na minha cabeça que eu poderia ficar aqui por dias digitando.

Com o Project Natal extrapolamos a simulação imperfeita das ações do jogo, baseado em botões e direcionais, para uma simulação muito mais perfeita. O chute na bola vai ser mecânico e corporal, diferente da combinação de botões+direcional ou mesmo situações fisicamente irreais.

Agora imaginem só as seguintes situações:


  • Você jogando um RPG ou jogo de tiro de primeira pessoa, onde você pode olhar para qualquer direção, trocar de arma movendo os braços, atirar mirando na pessoa que quiser …
  • Um RPG onde você ao inves de clicar num NPC (aquela galera que você conversa para saber informações no jogo), dizer perto dele “Ei, posso falar com você?” e ele lhe responder prontamente. Mais que isso, um RPG inteligente que ao invés de lhe dar informações já pre-definidas, possa responder mais “humanamente” a uma pergunta qualquer, mesmo que sem sentido;
  • Um jogo de xadrez onde vc move as peças do seu sofá;
  • Jogos de aeróbica e exercícios físicos;
  • Um Guitar Hero onde você toca Air Guitar e ainda por cima ele conta como nota o quanto você “agitou e quebrou tudo no palco”. Ohhh Yeah;
  • Jogos infantis onde a criança vai iteragir com os personagens para aprender coisas falando com os personagens: o personagem pergunta “Ei Fulano, quando é dois mais dois?” … “Isso! Você acertou”. Esqueçam as cartilhas;
Será que estamos às portas de uma revolução não apenas dos video games e do entretenimento eletrônico, mas de uma revolução na forma da distribuição de conhecimento por uma mídia tão potencialmente multi-facetada como a dos video games ?

Eu estou pagando pra ver! :)

Back to Earth! 4

Léo Hackin to Pessoal  
minha_mesaSalve pessoal,

Quanto tempo eu não voltava por aqui. As coisas andam corridas pra caramba: abertura e correria inicial da Giran, mudança pra um AP novo, organização do workshop PHP-ES, viagem ao Falando em Java 2009, abandono de alguns sonhos e adoção de outros. Justifico aqui a sumida master do blog e peço desculpas aos que acompanham algo de útil por aqui.

Mas foi tudo por uma ótima causa e eu acho que sobrevivi. E claro que estava com saudades de tudo por aqui. Estou com umas duas páginas de idéias de posts pra escrever e acho que essa próxima semana vai ser re-início de uma época que o blog era referência devido às idéias discutidas: mais que apenas técnico, o blog já foi e sempre será ideológico, seja isso um agregador ou não de idéias. =)

Não posso deixar de agradecer especialmente ao grande Jeve, Ana, Coradin, GB, Felipete, Keilinha e minha família por toda luz, alegria e compreensão até aqui: essa nova fase da minha vida tem sido muito bacana e espero sempre poder compartilhar com vocês o que tiver de melhor. Vocês hoje são minha GRANDE família e vocês (espero) sabem disso.

A Giran foi um sonho de longa data que felizmente nasceu com uma das pessoas que mais considero na vida: Jeve, você é o cara. (Carneirin, fica ciume não rapá).

Meus alôs pro pessoal do CEJUG, pro Rafael Carneirin, Loiane, Léo França, Paulin Rodrigues, Léo “Nariz/Jesus” Zamprogno, Marcelo “Robs” Aquino, Cabralito (meu nego),  Almir M3nd3s, Reinaldo JuniorZ, Gersão, família Evictus, galera Metal e por ai vai.

Vocês todos, meu muito obrigado pela existência: sem vocês, decididamente a vida teria bem menos motivos pra rir continuamente.

Simbora!!!!!!

Convite 1º Workshop PHP-ES 2

Léo Hackin to PHP, Tecnologia, eventos — Tags: , , ,  
É com muita alegria que a comunidade PHP do Espírito Santo - PHP-ES - convida a toda a comunidade capixaba de desenvolvedores, gerentes de TI, estudantes, curiosos e a quem interessar para participar do 1º Workshop PHP-ES.

O Workshop PHP-ES é um evento regional totalmente dedicado à divulgação e disseminação da linguagem de programação PHP no ES. O evento acontece pela primeira vez, fruto da vontade dos usuários de grupo de PHP?ES em ter um evento exclusivo sobre PHP, afim de promover o interesse regional pela linguagem.

O Workshop PHP-ES será realizado no dia 30/05/2009, sábado, no período de 13h até as 18h no Anfiteatro da UVV - Centro Universitário de Vila Velha - Campus Boa Vista.


As inscrições são GRATUITAS e OBRIGATÓRIAS, pois o número de vagas é limitado, e dão direito ao recebimento do certificado de participação e aos SORTEIOS de vários brindes. Convocamos todos os participantes a trazerem 1kg de alimento não-perecível que será doado a uma instituição.
Segue a grade do evento:

13:00h - 13:40h - Credenciamento
13:40h - 13:50h - Abertura
13:50h - 14:50h - Nadando em Dinheiro com AJAX e jQuery [Reinaldo de Souza "JuniorZ"]
15:00h - 16:00h - Desenvolvimento ágil com Smarty [Gerson Novais]
16:00h - 16:30h - Intervalo
16:30h - 17:30h - CakePHP [Leonardo "Hackin" Freire]
17:30h - Fechamento
Informações e inscrições podem ser feitas em: http://www.php-espiritosanto.com.br/
Equipe organizadora do Workshop PHP-ES
logo_fj2009Ohh yeah! Dia 22 desse mês, estou zarpando para o Falando em Java 2009 com meu amigo-sócio-brother-conselheiro-espiritual Paulo Jeveaux. É o primeiro evento de muitos que a Giran Soluções e Ensino vai proporcionar/patrocinar aos seus colaboradores.

O evento, que chega à sua terceira edição, é organizado pela Caelum e esse ano vai acontecer no domingo, dia 24 de maio, no Espaço Hakka em Sampa. No site do evento estão todas as informações necessárias para quem vive em Sampa ou é de outros estados, como a gente e uma penca de nego que vai de tudo quanto é canto.

Oportunidade única pra bater papo e fazer aquele networking com gente bacana, interada, twitters e um monte de gente que só conheço via MSN/Twitter.  Vamos antes pra “bater perna” um pouco pela grande São Paulo e fazer AQUELE happy hourzin em terras paulistanas.

Simbora! :D

1º Workshop PHP-ES 0

Léo Hackin to Ahn?, PHP, Tecnologia — Tags: , ,  
homepageSalve pessoal,

É com prazer que informo as primeiras informações sobre o 1º encontro do grupo de usuários PHP do Espírito Santo, vulgo 1º Workshop PHP-ES. Esse evento vem sendo idealizado a algum tempo pela galera do grupo e finalmente saiu do papel graças ao empenho de todos (em especial do amigo Almir M3nd3s), com N threads no grupo de discussão e por ai vai.

(mais…)

Drosera: o Firebug do Safari 2

Léo Hackin to Mac OS X — Tags: , , , ,  
Hi People! Duzentos anos depois, eis mais um post: e agora vai ser no mínimo 1 por semana. :)

É fato que o Firefox derrubou barreiras e hoje é o maior e melhor navegador do planeta. Fato! Mas é fato também que ele nas últimas versões tem consumido um absurdo de memória RAM: a pergunta que fica é “PRA QUE TANTO?“.

Revolta a parte, compartilhada com meu brother-sócio Jeveaux, a navegação com o Firefox ainda “era” uma necessidade devido ao Firebug, plugin pra la de providencial para debug dos scripts e elementos da página: total mão na roda para quem usa intensivamente Ajax, JS e demais tecnlogias correlatas.

Frustrações e algumas googladas e a solução apareceu: Drosera, um complemento da ferramenta Webkit. (mais…)

Giran Soluções e Ensino 3

Léo Hackin to Pessoal — Tags:  
É com IMENSO PRAZER que anuncio a abertura da GIRAN SOLUÇÕES E ENSINO, fruto do sonho do grande irmão-brother-amigo-amante-conselheiro-espiritual Paulo Jeveaux com quem estou tendo a honra inenarrável de compartilhar. Juntamente com a Keilinha, anjo da guarda nosso e esposa do sortudo do Jeveaux, estamos agora caminhando essa nova trilha.

(mais…)