Oportunidade - Programador de Interfaces

Posted by Felipe Ribeiro on October 24, 2008

A startup que trabalho (shoprizer.com) tem uma equipe formada por Jedis (onde eu sou o Mestre Yoda :-D), que trabalham com PHP Hardcore e está precisando agora de um NINJA, um programador de interfaces, para trabalho remoto. Os requisitos são:

  • XHTML, CSS, Web standards
  • Javascript/AJAX
  • PHP básico/intermediário - só o necessário para a integração da lógica existente com a interface a ser feita.
  • Smarty
  • Disponibilidade de 20 horas semanais - flexíveis.
  • Inglês básico para leitura e escrita
  • Conhecimento de princípios de Usabilidade
  • Precisa ter o espírito de startup!

Se você está interessado, mande seu CV com links do seu portfolio para van2br@yahoo.com, atenção à Vanessa.

Review e slides do CONAPHP 3

Posted by Felipe Ribeiro on October 22, 2008

No último fim de semana (18 e 19 de outubro) houve em São Paulo o CONAPHP (www.conaphp.com.br), um evento feito pela comunidade PHP e que rolou dentro do CONISLI na FIAP.

O evento em geral foi bom, com bom nível de palestras mas o público foi um pouco abaixo do que eu esperava.

Para mim, o ponto alto foi quando estava assistindo a palestra do Elton Minetto (slides aqui) e “reconheci” um slide sobre o compilador JIT e o cache do opcode do PHP, um slide que fazia parte da apresentação que fiz em Recife no Encontro Pernambucano de SL, e para confirmar vi lá meu link nas referências, e isso me deixou bastante honrado por ter um material meu usado como referência por um ícone como o Elton.

A minha palestra foi a última e falei sobre PHP RESTful Web Services, por ser a última, o título não ser apelativo para o pessoal mais iniciante e eu ser um ilustre desconhecido da comunidade PHP de São Paulo, tive apenas metade da sala cheia, mas o feedback das pessoas que assitiram a palestra foi bastante positivo e fiquei muito satisfeito.

Os slides da palestra seguem abaixo, e o código apresentado está disponível aqui.

PHP RESTful Web Services

View SlideShare presentation or Upload your own. (tags: php rest)

Quem tiver interesse sobre o assunto, deixo algumas referências:

Algoritmo de “Você quis dizer”

Posted by Felipe Ribeiro on October 08, 2008

Recentemente precisei implementar um sistema de correção ortográfica à la Google.

Pesquisei bastante sobre como fazer isso, e encontrei duas maneiras que explicarei agora, mas antes disso explicarei algo que é comum às duas: A criação do dicionário

Para criar o dicionário, você precisa ter uma base de palavras, que idealmente é um arquivo txt.

Você lê o arquivo e cria um array onde as palavras são as chaves e as frequências com que aparecem nos textos serão os valores.

<?php
$text
= file_get_contents(‘arquivo.txt’);
preg_match_all(“/[a-z]+/”,strtolower($text),$matches);
$palavras = $matches[0];
$dicionario
= array();
foreach(
$palavras as $palavra)
$dicionario[$palavra] += 1;
sort($dicionario); /* Essa ordenação será útil para otimização de performance no primeiro algoritmo */ file_put_contents(‘dicionario_serializado.dat’,serialize($dicionario);
?>

1 - Algoritmo de Levenshtein

PHP implementa nativamente o algoritmo de Levenshtein (http://php.net/levenshtein), que calcula a distância de edição entre duas palavras, funcionando da seguinte forma:

  • suponha que eu tenha duas palavras: água e mágua - A distância de edição delas é de uma inserção de carácter
  • suponha que eu tenha as palavras: casa e caixa - A distância delas é de uma substituição (s por i) e uma inserção (x)
  • suponha que eu tenha as palavras: arrocho e arroto - A distância delas é de uma substituição e uma remoção.

A função levenshtein também permite que você dê pesos diferenciados para inserção/remoção/substituição, sendo que o valor default é 1 para todas operações. Usando essa função, fica simples implementar um corretor, supondo que você tem um dicionário que já citei, você só precisa fazer:

<?php
function
voce_quis_dizer($palavra_procurada) {
$dicionario
= unserialize(file_get_contents(‘dicionario_serializado.dat’)); $minima_distancia = -1;
$palavra_procurada
= strtolower($palavra_procurada);
foreach(
$dicionario as $palavra_do_dicionario) {
if(
$palavra_procurada == $palavra_do_dicionario) return $palavra;
$distancia = levenshtein($palavra_procurada,$palavra_do_dicionario);
if(
$distancia < $minima_distancia || $minima_distancia == -1) {
$minima_distancia = $distancia;
$sugestao = $palavra_do_dicionario;
}
}
return
$sugestao;
}
?>

Análise de desempenho:

Considerando que temos k palavras no dicionário, a palavra que desejamos procurar tem m letras e cada palavra do dicionário tem em média n letras, o algoritmo de Levenshtein tem ordem de complexidade O(m*n) onde para k comparações (no caso da palavra não existir no dicionário, já que se ela existir não teremos nenhuma comparação) teremos O(k*m*n) (k*m*n operações onde k é muito maior que m e n).

2 - Algoritmo de Peter Norvig

Toda explicação probabilística desse algorítmo está presente no site do Norvig, um cara renomado na área de inteligência artificial: http://norvig.com/spell-correct.html. Mas basicamente esse algoritmo apesar de mais complicado é bem mais inteligente que o primeiro. O que ele faz é o seguinte: gera perturbações na sua palavra procurada e vê quais dessas perturbações é a mais relevante no dicionário. Evitando comparações desnecessárias, já que no primeiro algoritmo cada palavra que você colocar será comparada com todas as outras (por exemplo: se você digitar BOLA, e ela não existir no dicionário ela será comparada com palavras absurdas como: LIVRO, que obviamente não é o que você quis dizer).

Apesar do conceito do Norvig ser simples, o código é um pouquinho complicado. Então eu criei uma classe que implementa ele e disponibilizei sob Licença BSD no PHPClasses.org (http://www.phpclasses.org/browse/file/24605.html) e tenho recebido elogios e feedback muito positivo de quem está usando.

Análise de desempenho:

Considerando 26 letras do alfabeto (depois da reforma da língua portuguesa, agora também temos 26 letras! :D) e considerando que sua palavra tem m letras, teremos mais ou menos 26*m iterações para gerar as possíveis perturbações na palavra (inserções, remoções e substituições possíveis), e para garantir um segundo nível de perturbações teremos aproximadamente 26*m para cada perturbação gerada, que dá um total de aproximadamente (26*m)*(26*m) = 676 m². Agora só precisamos consultar cada uma das perturbações para vermos qual a mais relevante no dicionário. Cada consulta no dicionário é O(1) então desprezaremos na análise de performance.

E podemos considerar esse algoritmo como sendo mais eficiente do que o primeiro pois o tempo de execução cresce de acordo com o quadrado do tamanho da palavra (que normalmente é bem menor do que o tamanho do dicionário). Enquanto o primeiro sofre interferência do tamanho do dicionário e do tamanho médio das palavras contidas lá, então esse é bem mais inteligente e eficiente.

Espero ter ajudado!

Hug a developer!

Posted by Felipe Ribeiro on August 28, 2008

Computação em nuvem – a nova tendência do mundo digital.

Posted by Felipe Ribeiro on May 26, 2008

O nome soa estranho, mas computação em nuvem é a tradução do termo “Cloud Computing” que vem rondando o vale do Silício há algum tempo e é um conceito que assusta gigantes do mundo do PC como a Microsoft e abre espaço para milhões de pequenas empresas na Web – as startups.

A idéia da computação em nuvem apresenta uma nova maneira de organização do mundo digital, que deixa de ser “PCcêntrico” e passa a ser “WEBcêntrico”, já que a tal nuvem é a própria Web, com os softwares deixando de ser produtos e se tornando serviços.

Dessa maneira, seus dados, documentos e ferramentas estariam hospedados em grandes servidores na Web e você acessaria tudo através do navegador, que seria uma espécie de cliente universal e assim você teria acesso aos seus arquivos a partir de qualquer computador no mundo e também exigiria menos dos PCs o que possibilitaria a produção de máquinas ainda mais baratas.

E o software como serviço abole de vez com as licenças e softwares de prateleira, pois você não precisa mais instalar nada, apenas paga-se uma taxa para usar um serviço online por um determinado tempo e no caso de serviços gratuitos, alguém está pagando para você: OS ANUNCIANTES.

Isso já vem acontecendo aos poucos com a oferta de serviços na Web de suítes de escritório e ferramentas de edição de imagem, entre outros e a tendência é que nas máquinas só estejam instalados softwares básicos.

Mas por quê a Microsoft deve se preocupar?

A política da Microsoft de vender software na caixinha fica obsoleta com essa novidade, e os usuários costumavam optar pelos MS Windows pelo enorme leque de opções de softwares compatível com ele. Porém se a idéia da computação em nuvem se concretizar, as aplicações se tornam independentes de plataforma e qualquer pessoa em qualquer sistema operacional que tenha um browser que implemente razoavelmente os padrões web W3C, como o excelente Mozilla Firefox, poderá ter acesso às tais aplicações, e essa é mais uma chance que o Linux tem de decolar.

E o que ainda falta?

Na minha humilde opinião ainda existe um gap que precisa ser considerado: o gargalo da rede. As aplicações Web estão conseguindo um nível de responsividade muito alto, mas para se equiparar aos potentes computadores modernos rodando aplicações stand-alone ainda há um caminho árduo a ser percorrido e não acho que seja algo que é feito da noite para o dia, mas sim algo gradual e relativamente lento, como realmente vem acontecendo.

Cheat sheets

Posted by Felipe Ribeiro on February 16, 2008

“Quem cola não sai da escola”, é o ditado que a gente escuta no colégio, mas Cheat sheets e guias de bolso realmente são muito úteis quando você quer o nome daquela funçãozinha que faz exatamente o que você quer e você não lembra no momento, para consultas rápidas e não pra quem quer realmente aprender algo.
Achei algumas bem interessantes e vou compartilhar aqui até para facilitar de me lembrar depois (uma Cheat sheet de cheat sheets :D):

Browsershots.org - Teste seu site em vários browsers

Posted by Felipe Ribeiro on January 31, 2008

A dica do dia é: http://browsershots.org, um site onde você pode obter o screenshot do seu site nos mais diversos browsers em diferentes versões e SO’s. Realmente muito bacana!

Update: E para pegar um shot da pagina completa, tem esse serviço web bem bacana

O Mantra das REGEX - As 8 Expressões Regulares que precisamos saber.

Posted by Felipe Ribeiro on January 29, 2008

RegexVocê tem medo de REGEX!? Eu também!

Nos últimos tempos tenho lidado bastante com REGEX editando regras do Apache mod_rewrite e com a classe que publiquei no PHPClasses, a SiteMapGenerator Tabajara, que se propõe a gerar um mapa do site em xml no padrão estabelecido pelo Google para melhorar a indexação.

Mas depois de tirar onda da galera do Perl no post anterior, vou exaltar a importância que expressões regulares têm nas nossas validações, e para isso vou citar as 8 expressões regulares que todo programador Web deveria saber (exemplos em PHP, mas são válidos para qualquer linguagem com suporte a PCRE).

Validação de nomes de usuário

4 a 28 caracteres alfanuméricos e underscores:


$string = "userNaME4234432_";
if (preg_match('/^[a-z\d_]{4,28}$/i’, $string)) {
echo “exemplo 1 ok.”;
}

Validação de números de telefone

(##) ####-#### ou ##-####-####

$string = "(32) 5555-5555";
if (preg_match('/^(\(?[0-9]{2}\)?|[-. ]?)[ ][0-9]{4}[-. ]?[0-9]{4}$/’, $string)) {
echo “exemplo 2 ok.”;
}


Endereços de e-mail

foo@bar.foo

$string = "first.last@domain.co.uk";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.]

[a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/’,
$string)) {
echo “examplo 3 ok.”;
}

CEPs

#####-### ou ########

$string = "55324-432";
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4})?$/’, $string)) {
echo “exemplo 4 ok.”;
}

Endereços IP

255.255.255.0

$string = "255.255.255.0";
if (preg_match('^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$’

, $string)) {
echo "exemplo 5 ok.";
}


Código de cores RGB em Hexadecimal

#FFFFFF, #FFF, FFF, FFFFFF

$string = "#666666";
if (preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i’, $string)) {
echo “exemplo 6 ok.”;
}

Comentários de múltiplas linhas

/* Lorem
Ipsun
dolor*/


$string = "/* commmmment */";
if (preg_match('/^[(/*)+.+(*/)]$/’, $string)) {
echo “exemplo 7 ok.”;
}

Datas

DD/MM/YYYY ou MM/DD/YYYY

$string = "30/01/2008";
if (preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $string)) {
echo "exemplo 8 successful.";
}

Esses exemplos foram retirados do site Devolio[1] , porém algumas expressões eu alterei para ajustar aos padrões brasileiros de telefone e cep. Se por acaso fiz alguma besteira, peço que um REGEXPERT comente e corrija! E no segundo link[2] um validador de expressões regulares.

[1] 8 Practical PHP Regular Expressions - Devolio
[2] Perl Compatible Regular Expression Tester

Não acredito em profissionais "Bombril" na Web 3

Posted by Felipe Ribeiro on January 03, 2008

Com o aumento da complexidade de recursos dos sites na Web, o termo Webmaster entra cada vez mais em extinção.

Antigamente, quando tudo era mais simples e feio, com sites em HTML estático e cheio de GIFs piscantes, era comum ter um cara que era responsável por tudo, o webmaster.

Mas agora é cada vez mais difícil ter conhecimento suficiente para ser um bom designer e bom programador, eu me atrevo a dizer que seja impossível. E vou justificar…

As duas áreas podem ser extremamente profundas, design não é só fazer efeitos legais no Photoshop, nem programação é apenas fazer um CRUD em drag’n'drop Net dot Net

Um profissional de design precisa ter conhecimentos teóricos na área, saber criar conceitos, prezar pela usabilidade, ergonomia, sem esquecer da beleza e do conforto do usuário com cores e formas adequadas, e isso requer estudo, não é só questão de ter um “bom gosto”. Fora que muitas vezes a arte que é mostrada no site de uma empresa é a continuação de toda uma campanha que ocorre também fora do “cybermundo”.

E um profissional de desenvolvimento de software precisa conhecer algoritmos, padrões de projetos, tecnologias diversas, técnicas de otimização de performance, segurança, etc.

Existem pseudo-profissionais que se auto-intitulam web designers e programadores, e eu sinceramente não acredito nisso. Um programador pode até escolher um formato bacaninha pra mostrar sua informação e tal, mas está longe de ser um designer profissional, e um designer pode até colocar um reloginho em JavaScript mas também está longe de ser um programador.

São mundos bem diferentes com profissionais de perfis diferentes que se juntam na Web, e para que essa junção seja mais harmoniosa, existe um cara que é híbrido, é o programador de interfaces, caras que sacam um pouco de cá e um pouco de lá e que trabalham na equipe para fazer com que as coisas encaixem mais perfeitamente, pois nem sempre um designer vai saber XHTML, CSS, e etc. Em muitos casos ele sabe criar e desenhar, o programador de interfaces que se vira para adaptar a arte dele para o mundo da Web e interagir com o sistema que é criado pela equipe de programação. Mas também há casos que designers desempenham essa função e há outros em que o programador o faz, cada caso é um caso… mas ainda não existe profissional completo que cuide de tudo, e se faz não é profissional ou não faz bem feito como deveria.

P.S.: Quero avisar aos poucos, porém queridos, leitores desse blog que meu aniversário é domingo, e caso queiram presentear esse que vos escreve, sintam-se a vontade! :-D Aqui vai um endereço que talvez possa lhe ajudar: http://feliperibeiro.com/wishlist