17 Mar
Lembro que em pelo menos um post anterior eu comentei sobre o Infinitest.
O Infinitest é uma ferramenta que roda seus testes unitários a cada vez que você salva algum arquivo. Mas ele não roda todos. Roda apenas os que são afetados pela modificação que você fez.
Isso é muito legal porque reduz muito o tempo de feedback. Imaginem, a cada vez que você salva o arquivo, teria que rodar todos os testes unitários (em geral é meio difícil saber se uma modificação afetou um teste ou não), o que pode demorar vários segundos em um projeto saudável. O infinitest te dá feedback quase instantâneo.
Outra coisa muito legal é que ele coloca um marcador de erro (sabe a marcação de erro de compilação do eclipse? pois é.) no teste que falhou ou onde foi lançada a exceção que impediu a execução do teste. Nem preciso dizer o quanto isso facilita para encontrar o problema.
A primeira versão (3.X) que usei dele, foi durante o desenvolvimento do Mirror. Na época era meio complicado colocar ele para rodar e tinha uns bugs meio estranhos (testes em loop infinito ficavam rodando eternamente). A versão atual (4.X) possui plugins para Eclipse e IntelliJ.
Vale muito a pena, em especial se você quer aprender TDD.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
6 Mar
O post de hoje tem, novamente, a colaboração do nosso leitor Cacio Gazola. Mas desta vez foi ele que escreveu a base. Segue o texto adaptado:
Eu estava precisando fazer uma tabela assimétrica (onde uma célula da tabela ocupa várias colunas na mesma linha, sem afetar as outras linhas) e pesquisando nos blogs e fóruns a fora, nada encontrei. Apenas o conteúdo basico sobre tabela.
Até que encontrei, no wiki do LaTeX, uma dica interessante: o uso do \multicolumn {}{}{} para fazer o trabalho. Achei interessante pois em todos os tutoriais só mostram a aplicação do \multicolumn para a criação de texto em múltiplas colunas.
Dentro do ambiente \begin{table} e do \begin{array} funciona perfeitamente, e deve ter os seguintes argumentos: \multicolumn{número de colunas}{disposição do texto}{texto da célula}. As disposições possíveis são as mesmas disponíveis para tabela e array (l, c, r). Também suporta o caractere | para criar a borda interna da grade da tabela (por exemplo: {c|}). Com isso é possivel mudar a disposição do texto dentro desta célula, independente do indicado em \begin{table} por exemplo.
Segue um exemplo:
\begin{displaymath}
\begin{array}{rrrrrrr}
(1\times 2^3) & + & (1\times 2^2) & + & (0\times 2^1) & + & (0\times 2^0) \\
\Downarrow & &\Downarrow & &\Downarrow & & \Downarrow \\
8_d & + & 4_d & + & 0_d & + & 0_d \\
\hline
\multicolumn{7}{c}{\textcolor{red}{12_d}}
\end{array}
\end{displaymath}
Observe que todas as células devem ficar alinhadas a direita, menos a última que vai ocupar toda a linha e será centralizada.
Pois bem, aí me bateu um dúvida: se existe um multicolumn será que existe um multirow? E não é que existe!?
Ainda não cheguei a usar, mas encontrei uma página com as dicas de como fazê-lo:
http://andrewjpage.com/index.php?/archives/43-Multirow-and-multicolumn-spanning-with-latex-tables.htmlAssim como o multicolumn, é necessário adicionar o pacote multirow no preâmbulo. Os dois juntos dão liberdade para criar tabelas totalmente assimétricas.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
3 Mar
Semanas atrás eu apanhei bastante do Hibernate Search. Na verdade, não foi dele que eu apanhei, mas de não entender algo fundamental sobre ele.
Pra quem não sabe, o hibernate search é uma ferramenta muito legal para busca textual construída em cima do Lucene e do Hibernate. É realmente muito simples de configurar e usar. Mas tem um ponto que eu sabia mas não entendia as implicações.
O cenário era o seguinte. Eu tinha uma aplicação que usava lucene para fazer busca textual. Tudo era feito na mão e tinhámos uma boa suite de testes cobrindo a busca textual. Como a utilização do lucene foi em um momento experimental (fazer e depois melhorar), resolvemos migrar para hibernate search. Tirando o tempo que demorei para notar que a versão atual do hibernate search exige Lucene 2 e não o 3 que usávamos, dois testes insistiam em não passar por nada no mundo.
Todo o resto funcionava (o que praticamente garantia que a configuração estava certa). Depois de muito quebrar a cabeça, me lembrei de como o hibernate search funciona.
O hibernate possui uma estrutura de interceptadores para muita coisa interna dele, inclusive operações básicas com o banco, como inserir, atualizar, remover, etc.
O hibernate search entra exatamente nesse ponto. Cadastrando interceptadores para todas essas funções, ele é capaz de pegar os dados e serializar no índice do lucene também (notem que existe replicação de informação, uma vez que você terá os dados no banco e no índice do lucene). E esse é exatamente o ponto.
O teste que não passava era um teste que simulava o comportamento do usuário, usando WebDriver. Na funcionalidade em questão, não eram enviados todos os dados do objeto, apenas a chave primária dele. Com isso, o hibernate search indexava apenas a chave, pois todo o resto do objeto estava vazio. Quando me lembrei disso, foi necessário apenas fazer uma busca antes de mandar gravar o objeto.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
26 Oct

Apenas muito recentemente consegui fazer o Firefox 3.5 do Ubuntu, também conhecido como Shiretoko, funcionar com o plug-in Google Gears. Foram, basicamente, duas bobagens que impediram a instalação e o uso desse plug-in com facilidade.
O primeiro problema é culpa do Ubuntu. O Firefox 3.5 vem rebatizado de Shiretoko no Ubuntu. Isso significa que o navegador não é reconhecido como Firefox pelos servidores. Assim, a página de instalação do Google Gears diz que seu navegador não é suportado. Para contornar isso, é necessário mudar o nome que seu navegador usa para se identificar para o servidor. Você pode mudar isso facilmente: abra seu navegador Shiretoko, acesse a URL “about:config”, confirme que você sabe o que está fazendo (!), filtre a lista por “useragent” e troque “Shiretoko” por “Firefox” no valor da chave “general.useragent.extra.firefox”. Para confirmar que isso deu certo, entre novamente na página do Google Gears. Se o botão de instalação apareceu, ok.
O segundo problema aconteceu porque eu já utilizava o Google Gears no Firefox 3.0. Por algum motivo (não sei se isso acontece sempre), o Google Gears do Firefox 3.0 e o do Firefox 3.5 estavam utilizando a mesma pasta para guardar dados e configurações. Então o Gears do Firefox 3.5 encontrava as configurações do Gears do Firefox 3.0 e isso gerava diversos erros de navegação; redirecionamento sem fim no login do GMail, por exemplo. Infelizmente, a minha solução para esse problema foi apagar a pasta em que ficavam essas configurações: ~/.mozilla
Depois de tudo isso e de baixar todos os meus e-mails do GMail novamente, finalmente funcionou! Se você tiver uma outra solução para o problema, compartilhe!
Montagem tosca por mim mesmo, utilizando os ícones do Firefox 3.0, do Shiretoko e do Google Gears
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.