Archive for the 'linguagem' Category

Vou colar grau!

formando Depois de 9 semestre de curso, vou colar grau neste sábado, no centro de eventos da UFSC. Finalmente serei uma bacharel em Sistemas de Informação. Nossa… Nem acredito. Passou tão rápido! :)

É engraçado como as coisas são… Eu não sou muito fã de formaturas e essas coisas, tanto que não paguei o baile. Mas quando está chegando o dia não tem como evitar um friozinho na barriga… Ainda mais para mim que tenho a família em outra cidade e agora o pessoal está todo aí. Não deixa de ser um pouco emocionante…

Lembro quando descobri que passei no vestibular. Minha mãe colocou aquela faixa gigante na frente da nossa casa com “Parabéns, Thânia!” - aff, aquele mico na vizinhança. Fui logo me virando para aprender uma linguagem de programação. diploma Achava que ía passar vergonha se eu começasse nas aulas sem saber nada… Li vários livros nos primeiros meses sobre introdução a programação e aprendi o básico de algumas linguagens nas férias que antecediam as aulas… C, Pascal, Basic, até brinquei com HTML e fiz algumas (pseudo) páginas… Foi a melhor coisa que eu fiz. Me ajudou bastante, pois me deu uma base boa.

Quando comecei as primeiras aulas, eu lembro que eu e meus amigos de aula começávamos a competir sobre quem fazia o maior número de linhas implementadas em Java (como se quantidade fosse qualidade). Eu lembro um amigo meu dizendo assim: “Cara, tu não acredita, eu conheço um cara que está trabalhando em um lugar que o programa deles tem mais de duas mil linhas de código em Java!”. Nossa, eu delirava! Duas mil linhas?!! Caramba, devia ser muita coisa… Mal sabia eu que ía fazer um TCC onde implementaria mais de 300 classes Java. Ahauahua… Muito engraçado lembrar disso. :)

Meu último semestre na UFSC acabou em julho, mas só estamos colando grau em outubro. Muito chato isso… Isso sem falar das formalidades. Não pode levar corneta, assobiar, levar faixa, papéizinhos picotados… As coisas durante a colação são muito formais. Os discursos são cronometrados e ninguém pode passar do tempo. Que sem graça… :-(

Para completar ainda mais essa transição, estou mudando de emprego. Sim, de novo. Às vezes as coisas não acontecem como a gente espera, infelizmente. Hoje é meu último dia na Epagri/Ciram. Estou indo para a Bry Tecnologia, trabalhar com Java para Web também. Estou bem feliz e bem ansiosa. Espero fortemente que dê certo lá.

Semana que vem eu coloco algumas fotos da formatura… Um ótimo fim de semana a todos! :D

Linguagem M

micro Não, nem eu e nem ninguém sabemos muito a respeito dessa nova linguagem anunciada há poucos dias pela Microsoft. Segundo o que dizem, será uma linguagem de descrição de dados com suporte a OO, parecida com XAML. Terá integração com o Visual Studio (afinal é da M$), mas poderá ser compilada no Linux e Mac também (quero só ver!).

Bom, agora é aguardar pra ver se pega… :P

Mais informações em:
http://thecoffeedesk.com/news/index.php/archives/74

I18N com JSTL

Bom, se você, assim como eu, está dando manutenção em alguns sistemas legados da sua empresa que infelizmente não utilizam frameworks que já oferecem suporte à internacionalização, chegou a hora de parar de ficar olhando de cara feia para as mensagens escritas diretamente nos JSPs e colocar I18N utilizando JSTL!! :D

Ainda estou pesquisando a fim de descobrir se a forma que irei apresentar é a ideal e a de melhor desempenho, mas.. é aquela velha história: funcionar, funciona! :)

Passo 1: Crie um arquivo de propriedades

Crie um arquivo de extensão properties (ou mais de um, dependendo de quantas línguas você irá internacionalizar seu projeto) e coloque ali o conjunto de chaves necessárias para a I18N. Um arquivo de propriedades é composto por chaves e valores separador por igual (”=”).

Um exemplo de conteúdo deste tipo de arquivo seria:

# ---------------------------------
# Propriedades do SISTEMA X
# ---------------------------------

# --~--~---------~--~
# ARQUIVO: login.jsp
# --~--~---------~--~
login.label.login=Login:
login.label.senha=Senha:
login.botao.cadastro=Cadastro de Usuário
login.botao.login=Login

# --~--~---------~--~
# ARQUIVO: relatorios.jsp
# --~--~---------~--~
relatorios.title=Relatórios

Passo 2: Crie uma classe Java para pegar o valor das propriedades

Um exemplo de implementação:

import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * MyProperties class.
 * 
 * This class was created in order to get strings of the properties file.  
 * 
 * @author thania
 */
public class MyProperties {

    /**
     * A ResourceBundle instance to refer the MyProperties file.
     */ 
    private static ResourceBundle resourceBundle = ResourceBundle.
        getBundle("pacote.MyProperties");

    /**
     * Gets the string of the ResourceBundle instance.
     * 
     * @param key The key for searching the string.
     * @return The value that was searched in the properties file.
     * 
     */ 
    public static String getString(String key) 
    {           
        String value = null;
        try  
        {  
            value = resourceBundle.getString(key); 
        } 
        catch(MissingResourceException e) 
        {  
            e.printStackTrace();
            System.err.println(new StringBuilder("ERROR: Properties :: getString -> ").
                append(key).append("\n").append(e));  
        }
        if (value == null) 
        {
            System.err.println(new StringBuilder("ERROR: Properties :: getString -> ").
                append(key));  
        }
        return value;
    }
}

Passo 3: Configure o web.xml

É preciso informar no web.xml qual será o arquivo que contém as mensagens do seu sistema. Para isto, basta adicionar a seguinte configuração no arquivo:

<context-param>
    <description>Arquivo de propriedades do Sistema X</description>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>pacote.MyProperties</param-value>
</context-param>

Passo 4: Use I18N no seu JSP!

Para utilizar as mensagens nas suas páginas JSP, importe a taglib fmt do JSTL:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 

Setar a classe que cria uma instância de ResourceBundle para buscar a valor no arquivo de propriedades:

<fmt:setBundle var="messages" basename="pacote.MyProperties"/>    

E, finalmente, use no texto do formulário:

<fmt:message key="login.label.senha" bundle="${messages}"/>

Isso retornará: “Senha:”

Enjoy! ;)

ps.: Se alguém tiver uma maneira melhor de fazer isso, por favor, mande-me um comentário. Nesse caso, não vale usar framework. Estou com um sistema legado aqui sem direito a refactoring e replanejamento da arquitetura, por enquanto. :~(

Eu e a minha raiva das incompatibilidades entre o IE e Firefox

firefox vs ie

Tá. Eu sei que incompatibilidades entre navegadores existem desde antes de eu nascer mas, cá entre nós, pimenta nos olhos dos outros é refresco… :D

Bom, as minhas atuais tarefas do meu trabalho estão envolvendo bastante Javascript. Como se trata de um sistema web, fico volta e meia testando no IE6, IE7 e Firefox. Resultado: cada dia fico mais indignada com a falta de padronização e compatibilidade destes browsers. Dá muita raiva. Inocentemente, no início fiquei testando mais no Firefox, afinal pra mim é mais conveniente, já que é meu browser padrão. Acabei me empolgando pra fechar um requisito e assim que deu tudo certo no Firefox, fui testar no IE e bumMmMmMm… Quanta coisa bugada! E pra descobrir qual o problema é um outro dilema, afinal no IE não tem o Firebug para me ajudar a debugar e, contraditoriamente, tudo costuma funcionar na mais perfeita ordem no Firefox (ele sempre é mais espertinho :). Tenho que ficar disparando vários alerts no meio do código pra ver em que função deu problema - aquele information de bug que fica no lado esquerdo da barra de status do IE não ajuda muito quem usa Linux. Tá louco, programação do tempo das cavernas… Snif snif.. :/

Ok, eu confesso, algumas funções que eu estava usando eram das versões mais atuais do Javascript e não ía pegar mesmo no IE. Troquei o que pude para as funções do prototype e a maior parte do requisito passou a funcionar no IE. Ufa! Mas mesmo assim né, dá um tempo, não precisava ser assim… :P

Antes disso, o problema foi com o CSS - pois é, de vez em quando eu dou uma de designer. Sinceramente, não arrisco dizer o que é mais incompatível entre browsers, se é o Javascript ou CSS. E pra CSS, você ainda tem que testar tanto no Firefox do Windows quanto do Linux, pois acontece de a tela ficar diferente dependendo do sistema operacional, acreditem se quiser. Também faço dar suporte pra IE6 e IE7 e, sinceramente, preciso dizer, no IE6 a coisa é na raça! É incrível como muita propriedade legal que funciona no Firefox, simplesmente só faz cócegas no IE6. Sorte que são poucos os que usam IE6, atualmente. Ainda bem que o IE7 já melhorou muito em relação a CSS. Temos max/min width/height, background transparente.. que blz. :)

Eu ficaria muito feliz se todos utilizassem apenas o Firefox, mas isso dificilmente aconteceria muito em breve. E mesmo se aumentasse o número de usuários Firefox, mesmo que fosse uns 40% a mais que o total de usuários atual, ainda assim teríamos usuários IE e precisaríamos dar suporte a eles. Eu, ao menos, não acho nada legal forçar o usuário a utilizar um browser X. Quem não fica indignado quando vai acessar um site e ele diz algo como “esse site não dá suporte ao browser que você está usando, use o browser X”. Poxa, eu fico chateada… Estou careca de saber que é complicado implementar de maneira que fique igual (ou ao menos parecido) em todos os browsers, mas não é impossível, é só ser um pouco mais.. errr, hmmm, digamos… paciente e persistente. Cá estou eu aqui reclamando deste problema, mas jamais tomei uma decisão drástica dessa em sistema web e espero não precisa tomar.

O jeito é torcer para o IE8 dar um pouco mais de bola pro Javascript dessa vez, invés de só para o CSS… :P

Bom, pessoal, desculpa o desabafo. Me sinto bem melhor agora.

Boa dia a todos! :)

Suporte nativo a Listas e Mapas em Groovy

Em Groovy, para declarar uma lista é simples assim:

def lista = ["thania", "clair"]
println lista.get(0)
println lista.get(1)

Para definir um intervalo:

def intervalo=0..10
println intervalo.size()
println intervalo.get(5)

Para criar um mapa:

def mapa = ["chave":"valor", "chave2":"valor2"]
mapa["nova"]="novo valor"
println mapa["chave"]
println mapa["nova"]

lista e intervalo são instâncias de java.util.List. Definir o objeto como intervalo preenche a lista criada com os valores desejados (podem ser utilizados caracteres). A definição de um mapa parece com a de uma lista, exceto pelo fato de serem passados dados no formato [ <chave> : <valor> ].

As coleções em Groovy possuem métodos bastante úteis para closures:

def lista = ["a", "b", "c"]
lista.each
{
  elemento -> println elemento;
}

lista.eachWithIndex 
{ 
    elemento, indice ->
            println indice + "O elemento é = " + elemento;
}

O método each retorna como parâmetro para a closure todos os membros da coleção, na ordem. :)

Tudo isso me lembra muito Ruby, por isto é legal. Preciso descobrir ainda como anda a produtividade ao utilizar esta linguagem. Não sei ao certo se muitas aplicações vêm sendo desenvolvidas em Groovy e porque utilizá-la ao invés de Java ou Ruby. A verdade é que já li algo respeito, mas ainda não me convenceu. Espero que não seja apenas uma outra linguagem. :P

Próxima Página »