Hello iTunes world
Após seguir toda a burocracia obrigatória pela Apple, finalmente consegui publicar minha primeira aplicação na Apple Store: My Simple Weight Memory. Um aplicativo bem simples, para manter registro de seu peso ao longo do tempo. Serviu-me como experiência para aprender o processo, mas tem qualidade o suficiente para que a Apple não rejeitasse pela simplicidade.
Exemplo básico de LOBs no Oracle
Após pesquisar um pouco na Internet, descobri que a pior parte de usar LOBs no banco Oracle é a falta de um exemplo simples. Carregar e gravar imagens na pasta física do banco é fácil de encontrar. Usar arquivos do cliente (ex: Forms), nem tanto.
Eis um snippet para gravar qualquer tipo de conteúdo em um blob (assumindo uma tabela "tb_teste" com os campos "id integer" e "img blob", com um registro "(1, empty_blob())"):
DECLARE x BLOB; buf raw(10); amount INTEGER := 5; BEGIN SELECT img INTO x FROM tb_teste WHERE id = 1 FOR UPDATE; buf := '1234567890'; dbms_lob.WRITE(x, 5, 1, buf); commit; buf := '0000000000'; SELECT img INTO x FROM tb_teste WHERE id = 1; dbms_lob.READ(x, amount, 1, buf); dbms_output.put_line(buf); END; /
Com a vantagem que é um bloco fácil de adaptar para Java, Forms, etc.
Apanhando on Rails
Sou um completo noob em Ruby e Ruby on Rails. Sempre imaginei que deveria ter seu mérito, uma vez que a comunidade é grande e ativa. Como meu novo servidor diz suportar ruby gems, decidi dar mais uma chance ao garoto.
Dei uma olhada no screencast do Rails, no qual o palestrante cria um blog do zero, e até gostei da idéia geral. A parte de instalar o Ruby, o Gem, o Rails e amigos assusta, mas meu amigão do peito, o NetBeans, gerencia isso incrivelmente fácil. Ficou tão sem graça que decidi animar a brincadeira, trocando o JRuby que veio com o NB pelo Ruby baixável do site. Claro que, para complicar ainda mais, instalei a versão ZIP, que requer instalar o Ruby Gem manualmente. Considerando o nível da bucha, até foi tranquilo fazer tudo isso.
Após baixar o screencast para ver "quadro-a-quadro", fui repetindo as etapas no NB (que, por sua vez, tem atalho para tudo) e, em questão de alguns minutos, lá estava o tal blog que a propaganda vendeu.
Dessa vez, tudo começou a fazer sentido nessa "jóia vermelha" - e até estou gostando! A curva de aprendizado é muito cruel, mas parece ser recompensadora.
A parte que não gostei foi a confusa integração com bancos que não são o MySQL ou o SQLlite. Derby precisa usar drivers JDBC e eu odeio camadas de integração para comunicar com frameworks de integração. Postgres só dá erro na instalação do Gem. Oracle ainda não pude testar (mas acho que usa o OCI, que é dor-de-cabeça por definição).
Em resumo, ainda tem muito chão a percorrer!
Prêmio de código inútil da semana
Vai para esta classe:
import java.util.Comparator; public interface Comparador<T> extends Comparator { int compare(T obj1, T obj2); }
Lembrando que a interface "Comparator" já é genérica!
Novas (e antigas) técnicas de programação
Um colega me enviou um link interessante sobre o BDD (Boss Driven Development). Achei muito divertido, principalmente por ser verdade em muitas empresas. Graças a Deus, onde trabalho não é assim, mas já trabalhei em lugares onde a idéia é agradar o chefe, e a empresa como um todo fica em último plano. Realmente horrível.
Usando o HT do HTML, encontrei o blog Fragmental que, entre outras coisas, falou o que penso das consultorias. Bom saber que não é opinião só minha. E, mais um link depois, achei a pérola que eu queria: um artigo que fala que nem só de VOs e BOs vivem as aplicações JavaEE.
Odeio cebolas. Tanto as leguminosas quanto as feitas em Java. As duas são amargas, cheias de camadas e fazem você chorar quando começa a mexer com elas. Para mim, não tem nada mais grotesco do que uma aplicação cebola, com mais camadas que classes.
A receita para uma aplicação cebola é simples: basta colocar um design pattern em cada recurso novo de seu sistema. "Tenho que fazer 2+2 aqui" - transforme em uma factory de operações matemáticas que recebe a operação (um command) e uma lista de operandos, todos na forma do flyweight. Afinal, daqui a uns cinco anos, alguém pode querer fazer uma subtração ou somar "1+1".
Claro que esse exemplo é extremista, mas a realidade não é muito distante. Já vi situações em que o programador previu a possibilidade de enviar um item para vários MDBs diferentes, cada um com seu filtro próprio, para dizer se deve ir ou não para aquele destino. Ótima idéia, mas a aplicação ficou dois anos em produção até surgir a possibilidade do segundo MDB e, quando surgiu, esse pattern foi a primeira coisa ejetada da aplicação, pois o filtro iria para outra aplicação.
Pergunto: adiantou levar todo esse tempo para elaborar esse arcabouço?