KISS - Keep it simple, stupid!

CakePHP Component para o Google URL Shortener

postado por Fabrício Ferracioli em 19/04/2011 22:57:06

Fala Galera!

Hoje comecei um Component para o CakePHP que utiliza as funções básicas do Google URL Shortener, ou goo.gl.
Essas duas funções já estão prontas, e futuramente pretendo adicionar a função de estatísticas de cliques, também disponível na API.

O projeto se encontra nesse repositório do GitHub. Espero que seja útil para vocês, e caso alguém tenha alguma opinião ou dúvida, utilize os comentários.

Update: um exemplo de utilização sempre cai bem, não é?

<?php
class ExamplesController extends AppController
{
    var $name = 'Examples';
    //sua chave gerada pelo google pode ser fornecida aqui
    var $components = array('GoogleUrlShortener' => array('apiKey' => 'sua-chave-da-api-aqui'));
 
    function action()
    {
        //essa é outra maneira de fornecer sua chave da api
        $this->GoogleUrlShortener->apiKey = 'sua-chave-da-api';
        $results = $this->GoogleUrlShortener->generateShortUrl($this->data['longUrl']);
        $original = $this->GoogleUrlShortener->getOriginalUrl($results['id']);
    }
}
?>

Agora sim, fica simples de usar!

Tags: , , , ,
Topo

Sem comentários

Oficina de personalização de Wordpress

postado por Fabrício Ferracioli em 11/11/2010 07:35:40

Fala galera, tudo certo?

Esse blog anda um pouco inativo mas ainda funciona!

Talvez seja porque os autores estão muito ocupados em suas atividades atuais, mas não esquecemos de vocês.

Esse post vai ser bem rápido, e direcionado para um pessoal que normalmente não entraria nesse blog. Nos dias 8 e 9 desse mês, eu e o Rennan Martini ministramos uma oficina de personalização para Wordpress a pedido do professor Dhiego Bicudo para a turma do último período de Artes Visuais da Unopar. Durante a apresentação prometi para eles disponibilizar o arquivo que utilizei, então aqui está ele.

Agradeço a oportunidade dada pelo Dhiego e a atenção de todos. Como tenho certeza que vocês estão cheio de dúvidas, utilizem os comentários que tento ajudar.

Tags: , ,
Topo

2 Comentários

Validação de campos de texto com caracteres acentuados

postado por Fabrício Ferracioli em 02/04/2010 14:00:56

Recentemente tive um problema com a validação de um campo textual que me deu um pouco de dor de cabeça. Como acredito que esse pode ser um problema comum, vou compartilhar a solução aqui no blog.
Toda entrada textual deve ser representada com uma codificação de caracteres específica. Essas codificações são diversas, mas as mais conhecidas e utilizadas são ASCII, ISO 8859-1 e UTF-8. Cada uma possui diferentes capacidades e características, mas já adianto que a mais atraente delas é o UTF-8 (ou Unicode), sendo inclusive uma recomendação de utilização do W3C.

Todo programador também sabe da importância de validar uma entrada do usuário antes de realizar qualquer operação com ela, e uma regra de validação comum é a quantidade de caracteres em uma entrada de texto. O CakePHP fornece regras de validação como o minLength, maxLength e between para facilitar a vida do programador.

Agora imagine que você precisa validar um campo textual que deve ter entre 5 e 10 caracteres. Simples, defina a seguinte regra em seu modelo:

var $validate = array(
    'campo' => array(
        'rule' => array('between', 5, 10),
        'message' => 'Este campo precisa ter entre 5 e 10 caracteres.'
    )
);

Perfeito!

Calma que não é bem assim. Imagine que o campo foi preenchido com o valor ‘php é foda’, uma string de tamanho 10. Curiosamente, essa string não passa na regra de validação. Por que?

Ao observar a documentação das três regras que mencionei, vocês irão perceber que existe uma observação dizendo que o tamanho do dado é a quantidade de bytes utilizada para representá-lo. Na Web a maior parte dos textos é codificada em UTF-8, ISO-8859-1, entre outros encodings, que podem utilizar mais de um byte para representar caracteres acentuados, e esse é o motivo da regra de validação não funcionar para esse caso.

Também não adianta usar a função strlen() do PHP, porque ela possui o mesmo comportamento.

O que fazer então?

É claro que existe uma alternativa, que é a função mb_strlen. Ela recebe 2 parâmetros, sendo o 2 opcional, mas de grande importância, que é justamente a codificação utilizada para a string do primeiro parâmetro.

O código

    mb_strlen('php é foda', 'utf-8');

retorna exatamente 10, o valor que desejamos.

Desse modo, nossa função de validação seria:

function validateInputLength($input)
{
    $encoding = mb_detect_encoding($input['campo']);
    $lowerLimit = 5;
    $upperLimit = 10;
    return mb_strlen($input['campo'], $encoding) >= $lowerLimit && mb_strlen($input['campo'], $encoding) <= $upperLimit;
}

Note o uso da função mb_detect_encoding, o que torna a função capaz de manipular qualquer tipo de string, não sendo dependente de nenhuma codificação de caracteres.

Apesar de ser uma questão simples, acredito que essa solução pode ajudar bastante.
Alguém já teve problemas semelhantes? Como resolveram?

Tags: , , , ,
Topo

6 Comentários

A importância do software livre e padrões abertos na Web

postado por Fabrício Ferracioli em 20/03/2010 11:48:08

Ano passado um aluno de jornalismo da UEL me procurou para falar um pouco sobre minha “experiência” com software livre. Ele desejava saber minhas opiniões tanto no papel de usuário quanto de desenvolvedor, tanto para o mercado quanto para a área científica. Uma parte do resultado da pesquisa do Lucas de Godoy pode ser visto nesse post do blog dele.

Há algum tempo o João José postou aqui no blog sobre práticas para se tornar um melhor desenvolvedor CakePHP e entre elas muitas estão relacionadas ao software livre ou a padrões abertos. Mas acredito que essas práticas não ajudam somente o desenvolvedor CakePHP, mas qualquer desenvolvedor.

Por que?
Imagine a Web dependente da vontade de players de mercado com suas soluções proprietária e obscuras? Difícil? Então vamos voltar um pouco no tempo e lembrar da época da guerra dos browsers. Netscape e Microsoft disputavam quem tinha o melhor browser e para isso também disputavam a preferência dos desenvolvedores Web. Pouca importância era dada aos padrões do W3C e era muito comum implementar duas versões de um mesmo aplicativo Web.

Até hoje sofremos um pouco com os resultados dessa época negra da Web, mas o cenário mudou. Hoje os browsers brigam entre si para ver quem é o mais rápido em dar suporte total a HTML 5, CSS 3, EcmaScript o que é muito positivo e na minha opinião o caminho certo. Não sou só eu que penso assim, Tim Berners-Lee, o criador da nossa tão querida WWW é um dos maiores incentivadores de padrões abertos. Vantagens, você só precisa aprender uma vez, pois todos seguem o mesmo padrão o que torna a Web muito mais acessível. O usuário também ganha pois, por mais que não saiba, tem a liberdade de escolher o browser de sua preferência e visualizar a aplicação Web da mesma maneira em todos eles.

Falando um pouco sobre o server side, não tem como negar que o software livre é praticamente a base da Web atual. O servidor Web mais utilizado é o Apache e a linguagem de programação o PHP. Ambos são disponibilizados com licenças abertas, o que facilita a sua adoção. Também possuem uma ampla comunidade que está sempre disposta a ajudar e uma boa documentação que ajuda tanto iniciantes quanto desenvolvedores mais experientes. Com nosso framework preferido também não é diferente.

Tudo isso ajuda a fazer um desenvolvedor melhor. Ter a oportunidade de ver o código do que você utiliza para desenvolver suas soluções dá uma compreensão melhor de como as coisas funcionam, te ajuda a entender melhor a lógica por trás da mágica, te faz entrar em contato com outras metodologias de programação, etc. Participar de comunidades de software livre, lendo threads, postando perguntas e ajudando com respostas também tem um peso muito positivo, ajuda a entender necessidades de outros desenvolvedores, compreender códigos diferentes dos seus, solucionar problemas que não são seus, entrar em contato com outros profissionais com mais ou menos experiência, etc.
Se você for um pouco mais hardcore pode até colaborar no desenvolvimento, e o convite sempre está aberto para quem deseja ajudar. Se você não é um programador fabuloso, ainda pode ajudar na documentação, tradução ou simplesmente sendo ativo na comunidade.

E o software proprietário? Não sou contra de maneira alguma, mas algo tão abrangente e revolucionário como a Web não pode ser baseado em licenças proprietárias.
E você, o que acha sobre a importância do software livre e dos padrões abertos para o desenvolvimento Web?

Tags: , ,
Topo

2 Comentários

Migrando para o CakePHP 1.3

postado por Fabrício Ferracioli em 22/02/2010 13:39:06
Tags:

A maioria já deve saber que o CakePHP está com a versão 1.3 do framework em estado beta. Me recordo que a versão 1.2 do framework já era bem agradável quando estava em fase beta, e portanto decidi testar o que o CakePHP 1.3 tinha de novo. Fiz o download e fui direto para a página que contém a descrição das principais mudanças da versão 1.2 para a 1.3. Quando vi que ela tinha um tamanho um pouco grande decidi testar logo alguma aplicação que eu tinha funcionando na versão 1.2.

Para minha surpresa ela não exibiu nem a página inicial, e ao invés disso várias mensagens de erro foram mostradas. Então vi que era realmente necessário ler a extensa página. Durante a leitura percebi que diversas mudanças importantes ocorreram, e logo vi o porque da minha aplicação sequer funcionar. Como a leitura é um pouco extensa, decidi resumir as principais mudanças aqui. As novidades vão ficar para depois, porque também são várias.

Principais mudanças do CakePHP 1.3

  • Adicionadas configurações específicas do config/core.php para quem utiliza o PHP 5.3
  • O arquivo webroot/index.php foi alterado, e deve ser substituído em sua aplicação
  • Recomenda-se que todos os métodos e classes deprecados não sejam mais utilizados
  • Admin routes foram removidas por uma configuração mais geral, chamada routes prefix. O route prefix admin pode ser definido com a linha
    Configure::write('Routing.prefixes', array('admin'));
  • O método de remoção no modelo agora é único,
    Model::delete()
  • O Model teve os métodos métodos findAll(), findCount() e findNeighbours() removidos
  • Os diretórios css, js e img foram removidos dos diretórios app/vendors e plugin/vendors e substituídos com os diretórios plugin e theme no webroot
  • Somente a variável
    $title_for_layout

    poderá ser definida para o título da página, tanto no Controller quanto na View

  • Deve-se selecionar o ponto da aplicação desejado para dump de sql quando o debug está definido para 2, utilizando a linha de código
    echo $this->element('sql_dump');

    em qualquer ponto da aplicação

  • SessionHelper e SessionComponent não são mais carregados por padrão. Agora devem ser declarados como qualquer outro helper ou component. Para manter o comportamento antigo, adicione a declaração de helpers e components em seu AppController
  • A função
    SessionComponent::setFlash()

    teve seu segundo parâmetro alterado para usar um element e não um layout. Para alterar sua aplicação primeiro mova seus layouts para a pasta de elements e renomeie a variável

    $content_for_layout

    para

    $message
  • Não existe mais o nível 3 de debug
  • PaginatorHelper agora produz a saída dos métodos
    prev(); next(); first(); last();

    englobada por

    <span>

    e não

    <div>

    para tornar a estilização mais fácil

  • Os métodos
    dateTime(); year(); month(); day(); minute(); meridian(); select();

    do FormHelper não possuem mais o parâmetro

    $showEmpty

    , e agora utilizam

    $attributes['empty']
  • FormHelper::submit()

    agora pode criar outros inputs além de type=submit. Para isso utilize a option type

  • FormHelper::button()

    agora cria elementos button ao invés de inputs reset. Para criar inputs de reset, utilize

    FormHelper::submit()

    com o parâmetro option definindo ‘type’ => ‘reset’

  • O método
    FormHelper::create()

    não cria mais elementos fieldset escondidos, agora substituídos por divs escondidas, o que ajuda na validação de HTML 4

  • No HtmlHelper os métodos
    link(); para(); div(); tag()

    não pussuem mais o parâmetro

    $escape

    , que foi substituído por

    $options['escape']

    . Similarmente os métodos

    meta(); css()

    tiveram o parâmetro

    $inline

    substituído por

    $options['inline']
  • Agora as chamadas a
    $session->flash()

    não são mais auto-exibidas, sendo necessário adicionar

    echo

    antes da chamada a função, como em qualquer método de helper

  • JavascriptHelper e AjaxHelper estão deprecados, e agora deve-se utilizar o JsHelper em conjunto com o HtmlHelper.
    $javascript->link()

    agora é

    $javascript->codeBlock()

    é

    $html->scriptBlock()

Já deu para perceber que vai dar trabalho mudar algumas coisas. E essas são apenas as alterações que considerei mais importantes, na página de migração do 1.2 para o 1.3 está a lista completa. Verifique nessa se alguma mudança afeta as suas aplicações.

Pelas alterações deu para perceber que o framework está mais preocupado com a padronização do seu comportamento, de código, utilização de Web Standards e desempenho, questões que são sempre importantes.
Bom, é isso, espero ter ajudado. Na próxima vamos dar uma olhada nas novidades do Cake 1.3.

Tags:
Topo

3 Comentários

Gerando HTML 4.01 com o HTML Helper do CakePHP

postado por Fabrício Ferracioli em 15/12/2009 14:21:18

Apesar das melhorias introduzidas no HTMLHelper do CakePHP 1.2, sempre achei ridículo ele gerar marcação apenas em XHTML. Sempre preferi HTML, e me via engessado pelo CakePHP nesse aspecto.

Acredito que muitos passam por essa dificuldade quando estão trabalhando com o HTMLHelper e FormHelper do CakePHP. Uma das principais consequências disso, é que o código gerado na maioria das vezes não é válido, pois mistura tags HTML e XHTML.

Mas sempre imaginei que deveria haver um meio de contornar isso. Certa vez verifiquei que existia um método chamado docType no HTMLHelper, e que era possível definir HTML 4.01 com ele. Mas minha alegria logo acabou quando percebi que ele não alterava o comportamento do Helper para gerar tags HTML.

Finalmente, hoje acabei me deparando com uma alternativa. Cansado de mensagens de código inválido fiz uma leitura mais cuidadosa do manual do CakePHP e encontrei a página que diz como gerar tags HTML 4.01. A solução não é muito elegante, mas é uma alternativa presente no próprio framework.
Espero que a solução sirva para vocês também!

Update 1:Para quem estiver com preguiça de fazer o arquivo do zero, fiz um repositório no Github com o arquivo e algumas tags. Conforme for sentindo necessidade vou aumentar o conteúdo dele. Quem quiser colaborar, está convidado!

Update 2: Apliquei as sugestões do Juan Basso, agora um Helper está disponível para manter as tags HTML 4.01. Vejam a discussão abaixo. O link do Github contínua o mesmo. Mantive o arquivo anterior para quem preferir o método da documentação do Cake.

Tags: , , , , ,
Topo

4 Comentários

Programador, nem sempre é você que está errado!

postado por Fabrício Ferracioli em 19/11/2009 14:51:11

Pois é amigos, quando estamos falando de programação nem sempre você é o cara errado da história.

Digo isso pois acabo de passar por uma situação em que estava certo, mas por não acreditar muito nisso acabei perdendo algum tempo procurando erros inexistentes.

Estava testando uma aplicação e apenas um caso de teste falhava.
Ao verificar o código aparentemente não havia nada errado, e poucos dias atrás o mesmo trecho não apresentava problemas. O que estaria acontecendo?

Teste com 1 falha

Fiquei um bom tempo tentando encontrar algum erro bobo de lógica em um código que eu havia acabado de inserir, mas não encontrava nada. Além disso, o trecho de código que falhava nos testes não tinha relação nenhuma com as alterações que havia feito.

Então pensei que poderia ser uma alteração do CakePHP 1.2.5 que não havia passado para o meu código. Também procurei por isso em vão. Então percebi que o problema estava com uma função que utiliza transações, o que já foi uma fonte de problemas nesse projeto, ou seja, um problema recorrente.

    if($init_transaction){
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $db->begin($this);
    }
    foreach( $balloonContents['BalloonContent'] as $index => $content ) {
        $content['balloon_id'] = $balloon_id;
        $this->create($content);
        $save = $this->save();
        $status = $status && $save;
    }
 
    if(!$init_transaction){
        return $status;
    }
    elseif ($status && $db->commit($this)) {
        return true;
    }
    else {
        $db->rollback($this);
        return false;
    }

É um código simples, e não existe nenhum problema com ele. Como eu acabei de instalar o openSuse 11.2, que agora está com o MySQL 5.1 nativo, me lembrei que ele poderia não estar configurado corretamente para usar a storage engine InnoDB. E era exatamente isso! Como o MyISAM fica habilitado por padrão, e essa storage engine não tem suporte total a transações, se você deseja utilizar esse recurso deve dizer ao banco de dados.
Ou seja, meu ambiente estava configurado de modo inconsistente com as necessidades da aplicação. Alterei o arquivo de configuração do MySQL, o my.cnf, adicionando a seguinte opção:

default-storage-engine=InnoDB

Depois disso o teste passou e tudo voltou ao normal.

Testes passando após trocar a storage engine

Portanto rapaziada, em alguns casos não adianta procurar pelos seus erros. Procure se lembrar que qualquer tarefa necessita de subsídios, e no caso de nós programadores, um ambiente bem configurado faz toda diferença.

Alguém já passou por situação semelhante?

Tags: , , , ,
Topo

Sem comentários

Creative Commons License
Sou Ágil: KISS em http://kiss.souagil.com.br está licenciado sobre
Creative Commons Attribution-Share Alike 2.5 Brazil License.

souÁgil