RSS .92| RSS 2.0| ATOM 0.3
  • Home
  • Artigos
  • Publicações
  • Apresentações
  • Interviews
  • Livros
  • Contact
  • About
  • Amazon Kindle, brinquedinho interessante. Estamos caminhando pro fim da mídia impressa?

    November 25th, 2007

    Eu gosto bastante de ler e estudar assuntos de software. Entretanto, algumas vezes tenho dificuldade de me concentrar no computador após um longo dia de trabalho, especialmente chegando em casa após as 21:00.Possivelmente uma solução interessante, e provavelmente bem mais agradável do que ler coisas no computador seria usar o Amazon Kindle. Não tenho certeza se este será o caminho do futuro quanto à forma de distribuição de conteúdo, quero dizer, se de fato a mídia impressa irá decair e então as formas de distribuição eletrônica serão plenamente dominantes. Entretanto, considerando a praticidade de uso, facilidade de venda de conteúdo e serviços e também a economia de papel e energia que este brinquedinho oferece, acredito bastante no potencial do mesmo.

    Um sinal de que podemos mesmo estar caminhando rumo à drástica redução da mídia impressa é que o Kindle está esgotado na Amazon, e a Amazon não é exatamente uma lojinha de pequena escala. Nos EUA a venda de conteúdo e serviços digitais está muito à frente do que temos no Brasil, principalmente pela força do combate à pirataria por lá. Acredito que em breve este modelo de negócios crescerá muito, e isto abre uma bela oportunidade para quem souber entrar bem neste mercado.

    Clássicas revistas e jornais como Veja, O Globo, Folha de São Paulo, Exame, etc.. conseguirão entrar e vencer neste novo mercado da mesma forma que estão fortes e presentes no mercado de mídia impressa? Como a qualidade de seu conteúdo é excelente, é bem capaz de conseguirem. Entretanto, como o conteúdo digital é consumido de forma um pouco diferente, muito mais “sob demanda” do que com “pacote padrão para todos os assinantes em cada edição”, é provável que estas revistas e jornais precisem rever e ajustar o seu modelo de negócios.

    Na Veja e na Exame (excelentes revistas das quais sou assinante) é muito comum você encontrar algumas páginas de publicidade intercaladas com aqueles assuntos mais interessantes da edição, como a reportagem de capa e as entrevistas das páginas amarelas por exemplo. Este modelo de publicidade já ficou consagrado, e com certeza todos os leitores que estiverem folheando a revista serão atingidos por essa publicidade e com isso a revista pode cobrar um bom valor pelos anúncios, devido ao alto percentual de leitores que verão a publicidade. Podemos de certa forma dizer que a quantidade de pessoas que estão vendo um determinado anúncio pode ser estimada em função da quantidade típica de leitores de cada edição.

    Agora, como ficará esta questão da publicidade quando o conteúdo for distribuído digitalmente em vez da mídia impressa? Com o conteúdo consumido sob demanda, será que a propaganda do seu anunciante será de fato vista por quem ele gostaria? Será que isto não diminui o valor dos anúncios, com uma garantia de visualização muito menor? Será que a redução do valor dos anúncios será compensada pelos gastos menores de produção edistribuição das publicações? E por outro lado, com a distribuição digital e personalizada, fica muito mais fácil conhece de forma mais precisa os reais interesses de consumo de cada pessoa. Com isso uma publicidade mais direcionada e de mais sucesso pode ser feita. Como estas publicações farão uso disto? Todas estas perguntas certamente estão nas cabeças dos líderes destas publicações, só não sei se a resposta será simples. Todas estas principais publicações já possuem sites e alguma forma de conteúdo digital, mas esta forma de distribuição ainda está engatinhando perto da tradicional forma da mídia impressa.

    Bom, posso dizer que eu gostaria de poder ler blogs, livros, revistas, jornais em um dispositivo como o Amazon Kindle, pois eu muitas vezes fico cansado após longas horas diárias sentado no computador. Certamente seria agradável poder ler estes conteúdos sentado no sofá da sala ou mesmo em uma cidadezinha pequena e agradável onde eu fosse passar o fim de semana e nem tivesse computador.

    A sensação de estar lendo uma publicação para a qual nenhuma árvore foi derrubada e com um consumo de energia infinitamente menor do que o de um computador também é reconfortante. Ah Kindle, você traz possibilidades tão interessantes… vê se chega logo no Brasil! :)


    The Mylyn’s missing feature that would make me advocate it instead of just suggesting it

    November 24th, 2007

    First a little disclaimer: I really like Mylyn and find it one of the most useful and certainly one of the most innovative development tools ever. I am using it for quite some time and started using its version 2.x since the JIRA Connector started working correctly with ISO-8859-1 againHowever, there is something in the use of Mylyn that I would really like to be customizable. I thought that maybe I would get used to the default plugin behavior after some time using it, but unfortunately it didn’t happen for me and for most of my working mates.

    I would like to be able to configure Mylyn’s task context management so that files are added to the task context only when saving them, instead of adding at the time the file is opened.

    For example, very frequently when developing some new feature I open some files that are not related to the current task just to see how something was implemented on some other class or file. I don’t want to have this file I just opened added to the context. I want to be able to add to the context only the files I actually changed during the task activity.

    As I don’t know if this is a common desire among Mylyn’s users in general, the ideal solution would be to have the configuration option of adding files to task context at opening or only when saving the files.

    As i said I can’t speak for Mylyn’s users in general, but at least here at Globo.com (where we have 100-200 Java developers) most of the guys who used Mylyn had the same opinion.

    I have already requested this enhancement at Mylyn’s Bugzilla, and I would really appreciate having a nice feedback on that, telling if this could be done in the future, if it’s too complicated, if it’s just a misuse of the tool, et cetera.

    I have previously talked directly to Mik and Eugene regarding the JIRA Connector and their response exceeded the best expectations I could have. So, in this humble space of mine, I would like to receive some feedback on this new feature I am requesting. I can assure that it would take my Mylyn satisfaction to an even higher level and it would turn a reasonable bunch of users into very happy advocates of this great tool, starting with me ;)


    Instalação e configuração do DbVisualizer no Linux

    November 23rd, 2007

    Com a crescente adoção do uso de Linux, algumas pessoas têm me perguntado qual software de acesso a banco de dados eu uso no Linux. Eu utilizo um software que já conheço desde os meus tempos de desenvolvimento para PDAs, quando o DbVisualizer era a única forma conhecida de se acessar as bases de dados dos dispositivos móveis.O software pode ser baixado a partir daqui, após preenchimento de um pequeno cadastro. Para que usa distribuições baseadas em pacotes rpm, a opção do download do rpm é mais conveniente, e a instalação pode ser feita com o comando rpm –install nome_arquivo_dbvis.rpm. Para Linux em geral, pode ser utilizado o instalador em formato .sh

    Baixando o instalador .sh, basta copiar o arquivo para um diretório qualquer de sua preferência e executá-lo como ./dbvis_linux_6_0_2.sh para iniciar o processo de instalação.

    Caso o instalador não se inicie normalmente, verifique se o arquivo .sh está com permissão de execução (caso não esteja, faça chmod a+x dbvis_linux_6_0_2.sh) e se você possui o Java no PATH do seu usuário. Para verificar se você possui o Java e a versão do mesmo, use o comando: java -version. O recomendado é ter uma versão de Java da Sun e que seja a partir do 1.5. Muitas distribuições Linux instalam uma versão do Java da GNU, mas não gosto e não recomendo esta versão. Coloque o diretório do Java da Sun no começo do PATH do usuário (se alguém não souber como, eu explico posteriormente).

    O processo de instalação em si é bastante simples. Você precisa apenas aceitar os termos de uso do software e escolher o diretório de instalação. No resto, aceite as opções padrão apresentadas e Next -> Next -> Next :) O processo de instalação cria um atalho no Desktop.

    Com a aplicação instalada, vou mostrar agora como configurar a aplicação para conseguir acessar o Oracle. O driver jdbc do Oracle não vem incluído na instalação do DbVisualizer. Para conectar ao Oracle é necessário carregar o driver. Para isto, entre na opção Tools -> Driver Manager, conforme abaixo:

    Carregar driver jdbc

    Nesta tela que abrir, selecione no menu esquerdo a opção Oracle Thin e então na janela que se abrirá, você terá que selecionar o jar do driver jdbc do Oracle (ojdbc14.jar ou classes12.jar), conforme abaixo:

    Escolher jar do driver jdbc

    Se o jar foi corretamente carregado, a opção do Oracle Thin aparecerá verde. Tendo feito isso é hora de criar a conexão. Vá para a tela principal da aplicação, e no menu esquerdo, clique com o botão direito na opção Connections e então escolha Create Database Connection. Escolha por não usar o wizard, e você chegará na tela a seguir:

    Nova conexão

    Preencha os campos da seguinte forma:

    • Alias: nome que você quer dar à conexão
    • Database Type: Oracle
    • Driver (JDBC): Oracle Thin
    • Database URL: url jdbc de acesso, conforme será explicado abaixo.
    • Userid: usuário de banco
    • Password: senha do usuário

    A URL jdbc varia de um servidor para o outro. No caso do Oracle, o formato é conforme publicado neste outro post. Como referência para o Oracle, se você tiver acesso a um tnsnames que acesse o servidor que você precisa, no tnsnames o formato da declaração é: nome_alias = string_conexao

    Para criar uma URL jdbc do Oracle a partir de uma conexão declarada no tnsnames, você deve fazer jdbc:oracle:thin:@string_conexao

    Pronto, após preencher este formulário de configuração, você está pronto para conectar-se ao Oracle! Caso alguma coisa não tenha ficado clara, por favor me indiquem para eu explicar melhor


    Configuração de pool de conexões Oracle 10g em Java para balanceamento de carga e alta disponibilidade

    November 23rd, 2007

    Hoje respondi a uma dúvida sobre isto na lista de Java da Concrete e como acredito que pode ser útil para outras pessoas, estou compartilhando aqui. Pode ser que isto se aplique ao Oracle 9 também, mas não tenho certeza, então prefiro me restringir ao Oracle 10g.Há cerca de 1 ano passamos a usar Oracle 10g no trabalho, e desde então nossa string conexão com o banco de dados deixou de ter um host único para ter uma URL com Oracle Real Application Cluster (RAC). No nosso caso, a URL possui 3 nós.

    A url jdbc de um pool de conexões Java para acesso ao Oracle com RAC é da seguinte forma:

    jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = host_no1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = host_no2 )(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = host_no3)(PORT = 1521))(FAILOVER=on)(LOAD_BALANCE=on))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=SRV_CAD_ISP)))

    Utilizando os parâmetros FAILOVER=on e LOAD_BALANCE=on, estamos especificando para o driver jdbc que este pool irá ter alta disponibilidade e balanceamento de carga entre os nós, respectivamente. Este tipo de solução é próprio do driver jdbc do banco de dados em questão, então não dá pra usar uma URL assim com outro servidor de banco de dados.

    Uma referência bem mais detalhada sobre o assunto pode ser vista aqui.

    OBS: tentei bastante, mas não consegui colocar a URL jdbc sem aparecer cortada aqui no POST. Quem precisar dela precisamente, por favor pegar no “view source” da página.


    A fascinação por sequences de BD x UUIDs

    November 22nd, 2007

    Uns tempos atrás eu pude constatar um fenômeno curioso. Existem pessoas fascinadas, apaixonadas por sequences de bancos de dados!! Ok,vou contextualizar.Sequences de bancos de dados são muitos boas para fazer o que elas foram inventadas para fazer: gerar seqüências numéricas inteiras. Claro, estes valores numéricos seqüenciais não se repetirão, então eles também PODEM ser utilizados como identificadores únicos de tabelas de bancos de dados (chaves primárias).

    A questão é: chaves primárias oficialmente são identificadores únicos de registros no banco de dados. Não há nada especificado quanto a eles serem numéricos e muito menos seqüenciais.

    Algumas pessoas argumentam que o fato de os identificadores serem seqüenciais ajuda a saber a ordem de criação dos registros no servidor. Isso é verdade, mas eu considero isto uma meta-informação sobre o registro em questão. Esta meta-informação não precisa estar gravada na chave primária. Se esta meta-informação sobre a ordem de criação no banco de dados é relevante para quem precisar analisar os dados, porque não criar uma coluna registrando a data de criação, outra com data da última modificação, etc? Impossível ser mais preciso quanto ao momento de criação e de alteração do que gravar o instante em que as coisas foram feitas com precisão de milisegundos.

    Esta contextualização toda foi para chegar no ponto em que eu queria. Você conhece UUIDs? Desde que eu conheci UUIDs, não soube de nada mais indicado para ser utilizado como identificadores únicos de entidades, e em decorrência, como chaves primárias. Os UUIDs são valores numéricos de 128 bits, que possuem uma representação textual, da forma 9c7b8ee2-6f22-4dad-bdec-1266bb533ac6.

    Já ouvi algumas vezes a frase de que o IPv6 possui quantidade suficiente de IPs para endereçar cada grão de areia do mundo. Pois é, o IPv6 e o UUID possuem 128 bits, então se você tem identificadores suficientes para cada grão de areia do mundo, acho que dá pra usar UUIDs com aquela sua tabelinha, não dá não? ;)
    Bom, agora preciso explicar porque eu acho melhor usar UUIDs como chaves primárias do que sequences de BD. Pra começo de conversa, o acesso ao sequence para obter um ID é muuuuuito mais lento que a geração de um UUID. Eu não tinha a exata noção do peso de acessar uma sequence, mas o Silvano descobriu junto com o pessoal de BD da Globo que em boa parte dos casos a query na sequence para obter um ID a ser colocado em um INSERT é mais lenta do que o próprio INSERT. Além disso, para gerar um UUID a sua própria aplicação consegue gerar. Nada de comunicação remota com o banco de dados.

    Além de ser muito mais eficiente em termos de performance, existe a questão da migração de dados. Sempre que é necessário migrar bases de dados corporativos, uma das maiores dores de cabeça é gerenciar os conflitos de IDs gerados através de sequences. Além disso, em muitos casos o problema surge bem antes da necessidade de se migrar bancos de dados. Onde existe o conceito de sincronização de dados o uso de UUIDs faz muito mais sentido do que usar sequences. Sequences são muitas vezes impeditivos na verdade. Darei um exemplo.

    No meu projeto do software para advogados, eu quero permitir que cada advogado use a aplicação em suas máquinas individuais. Suponha que o advogado Fulano cadastrou alguns processos, clientes, reuniões, etc em sua máquina. Suponha também que o sócio dele, o advogado Sicrano também fez alguns cadastros de processos, clientes, etc em sua máquina. Suponha agora que os 2 gostariam de compartilhar seus dados. Se as chaves primárias fossem sequences, isso significaria gravar na máquina do Sicrano os processos com IDs 1, 2, 3, 4… que foram cadastrados na máquina do Fulano e gravar na máquina do Fulano os processos com IDs 1, 2, 3, 4… cadastrados na máquina do Sicrano. Opa, não demorou muito pra ter conflito não é?? Agora, se os IDs fossem algo como 9c7b8ee2-6f22-4dad-bdec-1266bb533ac6, a sincronização seria moleza não é mesmo?

    Esta questão da sincronização de dados é necessária para muitas aplicações. O Siebel (CRM comprado pela Oracle) possuía o conceito de usuários remotos e usuários normais. Os usuários normais faria tudo diretamente no servidor de produção. Os usuários remotos fariam o seu trabalho em um laptop se deslocando diariamente em seu trabalho e então sincronizariam suas atividades 1, 2 vezes por dia tipicamente. Impossível fazer isso com sequences. O Siebel usava chaves alfanuméricas geradas com um algoritmo próprio que eu não conheço, mas funcionava também. O UUID resolve facilmente este problema, e está disponível para qualquer um utilizar em boa parte das linguagens de programação.

    Assim, o que quero concluir é: chaves primárias são identificadores únicos e pronto!! Porque as chaves primárias têm que ser números inteiros, seqüênciais e sem saltos entre eles?? A resposta é: elas não precisam!! Para ter meta-informações sobre os registros, defina as meta-informações que você quer e aborde isto explicitamente.

    Bom, mais uma vez, não espero convencer ninguém, só dei a minha humilde opinião. ;)


    Migrando enums do commons-lang para Java 5

    November 21st, 2007

    Um tempo atrás eu e o Rafael tivemos que migrar alguns enums implementados com o commons-lang em JDK 1.3 e JDK 1.4 para os novos enums do Java 5. Como muita gente já precisou ou precisará fazer isso algum dia, julguei interessante compartilhar um exemplo simples de mudança.Não há absolutamente nada de sofisticado nisso, mas para quem estiver sem criatividade ou sem paciência, lá vão os exemplos:

    Com commons-lang:

    public class TipoPublicacao extends ValuedEnum {

    public static final TipoPublicacao PLANO = new TipoPublicacao(”Plano”,1);
    public static final TipoPublicacao PACOTE_PLANOS = new TipoPublicacao(”Pacote com Plano”,2);
    public static final TipoPublicacao PACOTE_ADICIONAIS = new TipoPublicacao(”Pacote so Adicionais”,3);

    public TipoPublicacao(String desc, int tipo) {
    super(desc, tipo);
    }

    public static TipoPublicacao getTipoPublicacao(BigDecimal tipo) {
    if (tipo == null) {
    return null;
    } else {
    return (TipoPublicacao) TipoPublicacao.getEnum(TipoPublicacao.class, tipo.intValue());
    }
    }

    public BigDecimal getTipoPublicacaoBigDecimal() {
    return new BigDecimal(this.getValue());
    }

    }

    Com Java 5:

    public enum TipoPublicacao {

    PLANO (”Plano”, 1),
    PACOTE_PLANOS (”Pacote com Plano”, 2),
    PACOTE_ADICIONAIS (”Pacote so Adicionais”, 3);

    private final String descricao;

    private final int tipo;

    TipoPublicacao(String desc, int tipo) {
    this.descricao = desc;
    this.tipo = tipo;
    }

    public String getDescricao() {
    return descricao;
    }

    public int getTipo() {
    return tipo;
    }
    public static int getTipoPublicacao(String nameEnum) {
    return TipoPublicacao.valueOf(nameEnum).getTipo();
    }
    }


    REST vs SOAP

    November 21st, 2007

    O Dan Diephouse, fundador do XFire e atualmente trabalhando no ESB do Mule postou em seu blog uma opinião que vem bastante de encontro ao que eu penso, e que é contrária à febre atual de REST, que possui defensores que o julgam uma melhor opção por ser mais simples que SOAP.Eu ainda vou postar futuramente a minha opinião com bastante detalhes sobre o assunto, mas um ponto que eu acho muito importante é: WS-* is complex. REST is complex. It’s all complex. Complexity is not the issue. The real issues are things like utility, consistency, accessibility, etc.

    Na minha humilde opinião, raríssimas são as pessoas no Brasil que já tiveram contato prolongado com SOAP e REST e que de fato vivenciaram na pele as conseqüências de escolhas de tecnologias com SOA após um uso contínuo. Portanto, acho um tanto precipitado sair emitindo opiniões conclusivas sobre qual opção é melhor simplesmente por ver que SOAP é mais “verbose” do que REST.

    Sim, SOAP é um protocolo dentro de outro (99,9% das vezes dentro de HTTP) e REST é apenas HTTP. Isto já mostra por si só que SOAP tem um overhead de protocolo maior. Mas este fator é apenas um bem pequeno ítem nas considerações totais entre as 2 formas de implementar web services.

    Assim, ouso dizer: quem justifica a escolha de REST em vez de SOAP por dizer que REST é mais leve e simples não sabe do que está falando. Todos os caras que já trabalharam de verdade com as 2 opções e viram o domínio do problema amadurecer têm opiniões muito mais pragmáticas e argumentos muito mais profundos do que estes, e chegaram nestas opiniões após ANOS de experiência intensa com o problema.

    A propósito, já implementei aplicações tanto com SOAP, como com REST, e quanto mais eu estudo e aprendo sobre o assunto, mais difícil fica dar uma opinião conclusiva sobre o assunto. Ainda estamos engatinhando em SOA, principalmente no Brasil. Se quiserem conferir parte do que venho lendo sobre isto, venham aqui.


    Bruno Pereira is Digg proof thanks to caching by WP Super Cache!