Thursday, January 29, 2009

[O Menino Amarelo] Extração dos Sisos.



Era uma vez, um menino amarelo. E naquela época, o menino amarelo usava aparelho. Havia ficado mais ou menos uns dois anos usando aquele treco nos dentes. Quando finalmente o tiraram da carceragem dentária, sua dentista lhe disse: Olha, você vai precisar extrair esses quatro dentes, tá? Senão a gente vai perder todo o nosso trabalho.





Eis o começo do martírio. Ele extrairia os quatro dentes, dois por vez, sempre do mesmo lado. Os dois primeiros até que foram bem tranquilos, anestesia dada sem problemas, nada de dor, nada de desconforto. Passado algum tempo (acho que mais ou menos um mês), lá ia o menino amarelo, de novo, extrair o resto dos dentes. Acompanhado de sua mãe, ele chega até a sala de espera do consultório.





Irmã da cirurgiã dentista?


Apesar da cirurgiã dentista ser um tanto volumosa, tinha mãos aparentemente leves. O menino amarelo descobriria que isso era tudo mentira (em que planeta a pata de um elefante é leve? oO)... O dente siso superior direito ela retirou sem maiores problemas. E lá vai ela remover o inferior. E cortava a gengiva daqui, e puxava o dente dali... E no meio do caminho a anestesia perdera o efeito e o menino amarelo urrava de dor na cadeira. Sentia-se numa mesa de tortura medieval, ou nas mãos da Inquisição. Pagaria todos os seus pecados naquele dia. Existia meio que uma simbiose entre o menino amarelo e a cadeira da dentista, era difícil saber onde terminava um e onde começava o outro...





Tadinho dele, gente...


Por mais que a dentista gorda parruda tentasse, ela não conseguia remover o dente do menino amarelo. Aparentando estar um pouco cansada, ela chama uma colega. Quando o menino amarelo olha para a tal colega, ele pensa: se essa, que é gorda forte, não conseguiu arrancar o dente, por que essa outra, que é 5 vezes mais magra, vai conseguir? O mais estranho foi ouvir da magrela a seguinte frase: eu acho que é a gengiva dele que tá doendo, você tá dando anestesia no osso?



Uma mistura de dor e ódio irradiava dos olhos do menino amarelo. Completamente imóvel na cadeira, uma gota de lágrima corria nos seus olhos. Depois de muito penar, o menino amarelo sente o seu dente trincar. Com um só puxão, a dentista gorda fofinha puxa a metade do dente, e num outro movimento de pulso, arranca as sobras do dente que ainda restava. Faz lá a sutura, como se tivesse costurando um bife a rolê, e ao final do procedimento, a magricela fala: me desculpe meu lindo, não foi por querer não, viu?



E naquele momento, o mundo parou. Imaginou trocentas maneiras de matar aquela mulher, mas nenhuma delas alimentaria a sua sede de vingança. No final das contas, desejou que ela tivesse estrias nos seios, celulite na barriga, e uma menstruação de 15 dias. Já estaria de bom tamanho... Ao sair completamente zonzo da sala, perguntou à sua mãe, num dialeto meio estranho: cadê todo mundo? As cinco pessoas que estavam na sala de espera há duas horas atrás haviam sumido. Até hoje ele se pergunta o porquê.





Wednesday, January 28, 2009

[O Menino Amarelo] Cuidado com o Cansanção!



Era uma vez, um menino amarelo. E o menino amarelo ia pra Bom Despacho (na Ilha de Itaparica) com seus pais, tias, avós e alguns amigos. E vocês sabem como é casa cheia: apenas um banheiro, muita gente, e a natureza às vezes nos traz a infeliz coincidência de duas ou mais pessoas quererem usar o banheiro ao mesmo tempo. Chato né?









Terminal Marítmo de Bom Despacho




Pois bem. Num daqueles dias, havia gente no banheiro. E como tem certas coisas que nem homem pode fazer ali atrás do poste, lá vai o menino amarelo se embrenhar no meio do mato, por detrás da casa, pra fazer o tal number two. Bem que a sua avó avisou: "Cuidado com o cansanção!". Pobre menino amarelo...





Isso é cansanção!

Não, cansanção não tem duas asas.




Caminhava ele cuidadosamente, tentando imitar as peripércias de Virgulino no meio da Caatinga, afastando as plantas com um rolo de papel higiênico. E lá atrás da casa ele acha uma clareirazinha, onde faz, à mãe natureza, o grande favor de adulbar-lhe o solo. Trabalho àrduo e prazeroso aquele, pois logo após se via a expressão de alívio no rosto do menino. Parecia que o raquítico garoto havia emagrecido mais três quilos... Nota mental: cuidado com os pastéis de mortadela presunto





Crianças, aprendam:

é mais ou menos assim que se caga no mato.

Cuidado pra não cagar nos pés!




Quando retorna ao interior da casa, o menino sente uma leve coceira em sua mão. Sua avó diz: menino, mija nessa mão, anda! Conselho: sempre acredite na sabedoria popular. Por quê? Leia isso. E coçava, e coçava de um jeito que era realmente irritante. Parecia que os espinhos do tal cansanção haviam ficado nas mãos do menino amarelo. E as mãos do menino inchavam, e inchavam, e ficaram de um jeito que seus pais foram obrigados a levá-lo de volta para Salvador.



Chegando lá, os médicos ficaram impressionados com o que a tal planta havia feito. O inchaço havia tomado tais proporções, que chegava ao antebraço. O menino amarelo sentiu medo quando os médicos comentaram que talvez fosse necessário fazer um corte na palma da sua mão, para que o inchaço cessasse. E mais ainda, ao ouvir que se o inchaço piorasse, talvez o braço inteiro tivesse gangrena.



Graças a Deus, o menino amarelo melhorou, e ainda possui seus dois braços, pra digitar, pra dirigir, pra jogar MMORPG, e pra tantas outras coisas :)





Tuesday, January 27, 2009

[O Menino Amarelo] Raiz forte



Era uma vez um menino amarelo. E o menino amarelo adorava comer. Fazendo hora até a seção de Homem Aranha começar, o menino amarelo vai até a praça de alimentação. Vê a Yang Ping e alguns outros restaurantes de comida japonesa. Daí ele pensa: por que não?



Vai até a Yang Ping e pede 6 peças de sabe-se lá o que. Eis que começa o seu pesadelo... Aquela seria a primeira vez que ele comeria salmão cru. Até que tinha um gosto legalzinho, mas nada comparado ao gosto do polvo. Vocês já comeram lagartixa congelada? É, o gosto é mais ou menos esse. Mas aí algo lhe chama a sua atenção.







Não gente, o menino amarelo não estava comendo sushi

no púbis de uma modelo japinha...

Mas isso seria muito interessante :)






Havia um troço meio esverdeado, ainda mais verde que o padrão do Palmeiras. Ele simpatizou com a cor daquilo... E ficou ali namorando, namorando aquela pasta verde, até que ele a pega com o hashi.





O menino amarelo treinou durante meses,

com duas canetas bic e uma borracha,

a arte milenar de se comer com pauzinho...


Namorou tanto a tal pastinha verde, que resolveu pô-la toda de uma vez na boca (lá ele). De início, parecia bala de gengibre, mas de repente, começou a esquentar. Parecia que o menino amarelo havia tomado um comprimido de Sonrizal sabor Pimenta Malagueta. Sua boca começou a espumar, e a babar, parecia que iria passar de amarelo ao Incrivel Hulk! As moças da limpeza passavam por ele meio que assustadas, meio que rindo, até que ele não a guentou e foi cuspir numa lata de lixo.





Raíz Forte: a tal pasta verde,

extrato de Hulk.


Demorou algum pouco tempo até se recuperar, comeu as outras 3 peças que lhe sobravam no prato, largou o hashi de lado e saiu correndo até o stand do Bobs mais próximo, pra pedir um Ovo Maltine Médio. Vai ver é por isso que até hoje ele meio que briga com a alface, o repolho, a couve, e tudo mais que lhe pareça verde...





Monday, January 19, 2009

[PapoDeHomem] Tapa na cara durante o Sexo

O PdH é um dos blogs que eu costumo ler todos os dias. Ou, na melhor das hipóteses, semrpe que tem posts novos, já que meu Google Reader vive aberto o dia todo. E hoje de manhã eu me deparo com um texto realmente interessante. Você, mulher, já levou um tapa na cara durante o sexo? Você, homem, já deu um tapa na cara durante o sexo?



Calma, calma, ninguém aqui está fazendo apologia ao sadomasoquismo... Nós sabemos que existem mulheres que nunca tiveram um orgasmo em toda a sua vida sexual, aquelas que encaram sexo como apenas mais uma das obrigações conjugais, ou como pura e simples demonstração de carinho, mas não como algo que pode (e deve) lhe dar prazer também. É importante que cada mulher se descubra intimamente antes, durante e após o sexo.



Sem mais delongas (porque eu não quero contaminar a opinião dos meus leitores - ??? - sobre o post do PdH), segue o link:



Tapa na cara durante o sexo: por que muitas mulheres gostam? - Parte 1



Bom proveito :)

Saturday, January 17, 2009

[O Menino Amarelo] A barra de chocolate



Era uma vez, um menino amarelo. E o menino amarelo pegava mulheres. Tá, tá certo, uma vez ou outra, mas pegava. Certa vez o menino amarelo arranjou uma namorada. E a namorada dele gostava de chocolate. Ela realmente gostava de chocolate...







Em algumas ocasiões, o beijo tinha gosto de chocolate. E tantas outras coisas tinham, literalmente, gosto de chocolate. Até que ela confessou que, dentre as prioridades na vida dela, chocolates tinham vantagem em relação a um namorado. Porque chocolate não vê futebol, porque chocolate não sente ciumes, porque chocolate não enche o saco sobre as roupas curtas, porque chocolate atura T.P.M, porque, porque, porque... Até que o menino amarelo teve uma idéia.







E ele viu o amor da namorada pelo chocolate. Era algo... promíscuo. E o menino partilhou dessa promiscuidade achocolatada por algumas horas. Destilou toda a sua raiva nas calorias ganhas com o chocolate, e perdidas com o beijo de sua namorada. Até que chegou a hora de se despedirem. Ele a levou para o ponto de ônibus, esperando que ele chegasse... E levou-o consigo para a sua casa, afim de realizar, enfim, o seu plano:





E o menino amarelo embriagou o chocolate. Deu-lhe doses e doses de álcool. Chegou ao ponto de servir-lhe álcool vendido em farmácia... E quando menos esperava, banhou o seu inimigo com o combustível da sua vingança. Foi até a cozinha... E acendendo um fósforo, lhe disse: Fiat jvstitia, rvat coelvm (Faça-se a justiça, mesmo que desabem os céus). E assim, era uma vez um chocolate...



P.S.: Qualquer dia desses eu penso numa vingança pro final da novela das 20h...





Remuneração Pretendida - Nunca pergunte por telefone.

Tá aí... Em todos os primeiros contatos de empregadores, por telefone, que eu já tive, pra todos eles eu perguntei quanto eles estariam dispostos a pagar para o candidato à vaga. E todos eles responderam com a mesma ladainha: não posso fornecer esse tipo de informação no momento...



Acho que minha cara de c* se parece com isso

Eu acho que minha cara de c*

meio que se parece com isso




Eu, com a minha cara de c*, às vezes deixo de ir para as entrevistas de emprego, com o pensamento retrógrado: tô há tão pouco tempo trabalhando nessa empresa... será que mais uma página da carteira de trabalho com só 3 meses de duração não vai queimar meu filme no mercado de trabalho? Sim, porque, querendo ou não, esse é o período de experiência de qualquer empresa. E se você sai nesse período, não há quem não pense: esse ai não durou muito tempo, tavam só esperando o periodo de experiência passar pra dispensar...



E aí, qualquer amigo meu que foi pra mesma entrevista de emprego, me solta a bomba: velho, eles disseram que pagam X.XXX,XX com contrato renovavel por x tempo... E a prova tava fácil... Seria um belo OWNED, se não fosse um FAIL

[A coisa rosa III] Manual Prático do pernoite a dois.

Fazia muito tempo que eu não ria tanto... Nem as piadas do nerdson, nem as tirinhas do Dr Pepper, nem o manual do cafajeste, nem as tolices do orkut... Nada disso conseguiu me tirar um riso daquele tamanho. E o mais engraçado é que eu conheço a figura! :)



E pra ajudar a divulgar, ai vai: Manual Prático Do Pernoite A Dois, por Mônica Paz. Manda ver, garota!

Friday, January 16, 2009

Tira a poeira das asas, meu anjo...

Tira a poeira das asas, meu anjo. O sol brilha tão lindo lá fora... Os pássaros cantam, as flores desabrocham, e há sorriso nos casais enamorados, deitados na grama do parquinho ali ao lado... As crianças brincam tão felizes, alheias a tudo... E por que as suas asas andam tão empoeiradas?



Tira a poeira das asas, meu anjo. Ainda há tanta coisa por fazer... Um filme engraçado a dois no cinema, uma bebida qualquer num barzinho diferente, um caminhar sem destino de mãos dadas ao vento... Aqueles dois idosos parecem ignorar que já passaram por tanta coisa juntos, olha só o sorriso deles, tá vendo?



Tira a poeira das asas, meu anjo. Não se entrega... Não me dá a opção da escolha, ainda prefiro que você lute... É tão lindo o brilho que sai dos seus olhos quando você sorri... O teu toque fica tão mais macio, o seu abraço fica tão mais quente... O teu beijo fica tão mais doce...



Tira a poeira das asas, meu anjo, já tá na hora de voltar a voar...

SCJP - 02 - Herança e relações TEM-UM e É-UM

Olá, meus caros! Estou eu aqui continuando com os meus estudos (parcos e espaarsos) para a certificação (cujo voucher eu nem adquiri ainda). O engraçado é que a gente passa por alguns tópicos, acha que sabe tudo sobre eles, e é induzido inconscientemente a pulá-los. Conselho: não façam isso :D Lendo o primeiro tópico do segundo capítulo, me deparei com dois conceitos. IS-A (é um) e HAS-A (tem um). Não, minha gente, isso não tem nada a ver com métodos acessores (getters e setters), ou com coleções (contains()). Isso tem mais a ver com UML :) Como nós programadores java sabemos, existe uma palavra chave chamada instanceof, que nos diz se um objeto é instância de uma determinada classe.




class Veiculo implements Serializable{}

class Carro extends Veiculo {}

public class Teste {
public static void main(String[] args) {
Carro carro = new Classe();
if (carro instanceof Carro ) {
System.out.println("carro é uma " +
"instância de Carro");
}

if (carro instanceof Veiculo) {
System.out.println("carro é uma " +
"instancia de Veiculo");
}

if (carro instanceof Serializable) {
System.out.println("carro é uma " +
"instancia de Serializable");
}

if (carro instanceof Object) {
System.out.println("carro é uma " +
"instancia de Object");
}
}
}
A gente já sabe qual vai ser a saída disso ai em cima né? Isso mesmo. Todas as saídas de texto vão ser exibidas. Com isso, a gente diz que se Carro herda de Veiculo, então um Carro é um (IS-A) Veículo. E como Veiculo implementa Serializable, então Veiculo também IS-A Serializable (eu escolhi essa interface porque eu não tava com muito saco de implementar métodos :)) Para o HAS-A, dêem uma olhada no código abaixo:
class Banco {
private Conta conta;
public void deposito(Double valor) {
conta.deposito(valor);
}
}

class Conta {
public void deposito(Double valor) {
//Faz o deposito
}
}
Neste caso, nós dizemos que um Banco tem uma (HAS-A) Conta porque a classe Banco tem uma referência para um objeto da classe Conta, e nada mais. Assim, um Banco pode invocar os métodos de uma Conta e ter o comportamento de uma Conta sem ter qualquer relação com seu código. Talvez vocês me dissessem: "ah, mas isso são só conceitos, não são aplicados assim tão frequentemente..." Bem, tem certeza? Dá uma olhada no padrão de projeto Business Delegate então... Em suma, esse padrão funciona como um ponto de acesso entre a camada de visualização (seja numa aplicação web, desktop, mobile, etc) e a camada de negócios. O que este padrão é, senão um exemplo de utilização do conceito HAS-A? ;) E quanto ao IS-A? Você nunca se deparou com a situação abaixo?
import java.util.List;
import java.util.ArrayList;

class Veiculo{}

class Carro extends Veiculo {}

public class Teste {
public static void main(String[] args) {
List<Veiculo> veiculos =
new ArrayList<Veiculo>();

veiculos.add(new Veiculo());
veiculos.add(new Carro());
}
}
Carro é um Veiculo, e por isso, ele pode ser adicionado à lista sem problemas. O casting da subclasse para a superclasse é feito automaticamente, e é o conceito de IS-A que justifica isso. Pois é, minha gente... Tem muito conceito que a gente até sabe, devido ao nosso trato diário com a linguagem, mas que a gente precisa formalizar, pra poder aplicar no exame :)



SCJP - 02 - Encapsulamento

Eu realmente pensava que o gerador de código do Eclipse era bacaninha... Mas de vez em quando ele faz umas coisas meio toscas, que dão trabalho pra gente descobrir depois :(





Dessa vez é rápido. Bem rápido. Digamos que você tem uma determinada classe persistente do Hibernate:



public class Pessoa {
private Pessoa pai;
private Pessoa mãe;
private String nome;
private Date nascimento;

//Getters e Setters

}


Talvez, ao você mandar que a sua IDE implemente os demais métodos (gets, sets, equals e hashcode), você se depare com uma construção parecida no equals():



public boolean equals(Object obj) {
if (this == obj)
return true;
if (! super.equals(obj))
return false;
if (! getClass().equals(obj.getClass()))
return false;

Pessoa other = (Pessoa) obj;

...

if (pai == null) {
if (other.pai != null)
return false;
} else if (pai.equals(other.pai))
return false;

...
}




Suponha que a variável de instância pai seja mapeada como um relacionamento lazy-load, ou seja, carregado do banco somente quando explicitamente necessário. Agora imagine duas instâncias da classe Pessoa, que nós chamaremos de a e b. De maneira semelhante, imagine que ambas, a e b apontem como pai uma mesma instância da classe Pessoa, aqui chamada de c.



Em algum momento dentro do seu código fonte, você fez uma chamada ao método getPai() na instância a. Devido ao lazy-load, o hibernate se encarregaria de carregar este relacionamento para você. Mas o que ocorreria quando você realizasse um a.equals(b)? A variavel de instância a.pai já estaria carregada, e referenciando c, enquanto que b.pai ainda não estaria inicializada, referenciando null. E então, ao passar pelo trecho de código do método equals mostrado acima, o resultado do equals() seria false, apesar das linhas da tabela Pessoa, referentes às nossas instâncias a e b estarem referenciando o mesmo pai.



Isso tudo, porque durante a geração de código, sua IDE não realizou o encapsulamento das variáveis membro. É isso mesmo ou eu fiquei bêbado com 500 ml de suco de laranja hoje? Eu sempre achei que o equals() acima deveria, na verdade, ser o abaixo:





public boolean equals(Object obj) {
if (this == obj)
return true;
if (! super.equals(obj))
return false;
if (! getClass().equals(obj.getClass()))
return false;

Pessoa other = (Pessoa) obj;

...

if (getPai() == null) {
if (other.getPai() != null)
return false;
} else if (getPai().equals(other.getPai()))
return false;

...
}

Wednesday, January 14, 2009

SCJP - 01 - Mais sobre os enums

Não sei dos outros programadores java auto-didatas, mas eu sempre guardei em mente que os enums não passavam de uma coleção de constantes com um label associado a cada uma delas. E é interessante como a gente muda de conceito, ou aprende mais sobre tal, lendo uma fonte com um foco direcionado. Pois bem, um enum não é só isso. Ele é um tipo especial de classe, que pode possuir construtores, membros e métodos.





Tudo isso é mostrado no trecho de código a seguir

enum Nivel {
FACIL(10),
INTERMEDIARIO(20),

/**
* O "{" inicia um bloco de código que define
* o "corpo" dessa constante
*/
AVANCADO(40) {
public String getMensagemVitoria() {
return "Parabéns! " +
"Você venceu todos os níveis!";
}
};

/**
* Mais código fonte virá a seguir,
* por isso é necessario o ";"
*/

private int pontuacao;

//definição do construtor para o enum
Nivel(int pontuacao) {
this.pontuacao = pontuacao;
}

public int getPontuacao() {
return pontuacao;
}

/**
* Comportamento padrão para o método
* que dá a mensagem de vitória
*/
public String getMensagemVitoria() {
return "Parabéns, " +
"você avançou para o próximo nível.";
}
}


Palma, palma (cara pálida), não priemos cânico! Quando nós iniciamos os estudos sobre o enum, normalmente vemos algo parecido com:

enum Nivel {
FACIL,
INTERMEDIARIO,
AVANCADO
}


E nós usamos isso apenas para identificar o tipo de alguma coisa. Nesse caso, tipos de níveis, mas poderiam ser tamanhos de café, de roupa, tipos de estratégia de ordenação de vetores, ou qualquer outra coisa enumerável, e então atribuir a variáveis, como abaixo:



Nivel nivelAtual = Nivel.AVANCADO;




Mas, como no primeiro trecho de código deste post, nós podemos também usar variáveis membro num enum. E como nós o encaramos como constantes, não acho muito aconselhável a existência de um método set() para suas variáveis membro. Note que, para o nível AVANCADO, o comportamento padrão do método getMensagemVitoria() é alterado. Além disso, o fato de não haver um public antes do construtor ajuda a entender o porquê dele não ser acessado diretamente. Também é possivel iterar sobre um enum. Isso é possível porque todo enum possui um método estático chamado values(), o qual retorna um array de valores do enum, ordenados segundo a sua declaração:



for (Nivel nivel : Nivel.values()) {
System.out.println(nivel + " dá " +
nivel.getPontuacao() +
" pontos.");
}


O trecho de código acima produz a seguinte saída:



FACIL dá 10 pontos.
INTERMEDIARIO dá 20 pontos.
AVANCADO dá 40 pontos.




SCJP - 01 - Método com lista de argumentos variável

Mais uma vez, estudando (pouco, mas estudando) pra certificação. Vi que em java, a partir da versão 5, é possível fazer um método com lista de argumentos variável, como em C/C++ (faz muito tempo que eu não programo nessas linguagens)...





public void metodo(Object... args)




Observe como o método é declarado. O tipo dos argumentos (no caso, Object), seguido de reticências, e logo após um identificador para a lista (nesse caso, args). A lista de argumentos pode ser iterada dentro de um for each, como abaixo:



public void metodo(Object... args) {
for (Object obj : args) {
//Faça alguma coisa...
}
}




Somente é possivel declarar UMA lista de argumentos variável por método. Além disso, essa lista necessita ser o último parâmetro do método, como no código exemplo abaixo





public void outroMetodo(int x, char y, byte... w)




Monday, January 12, 2009

Espaço Unibanco de Cinema

Mais um post corrido. Lembrei (não, dessa vez não foi de ninguém em especial) das minhas caminhadas Comércio-Lapa, quando passei pela Praça Castro Alves e vi que um cinema novo estava pra ser inaugurado. Era o Espaço Unibanco de Cinema. Ainda não entrei no espaço, mas parece ser um lugar bem bacana, a exemplo dos cinemas do circuito da Sala de Arte. O link para o site do Espaço Unibanco de Cinema segue abaixo:


E, como antes, façam bom proveito :)

Funcação Cultural

Olá de novo meu povo! Achei que devia dar mais essa dica... Não, não tem nada a ver com informática dessa vez. Lembrei de Ricardo (de novo, e antes que falem: eu sou macho!)... Ele sempre aparecia com a agenda cultural, com dicas legais de cinema, arte, teatro, música, etc, etc... E como essa agenda é recompilada (ai merda, la vou eu de novo) mensalmente... O link do código fonte vai ai embaixo



http://www.fundacaocultural.ba.gov.br/agendacultural/index.htm



Façam bom proveito :D

Friday, January 9, 2009

SCJP - 01 - Métodos protegidos versus controle de acesso padrão

De bobeira mais uma vez, e continuando a fazer as minhas notas de estudo, eu achei mais uma coisa que, pelo menos eu, não estava acostumado a ver. Quando queremos definir o controle de acesso a membros e métodos, normalmente nós usamos 3 palavras chave: public, private e protected. Mas alguém tem noção do que acontece se, por acaso, nenhum dos três é definido?







Pois bem, estudando pelo livro da certificação, eu matei a curiosidade. Protected e default (quando você não define nenhum controle de acesso) tem algo em comum. Dê uma olhada nas duas classes abaixo:



package pacote;

public class A {
void algumMetodo() {
System.out.println("teste");
}
}




package outropacote;

import pacote.A;

public class B {
public static void main(String[] args) {
A a = new A();
a.algumMetodo();
}
}




Como você pode perceber, o método algumMetodo() da classe A é marcado como acesso padrão: sem nenhum modificador de acesso. Pense nisso como controle de acesso a nivel de pacote, isto é, o método em questão só pode ser acessado por classes no mesmo pacote da classe A. Um erro ocorre ao se tentar compilar o código acima:



No method matching algumMetodo () found in class
pacote.A. a. algumMetodo ();




No quesito herança, um método ou membro com controle de acesso padrão só é acessivel por subclasses se estas estiverem no mesmo pacote que suas superclasses.





Thursday, January 8, 2009

SyntaxHighlighter no Blogger

Tá, tá, eu sei, já existem muitos tutoriais para o SyntaxHighlighter por ai na internet. Mas, como vocês podem ver no ultimo post, só agora eu o coloquei no blog. Estou colocando aqui um post pra me lembrar dos passos que usei pra que este script funcione corretamente, pois mesmo seguindo os tutoriais encontrados por ai, não foi lá muito facil.
Vamos lá.  Vá no Painel do Blogger, selecione Layout e depois Editar HTML. Aqui começa a diferença. Os outros tutoriais pedem pra vc hospedar os arquivos .js em algum lugar, e apontar pra eles do seu blog. Mas por que não  usar o próprio repositório SVN do SyntaxHighlighter? Copie o código a seguir e cole antes da tag </body>


<link href='http://syntaxhighlighter.googlecode.com/svn/trunk/Styles/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCpp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJava.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushSql.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPhp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCss.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJScript.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCSharp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushXml.js'/>

<script class='javascript'>
//<![CDATA[
function FindTagsByName(container, name, Tag)
{
var elements = document.getElementsByTagName(Tag);
for (var i = 0; i < elements.length; i++)
{
if (elements[i].getAttribute("name") == name)
{
container.push(elements[i]);
}
}
}
var elements = [];
FindTagsByName(elements, "code", "pre");
FindTagsByName(elements, "code", "textarea");

for(var i=0; i < elements.length; i++) {
if(elements[i].nodeName.toUpperCase() == "TEXTAREA") {
var childNode = elements[i].childNodes[0];
var newNode = document.createTextNode(childNode.nodeValue.replace(/<br\s*\/?>/gi,'\n'));
elements[i].replaceChild(newNode, childNode);

}
else if(elements[i].nodeName.toUpperCase() == "PRE") {
brs = elements[i].getElementsByTagName("br");
for(var j = 0, brLength = brs.length; j < brLength; j++) {
var newNode = document.createTextNode("\n");
elements[i].replaceChild(newNode, brs[0]);
}
}
}
//clipboard does not work well, no line breaks
// dp.SyntaxHighlighter.ClipboardSwf =
//"http://marcin.doman.googlepages.com/clipboard.swf";
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll("code");
//]]>
</script>


Feito isso, vc ja pode ver o código fonte formatado mais ou menos como vc quer no seu post. Caso nao esteja funcionando corretamente no firefox, mova o trecho


<link href='http://syntaxhighlighter.googlecode.com/svn/trunk/Styles/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCpp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJava.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushSql.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPhp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCss.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJScript.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCSharp.js'/>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushXml.js'/>


para antes da tag </head>, depois abra o arquivo


http://syntaxhighlighter.googlecode.com/svn/trunk/Styles/SyntaxHighlighter.css



Copie o conteúdo e cole entre as tags <style class="text/css"></style> de forma que fique antes os js's acima citados. Feito isso, remova a tag abaixo do código


<link href="http://syntaxhighlighter.googlecode.com/svn/trunk/Styles/SyntaxHighlighter.css" rel="stylesheet" type="text/css"></link>


Caso o seu blog exiba imagens de fundo para as tags <li>, você, além de inserir manualmente o css, como no passo anterior, também precisa adicionar o trecho


div.dp-highlighter li {
background-image: none;
}
Se você abrir o mesmo post no firefox e no IE, por exemplo, perceberá que existe um link para "copy to clipboard". No firefox, mesmo que vc o insira manualmente (usando o ClipboardSwf, como mostrado abaixo),


dp.SyntaxHighlighter.ClipboardSwf = "http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/clipboard.swf"
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll("code");


ele não funciona. Bem, é isso... Espero que quem tenha encontrado dificuldades como eu consiga resolver (ainda que parcialmente) os problemas com esse tutorial meia boca ;)

SCJP - 01 - Declarações e Controle de Acesso

Eu resolvi começar a estudar para a certificação java, depois de ouvir conselhos de diversos amigos sobre como isso me daria vantagens no mercado de trabalho. Um colega de faculdade (dale Gabriel Santana) me passou o pdf do SCJP Sun Certified Programmer for Java 6 (in english) e a partir de agora (e enquanto durar a motivação) eu vou postar aqui algumas das minhas notas de estudo em relação ao assunto. Para facilitar a localização, eu colocarei no começo de cada post a sigla SCJP, seguida do número de um capítulo, seguido de um título, que definirá o tópico correspondente no livro da certificação :)





A primeira delas se refere a algo que eu não me atentava a pensar. Normalmente, a primeira coisa que fazemos quando declaramos uma classe java é:



public class AlgumaClasse {
}


E ai está o modificador. Nós colocamos lá um public no começo da declaração da classe de modo tão automático que nem percebemos quais outras possibilidades nós temos... Segundo o livro da certificação, quando nós não colocamos nenhum modificador de acesso, por default a classe declarada só é visivel dentro do pacote em que ela está. Exemplificando: Se temos duas classes como abaixo...



package um.pacote;

class ClasseA { }
package outro.pacote;

import um.pacote.ClasseA;

class ClasseB extends ClasseA { }


Note que a superclasse (ClasseA) não está no mesmo pacote da classe derivada (ClasseB). Neste caso, ao se tentar compilar o código fonte, um erro semelhante a esse seria mostrado no console:



Can't access class um.pacote.ClasseA. Class or interface must be
public, in same package, or an accessible member class.
import um.pacote.ClasseA;




Declarar qualquer classe como pública dentro de um pacote a torna visível a todas as classes, de todos os pacotes. Isso também a torna extensível a todas as classes, exceto aqueals declaradas como final:



package um.pacote

public final class ClasseA { }


package outro.pacote

import um.pacote.ClasseA;

class ClasseB extends ClasseA { }




Tentar compilar um código como este nos daria um erro semelhante ao abaixo:



Can't subclass final classes: class
um.pacote.ClasseA class Tea extends ClasseA {
1 error




Mas... Por que declarar uma classe como final? Segundo o livro, você só deve declarar uma classe como final se você quiser a garantia absoluta que nenhum dos seus métodos será sobrescrito. Isso ocorre com algumas classes da api Java, como por exemplo a classe String (tente procurar o seu código fonte). Entretanto, isso fere um dos pontos chave da Programação Orientada a Objetos (POO): extensibilidade. Assim, esta característica só deve ser utilizada em casos específicos, devendo você assumir, para todos os outros casos, que algum programador irá extender alguma de suas classes algum dia...





Translation Bots - Google Talk

Dale Raposo! Foi ele quem me deu a dica... Adicione estes contatos no seu google talk pra ter em mãos a facilidade dos tradutores do google...





en2pt@bot.talk.google.com
pt2en@bot.talk.google.com


A lista completa pode ser conferida neste endereço:


http://www.google.com/support/talkgadget/bin/answer.py?hl=en&answer=89921#

 

Saturday, January 3, 2009

Feliz 2009

Feliz 2009 a todos (??) aqueles que lêem (ou leem?) o meu blog (oO). Como foi o ano novo de vocês? O meu foi razoável, faz muito bem passar 4 dias no meio do nada! Fui parar em Saubara:


Exibir mapa ampliado



Longe né? Pois é... Lá eu pude ver coisas bem interessantes, que meninos amarelos, nerds (qualquer semelhança não é pura coincidência) não tem costume de ver. Alguém de vcs já viu de onde se tira um abacaxí?











Ou quem sabe um pé de pinha (pinha? mãe o que é isso?)




A gente acha outras coisas interessantes por lá. Acreditem, baiano trabalha, e muito! Como eu sei disso? Não, não é porque eu sou baiano, mas olhem só isso:

Viram só? Depois ficam falando que baiano é preguiçoso. E tem mais... Agora é possivel ir de ônibus para o além!
Dessa cidade (distrito, municipio ou sei la o que) eu quero passar bem longe! Depois de ver coisas legais e esquisitas como essas, a gente volta bem relaxado...