Archive for the ‘Scala’ Category

“martelo é para pregar e não apertar parafusos”

abril 11th, 2010

Uma das coisa que escutei e sempre repeti por realmente acreditar que faça sentido é que, existe a ferramenta certa para cada tipo de trabalho.  Não adianta acreditar que aquela “paradinha” maneira que você conhece de “traz para frente”  vai ser a melhor solução para todos os seu problemas, pois simplesmente como uma verdade absolut, ela não será e quem a criou sabe disso. Note que eu disse – “não será a melhor opção”- e não = “não resolverá ou não fará”.

Acredito que todas a novas linguagens são capazes  de resolver a grande maioria de nossos problemas computacionais atuais.  Em raríssimos casos poderemos apenas usar uma determinada linguagem…muito mais por requisitos de processamento, velocidade e etc do que capacidade daquela linguagem. Falo isso, pois cansei de ouvir gente dizer que a linguagem B não é capaz de fazer o que a linguagem C faz. Ela faz sim, só que de uma forma mais complexa ou mais verbosa, por exemplo.

Sei que tocar nesse assunto é meio “chover no molhado” por ser este um tema muito falado e batido, porém, gostaria de dar uma visão real disso.  Imagine você numa situação em que precisar fazer um sistema. Este sistema possui várias facetas: uma parte para cliente, outra que ficará com um processamento em batch (background), etc. Já tive requisitos como estes em diversas oportunidades e em cada uma delas foi uma solução adotada.  Posso dizer que o pior dos casos foi quando tentamos usar a mesma “estrutura” para tudo.

Imagine que agora você comece a aplicação para os requisitos acima e faça tudo dentro de um servidor de aplicação. Aquela típica solução Java, onde um dentro do JBoss ou outro esteja tudo… Ali estão a lógica do sistema web, os processamentos em batch agendados via Quartz, etc.  Imagine também que isso tudo estará dentro de um servidor Linux (qualquer distribuição que seja)  - coisa bem factivel.  Dái começo a colocar algumas perguntas:  se todo sistemas linux tem um Cron (serviço de agendamento) por que usar algo feito em java para fazer a mesma coisa? Se argumentarem que é para garantir a independencia de plataforma, pergunto qual são as reais possibilidades de mudar a plataforma (SO, etc) ?  Com certeza que bastante remotas.

Esse tipo de coisa pode ser ainda mais extrapolado. Imagina agora que dentro do seu sistema é preciso processar diversos conteúdos de arquivos e importar seus dados para a base de dados do sistema. Muito fariam uma classe para que você fizessem um upload e processar. Mas não seria mais interessante deixar que alguém carregue via ftp e um processo agendado trate-o depois. Esse processo poderia ser algo escrito em bash mesmo pois será ultra rápido em comparação a uma aplicativo java. Mais uma vez aqueles xiitas diriam que seria para manter a questão da independencia de plataforma, mas quantas vezes sua web app mudou de servidor (SO, hardware, etc) nos últimos anos?

Se ousarmos um pouco mais, dada as recente evoluções da JVM (Java Virtual Machine)  as possibilidades vão além de usar o sistema operacional. Hoje é possível escolher em qual linguagem irá escrever cada parte de seu sistemas e estas coexistirem sem nenhum problema.  Antes que pensem que isso é um discurso de incentivo ao uso de Java, linguagem da qual gosto, estou usando esse ela como exemplo por ser um bom exemplo de como isso funciona e tem sido alvo de investimento.

Famosos produtos tem usado uma “tecnologia” para fazer a parte de integração com usuário e outra para fazer toda a parte de Kernel do sistema. Acredito que o Twitter seja um exemplo disso, pois sua parte de interna foi toda reescrita em Scala (nova linguagem objeto- funcional da JVM) .

Voltando a parte prática da coisa, um exemplo de  que é bom conhecer diversas ferramentas e saber empregá-las, é um caso num empresa que era preciso fazer medições de audiência em páginas. A solução inicial era de conteúdo dinamico em todas as páginas que quando acessadas iriam no servidor e gravavam um dado no banco de dados. Essa solução embora resolvesse o problema, ela acabava por onerar por demais o processamento pois tal parte não poderia ser posta em cache e a cada acesso, haveria uma requisição no servidor e um acesso ao banco de dados. O pessoal então passou para algo mais hibrido e pouco ortodoxo para época:  fez uma modificação para que o servidor colocasse no arquivo de log os dados de quem estava acessando e construiram um programa em shell para analisar esses logs. Com isso, embora não tivessemos um “tempo real” dos acessos, para os nosso requisitos de estatísticas serviu perfeitamente e reduziu a carga e o processamento, deixando para uma outra tecnologia que lida melhor com busca via regex fazer o trabalho dela.

Essa solução não sei se funciona ainda, acredito que com saida da terceirizada que fez da empresa tenha sido tirado,  mas foi uma marca para me mostrar que existem outras possibilidades além daquela que eu sabia na época. É isso que conta. E num mundo cada vez mais competitivo é importante ter mais de uma “carta na manga”.

Bem até a próxima pessoal.

Problema para escrever um arquivo com UTF-8 em Groovy

dezembro 23rd, 2009

No meu trabalho precisei realizar uma tarefa que consistia em pegar um arquivo xml e gerar um outro arquivo, também em xml,  a partir dos dados do primeiro.  A princípio pediram que fizesse “na mão” mas como sou pago para pensar e não para executar as coisas feito uma máquina, parti para criar algo que fizesse isso de forma automática.

Para fazer o trabalho criei um script em Groovy por ter uma certa intimidade com a linguagem e pela facilidade que ela oferece para manipular dados em formato xml (veja o trecho abaixo).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def mudaArquivoCidade(arquivo)
{
    def select = new XmlParser().parse("${folderLeitura}\\${arquivo}");
    File  file_xml_out  = new File ("${folderCidadesDestino}\\${arquivo}");
   
        file_xml_out  .append('<?xml version="1.0" encoding="UTF-8"?>');
        file_xml_out  .append("\n");
        file_xml_out  .append(''' <select id="cidade" name="cidade" onblur="campoObrig(this)">''');
        file_xml_out  .append("\n");
        select.option.each(){
           valor    = it.text();
           texto  = valor;
           id = it.@value;
           if(valor == "Selecione a Cidade")
           {
            valor = "";
           }
           else
           {
             geraArquivoUpdateParaCidade(file_sql_out,valor,id)
           }
           file_xml_out  .append("""<option value="${valor}">${texto}</option> """);
           file_xml_out  .append("\n");
         
...

O script após pronto funcionou perfeitamente, porém com um problema residente no fato do arquivo de saída ter sido salvo com codificação padrão do sistema operacional (o lixo do Microsoft grava tudo em ANSI ).  No primeiro teste que fiz com os dados acusou o erro com caracteres acentuados.

O desafio foi achar uma forma, simples, de alterar o encoding do arquivo de saída para o valor que eu quero. Após muitas pesquisas no google, leituras de doc, etc… A solução extremamente elegante que achei foi (veja trecho abaixo).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def mudaArquivoCidade(arquivo)
{
    def select = new XmlParser().parse("${folderLeitura}\\${arquivo}");
    File  file_xml_out  = new File ("${folderCidadesDestino}\\${arquivo}");
    file_xml_out.<strong>withWriter('UTF-8')</strong> { saida ->
        saida.append('<?xml version="1.0" encoding="UTF-8"?>');
        saida.append("\n");
        saida.append(''' <select id="cidade" name="cidade" onblur="campoObrig(this)">''');
        saida.append("\n");
        select.option.each(){
           valor    = it.text();
           texto  = valor;
           id = it.@value;
           if(valor == "Selecione a Cidade")
           {
            valor = "";
           }
           else
           {
             geraArquivoUpdateParaCidade(file_sql_out,valor,id)
           }
           saida.append("""<option value="${valor}">${texto}</option> """);
           saida.append("\n");
          }
...

Aqui você informe que ao invés do objeto file usar um writer com valor de caracter padrão, ele deve usar um que use o UTF-8. Para quem está familiarizado com padrões de projeto é um Decorator.

Introdução a Linguagem Scala – Parte 1

novembro 7th, 2009
e acordo com o livro Programming in Scala, escrito pelos criadores da linguagem – , o nome Scala vem da combinação das palavras em inglês Scalable Lang (Linguagem escalável), e foi chamada assim pois foi desenhada para crescer com a demanda de seus usuários (nós programadores). É possível usá-la em um grande espectro de atividades: desde de pequenos scripts a aplicações web ou GUI com alto tráfico e acesso (ou carga de processamento). Ela é simples para começar, principalmente para o pessoal que já usa o Java pois roda dentro da JVM e tem integração bem próxima das APis e bibliotecas Java.
Uma primeira coisa que podemos dizer que a linguagem é uma mistura com sabor funcional e orientado a objeto e isso será notado a medida que for avançando em seu aprendizado. O interessante é que ao fundir essas duas característica, tendo como objetivo pegar o melhor de cada, Scala acabou se tornando uma boa escolha frente as todas as da moda hoje e atingindo a meta geral de ser altamente capaz de escalar: a parte funcional torna fácil a missão de construir coisas rapidamente com código de alta legibilidade; a parte OO permite a manipulação fácil de dados e sua adaptabilidade.
A Catedral e a Bazar
Eric Raymond fez a metáfora da Catedral e Bazar para construção de sistemas. A catedral, segundo ele, é um tipo de construção próxima “a perfeição” que leva muito tempo para ser construída. Uma vez que tenha sido construída, pouco coisa resta para fazer ou modificar (pelo menos eu não vejo grandes obras, além das de restauro, dentro de igrejas antigas e catedrais). Já os bazares, pelo contrário, são feitos muito rápido, simples e adaptáveis mudando todos os dias para atender e superar as expectativas dos clientes. Scala é algo mais próximo do Bazar.
Primeiro programa
object HelloWorld{
def main (args : Array[String]) : Unit ={
println (“Hello World, ou em português, Olá Mundo”)
}
}
Nesse programa já podemos ver algumas das características interessantes da linguagem. Embora ela se proponha ser da família das dinâmicas, ela é estaticamente tipada: os tipos das variáveis devem ser definidos em tempo de compilação (não existe o famoso duck type como o Python). Com isso mesmo que não defina o tipo, o compilador vai definir um por inferência.  Outra característica interessante é forma que declaramos a classe e seus métodos.
Em Scala, tudo é dado, inclusive as funções ( para quem já trabalhou com Haskell ou Lisp isso é mais simples de entender). Assim as funções tem os seus “valores” (o código) passado como numa variável : algo = valor . Isso é algo que o pessoal está muito acostumado com nossas linguagens imperativas vai demorar um pouco para se convencer disso.
Outra coisa é que o tipo é definido depois e não antes como fazíamos. Confesso que é algo que a gente se acostuma com o tempo para ler um código e entendê-lo logo de cara.
No exemplo acima não deu para ver mais uma característica interessante que é a questão de tornar concisa a escrita de sistemas. Veja os dois trechos de código abaixo
Classe em Java
class Pessoa {
private String nome;
private String sobrenome;
public Pessoa (String nome,String sobrenome){
this.nome = nome;
this.sobrenome = sobrenome;
}
}
Mesma classe escrita em Scala
class Pessoa (nome : String, sobrenome: String)
Bem por hoje paramos por aqui, no próximo artigo da séria continuamos daqui  para falarmos mais
De acordo com o livro Programming in Scala, escrito pelos criadores da linguagem – , o nome Scala vem da combinação das palavras em inglês Scalable Lang (Linguagem escalável), e foi chamada assim pois foi desenhada para crescer com a demanda de seus usuários (nós programadores). É possível usá-la em um grande espectro de atividades: desde de pequenos scripts a aplicações web ou GUI com alto tráfico e acesso (ou carga de processamento). Ela é simples para começar, principalmente para o pessoal que já usa o Java pois roda dentro da JVM e tem integração bem próxima das APis e bibliotecas Java.
Uma primeira coisa que podemos dizer que a linguagem é uma mistura com sabor funcional e orientado a objeto e isso será notado a medida que for avançando em seu aprendizado. O interessante é que ao fundir essas duas característica, tendo como objetivo pegar o melhor de cada, Scala acabou se tornando uma boa escolha frente as todas as da moda hoje e atingindo a meta geral de ser altamente capaz de escalar: a parte funcional torna fácil a missão de construir coisas rapidamente com código de alta legibilidade; a parte OO permite a manipulação fácil de dados e sua adaptabilidade.
A Catedral e a Bazar
Eric Raymond fez a metáfora da Catedral e Bazar para construção de sistemas. A catedral, segundo ele, é um tipo de construção próxima “a perfeição” que leva muito tempo para ser construída. Uma vez que tenha sido construída, pouco coisa resta para fazer ou modificar (pelo menos eu não vejo grandes obras, além das de restauro, dentro de igrejas antigas e catedrais). Já os bazares, pelo contrário, são feitos muito rápido, simples e adaptáveis mudando todos os dias para atender e superar as expectativas dos clientes. Scala é algo mais próximo do Bazar.
Primeiro programa
object HelloWorld{
def main (args : Array[String]) : Unit ={
println (“Hello World, ou em português, Olá Mundo”)
}
}
Nesse programa já podemos ver algumas das características interessantes da linguagem. Embora ela se proponha ser da família das dinâmicas, ela é estaticamente tipada: os tipos das variáveis devem ser definidos em tempo de compilação (não existe o famoso duck type como o Python). Com isso mesmo que não defina o tipo, o compilador vai definir um por inferência.  Outra característica interessante é forma que declaramos a classe e seus métodos.
Em Scala, tudo é dado, inclusive as funções ( para quem já trabalhou com Haskell ou Lisp isso é mais simples de entender). Assim as funções tem os seus “valores” (o código) passado como numa variável : algo = valor . Isso é algo que o pessoal está muito acostumado com nossas linguagens imperativas vai demorar um pouco para se convencer disso.
Outra coisa é que o tipo é definido depois e não antes como fazíamos. Confesso que é algo que a gente se acostuma com o tempo para ler um código e entendê-lo logo de cara.
No exemplo acima não deu para ver mais uma característica interessante que é a questão de tornar concisa a escrita de sistemas. Veja os dois trechos de código abaixo
1
2
3
4
5
6
7
8
9
class Pessoa {
    private String nome;
    private String sobrenome;
   
    public Pessoa (String nome,String sobrenome){
        this.nome = nome;
        this.sobrenome = sobrenome;
    }
}
Mesma classe escrita em Scala
1
 class Pessoa (nome : String, sobrenome: String)
Bem por hoje paramos por aqui, no próximo artigo da séria continuamos daqui  para falarmos mais