Friday, July 31, 2009

[Soriano] Frases muito loucas, ditas por caras muito doidos...

E se o mundo todo fosse feito de bordéis? Os homens se matariam por um furinho na parede \o/ [Ferreira, Leandro Soriano]




Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Thursday, July 30, 2009

Eu? Nerd?

Tava aqui de bobeira, vendo twittadas, e resolvo seguir um link.



 


Vê se pode?



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Sunday, July 26, 2009

SCJP - 06 - Expressões Regulares

Quando eu vi isso pela primeira vez, eu gostei pra caramba. Usei isso bastante nos meus trabalhos de faculdade, porque costumávamos ler as entradas para nossos trabalhos de um arquivo de texto. Eram vertices e arestas de um grafo, pontos de controle para uma superfície em cálculo numérico, enfim, bastante coisa. E depois, o pouco conhecimento de expressões regulares serviu para validação e manipulação de strings em javascript.



Uma breve revisão de expessões regulares



Algumas coisas a gente pega fácil, como por exemplo, os metacaracteres. Existem alguns que precisamos entender para o exame. Temos o \d, que "casa" com todos os dígitos, tem o \s, que "casa" com espaço em branco, e o \w, que "casa" com todos os caracteres alfanuméricos (letras, números e o "underscore", o "_"). Tem o ponto (.) que funciona como curinga, ou seja, qualquer caractere "casa" com ele.



Tem os quantificadores, que servem para dizermos quantas vezes queremos que um padrão se repita na nossa expressão regular. Existe o +, que permite repetição de uma ou mais vezes aquele padrão, o *, para zero ou mais vezes, e o ?, para zero ou uma vez.



Com essas facilidades, nós conseguimos criar expressões como 0[xX]([a-zA-Z\d])+, que casa com números hexadecimais, ou \d\d\d\d[-\s]\d\d\d\d, que casa com telefones de 8 dígitos, separados ao meio por um hífem (-) ou um espaço em branco.



Você pode fazer um programinha que lhe ajude a brincar com casamento de padrões com duas classes do pacote java.util.regex: Pattern e Matcher.



import java.util.regex.*;

public class RegexMatcher {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println ("Passe padrão e entrada, "
+ "nessa ordem, como parametro");
} else {
System.out.println("Padrao: " + args[0]);
System.out.println("Entrada: " + args[1]);

Pattern pattern = Pattern.compile(args[0]);
Matcher matcher = pattern.matcher(args[1]);

while (matcher.find()) {
System.out.println("Inicio em: "
+ matcher.start()
+ " - Encontrato: "
+ matcher.group());
}
}
}
}




Bem, mas não foi bem essa a intenção desse post. Normalmente, eu crio estes posts da SCJP para coisas que eu ainda não sabia, ou coisas importantes que eu precisava frizar. Existem construções de expressões regulares conhecidas como gulosas (greed), relutantes (reluctant) e possessivas (possessive).



Pegue a entrada xxxxxyxyxyxxxyxxyxyxx e o padrão (.)*xx e veja o que o seu programa te retorna. Você teria, pelo menos, quantas possibilidades?



Uma coisa engraçada que acontece, é que quando eu vi isso pela primeira vez, eu tentava pensar em casamento de padrões como aquele problema conhecido de encontrar quantos triângulos existiam na imagem. A gente costuma usar os triângulos menores para formar triângulos maiores. Mas em expressões regulares, esse não é o default.





os resultados encontrados não são usados para formar novos resultados, não por default. Então, eu acho que teríamos apenas esses resultados:



xx
xx
xyxyxyxx
xyxx
yxyxx


Mas o seu padrão "engoliu" a entrada inteira (lá ele), não foi? Isso porque o programa olhou para toda a entrada antes de definir um "xx" como sufixo.



  • Usar ? é guloso. Usar ?? é relutante

  • Usar + é guloso. Usar +? é relutante

  • Usar * é guloso. Usar *? é relutante



Assim, se vc usar o padrão (.)*?xx como padrão, os resultados que vc vai encontrar vão ser diferentes de quando vc usou o padrão anterior (exatemente os mesmos resultados que eu mencionei acima). Usando expressões relutantes, a entrada inteira não é utilizada antes de avaliar o padrão.



Problemas entre expressões regulares e strings



Quando for criar expressões regulares, frequentemente você usará construções como \d, \s e \w. Provavelmente, vai criar construções como:



String patternString = "\d"; 
Pattern pattern = Pattern.compile(patternString);


Quando você tentar compilar isso, vai dar um erro. Por quê? o caractere "\" é usado em java como flag para uma sequência de escape, como "\n" por exemplo, que nos dá um enter. Daí, quando o compilador enxergar o "\d", vai tentar achar alguma sequência de escape pra isso e não vai encontrar, o que gerará o erro. Por isso, ao invés de "\d", você terá que usar um "\\d". O "\\" serve como uma sequência de escape para o "\".



No nosso programa anterior, usamos os argumentos passados via linha de comando diretamente na classe Pattern e Matcher. Se fossemos armazená-los em uma string, para depois incluirmos em tais classes, talvez precisássemos utilizar sequências de escape. Note também que se você precisar de espaços em branco na string usada como entrada de dados, envolva tal string com aspas (").



Classes Pattern e Matcher



Agora vamos analizar o programa anterior que nós usamos para testar as nossas expressões regulares. A classe Pattern serve para representar os padrões usados por nós. Para criar uma instância de Pattern, usamos o método estático Pattern.compile(). A classe Matcher serve para englobar a máquina de avaliação das expressões regulares, e para criar uma instância, você usa o método Pattern.macher(). O método Matcher.find() avalia/consome a expressão de entrada de dados e diz se ainda tem algum trecho que case com o padrão (retorna true, nesse caso).



import java.util.regex.*;

public class RegexMatcher {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println ("Passe padrão e entrada, "
+ "nessa ordem, como parametro");
} else {
System.out.println("Padrao: " + args[0]);
System.out.println("Entrada: " + args[1]);

Pattern pattern = Pattern.compile(args[0]);
Matcher matcher = pattern.matcher(args[1]);

while (matcher.find()) {
System.out.println("Inicio em: "
+ matcher.start()
+ " Término em: "
+ matcher.end()
+ " - Encontrato: "
+ matcher.group());
}
}
}
}


Quando o método find() retornar true, você pode usar o método start() para dizer onde o trecho que casa com o padrão se inicia, e o método end() para dizer onde ele termina. Novamente, o start() encara o inicio da string como 0, e o método end() encara o inicio da string como 1. O método group() retorna exatamente que trecho da expressão de entrada casou com o padrão, durante a execução do método find().



Obs.: Use o programa acima e padrões que usem quantificadores como * e ?, e avalie os resultados.



Casamento de padrões e a classe Scanner



Você pode usar a classe Scanner para ler a entrada de dados e buscar por determinado padrão usando o método Scanner.findInLine(). A classe Scanner não possui tantas funcionalidades quanto a classe Matcher, mas você pode usá-la para contar quantas instâncias de determinado padrão sua entrada de dados possui.



import java.util.regex.*;
import java.util.*;

public class RegexMatcher {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println (
"Passe padrão como parametro");
} else {
System.out.println(
"Padrao: "
+ args[0]);

System.out.print("input: ");
System.out.flush();
try {
Scanner scanner =
new Scanner(System.in);
String token = null;
do {
token = scanner.findInLine(args[0]);
System.out.println(
"encontrado: "
+ token);
} while (token != null);
} catch (Exception ex){
ex.printStackTrace();
}
}
}
}


Note que ao final da string que vc digitar como entrada, seu programa exibirá o null como token.





Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Thursday, July 23, 2009

Google - O Divino Oráculo de Delfos e meu blog

Eu aqui, de bobeira, enrolando um pouco antes de continuar lendo o livro da certificação... Resolvo abrir o Google Analytics só pra ver quantas visitas eu tenho a partir do momento em que eu resolvi contar. Fiquei até surpreso, mais ou menos 1.700 visitantes únicos... Mas o mais engraçado é ver o que as pessoas buscaram no google antes de chegar até meu blog.



As palavras chave "amarok não toca mp3" fazem meu blog aparecer na primeira página de resultados (grande coisa :D). Na verdade, é o primeiro resultado da primeira página :D. Tá, isso não é engraçado, continuemos com a lista. Alguma menina que gosta de metrossexuais como o David Beckham resolve procurar no meu blog por "emoticons do cristiano ronaldo".



Isso sem falar que alguma mãe deve ter se assustado depois de procurar "meu filho esta com amigdalite posso dar cetoprofeno" e ver as reações adversas que ele causava em mim. Tem gente que pensa que google é secretária, e pede com toda a educação: "procuro foto de uma erva chamada cansanção"



E um outro pervertido resolve procurar por "emoticons de gozada na cara". Isso, se não for o mesmo nerd também pervertido fã de naruto que resolve encontrar um tutorial pro jutsu "naruto gozada maxima", vê se pode? Tá, gente, eu sei que eu sou meio nerd, meio pervertido, e fã de naruto também, mas não chego a esse nível... Nem quero ter um cara desse como sensei. Tem também quem queira ficar com apenas um dos braços forte e queira dicas de como fazer um "plantao punheteiro"



Qualquer dia desses eu tiro um tempo pra fazer isso de novo e rir um pouco mais, foi divertido :D





Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Wednesday, July 22, 2009

[Detran] - Passei, porra!





Os postes que se segurem, porque eu tô solto na pista! :D Só queria saber onde foi que eu fiz essa tal conversão indevida, mas será que isso importa agora?



Rá!



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Monday, July 20, 2009

[Debian] AC'97 Audio Controler - Sem Som

Faz 4 dias que eu estou tentando instalar o debian no meu pc com audio funcionando. E confesso que só optei por uma distribuição linux porque é o único modo de baixar algum download pesado sem o meu modem resetar...



A principio, meu driver de som não funcionava. Não sabia como fazer funcionar, até que eu resolvo por a mão na massa.



root@leandro-pc:/home/sfohart# lspci -v | grep Audio
00:11.5 Multimedia audio controller: VIA Technologies, Inc.
VT8233/A/8235/8237 AC97 Audio Controller (rev 60)
Subsystem: Giga-byte Technology GA-7VAX Onboard Audio (Realtek ALC650)
Kernel driver in use: VIA 82xx Audio



Todo mundo falava para executar o alsaconf, comando do pacote alsa-utils. Mas acontece que a versão que eu estava (sim, eu disse estava utilizando era a alsa-utils-1.0.20, cujo comando foi extinto. Não lembro se essa era a versão padrão do cd do BrDesktop que eu baixei, ou se no meio dos aptitude dist-upgrade essa versão foi atualizada.



Até que eu resolvo reinstalar do zero ontem à noite, e instalar alguns pacotes somente hoje. Mudo meu sources.list para a lista abaixo:



deb http://linorg.usp.br/debian/ lenny main non-free contrib
deb-src http://linorg.usp.br/debian/ lenny main non-free contrib

deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free

deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free

deb ftp://ftp.debian-multimedia.org lenny main contrib non-free


E instalo os pacotes do alsa

aptitude install alsa-base alsa-utils alsa-tools


Pra minha surpresa, o alsaconf estava funcionando. Rodei-o e pronto, audio funcionando pro kernel 2.6.26-2-686. Mas peraeh, que versão do alsa-utils eu estou utilizando?



root@leandro-pc:/home/sfohart# dpkg -l alsa-utils
Desejado=U=Desconhecido/Instalar/Remover/exPurgar/H=Reter
| Estado=Não/Inst/arqs-Cfg/U=Descomp/Falhou-cfg/H=semi-inst/W=trig-adiado/Trig-pend
|/ Erro?=(nenhum)/H=Ret/precisa-Reinst/X=ambos-problemas (Est,Err: maiúsculas=ruim)
||/ Nome Versão Descrição
+++-===============-===============-===========================
ii alsa-utils 1.0.16-2 ALSA utilities




Então, se alguém tiver o mesmo problema que eu, usando o mesmo kernel, tenta um downgrade do alsa pra ver se resolve...



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

SCJP - 06 - Serialização

Fazia bastante tempo que eu não lia um capítulo da SCJP 6, mas como eu preciso retomar meus estudos, então, por tabela, tammbém preciso retomar minhas anotações/posts sobre o que eu andar lendo...



Em Ciência da Computação, no contexto de armazenamento e transmissão de dados, a serialização é o processo de salvar um objeto em um meio de armazenamento (como um arquivo de computador ou um buffer de memória) ou transmiti-lo por uma conexão de rede, seja em forma binária ou em formato de texto como o XML. Esta série de bytes pode ser usada para recriar um objeto com o mesmo estado interno que o original. [Wikipedia]


Você, estagiário (não tenho saudades dessa época), vai se lembrar de serialização quando estiver desenvolvendo alguma aplicação web, por exemplo. Eu nunca havia feito serialização manualmente até o momento em que eu li essa seção do livro da SCJP 6.



import java.util.*;
import java.io.*;

class Pessoa implements Serializable {
private String nome;

public Pessoa (String nome){
this.nome = nome;
}

public String getNome() {
return this.nome;
}

public void setNome(String nome){
this.nome = nome;
}

public String toString() {
String result = "nome: " + this.nome;
return result;
}
}

public class Principal {
public static void main(String[] args){
Pessoa pessoa = new Pessoa("Leandro");

String fileName = Pessoa.class.getName() + ".txt";
System.out.println("Antes da serialização - "
+ pessoa);
serializeObject(fileName, pessoa);

Pessoa pessoaNova =
(Pessoa) deserializeObject(fileName);
System.out.println("Depois da serialização - "
+ pessoaNova);
}

public static void serializeObject(
String fileName,
Object object){
try {
FileOutputStream fos =
new FileOutputStream(fileName);
ObjectOutputStream oos =
new ObjectOutputStream(fos);
oos.writeObject(object);
oos.close();
} catch (Exception ex){
ex.printStackTrace();
}
}

public static Object deserializeObject(String fileName){
Object object = null;
try {
FileInputStream fis =
new FileInputStream(fileName);
ObjectInputStream ois =
new ObjectInputStream(fis);
object = ois.readObject();
ois.close();
} catch (Exception ex){
ex.printStackTrace();
}

return object;
}
}


Execute esse código e abra o arquivo Pessoa.txt só por curiosidade. Note que você consegue entender parte do que foi escrito apenas por mera casualidade, pois o Java deve utilizar uma estrutura bem formada para organizar os dados de um objeto num arquivo.







Agora, vamos complicar. E se eu quiser que uma das variáveis de instância da classe Pessoa seja uma referência a outro objeto? Insira no código acima a classe Contato:



class Contato {
private String telefone;

Contato(String telefone){
this.telefone = telefone;
}

public String getTelefone(){
return this.telefone;
}

public void setTelefone(String telefone){
this.telefone = telefone;
}

public String toString() {
String result = "telefone: " + telefone;
return result;
}
}


Modifique a classe Pessoa:

class Pessoa implements Serializable { 
private String nome;
private int idade;
private Contato dadosContato;

Pessoa (
String nome,
int idade,
Contato dadosContato){

this.nome = nome;
this.idade = idade;
this.dadosContato = dadosContato
}

...

public int getIdade() {
return this.idade;
}

public void setIdade(int idade){
this.idade = idade;
}

public Contato getDadosContato() {
return this.dadosContato;
}

public void setDadosContato(Contato dadosContato){
this.dadosContato = dadosContato;
}

public String toString() {
String result = "nome: " + this.nome + "\n";
result += "idade: " + this.idade + "\n";
result += "contato - " + this.dadosContato;
return result;
}

}


E a classe Principal também:

public class Principal {
public static void main(String[] args){
Contato dadosContato = new Contato("9876-5432");
Pessoa pessoa =
new Pessoa("Leandro",23, dadosContato);
}

...
}


Agora tente executar novamente. Conseguiu? Eu acho que não...





Como você pode ver, o programa não consegue serializar a propriedade dadosContrato da classe Pessoa, porque a classe Contrato não é serializavel. Você conseguiria resolver esse problema, fazendo a classe Contrato implementar Serializable, mas e se não tiver acesso ao seu código fonte?



Incluindo o modificador de acesso transient à propriedade dadosContrato de Pessoa, você não salva o seu estado quando serializar a instância de Pessoa, acabando com o erro em tempo de execução. Entretanto, vale lembrar que nenhum construtor da classe a ser serializada é chamado, muito menos os valores atribuidos em tempo de declaração das variáveis de instância são usados, o que significa que as variáveis transientes são inicializadas com valores default.



Para testar isso, tente serializar a classe abaixo:



class Teste implements Serializable{
private transient int numero = 42;
private String texto;

Teste() {
this.numero = 25;
this.texto = "Mais um teste";
}

Teste(String texto, int numero){
this.texto = texto;
this.numero = numero;
}

public String getTexto() {
return this.texto;
}

public void setTexto(String texto){
this.texto = texto;
}

public int getNumero() {
return this.numero;
}

public void setNumero(int numero){
this.numero = numero;
}

public String toString(){
String result = "texto: " + this.texto + "\n";
result += "numero: " + this.numero;
return result;
}
}






Mas e se for justamente salvar esta propriedade não serializável o que você precisa?



Você pode, além de fazer esta propriedade virar transient, implementar um par de métodos na sua classe Pessoa, para serializar você mesmo os dados de Contato durante a serialização de Pessoa. Altere a classe Pessoa conforme código abaixo:



class Pessoa implements Serializable { 
private String nome;
private int idade;
private transient Contato dadosContato;

...

private void writeObject(ObjectOutputStream os) {
try {
os.defaultWriteObject();
Boolean checkDadosContrato =
(this.dadosContato != null);
os.writeBoolean(checkDadosContrato);
if (checkDadosContrato) {
os.writeObject(this.dadosContato
.getTelefone());
}
} catch (Exception ex){
ex.printStackTrace();
}
}

private void readObject(ObjectInputStream is) {
try {
is.defaultReadObject();
Boolean checkDadosContrato =
is.readBoolean();
if (checkDadosContrato) {
String telefone = (String) is.readObject();
this.dadosContato = new Contato(telefone);
}
} catch (Exception ex){
ex.printStackTrace();
}
}


Acho que agora você consegue executar o programa.





Tá quase acabando, prometo :D Vimos que nenhum construtor da classe serializavel é executado. Vimos que variaveis transientes não são salvas. Vimos como serializar uma propriedade não serializável. Mas e quando a super classe não for serializável? E quanto às variáveis estáticas?



Bem, variáveis estáticas não correspondemm ao estado do objeto (instância da classe) em si. Perceba que todas as instâncias de uma classe compartilham o mesmo valor de uma variável estatica. Que sentido faria salvá-la? E se duas ou mais instâncias de uma classe fossem salvas, qual valor para a variável estática seria utilizado?



Quanto à super classe não serializável... Bem, dissemos que o construtor da classe serializável não é chamado, nem as variáveis de instância são inicializadas com os valores descritos em tempo de declaração. Mas o construtor da primeira classe não serializável é chamado, que chama o construtor da sua super classe, e assim por diante. Quer tirar a dúvida?



class TesteBase {
private long numeroLongo = 100000L;
private String textoBase;

TesteBase() {
textoBase = "texto base";
}

TesteBase(long numeroLongo, String textoBase){
this.numeroLongo = numeroLongo;
this.textoBase = textoBase;
}

public String toString(){
String result =
"textoBase: " + this.textoBase + "\n";
result += "numeroLongo: " + this.numeroLongo;
return result;
}
}

class Teste extends TesteBase implements Serializable{
private transient int numero = 42;
private String texto;

Teste() {
this.numero = 25;
this.texto = "Mais um teste";
}

Teste(
String texto,
int numero,
long numeroLongo,
String textoBase){

super(numeroLongo,textoBase);

this.texto = texto;
this.numero = numero;
}

public String getTexto() {
return this.texto;
}

public void setTexto(String texto){
this.texto = texto;
}

public int getNumero() {
return this.numero;
}

public void setNumero(int numero){
this.numero = numero;
}

public String toString(){
String result =
"texto: " + this.texto + "\n";
result += "numero: " + this.numero + "\n";
result += super.toString();
return result;
}
}






Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Wednesday, July 15, 2009

Dia internacional do Homem

Meus caros amigos, muito cuidado ao soltar a tão famosa frase "hoje não é o meu dia". Por quê? E se esse dia for justamente o Dia Internacional do Homem?



O Dia Internacional do Homem é um evento internacional celebrado em 3 de novembro de cada ano. As comemorações foram iniciadas em 1999 pelo Dr. Jerome Teelucksingh em Trinidad e Tobago, apoiadas pela Organização das Nações Unidas (ONU), e vários grupo de defesa dos direitos masculinos da América do Norte, Europa, África e Ásia. [Wikipedia]



Se isso é "comemorado", como é que não passa nada na TV, nem em lugar nenhum? Fiquei sabendo dessa por acaso (valeu, Need for Speed!)



A Wikipedia diz que é 3 de novembro (mas ela não é fonte confiável). Se você for olhar a Wikipedia para a língua inglesa, é mencionado o dia 19 de novembro. Outras fontes dizem ser no dia 15 de julho, como a DHNet, mas não creio que esses sites também sejam confiáveis. Procurei no site da UNESCO BRASIL e da UNESCO internacional, mas não vi nada a respeito.



Lenda? O pior é que tem até site dedicado ao dia...



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Wednesday, July 8, 2009

[SCJP] Why this code printing false false?

Meu voucher chegou há pouco tempo, mais precisamente, na segunda (06/07/2009). E hoje, quando eu chego no trabalho disposto a recomeçar meus estudos, eu vejo um feed compartilhado por Raposo. A pergunta era: porque o código abaixo imprime "false false"?



Alguém consegue ler isso ai embaixo?



public class Fizz { int x = 5; public static void main(String[] args) { Fizz f1 = new Fizz(); Fizz f2 = new Fizz(); Fizz f3 = switchFizz(f1, f2); if(f1 == f3)f1 = f2; System.out.println((f2 == f3) + " " + (f2.x == f3.x)); } static Fizz switchFizz(Fizz f1, Fizz f2){ final Fizz z = f1; z.x = 6; return z; } }



A primeira coisa que eu fiz aqui foi formatar esse código... Fica bem mais fácil de ver. Não sei se no livro de onde isso ai foi tirado, o código tava formatado direitinho, mas enfim, facilita horrores...



public class Fizz { 
int x = 5;

public static void main(String[] args) {
Fizz f1 = new Fizz();
Fizz f2 = new Fizz();
Fizz f3 = switchFizz(f1, f2);
if(f1 == f3)
f1 = f2;

System.out.println((f2 == f3)+" "+(f2.x == f3.x));
}

static Fizz switchFizz(Fizz f1, Fizz f2){
final Fizz z = f1;

z.x = 6;
return z;
}
}


Fazendo isso, fica fácil ver o porque do código imprimir "false false". Após as linhas 5 e 6, f1 != f2 e f1.x == f2.x == 5, correto? Após a linha 7, f3 == f1 (veja a linha 15) e f1.x == f3.x == 6 (veja a linha 17).



Logo após a declaração das 3 variáveis locais, na linha 8, há uma condicional. Ela é processada, pois vimos que f1 == f3. Como resultado da linha 9, temos que f1 == f2 != f3, por assim dizer. A variável f2, que não foi alterada pelo switchFizz(), ainda possui f2.x == 5, o que nos leva a f1.x == f2.x = 5. E ainda temos f3.x == 6.



Ao chegar na linha do print, tempos (f2 == f3) com valor "false", e (f2.x == f3.x) com valor "false". Santo teste de mesa...



Fonte: CodeRanch



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Monday, July 6, 2009

[MAM-BA] Jam no MAM



Obrigado pela companhia.



Crédito: Leandro Soriano Ferreira




Fazia bastante tempo que eu não ia ao Museu de Arte Moderna (MAM) da Bahia. E também fazia bastante tempo que eu não ouvia Jazz, e o mesmo tempo sem ver o por do sol, idem sem tirar fotos de paisagens com minha câmera meia boca...





Eis que eu decido fazer tudo de uma vez só. Sábado eu fui lá no Parque das Esculturas. Resolvi registrar a minha própria visão de mundo, como antes...






Crédito: Leandro Soriano Ferreira





Crédito: Leandro Soriano Ferreira





Crédito: Leandro Soriano Ferreira





Crédito: Leandro Soriano Ferreira





Crédito: Leandro Soriano Ferreira


Concordo que ficar só tirando fotos de por do sol é relativamente chato, chega a parecer depressivo... Aproveitei pra ir curtir o Jam no MAM, que este ano completa uma década de existência. Som de primeira qualidade, feito por músicos de primeira qualidade. É tudo tão bem feito, que a gente chega a duvidar que é tudo mesmo improvisado.



Em música popular, como o jazz, jam significa tocar sem saber o que vem à frente, de improvisação. [Wikipedia]


E uma dose de humor, quando um bêbado meio maconhado grita, ao microfone, que o Esporte Clube Vitória tava tomando uma surra do Flamengo...



Quem quiser aparecer por lá...





Jam no MAM

Todo sábado, das 18h às 21h, no Estacionamento Inferior do MAM

Ingresso: R$ 4 inteira | R$2 meia

Informações: 3117–6065




Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Wednesday, July 1, 2009

[Carreiras e Certificações] Se estressar com o Chefe adianta?

Fazia um bom tempo que eu não lia um artigo do gênero. Apareceu ali, no meu Google Reader como quem não queria nada, e lá ia eu lendo um artigo realmente bom, em muito tempo, no que se refere a relações interpessoais no ambiente de trabalho.



O artigo ao qual eu me refiro é esse, escrito pelo Vinícius. Menciona, inclusive, a importância de perceber se seu chefe barra seu crescimento profissional propositalmente.



Daí eu resolvi correr atrás do artigo base deste aí, e acabei encontrando (graças ao Divino Oraculo de Delfos). Estava lá, no site da Você/SA, como descrito no blog do Vinicius. E no próprio site do tal de Roberto Shinyashiki, há um texto mencionando como demitir o seu chefe. No mínimo, curioso, não?



Boa leitura :)



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.

Portable Apps

Você quer usar seus aplicativos favoritos na sua pendrive, ou não tem permissão pra instalá-los no PC do trabalho? Pois seus problemas acabaram!



Já faz muito tempo que eu uso aplicações portáveis, tais como o Pidgin (mensageiro instantâneo multiprotocolo), ScreenHunter (para tirar screenshot de trechos da tela), entre tantos outros. Tem muita gente que utiliza distribuições Linux, e sente falta de seus aplicativos favoritos quando pega um Rwindows da vida (talvez o Windows 7 mude meu conceito)...



O site Portable Apps tem uma lista de versões portáveis (que rodam de uma pendrive) nos Rwindows da vida. Existe uma gama enorme de aplicativos, que vai desde players de video a aplicativos de escritório. Uma verdadeira mão na roda (de lá ele!) :D



Creative Commons License

Esta obra está licenciada sob uma Licença Creative Commons.