Aplicação usando Shoes

Posted by JoEh on July 04, 2008

Criei ontem de noite um aplicação de teste para traduzir palavras/frases usando Ruby, Shoes e Google AJAX Language API, ela é bem simples, não tem nada que não foi feito por aí, mas futuramente vou colocar a opção de salvar outras palavras/frases em um banco de dados local, usando SQLite provavelmente, já que estou reforcando meus estudos em inglês, acho que isto vai me ajudar bastante ;)

Mas nem tudo são flores nessa vida de programador, passei um trabalhinho para poder rodar o Shoes com as gems que eu usei, ele não funciona com gems instaladas usando gem install, por que ele tem uma espécie de “interpretador” próprio ou coisa parecida. Depois de instalar o Shoes tive que colocar as gems (json, rest-client) e a lib rexml dentro da Shoes-land - como vi uns chamando por ai.

Fiz um passo a passo de como rodar. Isso também serve para outras apps feitas usando Shoes que você queira rodar, não apenas para este projeto.

Copie as gems/libs - verifique antes se os diretórios são os mesmos

json - usei json_pure por que a outra é nativa, então não sei se funcionaria

sudo cp -R /usr/lib/ruby/gems/1.8/gems/json_pure-1.1.2/lib/json* /usr/local/lib/shoes/ruby/lib/

rest-client

sudo cp /usr/lib/ruby/gems/1.8/gems/rest-client-0.5.1/lib/* /usr/local/lib/shoes/ruby/lib/

rexml

sudo cp -R /usr/lib/ruby/1.8/rexml /usr/local/lib/shoes/ruby/lib/

Feito isso, clone o projeto

git clone git://github.com/rafaelss/shoes-translator.git

e quando terminar execute

cd shoes-translator
shoes translator.rb

Kohana PHP Framework

Posted by JoEh on June 25, 2008

Estou testando o Kohana, framework para PHP5, e ele me surprendeu bastante, conheci ele testando o CodeIgniter, que pelo que puder notar da comunidade, tem alguns problemas de releases, que demoram um pouco e tal.

O fato que mais me agradou nele é que ele foi feito para funcionar somente no PHP5, tem um sistema que permite criar extensões do core, de helpers muito bem feito, e sem ficar lento, pelo contrário, ele é muito rápido.

Na verdade ele tem só um problema, não usa E_STRICT por padrão para tratamento de erros, mas isso é barbada de resolver ;)

Template Engine para PHP5 3

Posted by JoEh on May 27, 2008

Disponibilizei ontem um projeto de Template Engine para PHP no github, quem quiser contribuir sinta-se a vontade :)

A idéia é fazer algo bem simples, onde a sintaxe usada é a do próprio PHP, porém com algumas restrições para tentar manter o código mais organizado possível. O projeto não está pronto ainda, faz algum tempo que tenho essa idéia mas só coloquei em prática no final de semana passado.

Então como eu já disse, quem quiser contribuir, não se acanhe, acesse o projeto no github, baixe o projeto, entre em contato comigo, entenda bem a idéia, implemente a suas e me mande um pull request para que elas sejam incorporadas no projeto.

Ah, vale lembrar que para que a contribuição seja aceita, ela precisa estar acompanhada de testes ;)

Curl wrapper para PHP5

Posted by JoEh on May 25, 2008

Sexta-feira passada (23/05) disponibilizei no github um wrapper para cURL utilizando Fluent Interface, para usar é muito fácil:

require_once "lib/Joeh/Net/Curl.php";
$curl = new Joeh_Net_Curl("http://www.joeh.com.br/blog/");
$curl
    ->followLocation(true)
    ->userAgent("MyBrowser 0.1")
    ->referer("http://www.mysite.com.br/");
$response = $curl->execute();

if($response->statusCode() == 200) {
    echo "Welcome to Joeh's Blog\n";
}
else {
    echo "Oopss, error " . $response->statusCode() . "\n";
}

Se você não usa git pode fazer o download do tarball com os fontes - porém, recomendo que você aproveite a oportunidade e aprenda a usar o git :)

Para quem não conhece git, recomendo ler o excelente Micro Tutorial de Git do Akita, que dá uma boa idéia de como funciona esse excelente controle de versão. Sobre Fluent Interface, recomendo a leitura desse artigo, do próprio autor do conceito.

strtoupper melhorado - minha versão 2

Posted by JoEh on May 20, 2008

O DGmike postou sobre sua função para dar upper em string com caracteres acentuados e eu resolvi postar a minha

public static function toUpper($string) {
    if($string === null) {
        return $string;
    }
    
    if(function_exists("mb_strtoupper")) {
        return mb_strtoupper($string, mb_detect_encoding($string));
    }
    $string = strtr($string, "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
    return strtoupper($string);
}

Como o código acima faz parte de uma classe com vários métodos para tratamento de strings, ele foi modificado, a linha que testa se a função mb_strtoupper existe na verdade usa uma variável, que carrego no inicio da requisição.

A minha lista de caracteres também não estava tão completa, então copiei da função dele :D

Usando Ubuntu

Posted by JoEh on May 13, 2008

Como falei nesse post, estou usando o Ubuntu, rodando pelo Windows (foi minha única opção, por enquanto!), e passei um bom trabalho para fazer funcionar o 3G da Claro nele, mas com a ajuda desses três artigos está tudo rodando beleza.

Para mim não funcionou seguindo apenas um deles, mas se não fosse pelo menos a base de cada um não teria conseguido, ou teria demorado mais uma cara de tempo.

Fica a dica então ;)

Mudanças do PHP 5.2.4 para o 5.2.5

Posted by JoEh on May 13, 2008

Se você usa uma classe de conexão com o banco que estende a classe PDO e sobreescreve o método prepare usando uma assinatura parecida com essa:

public function prepare($statement, array $driverOptions = array()) {
}

A partir da versão 5.2.5 essa assinatura é inválida, gerando um Strict standards error. Para resolver é só retirar o type hint do segundo parametro, ficando assim:

public function prepare($statement, $driverOptions = array()) {
}

Tirando as Teias 1

Posted by JoEh on May 12, 2008

É, deixei esse blog meio abandonado, mas foi por uma boa causa, últimamente os dias andam corrido para mim, ainda estou finalizando a construção da minha casa, então tem dias que não consigo fazer mais nada além de pintar paredes, marcos e janelas, o que faz com que eu tenha que deixar algumas coisas meio de lado.

Semana passada também tive que organizar meu note para instalar um Linux nele, tentei primeiro o Kubuntu com KDE4 mas não rolou, não consegui fazer funcionar o modem da Claro 3G, então depois de horas resolvi instalar o Ubuntu mesmo, funcionou muito melhor e não precisei perder tantas horas para funcionar a internet.

E tudo isso por causa de um novo projeto que vou começar a desenvolver com mais dois amigos meu, esse projeto vai usar Ruby, Merb, Git e um monte de outras coisas que eu quero aprender a usar, e para isso, nada melhor que estar com uma distro Linux redondinha rodando.

A partir de agora vou tentar postar coisas relacionadas aos assuntos citados acima, para tentar ajudar mais a comunidade brasileira.

Rubygems na eApps

Posted by JoEh on April 28, 2008

Para hospedar este blog eu contratei a eApps, sabia de alguns blogs que estavam hospedados lá e que eram boas recomendações para mim. Esses dias, tentei instalar o merb no servidor usando a instalação normal, gem install merb, mas o processo acaba assim:

[root@joeh ~]# gem install merb
Bulk updating Gem source index for: http://gems.tron.name/gems.rubyforge.org/
Terminated

Achei que poderia ser algum bloqueio por parte deles para a instalação de gems, por isso, como consta ali em cima, a url é um mirror, coloquei na tentativa de tentar burlar esse bloqueio, mas não funcionou.

Até que fui atrás para descobrir o problema, e acabei chegando na resposta, como não é necessário para mim ainda ter um servidor mega potente para rodar o blog, contratei o plano mais básico da eApps, mas parece que os 160MB de RAM não são suficientes para o Rubygems :(

É, meu primeiro projeto usando Ruby + Merb já começou dando trabalho :D

A annotation @covers do PHPUnit

Posted by JoEh on April 18, 2008

O Code Coverage do PHPUnit tem um annotation chamada @covers que ajuda bastante na hora de analisarmos se os nossos testes estão cobrindo bem o nosso código.

/**
 * @covers BankAccount::getBalance
 */
public function testBalanceIsInitiallyZero() {
    $this->assertEquals(0, $this->ba->getBalance());
}

Com ela podemos especificar quais métodos aquele teste cobre, gerando um resultado mais fiél do que está sendo testado. Por exemplo, dentro do método getBalance pode ter uma cacetada de método sendo chamado, e sem a annotation, o PHPUnit vai considerar que aquele teste está testando todos esses métodos, e vai colocar isso no relatório.

Eu possuia testes informando 100% de cobertura, quando passei a usar essa annotation os números mudaram, e pude perceber que vários trechos de código realmente não estavam sendo testados.