logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jul 13

5 teclas de atalho essenciais no Flash Builder 4.5

Escrito por Daniel Schmitz em 1, Access, AR, arte, busca, C#, class, classe, código, Componente, event, exemplo, explorer, flash, flash builder, Flash Builder 4, for, handle, ide, IE, if, int, menu, MXML, O, on, Pessoal, procura, produtividade, programação, quick, RIA, Ria’s Geral, S+S, Sugestões, UI, XML, XP @ 07 13th, 2011 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Pessoal,

todas as IDEs possuem centenas de teclas de atalho que são muito úteis para aumentar a produtividade do programador. No Flash Builder, não poderia ser diferente, e excluindo a tecla mais importante que é CTRL+S, exibo a seguir 5 teclas essenciais para acelerar o seu desenvolvmento, veja:

CTRL+3 ? Quick Access

Usada para executar um comando da IDE, como por exemplo criar uma classe, abrir as preferências do projeto, ou então executar a aplicação. Acostume-se a usar esta tecla ao invés de ficar procurando itens no menu da aplicação

CTRL+1 Quick Assis

Usada para fornecer sugestões ao código. Uma das aplicações é criar um método/propriedade que não existe, criar event handlers, etc.

CTRL+O Quick Outline

Usada para navegar no arquivo aberto. Por exemplo, se você está em uma classe ou mxml e quer ir para outra parte do código, como um método ou componente qualquer, acione a tecla e faca a busca. É útil também para ver os métodos e propriedades de uma classe.

CTRL+SHIFT+R Open Resource

Permite abrir qualquer classe ou arquivo do projeto, muito útil e mais rápido que ficar procurando a classe no Package Explorer.

ALT+ Seta para cima/baixo

Selecione um código e use estas teclas para ver o resultado. O texto é facilmente movido. Útil para inserir códigos prontos em um laço ou para refatorar a ordem dos métodos.

Aplicando estas teclas de atalho, você irá perceber que a sua programação será mais rápida e produtiva. Experimente!

Se você achar mais alguma tecla interessante, não deixe de comentar !

Mai 25

Loading Applications – About loading sub-applications

Escrito por Fabio da Silva em 1, 3.5, 4, 6, Access, app, AR, BI, blog, Blogs, C#, class, classe, classes, control, development, Draw, event, events, Flex, for, framework, function, Google, ide, IE, if, int, mg, Number, O, on, reference, rest, Ria’s Geral, S+S, tag, TAT, UI @ 05 25th, 2011 | via http://fabiophx.blogspot.com | Sem comentários
Fabio da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

About loading sub-applications

Flex lets you load and unload sub-applications in a main application. Reasons:

  • Reduce the size of the main application
  • Encapsulate related functionality into a sub-application
  • Create reusable sub-applications that can be loaded into different applications
  • Integrate third-party applications into your main application

Level of interoperability

The way in which the sub-application is loaded defines the level of interoperability between the main application and its sub-applications. Consider the following factors when loading sub-applications in your main application:


Trusted applications What level of trust do the applications have? The higher the level of trust greater interoperability with the main application. In general, though, if you do not have complete control over the development and deployment of a loaded application, consider that application to be untrusted.


Versioning Are the applications compiled with the same version of the Flex framework? The default method of loading sub-applications assumes that all applications are compiled by the same version of the framework. However, Flex can load applications that were compiled with different versions of the framework. These applications are known as multi-versioned applications.


The level of trust and use of versioning are determined by the application domain and the security domain into which the sub-applications are loaded.


Types of loading

Single-versioned applications are guaranteed to have been compiled with the same version of the compiler as the main application. They have the greatest level of interoperability with the main application, but they also require that you have complete control over the source of the sub-applications.


Multi-versioned applications can be compiled with different versions of the Flex framework than the main application that loads them. Their interoperability with the main application and other sub-applications is more limited than single-versioned applications.


Sandboxed applications are loaded into their own security domains, and can be multi-versioned. Using sandboxed applications is the recommended practice for loading third-party applications. In addition, if your sub-applications use RPC or DataServices-related functionality, you should load them as sandboxed.

Sandboxed applications have the greatest number of limitations on application interoperability. These restrictions include the following:
  • Stage Access to the stage from the sub-application is limited to some stage properties and methods.
  • Mouse You cannot receive mouse events from objects in other security domains.
  • Pixels Applications cannot access the pixels drawn in applications that are in other security domains.
  • Properties While applications can get references to objects in other security domains, avoid doing this for security reasons. Some properties are restricted, such as the Stage or any parent of a DisplayObject that another application instantiates.


Note: multi-versioned and sandboxed applications must be compiled with the same or older version of the compiler the main application was compiled with.

Note: When compiling each of these types of applications, you should include the MarshallingSupport class into the main application and sub-applications. You do this with the includes compiler argument, as the following example shows:
-includes=mx.managers.systemClasses.MarshallingSupport

Mai 6

Upload de arquivo com Servlet e Flex – Parte I

Escrito por Cognitiva Soluções em 1, 4, 6, Access, apache, AR, arte, blog, Blogs, boolean, browser, busca, business, case, catch, chrome, class, código, exemplo, firefox, Flex, for, function, Google, IE, if, image, int, Java, mg, Number, O, on, print, problema, pt, reference, RIA, Ria’s Geral, servidor, string, Sun, try, UI, utils, vs @ 05 6th, 2011 | via http://blog.cognitivasolucoes.com | Sem comentários
Cognitiva Soluções
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Segue um exemplo de como desenvolver um Servlet para upload de arquivos realizando a integração com Flex. Confira a solução adotada para resolver o problema de perda de sessão do upload com Flex nos browsers Firefox e Chrome.


Segue o código java:

package com.xxx.business.services;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import sun.misc.BASE64Decoder;

import com.xxx.commons.AccessProperties;
import com.xxx.core.exception.BusinessException;

public class ServletUploadFile extends HttpServlet {

 public ServletUploadFile() {
 }

 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {

  doPost(request, response);
 }

 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  try {
   // Verifica se é upload
   boolean isMultipart = ServletFileUpload.isMultipartContent(request);

   if (isMultipart) {
    FileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    List items = upload.parseRequest(request);

    Iterator iter = items.iterator();
    while (iter.hasNext()) {
     FileItem item = (FileItem) iter.next();

     if (item.isFormField()) {
      processFormField(item);
     } else {
      processUploadedFile(item, "arquivos");
     }
    }
   }

  } catch (Exception e) {
   e.printStackTrace();
   throw (new ServletException(e.getMessage()));
  }
 }

 private void processFormField(FileItem item) throws ServletException {
  String name = item.getFieldName();
  String value = item.getString();

  System.out.println("Item name: " + name + " ; value: " + value);
 }

 private void processUploadedFile(FileItem item, String caminho)
   throws Exception {
  String fileName = item.getName();

  AccessProperties prop = new AccessProperties();
  String path = prop.getCaminhoPadrao() + caminho + "/upload/";

  // Verifica a existencia da pasta e se não existir ja cria
  if (FileUtils.verificaSeExisteECriaPasta(path)) {
   File uploadedFile = new File(path + fileName);
   if (!uploadedFile.exists()) {
    uploadedFile.createNewFile();
   }
   item.write(uploadedFile);

  } else {
   throw (new BusinessException(
     "Não foi possível criar uma pasta no servidor para o arquivo do upload."));
  }
 }

}

Agora vamos ao Flex:

Note que passamos o atributo?jsessionid que é utilizado para a sessão não ser perdida.

public function executaUploadFTP( file:FileReference ):void{
   var mile:Number = new Date().getUTCMilliseconds();

   var params:URLVariables = new URLVariables();
   params.jsessionid = this.sessionId;
   params.cod = mile;

   var servletTarget:URLRequest = new URLRequest("/ServletUploadFile;jsessionid=" +
    this.sessionId + "?cod=" + mile);

   servletTarget.method = URLRequestMethod.POST;
   servletTarget.data = params;
   file.upload(servletTarget, "Filedata", true);

  }

Na ?Parte II será abordado como recuperar o?jsessionid?e a construção da Tela Flex com seus métodos de busca do arquivo a ser enviado entre outro detalhes.

Abr 26

Download de arquivo com Servlet e Flex

Escrito por Cognitiva Soluções em 1, 4, 6, Access, AR, blog, Blogs, break, business, catch, class, código, Curso, Download, err, exemplo, finally, Flex, for, function, Google, html, ide, IE, if, image, int, Java, mg, O, on, override, print, produto, pt, RIA, Ria’s Geral, string, TAT, try, UI, vs @ 04 26th, 2011 | via http://blog.cognitivasolucoes.com | Sem comentários
Cognitiva Soluções
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Segue um exemplo de como desenvolver um Servlet para download de arquivos realizando a integração com Flex.

Vamos ao Servlet:

package com.xxx.business.services;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.agriness.produto31.business.db.entities.Usuario;
import com.agriness.produto31.business.dto.Arquivo;
import com.agriness.produto31.commons.AccessProperties;
import com.agriness.produto31.core.exception.BusinessException;
import com.agriness.produto31.recurso310003.business.services.ArquivoDownload;

public class ServletDownloadFile extends HttpServlet {

 private static final long serialVersionUID = -1783732558472851554L;

 @Override
 @SuppressWarnings("unchecked")
 protected void service(final HttpServletRequest request,
   final HttpServletResponse response) throws ServletException,
   IOException {

  ArquivoDownload arqDown = new ArquivoDownload();
  Arquivo arq = new Arquivo();
  arq.setNome(request.getParameter("nome"));
  arq.setExtensao(request.getParameter("extensao"));
  arqDown.setArquivo(arq);
  arqDown.setCaminho("/download/");

  PrintWriter printwriter = response.getWriter();

  if (arqDown.getArquivo().getNome().length() == 0) {
   response.setContentType("text/html");
   printwriter.println("Nome do arquivo inválido");
   printwriter.flush();
   printwriter.close();
   return;
  }
  if (arqDown.getCaminho() == null) {
   response.setContentType("text/html");
   printwriter.println("Caminho do arquivo inválido");
   printwriter.flush();
   printwriter.close();
   return;
  }
  File file = new File(arqDown.getCaminho()
    + arqDown.getArquivo().getNome());
  if (file == null) {
   response.setContentType("text/html");
   printwriter.println("Arquivo não pode ser lido");
   printwriter.flush();
   printwriter.close();
   return;
  }

  if (!file.exists() || !file.canRead() || file.isDirectory()) {
   response.setContentType("text/html");

   if (!file.exists())
    printwriter.println("Arquivo inexistente");
   else if (file.isDirectory())
    printwriter.println("O arquivo é um diretório");
   else
    printwriter.println("Arquivo não pode ser lido");

   printwriter.flush();
   printwriter.close();
   return;
  }

  response.setHeader("Content-Disposition", "attachment; filename = "
    + arqDown.getArquivo().getNome());
  response.setContentType("octet-stream");

  int BUFF_SIZE = 1024;
  byte[] buffer = new byte[BUFF_SIZE];
  response.setContentLength((int) file.length());
  FileInputStream fis = new FileInputStream(file);
  OutputStream os = response.getOutputStream();

  int byteCount = 0;
  try {
   do {
    byteCount = fis.read(buffer);
    if (byteCount == -1)
     break;
    os.write(buffer, 0, byteCount);
    os.flush();
   } while (true);
  } catch (Exception excp) {
   excp.printStackTrace();
  } finally {
   os.close();
   fis.close();
  }

 }
}

Segue o código Flex:

public function executaDownloadFromUrl( url:String ):void{
   if( url == null ){
    return;
   }
   var u:URLRequest  = new URLRequest(url);
   navigateToURL(u);
  }

Monte a url conforme os atributos definidos no Servlet.
ex: http://meudominio.com/Servlet/?nome=nomeArquivo&extensao=.pdf

Abr 20

Erro de segurança do FlashPlayer

Escrito por Cognitiva Soluções em 1, 4, 6, Access, app, AR, blog, Blogs, browser, Crossdomain, event, exemplo, Flex, function, Google, handle, if, image, mg, O, on, problema, Ria’s Geral, server, UI, XML @ 04 20th, 2011 | via http://blog.cognitivasolucoes.com | Sem comentários
Cognitiva Soluções
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Um problema comum é quando sua aplicação Flex tentar acessar uma url de um domínio diferente da que esta no browser.

Para esse tipo de problema você pode hospedar no seu Server o arquivo crossdomain.xml.

Segue um exemplo de crossdomain.xml:


    
    
    

Após ter esse arquivo hospedado vamos ao Flex:

protected function application1_creationCompleteHandler(event:FlexEvent):void{
    Security.allowDomain("http://dominio.com");
    Security.loadPolicyFile("http://dominio.com/crossdomain.xml");
   }

Jan 12

Criando uma aplicação com Flex 4, Java e Blazeds

Escrito por Pablo Souza em 1, 2009, 3d, 4, 6, Access, Adobe, Adobe Flex, app, AR, auto, back, bar, BI, Blazeds, blog, botão, browser, builder 4, class, código, Componente, Componentes, comunicação, configuração, control, Curso, Cursos, dados, Data Service, Data Services, DataGrid, Desenvolvimento, Design, developer, development, dispatch, Diversos, Download, DRE, dynamic, Eclipse, email, err, event, Evento, exemplo, Exemplos, Ferramenta, flash, flash builder, Flash Builder 4, Flex, Flex 4, fonte, fonts, for, Formação, Formulário, frontend, function, git, handle, html, ide, IE, if, image, instalação, int, interface, Java, kit, label, layout, library, lista, map, menu, Messaging, mg, MXML, NaN, novidade, Novidades, O, on, Oracle, pattern, pt, Remoting, RIA, Ria’s Geral, server, serviço, Serviços, servidor, site, spark, string, Sun, tag, TAT, Tech, Tema, TextInput, UI, web, window, windows, XML @ 01 12th, 2011 | via http://rectius.com.br/blog | 2 comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Hoje vou mostrar a integração de aplicações Flex 4 com back-end Java, utilizando o Blazeds para comunicação entre eles. Durante a instalação e configuração do ambiente de desenvolvimento, estamos considerando que você está trabalhando numa máquina com Windows. Caso não seja este o caso não fique preocupado, basta repetir os mesmos passos descritos para o Windows adaptando para o sistema operacional que você estiver utilizando.

1. Instalações

- Download Java Development Kit (JDK6), e após configurar a váriavel de sistema JAVA_HOME.
- Download Eclipse IDE for Java Developers.
- Download BlazeDS Turnkey, contêm uma versão configurada do servidor Tomcat e diversos exemplos.
- Download Adobe Flash Builder 4, versão Standalone.

2. Instalando o BlazeDS

Após o download do BlazeDS descompacte-o num diretório de sua preferência:
C:blazeds

* Nesse momento você já deve ter instalado o JDK e confgurado a variável JAVA_HOME.

Para verificar se tudo está funcionando vamos iniciar o servidor Tomcat.

Abra um prompt do Windows e digite:
cd C:blazedstomcatbin

Em seguida inicie o servidor Tomcat:
catalina start

Após a inicialização do servidor, você verá a janela abaixo:

O servidor de aplicação foi inicializado na porta 8400. Como eu disse anteriormente, o BlazeDS Turnkey vem com uma série de aplicações de exemplo mostrando a integração entre o Adobe Flex e o Java.

Para verificar se o servidor está rodando corretamente e ver as aplicações que citei, digite num browser de sua preferência:
http://localhost:8400/

3. Instalando o Eclipse

Após o download do Eclipse, descompacte o conteúdo do arquivo compactado para uma pasta um diretório de sua preferência:
C:eclipse

* Assim como o BlazeDS, o Eclipse também não necessita de instalação. Basta descompactá-lo para utilizar.

4. Instalando o Flash Builder 4

Para a instalação do Adobe Flash Builder 4 basta você ir avançando as opções, sempre mantendo os valores padrões. A versão Standalone é uma versão Trial que dura 60 dias. No site da Adobe você pode obter gratuitamente uma licensa de utilização caso você se enquadre nas exigências legais (estudantes, profissionais autônomos, etc).

5. Criando o projeto Java

Abra a pasta onde você descompactou o Ecplise e execute-o:
C:eclipseeclipse.exe

Em seguida vamos criar nosso projeto Java. Clique em:
File > New > Dynamic Web Project

Agora vamos criar um bean que será usado na serialização das informações que serão trocadas entre o Adobe Flex e o Java.

Clique com o botão direito do mouse no projeto e então:
New > Class

A seguir a implementa da nossa classa Java bean Usuario.java:

package br.com.rectius.model;
?
import java.io.Serializable;
?
public class Usuario implements Serializable {
?
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
?
	private String nome;
	private String email;
	private String cargo;
?
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getNome() {
		return nome;
	}
?
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEmail() {
		return email;
	}
?
	public void setCargo(String cargo) {
		this.cargo = cargo;
	}
	public String getCargo() {
		return cargo;
	}
?
}

Agora vamos criar nossa camada de serviço, que será o ponto de entrada das requisições do nosso front-end Flex.

Clique novamente com o botão direito do mouse sobre o projeto e então:
New > Class

A seguir a implementação da nossa camada de serviço UsuarioService.java:

package br.com.rectius.service;
?
import java.util.ArrayList;
?
import br.com.rectius.model.Usuario;
?
public class UsuarioService {
?
	/*
	 * Como não estamos utilizando nenhuma ferramenta
	 * para persistência dos dados, vamos armazenar
	 * a informações nessa lista estática
	 */
	private static ArrayList<Usuario> listaUsuarios =
		new ArrayList<Usuario>();
?
	/*
	 * Insere um novo usuário
	 * @param usuario
	 */
	public void insereUsuario(Usuario usuario)
	{
		listaUsuarios.add(usuario);
	}
?
	/*
	 * Retorna todos os usuários
	 * @return
	 */
	public ArrayList<Usuario> listaUsuarios()
	{
		return listaUsuarios;
	}
?
}

Pronto! Nossa aplicação Java já está finalizada.

6. Configurando o BlazeDS

Para que o Adobe Flex possa se comunicar com nossa camada de serviço no Java, teremos que modificar alguns arquivos de configuração do BlazeDS.

Abra a pasta onde você descompactou o BlazeDS:
C:blazeds

Crie um nova pasta chamada:
C:blazedsBlazedsConfigBase

Localize agora o arquivo blazeds.war e descompacte-o na pasta que acabamos de criar:
Arquivo: C:blazedsblazeds.war
Pasta: C:blazedsBlazedsConfigBase

Veja o contéudo da pasta C:blazedsBlazedsConfigBase>:
C:blazedsBlazedsConfigBaseMETA-INF
C:blazedsBlazedsConfigBaseWEB-INF

* A pasta WEB-INF contém toda a informação necessária para a integração de um projeto Adobe Flex + Java + Blazeds.

Agora vamos copiar algumas pastas do BlazeDS para dentro nosso projeto Java. Localize a pasta:
C:blazedsBlazedsConfigBaseWEB-INF

Copie o arquivo e os diretórios abaixo para WebContentWEB-INF, dentro do Eclipse:
C:blazedsBlazedsConfigBaseWEB-INFweb.xml
C:blazedsBlazedsConfigBaseWEB-INFflex
C:blazedsBlazedsConfigBaseWEB-INFlib

A pasta lib contém todas as biliotecas necessárias para realizar a comunicação do Adobe Flex com o Java.
A pasta flex contém os arquivos de configuração necessários para estabelecer essa comunicação.

Nesse momento a estrutura do seu projeto deve estar como na imagem abaixo:

Agora vamos configurar nossa aplicação para que o Flex consiga se comunicar com o nosso projeto Java.

Dentro do Eclipse localize e abre o arquivo:
WebContentWEB-INFweb.xml

Configure-o conforme a seguir:

<?xml version="1.0" encoding="UTF-8"?>
DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
?
    <display-name>BlazeDSdisplay-name>
    <description>BlazeDS Applicationdescription>
?
    -- Http Flex Session attribute and binding listener support -->
    <listener>
        <listener-class>flex.messaging.HttpFlexSessionlistener-class>
    listener>
?
    -- MessageBroker Servlet -->
    <servlet>
        <servlet-name>MessageBrokerServletservlet-name>
        <display-name>MessageBrokerServletdisplay-name>
        <servlet-class>flex.messaging.MessageBrokerServletservlet-class>
        <init-param>
            <param-name>services.configuration.fileparam-name>
            <param-value>/WEB-INF/flex/services-config.xmlparam-value>
       init-param>
        <load-on-startup>1load-on-startup>
    servlet>
?
-- begin rds
end rds -->
    <servlet>
        <servlet-name>RDSDispatchServletservlet-name>
		<display-name>RDSDispatchServletdisplay-name>
        <servlet-class>flex.rds.server.servlet.FrontEndServletservlet-class>
		<init-param>
			<param-name>useAppserverSecurityparam-name>
			<param-value>falseparam-value>
		init-param>
        <load-on-startup>10load-on-startup>
    servlet>
?
    <servlet-mapping id="RDS_DISPATCH_MAPPING">
        <servlet-name>RDSDispatchServletservlet-name>
        <url-pattern>/CFIDE/main/ide.cfmurl-pattern>
    servlet-mapping>
?
    <servlet-mapping>
        <servlet-name>MessageBrokerServletservlet-name>
        <url-pattern>/messagebroker/*
    
?
    
        index.html
        index.htm
    
?
    
    
?

Ainda dentro do Eclipse localize e abra o arquivo:
WebContentWEB-INFflexremoting-config.xml

Dentro desse arquivo é que informamos quais os serviços que nosso front-end Flex poderá ter acesso. Para tal basta criar um novo destino para cada serviço.

Crie um destino para o serviço UsuarioService adicionando no arquivo remoting-config.xml o código abaixo:

    <destination id="UsuarioService">
    	<properties>
    		<source>br.com.rectius.service.UsuarioServicesource>
    	properties>
    destination>

Pronto! O projeto Java já está configurado para trabalhar com o BlazeDS.

7. Publicando nossa aplicação no Tomcat

Já terminamos o projeto Java e a configuração do BlazeDS. Agora o próximo passo é publicar o projeto no servidor de aplicações Tomcat.

Navegue até a pasta:
C:blazedstomcatwebapps

Crie uma pasta para o projeto Java:
C:blazedstomcatwebappsGerenciaUsuario

Agora dentro do Eclipse, clique sobre a pasta WEB-INF e a copie Edit > Copy.

Cole então seu conteúdo na pasta que criada no passo acima:
C:blazedstomcatwebappsGerenciaUsuario

Agora reinicie o servidor de aplicação Tomcat para subir o projeto que acabamos de fazer deploy:
catalina stop
catalina start

08. Criando o projeto Flex

Uma das novidades do novo ambiente de desenvolvimento Adobe Flex, o Flash Builder 4, é sem dúvidas os recursos de conexão a dados e serviços.
No passo 4 nós fizemos a instalação do Flash Builder 4. Agora localize seu ícone na área de trabalho ou no menu iniciar e abra o aplicativo.

Em seguida crie um novo projeto Flex. Clique em File > New > Flex Project

Agora faça suas configurações conforme a imagem abaixo:

Root folder: Representa o diretório onde fizemos o deploy do nosso projeto Java, dentro do servidor de aplicação.
Root URL: Representa a URL de acesso ao projeto no servidor de aplicação.
Context root: Representa o nome da nossa aplicação.
Output folder: Representa o local onde serão compilados os arquivos do Flex.

Clique em Validate Configuration para se certificar de que você configurou tudo corretamente e em seguida clique em Finish.

Antes de qualquer coisa vamos conferir se o Flash Builder inseriu corretamente um parâmetro de compilação no projeto Flex.

Clique com o botão direito do mouse no projeto Flex, clique em Properties e certifique-se de que o argumento de compilação -services foi inserido:

Agora vamos criar a interface. Digite o código abaixo:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx">
?
	<s:controlBarContent>
		<s:Label text="Gerenciamento de Usuários"
				 fontWeight="bold" fontSize="18"/>
	s:controlBarContent>
?
	<s:layout>
		<s:VerticalLayout
			horizontalAlign="center" verticalAlign="middle"
			paddingLeft="10" paddingRight="10" paddingBottom="20" paddingTop="20"/>
	s:layout>
?
	<s:Panel title="Cadastro de Usuários" width="500">
?
	s:Panel>
?
	<s:Panel width="500" height="100%" title="Listagem de Usuários">
		<mx:DataGrid id="dgUsuarios" left="20" right="20" bottom="20" top="20">
		mx:DataGrid>
	s:Panel>
?
s:Application>

09. Conectando a aplicação Adobe Flex ao Java

Em seguida vamos utilizar os novos recursos inseridos no Flash Builder 4 para se comunicar com o Java.

Clique em Windows > Data/Services. Após a aba correspondente se abrir clique em Connect to Data/Service….

Veja que alguns arquivos foram criados automaticamente:

Clique com o botão direito em qualquer ponto da sua Application (não clique nos componentes Panel ou qualquer outro que não seja a Application) e clique em Generate Service Call:

Em seguida selecione o método listaUsuarios():

Vá para o modo de visualização “Source” e veja que um método handler foi criado para manipular o evento CreationComplete da Application.

Agora volte para o modo “Design”, clique com o botão direito no componente DataGrid e em seguida clique em Bind to Data…

Clique no botão OK e veja o resultado:

Finalizamos o código para a listagem dos usuários. Agora precisamos fazer o código que vai inserir os usuários.

Novamente clique com o botão direito do mouse no componente DataGrid e então clique na opção Generate Details Form…

Arrume o posicionamento do formulário de cadastro, altere o label do botão. Em seguida clique com botão direito do mouse sobre o botão e Generate Service Call…

Agora altere o método button_clickHandler que foi gerado automaticamente:

protected function button_clickHandler(event:MouseEvent):void
{
	var usuario:Usuario = new Usuario();
	usuario.email = emailTextInput.text;
	usuario.nome = nomeTextInput.text;
	usuario.cargo = cargoTextInput.text;
	insereUsuarioResult.token = usuarioService.insereUsuario(usuario);
}

Com isso já conseguimos inserir usuários na coleção do back-end Java. Agora vamos modificar nosso código para que toda vez que um usuário for inserido os usuários sejam listados novamente no componente DataGrid.

Agora altere o método insereUsuarioResult_resultHandler:

protected function insereUsuarioResult_resultHandler(event:ResultEvent):void
{
	listaUsuariosResult.token = usuarioService.listaUsuarios();
}

Agora rode sua aplicação e veja o resultado final.

Pronto! A aplicação está rodando perfeitamente.
Como lição de casa, faça com que seja possível remover e alterar um usuário.

Fontes do projeto:

Download do projeto Flex (28 KB)
Download do projeto Java (3.67 MB)

Referências:
- Accessing data services overview

Espero que tenham gostado e até a próxima!

Dez 23

Parsing de XML no IPhone

Escrito por DClick Team em 1, 2.0, 4, 6, Access, api, Aplicativos, app, apple, AR, arte, BI, blog, busca, class, classe, classes, código, comparação, dados, demo, Desenvolvedor, Desenvolvimento, developer, development, Download, err, Estilo, event, Evento, Eventos, exemplo, Ferramenta, filtra, Flex, for, Google, how-to, html, ide, IE, if, image, int, Introdução, iphone, library, Mac, mg, O, object model, on, padrão, problema, problemas, procura, reference, referencia, relatório, Relatórios, rest, RIA, Ria’s Geral, SDK, serviço, Serviços, Software, string, TAT, Tema, Touch, tv, Twitter, UI, uint, UX, validação, Ved, vs, web, web 2.0, XML, XP @ 12 23rd, 2010 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Introdução

Fazer parsing de uma estrutura de dados como o XML é muito comum no desenvolvimento de aplicativos web, a maior parte dos sistemas desenvolvidos com o conceito de Web 2.0 implementam uma api de serviços para que o desenvolvedor possa utilizar e criar novos aplicativos, sub programas, relatórios e etc.

Estas API’s de serviços trabalham na maioria das vezes com formato de dados universais, como por ex, o JSON e XML. Portanto uma terefa comum quando estamos desenvolvendo um aplicativo “client” para estes serviços é interpretar estes dados para utilizar do modo desejado no software.

Existem diferentes modos de trabalhar com documentos XML’s e diferentes ferramentas para isso. Neste post vamos ver como isso funciona no desenvolvimento para IPhone.

Como funciona o parsing de XML?

Existem dois modos para fazer parsing de um documento XML, e muita diferença entre eles. Entender como cada modo funciona é fundamental para que esta tarefa não se torne um problema no seu projeto.

SAX ( Sequencial Access Parser )

Como o nome sugere, o parser que implementa o SAX irá fazer uma analise sequencial na estrutura do xml, o que isso quer dizer? Cada elemento do XML será analisado individualmente e em sequencia. Ele é baseado em um fluxo de eventos que são disparados para cada elemento do XML.

Exemplo

Dado o XML abaixo:

PLAIN TEXT
XML:

  1. <?xml version=“1.0″ encoding=“UTF-8″?>
  2. param=“value”>
  3. ? ? >
  4. ? ? ? ? Some Text
  5. ? ? >
  6. >

A sequência que o parser irá fazer é a seguinte:

  • Começo de um novo elemento, chamado RootElement, com o atributo param = “value”
  • Começo de um novo elemento, chamado FirstElement
  • Um nó de texto com o data igual a “Some Text”
  • Final do elemento chamado FirstElement

Quando utilizar?
Este tipo de parser é recomendado quando o tamanho do documento é muito grande ( algo em torno de 10MB ) e você pretende utilizar somente uma pequena parte do XML, pois ele não carrega o conteúdo do documento em memória ( isso acontece com os parser que implementam DOM ), porém o trabalho de desenvolvimento é maior.

DOM ( Document Object Model )
O parser que implementa o XML DOM, possibilita você acesse qualquer elemento diretamente sem a restrição de seguir uma seqüência baseado na hierarquia do XML.

Normalmente os parsers que implementam o modelo DOM também permitem que você defina a consulta no xml através de XPath. Isso torna muito mais fácil a maneira de filtrar ou agrupar os elementos do XML.

Para aqueles que estão acostumados a trabalhar com o flex, a maneira como o sdk lida com XML é através da implementação DOM, e a linguagem de busca dentro do XML é o E4X, portanto a curva de aprendizagem para aprender XPath será menor.

Para que o parser possa interpretar as consultas XPath e navegar de modo trasnversal entre os elementos para encontrar o critério de busca, o XML é carregado em memoria e transformado em uma estrutura de dados que facilita este tipo de tarefa. O ponto ruim disso é que em documentos grandes esta abordagem pode ocasionar problemas.

Exemplo

Dado o xml abaixo:

PLAIN TEXT
XML:

  1. <?xml version=“1.0″ encoding=“UTF-8″?>
  2. param=“value”>
  3. ? ? >
  4. ? ? ? ? />
  5. ? ? >
  6. >

E o seguinte trecho de código:

O exemplo de código abaixo utiliza a biblioteca GDataXML para manipulação DOM do XML, está biblioteca é distribuida pela Google.

O método [doc nodesForXPath:@"//item":nil] irá percorrer todos os elementos do XML procurando pelos nós do tipo .

Quando utilizar?
O parser que implementa o XML DOM deve ser utilizado em documentos que não irão comprometer a memória ( algo menor que 10MB ), já que o gerenciamento de memoria no desenvolvimento de IPhone é um ponto que deve ser considerado. A manipulação de XML com DOM é muito mais fácil do que com SAX, uma vez que o acesso é direto.

Quais bibliotecas utilizar?

Existem várias bibliotecas que fazem parsing de XML, as mais conhecidas são:

  • NSXMLParser É um SAX parser incluido por padrão no SDK do IPhone.
  • libxml2 Este é um projeto Open Source que também é incluido por padrão no SDK do IPhone, ele é baseado na linguagem C, portanto é um pouco mais complicado de usar se comparado com o NSXMLParser. Esta biblioteca suporta tanto o modo SAX quanto DOM. O processamento SAX desta biblioteca é muito interessante pois permite que você faça a leitura/manipulação do XML durante o download, evitando o tempo que demoraria para baixar o documento todo.
  • TBXML é um parser DOM XML muito leve desenvolvido para ser  muito rapido e consumir o minimo de memoria possível. Ele ganha tempo pois não faz validação, não da suporte ao XPath e possibilita somente acesso de leitura ao conteúdo do XML.
  • TouchXML é um parser com mesmo estilo do NSMXL porem com DOM XML. Do mesmo modo que o TBXML ele permite acesso somente de leitura, entretanto possui suporte para XPath.
  • KissXML muito similar ao TouchXML, inclusive foi feito com base no mesmo, entretanto possibilita edição do conteúdo do XML.
  • GDataXML este parser é desenvolvido pela  Google como part de sua biblioteca Objectve-c. Ele suporta leitura e escrita , e também da suporte a XPath

Conclusão

O importante é ter em mente quais são as opções e modos de fazer o parcing do XML na sua aplicação, entender quais são as métricas que o ambiente da aplicação possui e leva-las em conta na decisão de como fazer o parsing. Estas métricas irão te encaminhar a uma das opções.

O link a seguir possui um conteudo complementar ao tema, e também apresenta uma comparação entre todas as ferramentas analisando performace e utilização de memória, vale a pena dar uma olhada: link

Referencias:

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project
http://stackoverflow.com/questions/406811/iphone-development-xmlparser-vs-libxml2-vs-touchxml
http://www.saxproject.org/
http://en.wikipedia.org/wiki/Simple_API_for_XML
http://www.w3schools.com/Dom/dom_parser.asp
http://www.w3schools.com/XPath/default.asp

Nov 21

Programadores fazendo aviões, seria assim…

Escrito por Gabriel Versallini em 1, 4, 6, Access, app, AR, arte, BI, Carreira, class, Download, flash, FullScreen, IE, Java, Javascript, lista, Mac, O, on, pt, RIA, Ria’s Geral, screen, social, Software, swf, wave, zend @ 11 21st, 2010 | via http://www.versallini.com.br | Sem comentários
Gabriel Versallini
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »


Quem nunca passou por isso? Você não? Você é de onde? Marte.
Isso é uma situação normal para os programadores e analistas, sempre criando ou alterando o software já em uso. E acredite, o risco de “queda” pode ser como a de um avião mesmo.

Um abraço

Nov 16

Case Classes com Scala

Escrito por DClick Team em 1, 4, 6, Access, app, AR, auto, back, BI, blog, boolean, case, catch, class, classe, classes, codec, código, Desenvolvimento, DRE, Eclipse, eval, exemplo, explicação, flash, for, FullScreen, fundo, Google, ide, IE, if, image, int, internet, Java, Livro, Mate, mg, Motivação, mudanças, NaN, Number, O, on, operadores, pattern, Plugin, polimorfismo, print, problema, pt, RIA, Ria’s Geral, screen, Screencast, string, Sun, TAT, Tema, Teste, Tree, try, Tutorial, tv, Twitter, UI, uint, Vídeo, wave, XP, zend @ 11 16th, 2010 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Twitter!

Vimos que Scala na verdade é uma linguagem puramente orientada a objetos, com conceitos de classe, instância, heirarquia e polimorfismo como Java por exemplo. Mas Scala traz também alguns conceitos próprios muito interessantes, que é o caso de Case Classes.

Case Classes são um caso de classes com regras pré-definidas em tempo de compilação, de maneira que se permita executar algumas outras operações sobre tais classes facilitando algumas modelagens, e ajudando na aplicação de algumas boas práticas. Vamos estudar mais a fundo o conceito de Case Classes nesse post. Usei como referência o Scala By Example do Martin Odresky, o qual citei em posts anteriores.

Para acompanhar o post, é muito recomendado alguma IDE de desenvolvimento de scala. Estou usando o scala-ide plugin para o Eclipse, que pode ser encontrado em http://www.scala-ide.org/.

Motivação para Case Classes


Eu gostei bastante do exemplo disponível no livro, por isso vou seguir a mesma idéia nesse post só que com as minhas palavras do que eu consegui aprender sobre assunto pesquisando um pouco mais na internet, e citando também as dificuldades que enfrentei.

Imagine que queremos modelar um interpretador de expressões matemáticas que são descritas em objetos do nosso domínio. Por exemplo, queremos interpretar o resultado de 1 + (3 + 7), e representando em nosso modelo, queremos obter algo como:

1
new Sum(new Number(1), new Sum(new Number(3), new Number(7)))



Uma maneira orientada a objetos de se implemetar tal domínio poderia ser algo como:

1
2
3
4
5
6
7
8
9
trait Expr {
    def eval: Int
}
class Number(n: Int) extends Expr {
    def eval: Int = n
}
class Sum(e1: Expr, e2: Expr) extends Expr {
    def eval: Int = e1.eval + e2.eval
}



A implementação é bastante limpa e nosso interpretador seria mais simples ainda:

1
2
3
4
object Inter {
    def inter(e: Expr) =
        e.eval
}



Se você assistiu o screencast sobre integração com Java, e JUnit rodando testes de Scala, você pode fazer um teste para verificar que nosso interpretador está funcionando corretamente:

1
2
3
4
5
6
7
8
9
10
11
12
package br.com.dclick
import org.junit._
import Assert._

class InterTest {

  @Test
  def testInter = {
    var res = Inter.inter(new Sum(new Number(1), new Sum(new Number(3), new Number(7))))
    assertEquals(11, res)
  }
}



Para essa modelagem, quando quisermos adicionar uma nova operação que pode ser interpretada, basta criar uma nova classe que extends Expr e pronto! Nada mais precisa ser alterado em nosso código, e nosso interpretador continuará funcionando.
Agora imagine que antes de executar a expressão, queremos imprimir no console de um jeito amigável a expressão matemática que está sendo executada. Nesse caso, de acordo com nossa modelagem, teríamos que definir em nosso Expr uma função print, para que todas as suas implementações definam o comportamento de tal função. Para isso temos que alterar o código em todas as classes que já existem, o que pode ser ruim dependendo do nosso sistema.

Aplicando Case Classes


Em Scala existe a definição de Case Class. Para criar uma Case Class basta adicionar o modificador case antes da definição da classe. Em nosso exemplo faça as seguintes mudanças:

1
2
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr



Case classes seguem as seguintes regras:

1 – Possuem um construtor definido exatamente com o mesmo nome definido na classe. Em nosso exemplo:

1
def Number(n: Int) = new Number(n)



Dessa forma é possível escrever nossa expressão 1 + (3 + 7) da seguinte forma:

1
Sum(Number(1), Sum(Number(3), Number(7)))



Substitua no teste para ter certeza do funcionamento.

2 – Os métodos toString, equals e hashCode já estão implementados seguindo a definição da classe com seus atributos. Para nosso exemplo com Number, esses métodos já levam em consideração o atributo n, deixando de comparar os objetos por endereço de memória. Os operadores == e != também já estão definidos em função do equals.

3 – Todos os atributos passados no construtor possuem os métodos de acesso público já definidos. Em nosso exemplo, Number e Sum já possuem os seguintes métodos:

1
def n: Int


1
def e1: Expr, e2: Expr



Fato importante é que tais classes se tornam imutáveis, ou seja, não existe um método para alterar o valor dos atributos, e nem é possível definí-los.

4 – Case Classes podem ser usadas para pattern matching, que é uma operação disponível em Scala e que veremos agora.

Match, não Switch


Vimos que a classe base do Scala é o Any, e que todos objetos podem ser tratados como tal. Any define uma função que permite verificar o tipo de classe que está sendo tratado e tomar a atitude correspondente. Vamos ao exemplo que explica melhor o comportamento. Em nosso object Inter, mude a função inter para o seguinte:

1
2
3
4
5
def inter(e: Expr): Int =
    e match {
        case Number(n) => n
        case Sum(a, b) => inter(a) + inter(b)
    }



Rode nosso teste novamente e verifique que está tudo correto.
Para entender o que está acontecendo: estamos dizendo que um dos casos esperados é o caso em que e é do tipo Number, que recebe um parâmetro que chamamos de n. Note que não precisamos definir o tipo de n, pois o compilador consegue inferir baseado na definição do construtor de Number. Feito isso, n está disponível no contexto do case atual. Para nosso caso com Number, precisamos apenas devolver o valor de n.
No segundo caso, estamos esperando uma Expr do tipo Sum, que recebe dois parâmetros e que baseado no construtor definido na classe, sabemos que é do tipo Expr. Nesse caso devolvemos o inter de a somado ao inter de b.
Simples não? :)

Nessa nossa nova modelagem fica fácil adicionar uma nova funcionalidade ao comportamento das expressões, como por exemplo imprimir de maneira legível. Basta adicionar mais um método ao nosso interpretador. Claro que agora temos o problema adicionar um novo caso quando criarmos uma nova operação, mas a quantidade de código a ser implementada é consideravelmente menor.

Match é definida como uma função como qualquer outra em Scala, portanto pode ser atribuída a variáveis, ser devolvida como resultado e ser passada como parâmetro para outras funções. Pode-se também criar um bloco como o seguinte:

1
{ case Number(n) => n case Sum(a, b) => a + b }



e usá-lo como uma função anônima. Dessa forma será criado uma função match para tratar com seus casos definidos no bloco.

Exceptions


Veremos Exceptions mais para frente, mas perceba como funciona o bloco try/catch em Scala, e veja se há alguma semelhança com o que acamos de ver:

1
2
3
4
5
6
7
try {
    println
} catch {
    case npe: NullPointerException => print(npe.getMessage)
    case ioe: IOException => print(ioe.getMessage)
    case e: Exception => print(e.getMessage)
}



Pois bem, catch possui o mesmo comportamento de match para execeções.

Exercício


Vou me basear no exercício disponível no livro do Martin.

Considere que queremos implementar uma árvore binária ordenada de inteiros. E tome a seguinte implementação como base:

1
abstract class IntTree


1
case object EmptyTree extends IntTree {}


1
case class Node(elem: Int, left: IntTree, right: IntTree) extends IntTree {}


Agora complete a seguinte implementação dentro de IntTree:

1
2
3
4
5
6
7
8
9
10
11
12
abstract class IntTree {

    def contains (t: IntTree, v: Int): Boolean =
        t match {
            …
        }
   
    def insert(t: IntTree, v: Int): IntTree =
        t match {
            …
        }
}


Lembre-se que Node é imutável, e que é obrigatório usar Case Classes. Boa sorte :) !

A reposta está no screencast a seguir, junto com a explicação:

Vídeo em alta resolução.

Nov 14

Palestra: Formei, mas não sei NADA!!! #CafeAgilBH

Escrito por Edgard Davidson em .NET, 1, 4, 6, Access, app, AR, class, Download, event, Evento, Eventos, facebook, flash, for, FullScreen, ide, IE, Mac, O, on, Palestra, Pessoal, PHP, player, pt, Ria’s Geral, screen, swf, TAT, wave @ 11 14th, 2010 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá Pessoal.
Segue a palestra que apresentei no Café Ágil BH.
Neste link existem algumas fotos do evento.

Formei, mas não sei nada!!!
View more presentations from Edgard Davidson.

« Entradas anteriores |

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2755 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com