quinta-feira, agosto 19, 2010

Backup full agendado em HD Externo no Ubuntu Server 10.04

image

Bom, vamos lá.

Cenário: Servidor instalado com Ubuntu 10.04 LTS Server, rede com máquinas Windows (Vista e Seven), no servidor rodando Samba como servidor de arquivos e gerenciador de impressão (Ainda com problemas para detectar os grupos secundários, mas funcionando na base da lista de usuários direto).

Problema: fazer o backup full dos arquivos do samba, agendado.

Comprei um case da Akasa, para conexão via USB, que pode receber HDs externos SATA 2,5” ou 3,5”, montei um HD de 2,5” de 160Gb, para ser o HD para guardar os backups, que era o meu antigo HD do notebook que foi trocado por outro de 750Gb, este HD está com sistema NTFS pois rodava Windows Vista, o novo agora roda Windows 7 Ultimate, nem me dei ao trabalho de formatar com ext3 ou outro sistema de unix, mantive o mesmo, só apaguei todos os dados do HD.

O case da Akasa é este aqui:

image

Akasa Duo Dock, ref: AK-IC008B-BKAM, custa por volta de R$ 130,00, suporta HDs de 2,5”e 3,5”, tem conexão eSata ou USB, funciona 100% no Ubuntu.

O bixinho é bão, viu?

 


   O processo é bem simples, conecta o Akasa via USB do servidor, ele reconhece automaticamente, aí é só descobrir onde que ele conectou, no meu servidor, conectou com /dev/sdc1 pois o servidor já tem 2 HDs de 500Gb.
   Para descobrir onde está o seu HD externo, basta digitar o comando fdisk –l:
# sudo fdisk –l

   Ele vai listar as unidades conectadas, e você poderá identificar o HD, aí é só montar o dito cujo, no meu caso eu decidi chamar de akasa mesmo, para saber que é o dock que está montado:
# sudo mount /mnt/akasa /dev/sdc1

  Ok, agora o HD externo será acessível sempre via /mnt/akasa, porém teremos um problema, teremos que verificar quando o HD externo estará montado, pois isso só vai ocorrer nos dias do backup, nos outros dias o HD estará armazenado fora da empresa, lógico, mas graças ao comando mountpoint podemos verificar quando o case estiver conectado, vamos agora fazer o script para rodar o backup periódicamente:

Obs.: procurei comentar o script para facilitar a compreensão.

-----------------------------------------------------------------------------
#/bin/sh

# Para conter a data do arquivo de backup que sera gerado
DTABKP=`date +%Y-%m-%d`
# Para conter o nome do mes para o arquivo de log - vamos fazer um log por mes
MESLOG=`date +%B`

# Diretorio que deve ser origem para o backup.
DIRORIGEM="/home/rede/ServPat"

# Arquivo para gravar o log do backup
ARQLOG="/var/log/backup/bkpServPat_log.$MESLOG"

# Verifica se o case esta montado no ponto definido, ou seja
#    se o HD externo esta conectado no case via usb

if mountpoint -q /mnt/akasa
then

# A sintaxe do TAR e : tar [parametros] [-f arquivo] [-C diretorio] [arquivos...].

#Parametros:

#    * -c - cria um novo arquivo tar;
#    * -M - cria, lista ou extrai um arquivo multivolume;
#    * -p - mantem as permissoes originais do(s) arquivo(s);
#    * -r - acrescenta arquivos a um arquivo tar;
#    * -t - exibe o conteudo de um arquivo tar;
#    * -v - exibe detalhes da operacao;
#    * -w - pede confirmacao antes de cada acao;
#    * -x - extrai arquivos de um arquivo tar;
#    * -z - comprime ou extrai arquivos tar resultante com o gzip;
#    * -j - comprime ou extrai arquivos tar resultante com o bz2;
#    * -f - especifica o arquivo tar a ser usado;
#    * -C - especifica o diretorio dos arquivos a serem armazenados.
     # Compacta a pasta da rede e joga para o diretorio do HD que esta no case USB
     tar -czvf /mnt/akasa/Backups/bkpServPat_$DTABKP.tar.gz $DIRORIGEM

    # Variavel para retorno das operacoes, para pegar algum erro
    RETORNO=$?

    # SE o retono de erro != 0, esta com erro

    if [ $RETORNO != "0" ]
           then
    # Grava o LOG com o codigo do Erro encontrado

      echo "================================================" >> $ARQLOG
      echo "            ********  E R R O ********" >> $ARQLOG
      echo "Erro na gravacao do backup da rede = $RETORNO" >> $ARQLOG
      echo `date` >> $ARQLOG
      echo "================================================" >> $ARQLOG

   else
      # Senão  esta sem erro
      # Grava no log informando que esta tudo OK
      echo "================================================" >> $ARQLOG
      echo "Backup da rede esta OK" >> $ARQLOG
      echo `date` >> $ARQLOG
      echo "================================================" >> $ARQLOG

   fi

fi

     Pronto, agora é só colocar o script no cron do Linux, e voilá, é sossegado.
      Não é um sistema de backup a prova de furacões e quedas de meteoros, mas é bem seguro.

Dica: Além do webmin (o meu preferido) para administrar o servidor remotamente, uso também o putty que permite um acesso direto ao terminal do server, baixe de http://www.putty.org .

terça-feira, abril 06, 2010

Administrando seu servidor Linux via webmin

webmin-blue

Ok, você decidiu montar um servidor para a sua empresa ou para a sua casa, para as tarefas comuns de um servidor, compartilhamento de arquivos, impressoras, banco de dados, servidor web, etc.

Eu particularmente prefiro uma interface amigável para administração, não tenho problemas com linha de comando, simplesmente encontro meios mais úteis para investir meu tempo, além do que, me é muito mais agradável uma interface amigável do que a linha de comando, que por longos anos me acompanhou na administração de servidores dos mais diferentes tipos e sabores de SO.
Aqui vamos ver como administrar o servidor Linux de maneira remota, via navegador internet, com interface amigável, bonita e poderosa, de forma que mesmo que você necessite de linha de comando, pode usar via o navegador.

Mãos à obra então:

Meu servidor foi montado com o Ubuntu Linux Server 9.10, e baseado neste é que faremos esta explicação.
Primeiro, infelizmente o webmin não vem nos repositórios padronizados da distribuição do Ubuntu Server, você terá que instalar o dito cujo, e usar a linha de comando para isso, mas é muito fácil, veja abaixo:

  1. Cheque se você tem todas as bibliotecas para rodar o webmin, para fazer isto, digite o comando abaixo no prompt de comando:
    sudo apt-get instala perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl
  2. É interessante você atualizar o repositório do APT:
    1. abra o arquivo de fontes de pacotes em /etc/apt/sources.list
    2. Adicione, no fim deste arquivo, as duas linhas a seguir:
      ## Repositório Debian Sarge do WebMin
      deb
      http://download.webmin.com/download/repository sarge contrib
  3. Atualize o APT, para isto digite o seguinte comando:
    sudo apt-get update

  4. Agora basta instalar o webmin, com o comando:
    sudo apt-get instala webmin
Depois de instalado o webmin estará disponível no diretório
/usr/share/webmin, os arquivos de configuração do webmin
junto com todos os módulos dele estarão em
/etc/webmin.

Pronto, para usar o webmin, basta digitar no seu
navegador:
https://<servidor>:10000
   10000 é a porta padrão de instalação do Webmin,
troque o <servidor> pelo nome do seu servidor
ou pelo endereço IP do mesmo.
Para acessar via internet, você deverá fazer um NAT no seu
roteador para direcionar as requisições na porta 10000 para o
servidor a ser administrado.
   Note que o protocolo padrão para acesso ao
webmin é HTTPS e não HTTP.
Nota: Quando você instalar o Ubuntu Server, o único editor de
textos que ele instala é o vi, que eu pessoalmente acho terrível,
desta maneira para editar o sources.list você pode usar o mcedit,
para instalar o mcedit, que é um editor bem melhor que o vi,
basta usar o apt-get, veja abaixo:
  sudo apt-get instala mc

sábado, abril 03, 2010

O futuro do combate ao câncer.

994-davis_micrograph_medium
Esta imagem de microscópio eletrônico mostra nano partículas entregando sua carga letal a células cancerosas.                                                [Imagem: Caltech/Swaroop Mishra] 

    Preste bem atenção, você está vendo acima o futuro do combate eficiente ao câncer, a qualquer tipo de câncer. Os pequenos pontos pretos na imagem acima são nanobots, robôs em escala de nanômetros, entregando uma carga letal para células cancerosas, e só para elas. Na verdade esta carga é um cavalo de tróia, ela irá matar a célula com câncer.
    A noticia mais incrível é que isso aí acima não é ficção, a primeira fase de testes em humanos foi um estrondoso sucesso, e o que é melhor ainda, sem efeitos colaterais.
     O exército de robôs anti-câncer foi criado no Instituto de Tecnologia da Califórnia (Caltech), pela equipe do Dr. Mark Davis. De acordo com o estudo publicado na prestigiada revista científica NATURE, a equipe do Dr. Davis desenvolveu uma maneira segura, limpa e eficiente de entregar sequencias de RNAi para células cancerosas, o RNAi é a sigla para Interferência ácida ribonucléica, uma técnica que ataca genes específicos de células malignas, desabilitando funções internas destas células e matando-as.
     É como um pequeno exércitos de ultra-eficientes e bem treinados agentes especiais, que se infiltram dentro da fortaleza do inimigo, sabotando-a e fazendo com que funções vitais desta fortaleza parem de funcionar, efetivamente levando estas estruturas à morte.
    Para quem é fã de ficção científica, deve se lembrar do Dr. Leonard McCoy da série Jornada nas Estrelas, no filme de 1986 intitulado “O Retorno à Terra”, quando ele injetava em um paciente em um hospital uma dose de nanobots para curar o paciente vitima de uma doença terminal, e resolvia o problema.
    Pois é, mais uma vez a ficção antecipa a realidade.


988-Davis_nanoparticle_schematic_medium

Os pequenos robôs de ataque tem o tamanho de 70 nanômetros, são feitos com 2 polímeros e 1 proteína, que se conecta na superfície das células com câncer, e só nestas.
    Estes pequenos robôs carregam uma peça de RNA chamada de siRNA, sigla para RNA de pequena interferência (small-interfering RNA), este é que desativa a produção de uma proteína nas células com câncer, efetivamente desencadeando a morte da célula.
    O melhor de tudo é que, depois de entregar sua carga letal para a célula cancerosa, o pequeno robô se desmonta, quebrando-se em partes inofensivas que são posteriormente eliminadas pelo corpo através da urina.
   Os pequenos exércitos de nanobots podem ser injetados no paciente via injeção intravenosa, dispensando procedimentos cirúrgicos extensos e caros, uma simples injeção no consultório basta para inserir os pequenos exércitos no campo de batalha, ou seja, no corpo humano.
   Tudo isso de forma eficiente, sem nenhum efeito colateral e preservando a qualidade de vida do paciente.
   Para saber mais, visite a página do estudo na CalTech (obs: a página está em inglês, abre em nova janela).

sábado, janeiro 09, 2010

Quando se morre…

vidaMorte2

Quando se morre realmente? Quando todas as funções vitais param? Quando os aparelhos já não marcam mais nada? Quando o biiiiiiiip continuo do monitor cardíaco soa?

Esta semana pensei muito sobre isso, e concluí que se pode morrer muito antes disso, se pode passar pela vida como um espírito arrastando um cadáver. O que me fez pensar sobre isso é que assisti uma entrevista de um sujeito de 35 anos de idade, que deve ter morrido lá pelos 27, senti muita dó pelo sujeito.

  • Se morre quando o tédio e a rotina já não suscitam mais revolta, apenas conformismo.
  • Se morre quando se tem muito mais respostas do que perguntas.
  • Se morre quando julgamos que apenas o que é antigo é que é bom e que o novo é só lixo, mas também se morre quando se acha que só o novo é que é bom e o antigo é que é só lixo.
  • Se morre quando se pensa que alguém que possua apenas metade da sua idade não pode ter nada para lhe ensinar, mas também se morre quando se acha que alguém com o dobro, ou mais, também não tem nada a ensinar.
  • Se morre quando as certezas suplantaram em muito as dúvidas.
  • Se morre quando se diz “eu te amo” apenas com a boca, e não mais com o coração.
  • Se morre quando o aperto de mão é apenas um gesto, e não um compromisso.
  • Se morre quando novos amigos deixam de acontecer.
  • Se morre quando se faz sempre o mesmo caminho, sem explorar novos lugares, novas cores.
  • Se morre quando o comodismo impede de fazer novos planos.
  • Se morre quando se ri cada vez menos, mas se lamenta cada vez mais.

   Enfim, se morre de muitas maneiras, ainda em vida, pode-se morrer um pouco a cada dia (como já escreveu João Cabral de Melo Neto), basta não viver, basta recusar-se ao mundo.

terça-feira, janeiro 05, 2010

É realmente uma vergonha!

microfone_email

    Todo mundo que trabalha em rádio e televisão sabe, microfone é um bicho prá lá de bandido, quando tudo o que você não quer é transmitir o que está falando, ele está lá, aberto, funcionando, esquecido e pronto para jogar para o mundo as besteiras que você falar perto dele.

   Bóris Casoy provou desta máxima ao apagar das luzes de 2009, em 31 de dezembro no encerramento do Jornal da Band, do qual ele é o âncora, dois garis de São Paulo aparecem, devidamente uniformizados, desejando um feliz 2010 ao povo brasileiro. Na volta do jornal, sem perceber que o áudio estava aberto para o mundo, Boris Casoy faz uma observação com um colega de bancada, para lá de preconceituosa: “Que merda… dois lixeiros desejando felicidades… do alto de suas vassouras… dois lixeiros… o mais baixo da escala do trabalho.

    O comentário do apresentador foi repugnante, as desculpas oferecidas e o comentário sobre as desculpas, foi pior ainda, melhor nem ter feito nada, demonstra que foram apenas desculpas protocolares, “para limpar a barra” por assim dizer, em uma entrevista à Folha de S.Paulo revela que na verdade ele apenas sente muito por o microfone estar aberto, não pelo comentário proferido, diz ele: “Foi um erro, vazou, era intervalo e supostamente os microfones estavam desligados.

    Porém tão repugnante quanto o comentário de Boris, são muitos dos artigos que estão sendo escritos condenando-o, uma grande maioria cheios das expressões preferidas dos pseudo-intelectuais e ofensas gratuitas, como “fascista” – nem ao menos esses escribas possuem a noção da exata dimensão deste termo, do contrário não o empregariam a torto e a direito. Até as críticas (justas, diga-se de passagem) que Bóris já fez ao governo Lula são desqualificadas e tratadas como recalque das elites (outro termo que estes escribas adoram usar, mas que empregam sem noção), usam o lamentável e infeliz episódio como se isso pudesse desculpar todos os desmandos, roubos e safadezas que a turma do PT, do mensalão e tantos outros safados já fez ao país, como se um único comentário infeliz apagasse todos os escândalos ocorridos na vida pública brasileira.

     Uma pequena amostra das críticas tão repugnantes quanto o fato em si: http://www.correiodobrasil.com.br/noticia.asp?c=161861 (destaque especial para os empregos de “fascistóide”, “colunistas elitistas”, “mídia hegemônica”, “oposição de direita”, “discurso raivoso”, “movimentos grevistas”, “posições imperialistas dos EUA”, e outras pérolas que pululam por todo o texto).

    Agora parece que o governo Lula e a quadrilha que infelizmente se instalou no poder devem ser desculpados de todos os roubos e desmandos, apenas porque um jornalista fez um comentário preconceituoso.

    Bem, eu não acredito nisso, e acho que uma grande parcela do povo brasileiro também não, assim como os benefícios das privatizações também não desculpam a farra e os escândalos que foi o apagar das luzes do governo FHC, um comentário infeliz de um jornalista não invalida as denúncias de corrupção e os escândalos do atual governo.

    Muito ainda hão de gritar contra as elites, os golpistas, e tantos outros termos que usam contra quem não concorda com os desmandos. Até porque no jargão destes pseudo defensores do povo, qualquer aglomerado de arruaceiros que se reúnam para tentar ir contra a propriedade privada ou os setores produtivos é chamado de “forças democráticas populares”, até os quadrilheiros facínoras do MST merecem destes pseudo-intelectuais desculpas (leia a íntegra do texto no link anterior), como se isso fosse possível.

O fato não se altera, Boris Casoy foi repugnante em seu comentário, mas também são repugnantes as invasões e assassinatos do MST, o mensalão, a roubalheira na saúde, nos orçamentos da união, a compra de votos por parte do governo, as mentiras de Lula e Dilma Roussef, o aparelhamento da máquina estatal pela quadrilha que lá se instalou (e não é só o PT), os dólares na cueca, o escândalo do mensalão de Brasília (este uma obra da oposição, provando que não precisa ser do governo ou do PT para fazer bandidagem neste país).

segunda-feira, janeiro 04, 2010

PRAZOS, PRAZOS – Como cumpri-los?

AQUA ICONS FOLDER SCHEDULED TASKS   Confesso, tenho um problema crônico com prazos, sou ruim com eles (já melhorei muito, eu era péssimo), principalmente em um área como TI, que é (mal) falada por conta do problema dos prazos.
      O que tenho feito é uma lista de tarefas, na mão mesmo, pois as do computador nenhuma funcionou para mim, sei lá por que motivo mas não funcionou. Divido as tarefas em:

  • URGENTES – são aquelas que vão te ferrar se não ficarem prontas, ou o cliente vai cancelar o serviço, ou você não vai receber e as contas vão atrasar, ou teu fígado vai ser saboreado cru pelo cliente, e que já estão atrasadas.
  • IMPORTANTES – São aquelas que se você não fizer vão te dar um problemão, tanto quanto as urgentes, mas ainda não estão atrasadas, ou seja, o garfo ainda não chegou no teu fígado.
  • NECESSÁRIAS – Aqui entram aquelas que você precisar fazer para ter alguma perspectiva de futuro (pagar a luz, aluguel, reunião com um prospect, evento para fazer contatos, etc.).
  • OUTRAS – São aquelas que você pode delegar para outras pessoas ou pode postergar por um longo período sem maiores consequências.

   Estou fazendo o seguinte, divido o dia em resolver 60% de urgentes, 25% de importantes (para que não se tornem urgentes), e divido os 15% restantes entre as necessárias e outras.

   Está dando certo, o meu problema agora é aprender a classificar as tarefas na categoria certa (rsss, nem tudo é perfeito no mundo né?). Mas não sei porque, mesmo eu sendo um cara de TI, de ter aversão à papel, só funcionou quando coloquei a lista no papel!!! Vai entender.

     O meu contador ficou feliz, disse que finalmente conseguiu fazer uma reunião comigo de mais de 30 minutos. Sinal de que as coisas estão melhorando (pelo menos para ele).

sábado, outubro 10, 2009

A desgraça cubana pelos cubanos.

yoani-sanchez

   A moça aí ao lado é Yoani Sanchez. Pois esta dona é cubana, nasceu, cresceu, foi educada, casou e (ainda) vive em Cuba, aquela ilhota dos irmãos Castro no Caribe.

   Para aqueles que ainda acham que a ilha dos Castro pode servir de bom exemplo para alguma coisa (acredite, tem gente que ainda acha isso), a moça dá um relato realista da situação por lá, sem as maquiagens e ideologias dos pseudo-intelectuais que acham que aquilo lá é uma maravilha (mas não estão dispostos a se mudar para lá e nos poupar de suas chatices né?), a entrevista dela nas páginas amarelas da Veja é um relato realista das precárias condições da ilha.

     Pois a dona aí recebeu vário prêmios por conta do seu blog que relata o dia-a-dia de Cuba, só que não pode recebe-los, pois sair da ilha nem pensar né?

   Mas para o Brasil ela pode vir, o Coma Andante da ilha pode ficar tranquilo, pois aqui temos alguns canalhas no poder que se encarregam de, covardemente, repatriar qualquer servo dos Castro que ouse tentar se livrar do jugo, como fez o Tarso Genro no caso dos Boxeadores Cubanos, de forma abjeta e vil.

   E, se você acha que não existem mais idiotas no mundo que acreditem que Cuba e Coréia do Norte (sim, aquela mesma do baixinho amalucado com cabelo punk) sejam paraísos na terra, você não conhece o povinho deste site aqui.

   Eu acho que esse povo que acha Cuba uma maravilha deveria se perguntar porque o povo quer fugir desesperado do paraíso, arriscando até virar comida de tubarão na travessia do golfo do México, seria por masoquismo???

terça-feira, agosto 25, 2009

DbTreeView no Delphi - JvDbTreeView

Bom, depois de apanhar um pouco para conseguir colocar para funcionar, aqui vai a dica de como fazer um plano de contas ser mostrado numa TreeView, no caso vamos usar a jvDbTreeView que é uma TreeView dbaware no Delphi.

Como vamos usar o componente na JVCL, aqui vai o link para baixar http://sourceforge.net/projects/jvcl/, é um excelente pacote de componentes, praticamente tudo que você precisar, acaba descobrindo que tem lá.

Criei a minha tabela no Firebird, a estrutura abaixo:

Campo Tipo Descrição
Cta_ID integer Numero da conta
Cta_Master integer Conta “pai”
Cta_Descricao Varchar(30) Nome da conta

Coloque um componente JvDbTreeView no formulário, conecte-o via a propriedade DataSource à tabela do banco de dados.

Ajuste as suas propriedades do JvDbTreeView como abaixo:
Obs.: No meu caso o dataSource chama-se dsPlanContas.

Propriedade Valor
DataSource dsPlanContas
DetailField Cta_Master
ItemField Cta_Descricao
MasterField Cta_ID

   Pronto, já está OK e pronto para funcionar.

A explicação das propriedades é a seguinte:
DataSource: Obviamente é a conexão à base de dados;

DetailField: É o campo que contém o valor que aponta para a conta pai.

ItemField: é o texto que vai aparecer na TreeView.

MasterField: é a chave única da tabela.

       Quem reescreveu o componente deve ter problemas sérios para atribuir nomes às propriedades, custei para conseguir entender, mas aí está o mapa da mina.

Abaixo um exemplo do que está no banco de dados:

Cta_Id Cta_Master Cta_Descricao
1 0 DESPESAS
2 1 DESPESAS FIXAS
3 2 PESSOAL
4 11 ALUGUEL
5 11 CONDOMINIO
6 0 RECEITAS
7 6 RECEITAS DIRETAS
8 3 CLT
9 3 FREES
10 2 CUSTOS DIRETOS
11 10 IMÓVEIS
12 1 DESPESAS VARIAVEIS
13 12 COMBUSTIVEIS
14 12 COMISSÕES
15 12 MATERIAL DE EXPEDIENTE
16 12 MANUTENÇÕES
17 12 EXAMES MÉDICOS

sábado, agosto 22, 2009

A volta da proposta de regulamentar a profissão no mercado de informática.

Bom, eu já escrevi diversas vezes, em newsgroups e fóruns sobre este tema, infelizmente nunca no blog. Vou sanar agora esta falha, para que o texto pelo menos fique registrado, e eu possa depois mencionar sem precisar reescrever tudo.

Em primeiro lugar, convém esclarecer que, caso seja aprovada a regulamentação da profissão, eu estaria dentro dessa reserva de mercado, portanto a minha posição nada tem de inveja (como alguns mais exaltados defensores dessa sandice propalam) ou outro sentimento, digamos… “menos nobre”.

Mas sou RADICALMENTE CONTRA a regulamentação da profissão de analista de sistemas, como também de outras como leiloeiro oficial (sim também querem regulamentar), flanelinha (acreditem, é verdade, veja aqui), capoeirista (duvida? então veja…), corretor de imóvel, contador, e várias outras.

Mas a discussão aqui é sobre analista de sistemas, aliás o próprio termo já é um tanto antigo e esta praticamente caindo em desuso, até porque as competências para construir um software como produto vão bem além disto.

Sou contra por várias causas, algumas:

- Regulamentação não é garantia de competência, o mercado já se encarrega de separar o joio do trigo, hoje vale muito mais uma certificação do que a regulamentação. Os defensores argumentam que software lida também com vidas humanas, como software de aviônicos, equipamentos hospitalares, usinas nucleares, etc.

   Oras, alguém pensa seriamente que a regulamentação fará alguma diferença nisso? Nenhuma empresa contrata um programador ou analista de sistemas para fazer software para incubadoras neo-natal por exemplo, isso é desenvolvido por empresas estabelecidas, com certificações CMM, ISO e por aí afora vai, o software tem que ser homologado e certificado, não interessa se o analista é diplomado ou não, o mesmo para softwares de avionica, para usinas e por aí afora vai.

   Pensam muitos que é necessário para frear a competição desmedida, que avilta os ganhos dos profissionais. Eu tenho a minha empresa de software, a competição no mercado é tanto com outras empresas quanto com profissionais independentes, eu não baixo o meu preço aquém do que considero justo e que minha planilha de custos mostra ser o razoável, e tem concorrentes no mercado cobrando 5% do meu preço final. Há mercado para eles e há mercado para a minha empresa também, tudo depende do cliente, e não será uma regulamentação que irá banir os camelôs de sistemas do mercado. Isso é competição, é concorrência, é saudável e bem vinda, graças à esta competição a qualidade aumentou (pelo menos a minha).

   Regulamentação é apenas reserva de mercado, e quem se beneficia disso, historicamente comprovado, são os incompetentes, vide a famigerada, nefasta e de triste lembrança, reserva de mercado de informática. Os bons profissionais, diplomados ou não, tem espaço no mercado, são disputados por empresas e pelo mercado. Apenas as empresas de fundo de quintal, ou a quitanda da esquina, e mesmo assim olhe lá, é que vão contratar o sobrinho do amigo do cunhado para fazer um programinha para controlar o estoque, esta é uma fase já passada, a realidade é outra.

    Hoje temos inclusive carência de bons profissionais no mercado, veja bem, de bons profissionais, profissionais diplomados ou não tem aos montes, mas qualidade é algo que anda raro, e é muito valorizada.

    Existem excelentes profissionais oriundos das faculdades, mas infelizmente existe também uma grande parcela que sai da faculdade sem noção de mercado, com parcas idéias teóricas, sem embasamento na realidade, sem falar nos que são incapacitados intelectualmente para exercer a profissão, e falo com conhecimento de causa, já perdi a conta de estagiários oriundos de várias faculdades que passaram pela empresa, e as estatísticas comprovam que mais de 80% não possuem condições mínimas para trabalhar, falta-lhes capacidade de raciocínio, ainda mais em uma área extremamente dinâmica como TI, aonde o conhecimento que tenho hoje é nada amanhã, temos que pesquisar, aprender, descobrir e manter-se em dia com as novas tendências e tecnologias, e esse ciclo se renova a cada semana, portanto não é um diploma que vai dar o estofo necessário para atuar nessa área.

    A regulamentação vai apenas onerar um pouco mais nossa atividade, com anuidades para conselhos, federações, e por aí afora vai, além de abrir um bom número de cargos para serem preenchidos por apaniguados políticos, e sustentados por nós.

    Um dos maiores entraves do Brasil é o custo trabalhista, e com a regulamentação estaremos burocratizando e onerando ainda mais uma área em que o dinamismo deveria operar. O que vai ocorrer é que grandes empresas de software, que hoje são grandes contratantes, vão acabar migrando a contratação de seus serviços para Índia, Paquistão, China, etc.

    Argumentam que só os relaxados, que nunca foram atrás de um diploma estão preocupados com isso. Bom, eu não me considero um relaxado, e como já expliquei no inicio do texto, eu estaria na turma dos “beneficiados”, mas discordo deste argumento, isso é uma desculpa esfarrapada de quem deseja ardentemente a regulamentação, para estabelecer uma reserva de mercado para si, ou por ter medo de encarar a competição do mercado, ou por comodismo mesmo.

    A regulamentação vai criar uma classe comodista, como já ocorre em algumas outras, e quem vai perder com isso é a sociedade como um todo, menos competição, menos desenvolvimento, preços maiores, enfim prejuízo para todos.

   Argumentam que os que “se acham competentes” mas não possuem diploma, que corram atrás do diploma, e que não precisam se preocupar com isso. É uma falácia, muitas vezes quem tem longa experiência e não é formado na área, não tem tempo de voltar para os bancos de uma faculdade.

   E quando se volta para os bancos de uma faculdade, chega a ser irritante o nível primário do corpo docente, que parece viver no mundo de Alice (com exceções é claro), com muito pouca noção de mercado, prazos, SLAs e como se produz software como produto.

   Com a quantidade cada vez maior de faculdades que não conseguem as notas mínimas, imagino o nível de profissionais que serão regulamentados, e com isso enganando o mercado. Sim, porque hoje o mercado sabe que existe tanto o picareta quanto o competente, mas com profissionais regulamentados, com a carteira na mão, muitos pensarão que isso será garantia de qualidade, o que não é.

    Sem falar que o legislador propõe regulamentar uma categoria que está em franca extinção. Não se faz mais software como produto apenas com Analista de sistemas e programadores, hoje precisamos das competências de um Engenheiro de software, um analista de negócios, e muitas outras competências, que vão muito além de um simples analista de sistemas.

   Então, eu não vejo nenhuma real vantagem para os profissionais e para o povo, em ter a profissão regulamentada e uma reserva de mercado, vejo isto sim uma tentativa de explorar o nosso bolso, criando mais um custo para bancarmos, além de proteção para os incompetentes que não conseguem se manter no mercado.

domingo, agosto 09, 2009

Aos poucos o gado vai acostumando com o jugo.

 

E aos poucos os conselhos de Maquiavel vão se confirmando, assim como as orientações de Antonio Gramsci, ainda que não empregadas dentro da sua ótica marxista.

A respeito da recente lei anti-tabagismo em São Paulo, a esmagadora maioria está bovinamente aceitando e aplaudindo.

Os que ousam levantar a voz contra, como já fiz, é sumariamente tachado de todos os epítetos pouco elogiosos imagináveis, além de ofensas verbais, e acusações do tipo “Egoísta, não se importa com os outros”, e por aí afora vai.

Oras, eu larguei o cigarro já tem mais de 9 anos, vez ou outra me atrevo a saborear um “puro” (charuto, para os menos íntimos do hábito), mas sou não fumante, a fumaça do cigarro inclusive me incomoda, portanto as ofensas e xingamentos raivosos caem no vazio, pois erram solenemente o alvo.

Porém me incomoda muito mais, não só me incomoda, me revolta, me causa repúdio, profunda revolta, o Estado metendo-se a tutor de minha vida privada, meus hábitos e até mesmo de cuidar da minha saúde. Não trabalho bem com a idéia de um estado controlador, isso liga em mim, de maneira automática e instintiva, o bixo da revolta, me vem à mente as multidões controladas pelo estado na China, Coréia, Cuba, ex-URSS, e por aí afora vai, e não posso ficar calado, quieto e aceitar isso como normal.

O que a maioria dos que aplaudem essa lei arbitrária parecem ignorar é que o foco da discussão está errado, enquanto o governo, como um déspota auto nomeado tutor de minha vida, brada demagogicamente aos quatro ventos contra os malefícios do cigarro, à maneira de um hábil prestidigitador que desvia o foco da cena principal, vai introduzindo no dia-a-dia do cidadão leis policialescas, privativas de liberdades, tutoras de direitos mais intimos, e mostrando o foco distorcido, consegue o aplauso da patuléia, como o boi que aceita de bom grado a água e o capim na estrada para o abatedouro.

Porque não se fez tanto empenho para disciplinar uma separação física de fato dos ambientes de fumantes e não fumantes, como existe em Salvador? Porque o impacto da lei promulgada gera muito mais dividendos eleitorais, e o (des)governador José Serra está de olho no Alvorada em 2010 e não no mandato de governador que deveria exercer.

Enquanto isso dezenas de pessoas (crianças, jovens, adultos e até velhos) se acabam fumando pedra nas Cracolândias por esse Brasil afora, e os governantes nada ou muito pouco fazem para solucionar o problema, novamente porque isso não gera dividendos eleitorais a curto prazo, esse é um problema que demanda energia, tempo, dedicação, esforço e trabalho, muito trabalho, para dar frutos em 1 ou 2 décadas, é muito tempo para os nossos politiqueiros de plantão, que querem colher os frutos agora, afinal há tempos perdeu-se o interesse coletivo de vista, em prol dos interesses pessoais e imediatistas dos politiqueiros que fizeram disso o seu meio e fim de vida.

O que me espanta é a maneira bovinamente plácida com que as pessoas, inclusive muitas tidas como cultas, aceitam a tutela do estado, via leis arbitrárias, em suas vidas.

Esse é um dos males seculares da América Latina, essa cultura ibérica de que o estado deve ser o grande pai, a tudo provendo, a tudo orientanto, a tudo tutelando, como se fossemos incapazes de tomar conta de nosso próprio nariz (e na maioria das vezes eu acho que uma grande parte da população é incapaz sim). É o oposto da mentalidade anglo-saxã dos nossos irmãos do Norte, que prezam a liberdade individual acima de tudo, e jamais aceitariam o estado lhes ditando o que fazer, por isso as ditaduras florescem muito mais nestas bandas, pois encontram terreno fértil no populacho.

sexta-feira, maio 08, 2009

DLINK DI-624 Reiniciando rede wireless

      Problema: Meu roteador com Wireless da Dlink, um DI-624, já bem rodado, começou nos últimos dois dias a reiniciar a conexão wireless a cada 2 ou 3 minutos, sem mais nem menos.

      Não consigo falar com clientes no skype, nem com parceiros de projetos, e olha que tenho 1 que está em Sofia, na Bulgária e outro em Athenas, imagina sem o skype a quanto vai o custo do projeto?

     Quebrei a cabeça, teve gente que me falou que o problema deveria ser o e-mule ou o bittorrent, desliguei os dois, nada, continuou a mesma coisa, resolvi desligar a máquina aonde está o e-mule, que apesar de ser varrida por antivírus diariamente, poderia estar infectada.

     Nada, resolvi partir para atualizar o firmware do roteador. Atualizado, configurações restauradas e… a mesma coisa.

    O log do router não me deu muitas informações, então navegando pela web pela conexão com cabo (sim tive que voltar a colocar cabo no notebook para poder estabilizar a dita cuja), encontrei alguns comentários em um site de hardware americano, algumas pessoas enfrentavam o mesmo problema.

    A solução? Fazer o upgrade de firmware, mas isto eu já tinha feito e não tinha dado certo.

   Agora é que vem o pulo do gato, um dos caras desse fórum também havia feito o upgrade e não havia resolvido, então ele informou que refez o upgrade mas do site alemão da dLink, e aí funcionou.

    Mesmo duvidando um pouco, fui lá e fiz o download, intrigado, aparentemente é a mesma versão que eu baixei do site americano, mas… vamos em frente e ver no que dá.

   Não é que funcionou? Fiz o upgrade as 18h00, e até agora está estável a conexão. Vai entender….

    Fica aqui a dica, se você está com este mesmo problema, baixe o upgrade do firmware do site alemão da D-Link.

www.spectrus.com.br

quarta-feira, abril 01, 2009

Rotas com o Google Maps no Delphi – versão simplificada.

 

      Após publicar as matérias anteriores sobre como mostrar os mapas do Google e como traçar rotas do Google a partir de aplicativos Delphi, conversando com o Paulo Geloramo da Assis Informática de Assis – SP, ele me mostrou uma versão mais simplificada que ele fez da rotina.

     Durante a nossa conversa, acabamos indo pesquisar o que seriam alguns dos parâmetros que existem no final da URL de pesquisa que carrega o mapa e traça a rota.

      Fazendo algumas experimentações, chegamos à conclusão e constatamos que a rotina funciona mesmo sem aqueles parâmetros, o que a torna mais simplificada ainda.

     Bom, aqui abaixo mais uma função para mostrar o mapa e traçar a rota, agora bem mais simplificada:

procedure Rota(Logradouro1, Numero1, Cidade1, UF1, CEP1, Logradouro2, Numero2, Cidade2, UF2, CEP2: string);
var
    strUrl: String;
begin
  strURL := 'http://maps.google.com.br/maps?f=q&source=s_q&hl=pt-BR&geocode=&q=' +
            ' from: ' +  AnsiToUtf8(Logradouro1) + ', ' +  Numero1 + ', ' +
            AnsiToUtf8(Cidade1) + ', ' +  UF1 + ', ';
  if Length(CEP1) > 1 Then
     strURL := strURL + FormatMaskText('99999-999;0; ', CEP1);
  strURL := strURL + ' to: ' +  AnsiToUtf8(Logradouro2) + ', ' +
                      Numero2 + ', ' +  AnsiToUtf8(Cidade2) + ', ' + UF2 + ', ';
  if Length(CEP2) > 1 Then                     
     strURL := strURL + FormatMaskText('99999-999;0; ', CEP2)' + ‘&ie=UTF8’;
  ShellExecute(0, nil, PChar(strURL), nil, nil, 0);
end;

    Veja que os parâmetros de CEP podem não ser informados (passar uma string vazia como parâmetro), mas se o endereço existir em duplicidade na cidade (como é o caso de São Paulo), você terá problemas ao traçar a rota.

    Para definir corretamente o endereço, passe o parâmetro de CEP para a API processar a URL sem ambiguidades.

    Você pode acrescentar o parâmetro de zoom ao final da URL, utilizando o parâmetro ‘&z=’, se optar por não utilizar este parâmetro será retornado o mapa com o zoom abrangendo toda a rota, e o usuário poderá posicionar e escolher o nível de zoom manualmente.

     Veja também que foi usada a função AnsiToUtf8 do Delphi, isto é para os casos em que você possui acentuação no nome do endereço, se não usar esta conversão, a função não irá funcionar como o esperado.

www.spectrus.com.br

domingo, março 29, 2009

Traçar rotas a partir do Delphi com o Google Maps

 

         Continuando a partir do artigo anterior “Mapas do Google no seu aplicativo Delphi”, vamos agora avançar um pouco mais, traçar rotas entre dois pontos, e mostrar isto ao usuário.

          Esta é uma funcionalidade interessante para aplicativos como CRM ou de logística. Você pode obter informações completas sobre como utilizar as APIs do Google Maps em www.google.com/apis/maps, a maioria dos exemplos contempla Java, Javascript, PHP ou Python, porém não é dificil adaptá-los à linguagem que você utiliza, como estamos fazendo com o Delphi.

           Para usar as APIs do Google, você precisa obter uma chave única e exclusiva sua, é de graça, e lhe dá acesso à todas as funcionalidades do Google Maps. Neste exemplo não vamos utilizar esta chave, é apenas um exemplo, muito embora você possa utilizar sem ter uma chave, como você pode constatar pelo código neste artigo, é aconselhável que você obtenha esta chave, por uma questão de copyright.

          Bueno, vamos botar a mão na massa.

          Primeiro de tudo você irá precisar, para mostrar o mapa, das coordenadas do ponto a ser mostrado na tela, normalmente você mostrará na tela o ponto inicial da rota, permitindo ao usuário que acompanhe a rota a partir do ponto de origem, porém você pode mostrar o ponto final da rota, a seu critério. Por este motivo criamos uma função para retornar as coordenadas.

          As coordenadas (e mais uma série de informações sobre o endereço) são retornadas em um arquivo xml, você também pode solicitar que seja retornado em formato csv (separado por vírgulas). No caso de um arquivo xml a API do Google Maps retorna informações bem completas, incluindo até mesmo o CEP, no caso de arquivo CSV serão retornadas apenas as coordenadas.

        Neste artigo iremos trabalhar com o arquivo XML, pois se você desejar obter mais informações sobre o endereço basta incrementar o código.

        Como este artigo é direcionado para todos os desenvolvedores DELPHI, incluindo os iniciantes, vou tentar manter o código o mais simples possível, mesmo que em algumas partes pareça que há redundância ou que o código poderia ser reduzido, creio que desta forma fica fácil para todos acompanharem a metodologia, sinta-se a vontade para refatorar o código.

       Para este código você deverá declarar a unit XMLDOC na parte de interface da sua unit.

Vamos também declarar um objeto do tipo XMLDocument para trabalhar com as informações retornadas pelo Google.

vXMLDoc : TXMLDocument;

       Na inicialização da Unit, ou no evento onCreate do Form, você deverá criar o XMLDocument:

    vXMLDoc := TXMLDocument.Create(Self);

      Vamos criar a função que irá preencher as coordenadas, apenas para fins informativos mantivemos o array com 3 dimensões, na primeira iremos manter as coordenadas como recuperadas do arquivo xml, isto é apenas para fins informativos, você poderá consultar esta ocorrência do array para verificar como as coordenadas foram lidas. No seu aplicativo final de produção você pode eliminar esta ocorrência.

function getCoordenadas(Logradouro, Numero, Cidade, UF, Pais: String): String;

var

//Vamos declarar um array para trabalhar com as coordenadas:
   strCoordenadas: array[0..2] of String;
   strURL: String;
   idx, inicio, tamanho : integer; // para manipular as strings de retorno

begin

Try

  Result := ‘’;

   strURL := ‘http://maps.google.com/maps/geo?q=’ +
                  Logradouro + ‘, ‘ + Numero + ‘ – ‘ + Cidade +
                  ‘ – ‘ + UF + ‘, ‘ + Pais + ‘&output=xml’;
   // O parâmetro final da string output determina o tipo de
   //    informação retornada (csv ou xml).
   //  Agora fazemos o xmldocument ler o retorno da URL

   vXMLDoc.FileName := strURL;
   vXMLDoc.Active := True;

   // Se você quiser aprender mais sobre o retorno do Google.
   // coloque um TMemo no formulário e passe o texto retornado
  //  para este TMemo, para ver o que é retornado, como abaixo:

  Memo1.Lines.Clear;
  Memo1.Lines.Add(vXMLDoc.XML.Text);

  if not vXMLDoc.Active Then
     exit;

For idx := 0 to vXMLDoc.XML.Count -1 do
    begin
    If Pos('<coordinates>', vXMLDoc.XML[idx]) > 0 Then
       begin
       inicio := Pos('<coordinates>', vXMLDoc.XML[idx]) + 13;
       tamanho := (Length(vXMLDoc.XML[idx]) - inicio) - (Length(vXMLDoc.XML[idx]) - (Pos('</coordinates>', vXMLDoc.XML[idx])));
       strCoordenadas[0] := Copy((vXMLDoc.XML[idx]), inicio, tamanho);
       end;
    end;

If length(strCoordenadas[0]) > 0 Then
   begin
   strCoordenadas[1] := Copy(strCoordenadas[0], 1, Pos(',', strCoordenadas[0]) -1);
   strCoordenadas[2] := Copy(strCoordenadas[0], Pos(',', strCoordenadas[0])+ 1, Length(StrCoordenadas[0]));
   if Pos(',', strCoordenadas[2]) > 0 Then
      StrCoordenadas[2] := Copy(strCoordenadas[2], 1, Pos(',', strCoordenadas[2]) - 1);
   end;

// Se você colocou um Memo para verificar o que é retornado,
//      pode adicionar as coordenadas para verificar se está tudo OK.
//  Lembre-se de retirar isto no software de produção.
Memo1.Lines.Add(strCoordenadas[0]);
Memo1.Lines.Add(strCoordenadas[1]);
Memo1.Lines.Add(strCoordenadas[2]);
Result := strCoordenadas[2] + ‘,’ + strCoordenadas[1];

Finally

End;

end;

 

    Agora vamos declarar uma função para receber os endereços, as coordenadas e retornar a URL para traçar a rota. As URLs para buscar as coordenadas e para traçar as rotas, ficam mais fácil de gerenciar se você declarar na parte de interface da unit. Aqui declaramos as URLs no corpo das procedures e functions para facilitar o seu entendimento, apenas para fins didáticos.

Function Rotear( De_onde, Para_onde, coordenadas: String): String;
var
  strURL : String;
begin
   Try
       
Result := ‘’;

   // URL para traçar a rota no google
   // O parâmetro z (o último da URL) é o fator de zoom
   //  a ser aplicado ao mapa, experimente com outros
   // valores (valores maiores, mais zoom, e vice-versa).

   strURL := ‘http://maps.google.com/maps?f=d&source=s_d&saddr=’ + 
                   De_onde + ‘&daddr=’ + 
                   Para_onde + ‘&hl=pt-BR&geocode=&mra=pe&mrcr=0&ie=UTF8&ll=’ +
                   coordenadas + ‘&z=16’;

Result := strURL;

Finally

end;

end;

 

   Agora vamos usar a mesma função que usamos no outro artigo sobre mostrar mapas do google no delphi, para mostrar o mapa com a rota traçada:

     Temos uma tabela de Clientes, 5 campos desta tabela nos interessam, que contém os dados que usaremos para pesquisar no mapa.

    Logradouro = Contém o nome do logradouro do endereço, por exemplo “Rua Jesuíno Arruda”.
    Numero = Contém o número do endereço, apenas o número e não o complemento (sala, loja, etc), por exemplo: 769 
    Cidade = O nome da cidade, por exemplo: São Paulo
    UF = A sigla do estado, exemplo SP.
    País = O nome do país;

    E agora criar uma função que vai fazer o trabalho, é simples, prático e bem rápido.

procedure TForm1.CarregaMapa;
var

   strURL, deOnde, paraOnde, coordenadas : String;
begin
  // Localizamos o endereço inicial

  Clientes.Locate(‘ClienteID’, VarArrayOf([clienteInicial]),[]);

   Coordenadas := getCoordenadas(Clientes.FieldByName('Logradouro').AsString, Clientes.FieldByName('Numero').AsString,       Clientes.FieldByName('Cidade').AsString, Clientes.FieldByName('UF').AsString, Clientes.FieldByName(‘Pais’).AsString);

  deOnde := Clientes.FieldByName('Logradouro').AsString + ', ' +
                  Clientes.FieldByName('Numero').AsString + ', ' + 
                  Clientes.FieldByName('Cidade').AsString + '-' +
                  Clientes.FieldByName('UF').AsString + ‘, ‘ +
                  Clientes.FieldByName(‘Pais’).AsString;

 

// Vamos localizar o endereço de destino
  Clientes.Locate(‘ClienteID’, varArrayOf([clientefinal]), []);

        paraOnde := Clientes.FieldByName('Logradouro').AsString + ', ' +
                  Clientes.FieldByName('Numero').AsString + ', ' + 
                  Clientes.FieldByName('Cidade').AsString + '-' +
                  Clientes.FieldByName('UF').AsString + ‘, ‘ +
                  Clientes.FieldByName(‘Pais’).AsString;

  strURL := Rotear(deOnde, paraOnde, Coordenadas);
  ShellExecute(0, Nil,  PChar(strURL), Nil, Nil, 0);

// Fiz a chamada acima para que ficasse mais claro, mas você
// pode otimizar a clareza do código fazendo a chamada :
// ShellExecute(0, Nil,  PChar(Rotear(deOnde, paraOnde, Coordenadas)), Nil, Nil, 0);


end;

    Bom, com isso você já consegue colocar a funcionalidade de fazer rotas no seu aplicativo, você pode usar um TWebBrowser e embutir isto dentro do seu software. Há vantagens e desvantagens nisto, eu pessoalmente prefiro chamar um browser externo.

     Como o TWebBrowser é baseado na engine do Internet Explorer, se o usuário tiver outro browser instalado (Opera, FireFox, Safari, etc), e não tiver o Internet Explorer instalado, seu aplicativo vai apresentar erro, e a bela funcionalidade que você implementou não irá funcionar. Da maneira como fizemos, o browser padrão do usuário é que será chamado, seja ele qual for.

    www.spectrus.com.br

Mapas do Google no seu aplicativo Delphi.

 

      Bom, você certamente já pesquisou algum endereço pelo google maps, e ficou imaginando que colocar aquilo no seu aplicativo seria uma boa idéia.
      Pois agora, seus problemas “acabaram-se”, com o novo googlemapeitorparaseuaplicativeitor Tabajara, as coisas finalmente vão acontecer.

      Veja abaixo como fazer para colocar o Google para trabalhar para você, e mostrar para seus clientes, ou para o chefe, como você é esperto (Não tanto quanto o Larry Page e o Sergey Brin, pois eles ganham fortunas com o Google, e você ainda está bem distante de conseguir comprar 1 Boeing só para fazer baladas nos céus como eles fazem).

     Mãos à obra entonces:

     Temos uma tabela de Clientes, 4 campos desta tabela nos interessam, que contém os dados que usaremos para pesquisar no mapa.

    Logradouro = Contém o nome do logradouro do endereço, por exemplo “Rua Jesuíno Arruda”.
    Numero = Contém o número do endereço, apenas o número e não o complemento (sala, loja, etc), por exemplo: 769 
    Cidade = O nome da cidade, por exemplo: São Paulo
    UF = A sigla do estado, exemplo SP.

Vamos criar uma função que vai fazer o trabalho, é simples, prático e bem rápido.

procedure TForm1.CarregaMapa;
begin
  ShellExecute(0, Nil,
    PChar('http://maps.google.com.br/maps?f=q&source=s_q&hl=pt-BR&geocode=&q=' +Clientes.FieldByName('Logradouro').AsString + ', ' + Clientes.FieldByName('Numero').AsString + ', ' +
      Clientes.FieldByName('Cidade').AsString + '-' + Clientes.FieldByName('UF').AsString + '&jsv=143c&sll=-23.186453,-46.884453' +
      '&sspn=0.478436,0.545883&g=&ie=UTF8&ct=clnk&cd=1'), Nil, Nil, 0);
end;

    Basta chamar a função e será carregado o browser com o mapa correspondente ao endereço passado.

    No próximo post vamos ver como fazer para, além de mostrar o mapa, traçar a rota entre dois endereços.

    Como sempre falo : Google é seu amigo, use-o.
    www.spectrus.com.br

Movendo colunas e linhas em um StringGrid.

 

      Na maioria dos componentes Grids, de terceiros, você pode observar que o usuário pode mover colunas e linhas usando o mouse. Aliás, o usuário espera este comportamento de um Grid. Então, como fazer isso usando um TStringGrid?

      Como sempre, se é isso que você estava querendo implantar em seu aplicativo, mais uma vez “seus pobrêma se acabaram-se”,  apresentamos o incrível GridColumnRowMoveitor Tabajara.

      Mais uma vez… mão na massa e chega de enrolação.

      Primeiro de tudo, se você der uma olhada mais aprofundada no componente TCustomGrid você verá que os métodos MoveColumn e MoveRow estão lá, fazem parte do componente, mas eles estão ocultos no TStringGrid, eles são herdados do ancestral TCustomGrid porém não estão acessíveis no descendente, o motivo?? Ora, vai lá saber o que se passa na cabeça dos garotos da Codegear…

      Como resolver esse problema? Simples e fácil, sem maiores complicações, basta fazer uma herança de TStringGrid e redeclarar estes métodos como public.

type
    TNovoGrid = class(TStringGrid)
    public
    procedure MoveColumn(FromIndex, ToIndex: LongInt);
    procedure MoveRow(FromIndex, ToIndex: LongInt);
   end;

   Para implementar estes métodos é muito simples, basta na implementação, chamar o ancestral e passar para ele o comando:

procedure TNovoGrid.MoveColumn(FromIndex, ToIndex: LongInt);
begin
    inherited;
end;

procedure TNovoGrid.MoveRow(FromIndex, ToIndex: LongInt);
begin
    inherited;
end;

     Você não precisa registrar este componente na paleta de componentes. Use o TStringGrid ou qualquer descendente de TCustomGrid normalmente como já faz hoje, e quando você precisar usar estes métodos, simplesmente faça um typecast (conversão de tipos) para a nova classe, e pronto. Veja o exemplo abaixo:

procedure TForm1.Button1Click(Sender: TObject);
begin
       TNovoGrid(StringGrid1).MoveColumn(2, 5);
end;

    Bom, é isso aí, até a próxima.
    www.spectrus.com.br

sábado, julho 01, 2006

Pesquisa para um novo projeto – Parte II

Bom, continuando as pesquisas para o novo projeto, continuo falando com diversas pessoas e pesquisando. A decisão sobre que tipo de banco de dados suportar já está tomada, a primeira versão irá dar suporte para Firebird, Microsoft SQL Server e ORACLE, em uma futura versão vamos dar suporte para IBM DB2.

Porquê não inserir suporte ao IBM DB2 já nesta versão? Afinal, como diz o velho ditado (ou o velho deitado): já que estamos no inferno, não custa nada dançar uma valsa com o capeta né?
Bem, a principal questão é que já temos versões instaladas do Firebird, ORACLE a versão express e o MSDE, e já temos um domínio desses bancos de dados, o IBM DB2 eu sei que é muito bom e rápido, mas sinceramente não faço nem idéia de como criar ou manter uma tabela. Então vamos fazer a primeira versão sem tentar complicar muito a história, depois da primeira versão pronta, teremos tempo para aprender a mexer no DB2.

Existe também a questão comercial, em termos de marketing, o suporte ao ORACLE e ao SQL Server são significativos, representam uma importante característica para o mercado.

Agora a decisão sobre a camada de servidor que irá fazer a ponte entre o banco de dados e a interface com o usuário, a camada que irá conter as regras de negócio, é o próximo passo.

As opções representativas para mim ainda são Java, .Net ou Delphi, este último com preferência para uso do RemObjects.

Alguns me falaram do Lazarus, o Free Pascal com versão para Linux e Windows, mas com sinceridade não é uma opção que eu considere seriamente. Pense bem, pretendemos uma aplicação que possa ser vendida em nível mundial, que possa se integrar com aplicativos de ERP conhecidos no mercado, para empresas de todos os portes, com suporte multilingua, que possa ser customizado pela equipe de TI do cliente, ou por parceiros, apelo de marketing, que tenha evolução garantida.
O que o uso do Lazarus poderia agregar de valor ao projeto? Sem desprezar a ferramenta que, diga-se de passagem, é muito boa. Mas no caso de optar por linguagem Pascal, ou Object Pascal, a escolha seria naturalmente o Delphi, em comparação com o Lazarus, só perde no preço e na disponibilidade para Linux, mas ganha com uma vantagem imensa em termos de suporte, disponibilidade de componentes, tecnologias, evolução, maturidade, estabilidade, disponibilidade de serviços e profissionais que dominam a ferramenta.
O Lazarus é uma excelente ferramenta, mas ainda está no inicio de seu ciclo de vida, dentro de 1 ou 2 anos será uma ferramenta que deverá ser seriamente considerada, mas ainda não chegou lá.

Analisando as opções da camada servidor:

.NET

A tecnologia da Microsoft é madura, bem posicionada no mercado, mas não me encanta por algumas razões.
- Foi desenvolvida como uma indecisão da Microsoft, que queria barrar o avanço do Java na sua briga com a Sun, é uma tentativa de fazer com que o Windows se torne o padrão de sistema operacional de servidor para aplicativos Web.
- É pesado, e bota pesado nisso, o framework é imenso, existe uma divisão debulosa entre os objetos, componentes, rotinas, etc. As ferramentas que suportam desenvolvimento para .NET são uma carroça de tão pesadas e lentas, é um paquiderme com câimbras, algo que definitivamente que deixa muito desconfortável.
- Até quando a Microsoft vai continuar no .NET? Ela já mudou tanto de proposta de tecnologia que é de se perguntar: Qual será a próxima onda? Não há uma consistência, um caminho claro e seguro do que a Microsoft pretende fazer para o futuro.
Tradicionalmente a turma do tio Bill garante que a tecnologia é a definitiva, até eles pensarem a próxima sacada de marketing, quanto então mudam tudo e a nova tecnologia passa a ser o novo Santo Graal do desenvolvimento.
Tenho visto a Microsoft usar tão pouco a sua própria tecnologia, que me pergunto se seria prudente apostar em .NET.
- Só roda em Windows e pronto. Isso é um ponto negativo bem forte a se considerar, com o uso crescente de Unix e Linux nos servidores, desprezar estes SO não é uma prática muito recomendável.

Quanto ao Linux, uma observação interessante:
Quando começou a onda do Linux, eu já comentava que era algo a se considerar apenas no futuro, quem estava migrando para Linux não tinha representatividade no mercado. Eram instituições de ensino ou pesquisa, ou então pequenas e micro empresas em busca de economizar uns trocados em licenciamento de servidor. Ou seja, um mercado para o qual não valia a pena fazer investimentos, cujo retorno era insignificante. Só valeria investir nesse mercado se você tivesse grana suficiente para suportar alguns anos de desenvolvimento com nenhum ou muito pouco retorno financeiro, até que o mercado ficasse maduro suficiente para compensar o que se investiu.
Eu trabalhei muitos anos com servidores Unix, e para mim a grande vantagem do Linux sempre foi o mesmo que eu sempre considerei no Unix: estabilidade, escalabilidade, confiabilidade, mas o que o mercado via era somente o custo de licenciamento.
Bem, felizmente parece que as coisas mudaram, tenho visto muitas empresas, inclusive de grande porte, migrarem soluções de servidor para Linux, não por preço, mas pelas razões que mencionei para o Unix, até por que no final das contas o Linux pode sair até mais caro do que o Windows, o que geralmente ocorre, pois você começa a explorar e a usar muito mais recursos que estarão disponíveis no servidor, começa a visualizar opções muito mais sofisticadas e interessantes, e vai investir muito mais dinheiro no final, claro que também vai ter muito mais retorno, vai receber mais pelo seu dinheiro.

Delphi

Seria a opção natural, pois é a nossa ferramenta nativa de desenvolvimento para soluções desenvolvidas pela Spectrus. Como trabalhamos também como fábrica de software, outras soluções como .NET, C/C++ também são confortáveis para nós, pois muitas vezes o projeto para o cliente exige que se desenvolva em uma tecnologia que a equipe de TI domine.
O Delphi seria uma opção fácil de implementar, é uma ferramenta poderosa, com tecnologias maduras e consistentes, em constante evolução, com uma comunidade de desenvolvedores imensa (um grande número de malucos, o que é bom!), a oferta de componentes, códigos, e suporte é imensa, talvez a ferramenta com maior suporte na atualidade. Sem falar que é uma linguagem orientada a objetos de fato, fácil de implementar e usar.
As desvantagens:
Roda apenas em Windows;
O licenciamento é caro, se você for colocar uma equipe com 5 ou 6 desenvolvedores vai precisar de uma licença para cada um, considerando que para este projeto será necessário a versão Enterprise ou Architect, o investimento vai ser bem caro, antes do produto dar resultado.
A última versão rápida e confiável é a 7, o Delphi 8 foi um fiasco, a 2005 uma tragédia, a 2006 parece que melhorou, mas só se comparada com o Delphi 8 ou 2005, e a Borland ainda tem a cara de pau de apresentar algumas vantagens do Delphi 2006, omitindo que isso já tinha na versão 7 e desapareceu nas posteriores. A 2006 ainda está muito longe de ser a ferramenta fantástica que o Delphi 7 é, parece que a Borland está sofrendo da síndrome de espelhamento com a Microsoft, acham que basta ir acrescentando penduricalhos na ferramenta para dizer que é evolução, e deixam prá lá questões como performance e estabilidade.
A última versão que valeu a pena a grana do licenciamento foi a Delphi 7, grande parte do que foi acrescentado pela Borland de lá para cá, e que ela cobra uma boa grana por isso, pode ser conseguido com AddOns e componentes para o Delphi 7.

Java

Eis aqui uma opção bem interessante apesar, como já escrevi em outro post, do peso absurdo das ferramentas da Sun. Mas o JDK (o Java Develpment Kit) da Sun é bem razoável em termos de desempenho.
Estou experimentando diversas ferramentas de desenvolvimento: Sun JavaStudio Creator, Sun JavaStudio Enterprise, NetBeans, Eclipse e Oracle JDeveloper, e até um modesto TextPad.
Gostei no nível de facilidades e ferramentas disponíveis no Sun JavaStudio Creator, podemos dizer que é praticamente uma ferramenta RAD para desenvolvimento em Java, porém o peso da ferramenta é absurdo, simplesmente derruba a máquina, tornando inviável o seu uso.
O Sun JavaStudio Enterprise é outra ferramenta fantátisca, que também sofre dos mesmos males do JavaStudio Creator, um peso absurdo.
Mas ambas as ferramentas da Sun têm a vantagem de ter uma gama de recursos fantástica.
As 3 IDES mais interessantes, sem um peso absurdo, que eu experimentei: NetBeans, Eclipse e Oracle JDeveloper.
Se você for desenvolver em Java aplicativos stand alone, considere seriamente o uso do NetBeans, tem uma IDE excelente, recursos muito bons, e o GUI Builder dele não fica devendo nada à outras ferramentas RAD.
O ORACLE JDeveloper vai bem no desenvolvimento tanto no lado servidor quanto no cliente, é uma ferramenta também excelente para o desenvolvimento, considere seriamente, pois tem performance bem melhor do que as ferramentas da Sun.

Já faz alguns anos que você pode contar com artigos sobre Java em qualquer revista de programação, tem sido uma das soluções mais badaladas nos últimos tempos. E com justiça, se bem que eu não desenvolveria em Java uma aplicação Desktop (por enquanto), para isto usaria Delphi sem sombra de dúvidas.
A linguagem é fortemente tipada, e totalmente orientada a objetos, mais até do C++.
Tem uma comunidade de desenvolvedores tão grande e ativa quanto o pessoal de Delphi, roda em uma infinidade de arquiteturas de hardware/software, sem o ônus de alterações no código fonte para suportar outro sistema operacional ou arquitetura de hardware.
Os custos de licenciamento são zero.

As desvantagens é que é lenta para a carga inicial, pois o que é gerado é um pseudo código, e um código nativo compilado e linkado, como o Delphi, irá rodar com uma performance bem superior.
O treinamento para os desenvolvedores é um pouco mais dispendioso e trabalhoso, não é fácil fazer alguns desenvolvedores que vêm do VB, ou que aprenderam Delphi nos cursinhos meia boca da vida (que só ensinam a usar a linguagem em meio procedural, muito pouco OOP), a aprenderem a tecnologia.
A curva de aprendizagem para os novatos é bem mais áspera e íngreme, e não há atalhos.
O JRE (Java Runtime Environment) é um kit de tamanho considerável para ser instalado nas máquinas destino, se bem que isto não é desvantagem num produto como este, pois vai como parte da instalação padrão do aplicativo.


O Junior, lá de RO tem me falado muito de Ruby, e ele já me mandou algumas dicas muito boas sobre outras tecnologias, passei a usar o DBISAM para os produtos de prateleira por causa do (excelente) trabalho que ele faz de divulgação da tecnologia. Por causa da recomendação estou analisando o Ruby, principalmente com a IDE Ruby On Rails, que parece ser bem interessante. Vamos ver o que essa tecnologia promete.

Vou parando por aqui por hoje, o Brasil perdeu prá França, coisa já esperada com essa turma do Parreira, a turma do Quadrado Trágico, turma mesmo por que time nunca teve, é uma turma de grandes estrelas, mas eu preferia um time, que soubesse jogar junto, que tivesse pegada, honra, brios... O Dunga faz falta, pelo menos ele chamava os companheiros na cincha, e cobrava responsabilidade, esta turma de bundões não tem brios, não tem nem sequer garra. Agora é torcer pelo Felipão, ou Big Phil como dizem os ingleses.

sexta-feira, junho 30, 2006

Dúvidas e decisões sobre um novo projeto – Mais dúvidas do que decisões.

Como sempre, a única coisa permanente é mudança, certeza a gente só tem de que vai mudar, nem que seja para o arquivo geral da cidade, vulgarmente conhecido como cemitério. Bem, neste caso as coisas não são tão dramáticas assim, mas empresa nenhuma fica parada no mesmo lugar, ou cresce ou diminui, ou vai para a frente ou vai para trás, e a minha não foge à regra, já cresci, já diminui, já levei calote, já ganhei grana, já dei com a cara no muro, com o muro na cara, e tudo o mais.
Como as coisas estão evoluindo e melhorando, é hora de pensar no futuro, para onde crescer, para onde ir, em que fatia do mercado apostar? Enfim, uma penca de decisões cruciais, além das normais do dia a dia, como faturar a grana para pagar os funcionários, pagar o contador, o telefone, aluguel, internet, a Borland (que tá cobrando uma grana preta pelo Delphi, bem que eles podiam aliviar a mão um pouquinho né?), e principalmente o raio dos impostos (eita vida danada, o Lula pode não saber governar nem contar até dez, mas cobrar impostos sabe como ninguém, o que aumentou a carga tributária não é mole não, é no mínimo 1 funcionário a mais para cada 1 funcionário efetivo).
Então, deixando a choradeira de lado, e o lero-lero para depois, a decisão é:

- Que mercado atender? Qual seria o rentável?
- Que produto esse mercado quer?

E o que mais interessa para o pessoal de tecnologia que eventualmente ler este blog (que anda meio atirado às moscas, sem leitores nem postagem nos últimos tempos):

- Que premissas atender ?
- Que tecnologia usar?
- Quais os pré-requisitos?


Bem, vamos lá, tentando resolver as broncas uma de cada vez, e levando em consideração uma penca de opiniões do pessoal do news do delphi (news.netuno.com.br, grupo u-br.comp.ling.delphi), que é uma galera prá lá de non-sense, onde se discute de tudo um pouco, e onde nem o pessoal da Borland agüentou o tranco, que o diga o Lanusse, o pessoal lá é fera e doido, de tudo um pouco, por isso eu faço parte desde tempos imemoriais, no tempo em que ainda estávamos no news do uol, antes de nos banirem daquelas bandas, e como desenvolvedor bom tem que ter doses de doideira e habilidade em iguais proporções, por esses critérios o pessoal lá deve ser a melhor turma de desenvolvedor do Brasil.

- Como esse produto será posicionado no mercado?
Em principio, a idéia é de que o produto seja internacional (estamos chique agora!), com suporte fácil a diversas linguagens, que essas linguagens possam ser inseridas apenas com um arquivo de recursos.
Deve suportar diversos temas, para que se possa configurar o sistema com a identidade do cliente, cores e logotipia, de forma fácil e rápida.
As rotinas de moeda e configurações locais para cada país devem ser implementadas via recursos também, possivelmente um pacote de localização que contenha também a linguagem.
Não adianta malhar em ferro frio, como diria meu avô, quando você chega em um cliente de médio porte para cima, a marca da tecnologia começa a pesar, e nos pequenos clientes o que pesa é o custo, como compatibilizar isso?
Para esta última questão, começamos pelo banco de dados, o aplicativo vai ter que suportar tecnologia open source e comercial, então vamos de suporte para Firebird ( prefiro muito mais do que MySQL, nunca fui com as fuças de um banco de dados à lá Paradox, com cada tabela separada em um arquivo, e além do mais Firebird é bem mais rápido e poderoso, além do licenciamento ser totalmente royalty free), ORACLE e Microsoft SQL Server, dois nomões do mundo de banco de dados com um market share considerável, e futuramente um suporte também para IBM DB2, este nunca pode ser desconsiderado, pois é o rei nas grandes instalações, e as últimas versões estão com uma performance assombrosa.
Claro que isso vai dar um trabalho considerável para manter em sincronia todas as características rodando 100% em todos os bancos de dados, mas não se ganha dinheiro sem passar algum trabalho duro, salvo se você resolver traficar pasta base de cocaína, mas como isso é algo que o meu médico não recomenda para a preservação da minha saúde física, eu resolvi deixar essa solução prá lá, parece que só restou o trabalho duro, até por que eu queimei as outras chances de ficar rico: Não nasci rico, e casei com uma mulher tão dura quanto eu, e sou um verdadeiro fiasco jogando na mega sena.

Rodar em servidor IIS ou Apache, que são os significativos no mercado, o restante nem vale a pena o esforço, para uma empresa pequena, tenho que concentrar os esforços aonde possa render, não vale a pena tentar defender tese, no fundo o nosso negócio é ganhar dinheiro solucionando as encrencas dos outros, e não conseguir mais encrenca né?
Regras de negócio em camada de web services, para que o cliente possa consumir em aplicativos internos, ou que possa ser integrado e se integrar com outras soluções do mercado, logicamente estamos mirando integração com SAP, PeopleSoft, JDEdwards, Microsiga, DataSul, ORACLE ERP, etc, afinal é onde está a grana.
Interface de cliente magro (thin client, para usar um jargão de marketing corrente no mercado), apenas um browser, user name e senha, e o usuário já está usando o aplicativo, até de um quiosque em uma lan-house, instalação zero, configuração mínima, funcionamento com o mínimo de problemas, e a grana do suporte paga a evolução do dito cujo.

Receita legal né? Acho que dá prá crescer e fazer algum dindin, pelo menos até um Google da vida querer comprar a gente (estou aceitando ofertas generosas, que incluam 1 iate, apartamento em Paris, e o telefone da Juliana Paes, e claro um dos meus carros de sonho: uma Bugatti Veyron, um Aston Martin Vanquish Zagato, um Koenigsegg, uma Lamborghini Murciélago, uma Masserati MC12 Stradale ou Saleen S7, ou até um Jaguar, além de um punhado de dólares).

E o que usar?
Bem, na parte de banco de dados já defini o que quero, e na camada de web services?
As opções eram várias, agora estão reduzidas à 3: Delphi, .NET ou Java, pendendo fortemente para a última, em que pese o peso absurdo do JavaStudio Enterprise da Sun.

Bem, já foi um avanço até aqui, o resto no próximo post, que não vai demorar como os outros, agora eu prometi para o Tiago Hiller que vou escrever mais seguido, e o alemão vai pegar no meu pé se eu não postar, agora ele tá de papai, com mania de responsável, e como é um grande amigo, a gente deixa ele mandar um pouco, afinal em casa quem manda é a mulher mesmo, como na minha, onde eu dou a última palavra e aos berros: “SIM SENHORA! JÁ ESTOU INDO MEU AMOR!”.

quarta-feira, outubro 26, 2005

Tecnologias nem tão novas assim, mas bem vindas sempre.

Pois é, depois de ler sobre extremme programming, refactoring, “y otras cositas más”, cheguei a conclusão de que me falta assessoria de marketing, eu já fazia tudo isso muitos anos atrás, só não tinha dado um nome pomposo para o negócio! Será que o Duda Mendonça faz um precinho camarada???

Com um pouco de marketing, nesta hora eu estaria ganhando uma grana preta, só dando palestras, ao invés de ficar aqui brigando com o Delphi, que insiste em fazer umas maluquices estranhas, enquanto o cliente liga todos os dias, manda 2 ou 3 e-mails por dia, numa pressão enorme para ter a nova versão do sistema. E tem gente que ainda diz que gostaria de trabalhar como eu, sem horário, sem horário nem para começar e muito menos para finalizar o dia né?

Ontem parei o trabalho lá pelas 02:00 da madruga, já dormindo e babando no teclado do notebook, a minha mulher acordando e me cutucando, que eu tava roncando, pode isso? Não dá prá acreditar que tem gente que sente inveja desta vida, só sendo maluco mesmo.
Mas de tudo isso pelo menos fica uma certeza: estou no caminho certo, e já faz um bom tempo.
Refactoring é quase que sobrevivência, quando a gente volta para implentar alguma nova característica numa rotina antiga, é que constata o quanto evoluiu (ou não, às vezes se tem que repensar os rumos), o código que eu escrevi a 2 anos atrás dá uma matéria prima e tanto para um retrabalho. Eu sempre fiz refactoring desse jeito, você volta na rotina antiga para botar uma coisa nova, uma nova característica ou nova funcionalidade, vê que o código tem um monte de coisas que pode ser melhorado, aproveita que já está no inferno mesmo, e não custa nada dançar uma valsa com o capeta, perde algumas horas a mais, e já refaz a rotina, otimizando, fazendo melhor, deixando mais claro.
Claro que você só faz isso naquela rotina, e assim vai aos poucos reescrevendo o programa, leva tempo, mas pelo menos dói menos, e tem a grande vantagem de ser pago para fazer isso. Afinal se o cliente está pedindo uma nova característica, isso é cobrado, e você já aproveita e refaz a rotina, com o tempo coberto pelo orçamento. Como eu disse, uma questão de sobrevivência, principalmente para quem não pode fazer grandes investimento em equipe e tecnologia, e dessa maneira vamos levando a vida....
Uma idéia interessante também é o “pair programming”, dois programadores trabalhando conjuntamente, em uma mesma máquina. Parece maluquice? Pois saiba que dá certo sim, e muito, no começo é muito estranho, estranho mesmo, mas depois que o treco engrena, você percebe a grande vantagem, e só larga se for obrigado.
Volto a falar disto mais adiante.

terça-feira, outubro 18, 2005

(Re)comecei

Pronto, acho que agora talvez eu tenha saco para manter um ritmo constante dos posts.
Vamos ver no que dá, afinal experiência já tenho, já tinha cometido outro blog antes, sabe lá aonde isto vai parar.
Se você pretende ler de vez em quando, não espere nada politicamente correto, nem grandes e edificantes idéias, isto aqui vai funcionar mesmo como um diário, ou uma latrina de pensamentos, use-o por sua própria conta e risco.