quarta-feira, 19 de outubro de 2011

Form em Python

Estou mexendo com Python agora. Achei uma meio bizarra.

Quando você lida com o objeto Form, existe uma propriedade chamada cleaned_data, que retorna dados do Form. Se você tenta usá-la sem usar o is_valid antes, dá erro como se a propriedade não existisse.

Ele não deveria dizer que a propriedade está nula?

Outra: ela é setada dentro do is_valid? Isso não se encaixa na anti-pattern de método acumulando função que não deveria?

http://stackoverflow.com/questions/4308527/django-model-form-object-has-no-attribute-cleaned-data

Fora essa, até agora estou gostando de Python.

quinta-feira, 13 de outubro de 2011

Remove do List (C# e NHibernate)

Cara, essa é sacanagem... Escrevendo aqui quase como nota mental.

Na edição da minha entidade, eu tenho que atualizar lugares aos quais ela pertencia e não pertence mais, seus pais. Dados redundantes para ajudar na performance (isso dá um trabalho do c...). Pra isso, recupero a entidade do banco de "desprendo" (evict) da sessão do NH, para ter os antigos pais.

Peço para remover a entidade que estou mexendo na entidade pai. Porém, a que tenho na lista (pai) é a editada. A que recuperei do banco não está mais ali. Resultado: não adianta fazer um simples Remove.


Código para explicar melhor:

current = [Edição via usuário]

old = [recuperado do banco]

parent.list.Remove(old); < não funciona, por enquanto a lista tem o current



Até aí, qualquer um que entenda alguma coisinha sobre memória entende que os dois não se tratam do mesmo objeto. MAS EU VOU MORRER SEM ENTENDER PORQUE EM DEBUG FUNCIONAVA!!!

quarta-feira, 28 de setembro de 2011

Propriedade desobediente

Essa foi um colega.

Ele tinha o seguinte código:

Objeto.Filho.Propriedade = Valor;

O problema é que Propriedade, depois da atribuição, continuava nula (e Valor não era nulo).

O que estava acontecendo é que, em Objeto, tinha este código:

Filho {
        get {
                if (ID == null)
                        return null;
                else
                        return new Filho { ID = ID } ;
        }
}

Não entendeu?

Toda vez que eu pego o Filho, mesmo sendo para setar Propriedade, ele passa por dentro do código do get. Logo, a propriedade é setada, mas, logo em seguida, o Filho é setado para outro objeto, que tem Propriedade nula.

Fala a verdade, essa é para ficar horas caçando. E ficar muito puto quando encontrar.

sábado, 24 de setembro de 2011

Security Exception - Nhibernate

Esse erro, extremamente esplicativo, ocorre quando o servidor está configurado para limitar acessos, então sua biblioteca não consegue acessar o recurso necessário.

Dessa vez foi alguém que me passou o link da solução (valeu, Thiagão):

http://nhforge.org/wikis/howtonh/run-in-medium-trust.aspx

Se você usa Fluent com automapping (meu caso), no lugar de colocar o default-lazy="false" num mapping que você não tem, coloque mapping.Not.LazyLoad() no override da sua automapping.

Importante: coloque em todas as classes que estiverem mapeadas.

segunda-feira, 19 de setembro de 2011

Publicando um site às 5h da manhã

Finalmente fiz a primeira publicação de um site meu. Com 25 anos, tava mais que na hora.

Fiquei algum tempo caçando biblioteca (é claro que ele não vai te dizer todas as que estão faltando de uma vez só). Enquanto estamos programando, o VS pega as bibliotecas do limbo.

Até aí, sossegado. O problema foi isso aqui: Failed to find or load the registered .Net Framework Data Provider. Lindo. O servidor tá com problema, só pode ser. Dei várias voltas antes de descobrir que era só mais um erro de biblioteca, mais especificamente a MySql.Data.

Quem se deparar com esse erro, incluir a biblioteca e continua dando pepino, aqui vai uma que achei algum tempo atrás, mas você não deve nem descobrir aqui, porque é fácil de encontrar a dica na internet: dá uma chegadinha no web.config e coloca isso aqui...

  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.1.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

Claro: 1) colocando a versão da sua biblioteca, e 2) isso aí vai dentro do configuration.

Até. Tô indo dormir.

quarta-feira, 14 de setembro de 2011

MySQL e NHibernate - erro de sintaxe

Essa não briguei por tanto tempo assim.

No meu projeto, estou usando NHibernate e MySQL. Configurei para, quando eu alterar minhas classes, ele atualizar o banco de dados. E eis que, "do nada", ele reclamou para atualizar uma tabela com colunas novas.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'In DOUBLE' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Out DOUBLE' at line 1

Procurei na internet pelo pedaço do erro antes do nome da coluna (In e Out). Parei para ver isso umas duas vezes ontem e mais umas três hoje. Nada. Então coloquei o erro inteiro, tirando só o nome da coluna. Bati o olho no título de umas das páginas e vi algo que sempre esqueço de olhar:

"reserved words in table names"

In e Out são palavras reservadas, e o NH não considera isso ao criar as colunas. Ele cria o que você mandar ele criar. Logo, dá erro de sintaxe.

Triste é pensar que, quando eu encontrar um erro assim de novo, provavelmente vou ter esquecido a solução!

Até.

quinta-feira, 8 de setembro de 2011

Global.asax - Controle de Request

Me deparei com uma situação que, para mim, é bizarra: tudo que chamava o server passava pelos métodos do Global.asax (Application_BeginRequest, por exemplo). Coisas como imagens, javascript e folhas de estilos (css). Não sei para que serviria isso, mas, no meu caso, estava servindo para atrapalhar.

Busquei soluções na internet. Várias pessoas dizendo que isso acontece no server temporário que o VS cria, mas não quando roda em IIS, por exemplo. Outras dizendo que também acontecia no IIS, e mais conselhos de como configurá-lo. Mas isso estava me atrapalhando enquanto eu desenvolvia.

Tentei fazer uma função detectando a extensão. Entretanto, a cada momento aparece uma extensão nova: css, js, jpg, gif, png, ico, swf... Insustentável.

Encontrei uma solução para pessoas organizadas. Coloque todos esses arquivos em uma pasta só, o que é um bom costume. Logo, será necessário apenas avaliar se sua chamada está vindo do endereço desta pasta. Meus arquivos ficam numa pasta chamada Assets, na raiz do projeto.


Coloquei esta propriedade no Global.asax:

private Boolean isAsset
{
        get { return HttpContext.Current.Request.Url.AbsolutePath.StartsWith("/Assets/"); }
}


E, em cada método, logo no começo:

        if (isAsset) return;


Pronto. Agora posso continuar sossegada.

Começando

Este blog foi criado para postar soluções que achei ao programar. Não todas as que achar, só aquelas que você procura, procura e procura, até quase socar o teclado, chega até a xingar o google.

Já começou difícil: não me xingue pelo endereço, era o único ainda disponível.

Bom, não sou de falar muito. Espero que o blog seja útil.