ASP.NET MVC e suas ActionResult

June 30th, 2009

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. :)

jQuery, Safari e CSS Selectors

June 29th, 2009

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

June 23rd, 2009

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

May 3rd, 2009

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

May 3rd, 2009

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

March 31st, 2009

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

March 2nd, 2009

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 :)

Usando uma única instância do Vim

January 29th, 2009
Hoje quando li o feed de comentários do blog do TaQ (re)apareceu uma dica que ele deu há um bom tempo, sobre usar uma única instância do Vim para editar arquivos, acho muito chato ter que abrir muitos editores.

Porém a dica que ele deu não funcionou para mim, apenas esta dos comentários, que ao invés de usar um alias, usa uma função.

# http://www.cyberciti.biz/faq/linux-unix-pass-argument-to-alias-command/

    function edit() {
        gvim --servername `gvim --serverlist | head -1` --remote-tab "$@";
    }

Eu mudei o nome para edit, acho mais fácil, mas fica a critério de cada um :)

Link do codigo original: http://pastebin.com/f7a69dcd7

bash history meme

January 24th, 2009

Vi no blog do Luiz Rocha hoje um meme que rolou há um bom tempo atrás e resolvi fazer também.


[rafael ~]$ history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
156 git
101 sudo
86 cd
75 yaourt
58 grep
52 gvim
48 exit
39 braid
36 ll
33 rake

Minha única surpresa foi o braid, considerando que conheci ele faz uma semana e que só utilizo ele em um projeto.

Usando Python e Google App Engine

December 29th, 2008

No começo do mês recebi a liberação para usar o Google App Engine, foi o que faltava para eu dar uma brincada com Python.

Onde trabalho, toda a tarde rola de alguém ir no mercado comprar uns refrigerantes, mas todo dia era uma “briga” para ver quem ia. Para resolver isso, criamos página simples em PHP que sorteava quem naquele dia ia fazer as compras.

Depois que a minha conta foi liberada, fiquei um bom tempo pensando o que eu poderia fazer para usá-la, e então o Joel deu a idéia, fazer aquela “págininha” em Python e disponibilizar no Google App Engine.

http://eoescolhidofoi.appspot.com/

É simplesmente fantástica a facilidade de se criar uma aplicação e fazer o deploy dela no Google App Engine, o fato de não ter que se preocupar com banco de dados influencia bastante, basta definir modelos no próprio código, pensar apenas em objetos.

Depois dessa primeira eu já criei mais duas, uma está pronta, mas estou testando ainda, a outra está a caminho, mas será para a empresa que trabalho.