TPC-H para CouchDB

Para a apresentação do meu TCC, precisava de algo concreto para mostrar como utilizar o CouchDB. Apesar de utilizá-lo na empresa onde trabalho (ainda em testes), não podia levar os dados proprietários para a apresentação. Então, tive a idéia de pegar uma base de dados TPC-H, que é utilizado como benchmark em sistemas de apóio a decisão.

Sei que a modelagem de um banco TPC-H é o completo inverso do que prega um banco livre de esquema. Porém, isso serviu para demonstrar como utilizar um documento dentro do Couch, onde denormalizei a estrutura de Customer (nacionalidade e região) e mantive a estrutura do LineItem normalizada. Ajudou muito para demonstrar como estender o conjunto de dados, exemplificar a utilização de revisões e outras coisas da apresentação.

Segue o código Ruby que utilizei para realizar a transformação:

#
#
#
#
# Este script transforma um banco de dados TPC-H em um documento CouchDB, onde
# Order é a principal entidade e leva somente duas entidades filhas: Customer (denormalizado)
# e LineItem (que ainda está normalizado).
#
# Utilizei uma requisição HTTP manual (ao invés de uma API Rest) para ter acesso ao CouchDB
# com o objetivo de estudar os detalhes desta conexão, e poder manipular melhor o seu envio.
#
# Livre para utilizar! :)
#
# Leonardo Eloy
# http://leonardoeloy.com
 
require 'rubygems'
require 'postgres-pr/connection'
require 'json'
require 'net/http'
 
# Garante que datas são levadas de forma correta e número são armazenados
# como números, não como String.
def jsonfy(ary, fields)
  l = {}
  fields.each_with_index { |f,idx|
    if (ary[idx].to_s.to_f > 0.0 and not f.name.to_s.include?("date"))
      l.store(f.name, ary[idx].to_s.to_f)
    else
      l.store(f.name,ary[idx])
    end
 
  }
 
  return l
end
 
conn = PostgresPR::Connection.new('tpch', 'postgres', 'senha', 'tcp://localhost:5432')
 
linha = conn.query("select * from orders")
uri = URI.parse("http://localhost:5984/tpch/")
 
linha.rows.each { |r|
  hash = jsonfy(r, linha.fields)
  hash.store("type", "order")
 
  # fetch customer
  l_cliente = conn.query("select c_phone,c_name,c_address,c_mktsegment,c_comment,c_acctbal,c_custkey,n_name as nation,r_name as region from customer, nation, region where c_nationkey = n_nationkey and r_regionkey = n_regionkey and c_custkey = #{hash['o_custkey']}")
  cliente = jsonfy(l_cliente.rows[0], l_cliente.fields)
  cliente.store("type", "customer")
  hash.store("customer", cliente)
 
  # fetch lineitem
  l_lineitem = conn.query("select * from lineitem where l_orderkey = #{hash['o_orderkey']}")
  lineitem = []
  l_lineitem.rows.each { |rl|
    li = jsonfy(l_lineitem.rows[0], l_lineitem.fields)
    li.store("type", "lineitem")
    lineitem << li
  }
  hash.store("lineitem", lineitem)
 
  Net::HTTP.start(uri.host, uri.port) do |http|
    headers = {'Content-Type' => 'application/json'}
    put_data = "#{hash.to_json}"
    response = http.send_request('POST', uri.request_uri, put_data, headers)
    puts "Response #{response.code} #{response.message}: #{response.body}"
  end
}

Download do Script

O Estado da Arte em Bancos de Dados Orientados a Documentos

No meu trabalho de conclusão de curso falei sobre o Estado da Arte em Bancos de Dados Orientados a Documentos (BDODs). Esta iniciativa incluem os agora famosos bancos NOSQL, como CouchDB, MongoDB, entre outros.

É um trabalho científico, onde analiso da ótica do CouchDB como são construídos os BDODs. Esta monografia é a final para a faculdade, mas irei estender o trabalho com mais um capítulo onde vou detalhar o estado da arte, coletando informações sobre diversas iniciativas deste novo e promissor paradigma!

Download

Novo JUG do Ceará: java.ce

Finalmente uma iniciativa de JUG que segue os anseios da comunidade! :) Fico feliz em participar do java.ce, um grupo de usuários Java onde a diretriz básica é “ter curiosidade”.

Acredito muito que a força de uma comunidade como a do Java no Ceará irá realizar o que sempre desejei e tive em mente: transformação social. As pessoas precisam passar a confiar mais nas outras. “Coisas” como respeito mútuo e ajudar o próximo não precisa ser praticado somente na Igreja ou no Sopão de Domingo para os mais necessitados. A atitude positiva em relação ao mundo começa com um ambiente saudável para opinar, discutir e aprender.

Com menos de dois dias de criação, o  java.ce já tem mais de 100 membros e já foi listado oficialmente como JUG.

Estou muito feliz em poder falar da nossa lista de Java! :)

Maré de Agilidade - Fortaleza

Como informado por Igo Coelho:

Após Brasília e Salvador está chegando a Fortaleza o Maré de agilidade. O evento esta sendo promovido aqui pelo grupo XPCE(eXtreme Programming Ceará) e contará com a presença de grandes nomes locais e nacionais.

O evento será de 6 a 8 de agosto com dois dias de mini-cursos na Fortes Treinamentos e um dia inteiro de palestras no sábado na Faculdade 7 de Setembro.

Estaremos divulgando em breve mais detalhes do evento como promoções, condições de pagamento e palestrantes. Adianto que quem estiver cadastrado na lista de discussão do XPCE até 16 de maio terá um bom desconto para os mini-cursos e palestras. Inscreva-se já na lista e divulgue para seus amigos.

2º Encontro XPCE

Divulgando:

XPCE - Grupo de Extreme Programming do Ceará.

Local: Faculdade Lourenço Filho

Endereço: Rua Barão do Rio Branco, 2101 Centro. Localização com o Google Maps. Esquina das ruas Barão do Rio Branco com Domingos Olímpio.

Data: Dia 30/05/2009 [sábado] das 09:00h as 12:00h no auditório.
Palestra

09:00 - 11:00

Palestra: Integração Contínua
Resumo: Descubra o que projetos ágeis fazem para possibilitar que diversos desenvolvedores trabalhem juntos em um mesmo projeto, integrando suas contribuições de forma harmônica e segura.
Palestrante: Igo Coelho, fanático por desenvolvimento de software, novas tecnologias, internet, eletrônicos e tudo mais que um geek pode gostar. Com mais de 9 anos de experiência em desenvolvimento de Software trabalha atualmente na Fortes Informática como arquiteto de software com XP e Java. Casado, pai de dois filhos e mantem um blog em www.igocoelho.com.br.

Henry Ford e Event-Driven Architecture

Excelente apresentação do Ilya Grigorik (igvita.com) sobre como podemos atingir uma maior escalabilidade horizontal utilizando protocolos baseados no processo de Publish/Subscribe e enfileiramento. A apresentação também é muito bem feita, como manda o figurino. Leia o post para entender o contexto.

NanoZoom: Uma interface de Zoom Contínuo para a Plataforma JME CLDC/MIDP

O NanoZoom é um projeto que visa criar uma nova forma de consultar dados para dispositivos móveis. Ao invés da utilização de uma linguagem de consulta explícita, você utiliza movimentos no controle direcional de um celular (para cima, para baixo, …) para visualizar o seu conjunto de tabelas e expressar a consulta a ser realizada. O banco de dados utilizado é o NanoBase, que já postamos sobre ele por aqui.

Estamos obtendo excelentes resultados com Cristiano Oliveira (mestrando na UECE) e o Prof. José Maria Monteiro, inclusive com a obtenção de publicações internacionais! Irei atualizar o histórico do projeto com slides e os artigos a serem apresentados.

Mais informações aqui.

CouchDB Interativo

Estou terminando minha monografia de conclusão de curso, e nela falo sobre o estado da arte em bancos de dados orientados a documentos. Um representante de peso desta categoria é o CouchDB. Vou começar uma série de posts tratando sobre o assunto e como utilizar as vantagens que o CouchDB oferece.

Enquanto isso, gostaria de falar do Interactive CouchDB. Um loucão fez um simulador de consultas que utiliza o conceito MapReduce, assim como o CouchDB. Isso significa que você irá experimentar a criação de uma view e também a obtenção dos resultados da sua consulta.

Para exemplificar, fiz uma consulta que retorna o agrupamento de extensões de nome de arquivos (vejao site e você irá entender). Na função de mapeamento, utilizei isso:

emit(doc.name.split(”.”)[1], 1);

Já para a redução, fiz o seguinte:

return sum(values);

Dessa forma estou dizendo para o CouchDB que ele deve obter todos os registros que ele tem cadastrado e criar um conjunto intermediário de registros no formato { “extensão” :  1 }. Após isso, a minha função de reduce vai reduzir esse conjunto intermediário para agrupar os dados, fazendo o resultado ficar assim: { “extensão” : 3, …}, onde 3 é a soma de todas as extensões com a mesma chave. Veja na imagem abaixo:

Exemplo de execução com o Interactive Couch

Exemplo de execução com o Interactive Couch

Aguarde no blog uma série de posts sobre o CouchDB e também Bancos de Dados Orientados a Documentos! Estou preparando umas coisas legais…

Como Evitar Muita Tecnologia e Pouco Resultado

Recentemente escrevi um post sobre a necessidade de ter Foco no Negócio, que é um fator essencial para qualquer profissional da área de TI. Gostaria de me aprofundar um pouco mais no assunto, começando com esta tirinha do Cyanide & Happiness:

Muita Tecnologia, Pouco Resultado

Muita Tecnologia, Pouco Resultado

Bem, nosso amigo à esquerda apresenta seu novíssimo canivete suiço! Cheio de frufrus, ele o exibe e ainda solta “não há nenhum problema que este canivete não solucione!”. Daí nosso amigo de verde mostra sua faca, que só tem uma lâmina. Após o certeiro esfaqueamento na região da traqueia, ele ressalta que ainda consegue resolver os seus problemas! Objetivo e eficaz! :D

A problemática

Muita tecnologia nos dá muitos problemas. O que é muita tecnologia? Eu argumentaria que é a quantidade de camadas de software que um framework/aplicação possui. Vejamos um framework pseudo-MVC em 2000:

  1. Sistema Operacional;
  2. Servidor Web;
  3. CGI.

Imagine quantos milhões de linhas de código estão embutidos aí nesta listagem. “Tudo bem, isso não importa, idiota!”. Eu sei que não importa, é só pra ilustrar! :) O que quero mostrar é que essa arquitetura aí produz o mesmo resultado que esta aqui:

  1. Sistema Operacional;
  2. Máquina Virtual
    1. Servidor de Aplicação;
      1. EJBs
      2. Container Web;
        1. MVC;
        2. IoC;
        3. Aspectos;
        4. Bibliotecas.

O que aconteceu com o passar do tempo? O poder de processamento aumentou, por isso aplicações com uma maior quantidade de camadas de softwares podem ser executadas mais rapidamente. A abstração de programação imperativa migrou massivamente para orientada a objetos, um ponto a mais para o poder de processamento, por permitir esse crescimento. Porém, ainda temos problemas com os resultados. Não são todos os clientes que podem pagar por uma infra Java EE + EJB 3.0 + JSF (ou qualquer sopa de letras que esteja em vigor), daí vem um cara e faz tudo em PHP e põe num hosting de U$ 4.95/mês. E funciona! É a faca na traqueia!

A “solucionática”

  1. Conheça o problema. Não há o que comentar aqui. Qual o tamanho da parada? Esse é o problema;
  2. Conheça as soluções. Não se limite ao mundo Java/.NET/PHP/Delphi/(INSIRA PLATAFORMA AQUI). Você é um profissional de TI e tem obrigação de saber sobre as tecnologias vigentes, mesmo que não as use. Caso não o faça, sinto dizer: você não é mais um profissional da área de TI, é só um cuidador de sistemas;
  3. Manutenção. É sempre um problema manter sistemas. Se você não mantém um agora, irá manter um no futuro. Pense sempre na frente, pense no trade-off: você desenvolve menos agora para manter mais depois e o inverso. O esforço é o mesmo, não se iluda.
  4. Pense em custos. Outro problema que gostaria de abordar de forma mais detalhada num próximo post é que nós não pensamos em custos. No máximo, se envolvidos num esquema minimamente eficaz de gerência de projetos, pensamos em horas. Ora, é simples pensar no custo do que você faz. Você pode dividir pela quantidade de horas trabalhadas (lembrando que domingo é um descanso pago pela legislação, se você for CLT) ou somente dividir por 30: R$ 1.000/30 = R$ 33.33/dia. Se eu levo 4 horas para fazer um CRUD, eu gasto R$ 16.65 (eu sei que as contas são burras, mas é só pra dar uma noção, certo? :D). Se você fosse pagar alguém, daria 16 mirreis só pra fazer um CRUD? Seu framework é produtivo o suficiente para cobrir estes custos de forma mais eficaz? E a manutenção?
  5. Busque Opiniões. Nós da área de TI somos (em geral) muito idiotas. Não pedimos opiniões, somos orgulhosos! Nem sequer gostamos de trabalhar com outras pessoas! Meu amigo, pare com isso! Até médico que se considera Deus na terra (e Desembargador que tem certeza que é!) pede segunda opinião! Porquê você não iria? Orgulho demais mata. Mata o bolso do dono da empresa com dinheiro jogado fora.

Se uma tecnologia X possibilita a finalização de um requisito em 15 minutos e você só sabe a Y que faz em 45 minutos. Faça em Y, mas aprenda a outra tecnologia. Da próxima vez, você poderá sugerir coisas melhores. E lembre-se que um bom profissional é aquele que fale o que deve ser falado. :P

3 Dicas de Motivação na TI

Desapontamento

Por Ames28

Sabe quando entramos num novo emprego? A “adrenalina” está a mil! Você quer contribuir, sugerir, casar soluções já feitas com novas idéias. Seu conhecimento técnico é realmente aplicado ao negócio no qual você está inserido. Por vezes, fazemos horas extras, trabalhamos final de semana, com o objetivo de mostrar serviço ou simplesmente provar a nós mesmos que aquela dificuldade inicial pode ser superada.

O que acontece quando esta motivação se esvai? Você chega atrasado, você não cumpre com o objetivos estabelecidos (data de entrega, qualidade, entre outros critérios) e por aí vai… Começa a síndrome do Catho ou APInfo. Passei por essa fase inúmeras vezes, sei como é a sensação de fazer aquele trabalho que você considera “medíocre” ou “ridículo”, enfim, qualquer adjetivo que descreva que você pode fazer muito mais por aquele requisito ou solução pontual.

Mas peraê! Será que o trabalho é realmente “medíocre”? Aliás, desculpe-me a presunção, mas quem é você para decidir o nível de tecnologia empregada em uma tarefa, se esta é importante para os objetivos da empresa? Temos que nos dar conta que se alguém nos paga uma mensalidade para comprar nossas horas de conhecimento, devemos cumprir aquilo que nos foi determinado. Claro que há exceções, como tudo no mundo, primeiro o bom senso, depois o dever. Existem casos que você deve bater o pé no chão, ser firme e mostrar que aquela solução não é adequada ao problema, não por quê você deseja  programar em Merb ou CGILua, mas pelo simples fato da solução que você encontrou ajudar a cumprir com os objetivos com menor custo ou maior qualidade.

Muitas vezes o problema pode estar na empresa, na administração ou na sua função. Porém, você aceitou aquele emprego, se sabia ou não das suas dificuldades, o problema agora é seu. Você é o agente da mudança, o responsável principal por tornar aquele empecilho em solução. Caso não consiga, após algumas tentativas, aí sim, procure outro emprego. Afinal, você realmente não merece ficar em um local onde suas expectativas não sejam atendidas.

A virada

Eu procuro aplicar umas idéias bem simples para tentar me motivar quando a coisa está ruim. Segundo as palavras de um preto-velho, quando estamos no mar e há tempestade, o melhor canto a ficar é no barco. Se o tempo estiver claro e límpido, então vamos remar para o próximo barco. Tempestades sempre irão existir, o detalhe é como vamos nos portar até ela passar. :)

  1. Bom senso. Eu tenho uma teoria que nada no mundo pode ser aplicado sem bom senso. Existem horas que você é pressionado para entregar um requisito difícil, você não conseguiu finalizar. “Isso tem que ir pra produção hoje!”, esbraveja seu mui amado Gerente de Projeto. Porém, você vai mandar algo para produção que não esteja finalizado? Você vai arriscar o trabalho de todo o setor de TI/Desenvolvimento por um erro que você sabe que irá ocorrer? Bata o pé. Afinal, se você for demitido, a culpa ainda não será sua. :D
  2. Visão do Todo. O processo de desenvolvimento desenvolver é fácil. Difícil é orquestrar tudo e fazer o sistema funcionar. Então saia da sua jaula e tente se interessar pelo negócio da sua empresa. Não estou dizendo para você ser um Analista de Negócio, estou sugerindo que se você entender o porque daquele combo ter que ser estático ao invés de utilizado o seu componente de LOV feito com Comet que é super-seguro e escalável! Sacou? O problema não é a tecnologia, mas como ela deve ser empregada.
  3. Equipe. Você provavelmente não desenvolve sozinho. Você deve estar inserido numa equipe e ela é composta por pessoas tão complexas como a sua. Por vezes uma conversa no pé do Gelágua pode te dar aquele empurrão extra pra finalizar o dia sem quebrar o build! Procure compreender como as pessoas executam o mesmo trabalho que você e ainda estão lá, trabalhando todo santo dia. Isso vai te ajudar a compreender como assimilar o trabalho de forma menos desgastante, sabendo que você não está sozinho. Se você é o psicopata da sua equipe, então o problema da desmotivação não é o trabalho, provavelmente é você!

Se não tem jeito mesmo, você está determinado a sair da empresa, tenho uma informação extra muito relevante: se a sua demissão for envolta de estardalhaço e todos estão comentando, significa que você fez um excelente trabalho.

Foco no Negócio

Pessoas são o Problema

Sofremos de um mal endêmico na área de TI: somos muito técnicos. “Mas isso não era pra ser bom?”, você pergunta. Não necessariamente, se não soubermos empregar nossas habilidades a serviço do nosso empregador (para aqueles pobres sofredores como eu que ainda o tem), temos que saber quando utilizar o quê. Isso explica por quê às vezes profissionais medianos (ou até medíocres) têm uma posição de importância ou são os responsáveis por ditar como funciona a máquina da TI em certas empresas. É pelo simples fato do trabalho deles dar resultado para sua empresa.

Para exemplificar um problema de uma empresa de serviços, se você é empresário e quer que sua operadora de saúde funcione perfeitamente, você não quer saber se o seu funcionário vai utilizar Ruby on Rails ou JSF para construir seu sistema de gestão. Você quer resultado, e resultados podem ser atingidos com as tecnologias erradas. Primeiramente, o que é o resultado? Eu creio que seja atingir às demandas no tempo e orçamento estimados, com um fator de qualidade satisfatório. Porém, qualquer projeto de software tem que ter manutenção (a não ser sistemas pontuais, e olhe lá). Então vamos ao velho trade-off investimento/retorno, que consiste em quanto mais dinheiro e tempo no planejamento e construção inicial, menor o investimento na manutenção destes bens, ou seja, o retorno do investimento é adequado à quantia investida.

Pessoas são a Solução

Você já deve saber disso tudo e inclusive existem soluções como as metodologias ágeis, que ajudam a produzir softwares de acordo com as necessidades do cliente e com entregas rápidas. Mas o problema ainda não foi solucionado, cadê o foco no negócio? A mensagem que eu quero passar é simples: não podemos nos dar ao luxo de não conhecermos o objetivo dos projetos nos quais trabalhamos. Temos que ter em mente que recebemos o nosso mísero salário para cumprir com as expectativas de uma organização e nos compete utilizar nossas habilidades a fim de prover um resultado satisfatório a esta organização. Em outras palavras, não adianta ser o ó do borogodó em (INSIRA SUA TECNOLOGIA AQUI) se o seu trabalho não dá resultado para a empresa.

Observação: Há muito compartilho dessa bandeira de “Foco no Negócio”. Por vezes fui mal compreendido, mas minha intenção é sincera. O que mais me motivou a escrever este post foi uma entrevista com um excelente palestrante da área de gestão de pessoas que vi no YouTube, Waldez Ludwig. Detalhe: o cara é analista de sistemas, formado em teatro e psicologia! Depois o louco sou eu! :D

Parte 1: http://www.youtube.com/watch?v=Wtnn69-oQ8E
Parte 2: http://www.youtube.com/watch?v=mmWODyD6_XE
Parte 3: http://www.youtube.com/watch?v=9wewvBwcsQ8

Os 7 tipos de vida que te venderam

“Eu gostaria de ter uma casa, num bom bairro, seguro, tranquilo. Seria legal ser num condomínio fechado, onde meus filhos possam brincar - um menino e uma menina, ela mais nova.”

Ou melhor.

“Eu adoro trabalhar de freelance! Trabalho de onde eu quiser, casa, shopping, café, a lista é interminável. Posso programar minhas férias como eu quiser. Sou meu próprio chefe!”

Hmmm… Quem sabe:

“Não me arrisco. Estudei três anos para passar nesse concurso! Todo santo dia primeiro recebo meu salário no Banco do Brasil. Só sei que passei e quero ganhar meus dez mil!”

Você quer realmente isso? Você está realmente ansioso com a adoção da TV Digital final CPI dos Grampos? Quer comprar o conversor o quanto antes? Isso é o que te vendem.

A verdadeira vocação não é a que você lê num blog ou na Você S/A. É fato - pelo menos pela minha ínfima experiência de vida - que tem uma hora onde você tem que escolher. Não há como postergar mais. Nesse momento, você pondera tudo que conhece sobre estilos de vida, formas de trabalho, entre outros.

Pense comigo: há algum tempo, sua maior escolha era para qual festa iria sair! Como era o seu processo?

a) Quanto eu tenho de dinheiro;

b) Vou de carona ou ônibus.

Como saber se o sonho que você quer é seu mesmo, não de uma bem elaborada peça publicitária?

Nua e Crua

Expostos os questionamentos, vamos aos fatos. Você já sabe que em um certo momento, sua vida terá de ser traçada. Você não pode fazer de tudo um pouco para sempre e esperar ter de tudo um pouco para sempre.

Algumas pessoas necessitam de um ponto final na sua carreira de procrastinação ou do zelo pelo nada-a-fazer. Há pouco passei por essa situação, onde me vi com as seguintes opções:

  1. Viver uma vida errante: viajar para um outro país (legalmente, claro), conseguir um emprego e viver uma outra realidade. Isso incluir sentir falta de arroz e feijão, gostar de neve durante uma semana (e odiá-la o resto da sua vida) e ficar feliz quando chega o verão, e você volta para o Brasil - no inverno - e toma uma cerva no boteco da esquina com os amigos.
  2. Viver uma vida dura: viajar para uma grande capital, conseguir um emprego e viver para o emprego e as contas. Respirar fumaça, ser assaltado por um cara numa moto e ter orgulho de dizer: “Pelo menos a cidade onde eu moro é a única do Brasil que tem a Antarctica Original!”.
  3. Viver uma vida fácil: depender dos meus pais até os 30 anos de idade (idade que calculo uma provável expulsão de casa por parte deles), trabalhar em empregos “que satisfaçam meu ego”, em outras palavras, não ter um chefe filho da puta, enquanto escuta sua mãe dizer que o filho do primo dela, o Antenor, passou para Juiz.
  4. Viver uma vida confortável: viajar para uma capital com taxas criminais nórdicas, conseguir um ótimo emprego, ter dois filhos, uma menina e um menino, morar num condomínio fechado, ter um dogue alemão e fazer churrascos com a família aos domingos. Depois descobrir que você é corno com o vizinho loiro, alto, de olhos verdes, sem sua cabeça achatada de cearense.
  5. Viver uma vida de idéias: pôr em prática conceitos e idéias sob uma fachada legal, resumindo, montar uma empresa. Saber que seus funcionários não vão trabalhar oito horas por dia, vão te enganar nas diárias de viagens e roubar com recibos falsos de táxi, mesmo assim, você é respeitado - até o momento que você fecha a porta. Ah, você provavelmente vai passar por situações corrupção, vão passar a perna em você e não vão te pagar.
  6. Viver uma vida cool: você será consultor para seus tios e freelancer para seus amigos (e freela para os íntimos). Comprar um MacBook e fazer artigos publicitários/design web/aplicações em rails de q-u-a-l-q-u-e-r canto do mundo, e vai fazer questão de dizer isso no seu blog e suas animadas palestras para 30 pessoas na convenção nacional dos blogueiros. No final das contas você depende dos seus pais.
  7. Viver a vida como ela é: você vai trabalhar com qualquer um dos seis tópicos acima, o detalhe é que será pragmático o suficiente para trabalhar para pagar as contas e satisfazer seus objetivos pessoais (incluindo suas ambições) e familiares. Ainda terá tempo de fazer uma nova lua-de-mel todos os anos com sua mulher (ou homem). Ah, o menino e menina são opcionais.

Uma única certeza eu tive entre todas estas opções: a minha mulher sempre estaria do meu lado, não importasse o que eu escolhesse. Por si só, isso já é a melhor vida do mundo.

Tutorial de Ruby

Vários alunos estão me pedindo informações sobre o Ruby, uma linguagem dinâmica e altamente ortogonal. Já desenvolvi dois sistemas utilizando o framework Ruby on Rails e meus scripts diariamente são feitos em Ruby. É muito fácil de aprender e ágil para se implementar, ideal para requisitos e ambientes dinâmicos.

Pretendo criar uma lista de “espera” para quem estiver a fim de participar de um curso de Ruby Básico e Rails que pretendo ministrar. Para viabilizar este curso, preciso de gente interessada! Interessado? Me informe seu e-mail: eu.quero.ruby@leonardoeloy.com.

Aqui o melhor tutorial da Web em Português, por Eustáquio Rangel.

Compilação Condicional com Oracle 10g

Estudando alguns recursos do banco para utilizar na Integração, verifiquei a existência de uma interessante característica do Oracle.

Estava escrevendo uma estrutura de integração onde iria alterar uma trigger em uma tabela central do sistema de gestão de planos de saúde da Unimed Fortaleza. Como temos outras Unimeds como clientes, não poderia simplesmente referenciar minhas novas estruturas nesta trigger e enviá-las em outras versões para eles.

A compilação condicional permite utilizar o pré-processador do PL/SQL a fim de decidir se um excerto de código irá ou não ser utilizado na compilação.

Utilização

O exemplo abaixo ilustra uma função que utiliza este recurso:

Compilação Condicional 1

Ao compilar esta função normalmente com o comando ALTER FUNCTION IDADE COMPILE;, teríamos o seguinte código:

Compilação Condicional 2

Para utilizar a compilação condicional, teríamos o seguinte comando:

ALTER FUNCTION idade COMPILE PLSQL_CCFLAGS = ‘auditoria_idade:TRUE’ REUSE SETTINGS;
Teríamos o código deste jeito:

Compilação Condicional 3

Conclusão

A utilização da compilação condicional permite que sejam ativados blocos de códigos de acordo com a passagem de parâmetros durante a compilação.

A principal desvantagem é a ortogonalidade do código, que fica um pouco comprometida pela utilização de instruções pouco usuais. Outro fator é que não temos como documentar as macros que são utilizadas nos códigos, a não ser que o objeto seja lido.

Vejo como maior vantagem a possibilidade de incluirmos códigos, que em certos contextos podem ser inválidos. Por exemplo, um cliente X não terá a estrutura de integração, mesmo assim, posso fazer referência às packages dentro do bloco condicional que este só será validado na compilação em que seja passado o valor TRUE para a macro.

NanoBase: Um processador de consultas para a plataforma JME CLDC/MIDP

Ano passado foi um ano corrido. Com orientação do Prof. José Maria Monteiro, Vitor Vasconcelos e eu reformulamos o NanoBase para uma arquitetura mais robusta e orientada a padrões.

Conheça mais o NanoBase e o NanoZoom.

Security Masturbating Monkeys

 

Linus Torvalds disse recentemente que ele acha o povo do OpenBSD, permitam-me a livre tradução, “um bando de macacos masturbadores”.Claro que não foi de graça, na realidade, ele se referia às pessoas que acham que bugs de segurança têm uma maior prioridade sobre bugs usuais, como a de um driver qualquer, por exemplo.

A causa de Linus é nobre, porém muito bairrista. Empresas de segurança não patrocinam o Linux. Ponto para eles que contam com um defensor de peso.

Filler

Enquanto a parada não começa!

Exploits of a Mom


 

July 2009
M T W T F S S
« May    
 12345
6789101112
13141516171819
20212223242526
2728293031  

Archives