Rafael Souza Desenvolvimento Web

shoes-translator atualizado: Ruby, Shoes e Google Translate API

Há tempos atrás desenvolvi uma pequena aplicação usando Shoes, e ontem resolvi atualizá-la, mudei um pouco a aparência e melhorei o suporte a pronúncia.

shoes-translator screenshot

Caso tenha interesse em usar, você pode baixar o projeto do github: http://github.com/rafaelss/shoes-translator

Falando um pouco agora sobre o Shoes, me parece que após o sumiço do _why a coisas não vão tão bem, o projeto amadureceu muito pouco, muita coisa básica ainda é complicado de se fazer, impedindo um pouco que aplicações mais profissionais sejam feitas rodando sobre o framework.

Quando desenvolvi o shoes-translator na primeira vez, eu levava mais fé no projeto, acreditava que seria um concorrente de peso para os toolkits atuais, mas agora, voltando a mexer na código e buscando referências na internet para fazer as alterações, percebi que o Shoes ainda precisa de muito, mas muito trabalho para poder ter crédito suficiente e ser usado para fazer software de verdade.

UPDATE: O @kbmurata postou no twitter que o objetivo do Shoes é ser usado para o aprendizado de forma divertida, de qualquer forma, se você quiser começar um projeto usando Shoes, pense bem que tipo de projeto você está desenvolvendo, não pense em nada muito maior que um “tradutor de sapatos” :)


O Passenger e um /tmp pequeno

De ontem pra hoje perdi um bom tempo tentando compilar um passenger mais novo em um servidor que tem um /tmp de apenas 1MB (eu ainda preciso descobrir porque isso).

A solução é simples até, basta setar a var TMPDIR com o path de um outro diretório qualquer, mais ou menos assim:


sudo TMPDIR=/home/rafaelss/tmp passenger-install-apache2-module

Detalhe: eu estava acostumado a setar variáveis ao executar um comando colocando ela na frente do comando, mas com o sudo isso não funciona. No help do sudo diz que deve ficar ali no meio


usage: sudo [-bEHPS] [-p prompt] [-u username|#uid] [VAR=value] {-i | -s | }


Hora Extra em Porto Alegre

O Tailor lançou a idéia no twitter e eu apoiei, então, semana que vem, #horaextra na Cidade Baixa, em Porto Alegre, mais exatamente no Copão

A idéia é juntar um monte (ou não) de nerds pra falar de trabalho, tecnologia, frameworks, programação, enfim, tudo o que a gente mais gosta :)

Então, segunda-feira, 19:30, Copão. Aparece lá!


ASP.NET MVC e suas ActionResult

O framework MVC da Microsoft usa um determinado objeto para definir qual tipo de resultado/output a action executada deve retornar. São eles:

  • ContentResult – Pode ser usado para retornar textos simples.
  • EmptyResult – Esse serve para retornar resultados em branco, quando quiser que o output seja vazio.
  • HttpUnauthorizedResult – Usado quando o usuário não tem permissão para executar a action. Retorna o 401 como status da requisição.
  • JsonResult – Serializa um objeto em formato JSON, bom para ser usando em requisições AJAX.
  • RedirectResult – Resultado usado para redirecionamentos.
  • RedirectToRouteResult – Também usado para redirecionamentos, mas a URL está ligada a uma rota.
  • ViewResultBase – Classe abstrata, usada para renderizar HTMLs.
    • PartialViewResult – Estende ViewResultBase para renderizar as views e seus HTMLs.
  • BinaryResult – Classe abstrata usada para resultados binários.
    • BinaryStreamResult – Estende BinaryResult, pode ser usado para escrever imagens direto no stream do resutado.

Porém, em alguns casos, retornar um texto simples, ou um JSON pequeninho, é meio chato. Considere o código abaixo:

    JsonResult json = new JsonResult();
    json.ContentType = "text/javascript";
    json.Data = new { success = true };
    return json;

Isso poderia ser mais simples não? Porém, a classe JsonResult, e nenhuma outra ActionResult aceita parâmetros no construtor. Por isso criei duas classes que podem ser usadas como ActionResult, para simplificar essa tarefa. Elas devem ser usadas assim:

    return new SimpleResult("Hello World");
    return new SimpleResult(1);
    return new SimpleResult(1257.14);
    return new SimpleResult(true);

e

    return new SimpleJsonResult(new { success = true });

Pronto, agora é hora de refatorar código. :)

UPDATE: Conforme o Guilherme comentou ali embaixo, o ASP.NET MVC tem um método que já simplifica as coisas.

    return Json("Hello World");
    return Json(1);
    return Json(1257.14);
    return Json(true);

e

    return Json(new { success = true });


jQuery, Safari e CSS Selectors

Hoje estava verificando um bug em um projeto, que acontecia somente no Safari, tanto no MacOS, quanto no Windows, e descobri que o problema era a forma como eu estava definindo o elemento HTML envolvido na história.

O expressão que eu estava usando era a seguinte:

$("#meuform input[type='hidden'][value='']").length

No Safari sempre me retornava 0, já no Firefox e Internet Explorer, retorna 1, que era para ser o valor certo no caso. Analisando como o input estava definido eu descobri o problema, ele estava definido assim:

<input type="hidden" name="first_user" />


Resumindo:

O Safari não acha elementos onde o atributo filtrado não esteja presente no HTML.
(Estou usando a versão 1.3.2 do jQuery e 4.0 (503.17) do Safari, no Windows, mas reportaram o problema no Mac também)


C# e códigos deprecated

Você desenvolve uma biblioteca de utilitários para facilitar a vida dos outros desenvolvedores da empresa, porém algumas vezes é necessário refatorar códigos, criando/renomeando/apagando alguns métodos.
Obviamente você não pode sair mudando tudo, existe código “antigo” usando a sua “lib”.

Existe um atributo no C# que permite que você marque código como deprecated, é o Obsolete, muito útil e fácil de usar.

[Obsolete("Use o método MinhaClasse.MeuMetodo(int parametro)")]
public static void MeuMetodo(string parametro) {
    // ...
}

No exemplo acima quero que os desenvolvedores usem a versão que recebe um integer como parâmetro, e não mais a versão com string.

Você ainda pode dizer que é para o compilador gerar um erro ao compilar o código, passando true como segundo parâmetro do atributo.

[Obsolete("Este método não deve mais ser usado. Usar MinhaClasse.MeuMetodo(int parametro)", true)]
public static void MeuMetodo(string parametro) {
    // ...
}


Permissão para o Apache na pasta home

Muitas vezes quando configuramos um servidor para hospedar sites para diferentes usuários, a primeira coisa que pensamos é em colocar os sites de cada usuário na pasta home do mesmo, mas para isso funcionar corretamente precisamos dar permissão para o Apache ler a home de cada usuário.
A solução que tenho usado é dar a seguinte permissão na pasta do usuário


chmod a+x /home/nome_do_usuario/

Depois disso todos os “forbidden” desaparecem :)


Instalando o RMagick no Ubuntu

Se você estiver com problemas para instalar o RMagick no Ubuntu usando apt-get talvez essa solução possa ajudar. Primeiro, limpe os pacotes com “problemas”:


sudo apt-get remove --purge librmagick-ruby-doc librmagick-ruby1.8

depois instale os seguintes pacotes:


sudo apt-get install libmagick9-dev ruby1.8-dev

depois disso é só instalar a gem:


sudo gem install rmagick

dica retirada daqui


PHP e SQL Server 2005

Se você tem problemas de conexão com SQL Server 2005 pelo PHP, tente usar essa versão (2000.80.194.0) da ntwdblib.
Coloque esse arquivo na raiz da instalação do seu PHP, substituindo a versão existente, e reinicie o servidor web.


Nome da distro Linux usada

Uma coisa que eu sempre precisava e nunca me lembrava como fazer era descobrir qual a distro que eu estava usando no momento, como muitas vezes precisei mexer com os mais variados servidores, algumas vezes precisava dessa informação, e hoje achei o jeito mais fácil de fazer isso


cat /etc/issue

No meu micro aparece


Arch Linux \r  (\n) (\l)

No do meu colega


Ubuntu 8.10 \n \l

Achei essa dica aqui e estou documentando aqui pra não esquecer mais :)


← Before