quarta-feira, 31 de dezembro de 2008

Desenho do Tux, o Mascote do Linux

O Tux é aquele simpático piguim, mascote do Linux. Não consigo imaginar qualquer programa ou sistema em todo o mundo que tenha um mascote tão famoso e admirado como o Tux. Assim, para divertir os camaradas leitores, estou postando uma série de fotos e links de galerias, onde é possível encontrar o Tux incorporando os mais diversos personagens...

  • Detalhes Históricos
O Tux foi criado por Larry Ewing durante a lista de discussões do Kernel do Linux, em 1996, a partir de uma sugestão inicial de Alan Cox e posteriores sugestões do próprio Linus Torvalds, o criador do Linux. Conta-se que Linus estava visitando a cidade australiana de Canberra, quando (talvez num zoológico) teria sido mordido acidentalmente por um pinguim. Como já alegava paixão por aves marinhas gordas que não voam, não teve dúvida: o mascote seria um pinguim gordinho, feliz e simpático!! Mais detalhes, vide aqui.

Ache as imagens oficiais aqui, incluindo uma versão em postscript.
Curiosidade: apesar de poucos saberem, existe uma espécie de pinguim que voa!! Veja o vídeo aqui!!

Aqui seguem algumas fotos do Tux:

Rasta Tux
Baby Tux

Tux Skywalker


WolfeTux

Tux Croft

Tux Sparrow

Tuxtaruga Ninja

Tux Naruto

Pink Tux, para as meninas!!

Se você está se divertindo, veja a infinidade de personagens do Tux, desde Mestre Yoda até Charles Chaplin, passando por Super Man, Super Mario, C3PO e até Coca-Cola (!!) nas galerias abaixo:

http://www.junauza.com/2008/03/30-coolest-and-funniest-tux-icons.html
http://linux.meuhobby.com/index.php?pag=galeriatux.html
http://www.gnu.org/graphics/3dbabygnutux.html
http://tux.crystalxp.net/en.id.1763-fcys14-tux-rasta-bob.html
http://stoa.usp.br/gnusp/files/306


Beleza, pessoal!! Boa diversão!!

terça-feira, 30 de dezembro de 2008

Como recuperar partição Reiserfs com bad blocks?

Este é um assunto interessante: às vezes, tudo está bem com seu sistema... está tudo configurado, rodando, indo às mil maravilhas!! Porém, ninguém escapa do infortúnio de um defeito físico no disco rígido, não é mesmo?? E ele é como aquelas visitas mensais de sua namorada ou esposa: vem sempre no pior e mais inesperado momento, sem aviso, e te pega num golpe baixo, onde você terá de ser hábil para não por tudo a perder...
Daí você se lembra das recomendações do Pajé descritas neste artigo, e fica tranquilo, pois ainda há luz no fim do túnel!!

  • Do que Trata Este Artigo?

Apesar de ser destinado àqueles que utilizam partições com sistema de arquivos ReiserFS, as recomendações aqui descritas podem ser parcialmente aplicadas a problemas com outras partições.

  • Quais os Sintomas, Doutor?

O computador está trabalhando bem mas, de repente, você obtém uma mensagem de algum aplicativo dizendo que houve erro de entrada e saída (I/O, o famoso Input/output error). Isto pode acontecer a qualquer momento: durante o uso ou mesmo durante a inicialização do sistema.

  • O Que Fazer Agora?

A primeira dica é a mais importante de todas:
  1. Se você está trabalhando, interrompa tudo o que você está fazendo e salve todos os seus trabalhos, desligando o micro em seguida. Se estava apenas utilizando o micro, desligue-o imediatamente. Isto é o mais importante porque evita que você perca seus dados. Erros de Input/output podem provocar que programas inteiros travem e/ou fechem, e você não gostará de se encontrar trabalhando quando, inadivertidamente, tudo travar durante alguns minutos e fechar repentinamente.
  2. Pegue um CD de resgate de sua distribuição. Pode ser um CD do Kurumin, do Ubuntu, do SuSE ou de qualquer outra distribuição que tenha as ferramentas de seu sistema de arquivos (no nosso caso, o ReiserFS), e que seja capaz de iniciar pelo CD, ao menos em modo texto. Acredite se quiser, existem distribuições de Linux especializadas nisto, pequenas o suficiente para iniciar facilmente pelo CD e contendo, todavia, milhares de ferramentas de recuperação. Acredito ser interessante citar o SystemRescueCD.
  3. Se você conseguir, monte a sua partição como somente leitura e faça backup de todos os seus dados pessoais e arquivos de configuração. Só isto já é um alívio! Pode ser para CD, DVD, Pen Drive, Fita, outra partição (se no mesmo disco, desaconselhável...), o que for... mas faça o backup. Não esqueça as tabelas do MySQL, aqueles arquivos que você cisma em colocar no /tmp, apesar de não ser recomendado, e os favoritos do Firefox.

  • Copiando a Partição com o dd
Se a coisa ficou realmente feia e você sente aquele frio na espinha, lembre-se de que você pode criar uma imagem de sua partição, lendo o que for possível, e tentar recuperar depois com as ferramentas do Reiser. Use esta técnica se você notar que a partição defeituosa não monta, mesmo que somente leitura, ou monta mas não lê devido a milhares de erros de leitura. Siga estes passos:
  1. Crie, em outro disco, preferencialmente, outra partição com o mesmo tamanho da partição defeituosa;
  2. Copie bit a bit a partição defeituosa para a recém-criada, com o comando dd abaixo:
# dd if=/dev/hda1 of=/dev/hdb1 bs=4k conv=noerror,sync

Explicando o comando:
if-> partição defeituosa, usada como entrada de dados. No nosso caso, o /dev/hda1 (não é /mnt/hda1!!!!);
of -> partição de destino, preferencialmente em outro HD, já que o primeiro não tem mais a nossa confiança...
bs -> é o tamanho do bloco de leitura do dd ("block size"). Lembre-se de que, quanto menor o tamanho, maior a precisão da leitura, permitindo recuperar mais dados. No entanto, quanto menor o tamanho, mais chances de se esbarrar e setores ruins e mais lenta será a recuperação (experimente bs=1024 e veja que lerdeza não será este procedimento...). Acredito que você deva começar com um tamanho otimista, pequeno, como o sugerido e, se a leitura se tornar insuportavelmente lenta, aumente o tamanho. Você poderá perder mais informações, mas vai pular muito mais setores ruins, fazendo a cópia bem mais rápido. Dica: não seja tão radical aqui. Você vai perder alguma coisa, mas o importante é recuperar a maioria dos dados.
conv -> Estas opções acima foçam que, havendo erro de leitura, o bloco será pulado e, em seu lugar, na partição de destino, será gravado um bloco com bytes zerados. Esta é uma maneira de remediar o irremediável: pula-se o que não será lido mesmo e ganha-se tempo.

Se seus dados são realmente muito importantes e você tem que garantir a cópia fiel do máximo possível deles, custe o que custar, então utilize este comando:

# dd_rescue /dev/hda1 /dev/hdb1

O comando dd_rescue acima é mais eficiente que o dd, nesta conjuntura. Ele lê blocos maiores, de 64kB, porém apenas quando a leitura funciona. Se houver erro de leitura, o bloco gigantesco de 64kB é quebrado em frações mínimas de 512 bytes, onde será lido e gravado o que for possível. Assim, você terá um desempenho maior para setores sem defeitos (64kB vai, a passos largos, mais rápido que 4kB) e, todavia, garante que, nos lugares problemáticos da superfície de seu disco, a leitura tentará ser tão detalhada quanto possível, ainda que tome muito tempo. Uma alternativa mista, ainda, é o dd_rhelp, que roda o dd_rescue várias vezes, procurando balancear entre a perda de tempo e a eficiência de recuperação de dados.

Verifique mais informações:
na página do dd_rescue:
http://www.garloff.de/kurt/linux/ddrescue/
na página do dd_rhelp:
http://www.kalysto.org/utilities/dd_rhelp/index.en.html

  • Recuperando a Partição
E agora, o que temos?? Bom, temos uma imagem da partição defeituosa, feita com alguns problemas durante a cópia, porém escrita sobre um disco de superfície perfeita, intacta, funcional e límpida como a aurora orvalhada da primavera... basta, então, tentar recuperar o possível.

  1. Com a partição desmontada, rode o tradicional: reiserfsck --check /dev/hda1.
  2. Provavelmente não funcionará, mas não se desespere... agora você não tem setores ruins, apenas seus dados não foram bem gravados. Então, vamos pedir ao sistema que reconstrua a sua árvore com a estrutura de seus dados, para poder montar e usar sua partição:
reiserfsck --rebuild-tree /dev/hda1

Como não há setores ruins, as chances de a reconstrução da árvore parar no meio são pequenas. Terminado com sucesso este comando, possivelmente sua nova partição estará saudável e poderá, pelo menos, ser lida para a recuperação dos seus preciosos dados, antes perdidos dentro dela...
Atenção: o rebuild-tree pode demorar para terminar. Nunca o interrompa, a fim de evitar danos à sua partição. Se ele parar com erro, rode-o de novo imediatamente.

(*) Lembre-se de substituir "/dev/hda1" pela partição correspondente!!

  • Casos Omissos

Se desejar ou necessitar recuperar a partição original, a qualquer custo, sem a chance de fazer a cópia descrita acima, então é preciso se gerar uma lista com todos os setores ruins (um arquivo com o número de cada setor ruim, um por linha) e rodar o comando:

reiserfsck --rebuild-tree --badblocks ./file /dev/hda1

Onde ./file é o arquivo com os setores ruins. Este arquivo pode ser gerado automaticamente (vide instruções na referência "dica", abaixo, e no item seguinte) ou manualmente, tentado rodar e repetir o comando a cada novo setor ruim encontrado e acrescentando o novo setor ruim no arquivo (só faça isto em último caso, a não ser que você queira levar semanas nesta operação!!). Se for preciso mesmo, tente gerar este arquivo automaticamente (vide item abaixo). Como esta técnica foge ao escopo deste artigo, incluí uma referência (abaixo) com todas as instruções para a sua realização, a fim de não deixar nenhum caro leitor na mão...

Dicas: tudo sobre como lidar com bad blocks e recuperação de sistemas de arquivos ReiserFS, clique aqui.

  • Outros Comandos
badblocks -o badbk.txt -v /dev/hda1: Verifica blocos ruins em uma partição e os grava no arquivo "badbk.txt". Útil no caso citado anteriormente. A opção "-v" permite ligar o modo verbose, que mostra alguma coisa na tela sobre o progresso da operação, ao invés do cursor piscando monotonamente. O arquivo gerado pode servir de input para várias ferramentas de recuperação de partições. No caso do Reiser, poderá servir para o comando do item anterior (reiserfsck).
Importante: o comando badblocks utiliza, por padrão, o tamanho de bloco de 1024 bytes. Contudo, a maioria das partições contróem blocos, por padrão, de 4096 bytes (4kB), e este é o padrão das partições Reiser. Se você coletar os dados com o tamanho errado, sua ferramenta de recuperação vai recusar o arquivo de blocos ruins gerado. Uma maneira de contornar este problema é informar ao comando badblocks o tamanho esperado de bloco de sua partição defeituosa, com o parâmetro "-b", da seguinte maneira:

badblocks -o badblocks.txt -vs -b 4096 /dev/hda1



Espero ter ajudado!! Gostou?? Detestou?? Ajudou?? Só te atrapalhou?? COMENTE!!

segunda-feira, 22 de dezembro de 2008

O Futuro do Java

Estive nestes últimos dias entretido com o(s) artigo(s) de capa da revista Mundo Java, onde diversos especialistas e pessoas notórias arriscam suas idéias sobre o futuro e as tendências do Java no mercado. Não posso negar que é um excelente apanhado de opiniões, varrendo as principais tecnologias Java, desde Javacard e J2ME até SOA e desenvolvimento orientado a serviços, trazendo as mais recentes novidades de cada área.
No entanto, uma coisa me parece que fugiu aos assuntos da revista, e por isto resolvi discriminá-la aqui, pois também me parece uma tendência que tem se fortalecido aos poucos e tem ganhado muito fôlego: a programação gráfica. O que vem a ser isto?? Bom, é mais um termo pajetiano para algo que está surgindo devagarinho e tende a ganhar grande impulso!
Programação Gráfica é todo o tipo de geração de código feito indiretamente, através de uma ferramenta gráfica; ou seja, ao invés de o programador escrever seu código, comando a comando, linha a linha, ele abre mão de uma IDE sofisticada onde, a partir de componentes iconográficos, pode arrastar objetos, definir suas propriedades, configurações, relacioná-las umas com as outras (meio que como se montasse um diagrama) e a ferramenta, dando-se por satisfeita com as informações prestadas, gerará automaticamente o código correspondente, podendo vir a compilá-lo e executá-lo, caso necessário.
Para quem programa em Java, isto há muito não é novidade... o Netbeans, por exemplo, gera dezenas de linhas de código em Swing automaticamente, a partir de uma interface amigável facilmente configurada (ou melhor, "desenhada") pelo programadores. Para quem usa o Eclipse, um bom plugin de funcionalidades semelhantes seria o Visual Editor Project (que inclusive suporta SWT), ou o Jigloo, que também tem versão para o Websphere Studio. Estes plugins não se limitam somente à interface gráfica, mas também comportam tratamento de eventos, dentre outras funcionalidades sofisticadas, costumeiramente desenvolvidas apenas via códigos e linhas intermináveis.
Para quem acha que isto só existe para interfaces gráficas de programas locais, aconselho que invista algum tempo examinando a sofisticação deste plugin: GWTDesigner, que faz exatamente a mesma coisa, porém para o desenvolvimento web com o Google Web Toolkit.
Bom, parece que a era da programação exclusivamente via texto realmente está no fim, e uma grande transformação está por vir!! Para quem ainda não acredita, vou deixar soar as trovoadas, citando rapidamente apenas mais uma ferramenta que veio para derrubar qualquer opinião contrária: o JasperETL, uma IDE de programação de manipulação de arquivos construída a partir do Eclipse, pelo time da Jaspersoft (o mesmo que mantém o Jasper Reports e o iReports), gratuita e disponível para qualquer plataforma. O JasperETL é uma IDE de programação diferente: nela você não escreve código, apenas arrasta os componentes para o diagrama central e os relaciona com ligações pertinentes (Iterator, para laços, etc...), configurando o fluxo do programa e todas as propriedade desejadas. Ao passo em que você faz isto, ele gera automaticamente o código. Também compila, coloca breakpoints, roda, inspeciona, etc, como o Eclipse faria normalmente.
O objetivo do JasperETL é ser uma IDE completa de geração relâmpago de programas processadores de arquivos. Ela suporta arquivos em diferentes dispositivos, faz acesso a banco de dados, lê e valida XML contra Schemas, extrai dados dos XMLs, converte nos mais diferentes formatos (gera até planilha do Excel!), é capaz de tomar decisões e modificar o fluxo, etc... tudo programado apenas num "simples" diagrama gráfico. Com o JasperETL, é possível fazer programas sofisticados que demorariam semanas em apenas 1 dia, e sem risco de erros.
Explorando a idéia da geração automática de código a partir de uma ferramenta gráfica, sob um prisma bem mais conhecido, pode-se citar ainda dezenas de programas para criação de diagramas UML, como o editor gratuito JUDE Community, que são também versáteis geradores de códigos a partir de seus diagramas (e vice-versa!). Com eles, você gera um diagrama de classes em UML 2.0, por exemplo, e o programa é capaz de interpretá-lo e criar as classes correspondentes, automatizando este penoso e braçal ofício.
Com este artigo, procurei mostrar uma tendência do Java, como também do mercado e do desenvolvimento em geral: a invasão de ferramentas e super bibliotecas de automatização de código, configuradas e manipuladas graficamente. Acredito que esta é uma tendência séria e que, ao logo dos próximos anos, vai modificar em muito a nossa maneira de produzir software. O pessoal do Mundo Java me desculpe, mas isto ficou faltando e não poderia ser deixado de lado...
Concorda, discorda?? Comente!!

sábado, 1 de novembro de 2008

Tutorial: Como Obter e Formatar Datas em Java

Mês passado, publiquei um extenso tutorial sobre como obter e formatar datas em javascript, dividido em duas partes: parte 01 e parte 02. Reparei que algumas pessoas, ao lidar com o mesmo problema, porém em java, têm iguais dificuldades, devido à maneira específica com que o objeto Date é tratado no momento de se formatar uma data.
Em java, uma data é comumente armazenada no objeto java.util.Date. Como em muitas outras lingugens, este objeto retém uma certa quantidade de informações internas além da data em si. Esta é representada por um número gigantesco e único, correspondete à quantidade de milissegundos decorridos desde a data convencionada como inicial (dependendo do caso, pode ser 01/01/1900, às 00:00:00, ou outra data parecida, anterior ou posterior, dependendo de qual objeto e qual linguagem você esteja utilizando) até a data do momento em que o objeto foi instanciado na memória. Por isso, converter este número imenso em uma data inteligível, com dia, mês, dia da semana, ano, hora, minuto, segundo e centésimo... isto é uma operação interna do objeto que envolve diversos cálculos, ou seja, não é simplesmente recuperar um dado guardadinho ali dentro.
Embora pareça complicado, formatar datas em java é muito simples!! Existe uma classe especial só para fazer o trabalho de tradução da formatação de data que o desenvolvedor deseja para o conteúdo que o objeto Date armazena em si. Esta classe é o SimpleDateFormat, do pacote java.text.
O SimpleDateFormat tem dois métodos de especial interesse:

  • format - recebe um objeto Date e retorna uma String formatada, segundo a configuração desejada;
  • parse - faz o inverso; recebe uma String e, baseado na configuração desejada, interpreta-a, gerando um objeto Date correspondete.
Como você já deve ter notado, para se formatar uma data é preciso, antes, informar como é esse formato que imaginamos. Em outras palavras, é preciso configurar o formatador. Felizmente, o SimpleDateFormat foi construído baseado em abstract factory (um padrão de projeto prórpio para este tipo de situação), e sua configuração é muito fácil!! Basta construí-lo passando uma String, com caracteres que representam as partes do formato de data que queremos. Exemplos:

SimpleDateFormat formatador1 = new SimpleDateFormat("dd/MM/yyyy")
(formataria datas para: 25/12/2008)
SimpleDateFormat formatador2 = new SimpleDateFormat("HH:mm:ss")
(formataria datas para apenas a hora: 23:45:02)

Apenas esta String é o suficiente para o SimpleDateFormat entender como você deseja o formato de sua data. Todavia, opcionalmente você ainda pode definir em que localidade você está! Isto é útil para dados de formatação que dependam de idioma e país, como o nome dos dias da semana ou do mês. Para fazer isto, basta acrescentar mais um argumento no construtor do SimpleDateFormat, o objeto Locale, do pacote java.util. O locale deve ser construído com as siglas da língua e do país, como nos exemplos:

Locale local1 = new Locale("pt", "BR"); //Português, Brasil
SimpleDateFormat formatador1 = new SimpleDateFormat("EEE", local1)
(formataria datas para: "Seg")
Locale local2 = new Locale("fr", "FR"); //Francês, França
SimpleDateFormat formatador1 = new SimpleDateFormat("EEE", local2)
(formataria datas para: "Lun")

No caso acima, "E" significa o nome do dia da semana. Ele foi repetido 3 vezes porque queríamos exatos 3 caracteres do nome. Para saber quais letras significam o que e como manipular a quantidade de caracteres de cada item, verifique a lista completa na documentação da Sun: aqui.

Exemplo 01: formatando uma data:

//Configurando tudo...
Locale local = new Locale("pt", "BR");
String dataHoraConfig = "dd/MM/yyyy HH:mm:ss";
SimpleDateFormat formatador = new SimpleDateFormat(dataHoraConfig, local);

//Obtendo e formatando a data...
Date data = new Date(); //Data do exato instante em que o objeto é carregado
String dataFormatada = formatador.format(data);

Isto cospirá algo como "01/11/2008 03:08:50".

Exemplo 02: recuperando o objeto Date correspondente a uma data formatada:

//Configurando tudo...
Locale local = new Locale("pt", "BR");
String dataHoraConfig = "dd/MM/yyyy HH:mm:ss";
SimpleDateFormat formatador = new SimpleDateFormat(dataHoraConfig, local);

//Obtendo o objeto Date...
String dataString = "01/11/2008 03:08:50";
Date data = formatador.parse(dataString);

Cuidado!

  • O parse pode falhar, então é preciso tratar a exceção ParseException;
  • O objeto Date tem sempre a precisão do milésimo de segundo. Se a sua String não chega até lá, o objeto terá os itens de maior precisão iniciados em zero. Exemplo: se a String informar apenas o ano "1980", o objeto Date será algo como "01/01/1980 00:00:00".

É isso aí, gente!! Espero ter ajudado!! Gostou?? Não gostou?? Comente!!

sábado, 25 de outubro de 2008

Turbinando Graficamente Seu Linux

Quando eu comecei a usar Linux, no início da década de 90 (caramba, quanto tempo!!), não existiam 90% dos programas mais utilizados hoje em dia. O mundo era bem diferente. Geralmente as distribuições vinham por padrão iniciando em INIT 3 (multiusuário, modo texto), o X (que, aliás, não era o X.org, porque este não existia, mas o "fantástico e novíssimo" XFree86) e os gerenciadores de janelas eram bem mais simples. O KDE estava ensaiando os primeiros passos, mas o que o pessoal utilizava mesmo era o Window Maker ou o XFCE (este em especial eu gostava muito porque trazia um certo saudosismo do UNIX AIX, nas boas e velhas estações RISC). O pessoal que tinha mais poder de processamento (e boas placas de vídeo) poderia se dar ao luxo de instalar o sofisticado Enlightenment, que sempre teve um conceito diferentão, com grande ênfase no visual. Mais tarde, alguns utilizaram o IceWM, também uma solução interessante, à época.
Bom, mas hoje é bem diferente. O linux evoluiu a passos largos, muitos novos programas surgiram e novas soluções gráficas também. O KDE se tornou extremamente sofisticado, surgiu o Gnome, que ganhou a paixão de milhares de pessoas, e o Enlightenment continuou seu desenvolvimento, tornando-se extremamente flexível e poderoso e criando suas próprias bibliotecas gráficas. Com o rápido desenvolvimento da tecnologia de hardware, muitas novas portas se abriram. Exemplo disso são as novas possibilidades gráficas com alto custo de desempenho e exímios efeitos visuais e 3D, proporcionado pelo Compiz ou CompizFusion (veja a diferença entre os dois aqui), e possível apenas a partir das modernas placas de vídeo com boa aceleração gráfica. Por outro lado, houve também quem se mirasse no revés do turbilhão de complexidades e requintes, procurando soluções simples e leves, porém igualmente eficientes, como o Fluxbox, baseado em seu antecessor, o Blackbox.
Para se ter idéia, as possibilidades hoje são tantas que existe até soluções comerciais, como o CDE, com o charmoso visual do Motif, para UNIX, HP/UX e Solaris, além de vários outros ambientes gráficos menos utilizados, como o FVWM, o FVWM95 (um clone do FVWM, modificado para parecer com o Windows 95).
Porém, o que são gerenciadores de janelas (window manager) se não se puder configurá-los exaustivamente com diversos temas, papéis de parede, ícones, cores e estilos?? No linux, o grau de personalização atingiu patamares inimagináveis, e existem boas referências para quem quer turbinar visualmente seu ambiente, ou simplesmente dar uma leve variada na cara rotineira. Confira abaixo:


Em tempo: vale citar ainda o Sun Java Desktop System, o gerenciador de janelas da Sun, criado para o Solaris, e o Looking Glass 3D, um ousado gerenciador de janelas 3D, multiplataforma, também desenvolvido pela Sun.
Espero ter ajudado, pessoal!! Gostou?? Não gostou?? Comente!!!

terça-feira, 21 de outubro de 2008

Como Rodar Aplicações Root em Modo Gráfico (famoso "cannot open display" ou "can't open display")

Certamente já aconteceu contigo o seguinte: você instalou o Kurumin, Debian, Ubuntu, SuSE, etc. e tal. Durante a instalação, ele pede para você criar um usuário normal (ou seja, com permissão restrita), além do root. Termina a instalação com sucesso. Daí você reinicia a máquina e entra no modo gráfico, utilizando seu brilhante usuário com permissões restritas.
Tudo vai bem, até que você precisa abrir um terminar e digitar:

su [para entrar como superusuário]
[digite a senha do root]
firefox & [ou qualquer outra aplicação gráfica]

Então seu sistema responde algo como:

Gtk-WARNING **: cannot open display:
blá blá blá firefox: Permission denied
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

ou, em algumas distros, a mensagem bem similar:

blá blá blá X11 error: Can't open display: :0.0
Set DISPLAY environment variable, use -display option
or check permissions of your X-Server
(See "man X" resp. "man xhost" for details)

Daí sobe aquele frio, sua garganta gela, sua pele seca... e você lembra que precisa executar um tal programa importantíssimo que é em modo gráfico, mas sabe que seu gerenciador de login (GDM ou KDM, talvez?) não permite que o root (administrador) faça login graficamente, alegando segurança... então lhe falta ar, você transpira, sinto o bafo gélido da morte.... nossa, o que fazer????
Caaalmmaaa... O Pajézinho tá aqui pra ajudar!!


  • Explicando o que aconteceu.
Isto acontece muitas vezes quando criamos um novo usuário diretamente pelo adduser, além de outras situações específicas, ou decorrente de uma má instalação do seu linux. Significa tão-somente que o usuário em questão não está autorizado pelo sistema a executar aplicativos gráficos do root. Sim, é preciso de autorização para isto, e essa autorização fica numa listinha do usuário chamado pelo "su".
Quer dizer mais ou menos o seguinte: o root tem uma lista de usuário em quem confia o acesso ao X. Se você entrou como root a partir do usuário A, mas A não está na lista do root, então não adianta forçar, você não tem autorização para o X e não vai poder rodar nada gráfico...

  • Como consertar?
Esta dita-cuja (a lista de usuários autorizados) fica num arquivo chamado .Xauthority, no home do seu usuário (e no home de qualquer usuário, inclusive do root). Para resolver a questão, basta copiar o .Xauthority de seu usuário para o do root (sim, no seu .Xauthority, você se concede permissão de executar aplicativos usando modo gráfico!!):

su
cp /home/eu/.Xauthority /root/

Agora, o root tem você na lista dele e, assim, pode te autorizar a rodar o X...

  • Solução para os preguiçosos
Bom, eu poderia ter terminado logo aí acima, mas sei que tem gente que talvez não tenha acertado, ou talvez não tenha tido paciência de ler direito tudo que escrevi... neste caso, use a solução não elegante: ao invés de logar com o comando "su", tente logar com o comando "sux", para ganhar automaticamente permissão de modo gráfico:

sux
[digite a senha do root]
firefox & [ou qualquer outra aplicação gráfica]

  • Solução Braçal
Não poderia faltar, pois os escovadores de bits também têm coração... esta solução funciona na maioria das vezes. Basta seguir os passos:

1- digite o comando "xauth list" como usuário comum. Deve vir ao terminal a lista de acessos, num formato algo parecido com:

10.0.0.1:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719
[fe80::211:d8ff:feb1:42e5]:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719
viola/unix:10 MIT-MAGIC-COOKIE-1 b0a4039a0924ad6f064f3b45bfdbb5bb
viola/unix:0 MIT-MAGIC-COOKIE-1 fe5100ab8ef0dd5e139b096ca7568719

(10.0.0.1 é meu IP na rede e "viola" é o nome da máquina. Sim, minha rede tem várias máquinas com nomes de instrumentos musicais).

2- agora, entre como root e adicione a autorização que você necessita (se não souber qual, vá adicionando as da lista e testando):

xauth add 10.0.0.1:0 . fe5100ab8ef0dd5e139b096ca7568719 [cuidado para não esquecer o "."]

Isto deve funcionar, e você poderá ter uma boa e tranquila noite de sono hoje!!

quarta-feira, 15 de outubro de 2008

Blender Breve Tutorial: Usando Raytracing

Raytracing é um recurso de criação 3D a partir do qual é possível simular, em um objeto, propriedades reflexivas (especulares) e de transparências. Normalmente, o raytracing dá ao objeto um efeito de espelho, de reflexo, e, quando aplicado sobre um material (especialmente um material com textura), sugere características metálicas.
A imagem abaixo foi feita usando simplesmente o efeito de raytracing, para dar o caráter metálico e reflexivo às bolas de bilhar 3D.



Apesar de ser um efeito interessante, é também um efeito caro. O custo de processamento para renderizar as imagens com raytracing é alto, e isto pode crescer exponencialmente quando se tratar de vídeos!
Quando você utilizar raytracing, observe os seguintes detalhes:

  • Cuidado com o efeito: não vele a pena utilizar um efeito caro se ele não tiver importância no contexto, ou seja, o objeto é pequeno demais, ou está escondido demais, ou tem pouca luz, etc.
  • Cuidado com o "world"!! Sim, o raytrancing é capaz de refletir, além dos outros objetos, todos os aspectos do cenário. Fique atento a isto e o use ao seu favor!
  • Evite usar luzes do tipo "SPOT"; prefira luzes do tipo "AREA", para que incida mais luminosidade sobre os objetos com o efeito. Não esqueça de ligar o efeito de sombra da luz! Torna sua modelagem bem mais realista!
  • Uma opção ao uso de sombras é a propriedade "Ambient Occlusion", do "World".

O Raytracing só pode ser aplicado se o objeto em questão contiver um material. Experimente criar materiais, com ou sem textura, adicioná-los a um objeto e aplicar o Raytracing a eles!! É impressionante: funciona muito bem inclusive com certas imagens como textura!!

Exemplos:


É isso aí, pessoal!! Boa sorte e espero ter ajudado!!

quinta-feira, 9 de outubro de 2008

Gerador de Imagens para AJAX e Tutorial

Freqüentemente, quando fazemos um portal Web que utiliza AJAX, necessitamos daquelas lindas figurinhas GIF animadas que ficam rodando, indicando ao usuário que a pesquisa está sendo feita. Como tenho visto que alguns colegas têm dificuldades de criar ou achar estas figuras animadas de clipart próprias para AJAX, resolvi colocar aqui o link para um programa online gratuito muito bom que já utilizei diversas vezes:

http://www.ajaxload.info/

Trata-se de um gerador automático de figuras (clipart) animadas para AJAX totalmente configurável!! Ele mesmo é todo feito em AJAX!! Facílimo de usar!! Permite escolha de cores (com uma linda div pop-up que não deixa nada a desejar para os melhores programas de edição de imagens), possui vários modelos de figuras, etc. Espero que ajude a todos!!

  • Tutorial de AJAX
E, para quem quer uma boa referência de tutoriais de AJAX, independente da linguagem e do framework utilizado, aqui vai uma dica de amigo:

http://www.ajax-tutorials.com/

Trata-se de um portal só de artigos e tutoriais de AJAX, categorizados para as linguagens e frameworks mais comuns, como .NET, Coldfusion, Java, PHP, SOA, Ruby on Rails, Yahoo! UI, GWT (Google Web Toolkit), etc. Simplesmente fantástico!! Extremamente completo, organizado, cheio de novidades e gratuito (apesar de exigir registro). Alguns tutoriais inclusive têm versão em PDF e permitem muitas vezes que você baixe os arquivos de fontes. Vale a pena a visita!!

domingo, 5 de outubro de 2008

Struts, JSF, GWT, Qual o Melhor Framework Java para WEB?

Java é uma linguagem que tem diversos frameworks para desenvolvimento WEB, uns mais parecidos com outros, e alguns nem tanto. Como a ênfase do Java no mercado é WEB, isto tem motivado inclusive o surgimento de novas soluções nesta área.
Semana passada tive um debate com alguns colegas sobre arcabouços (frameworks) para desenvolvimento WEB em Java. De certa forma, ter muitas opções é bom, indica a riqueza de ferramentas disponíveis aos desenvolvedores, porém demanda mais cuidado na escolha da opção mais propícia. Vamos a uma análise comparativa simples de alguns dos frameworks mais comuns, que pode o ajudar na hora da decisão certeira e fundamental de seu projeto...

  • JSF (Java Server Faces): Este é original da Sun, que de início foi preterido porque não parecia funcionar tão bem, mas hoje é bem sólido e poderoso. Desenvolver em JSF tem se tornado trivial com a ajuda de ferramentas poderosas como o Netbeans, que agiliza muito o trabalho. Para sistemas de telas padronizadas e arquitetura baseada em CRUD, o JSF é o ideal: agiliza o desenvolvimento, simplifica e previne erros com o uso de JSTL, etc.
  • Apache Struts Framework: Durante muitos anos, esteve presente na maioria maciça de sistemas WEB em Java, junto com o Tiles, que se tornou um projeto independente a partir da versão 2.0 (o Tiles 2 pode ser integrado a JSF e a outros frameworks). É indicado para sistemas de páginas mais flexíveis. Também tem suas taglibs (que nunca foram exatamente muito boas) e suporta JSTL. É indicado para os sistemas onde o JSF não vai tão bem, com telas diferenciadas, muito complexas ou muito personalizadas.
  • Direct Web Remoting (DWR): Como você vê, tanto Struts quanto JSF são arcabouços tradicionais que supõem um cliente burro, passivo, e, embora não se oponham ao DHTML (manipulação de dados da página com Javascript), só conseguem falar com o servidor no recarregamento da página (refresh). Por padrão, não suportam AJAX. Mas não se preocupe: para isto existem pequenos frameworks como o DWR. O DWR implementa chamadas remotas via RPC, possibilitando que seu sistema faça AJAX muito comodamente. Integra bem com Struts e JSF. A partir da versão 2 permite, inclusive, o reverse AJAX: mecanismo pelo qual o Java no servidor controla o navegador através da publicação de scripts. Sem dúvida, a melhor saída para páginas dinâmicas ricas, em Web 2.0, que necessitam de muito AJAX.
  • Google Web Toolkit (GWT): O GWT recolucionou drasticamente o desenvolvimento WEB para Java. Desconstruiu toda a complexidade dos sistemas carregados em múltiplos frameworks, descritores XML, etc., e mergulhou profundamente em Web 2.0. Com o GWT, seu sistema só carrega uma vez a partir de um arquivo HTML. Não tem recarregamento de página. Todas as requisições ao servidor são RPC implementados via callback (AJAX). Não tem sequer arquivos JSP!! O segredo é que a programação é feita toda em Java, inclusive as telas e seus elementos, com direito a breakpoints e debug, e o motor do GWT, em tempo de compilação, transforma todo o Java relativo à tela em Javascript. É muito parecido com o Swing, onde o desenvolvedor compõe, em Java, a GUI do sistema, embora voltado para Web. É ideal para sistemas que exijam uma implementação visual sofisticada, muito AJAX e características de GUI, com elementos como árvores, abas, tabelas dinâmicas, DIVs móveis, Drag & Drop de componentes, exploração de CSS e estilo, etc.
  • Apache Wicket: Muito semelhante ao GWT, o Wicket tem a mesma filosofia: programe a sua GUI em Java e deixe que ele a converta para HTML. Não parece ser tão sofisticado quanto o GWT, mas tem a enorme vantagem de que a correspondência entre seus componentes e os objetos HTML DOM gerados é exata. Ou seja: enquanto, no GWT, os seus componentes normalmente geram em Javascript estruturas complexas de objetos DOM, no Wicket a correspondência é a mesma: um objeto de cá gera um de lá e pronto! Com isso, é possível que web designers e programadores Java trabalhem independentemente e com mais liberdade que com o GWT. Por outro lado, é uma alternativa ideal para sistemas mais simples que, entretanto, terão dificuldades ao sofisticar os componentes visuais, aos moldes do que o GWT oferece.
Conclusão: qual framework devo usar em meu projeto? Todos eles têm vantagens e desvantagens, mas cada um tem uma ênfase em certo aspecto. Não tenha preconceitos nem idéias megalomaníacas. A sua escolha deve ser baseada nas características do seu projeto: como ele é e o que faz. Certamente há uma melhor opção para você, que lhe facilitará a vida e alhiciará conforto e prazer ao encontrar na sua ferramenta exatamente as funcionalidades de que você precisa.

quinta-feira, 2 de outubro de 2008

Resumão de Plugins do Eclipse: Java, C, PHP, Python, Rails, etc!!

Uma IDE para a todas governar...

Não, não estou falando do Um-Anel nem de nenhum romance do J. R. R. Tolkien. Estou falando de uma IDE de desenvolvimento open-source chamada Eclipse.

  • O que é o Eclipse??
Criado nos laboratórios da IBM, o Eclipse - escrito integralmente em Java - foi planejado (naturalmente!) para desenvolvimento em Java. Todavia, impulsionado pelo fato de o Java ter muita aplicação para Web e pela sua própria popularização como ferramenta, além da facilidade de sua arquitetura extremamente plugável, começaram a surgir inúmeros plugins e modificações do eclipse, habilitando-o a suportar muitas outras linguagens.
O primeiro grande passo foi com os plugins do projeto WTP (Web Tools Platform - hoje integrado diretamente às versões mais recentes do Eclipse), onde o Eclipse veio a reconhecer fontes em HTML, CSS, XML, Javascript, XSD, etc. Muitos outros projetos (vários de código aberto) modificaram e adaptaram o Eclipse para os mesmos ou semelhantes fins, como o Lomboz, o (antigo) JBoss IDE ou o Aptana.

  • Uma IDE Baseada em Plugins
O Eclipse é, na verdade, uma pequena IDE enxuta com arquitetura voltada para plugins. Isto permite que se criem facilmente novos plugins para fazer virtualmente qualquer coisa no Eclipse. Na verdade, ao baixar o Eclipse, você já traz uma infinidade de plugins, responsáveis pela maior parte das suas funcionalidades originais!!
Devido a esta flexibilidade, o Eclipse tem se tornado uma ferramenta poderosa para qualquer desenvolvedor, seja ele programador de Javascritp/AJAX, web designer, desenvolvedor Java, PHP, C ou Python, por exemplo.


Alguns dos Principais Plugins para o Eclipse

  • Aptana: Este é sem dúvida o melhor plugin para quem desenvolve ricamente para Web. Suporta maravilhosamente Javascript e AJAX, com direito a reconhecimento de variáveis, auto-completar objetos e funções, breakpoints em Javascript, além de CSS, DOM, PHP, Ruby on Rails, Adobe Air, Apple iPhone, Python, e conta com inúmeras outras funcionalidades. Trata-se na verdade um conjunto de pequenos plugins e (prepare-se!!), ao todo, são dezenas de megas de download. É tanto que tem uma modificação do Eclipse só para o Aptana (o Aptana Studio), que permite ao usuário rodar o plugin de forma standalone, ou seja, sem o resto do Eclipse, deixando o ambiente mais leve. É ideal para web designers e desenvolvedores web. Com o Aptana, seu Eclipse estará simplesmente turbinado com tudo para Web que você precisa e mais um pouco!!
  • PHP: Se você desenvolve para Web em PHP mas prefere manter o Eclipse original, então é recomendável ter algo como o PHPEclipse. Com este plugin, você terá tudo que uma boa IDE pode oferecer. Outra opção é um projeto do próprio Eclipse denominado PDT.
  • JBoss Tools: Assim como o Aptana é muito mais do que um plugin, o JBoss Tools também o é. Trata-se de uma grande suíte de aplicativos para desenvolvimento corporativo da JBoss. É tão grande que há uma modificação do Eclipse feita pela própria JBoss, contendo todas as suas ferramentas. Se você trabalha com J2EE e usa o JBoss, então esta ferramenta é essencial! Ela lhe ajudará não só a manipular o servidor, como também oferecerá suporte ao Hibernate, Struts, JBPM, JSF, etc.
  • Sysdeo Tomcat Plugin: para quem faz sistemas menores e utiliza o formidável Jakarta TomCat, da Apache, como servidor, um plugin indispensável é este. Ele permite, de dentro do Eclipse, parar e reiniciar o servidor, além de fazer o autodeploy. Agora você pode mudar qualquer JSP e ver a modificação na mesma hora!! Agiliza em muito o trabalho!!
  • Any Edit Plugin: excelente plugin para tratar textos. Converte todos os símbolos do Unicode em notação HTML, inclusive os acentos, além de pequenas coisinhas, como converter um trecho entre maiúsculo ou minúsculo, sublinhados e CamelCase, etc. É simples, mas muito útil!!
  • Subclipse Plugin: o Eclipse já vem com um ótimo plugin para CVS, mas (ainda não sei por que!!) não traz nenhuma ferramenta para SVN. Com este plugin, seus problemas se acabaram!! Ele é muito parecido com o tradicional plugin de CVS, inclusive usando algumas imagens idênticas, e fornece todas as funcionalidades que você precisa para controlar seus projetos no repositório do Subversion.
  • Maven Eclipse Plugin: Então imagina que seu super projeto necessite de mais do que simples controladores de versão; necessita de um controlador eficiente de dependências. Ótimo, temos o Maven, da Apache, que permite inclusive a criação de seu repositório particular de dependências!! A partir do Maven Eclipse Plugin, é possível usar o Maven para compilar seu projeto, resolver as dependências e inclusive achar erros no seu pom.xml!!
  • PyDev: Você desenvolve em Python?? Ainda não tem uma IDE de primeira linha?? Então conheça o PyDev, o plugin que transforma o Eclipse num primoroso ambiente de desenvolvimento para Python. Extremamente poderoso, faz Debugger e Breakpoints no código Python, inspeção de variáveis e objetos no modo Debug, auto-complementação de código, verifica a sintaxe, marca erros e TODOs, suporta refatoração completa de código, enfim, todas as maravilhas que o Eclipse faz para Java, ele o faz para o Python!!
  • C/C++ Development Toolkit (CDT): Mas você gosta mesmo é de C, né?? Então fica frio e ouça O Pajezinho aqui - prepare-se para usar o Eclipse!! O CDT é um excelente plugin, que não só identa e marca o código, como também tem ferramentas para automatizar seu desenvolvimento. Ele gera diretivas de Header, cria automaticamente o Header (*.h) e a Classe C++ (*.cpp) a partir de janelas de diálogos, controla Breakpoints, faz Debug, mostra as Threads... em suma: eleva a IDE, consoante ao desenvolvimento em C, ao mesmo patamar em que ela está para o Java.
  • Ruby Development Tools (RDT): Se você trabalha com Ruby ou Ruby on Rails, aqui está um ambiente de desenvolvimento de primeira: marcação (highlight) e verificação de sintaxe, ferramentas gráficas e controle de testes, assistentes de contexto, formatador de código, ferramentas para rodar e debugar, visão hierárquica, refatoramento, etc...
  • Cypal Studio For GWT: Mas você desenvolve em Java e é fã do GWT?? Não se preocupe!! Existe um plugin bem interessante que vai agilizar as tarefas chatinhas de criação/edição de serviços e módulos, criação de projetos e ainda lhe ajudará a rodar o seu módulo com o Hosted Mode. Vale a pena conferir!!
  • JSEclipse - Plugin para Javascript: OK, você não precisa de tanto para ter que instalar o Aptana, mas você precisa lidar com Javascript de uma forma um pouco melhor que o plugin original do Eclipse... então, a sua melhor escolha vai ser usar o JSEclipse. Ele auto-completa e faz marcação (highlight) de seu código, suporta bibliotecas de javascript, identifica objetos e classes criados e modificados, faz sugestão de funções e propriedades, marca erros de sintaxe, e você pode até criar um XML próprio com suas definições de classes!! Muito ágil para quem desenvolve para Web e precisa de uma ferramenta sólida para Javascript...
  • COBOL IDE: Este aqui eu coloquei para mostrar o poder do Eclipse!! Imagine que existe uma pequena suíte de plugins para o Eclipse, criando uma formosa IDE de desenvolvimento para COBOL!! Se você de repente se deparou com um código legado monstruoso em COBOL, feito pelo Tutankamon em pessoa, e está com medo dele, agora seus problemas podem não ter se acabado, mas apareceu uma boa luz no fim do túnel!!
  • SQL Plugin - QuantumDB: Não poderíamos nos esquecer de nossos grandes amigos DBAs ou ADs (ou os bons programadores WEB que precisam freqüentemente colocar a mão na massa e fazer milhares de queries em banco de dados). Com o QuantumDB, você tem uma interface fantástica para não só fazer queries simples, como também fazer muitas outras coisas: controlar schemas, tabelas, views e sequences, constraints, colunas, índices e chaves estrangeiras, salvar e editar arquivos *.SQL, tem wizards para facilitar DELETEs, UPDATEs e INSERTs, reconhece a linguagem SQL, exibe a estrutura do banco em árvore, suporta os mais diversos bancos (acessando via JDBC) e muito mais!!

Bom, pessoal... esta é apenas uma pequena mostra do que os plugins para o Eclipse podem fazer por você!! Muito mais pode ser pesquisado e baixado no portal oficial: Eclipse Plugin Central.
Espero ter ajudado com este resumão e que, agora, você se sinta encorajado e orientado para munir-se de melhores e mais propícas ferramentas, aprimorando seu trabalho e tornando sua vida mais confortável!!
Gostou do artigo?? Deixe sua opinião aí embaixo!! O Pajé também é open source e free!!

sábado, 27 de setembro de 2008

III Encontro Nacional do BROffice

Estão abertas as inscrições para o III Encontro Nacional do BrOffice.org, que, apesar de nacional, foi internacional desde a sua primeira edição. Para participar basta se inscrever no portal do Encontro e comparecer em um dos pontos de videoconferência espalhados pelo Brasil, Paraguai, Espanha ou Uruguai. O valor da inscrição é 1KG de alimento não perecível que deve ser entregue no dia do evento. Quem desejar, terá a oportunidade de doar sangue também, no dia do encontro. Veja o portal oficial:

http://encontro.broffice.org/pt-br/inscricao

O evento ocorrerá no dia 3 de outubro de 2008, das 8h às 19h (GMT -0300 - Hora de Brasília). Será transmitido ao vivo pela internet, com interatividade, para todos os estados brasileiros, além da Espanha, Paraguai e Portugal. Espera-se mais de 3000 pessoas, oriundas da Galícia/Espanha, Paraguai, Portugal, Uruguai e de todo o Brasil, e contará com nomes como: Charles Schulz – París/França – Líder do Projeto Idiomas Nativos do Openoffice.org, Michael Bemmer – Hamburgo/Alemanha – Diretor da Sun Microsystems, responsável pela Engenharia de Software do OpenOffice/StarOffice e René Engelhard – Karlsruhe/Alemanha – Desenvolvedor responsável pela manutenção do OpenOffice.Org/BrOffice.Org no Sistema Operacional Debian GNU/Linux.

Vamos participar, gente!!

sexta-feira, 26 de setembro de 2008

Ajude um Orfanato e Ganhe um iPod!!

Vamos todos participar da promoção "Mês (Geek) das Criaças"!! Acessando o link abaixo, você vota em um de três orfanatos que concorrem a um maravilhoso Nintendo Wii e, de quebra, inscreve-se para o sorteio de um iPod!! Acesse:

http://meiobit.pop.com.br/meio-bit/miscelaneas/promocao-mes-geek-das-criancas-meio-bit

Vamos lá: ajudar não custa nada!!

O Pajé: sempre uma dica boa!!

terça-feira, 23 de setembro de 2008

Fazendo um HTTP GET via Telnet

Então, você fez seu sistema web bonitinho, verificou, lustrou, examinou, compilou, empacotou, e colocou (delicadamente!) o pacotinho dele no seu servidor de aplicação. Respirou fundo e iniciou o servidor. Nenhum erro no log. Tudo direitinho. Você então se levanta e diz - está funcionando!! Ótimo! Podemos ir pra casa!
Podemos mesmo?? Será que o sistema está no ar?? Se eu entrar na página inicial, será que ela vai abrir??
Muitas vezes, por mais estranho que pareça, uma ou outra coisa provoca que o sistema não esteja acessível ou visível para o usuário, mesmo estando "no ar"!! Ou o servidor de aplicação está na porta errada, ou a rede tem um redirecionamento faltando, a URL mudou, uma rota caiu, o DNS falhou, o Proxy não ficou bem configurado ou não está ativo... enfim, milhares de coisas podem acontecer para deixar seu sistema inalcançável. E, o mais interessante: como o desenvolvedor está sempre concentrado no sistema em si, grandes chances há que ele não se aperceba das dificuldades e fragilidades de ambiente e arquitetura de redes... o resultado pode ser catastrófico!!
Mas, para todos os grandes males... um pequeno (e singelo) remédio! Uma maneira fácil, simples, rápida e segura de testar se o seu sistema está acessível é fazer uma chamada GET de HTTP via telnet, e observar a resposta.
Funciona assim:

  • Abre-se uma conexão HTTP na porta correta usando o comando TELNET;
  • Faz-se uma chamada GET, digitando um comando muito simples, buscando uma página dentro do seu sistema, ou a raíz;
  • Analisa-se o resultado obtido.
O Telnet é usado apenas para abrir a conexão com o servidor onde está seu sistema, na porta onde ele atende. Assim, deve-se digitar:

telnet www.google.com.br 80

Para abrir uma conexão com o endereço "www.google.com.br". É preciso indicar a porta 80, pois a porta padrão do Telnet é a porta 23, mas queremos acessar a porta 80, que é a padrão do HTTP. A fórmula é sempre esta:

telnet [ENDEREÇO] [PORTA]

Uma vez com a conexão aberta, vamos fazer o comando GET:

GET / HTTP/1.1

O que isto significa?? Bom, vamos ver... a fórmula é:

GET [PASTA/ARQUIVO] HTTP/1.1

Isto significa que estamos fazendo um GET do arquivo que está em "/" (automaticamente, será o "/index.html" ou "/index.htm"), usando o protocolo HTTP, versão 1.1. Poderia ser qualquer outro arquivo, como "GET /index.php HTTP/1.1", ou "GET /isso/aquilo/aquilooutro/index.do HTTP/1.1", etc....
Esta requisição gera uma resposta HTTP, que é enviada em modo texto pelo telnet, e depois o servidor encerra a conexão (sim, as conexões HTTP são encerradas pelo servidor assim que termina a transferência; lembre-se disto!!). Vamos entender a resposta??

HTTP/1.1 302 Found
Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=e74d34b9a8ade746:TM=1222306186:LM=1222306186:S=9-4OKiByoC12DDCV; expires=Sat, 25-Sep-2010 01:29:46 GMT; path=/; domain=.google.com
Date: Thu, 25 Sep 2008 01:29:46 GMT
Server: gws
Content-Length: 222

[HTML DA RESPOSTA]

A resposta da conexão tem, essencialmente, 2 elementos importantes para nós: o cabeçalho (HTTP HEADER) e o texto de resposta. Qualquer página da internet, mesmo esta que você está vendo agora, vem inexoravelmente dentro de uma resposta HTTP, após seu devido cabeçalho. O cabeçalho (ou HEADER) é aquilo que instrui o seu navegador sobre como se comportar em relação a esta resposta (coisas como: o que exibir, se falhou, se funcionou, se pode fazer cache, se tem cookie, etc.). Vamos examinar algumas coisas principais do nosso cabeçalho:

  • HTTP/1.1 302 Found --> Aqui começa tudo! Indica que a URL, o endereço, foi encontrado com o código HTTP 302. Este código significa redirecionamento. Ou seja, a partir daqui, o seu navegador vai ser redirecionado para outro endereço. O servidor HTTP sempre responde com um código HTTP único, definido internacionalmente por especificação oficial do World Wide Web Consortium.
  • Location: http://www.google.com.br/ --> Indica de onde a resposta veio.
  • Cache-Control: private --> Indica que não se deve fazer cache. As informações são direcionadas a um único usuário.
  • Content-Type: text/html; charset=UTF-8 --> Indica que a resposta carrega um conteúdo texto, no formato HTML, codificado em padrão UNICODE UTF-8 (ou seja: pode usar acentos, cedilhas e todos os caracteres europeus). Isto é importante porque, se o conteúdo da resposta fosse um arquivo binário, como um ZIP ou um MP3, o navegador precisa lidar com eles de maneiras diferenciadas.
  • Set-Cookie: PREF=ID=e74d34b9a8ade746:TM=1222306186:LM=1222306186:S=9-4OKiByoC12DDCV; expires=Sat, 25-Sep-2010 01:29:46 GMT; path=/; domain=.google.com --> Pois é... como você viu, a google já coloca um cookiezinho na sua máquina... além deste valor estranho, o cookie tem uma data de expiração (sábado, 25/10/2010, daqui a 2 anos e 1 dia!!) e sabe o domínio de quem o criou (google.com).
  • Server: gws --> o nome do servidor que te respondeu (bom para saber o que o concorrente usa!!).
  • Content-Length: 222 --> O tamanho do corpo da resposta.

Estes são apenas alguns campos. Uma lista completa de todos os campos e suas definições encontra-se aqui. Vale lembrar que todo campo do cabeçalho sempre tem um nome, seguido do caracter ":" e o valor. Cuidado: estes campos são sensíveis a caixa (diferenciam minúsculas de maiúsculas).

Se quiser mergulhar a fundo na especificação do HTTP 1.1, acesse aqui.
Lembre-se: qualquer URL pode ser acessada por um GET via Telnet. Na verdade, o Telnet pode ser usado ainda para URLs de POST de HTTP, embora seja bem mais incômodo de fazer. O Telnet também pode se comunicar com seu servidor de e-mail, e é possível, via Telnet, enviar um e-mail para qualquer endereço de destinatário (e melhor: via telnet, o servidor não valida seu e-mail e você pode informar o endereço de remetente que desejar!!). Embora não seja complicado, isto tem sido cada vez menos utilizado, porque o permitir expõe o administrador da rede e o serviço de e-mail a riscos de segurança desnecessários.


  • Conclusão

Uma simples requisição via telnet lhe oferece um meio fácil e seguro de não só validar a disponibilidade de sua página ou sistema, como também extrair mais algumas informações inerentes a ela, ratificando a validação.

domingo, 21 de setembro de 2008

JavaScript Tutorial: O Objeto Date (Parte 2)

Esta é a segunda parte do tutorial. Você já leu a primeira parte??
Nesta parte, vamos aprender a personalizar o objeto Date, usando a palavra (ou keyword) prototype. O que vem a ser isto? Bom, sabemos que o javascript manipula, na memória, objetos e funções. Cada objeto pode ter propriedades, que são valores simples, ou funções, que são rotinas associadas ao objeto.
Existem objetos inerentes ao javascript, como o objeto Math, Date, etc. Através da palavra prototype, podemos modificar estes objetos, acrescentando a eles (ou a qualquer objeto do javascript previamente existente) propriedades e funções novas, declaradas por nós! Portanto, o prototype é uma excelente ferramenta de otimização e personalização. Vejamos como funciona:

Date.prototype.nomeDaPropriedade = 50;
Date.prototype.nomeDaFuncao = function(){
this.getTime();
};


No primeiro caso, estamos pegando o objeto Date, nativo do javascript, e, através do prototype, declaramos uma nova propriedade para ele, chamada "nomeDaPropriedade" e que terá valor "50". Para acessar esta propriedade, basta instanciar o objeto e usar o operador ponto ".":

var data = new Date();
window.alert(data.nomeDaPropriedade);

No segundo caso, fazemos o mesmo, mas agora estamos declarando uma função nova (e não uma propriedade), denominada "nomeDaFuncao". O código que esta função executará está dentro das chaves. As funções declaradas via prototype podem ou não ter valor de retorno, e podem receber nenhum ou quantos parâmetros quisermos, exatamente como qualquer função de javascript. Podemos, de dentro de uma função declarada via prototype, acessar qualquer propriedade ou função daquela instância do objeto, com o parâmetro "this".

Importante: não esqueça de colocar o ";" no final, após fechar a chave da função!! Muita gente erra isso!!


Para acesar esta função, basta instanciar o objeto e chamá-la:

var data = new Date();
window.alert(data.nomeDaFuncao());

Importante: não esqueça que, sendo uma função, é preciso chamá-la com o "()" no final de seu nome. Parece muito bobo, mas tem gente que erra isso e fica horas perdida procurando o erro...

Agora, vamos aplicar isto ao nosso caso, fazendo algo mais útil ao nosso objeto Date. As funções abaixo fazem:
ajustaDuasCasas: força que o número sempre tenha duas casas, mesmo menor que 10. Isto é bom para manter a formatação em datas e horas com valores menores que 10.
getDataFormatada: transforma a data do objeto (e não a atual!!) em uma String do tipo "07/09/2008".
getDataHoraFormatada: faz o mesmo que a de cima, mas acrescenta a hora: "07/09/2008 13:20:00".
getHoraFormatada: faz o mesmo, mas retorna apenas a hora: "13:20:00".

Date.prototype.ajustaDuasCasas = function(numero) {
if (!isNaN(numero)) {
if (numero < 10) {
return "0" + numero;
} else {
return numero;
}
} else {
return "00";
}
};

Date.prototype.getDataFormatada = function() {
var dia = this.ajustaDuasCasas(this.getDate());
var mes = this.ajustaDuasCasas(this.getMonth() + 1);
var ano = this.getFullYear();
return dia + "/" + mes + "/" + ano;
};

Date.prototype.getDataHoraFormatada = function() {
var dia = this.ajustaDuasCasas(this.getDate());
var mes = this.ajustaDuasCasas(this.getMonth() + 1);
var ano = this.getFullYear();
var hora = this.ajustaDuasCasas(this.getHours());
var minutos = this.ajustaDuasCasas(this.getMinutes());
var segundos = this.ajustaDuasCasas(this.getSeconds());
return dia + "/" + mes + "/" + ano + " " +
hora + ":" + minutos + ":" + segundos;
};

Date.prototype.getHoraFormatada = function() {
var hora = this.ajustaDuasCasas(this.getHours());
var minutos = this.ajustaDuasCasas(this.getMinutes());
var segundos = this.ajustaDuasCasas(this.getSeconds());
return hora + ":" + minutos + ":" + segundos;
};


Utilizando tudo isso:
var hoje = new Date();
window.alert(hoje.getDataFormatada());
window.alert(hoje.getDataHoraFormatada());
window.alert(hoje.getHoraFormatada());


Observe que isto funcionará com qualquer instância do objeto Date, formatando automaticamente qualquer valor que o objeto carregue. Assim, seu código fica bem mais simples e enxuto, claro e fácil de entender. As chances de erro são menores e o desempenho é maior.

  • Implementando um Relógio

O javascript provê uma função denominada setInterval(a, b), onde a é uma String representando uma chamada em javascript que será repetida continuamente e b é um inteiro representando o intervalo em milisegundos que o navegador esperará entre as repetições da chamada. Com isto é possível implementar um pequeno relógio:

function mostraRelogio(campoRelogio) {
if (campoRelogio != null) {
// Recarregando a hora a cada 100 milisegundos, para
// fazer o relógio andar.
setInterval("campoRelogio.innerHTML = (new Date()).getHoraFormatada()", 100);
}
}

CONCLUSÃO: utilizar o objeto Date do javascript é uma forma simples e fácil de diminuir a carga de seu portal, melhorar e otimizar o desempenho de seu sistema de informação e fazer inúmeros testes e validações antes de ir ao servidor. Utilizando a palavra-chave prototype, podemos adicionar ao objeto nativo funções e propriedades úteis, personalizadas e recorrentes em nosso sistema, evitando a aglomeração excessiva de funções externas e garantindo mais agilidade, simplicidade e clareza no código.

JavaScript Tutorial: O Objeto Date (Parte 1)

Quando criamos nosso sistema de informações, é apenas uma questão de tempo até precisarmos manipular, medir, alterar, calcular e comparar datas e horas. Quando nosso sistema é (como a grande maioria!) baseado em web, então grande parte desta etapa é feita no próprio navegador do cliente, via javascript, o que é muito bom, pois aumenta a produtividade, envitando posts desnecessários e diminuindo a carga sobre o servidor.
Interessante que tenho visto pessoas com dificuldade neste assunto, e nem sempre se acha um bom tutorial em português para ajudar. Assim, O Pajé ficou motivado a escrever este artigo, contendo todas as ferramentas básicas para aprender e utilizar o objeto Date do JavaScript sem medo. Como pretendo um tutorial abrangente, dividi-o em duas partes (em breve sairá do forninho a segunda!!).
Bom, vamos do começo: o objeto Date é o objeto responsável, no javascript, por lidar com informações de tempo, desde o ano atual até o último milisegundo, passando pelo dia da semana, mês, hora, minuto, etc. Se seu sistema contiver campos como Período, Data Inicial, Horário, Duração, Diurno, Noturno, Calendário, etc., então freqüentemente você precisará do objeto Date entrando em ação! E não se engane: estes campos são dos mais corriqueiros!!
Manipular as datas no javascript é bom porque evita que o usuário envie para o servidor informações que certamente não vão passar pela validação e vão ter que retornar ao mesmo ponto. Com Date, você pode validar se a data informada está correta, se o período compreende ao menos um valor mínimo, e se a data final é maior que a inicial, por exemplo.
Claro que, no servidor, você deverá revalidar tudo (não seja bobo!! Tem clientes tentando passar a perna também!!), mas, tendo uma validação prévia no cliente, então as chances da validação falhar no servidor e se retornar ao mesmo ponto são menores. Acredite: este tipo de artifício ajuda muito a desafogar seu servidor!!
Então vamos ao que interessa!! Antes de utilizar o objeto, é preciso criá-lo:

var data = new Date();

Isto cria um objeto Date válido, contendo a data e instante atual (do momento da criação). Mesmo que a data desejada seja outra, para começar é preciso instanciar assim.
Abaixo, as funções mais importantes do objeto Date e suas descrições:

var data = new Date();
// Número de millisegundos desde 01/01/1970 @ 00:00
data.getTime();
// Número de segundos (0-59)
data.getSeconds();
// Número de miutos (0-59)
data.getMinutes();
// Número da hora (0-23)
data.getHours();
// Número do dia da semana, sendo 0=domingo e 6=sábado
data.getDay();
// Dia do mês (0-31)
data.getDate();
// Número do mês. CUIDADO: 0=janeiro, e 11=dezembro.
// Muita gente erra achando que janeiro é mês 1!!
data.getMonth();
// Número do ano, com 4 dígitos
data.getFullYear();

Apenas com estes comandos já dá para resolver grande parte dos problemas. Lembre-se de que o objeto date suporta comparações com os operadores ">", "<", ">=", "<=", "+", "-" e que é sempre seguro, quando necessário, convertê-lo para inteiro com a função getTime(). Com estes operadores, podemos somar ou diminuir uma data da outra (importante para cálculo de períodos!!), podemos comparar qual data é maior e qual é menor (importante em validações), etc. Uma referência completa, embora exaustiva, sobre o objeto Date de javascript encontra-se aqui.


  • Definindo uma data específica
Claro que o "var data = new Date()" nem sempre é o que a gente quer. Muitas vezes, queremos que o objeto criado represente uma data específica, seja ela lida de um campo da tela, seja ela calculada de alguma forma. Assim, podemos utilizar outros construtores do objeto Date, conforme mostrado a seguir:

var hoje = new Date();
var anoQueVem = new Date('January 1, '+(hoje.getFullYear()+1));
var diasRestantes = anoQueVem - hoje;

Este construtor recebe uma String com o nome do mês, dia e ano. No código acima, também usamos os operadores para saber quanto tempo resta até o fim do ano. Assim, posso calcular os dias, minutos, segundos e milisegundos para o reveillón!! Se você tem um portal que espera um grande lançamento, é isto que você deve usar!!
Outra maneira de inserir uma data, utilizando apenas valores numéricos, é esta:

var dataNova = new Date(ano, mes, dia[, hora[, minuto[, segundo[,milisegundo]]]]);

Assim é possível se criar um objeto Date com o valor de qualquer data, até a precisão dos milisengundos. Lembre-se de que o valor do mês parece sempre diminuído de 1, porque janeiro=0, fevereiro=1, março=2, ..., dezembro=11!! Até o argumento "dia" é obrigatório, os outros são opcionais. Exemplos:

//Dia de natal: 25/12/2008.
var data1 = new Date(2008, 11, 25);

//Independência: 07/09/2001.
var data2 = new Date(2001, 8, 7);

//Meu almoço, no aniversário do Rio de Janeiro.
var data3 = new Date("March 20, 2008 12:20:00 pm");
var data4 = new Date(2008, 2, 20, 12, 20, 00);


Observe que data3 e data4 são iguais.

Ocorre menos assiduamente, mas, caso você tenha um número inteiro (geralmente advindo do em data.getTime()) e quer convertê-lo para uma data, basta usar a função estática Date.parse, ou o construtor que recebe um único inteiro:

var data1 = new Date(inteiro); //inteiro = número inteiro
var data2 = Date.parse(inteiro); //inteiro = número inteiro

É isso, gente!! Na segunda parte do tutorial, vamos fazer um aplicativo para mostrar a data e hora, e vamos construir um lindo relógio digital para seu portal!! Qualquer coisa (gostou, não gostou, ajudou, foi inútil, etc. e tal...), comentem!! É só clicar aí embaixo!!

Veja a continuação na segunda parte!!

quarta-feira, 17 de setembro de 2008

Emprego e Linguagens de Programação

Se uma coisa é diversificada no mundo da informática, então estamos falando de linguagens de programação. E, na hora de se tornar um desenvolvedor profissional, não basta saber que elas existem. É preciso dominá-las. Porém, dominar implica em dedicação, investimento, tempo e, principalmente, especialização, aprofundamento. Trocando em miúdos: não dá pra dominar muitas linguagens ao mesmo tempo... infelizmente, eu diria que dá pra dominar, na verdade, muito poucas! Embora, durante a trajetória profissional, passemos eventualmente por algumas, quiçá várias, linguagens, o fato é que uma linguagem é como o instrumento que você toca ou a língua que você escreve: você tem uma e pronto. Uma definitiva, uma principal. As outras são casuais, folhas avulsas do livro de sua vida que voam flácidas aos ventos do outono...
Bonito! E agora? Se tenho que escolher uma linguagem para me aprimorar e mergulhar na vida profissional, qual será? Como farei esta importante decisão?
Não se acanhe... O Pajé trouxe a solução para você! Reflita sobre os itens abaixo, e você terá bons parâmetros para começar sua carreira de maneira certa e objetiva!

Onde quero atuar?
  • Se eu quero ser administrador de redes, é bom saber algo de Shell Script, como Bourne Shell ou C Shell. Isto te tornará apto a escrever scripts para qualquer sistema UNIX like. É possível, de fato, escrever maravilhas, programas inteiros, inclusive com interface gráfica!
  • Se eu quero desenvolver sistemas para Web, então preciso aprender as linguagens dos navegadores, como: JavaScript, HTML, CSS (ou, mais profundamente, XHTML e XML), muitas bem documentadas nas especificações do W3C. Além disso, preciso aprender uma linguagem dinâmica, como PHP ou Java.
  • Se eu quero ser web designer, então ainda sim preciso aprender alguma linguagem (embora muitos se recusem)!! Para me ajudar neste ofício, sempre será bom saber HTML, CSS e/ou ActionScript, por exemplo.
  • Quero ser DBA! Então é bom saber SQL e as suas irritantes variações que cada banco de dados oferece, com suas ferramentas próprias para gerar desde simples pesquisas no banco até complexas stored procedures.
  • Meu mercado será o de jogos? Então convém saber Lua!

Onde encontrarei emprego mais facilmente?

Difícil dizer, mas sabemos que o mercado tem procurado muitos profissionais de sistemas de informação, aqueles que programam em PHP, Java, C#, tecnologias web diversas, ActionScript, etc. Por outro lado, sabemos que Python tem crescido e, oportunamente, abrirá novos horizontes àqueles que lhe têm perseverado. É importante observar que, em média, linguagens orientadas a objetos têm crescido muito, enquanto linguagens procedurais têm caído no mercado. Java parece ser a linguagem mais utilizada no mundo, segundo pesquisas, seguida por C e C++. Uma excelente dica está aqui, onde se pode ser levado ao ranking atualizado das linguagens de programação.

Como devo proceder?

Converse com amigos, colegas e professores sobre as oportunidades de trabalho e as características de cada linguagem. Escolha uma que lhe agrade, pois ela será seu objeto de estudo e trabalho intenso durante muito tempo. É essencial (digo: essencial!!) que você, por mais adiantado que se torne, continue estudando e praticando. Busque as novidades da sua linguagem. As novas APIs, novas versões, novas IDEs, etc. Manter-se atualizado é fundamental.
Outra palavra de ordem: integração. O Pascal estava em pleno declínio, daí o OpenPascal surgiu, permitindo integrar Pascal com GTK, e abriu-se-lhe um novo leque de possibilidades, ganhando novo vigor!! Há anos a indústria vem investindo em ferramentas para integrações e troca de informações, exigindo do profissional conhecimento em XML, SOAP (para "falar" com Web Services), etc. Seja um profissional flexível e você terá mais chances!

sábado, 13 de setembro de 2008

Lançado o GWT 1.5!

Depois de vários meses de desenvolvimento intenso e grande expectativa, foi lançada pela Google a mais nova versão estável do GWT, a 1.5.2. O GWT - ou Google Web Toolkit - é um arcabouço de desenvolvimento web para Java que tem conquistado grande número de adeptos desde o seu lançamento, em 2006. A proposta da Google é ter uma abordagem totalmente nova para o desenvolvimento web: ao passo em que os arcabouços tradicionais estão centrados em ampliar e facilitar o uso de JSPs e Servlets, como o Struts, da Apache, e o JSF - Java Server Faces - da Sun, o GWT não lida com JSPs e mal necessita de HTMLs ou javascript diretamente: com ele, o desenvolvedor escreve todo o seu sistema em Java, desde a parte de servidor até a interface do cliente!

O GWT provê uma vasta API para compor e lidar com os objetos de interface (do DOM) e seus eventos, incluindo muitos componentes complexos. Estas classes são compiladas para javascript, que, em tempo de execução, montará a interface dinamicamente, com o bom e velho DHTML. Praticamente todas as classes do GWT estão preparadas para escutar um ou mais eventos, cujos comportamentos podem ser definindos implementando-se classes listeners para eles a partir de interfaces já fornecidas.

Utilizando o GWT, o desenvolvedor escreve a interface como se estivesse programando uma GUI (ao estilo do Swing). Todas as chamadas ao servidor são via AJAX, obedecendo uma arquitetura de alto nível fornecida pelo GWT, que facilita a manutenção e criação das chamadas e garante ser compatível com os principais navegadores do mercado. Sistemas feitos em GWT podem ser construirídos inteiramente sobre um único arquivo HTML de não mais de 10 ou 15 linhas. O sistema todo funciona sem recarregar a tela uma única vez. O desenvolvedor não precisa usar taglibs, jsp, javascript, XML, etc., apenas o seu rotineiro Java, o que lhe proporciona a facilidade de criar e testar a interface toda com breakpoints em sua IDE predileta (como o eclipse ou o netbeans).

O lançamento da nova versão foi ansiosamente aguardado, vez que a anterior, o GWT 1.4, era compatível apenas com Java 1.4, o que frustrava muitas vezes o desenvolvedor, impedido-o de usar anotações, ter a segurança dos generics (como fazem falta!!), dentre outras facilidades do Java 5 (como aqueles fantásticos métodos do objeto String - i.e. o contains - que só entraram no Java 5 e são tão úteis!). Mas a Google não perdeu tempo: o GWT 1.5 aprimora o arcabouço, tornando-o totalmente compatível com Java 5 (já não era sem tempo!!), além de lhe acrescentar muitas outras novidades. O frenesi do lançamento foi tão grande que, nos primeiros dias, dificilmente se conseguia baixar o GWT novo, pois a conexão quase sempre caía devido ao maciço acesso aos servidores!

Interessou-se pelo GWT mas não sabe por onde começar?? Já é usuário avançado e quer algumas dicas?? Por isso - e por você! - o Pajé adinantou-se, disponibilizando os links abaixo:

Página oficial do GWT: http://code.google.com/webtoolkit/. Guarde essa, viu?

Tutorial oficial do GWT, excelente para iniciantes: clique aqui.

Este é um achado: um tutorial riquíssimo em exemplos de todos os componentes, todo feito em GWT! Clique aqui.

Blog do GWT Brasil: Clique aqui.

Se você já usa GWT e quer algo mais avançado, o Pajé lhe recomenda participar deste concurso.