As 3 principais teclas de atalho do Eclipse

August 10th, 2011

Eu utilizo o Eclipse e recomendo! Nesse post consta as principais teclas de atalho do Eclipse, por Raphael Lacerda e Paulo Silveira:

Na apostila do curso FJ-11 passamos diversas teclas de atalho importantes para o desenvolvedor iniciante, mas damos especial destaque a um pequeno grupo, para não atrapalhar o aprendizado. Vamos diminuir ainda mais esse grupo e mostrar como podemos praticamente nos livrar da interrupção do mouse com apenas três teclas de atalho: Control+Espaço, Control+1 e Control+3.

1. Acha que já conhece o Control + Espaço?

Sim, ela te ajuda a autocompletar nome de classes e métodos, mas podemos ir muito além. Ao declarar uma variável do tipo ContaCorrente basta, logo após dar o espaço, pressionar Control + Espaço e possibilidades de nome serão sugeridas:

O Control + Espaço pode ativar um dos muitos templates do Eclipse, como o foreach. Basta digitá-lo e pressionar Control + Espaço que será estruturado um enhanced-for, sugerindo utilizar a array ou collection do escopo mais próximo. O funcionamento é análogo para outros templates, como para gerar o método main:

Existem várias formas de se gerar os getters e setters e a mais rápida é com Control + Espaço. Dado qualquer atributo, basta digitar get+Control + Espaço e pronto, ele dará opções para a geração do getter. O funcionamento é análogo para o setter:

2. O Control + 1 vai além da correção:

Esta talvez seja a combinação mais eficiente, porém menos conhecida. Ela não serve apenas para dar sugestões quando algo há algum erro de compilação (quickfix), indicado pela pequena lâmpada, como no tratamento de exceções checked:

Ou para criar classes que ainda não existem:

Quando declaramos um atributo de uma classe, o Control + 1 vai oferecer e geração de getter e setter:

Mas o uso mais interessante é na criação de váriáveis e atributos. Quando vamos criar uma váriável, começamos declarando-a, mas isso não é necessário. Podemos simplesmente digitar new ContaCorrente() e pressionar Control + 1:

Podemos também utilizar Control + 1 para remover cada import desnecessário, porém o control+shift+o é mais eficiente.
3. O Control + 3 pode fazer todo o restante.

Ele é o atalho que busca um comando ou opção de menu baseado no que você escreve. Ao digitar generate, por exemplo, temos:

Com isso podemos gerar construtores, getters e setters ou buscar por todo código. Até mesmo abrir a tela de preferences ou fazer um new class. Mais: conforme você usa o Control + 3, o Eclipse memoriza suas principais escolhas, de tal forma que da próxima vez elas estarão ordenadas de acordo com sua utilização. Também é possível escrever apenas as primeiras letras das palavras que constituem o comando, como Generate Getters And Setters (GGAS):

Pode gerar construtores de acordo com seu atributos, através do GCUF (Generate Constructor Using Fields), entre muitos outros. O céu é o limite.

Ou rodar sua aplicação, ao digitar run:

Para os iniciante em Eclipse, isso é bem mais fácil que guardar na memória as estranhas teclas de atalho para rodar uma aplicação: agora ela está a apenas um Control + 3 run de distância.

E você, quais atalhos mais utiliza? Dominar uma IDE pode te deixar muito produtivo, e vemos que não é necessário memorizar muitas teclas para já ter um considerável desempenho com o Eclipse. Fica o agradecimento a diversos desenvolvedores e instrutores da Caelum pelas dicas: Adriano Almeida, Jose Donizetti, Lucas Cavalcanti e Fabio Kung.

Fonte: http://blog.caelum.com.br/as-tres-principais-teclas-de-atalho-do-eclipse/

Java

A primeira programadora – Ada Lovelace

July 31st, 2011

Olá pessoal,

Vi este artigo no blog ProjectZim e achei bem legal, por isso estou postando:

Como muitos sabem a área de programação é dominada por homens (na verdade exatas em geral D:) Porém poucos sabem que foi graças a uma mulher que tudo começou. Sim, uma MULHER! Ada Byron, Condessa de Lovelace.

Ada nasceu na Inglaterra e era filha de poeta, porém não conheceu seu pai. Aparentemente a desilusão de sua mãe com seu pai poeta causou o maior bem na vida de Ada. Sua mãe com medo que se interessasse pela poesia, reforçou nas aulas de matemática e música.

Ada tornou-se notável quando criou o primeiro algoritmo para o cálculo da sequência de Bernoulli que era usada na máquina analítica de Babbage, além de fazer importantes anotações a respeito do funcionamento da máquina. Nessa época Ada já era casada e tinha 3 filhos o.o.
Apesar da máquina analítica nunca ter sido terminada, foi um importante marco para a história da computação. Cerca de 100 anos após o início do projeto, a máquina analítica e as anotações da Ada foram redescobertos e são considerados o primeiro computador e software (apesar de que, pelo que eu sei, o primeiro computador foi o ábaco).
Ada morreu em 1852 aos 37 anos, e era conhecida por Bobbage como Encantadora de números (foi a única que entendeu seu conceito).
Em 1980 foi criada uma linguagem de programação chamada ADA em sua homenagem, uma linguagem de alto nível, orientada a objetos e baseada em Pascal.
Ada é mais do que a prova de que programação também é lugar de mulher (e na minha opinião exatas, futebol e games também). ;)
Ada SUA LINDA!

Fonte: http://www.projectzim.com/2011/07/ada-lovelace-primeira-programadora.html

Diversos

View Parametrizada no Oracle

July 26th, 2011

Olá pessoal,

Acho que muitos já precisaram usar view parametrizada em Oracle, como nas stores procedures, e se frustaram ao descobrir que não é possível pelo meio normal.

Há várias maneiras de contornar a situação, como no famoso método utilizando o SYS_CONTEXT. Esse artigo mostra como usar a view parametrizada em Oracle utilizando “packages“.

Por exemplo, temos uma tabela chamada TB_AREA, com campos CODAREA e NOME, onde são armazenadas as áreas da empresa. Para criar uma view que lista as áreas com filtro por CODAREA, devemos primeiro criar o pacote com oe métodos GET e SET.

PACKAGE TO STORE PARAMETERS
SQL> CREATE OR REPLACE PACKAGE PKG_PARAM AS
PROCEDURE SET_CODAREA (P_CODAREA IN INTEGER);
FUNCTION GET_CODAREA RETURN INTEGER;
END PKG_PARAM;
/
Package created.

Criando o Body:

SQL> CREATE OR REPLACE PACKAGE BODY PKG_PARAM AS
CODAREA INTEGER;
 
PROCEDURE SET_CODAREA (P_CODAREA IN INTEGER)
IS
BEGIN
CODAREA := P_CODAREA;
END;
 
FUNCTION GET_CODAREA RETURN INTEGER
IS
BEGIN
RETURN CODAREA;
END;
END PKG_PARAM;
/
Package body created.

Criando a view baseada no valor do package

SQL> CREATE OR REPLACE VIEW PARAM_VIEW AS
SELECT *
FROM TB_AREA
WHERE CODAREA=PKG_PARAM.GET_CODAREA;
VIEW created.
 
SQL> SELECT * FROM PARAM_VIEW;
no rows selected

Setando o codArea para 15

SQL> EXEC PKG_PARAM.SET_CODAREA(15);
PL/SQL procedure successfully completed.

OBS: Colocar o BEGIN e END se for executar pelo client, e sem a palavra EXEC, como abaixo:

BEGIN
PKG_PARAM.SET_CODAREA(15);
END;

Usando a view

SQL> SELECT * FROM PARAM_VIEW;
CODAREA  NOME
—————————— 
15    FINANCEIRO

Mudando o parametro

SQL> EXEC PKG_PARAM.SET_REGION(16);
PL/SQL procedure successfully completed.
 
SQL> SELECT * FROM PARAM_VIEW;
CODAREA  NOME
—————————— 
16    CONTABILIDADE

Fonte: http://10gdba.wordpress.com/2008/06/01/creating-a-parameterized-view/

Banco de Dados

O que é o hashCode?

July 1st, 2011

Mais um ótimo artido do Paulo Silveira:

Sem dúvida um dos pontos mais difíceis para quem está fazendo um curso inicial de java é entender hashCode, em especial para quem nunca viu estruturas de dados além de filas e pilhas, isso porque o desenvolvedor já está bem confuso em ter seu primeiro contato com a API das coleções, sintaxe do generics e uso extensivo de interfaces.

Aqui vou mostrar como costumo fazer essa explicação, e depois sugerir uma grande melhoria.

Costumo usar o exemplo de pesquisar por uma String dentro de uma lista de Strings. A busca seqüencial vai fazer até lista.size() comparações, o que pode ser muito grande. Então como diminuir esse número de comparações? Espalhando nossas Strings de acordo com algum critério, e colocando-as dentro de uma tabela de espalhamento (hashtable, hash=espalhar).

Mas como espalhá-las? Podemos classificar essas Strings de acordo com a sua primeira letra em uma array de listas (List[]): strings[65] teria uma lista de Strings que começam com a letra A, e assim por diante. O problema é que, por exemplo, podemos ter todas nossas strings começando com A gerando a quantidade máxima de colisões em uma mesma lista! Daqui podemos elaborar a idéia para que as Strings sejam indexadas por um critério mais interessante. Por exemplo, multiplicar o valor inteiro de cada char: paulo valeria p*a*u*l*o, que é 112*97*117*108*111 = -1942066240 (explodiu Integer.MAX_VALUE). Esse número pode ser muito grande ou não nos servir por algum motivo, então nosso HashMap vai limitar o tamanho da array, e fazer algo como -1942066240 % array.length para saber em que bucket colocar esse ítem.

E continuo nessa linha de pensamento para explicar o contrato do método hashCode, realocação do tamanho da tabela de espalhamento e que isso tudo é utilizado na implementação de arrays associativas em algumas linguagens.

Os principais problemas desse exemplo:

Alguns desenvolvedores conhecem um pouco de árvores binárias, e querem usá-las. O problema é que tabelas de espalhamento são muito mais rápidas na pesquisa, além de que usar árvores binárias necessita de um critério de comparação entre os objetos, o que não é necessário em espalhamentos;
Gerar um int a partir de uma String atrapalha bastante. Repare a quantidade de passos que precisei passar: transformação de cada char em seu valor numérico da tabela unicode, multiplicar tudo, fazer mod, etc. Seria melhor se o objeto em questão já tivesse alguma relação numérica, e que não precisássemos fazer contas em cima de seus valores;
Pessoalmente sinto que poderia ser melhor.

Um amigo analista que trabalha no asset management de um grande banco brasileiro conversava comigo quando surgiu a necessidade dele encontrar dois arquivos de conteúdo idêntico que estavam no mesmo diretório. O problema é que esse diretório tem mais de 10 mil arquivos! Ele mesmo sugeriu fazer uma comparação primeiramente ordenando os arquivos por tamanho, e só vale comparar byte a byte os arquivos que possuírem o mesmo tamanho, os outros obviamente são diferentes entre si. Disse então para ele que esse era um excelente exemplo de tabelas de espalhamento, e que ele não precisaria nem mesmo ordenar os arquivos por tamanho, bastando separá-los!

Repare que esse meu amigo não é programador, mas todo engenheiro e administrador que trabalha em banco acaba sujando suas mãos com centenas (as vezes milhares) de linhas de VB dentro de funções excel. Isso mostra como a idéia de indexação e hash são muito simples e intuitivas, às vezes o que atrapalha é o professor :) .

Vamos ver como ficaria ensinar com esse exemplo: o contrato do método hashCode diz que:

se a.equals(b) então a.hashCode() == b.hashCode()

Pensando no problema da comparação dos arquivos, podemos falar:

fileA é equivalente a fileB então tamanho de fileA == tamanho de fileB

Colocando em java:
se fileA.equals(fileB) então fileA.length() == fileB.length()

Reescrevendo hashCode para espalhar de acordo com esse nosso critério, teríamos finalmente:

se fileA.equals(fileB) então fileA.hashCode() == fileB.hashCode()

Muito mais simples e direto que o exemplo da String! Aqui o debate poderia prosseguir em encontrar um hashCode que espalhasse melhor os arquivos, e o assunto cairia em checksums… mais perfeito impossível!

Vale lembrar que eu estou falando aqui de uma classe File imaginária, pois a java.io.File não leva em consideração o conteúdo do arquivo para o equals nem para o hashCode, ela usa apenas o abstract pathname em consideração.

Fonte: http://blog.caelum.com.br/ensinando-que-e-o-hashcode/

Java

Como não aprender Java e Orientação a Objetos: getters e setters

June 23rd, 2011

Muito bom esse artigo do Paulo Silveira, por isso resolvi postar aqui:

Muitas pessoas perguntam “como aprender OO?“. Há várias maneiras de aprender OO, creio que não tenha uma melhor, mas existem maneiras de não aprender.

Uma das práticas mais controversas que aprendemos no início é a geração indiscriminada de getters e setters. Os exemplos básicos de centenas de tutoriais java estão recheados com getters e setters da pior espécie: aqueles que não fazem sentido algum. Considere:

class Conta {
  double limite;
  double saldo;
}

Rapidamente os tutoriais explicam o private para o encapsulamento. Mas aí como acessar? Getters e setters nela!

class Conta {
  private double limite;
  private double saldo;
 
  public double getSaldo() {
    return saldo;
  }
 
  public void setSaldo(double saldo) {
    this.saldo = saldo;
  }
 
  public double getLimite() {
    return limite;
  }
 
  public void setLimite(double limite) {
    this.limite = limite;
  }
}

Qual é o sentido desse código? Para que esse setSaldo? e esse setLimite? e o getLimite? Você vai usar esse métodos? Nunca crie um getter ou setter sem sentir uma real necessidade por ele. Isso é uma regra para qualquer método, mas particularmente os getters e setters são campeões: muitos deles nunca serão invocados, e grande parte do restante poderia ser substituído por métodos de negócios. Códigos do tipo conta.setSaldo(conta.getSaldo() + 100) se espalharão por todo seu código. Segue então a nossa classe Conta reformulada de acordo com essa necessidade:

class Conta {
  private double saldo;
  private double limite;
 
  public Conta(double limite) {
    this.limite = limite;
  }
 
  public void deposita (double x) {
    this.saldo += x;
  }
 
  public void saca(double x) {
    if(this.saldo + this.limite >= x) {
      this.saldo -= x;
    }
    throw new IllegalArgumentException("estourou limite!");
  }
 
  public double getSaldo() {
    return this.saldo;
  }
}

E nem estamos falando de test driven development! Testando a classe Conta rapidamente você perceberia que alguns dos getters e setters anteriores não têm uso algum, e logo sentiria falta de alguns métodos mais voltados a lógica de negócio da sua aplicação, como o saca e o deposita acima. Esse exemplo é muito trivial, mas você pode encontrar por aí muitas classes que não tem a cara de um java bean que expõem atributos como Connection, Thread , etc, sem necessidade alguma!

Existem sem dúvida práticas piores: utilização de ids para relacionar os objetos, arrays não encapsuladas como estruturas, código fortemente baseado em comparação de Strings hardcoded (que o Guilherme Silveira sarcasticamente carinhosamente batizou de POS, ou programação orientada a strings), milhares de métodos estáticos, entre outros. Todas essas práticas são muito comuns quando estamos começando a quebrar o paradigma procedural, e confesso já ter sido um grande praticante de muitas delas. Um professor sempre me disse que você só vai utilizar bem o paradigma da orientação a objetos depois de errar muito.

O Phillip Calçado tem um artigo simplesmente incrível que de certa forma aborda esse tema: classes fantoches (puppets). Uma classe fantoche é a que não possui responsabilidade alguma, a não ser carregar um punhado de atributos! Onde está a orientação a objetos? Uma grande quantidade de classes fantoches são geradas quando fazemos Value Objects, entidades do hibernate, entre outros.

“Mas o que colocar nas minhas entidades do hibernate e nos meus VOs além de getters e setters?“. Antes de tudo, verifique se você realmente precisa desses getters e setters. Para que um setID na sua chave primária se o seu framework vai utilizar reflection ou manipulação de bytecode para pegar o atributo privado, ou se você pode passá-la pelo construtor? Sobre value objects, você realmente precisa dos seus setters? Em muitos casos VOs são criados apenas para expor os dados, e não há necessidade alguma para os setters… bastando um bom construtor!

No hibernate costumo colocar alguns métodos de negócio, algo parecido como na classe Conta. Minhas entidades possuem uma certa responsabilidade, em especial as que dizem respeito aos atributos pertencentes a elas.

Para quem ainda está aprendendo, a apostila da caelum de java e orientação a objetos tem algumas dessas discussões e procura ensinar OO comentando sempre dessas más práticas, como por exemplo o uso de herança sem necessidade.

Fonte: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/

Java

O dia em que o Google parou…

June 7th, 2011

Estava de bobeira esses dias quando me veio na cabeça uma idéia para um filme  de terror: “O dia em que o Google parou!”

Muita gente já deve ter pensado nisso… o que vai acontecer quando o google parar? De longe o filme mais aterrorizante que poderia surgir!

Simplesmente vamos ter uma parte de nós arrancada… sem e-mail, maps, calendar, youtube, docs, picasa… um terror!

Dependemos tanto dessa empresa que se a Google quebrar o mundo inteiro vai sentir… ou pior, ela pode começar a cobrar seus serviços… e aí vamos ser obrigados a pagar, pois estamos nas mãos (ou será garras?) dela…

Bom, mas tudo indica que o Google nunca irá parar muito menos cobrar pelos seus serviços. E assim a vida continua!

Até!

Diversos, Ferramentas Google

Web Site ou Web Application eis a questão

June 1st, 2011

Excelente artigo do Marquinhos Net Blog:

Atualmente onde trabalho tinha uma aplicação Web Site. Após algumas reuniões entre os desenvolvedores, decidimos migrar essa aplicação para Web Application. Qual a diferença? Quais as vantagens? Essas foram algumas das perguntas a quais pretendo informar agora.

Ambas têm suas vantagens e desvantagem, cabe a você desenvolvedor decidir qual utilizar para seu tipo de projeto.

Você gostaria de alterar seu código fonte durante a depuração?
Então você deve usar Web Site, pois Web Application não suporta essa funcionalidade.

Precisamos atualizar apenas alguns arquivos aspx ou aspx.cs ou editá-lo?
Web Site é a resposta, pois esse tipo de projeto tem o código fonte no servidor quando publicado. Quando necessário basta atualizar o arquivo sem a necessidade de atualizar o projeto.

Você pretende se conectar através do Visual Studio via FTP e editar seu projeto?
Se a resposta é sim, então você deve usar Web Site. E como a pergunta anterior à resposta é porque o código fonte do projeto fica no servidor.

Não quero deixar meu código fonte disponível no servidor.
Web Application é a resposta. Web Application são compilados e geram dll

Quero agilidade para atualizar meu projeto no servidor.
Se Web Application gera apenas dlls, para atualizar meu servidor é muito mais rápido do que Web Site, onde terei que subir todos meus arquivos aspx e aspx.cs.

Quero organizar minhas classes do meu jeito.
No projeto Web Site as classes são colocadas na pasta App_Code. Se quisermos criar uma organização própria é mais recomendado o Web Application.

Organização das Referências.
Web Site organiza as referencias do projeto no arquivo Web.Config, enquanto que Web Application realiza as referencias através da pasta References no próprio projeto.

Bem essas são algumas das diferenças entre Web Application e Web Site, cabe a você agora analisar e pesquisar para decidir qual opção utilizar em sua solução. Alguns membros da comunidade .NET acreditam que a Microsoft ira descontinuar o Web Site, porém eu não tenho essa informação.

Quando a mim, eu gosto de trabalhar com Web Application só acho uma pena não conseguir atualizar o code behind enquanto estamos depurando o código :D .

Obrigado e até a próxima.

Fonte: http://marquinhosnet.wordpress.com/

Diversos, Web

ExecCommand(”Copy”) no Firefox

May 31st, 2011

Muita gente já deve ter tentado criar um botão que copia o texto de um campo para a área de transferência do usuário (algo mais ou menos como a função abaixo). E muita gente já deve ter se frustado (assim como eu), pois isso não funciona no Firefox, por questões de segurança :’(

function CopiarTexto(){
var f=document.forms[0];
f.campoTexto.createTextRange().execCommand("Copy");
}

Bom, não sei se serve de consolo, mas é possível configurar o Firefox para aceitar o execCommand para copiar, recortar e colar.

Os passos são os seguintes:

1- Fechar o Firefox

2- Encontrar o diretório do Firefox, no Windows está em C:\Documents and Settings\<Windows login>\Application Data\Mozilla\Firefox\Profiles\<pasta>.

3- Abrir o arquivo user.js do diretório (se não encontrar o arquivo, crie um)

4- Adicionar as linhas ao final do arquivo:

user_pref(”capability.policy.policynames”, “allowclipboard”);
user_pref(”capability.policy.allowclipboard.sites”, “http://www.mozilla.org”);
user_pref(”capability.policy.allowclipboard.Clipboard.cutcopy”, “allAccess”);
user_pref(”capability.policy.allowclipboard.Clipboard.paste”, “allAccess”);

Claro que a solução citada não é satisfatória, pois desenvolvemos aplicações que devem funcionar sempre, independente de configuração do navegador do usuário.

Mas infelizmente é assim e ponto. Não tem nada que possamos fazer, a não ser dar um f.campoTexto.select() para ajudar o usuário, assim falta só ele entrar com o Ctrl+C.

Veja mais em http://www.mozilla.org/editor/midasdemo/securityprefs.html

Diversos, Software Livre, Web

A Volta da PSN

May 24th, 2011

Galera,

Juro que quando decidi comprar mais músicas para o Guitar Hero a PSN caiu… muito azar!

Mas sabe que esse tempo que a PSN ficou fora não foi tão ruim assim… deu pra jogar outros jogos que eu jogava pouco, ganhar mais troféus… enfim, nada traumatizante para mim… e ainda vou levar o Big Little Planet na faixa!

Agora quero ver quando volta a PS- Store para ver se compro minhas músicas…

Abaixo vídeo do Hitler nervoso que a PSN caiu:

http://www.youtube.com/watch?v=_ByXzi8CgdY&feature=player_embedded

E aqui o Dimitri descobre que a PSN voltou:

http://www.youtube.com/watch?v=CpyN2jucA4s

Muito criativos mesmo!

Abraços

Diversos, Games

Eisten, a teoria da relatividade e outros assuntos

May 17th, 2011

Fui numa palestra semana passada sobre Einstein e a teoria da relatividade… Incrível como sou fascinada nesse assunto!

O palestrante era nota 10, conseguiu explicar assuntos de extrema física de forma divertida.

Fui com uma amiga que (não deu outra!) dormiu logo de cara, enquanto ainda estávamos vendo sobre a vida de Einstein… outra colega comentou “Foi legal, pena que muito técnico…” enquanto eu já achei que ele explicou numa linguagem beeeem popular… heheheh

Bom, algumas pessoas já sabem, mas um de meus livros preferidos é “Uma breve história do Tempo”, de Stephen Hawking… quem ainda não leu, eu recomendo! super interessante!

Bjão pessoal!

Diversos, Física