sexta-feira, 17 de dezembro de 2010

Tutorial: MySQL no Autoit utilizando conector ODBC e UDF MySQL

Entre as UDF´s disponíveis para o Autoit, apenas uma nos permite conectar a um banco de dados, que é o SQLite. Felizmente ele disponibiliza meios de trabalharmos com COM Objects, o que torna possível o desenvolvimento de UDF´s para atender soluções específicas.

No Fórum oficial do Autoit temos um caso destes, no post MySQL UDFs o usuário cdkid disponibiliza uma UDF para trabalharmos com bancos de dados MySQL, apesar de ser antiga (última atualização em 2007) e um pouco limitada, ela funciona e entrega um resultado satisfatório.

No tópico é explicado como fazer a conexão e começar a trabalhar, porém, como é um pouco antigo, algumas coisas podem não funcionar (como aconteceu comigo) e pode ser preciso conferir alguns detalhes a mais, não explanados no fórum, por isso vamos a partir de agora, conferir como fazer para conectar o Autoit com o MySQL em detalhes.

Arquivos para conectar o Autoit e o MySQL

Antes de mais nada precisamos baixar a biblioteca (que você encontra no link logo abaixo) e também o driver ODBC, que fará o papel de intermediar a conexão entre as duas tecnologias:

Download 1: mysql.au3
Download 2: Driver ODBC

No link para baixar o driver ODBC, você deve escolher um dos arquivos em formato zip, apenas atente para optar pelo arquivo correto de acordo com a plataforma de seu computador ou servidor (32-bit ou 64-bit), para este exemplo nós baixamos o arquivo Windows (x86, 64-bit), ZIP Archive Connector-ODBC.

Instalando o Driver ODBC

Descompacte o arquivo na máquina em que você irá rodar sua aplicação, abra um prompt do DOS e digite o caminho completo até a pasta onde encontram-se os arquivos descompactados, seguido de /install.bat 0, conforme mostrado na figura abaixo:

Console ODBC Instalação

Após instalado o driver, clique em:

  1. Iniciar "Start"
  2. Ferramentas Administrativas "Administrative Tools"
  3. Fontes de dados(ODBC) "Data Sources(ODBC)"
  4. Clique em Adicionar "Add"
  5. Escolha MySQL ODBC Driver 3.51 e então clique em Finalizar "Finish"

Uma nova janela irá solicitar algumas informações sobre a nova conexão ODBC, preencha com os dados (alguns são opcionais) do banco que você deseja se conectar e por fim clique no botão Test. Se ele retornar uma mensagem positiva sua conexão já esta funcionando, caso contrário precisaremos trabalhar um pouco mais.

ODBC MySQL x Autoit configuração

Janela de configuração do ODBC

O teste deu ok! | O teste falhou, e agora?

Configurando o servidor MySQL para aceitar conexões externas

Se sua conexão ODBC não deu certo, pode ser que você precisa garantir o acesso da sua máquina de aplicação para o servidor do banco. Para fazer isso você vai ter que executar uma query no seu servidor MySQL atribuindo este acesso. Abaixo um exemplo:

GRANT ALL PRIVILEGIES ON database.table TO 'usuario'@'host' IDENTIFIED BY 'password'

Na query mostrada acima, nós temos algumas palavras destacadas em itálico, são elas que você deverá alterar, veja um exemplo de como deverá ficar no final:

GRANT ALL PRIVILEGIES ON *.* TO 'root'@'172.167.100.90' IDENTIFIED BY 'root@123'

Neste exemplo, foi definido acesso total para todos os bancos e todas as tabelas de nosso servidor MySQL, para o usuário root vindo do servidor 172.167.100.90 utilizando a senha root@123.

Você pode aplicar esta query via o prompt do mysql, no seu servidor de banco de dados ou por meio de um aplicativo terceiro, como o MySQL Administration ou PHPMyAdmin, caso tenha instalado. Fazendo isso, volte para a máquina onde você instalou o ODBC e teste novamente a conexão. Caso as falhas ainda persistam, tente recomeçar o tutorial desde o início novamente.

Criando uma aplicação Autoit/MySQL

Agora que você já garantiu a conexão basta você começar a desenvolver seu aplicativo, basta incluir a UDF do MySQL no início da seu script. Como um primeiro teste você pode apenas ler alguns registros de uma tabela qualquer e mostrar em tela, para fazer isso siga o exemplo abaixo, apenas adaptando para um banco e tabela existente no seu servidor de banco de dados:

;Conectar em uma base
$o_sql = _MySQLConnect('root', 'root@123', 'ambiente', '172.167.100.90')

;Realiza uma query
$o_query = _Query('SELECT hostname FROM servidores')

With $o_query

While NOT .EOF

;Mostra os resultados em tela
MsgBox(0, 'Hostnames', .Fields('hostname').value)

WEnd

EndWith

;Tenta encerrar a conexão com o banco
_MySQLEnd($o_sql)

Uma pequena contribuição

Durante o desenvolvimento de aplicações MySQL/Autoit eu tive uma grande necessidade que era conseguir descobrir se uma determinada query SELECT iria retornar algum resultado, pois se você tentar acessar os valores de um atributo retornado de uma query e esta não te retorne nada, você terá um erro de execução. Portanto criei essa pequena função que faz o trabalho de contar quantas linhas uma query retornará, tornando seu aplicativo menos suscetível a falhas.

;Conta quantas linhas uma query SELECT irá retornar
Func _CountRows($o_sql, $s_query)

;Customiza a query para retornar um COUNT, ao invés dos campos
$s_res = StringRegExpReplace ($s_query, '(SELECT [\w]{1,255})((, | )[\w]{1,255}(,|)){0,10} FROM', 'SELECT COUNT(*) as ct FROM')

;Se conseguir criar a nova query, testa o resultado
If $s_res <> $s_query Then

$o_query = _Query($o_sql, $s_res)

Return $o_query.Fields('ct').value

Else

Return 0

EndIf

EndFunc

Finalizando

Espero que tenham apreciado o post, dúvidas deixem um comentário que retornarei assim que possível. Para finalziar vou deixar um apelo: Se alguém tiver acesso aos atributos e métodos do MySQL COM Object, por favor compartilhe, seria muito interessante implementar mais algumas funções a esta biblioteca.

Antes de finalizar, não posso deixar de agradecer ao meu amigo Padilha, por insistir em descobrir como conectar o Autoit com MySQL, sem sua ajuda minha vida seria bem mais penosa. Obrigado!

Abraço!

quarta-feira, 15 de dezembro de 2010

Biblioteca de funções CMD (DOS) para Autoit

Em várias ocasiões, precisei criar ferramentas com o Autoit, que de alguma maneira precisavam executar comandos DOS e retornar o resultado para minha aplicação. Como na época não achei nada que fizesse algo semelhante, resolvi escrever minhas próprias funções, o que resultou na biblioteca CMD.au3, que estou disponibilizando logo abaixo para download.

Para os mais curiosos, estas funções não tem nenhum segredo, não utilizam nenhum COM Object ou DLL, são na verdade uma combinação de funções nativas do Autoit que executam um comando DOS e retornam em buffer o resultado do comando. Para finalizar utilizo várias regras de expressões regulares para conseguir a informação de que preciso.

Se alguém conhecer alguma DLL ou COM Object que trabalhe diretamente com linha de comando e que possa fazer um trabalho semelhante ao desta biblioteca, por favor me avise, pois eu gostaria muito de reescrever esta biblioteca com algum destes recursos, apesar de que a versão atual já ajuda e muito no atendimento de minhas necessidades do dia a dia e quem sabe ela possa te ajudar também.

O que vou precisar?

Para utilizar esta biblioteca, você vai precisar fazer o download dos dois arquivos abaixo, o primeiro é a biblioteca em si e o outro arquivo é um biblioteca com TRIM functions, para eliminar espaços em branco dentro de strings. Esta última não é de autoria minha, você pode conferir o tópico no fórum do Autoit que fala sobre ela: New String TRIM() functions

Download 1: Cmd.au3
Download 2: TRIM Functions

Além disso, a nossa biblioteca depende de algumas UDF´s para que possa ser executada, para estas basta dar um include no seu script, pois são nativas do Autoit:

  • Constants
  • Process
  • Array

Funções Cmd

Todo o código esta comentado e os nomes das funções, em sua maioria, são auto explicativos. De qualquer forma vou explicar um pouco sobre cada uma delas, assim fica mais fácil você entender o que poderá ser feito com cada uma e então decidir se elas atendem ou não suas necessidades.

_Cmd_GetBuffer($s_Command, [$b_GetDataFromClip = False])

O que faz?

Executa um comando DOS e retorna em um array, o buffer com o resultado. São retornados dois índices neste array, um deles com o buffer normal e o outro com o buffer de erros (caso houver)

Parâmetros

  • s_Command - O comando DOS que deseja executar
  • b_GetDataFromClip - [Opcional] Caso seja True, vai utilizar a Área de Transferência do Windows para ler o retorno do comando, ao invés do output Stdout que é o padrão. Você deve utilizar a Área de Transferência (ou Clipboard), caso seu aplicativo esteja travando quando utilizado o output padrão, isso pode acontecer por exemplo, em comandos que acabam solicitando algum input do usuário após o envio do comando, neste caso o Stdout fica na espera e não retorna nada para sua aplicação.

_Cmd_BufferTrim($s_Buffered, [$i_ReturnType = 0])

O que faz?

Remove os espaços em branco dentro de uma string e então retorna, ou uma nova string devidamente formatada ou um array com cada linha do buffer.

Parâmetros

  • s_Buffer - A string com o buffer do comando executado
  • i_ReturnType - [Opcional] Pode ser 0 "zero" para retornar a string inteira ou 1 "um" para retornar um array com as linhas da string.

_Cmd_GetSessionId($s_Usuario, [$s_Server = "localhost"])

O que faz?

Retorna um Integer com o ID de sessão de um usuário em um determinado servidor.

Parâmetros

  • s_Usuario - O nome do usuário do qual deseja descobrir o ID de sessão
  • s_Server - [Opcional] O servidor que se encontra o usuário.

_Cmd_GetUsers([$s_Server = "localhost"])

O que faz?

Retorna um array com uma lista de usuários de um servidor.

Parâmetros

  • s_Server - [Opcional] O servidor que deseja recuperar a lista de usuários.

_Cmd_ProcessExists($s_Process, [$i_Session = 0, [$s_User = "", [$s_RemServer = "", [$s_RemUser = "", [$s_RemPass = ""]]]]])

O que faz?

Retorna um boolean caso um processo informado exista em um determinado servidor. Este servidor pode ser um servidor remoto caso sejam passados os devidos parâmetros.

Parâmetros

  • s_Process - O nome do processo que deseja verificar.
  • i_Session - [Opcional] O número da sessão do usuário que deseja verificar, caso esse valor seja omitido, ele verificará a sessão 0, que costuma ser a sessão principal ou console.
  • s_User - [Opcional] Caso informado, a função irá verificar se determinado usuário esta executando o processo informado.
  • s_RemServer - [Opcional] Informa um servidor remoto para verificar a existência do processo.
  • s_RemUser - [Opcional] Caso seja informado um servidor remoto, você deve passar um usuário existente neste servidor para que o comando possa ser executado.
  • s_RemPass - [Opcional] A senha do usuário no servidor remoto.

_Cmd_ProcessClose($s_Process, [$i_Session = 0, [$b_Force = False, [$s_RemServer = "", [$s_RemUser = "", [$s_RemPass = ""]]]]])

O que faz?

Tenta fechar um processo em um determinado servidor e retorna um boolean com o resultado. Este servidor pode ser um servidor remoto caso sejam passados os devidos parâmetros.

Parâmetros

  • s_Process - O nome do processo que deseja fechar.
  • i_Session - [Opcional] O número da sessão do usuário que deseja verificar, caso esse valor seja omitido, ele verificará a sessão 0, que costuma ser a sessão principal ou console.
  • b_Force - [Opcional] Caso seja True, o processo será fechado a força. O padrão é False, onde ele irá aguardar o fechamento normal da aplicação.
  • s_RemServer - [Opcional] Informa um servidor remoto para fechar o processo.
  • s_RemUser - [Opcional] Caso seja informado um servidor remoto, você deve passar um usuário existente neste servidor para que o comando possa ser executado.
  • s_RemPass - [Opcional] A senha do usuário no servidor remoto.

_Cmd_Logoff($s_Session, [$s_Server = "localhost"])

O que faz?

Efetua o logoff de um usuário (da sessão informada) em um determinado servidor.

Parâmetros

  • s_Session - O nome ou ID da sessão que deseja fazer logoff
  • s_Server - [Opcional] O servidor que se encontra o usuário.

Finalizando

É isso, espero que tenham apreciado, dúvidas e sugestões é só comentar. Caso você sinta necessidade de ter exemplos, basta abrir o fonte da biblioteca e analisar as funções, acredito que é de fácil entendimento, senão é só gritar aí ;).

quinta-feira, 9 de dezembro de 2010

Ferramentas para o Autoit

No post anterior Automatizando tarefas com Autoit, eu fiz uma grande propaganda sobre a linguagem e sobre como você pode criar scripts para automatizar tarefas em ambientes Windows, também falei que existiam várias ferramentas para ajudar no desenvolvimento, mas acabei deixando de falar sobre elas ou ao menos citá-las, coisa que farei neste post. :)

SciTE4AutoIt3

Scite é um editor de texto baseado no componente Scintilla, para quem não conhece, este é o mesmo componente utilizado em projetos como o Notepad++, além de muitos outros.
Eu não sei como é escrever uma aplicação Autoit sem o SciTE4AutoIt3, pois eu sempre o utilizei e jamais trabalharia sem ele, considerando as inúmeras facilidades que ele proporciona:
  • Highlight de sintaxe
  • Função auto-completar
  • Função expandir ou recolher código
  • Função Intellisense, que mostra quais parâmetros você precisa passar para uma função.
Além disso, ele traz vários atalhos para outras ferramentas do Autoit: Compilador, Autoit Window Info, Koda Form Designer, Code Wizard entre outras.

Scite4Autoit3
Imagem da área de trabalho do Scite, detalhe na imagem para o menu Tools e os atalhos para acessos a outras ferramentas.

Koda Form Designer

Outra ferramenta interessante, principalmente para quem quiser trabalhar com GUI´s no Autoit, o Koda Form Designer permite a criação de interface gráficas como janelas e formulários de maneira simples e intuitiva: clique e arraste. Basicamente ele faz a mesma coisa que um Delphi faz, mas gerando código Autoit.

Koda Form Designer
O Koda Form Designer permite criar GUI´s inteiras apenas arrastando componentes, depois é só gerar o código, criar a lógica e compilar.


Autoit Window Info

É comum trabalhar-mos com a manipulação de janelas no Autoit, muitas vezes precisamos saber se elas existem, ou precisamos que um click do mouse seja enviado para algum ponto dela, ou que algum conteúdo precise ser digitado em algum campo, enfim precisamos ter as informações corretas para podermos manipulá-las da melhor maneira possível.
A proposta desta ferramenta é trazer essas informações de maneira simples e rápida, para isso basta você posicionar o cursor do mouse sobre uma janela e um pequeno console mostrará todos os dados que o Window Info Tool for capaz de obter. Veja abaixo, algumas informações que podemos encontrar:
  • Título da janela
  • Textos
  • Textos ocultos
  • Coordenadas X e Y de onde ela se encontra
  • Controls, Handlers e classes para manipulação com o Autoit

Autoit Window Info

Atente para as informações que conseguimos obter de uma janela utilizando a ferramenta.

Todas essas ferramentas contribuem em muito com o desenvolvimento de scripts e aplicações com o Autoit, se você desenvolve ou pretende começar a desenvolver com a linguagem, não deixe de aproveitar as facilidades que elas oferecem e otimize o tempo de desenvolvimento.

quinta-feira, 2 de dezembro de 2010

Automatizando tarefas com Autoit

Autoit V3

Conheci o Autoit a pouco mais de um ano, como sou fã de linguagens "direto ao ponto", de resultados rápidos, me identifiquei na mesma hora.

Se você não sabe do que se trata, sem problemas, eu explico: "Autoit é uma linguagem do tipo script, com uma sintaxe muito parecida com o BASIC e que permite automatizar tarefas em ambientes Windows. Você pode simular ações com o mouse e teclado, manipular janelas, arquivos, registro do Windows, conectar em um banco de dados, interagir com o Internet Explorer e com os elementos de uma página (utilizando conceitos de DOM)."

Isso é apenas uma pequena amostra do que a linguagem é capaz, pois ela ainda permite criar GUIs (Interfaces Gráficas) inteiras, ou seja, você pode criar um sistema desktop sem problemas.

Exemplo de interface GUI com Autoit
Exemplo de interface GUI com o Autoit extraído do site oficial

Além de ser uma linguagem completa, com uma vasta biblioteca de funções e inúmeras UDF´s (Bibliotecas homologadas criadas por usuários), o Autoit permite trabalhar com COM Objects e acessar DLL´s, ou seja, é difícil pensar em algo que ela não consiga fazer.

Não vou ser um daqueles fanáticos que nega até a morte a existência de problemas em seus objetos de adoração, ela possui algumas limitações e alguns bugs, por exemplo, eu não aconselharia criar um sistema de grande porte utilizando esta linguagem, até porque não é o foco e por exceção do SQLite, existem dificuldades em criar conexões com banco de dados conhecidos como: MySQL, SQL Server, Postgree, Oracle e etc. Apesar de existir uma UDF para se trabalhar com SQL e algumas outras não homologadas para trabalhar com alguns SGDBs conhecidos. Mas naquilo que o Autoit se propõe a fazer, o SQLite é mais do que suficiente para atender a maioria das necessidades.

Também já encontrei bugs em algumas funções mas nada que não possa ser contornado repensando um pouco seus scripts.

Se você se interessar e resolver mergulhar neste novo oceano de oportunidades que o Autoit lhe traz, descobrirá que ele também pode ser utilizado pelas forças do mal, você mesmo se sentirá inclinado pelo lado negro da força, quando descobrir que você pode perfeitamente criar keyloggers, vírus, worms entre outras pragas com algumas poucas linhas de código, nunca foi tão fácil destruir um PC.

Claro que apesar de algumas pessoas utilizarem para este fim, esta prática não é aconselhada e muito menos estimulada pelos desenvolvedores da linguagem e mesmo trabalhando a mais de um ano com ela, nunca parei para criar nada semelhante, eu teria apenas o trabalho de ter que consertar o estrago criado.

Para finalizar, se você esta querendo automatizar aquela tarefa repetitiva do dia a dia, ou quer deixar seus personagens de MMORPGS capinando ou matando monstros para aumentar de nível para depois vendê-los no ebay, ou quer criar uma ferramenta que monitore aplicações cruciais em um ambiente do qual você é administrador ou até mesmo deseja criar um pequeno aplicativo, sem ter que ficar se preocupando com inúmeros protocolos de linguagens burocráticas, então o Autoit é para você. Com uma comunidade ativa na internet, um fórum recheado de dicas, documentação eficiente, várias ferramentas para agilizar o desenvolvimento e compilador próprio, programar utilizando esta linguagem se torna algo extremamente divertido e eficiênte.