ALK Armando Leopoldo Keller


Conexão AS3 com python via socket (simplificado)
17 Janeiro, 2009, 2:30 pm
Arquivado em: AIR, AS 3.0, Flash geral, Flex, Socket, conexao, python | Tags: , , , ,

Algumas vezes me perguntei como fazer algumas coisas mais complexas em AIR de uma maneira rapida e segura, como por exemplo pegar informaçoes do usuario, conectar com um banco de dados (sem ser o nativo do AIR) como oracle,mssql… executar linha de comando, e outras coisas que só seriam possiveis utilizando alguma outra linguagem mais poderosa. Levando em conta que isto realmente era necessario para aumentar o “poder” do AIR e que o AMF fazia algo parecido, só que para a internet, resolvi criar uma classe em AS e uma função em Python que facilita a comunicação entre os dois (deixe o servidor python rodando de fundo e chame as funçoes dele :D )

Primeiro a classe Python.as que pode ser baixada aqui :

package
{
    import com.adobe.serialization.json.JSON;
    import flash.net.Socket;
    /**
     * Classe para conexao com python utilizando socket
     * @author    Armando Leopoldo Keller - (http://alkeller.wordpress.com) - alkeller@live.de
     */
    public class Python extends Socket
    {
        // TODO: Implementar um metodo de retorno, verificando o tipo do retorno, e passando como parametro na funcao associada
        /**
         * Cria um novo Socket
         * @param host    Host onde esta o socket
         * @param port    Porta que esta o socket
         * @see flash.net.Socket
         * @usage    var p:Python = new Python("10.1.1.23",2727);
         */
        public function Python(host:String=null, port:uint=0)
        {
            super(host, port);
            host = null;
            port = 0;
        }
        /**
         * Chama uma funcao do python se o socket estiver conectado 
         * @param func    Nome da funcao a ser chamada no python
         * @param args    Argumentos a serem chamados no python
         * @usage p.call("teste",{um:1,dois:2,tres:3});
         * @usage p.call("teste");
         */
        public function call(func:String,args:Object=null):void
        {
            if(this.connected)
            {
                this.flush();
                var obj:Object = new Object();
                obj["funcao"] = func;
                for(var i:* in args)
                {
                    if(args[i] is String) args[i] = "'"+args[i]+"'"
                    obj[i]=args[i];
                }
                this.writeUTFBytes(JSON.encode(obj));
                obj = null;
            }
            else
                throw new Error("Voce deve estar conectado ao socket.")
            this.flush();
        }
    }
}

Depois é necessario a função em python que vai reconhecer o que está sendo chamado pelo flash, o arquivo pode ser baixado aqui :

import json;
def executar(objeto):
    __arr__ = [];
    __str__ = "";
    obj = json.loads(objeto);
    __str__ = str(obj["funcao"])+"(";
    obj.pop("funcao");
    if len(obj.keys()) >= 1:
        for k in obj:
            __arr__.append(str(k)+"="+str(obj[k]));
        for x in xrange(len(__arr__)-1):
            __str__ = __str__+__arr__[x]+",";
        __str__ = __str__ +__arr__[len(__arr__)-1]+")";
    else:
        __str__ = __str__+")";
    return __str__;

Agora precisamos de um “servidor socket” rodando de fundo com as funçoes a serem chamadas, que pode ser baixado aqui :

import socket
import threading
import json
from JMF import executar
class ClientThread ( threading.Thread ):
    def __init__ ( self, channel, details ):
        self.channel = channel
        self.details = details
        threading.Thread.__init__ ( self );
    def run ( self ):
        print 'Conexao recebida: ', self.details [ 0 ]
        self.channel.send ( "resposta vinda do python" )
        for x in xrange ( 10 ):
            string = self.channel.recv ( 1024 )
            self.interpretaComando(string)
        self.channel.close();
        print 'Conexao fechada: ', self.details [ 0 ]
    def interpretaComando(self,string):
        eval("self."+executar(str(string)));
    def testar(self,arg1,arg2):
        print "Chamou testar: "+str(arg1)+","+str(arg2);
        self.channel.send("Chamou testar: "+str(arg1)+","+str(arg2));
    def pegaVariaveis(self):
        print "chamou pegaVariaveis"
        self.channel.send("chamou pegaVariaveis");
    def pegarArray(self):
        print "Chamou pegar Array";
        arr = ['a','b','c',1,2,3];
        txt = json.dumps(arr);
        self.channel.send(txt);
    def pegarObj(self):
        print "Chamou pegar Objeto";
        teste = {}
        teste["item1"]   =   "Primeiro item";
        teste["item2"]   =   "Segundo item";
        teste["numero"]  =   2;
        self.channel.send(json.dumps(teste));
# Inicia o servidor
server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
server.bind ( ( socket.gethostbyname(socket.gethostname()), 2727 ) )
server.listen ( 5 )
print "Iniciando servidor..."
while True:
    channel, details = server.accept()
    ClientThread ( channel, details).start()
Pronto, agora só falta uma aplicação de exemplo chamando estas funçoes, que pode ser baixada aqui :
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication applicationComplete="iniciar()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import com.adobe.serialization.json.JSON;
            private var py:Python
            [Bindable]
            public var texto:String = ""
            public function iniciar():void
            {
                py = new Python();
                py.addEventListener(ProgressEvent.SOCKET_DATA,onRecebe);
                py.addEventListener(Event.CONNECT,onConecta);
                py.addEventListener(IOErrorEvent.IO_ERROR,onErroIO);
                py.connect("10.1.1.3",2727);
            }
            public function onRecebe(e:ProgressEvent):void
            {
                var str:String = py.readUTFBytes(py.bytesAvailable);
                texto = str;
                py.flush();
            }
            public function onConecta(e:Event):void
            {
                trace("Conectou")
            }
            private function chamarTeste():void
            {
                if(py.connected)
                    py.call("testar",{arg1:"Argumento 1",arg2:"Argumento 2"})
                else
                    texto = "O socket esta desconectado";
            }
            private function chamarPegaVariaveis():void
            {
                if(py.connected)
                    py.call("pegaVariaveis")
                else
                    texto = "O socket esta desconectado"
            }
            private function pegarArray():void
            {
                if(py.connected)
                    py.call("pegarArray");
                else
                    texto = "O socket esta desconectado";
            }
            private function pegarObj():void
            {
                if(py.connected)
                    py.call("pegarObj");
                else
                    texto = "O socket esta desconectado";
            }
            private function matarServer():void
            {
                py.close();
                texto = "Desconectado"
            }
            public function onErroIO(e:IOErrorEvent):void
            {
                trace("Erro ao conectar com o socket");
            }
        ]]>
    </mx:Script>
    <mx:VBox>
        <mx:HBox>
            <mx:Button label = "Testar"         click = "chamarTeste()"            />
            <mx:Button label = "PegaVar"         click = "chamarPegaVariaveis()"    />
            <mx:Button label = "pegarArray"     click = "pegarArray()"            />
            <mx:Button label = "pegarObj"         click = "pegarObj()"            />
            <mx:Button label = "Kill Server"    click = "matarServer()"            />
        </mx:HBox>
        <mx:Text text="{texto}" width="100%" height="115"/>
    </mx:VBox>
</mx:WindowedApplication>

Claro que esta aplicação ainda está bastante simples, mas o objetivo é demonstrar como pode ser facil conectar o AS3 com Python utilizando socket, para quem não conhece python, vale a pena dar uma estudada, é uma linguagem muito util, poderosa, e simples, que é utilizada em diversos lugares, alguns exemplos bons são nasa e google (precisa mais ? ), agora mistura isso com AS3  (tem algo MUITO funcional e bonito).

Explicação rapida

A sintaxe é muito parecida com a Tweener (classe de tween) que ja é bastante conhecida, então creio que não deve ter muita dificuldade para utilizar esta classe. Sendo que para chamar uma função do python é só chamar     instancia.call(“nome_da_funcao”,{nome_do_argumento:valor_do_argumento…….});

Se alguem tiver alguma duvida, ou sugestão para esta classe ou para futuras classes, deixe um comentario ou envie por email mesmo.

A formatação dos codigos ainda  não está boa, mas esta melhorando (plugin do Windows Live Writer)  se alguem conhecer algum plugin para formatar codigos que tenha suporte a AS, Python, PHP,e C  me avisa.



Classe para utilização de banco de dados em AIR atualizada (com eventos)
2 Agosto, 2008, 9:49 pm
Arquivado em: AIR, AS 3.0, Flash geral, Flex | Tags: , , , , , ,

Seguindo as sugestões do flavio no post antigo, eu atualizei a classe, agora ela tem eventos e aceita parametros (mais seguro).

OBS: copie e cole os links no seu navegador

link para arquivos da classe: http://paginas.terra.com.br/lazer/alksk8/DB.zip

Fiz tambem um exemplo da utilização da mesma, que agora não é mais global.

link para .as do exemplo : http://paginas.terra.com.br/lazer/alksk8/Main.as

link para o .fla do exemplo: http://paginas.terra.com.br/lazer/alksk8/Main.fla

Eu estou postando com menos frequencia devido a falta de tempo, mas quando sobra tempo estou aqui.

Agora estou envolvido com outro projeto o GOAS3 que tem por objetivo utilizar os serviços disponibilizados pela API do google, isto tambem esta consumindo uma boa parte do meu tempo.

Qualquer duvida , sugestão, ou critica sobre a classe favor fazer por comentario.



Away3D ou Papervision ?
21 Abril, 2008, 11:38 am
Arquivado em: AIR, AS 3.0, Flash geral, Flex, Papervision 3D | Tags: , , , , , ,

Olá, eu estava procurando algumas outras engines 3d para Actionscript, foi então que eu encontrei o Away3D( http://away3d.com/ ) que aparentemente parece ser melhor do que o papervision para coisas mais completas.

Se alguem testar os dois coloque a sua opnião aqui.

eu escolho o  Away3D   :D



Classe para utilização de SQL em AIR (Flash, Flex)
5 Abril, 2008, 7:42 pm
Arquivado em: AIR, AS 3.0, Flash geral, Flex | Tags: , , , , , , ,

Neste tutorial mostrarei como utilizar uma classe que eu criei para facilitar o uso de SQL em AIR (tanto para flash quanto para flex)
A classe é esta:

/*
################################################
# #
# Classe : DB (com.alkeller.air.DB) #
# Autor : Armando Leopoldo Keller #
# Versão : 1.0 #
# Contato : alksk8@hotmail.com #
# Blog : http://alkeller.wordpress.com #
# Documentaçao em breve no blog #
# #
################################################
——- Deixe os creditos na classe ———-
*/
package com.alkeller.air
{
// Imports
import flash.data.SQLResult;
import flash.filesystem.File;
import flash.data.SQLStatement;
import flash.data.SQLConnection;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
import flash.errors.SQLError;

// Classe;
public class DB
{
// Variaveis utilizadas;
private static var conectado:Boolean = false;
private static var dbFile:File
private static var conn:SQLConnection
private static var _sqlStatement:SQLStatement;
private static var resultado:SQLResult;
private static var retornoString:String;
private static var retornoObjeto:Object;

// Funçao Inicia :utilizada para conectar com o banco de dados;
public static function Inicia(_nome:String):String
{
conn = new SQLConnection();
dbFile = File.applicationStorageDirectory.resolvePath(String(_nome+”.db”));
try
{
conn.open(dbFile);
conectado = true;
trace(“Conectado com “+_nome+”.db”);
retornoString = “Conectado com “+_nome+”.db”;
}
catch (error:SQLError) {
conectado = false;
retornoString = “Falha ao conectar: “+error.message+”\nDetalhes: “+error.details;
}
return retornoString;
}
// Funçao executeQuery: Utilizada para executar um comando SQL(verificar quais são aceitos pelo AIR);
// Retorno: SQLResult –> http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/data/SQLResult.html
// ou String de erro;
public static function executeQuery(_sql:String):Object
{
if(conectado == true)
{
_sqlStatement = new SQLStatement();
_sqlStatement.sqlConnection = conn;
_sqlStatement.text = _sql;
try
{
_sqlStatement.execute();
resultado = _sqlStatement.getResult();
retornoObjeto = resultado;
}
catch (error:SQLError)
{
retornoString = “Falha ao executar(“+_sql+”): “+error.message+”\nDetalhes: “+error.details;
}
return retornoObjeto?retornoObjeto:retornoString;
}
else
{
return “Não conectado!”;
}
}
}
}

Classe para download: http://paginas.terra.com.br/lazer/alksk8/DB.as

Como utilizar:
1 – Importe a classe:

// OBS: Aqui é bom verificar se a classe esta no local certo com/alkeller/air/
import com.alkeller.air.*;
// ou
import com.alkeller.air.DB;

2 – Inicie o banco:

DB.Inicia(“teste”); // sendo que teste é o nome do banco

3 – Se as tabelas não existirem, crie elas:

DB.executeQuery(“CREATE TABLE IF NOT EXISTS testando (id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT,sobrenome TEXT)”);

4.1 – Execute as Querys que desejar, por exemplo inserir alguns dados:

DB.executeQuery(“INSERT INTO testando (id,nome,sobrenome) VALUES (null,’ARMANDO LEOPOLDO’,'KELLER’)”);

4.2 – Exemplo de como buscar dados:

var obj:Object = DB.executeQuery(“SELECT * FROM testando”).data;
for(var i:uint=0; i < obj.length; i++)
{
trace(“linha: “+i)
for(var j:Object in obj[i])
{
trace(j+”: “+obj[i][j])
}
}

Aproveitem a classe :D

Em breve colocarei aqui este tutorial em video.



NativeMenu em AIR (flash)
16 Março, 2008, 6:04 pm
Arquivado em: AIR, AS 3.0, Flash geral | Tags: , , , , , , ,

Olá, segue abaixo um exemplo comentado de como utilizar menus(como os da maioria dos softwares) em AIR, é um exemplo básico baseado em tutoriais da Adobe.

/*

Primeiro crie um arquivo novo(air)

crie um campo de texto com o tamanho que desejar

instancie o campo de texto como “texto” (sem as aspas)

cole o codigo a seguir no primeiro frame

*/

// importa as classes necessarias

import flash.display.NativeMenu;

import flash.display.NativeMenuItem;

import flash.display.NativeWindow;

import flash.desktop.NativeApplication;

//declara os 2 items do menu

var Menu01:NativeMenuItem;

var Menu02:NativeMenuItem;

if (NativeWindow.supportsMenu)// Se o sistema operacional for windows

{

          stage.nativeWindow.menu = new NativeMenu(); //cria o menu

          stage.nativeWindow.menu.addEventListener(Event.SELECT, selecionouUmItem);//adiciona um evento de seleção no menu

Menu01 = stage.nativeWindow.menu.addItem(new NativeMenuItem(“Primeiro item”));//adiciona o primeiro item no menu

Menu01.submenu = criaSubMenu(); // adiciona o submenu(que vai ser criado logo abaixo) ao primeiro item

Menu02 = stage.nativeWindow.menu.addItem(new NativeMenuItem(“Segundo item”));//adiciona o segundo item no menu

}

if (NativeApplication.supportsMenu)// se o sistema operacionall for mac

{

Menu01 = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem(“Primeiro item”));//adiciona o primeiro item no menu

          NativeApplication.nativeApplication.menu.addEventListener(Event.SELECT, selecionouUmItem);//adiciona um evento de seleção no menu

Menu01.submenu = criaSubMenu(); // adiciona o submenu(que vai ser criado logo abaixo) ao primeiro item

Menu02 = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem(“Segundo item”));//adiciona o segundo item no menu

}

function criaSubMenu():NativeMenu

{

var tmpMenu:NativeMenu = new NativeMenu(); // cria o submenu do primeiro item

var MenuNovo:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Novo”));//adiciona o item “Novo” ao submenu

var MenuSalva:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Salva”));//adiciona o item “Salva” ao submenu

var MenuSair:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Sair”));//adiciona o item “Sair” ao submenu

return tmpMenu;

}

function selecionouUmItem(e:Event)
{

texto.text = e.target.label // escreve o nome do item selecionado no campo de texto

}

Qualquer duvida é só postar que eu respondo.

Assim que sobrar algum tempo por aqui eu postarei um tutorial (bem detalhado) e com os exemplos, de como utilizar um banco de dados local com o AIR.



Adobe AIR é lançado
2 Março, 2008, 2:31 pm
Arquivado em: AIR, AS 3.0, Flash geral

Olá, fiquei um tempo sem postar devido a falta de tempo , mas estou devolta, para quem ainda não sabe o Adobe AIR não é mais beta, ele ja foi lançado.

player : http://get.adobe.com/air/

Como instalar e começar com AIR + Flash : http://www.adobe.com/devnet/air/flash/getting_started.html

Se alguém tiver duvidas de como instalar ou algo do genero, fala ai que eu vou procurar sanar as duvidas.



Como controlar as janelas do AIR
30 Dezembro, 2007, 7:45 pm
Arquivado em: AIR, AS 3.0

Controlar as janelas transparentes do AIR é mais fácil do que parece, aqui vão alguns exemplos de como fazer isso:

Fechar

//tendo um movieClip com instanciado de bt_fechar
bt_fechar.addEventListener(MouseEvent.CLICK,sair);
function sair(e:MouseEvent):void{

    stage.nativeWindow.close();

}

Minimizar

//tendo um movieClip com instanciado de bt_minimizar
bt_minimizar.addEventListener(MouseEvent.CLICK,minimizar);
function minimizar(e:MouseEvent):void{

    stage.nativeWindow.minimize();

}

Maximizar

//tendo um movieClip com instanciado de bt_maximizar
bt_maximizar.addEventListener(MouseEvent.CLICK,maximizar);
function minimizar(e:MouseEvent):void{

    stage.nativeWindow.maximize();

}

Restaurar

//tendo um movieClip com instanciado de bt_restaurar
bt_restaurar.addEventListener(MouseEvent.CLICK,restaurar);
function restaurar(e:MouseEvent):void{

    stage.nativeWindow.restore();

}

Mover

//Crie um movieClip com a area para ser usada para arrasta, instancie ele como bt_arrastar
bt_arrastar.addEventListener(MouseEvent.MOUSE_DOWN,arrastar);
function arrastar(e:MouseEvent):void{

    stage.nativeWindow.startMove();

}

Dimensionar

//Crie um movieClip com a area para ser usada para dimensionar, instancie ele como bt_dimensionar
bt_dimensionar.addEventListener(MouseEvent.MOUSE_DOWN,dimensionar);
function dimensionar(e:MouseEvent):void{

    stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);

}

A formatação do código não está das melhores( tudo feito a mão :-P ), com o tempo quero ver se consigo colocar o plugin de formatação de código aqui, ou encontrar algum que formate sozinho e gere o html com as cores e espaços tudo certos, caso alguém tenha uma sugestão ou duvida, comenta ai.