Qual a relação entre Sopa e Pipa, o Megaupload e o Anonymous?
Qual a relação entre Sopa e Pipa e o fechamento do Megaupload, que resultou em ataques do Anonymous a sites? Nenhuma. O fato de alguns eventos terem acontecidos muito perto um do outro, durante esta semana, aparentemente gerou confusão. Vamos entender essa história.

Personagens
> Sopa e Pipa: são projetos de lei norte-americanos contra a pirataria que dão aos Estados Unidos o poder de tirar qualquer site do ar por infração de direito autoral. Por serem projetos, isso significa que eles ainda não têm nenhum valor legal e não podem ser usados para derrubar sites. O Sopa (Stop Online Piracy Act) é a versão da Câmara dos Deputados do Pipa (Protect IP Act), que tramita no Senado. O Pipa, por sua vez, é a versão 2011 do projeto de lei chamado de Coica (Combating Online Infringement and Counterfeits Act), que foi votado e derrubado em 2010.
> Megaupload: site de compartilhamento de arquivos e o 73° maior site do mundo, que foi fechado pelo FBI no final desta quinta-feira (19). Seus donos foram acusados de formação de quadrilha para facilitar a pirataria e lavagem de dinheiro.
> Anonymous: rótulo empregado por manifestantes on-line e alguns hackers em ações normalmente retaliativas contra atitudes que eles discordam, principalmente ataques à liberdade de expressão. O meio mais comum de manifestação do Anonymous é o ataque de negação de serviço, que sobrecarrega um site até ele ficar inacessível, mas alguns indivíduos mais habilidosos também se identificam com o movimento e realizam invasões para expor informações de pessoas ou empresas.
O que aconteceu
> Quarta-feira (18): Dia de protesto mundial contra o Sopa e o Pipa, que estava para ser votado nos Estados Unidos. O protesto contou com o apoio da Wikipedia, que se autocensurou durante o dia para alertar internautas sobre o perigo do Sopa. Google lançou petição que teve 4,5 milhões de assinaturas, e vários outros sites aderiram ao movimento, voluntariamente. Nenhum ataque do Anonymous foi registrado neste dia, marcado como dia mundial de protestos contra o Sopa.
> Quinta-feira (19): Já no início da quinta-feira, o Sopa e o Pipa estavam para ser arquivados. Durante os atos da quarta-feira, os projetos perderam parte do apoio que tinham no Congresso norte-americano e, principalmente, ganharam vários oponentes devido aos protestos mundiais. No final da quinta-feira, o site Megaupload.com foi retirado do ar com base nas leis antipirataria existentes – sem relação com esses projetos. O Anonymous iniciou a retaliação contra o Departamento de Justiça dos Estados Unidos e o site cai.
> Sexta-feira (20): O FBI também é alvo e cai, junto de outros sites ligados ao Departamento de Justiça, a gravadora Universal Music Group (UMG), que estava sendo processada pelo Megaupload, o grupo Vivendi (dono da UMG), os estúdios da NBC Universal (produtores de filmes, sem relação com a UMG), o BMI (que coletam royalties de músicas), entre outros. Separadamente, o Sopa é arquivado na Câmara e o Pipa é suspenso.
Entre os alvos inicias do Anonymous não estava a Câmara dos Deputados (onde tramitava o Sopa) nem o Senado (onde estava o Pipa). Os ataques eram inteiramente como retaliação à retirada do Megaupload, que se deu com as leis antipirataria já existentes pelo Departamento de Justiça dos Estados Unidos.
É claro que há uma relação, sim, entre o Megaupload e os protestos do Anonymous. A relação, somente dessas duas partes, é completa – o fechamento do Megaupload é o motivador dos ataques.
Mas o Anonymous não teve nenhuma relação com o arquivamento e a suspensão do Sopa e do Pipa, embora seja verdade que o Anonymous, por ser a favor da liberdade de expressão e em geral até da pirataria, seja totalmente contra essas leis. No final da quinta-feira e na sexta, porém, quando o Anonymous entrou em cena, os projetos já estavam derrotados.
Autor: Altieres Rohr
Fonte: http://g1.globo.com/platb/seguranca-digital/2012/01/21/qual-a-relacao-entre-sopa-e-pipa-e-o-fechamento-do-megaupload-que-resultou-em-ataques-do-anonymous-a-sites/
Utilizando o Plugin Jquery Validation com JSON e PHP
No desenvolvimento de websites é comum a utilização de formulários de contato para o envio de informações.Porém, na maioria das vezes, validar os campos acaba sendo um trabalho chato e que demanda bastante tempo. Abordarei neste artigo uma solução prática para reduzir o tempo de desenvolvimento utilizando o Plugin Jquery Validation.Lembrando que este artigo focará na utilização do plugin Jquery Validation e não na utilização do JSON!
O plugin, como o próprio nome já diz, utiliza o framework Jquery para o seu funcionamento.
Primeiramente é necessário incluir a biblioteca Jquery e os arquivos do Plugin Jquery Validation que podem ser encontrados nos links abaixo:
Jquery: http://jquery.com/
Jquery Validation: http://bassistance.de/jquery-plugins/jquery-plugin-validation/
Os arquivos acima devem ser inseridos dentro da tag <head> do seu arquivo como demonstrado abaixo:
<script type="text/javascript" src="js/jquery-1.4.2.min"></script> <script type="text/javascript" src="js/jquery.validate.min.js"></script>
Após carregá-los , todas as funcionalidades do plugin estarão disponíveis para serem utilizadas em seu projeto.
Uma das grandes vantagens do uso do Jquery é poder utilizar funcionalidades muito interessantes com a escrita de poucas linhas de código.
Seguindo a implementação, após o carregamento, iremos criar o html do formulário que será validado posteriormente.
HTML
<!--FORMULÁRIO--></pre>
<form id="formulario" action="" method="get" enctype="multipart/form-data">
<label>Nome:</label>
<input id="nome" type="text" name="nome" />
<label>E-mail:</label>
<input id="email" type="text" name="email" />
<label>Telefone:</label>
<input id="telefone" type="text" name="telefone" />
<label>Mensagem:</label>
<textarea id="mensagem" name="mensagem"></textarea>
<input type="submit" value="Enviar" />
<p class="mensagem"></p>
</form>
<!--/FORMULÁRIO-->
CSS
#formulario{
width:250px;
}
input,label,textarea{
width:250px;
float:left;
clear:both;
}
.enviar{
width:100px;
float:right;
margin:10px 0 0 0;
cursor:pointer;
}
Com a estrutura do html pronta, precisaremos inserir o código javascript para implementar o plugin.
$(document).ready(function(){
/*Função para Recuperar as informações do formulário e enviar por e-mail*/
function EnviaForm()
{
$("p.mensagem").css("color","#6dac51").html("enviando...<img src="images/loading4.gif" alt="" />
");
$(".enviar").hide();
$.getJSON("enviar.php",
{
nome : $("#nome").val(),
email : $("#email").val(),
telefone : $("#telefone").val(),
mensagem : $("#mensagem").val(),
ajax : 'true'
},
function(j)
{
$(".enviar").show();
if (j[0].sucesso == 1 ){
$("input[type='text']").val("");
$("input[type='tel']").val("");
$("input[type='email']").val("");
$("textarea").val("");
}
else
$("p.mensagem").css("color","red");
$("p.mensagem").html(j[0].msg);
$("p.mensagem").fadeIn().delay(10000).fadeOut();
});
}
/*Validação do Formulário com o Plugin Jquery Validation*/
$("#formulario").validate(
{
submitHandler: EnviaForm
rules:
{
nome : 'required',
email :{
required: true,
email: true
},
telefone :{
required: true,
minlength: 14
},
mensagem : 'required'
},
messages:
{
nome : 'Por favor digite um nome!',
email : {
required : 'Por favor digite um e-mail',
email : 'O e-mail deve ser válido'
},
telefone : {
required : 'Por favor digite um telefone',
minlength: 'O telefone deve ser válido'
},
mensagem : 'Por favor digite uma mensagem!'
}
});
});
Observe que no código javascript primeiramente há uma função chamada EnviaForm.Essa função é responsável por recuperar todos os valores do formulário utilizando a função val() do jquery e logo após submetê-las via JSON a um arquivo php que receberá todas as informações passadas e utilizará as mesmas para desempenhar outras tarefas, como enviá-las por e-mail, por exemplo, ou salvá-las em um banco de dados.
Logo abaixo está o código responsável por efetuar a validação do formulário.Quando o botão de envio do form é acionado, o javascript recupera o formulário e submete a função “validate”, conforme o código.Daí em diante, o plugin faz toda a verificação dos campos e, caso haja campos vazios ou em formatos incompatíveis com as configurações, ele acusa um erro de validação, impossibilitando a sequência do envio do form até que os dados sejam corrigidos.
Função EnviaForm
Abaixo segue a explicação linha por linha do código acima.
function EnviaForm()
{
$("p.mensagem").css("color","#6dac51").html("enviando...<img src="images/loading4.gif" alt="" />");
$(".enviar").hide();
$.getJSON("enviar.php",
{
nome : $("#nome").val(),
email : $("#email").val(),
telefone : $("#telefone").val(),
mensagem : $("#mensagem").val(),
ajax : 'true'
},
function(j)
{
$(".enviar").show();
if (j[0].sucesso == 1 ){
$("input[type='text']").val("");
$("input[type='tel']").val("");
$("input[type='email']").val("");
$("textarea").val("");
}
else
$("p.mensagem").css("color","red");
$("p.mensagem").html(j[0].msg);
$("p.mensagem").fadeIn().delay(10000).fadeOut();
});
}
Linha 3 - Adiciona uma imagem de Loading no formulário
Linha 5 - Oculta o botão de envio para que o usuário não clique novamente, fazendo
uma nova requisição.
Linha 7 - Utiliza-se o JSON para recuperar os valores do formulário e
submetê-los a um arquivo php.Nessa linha o JSON é chamado, inserindo o caminho do
arquivo php que receberá esses valores.
Linha 9 à 13 - A função val() recupera os valores e submete ao rótulo inserido.
É necessário a utilização de identificadores para que o jquery identifique o campo correto
e recupere o seu valor.
Linha 15 à 31 - Função de retorno que irá tratar o resultado da operação
que será realizada no arquivo php.Por exemplo, se for o envio de um e-mail, no código,
deverá ser inserido uma msg de erro ou de envio com sucesso!
Essa mensagem retornará à essa função e o mesmo será exibido no formulário.
No exemplo acima, supondo que o código do php é o envio de um e-mail,
todos os campos estão sendo zerados caso o envio tenha sido um sucesso e
logo depois a mensagem de retorno está sendo exibida.
Lembrando que os valores poderão ser recuperados no arquivo php utilizando $_GET ou $_POST.O rótulo que deverá ser chamado tem que ser igual ao que foi inserido no JSON.
Exemplo:
JSON -> nome = $('#nome).val();
PHP -> $_GET['nome'];
Validação do Formulário
/*Validação do Formulário com o Plugin Jquery Validation*/
$("#formulario").validate(
{
submitHandler: EnviaForm
rules:
{
nome : 'required',
email :{
required: true,
email: true
},
telefone :{
required: true,
minlength: 14
},
mensagem : 'required'
},
messages:
{
nome : 'Por favor digite um nome!',
email : {
required : 'Por favor digite um e-mail',
email : 'O e-mail deve ser válido'
},
telefone : {
required : 'Por favor digite um telefone',
minlength: 'O telefone deve ser válido'
},
mensagem : 'Por favor digite uma mensagem!'
}
});
});
Linha 4 - Ao clicar no botão de envio do form, o validate busca o
formulario através do identificador "#formulario" e submete a
função validate.Na função validate, há o parâmetro submitHandler, responsável por
submeter o formulário à
função inserida após a validação.
Linha 5 à 17 - Configurações dos campos(campos obrigatórios, campos de e-mail,etc)
Linha 18 à 29 - Mensagens que serão exibidas caso haja um erro de validação.
Resumo:
Quando um usuário preencher o formulário e acionar o botão de envio, o validate buscará o formulário e fará a leitura de todos os campos conforme as configurações das “rules”.Caso esteja algo errado, o campo exibirá a mensagem de erro que foi configurada.Se estiver tudo correto, ele chama a função EnviaForm, que recuperará todos os valores dos campos do form e submeterá a um arquivo php.O retorno do php deverá retornar as informações em formato JSON que serão manipulados na função de retorno.
Screenshot do funcionamento do plugin:

Além das opções mencionadas nesse artigo, existem diversas outras funcionalidades que o plugin permite.Caso queira utilizar outras opções, acesse a documentação do Plugin no endereço http://bassistance.de/jquery-plugins/jquery-plugin-validation/
Riscos e Benefícios da utilização dos novos domínios de primeiro nível
Os novos domínios de primeiro nível, mas conhecidos como gTLDS (generic top level domains) prometem expandir o sistema de nomes de domínios (DNS) e modificar a internet para sempre.A idéia é você poder criar o seu próprio domínio e tornar-se o gestor do mesmo em nível primário.Por exemplo, o uso do .br (nível primário) permite a utilização de diversos domínios secundários.
Exemplo: Domínio Primário : .br
Domínio Secundário: virtualizeid.com.br
A decisão de se candidatar por um novo gTLD não deve ser assumido levianamente. A aplicação para executar o seu próprio gTLD não é o mesmo que registrar um nome de domínio de segundo nível.Quando você cria um novo gTLD ,você passa a gerir uma empresa de registro,como o registro.br, por exemplo, responsável pelos registros .br aqui no Brasil. Você passa a ser responsável por uma parte crítica e altamente visível de infra-estrutura da Internet.
A operação de registrar um domínio de primeiro nível oferece oportunidades estimulantes e recompensas, que transporta grandes responsabilidades também. A idéia desse post é esclarecer e expôr os objetivos e ajudar os candidatos em potencial a avaliar o programa para novos gTLDs, considerando os benefícios, bem como os riscos e responsabilidades.
BENEFÍCIOS EM POTENCIAIS
Empreendedorismo
Criar seu próprio modelo de negócio e estabelecer políticas de acessibilidade para o seu TLD. Se seus clientes desejam maior segurança, faça o seu TLD uma zona de alta segurança.
Aumento do controle
Você define as regras eo preço para quem registrar o seu TLD.
Fluxo de rendimentos
Seus clientes podem renovar seus nomes de domínio, ano após ano.
Oportunidade de marketing inovadoras
Construir uma melhor definição de marca, reconhecimento da marca, lealdade à marca e confiança por ter total controle sobre sua própria TLD.
Inovadores modelos de negócios
Quando novos gTLDs combinar com outras tecnologias emergentes de Internet, tais como IPv6, chips RFID, e cloud computing, novos produtos e serviços são possíveis.
Nomes de domínio internacionalizados (IDNs)
Aumentar o alcance de mercado, tornando a Internet completamente acessível para os usuários cujos idiomas locais usam caracteres não-latinos.
Envolver sua comunidade
Criar um ponto de encontro para os adeptos da sua causa, comunidade ou cultura para se unir com um TLD com base na comunidade.
Reunir sua área geográfica
Comemoração de cidadãos, comércio, atividades e cultura com um TLD geográfica.
RISCOS E RESPONSABILIDADES
Investimento
Além da taxa de avaliação ser de U$185.000 dólares para os custos operacionais do registro, os candidatos devem demonstrar profundidade financeira suficiente para manter o registro em pleno funcionamento há pelo menos três anos, mesmo se o plano de negócios não atingir os seus objetivos.
Perda de Investimento
Não há garantia de que você irá obter o domínio que se candidatou. Se você não passar pelo processo de avaliação (que é bastante extenso), você pode perder alguns ou todos do seu investimento inicial. Como em qualquer negócio novo, sendo que o início da operação não garante que as receitas serão rentáveis.
Restrições contratuais
Execução de um TLD significa que você deve cumprir todas as obrigações do seu contrato de registro com ICANN.
Mão de obra
Utilizar um registro de primeiro nível requer a contratação de operadores altamente qualificados técnicamente e é indispensável a negociação de um acordo mutuamente benéfico com um parceiro de alta confiança técnica.
Competição
Sua aplicação para TLD poderia competir com um domínio igual ou semelhante (s), e indiretamente com todos os TLDs. Se aprovado, o seu novo TLD pode encontrar concorrentes de setores inesperados.
Território desconhecido
Você será pioneiro na vanguarda da inovação tecnológica em um setor relativamente novo. Você pode ter que encontrar o seu caminho sem outros modelos de negócios aplicáveis para orientação.
Está não é uma lista completa de todos os riscos.Você deve fazer sua própria investigação , bem como consultar técnicos e especialistas jurídicos. Esta lista é fornecida apenas como informação geral para você começar.
A introdução de novos gTLDs afetará a maioria das organizações. Caso decida se candidatar a um novo gTLD, você ainda deve prestar atenção ao processo. Em maio de 2012, quando todos os aprovados forem lançados, você terá a oportunidade de se opor a qualquer que você acredita que violaria seus direitos legais.
As novas regras passarão a valer a partir do dia 12 de Janeiro de 2012!
Partes das informações extraídas do site http://newgtlds.icann.org/en/
Domínios da web terão novas regras a partir de 12 de janeiro
Vá começando a se desapegar dos famosos “.com”, “.net”, “.br” e outros tipos de domínios que servem como padrões para sites. Novas regras na internet começarão a ser implementadas a partir desta quinta-feira (12/1), principalmente em relação aos nomes de domínios dos sites.
A partir deste dia, empresas, marcas ou instituições poderão, por exemplo, propor qualquer terminação para seus endereços, ou os chamados domínios genéricos superiores. Assim, poderão ser criados domínios “.banco”, “.sp” ou até “.olhardigital”, uma vez que marcas poderão criar seus “.nike”, “.apple”, ou “.xbox”, e assim vai.
Porém, além de propor esses domínios, as empresas se tornarão entidades registradoras. Basicamente, terão toda a responsabilidade da gestão e operação do domínio, mesmo a parte tecnológica, assim como a Registro BR faz com o “.br”.
Para Rodrigo Azevedo, advogado especializado em Propriedade Intelectual e Tecnologia da Informação, os novos endereços possibilitam “um melhor posicionamento da marca na internet, ampliando as possibilidades de comunicação e visibilidade global de conteúdos”, além, claro, “de ser uma alternativa para o esgotamento do .com e .com.br”.
Apesar de a ideia já estar bombando no exterior – Nova Iorque e Berlim já querem seus domínios e diversos interessados querem domínios “.music”, “.hotel” ou “.web” –, no Brasil, o desconhecimento sobre o tema ainda é regra.
Azevedo conta que ele já está coordenando diversos pedidos de domínios para algumas das maiores marcas brasileiras, mas, na maioria da vezes, as companhias nem sequer sabem do que se trata essa oportunidade.
Outro ponto muito benéfico para as marcas e empresas é a prevenção de crimes ou fraudes virtuais. Assim, “todo o conteúdo publicado abaixo de .marcax, por exemplo, seria conteúdo oficial da marca ‘X’”, diz o advogado.
Porém, há riscos: outra empresa homônima pode escolher um domínio similar, podendo fazer com que a marca vá para segundo plano, mesmo se pensarmos em resultados de pesquisa em buscadores.
Entre os principais motivos que levam as empresas a investirem em novos domínios estão a personalização de seu lugar na web, atribuição de status digital à marca, possibilidade de comercialização de sites e e-mails com o nome do domínios e as oportunidades quase ilimitadas de novos endereços.
Fonte:Olhar Digital
http://olhardigital.uol.com.br/negocios/digital_news/noticias/dominios-da-web-terao-novas-regras-a-partir-de-12-de-janeiro
Avaliação do Pamundo pelo Hobbyipad.com
O jogo do Pamundo foi avaliado pelo site hobbyipad.com sendo muito bem avaliado quanto aos gráficos e jogabilidade.
Confiram a matéria hem: http://www.hobbyipad.com/2011/12/18/pamundo/
Lançamento do Jogo Família Pamundo
Depois de quase 8 meses de desenvolvimento está no ar o primeiro jogo da Virtualize para a plataforma IOS da Apple. Desenvolvido para o IPad, o jogo Família Pamundo é uma releitura do jogo das diferenças, ou jogo dos 7 erros, que tem como plano de fundo uma família em sua viagem ao redor do mundo conhecendo muitos lugares diferentes, culturas interessantes e divertidas festas.
Embarque nesta viagem e ajudar a família a encontrar os erros nas fotos tomadas a fim de completar o álbum.
Adquira o aplicativo Família Pamundo na Apple Store
- Menu Familia Pamundo
Atendimento limitado
Informamos aos nossos clientes que devido a queda de uma árvore próxima a nossa sede, a Virtualize encontra-se com atendimento limitado. A previsão de normalização é 13/12/2011. Pedimos que contatos sejam realizados pelo e-mail contato @ virtualizeid.com.br. Agradecemos a compreensão.
Desenvolvendo aplicações cliente-servidor com Flash/ActionScript e SmartFoxServer [02/03]
Esta é a segunda parte do tutorial de desenvolvimento de aplicações cliente-servidor utilizando Flash/ActionScript e SmartFoxServer.
No primeiro tutorial vimos como instalar e preparar o ambiente de desenvolvimento e entendemos a estrutura básica do SmartFoxServer, tanto do lado cliente quanto do servidor.
Agora iremos “colocar a mão na massa”, desenvolvendo uma aplicação de bate-papo simples.
1) Descrição da aplicação:
Na tela inicial, o usuário poderá digitar um login à sua escolha e clicar em “conectar”. O servidor irá validar se o nome de usuário já foi escolhido por outra pessoa. Se sim, o usuário será notificado. Caso contrário, o usuário se conectará ao bate-papo e na tela seguinte poderá conversar com os outros usuários conectados.
2) Lado servidor da aplicação:
2.1) Modificando o arquivo config.xml
O primeiro passo ao desenvolver uma aplicação para rodar no SmartFoxServer é definir no config.xml uma nova zona, que irá representar a aplicação. Dentro do config.xml existe um trecho para configuração de zonas, que fica entre as tags <Zones> e </Zones>. Segue o código para a zona utilizada neste tutorial:
<Zone name="zonaTutorial" uCountUpdate="true" maxUsers="4000" customLogin="true">
<AutoReloadExtensions>true</AutoReloadExtensions>
<Rooms>
<Room name="Entrada" maxUsers="4000" isPrivate="false" isTemp="false" autoJoin="true" isGame="false">
</Room>
</Rooms>
<Extensions>
<extension name="ExtensaoChat" className="ExtensaoChat.as" type="script" />
</Extensions>
</Zone>
É necessário entender o seguinte a respeito desta zona:
- O atributo name=”zonaTutorial” dá um nome à zona, permitindo que as aplicações clientes se conectem a ela através desse nome;
- Podemos definir uma quantidade máxima de usuários tanto para as zonas quanto para as salas;
- O atributo customLogin=”true” nos dá o controle do mecanismo de login de usuários. Quanto este atributo é false, o SmartFoxServer faz o controle à sua maneira. Geralmente utilizamos true, pois queremos utilizar nosso próprio mecanismo de login (por exemplo, buscando o usuário em um banco de dados);
- Dentro da zona podemos definir salas. Elas também possuem nomes, para os clientes poderem identificá-las mais facilmente;
- Uma sala com autoJoin=”true” permite que um cliente conectado à zona da qual ela faz parte possa utilizar a função autoJoin() para se conectar automaticamente à sala. Se nenhuma sala possui autoJoin=”true”, o cliente deve informar o nome da sala;
- Uma sala pode ser de jogo ou não (isGame true ou false). O SmartFox provê algumas funcionalidades específicas para salas de jogos, então podemos usá-las ao criar um jogo;
- Podemos definir extensões dentro de zonas e salas. Nesse caso, criamos uma extensão dentro da zona, o que significa que um cliente conectado a qualquer sala pode fazer requisições a ela, desde que faça parte da zona. Uma extensão de sala só pode receber requisições de quem está naquela sala;
- As extensões podem ser de vários tipos (Java, ActionScript, Python, entre outros). Neste caso, o atributo type=”script” determina que usaremos uma extensão escrita em ActionScript. O nome da classe fica no atributo className e o nome que é colocado em name é para que os clientes façam requisições utilizando este nome.
Conforme expliquei anteriormente, podemos definir a lógica do servidor em uma ou mais extensões, anexadas a zonas ou salas. A escolha de como faremos isso depende de cada projeto e dos seus requisitos. Aqui não estamos fazendo nada muito complexo, então basta uma única extensão que possa ser enxergada por toda a zona.
Uma extensão deve obrigatoriamente implementar 4 funções: init, destroy, handleRequest e handleInternalEvent. O servidor SmartFox chama essas funções em momentos específicos, a saber:
- A função init é chamada quando o servidor termina de carregar a extensão. Nesta função devemos colocar o código de inicialização.
- A função destroy é chamada quando o servidor remove/destrói a extensão. Nela devemos liberar recursos “externos” que porventura tenhamos usado, como arquivos abertos, conexões com bancos de dados, entre outros.
- A função handleRequest é disparada quando o servidor identifica que algum cliente fez uma requisição à extensão. É nela que devemos tratar ou direcionar as solicitações dos clientes.
- Por fim, a função handleInternalEvent é chamada quando ocorre algum evento interno ao SmartFox, por exemplo: tentativa de login de usuário, conexão perdida, etc. Caso nossa aplicação necessite, podemos tratar ou direcionar esse tipo de evento também.
Vejamos agora trechos de código da extensão ExtensaoChat. O código completo pode ser encontrado dentro do .zip anexado a este tutorial.
function init()
{
trace("A extensao foi carregada pelo servidor e esta sendo inicializada.")
}
function destroy()
{
trace("A extensao esta sendo removida/destruida pelo servidor.")
}
function handleRequest( cmd, params, user, fromRoom )
{
trace("handleRequest: " + cmd);
}
function handleInternalEvent( evt )
{
trace("handleInternalEvent: " + evt.name);
if ( evt.name == "loginRequest" ) TratarEventoLogin( evt );
}
function TratarEventoLogin( evt )
{
var nick = evt["nick"];
var pass = evt["pass"];
var chan = evt["chan"];
// Efetua a conexão de fato no servidor.
var resultadoLogin = _server.loginUser( nick, pass, chan );
// Constrói a resposta que será enviada, de acordo com o resultado do login.
var resposta = new Object();
if ( resultadoLogin.success )
resposta._cmd = "logOK";
else
{
resposta._cmd = "logKO";
resposta.mensagem = resultadoLogin.error;
}
// Envia a resposta ao cliente.
_server.sendResponse( resposta, -1, null, chan );
}
Vejam que neste tutorial não estou inicializando nem destruindo nada, além de não estar tratando requisições do cliente. Deixarei estes aspectos para o último tutorial, que será mais avançado. No entanto, estou tratando o evento interno de login: loginRequest. Quando um evento de login de usuário é recebido, a função TratarEventoLogin pega as informações do evento e envia para a função de login do SmartFox (loginUser). Em caso de sucesso, será enviado um comando logOK para o cliente. Caso contrário, é enviado o comando logKO juntamente com a mensagem de erro vinda do SmartFox. A função sendResponse possui como parâmetros um objeto contendo o que queremos enviar, o identificador da sala para a qual enviaremos (-1 caso não seja necessário), o remetente da mensagem (null caso não seja necessário) e os usuários que a receberão (neste caso, apenas o usuário que mandou, portanto coloquei o canal de comunicação para este usuário apenas). Existe mais um atributo na função sendResponse, mas no momento não é necessário entendê-lo.
3) Lado cliente da aplicação:
package
{
[...]
import it.gotoandplay.smartfoxserver.SFSEvent;
import it.gotoandplay.smartfoxserver.SmartFoxClient;
public class Cliente extends MovieClip
{
// Constantes relacionadas ao SmartFoxServer
private const SERVER_IP = "localhost";
private const ZONA = "zonaTutorial";
// Variáveis relacionadas ao SmartFoxServer
private var smartfox : SmartFoxClient;
public function Cliente()
{
[...]
Iniciar();
}
private function Iniciar():void
{
[...]
// Inicializa cliente SmartFox.
smartfox = new SmartFoxClient();
smartfox.addEventListener( SFSEvent.onConnection , OnConnection );
smartfox.addEventListener( SFSEvent.onConnectionLost , OnConnectionLost );
smartfox.addEventListener( SFSEvent.onRoomListUpdate , OnRoomListUpdate );
smartfox.addEventListener( SFSEvent.onExtensionResponse , OnExtensionResponse );
smartfox.addEventListener( SFSEvent.onPublicMessage , MostrarMensagemChat );
smartfox.connect( SERVER_IP, 9339 );
}
////////////////////////////////////////////////////////////////////////////////////////
// Funções da tela de login
private function Conectar( evt:MouseEvent ):void
{
var login = telaLogin_mc.login_txt.text;
if ( login != "" ) smartfox.login( ZONA, login, "" );
}
////////////////////////////////////////////////////////////////////////////////////////
// Funções da tela de mensagem
private function ExibirTelaMensagem( titulo:String, mensagem:String ):void
{
telaMensagem_mc.titulo_txt.text = titulo;
telaMensagem_mc.mensagem_txt.text = mensagem;
[...]
}
private function OcultarTelaMensagem( evt:MouseEvent ):void
{
[...]
}
////////////////////////////////////////////////////////////////////////////////////////
// Funções da tela de chat
private function EnviarMensagemChat( evt:MouseEvent ):void
{
var mensagem = telaChat_mc.mensagem_txt.text;
if ( mensagem == "" ) return;
telaChat_mc.mensagem_txt.text = "";
smartfox.sendPublicMessage( mensagem );
}
private function MostrarMensagemChat( evt:SFSEvent ):void
{
telaChat_mc.chat_txt.htmlText += "<b>[ <i>" + evt.params.sender.getName() + "</i> ] </b>" + evt.params.message;
}
////////////////////////////////////////////////////////////////////////////////////////
// Funções relacionadas ao servidor SmartFoxServer
private function OnConnection( evt:SFSEvent ):void
{
if ( evt.params.success )
{
EfetuarTransicao( telaConectando_mc, telaLogin_mc );
[...]
}
else
{
ExibirTelaMensagem( "ERRO NA CONEXÃO", "Ouch, falha na conexão! Tentando novamente..." );
setTimeout( smartfox.connect, 5000, SERVER_IP, 9339 );
}
}
private function OnConnectionLost( evt:SFSEvent ):void
{
ExibirTelaMensagem( "CONEXÃO PERDIDA", "A conexão foi perdida! Tentando novamente..." );
setTimeout( smartfox.connect, 5000, SERVER_IP, 9339 );
}
private function OnLogin( resObj:Object ):void
{
smartfox.getRoomList();
}
private function OnLoginFail( resObj:Object ):void
{
ExibirTelaMensagem( "FALHA NO LOGIN", resObj.mensagem );
}
private function OnRoomListUpdate( evt:SFSEvent ):void
{
smartfox.autoJoin();
EfetuarTransicao( telaLogin_mc, telaChat_mc );
}
private function OnExtensionResponse( evt:SFSEvent ):void
{
var resObj:Object = evt.params.dataObj;
switch ( resObj._cmd )
{
// Login realizado com sucesso.
case "logOK": OnLogin( resObj ); break;
// Falha no login.
case "logKO": OnLoginFail( resObj ); break;
}
}
} // fim da classe
} // fim do pacote
O cliente, ao iniciar, cria uma instância da classe SmartFoxClient, que é usada na comunicação com o servidor, além de estabelecer alguns listeners de eventos do SmartFox. Vamos entender cada um deles:
- onConnection: este evento será disparado se o cliente conseguir se conectar (ou não) ao servidor com sucesso;
- onConnectionLost: se a conexão com o servidor for perdida, este evento será disparado;
- onRoomListUpdate: evento disparado quando o cliente receber a lista de salas da zona ou sala à qual se conectou;
- onExtensionResponse: quando uma extensão manda uma resposta para o cliente, este evento é disparado;
- onPublicMessage: disparado quando o cliente recebe uma mensagem pública.
A aplicação utiliza estes eventos da seguinte forma:
- Ao receber o onConnection, se a conexão foi bem sucedida, é exibida a tela de login. Caso contrário, o usuário vê uma mensagem de erro e o cliente aguarda 5 segundos para tentar se conectar novamente;
- Quando o onConnectionLost é disparado, o cliente é notificado da queda de sua conexão e a aplicação tenta se conectar novamente;
- Quando o usuário chega na tela de login, ele pode digitar um nome de usuário e tentar entrar no bate-papo. O servidor receberá um loginRequest, conforme vimos anteriormente, e vai responder dizendo se a conexão foi bem sucedida ou não. O cliente receberá então um onExtensionResponse, com um comando. No caso do logKO, o cliente será avisado de que não conseguiu logar. Se receber um logOK, o cliente irá requisitar ao servidor a lista de salas disponíveis;
- Quando o servidor envia a lista de salas disponíveis, o cliente recebe o onRoomListUpdate e então se conecta a uma sala qualquer (que permita autoJoin) e é mostrada a tela de chat;
- Na tela de chat, o usuário pode escrever uma mensagem e enviar. Ao enviar, estará disparando para o servidor uma mensagem pública, que será recebida por todos que estiverem naquela sala (inclusive ele mesmo). O recebimento dessa mensagem pública dispara o onPublicMessage, evento que faz o cliente mostrar na tela a mensagem recebida.
Pronto! Conseguimos fazer uma aplicação de chat básica utilizando o SmartFoxServer!
Agora é só avançar para o último tutorial, no qual será feita uma aplicação um pouco mais avançada! (EM BREVE)
4) Como utilizar os arquivos de exemplo:
Após instalar o servidor SmartFoxServer (ver tutorial 1 desta série), colocar o arquivo ExtensaoChat.as na pasta “[diretório do SmartFox]/Server/sfsExtensions”. Além disso, é necessário fazer com que a IDE do Flash “veja” a pasta com que está dentro do .zip. Essa pasta possui alguns recursos que são usados na interface do exemplo. Por fim, deve-se inserir todo o conteúdo do arquivo zona.xml no config.xml do seu SmartFox, entre as tags <Zones> e </Zones>.
E lembrem-se de executar o SmartFox!
Desenvolvendo aplicações cliente-servidor com Flash/ActionScript e SmartFoxServer [01/03]
Olá a todos!
Neste tutorial irei abordar a base da criação de aplicações cliente-servidor usando Flash/ActionScript no cliente e o servidor SmartFoxServer. Este é o primeiro de uma série de 3 tutoriais. Neste momento não será desenvolvida a aplicação de fato. Ensinarei como instalar, entender e organizar um projeto utilizando as ferramentas e linguagens citadas anteriormente. Um outro tutorial será elaborado em seguida abordando o desenvolvimento de uma aplicação cliente-servidor simples. Este tutorial é um pré-requisito para o seguinte.
1) O que é uma aplicação cliente-servidor?
De maneira simples, uma aplicação cliente-servidor é definida como um modelo computacional no qual um ou mais programas (clientes) fazem requisições a um ou mais computadores centrais (servidores) e recebem respostas deles, sendo a conexão geralmente feita através de uma rede.
Uma aplicação cliente-servidor deve ser concebida utilizando programação assíncrona, o que significa que a execução de determinados trechos de código não deve ser feita de forma linear, mas sim ser pensada para rodar após um determinado evento ter ocorrido. Por exemplo: ao abrir o jogo, o usuário não pode ser encaminhado diretamente à tela onde vai jogar de fato. A aplicação deve ser feita de forma a esperar uma autorização do servidor para só então encaminhar o usuário à tela correta.
2) O que é o SmartFoxServer?
O SmartFoxServer é uma plataforma para desenvolvimento de aplicações e jogos multiusuários cliente-servidor. Ela suporta Adobe Flash/Flex/Air, Java, Android, .Net, Unity3D, Silverlight, Apple iPhone, entre outros.
3) Instalando o SmartFoxServer e entendendo seu funcionamento básico (lado servidor).
Antes de mais nada, considerem dar uma olhada na documentação do SmartFoxServer (em Inglês): http://www.smartfoxserver.com/docs/
A versão que utilizarei nos tutoriais é a Pro. O download pode ser feito em http://www.smartfoxserver.com/products/pro.php#downloads
No Windows a instalação é bem simples. É só executar o instalador e seguir as instruções. Após a instalação, aparece um executável “Start SmartFoxServer”, que é usado para iniciar o servidor.
A primeira coisa que é necessário saber sobre o SmartFoxServer é entender o arquivo config.xml. Este arquivo configura o servidor, as zonas, as salas e as extensões. A lista de todas as configurações possíveis está na documentação. Neste momento é necessário apenas entender o que significa cada um desses elementos.
O servidor, como o nome já diz, é o software que provê todos os recursos às aplicações clientes. Ele possui configurações gerais como IP, login e senha de administração, entre outras.
Uma zona define uma aplicação dentro do servidor (um jogo, um chat, etc.). Um servidor pode rodar várias zonas, ou seja, dentro dele podem estar definidas várias aplicações distintas.
As salas funcionam como ambientes dentro de uma zona. Um jogo de cartas, por exemplo, pode ter um ambiente inicial no qual o jogador escolhe se quer jogar uma partida de treino ou uma partida contra outros jogadores. Este ambiente inicial e as seções de treino e de jogadores contra jogadores podem ser salas dentro da zona do jogo.
Por fim, as extensões são componentes que podem ser acoplados a zonas ou salas para definir a lógica da aplicação no servidor. Em um jogo de Poker, por exemplo, será necessária a existência de uma ou mais extensões que definam todas as regras do jogo, descrevendo as jogadas que os jogadores podem fazer e as consequências de cada uma delas.
4) Lado cliente da aplicação.
Do lado cliente, a aplicação pode ser feita em Flash/Actionscript. Nesse caso, é necessário utilizar API de Flash do SmartFoxServer. Dentro do diretório de instalação do SmartFoxServer, existe a pasta Flash/Actionscript 3.0/. Para fazer com que o Flash enxergue esta API, devemos fazer o seguinte:
- Abrir o Flash e clicar em “Edit” -> “Preferences” (“Editar” -> “Preferências”);
- Clicar na categoria “ActionScript” e depois em “ActionScript 3.0 Settings”;
- Em “Souce path”, clicar no botão “+” e adicionar o caminho da pasta Flash/Actionscript 3.0/.
Lucy Potthoff Cerimonial
Está no ar mais um trabalho da Virtualize, o site para a Lucy Potthoff Cerimonial, empresa de salvador especializada em organização e cerimonial de eventos como casamentos, 15 anos, eventos coorporativos.
Confira em: http://www.lpcerimonial.com.br







