quarta-feira, 29 de abril de 2009

Por onde começar

Para quem está começando a estudar Flex espero poder ajudar com este post.

Algumas coisas que precisam ficar claras:
Flex não faz acesso aos arquivos da máquina (por questões de segurança, o AIR pode) e também não faz acesso direto ao banco de dados, o AIR consegue via SQLLite.
Resumindo, o Flex
é responsável pela parte view de sua aplicação, a parte que é mostrada para o cliente, o resto, regras de negócio, persistência, etc devem ficar na responsabilidade do server-side da sua aplicação.

Flex pode se comunicar com qualquer server:
Java, PHP, .Net, entre outros. As formas de comunicação são: HttpService (requisições http devolvendo xml, ou uma string, por exemplo, veja a propriedade resultFormat), WebService e RemoteObject, esta última na minha visão é a melhor.
Com RemoteObject você "liga" uma classe ActionScript com uma classe Java, por exemplo, trafegando entre as camadas client e server objetos e não xml. Para isso é necessário alguém que faça a serialização / desserialização entre as camadas, por ser binário a comunicação se torna mais rápida do que os outros métodos, para o Java temos o Adobe BlazeDS e o GraniteDS, para PHP temos o AMFPHP, para .Net o FluorineFX e o WebOrb.

Softwares necessários
Saiba o seguinte, o SDK do Flex com os componentes básicos é free, para você utilizar os gráficos e o AdvancedDataGrid comercialmente será necessário você comprar o IDE Flex Builder Professional.
Você pode ver as diferenças no link: http://www.adobe.com/products/flex/upgrade/
Você pode baixá-los aqui. Aqui o Flex Builder (FB) é uma cópia trial de 60 dias, (fica uma tarja nos gráficos e no AdvancedDataGrid), existe também a versão para estudantes sem a tarja mas que não pode ser utilizada comercialmente que pode ser solicitada aqui.

O FB se baseia no Eclipse 3.3, ele pode ser instalado como stand-alone ou como plug-in do Eclipse, esta última sendo preferível, já que pode-se usufruir de outros recursos do Eclipse como programação em Java.

Sites, documentação e cursos
Existe vários livros em inglês mas o único em português no momento é o Adobe Flex Builder 3.0 - Conceitos e Exemplos.

A própria Adobe disponibiliza uma documentação muito boa e completa no site: http://www.adobe.com/support/documentation/en/flex/

Entre os cursos cito:
ENG - PR, SP e DF
E-Genial - On-Line
TargetTrust - RS Ministrado pela
Gabriela Trindade Perry uma das moderadoras da Lista Flex-Brasil.

Tem também os sites recomendados do meu blog:
No da
DClick você poderá encontrar além do blog, demos mostrando algumas coisas que podemos fazer com o Flex.
Flex Examples com inúmeros exemplos úteis.
Fórum Flex Brasil e Lista Flex-Brasil duas fontes de ajuda e conhecimento, recomendo se cadastrarem.
Entre outros.

Abraços e bons estudos.

quinta-feira, 23 de abril de 2009

Servlet Filter

Servlet Filters é um recurso do Java EE para interceptar uma requisição web antes do recurso final ser atingido, este recurso pode ser um servlet, um arquivo, entre outros.

Filtros são muito úteis quando precisamos configurar o ambiente para o recurso a ser atingido, como por exemplo, abrir e fechar a sessão do hibernate (openSessionInView), verificar se o usuário está logado ou se tem permissão de fazer a requisição, permitindo ou não acessar o recurso.

Para usar Servlet Filter é necessário:

1. Criar uma classe que será utilizada como filtro pela sua aplicação. Esta classe precisa implementar a interface javax.servlet.Filter. Ex.: public class MyFilter implements Filter

2. Declarar sua classe filtro no web.xml da sua aplicação. Ex.:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/restrito/*</url-pattern>
</filter-mapping>
3. Implementar os métodos init, destroy e doFilter da interface Filter.

É no método doFilter onde tudo acontece. Ex.:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Executado antes de ir para o servlet
JPAUtil.createEntityManager();
chain.doFilter(request, response);
// Executado após o servlet ser executado
JPAUtil.closeEntityManager();
}
Este método é executado toda vez que é realizada uma requisição a um recurso que se encaixa na
tag url-pattern configurada no web.xml.
Dependendo das validações realizadas você pode impedir que o recurso seja atingido, para isso é só não executar
chain.doFilter(request, response);
FilterChain chama o próximo recurso da sequência. Você pode ter mais de um filtro para o mesmo url-pattern ou um recurso chamando outro.

No web.xml você também pode espeficicar em quais situações o filtro deve ser aplicado, usando a tag <dispatcher>. Ex.:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
  • REQUEST: Quando o arquivo é acessado diretamente pelo navegador.
  • FORWARD: Quando o arquivo é acessado através de um forward de um servlet.
  • INCLUDE: Quando o arquivo é acessado através de um include do jsp (jsp:include).
  • ERROR: Quando o arquivo é um página de erro. Ex: <%@ page isErrorPage="true" %>

domingo, 19 de abril de 2009

FormattedInput

Estou lançando um novo controle.
Inspirado no meu controle anterior NumericInput (tanto que depende deste) e do MaskedTextInput, criei o FormattedInput.

FormattedInput auxilia em campos que só aceitam números preenchidos com zeros a esquerda, tais como: cep, cnpj, cpf, telefone. Na classe há algumas constantes para as entradas mais comuns, mas a propriedade inputFormat permite informar estas ou outras.

Como no NumericInput deve-se usar a propriedade value no lugar de text. Isto foi necessário para evitar o erro de estouro de pilha, pois imagine, é modificado a propriedade text esta por sua vez precisa formatar ela mesma ficando assim num loop perpétuo. Acho mais adequado setar os valores diretamente na propriedade text, mas no momento ficou mais prático criar a propriedade value, quem sabe numa próxima versão. E mesmo assim a propriedade value retorna um Number o que talvez seja útil dependendo da forma que o valor será persistido.

A alteração da propriedade inputFormat em runtime provoca a reformatação do valor.

O código fonte com exemplo pode ser baixado aqui. O fonte também se encontra na seção de arquivos da Lista Flex-Brasil, só que é disponível somente para os membros da lista.

sábado, 18 de abril de 2009

Criação dinâmica de objetos

Uma coisa que acho muito legal é a criação dinâmica de objetos.

Bem como isso funciona:
1. Fazer o import das classes que serão utilizadas.
import flash.net.registerClassAlias;
import mx.core.UIComponent;
import mx.containers.TitleWindow;
import mx.controls.TextInput;
import views.CadCliente;

2. Registrar as classes que você irá usar. O compilador "precisa" saber quais classes precisam ser compiladas. Para isso é necessário criar uma instância do objeto com new ou com registerClassAlias:

registerClassAlias
("views.CadCliente", CadCliente); // herda de TitleWindow
registerClassAlias("mx.controls.TextInput", TextInput);

Registrando as classes no aquivo que tem a tag Applicattion irá fazer com que possa ser criado objetos de forma dinâmica em qualquer parte do sistema.

3. Criação dinâmica.
import flash.net.getClassByAlias;
import
flash.utils.getDefinitionByName;

private function criacaoDinamica():void {
// var clazz:Class = getDefinitionByName("views.CadCliente") as Class; ou
var clazz:Class = getClassByAlias("views.CadCliente");

var window:TitleWindow =
TitleWindow(PopUpManager.createPopUp(this, clazz, true));

var clazzTI
:Class = getClassByAlias("mx.controls.TextInput");
var instance:UIComponent = new clazzTI() as UIComponent;

window.addChild(instance);
}

Em acréscimo dois métodos interessantes:
flash.utils.getQualifiedClassName e flash.utils.getQualifiedSuperclassName.
Os dois recebem um object como parâmetro e retornam uma string com o nome completo (pacote + classe) da classe (
getQualifiedClassName) e da sua classe pai (getQualifiedSuperclassName).

quinta-feira, 16 de abril de 2009

Bloco Static

No Java existe o bloco static:

static {
}

O bloco static é como se fosse um init, é o primeiro código que será executado quando se fizer referência a classe, com new ou acessando algum método static. Dentro do método estático só pode ser acessado atributos e métodos também estáticos.

No AS3, se tem algo parecido:

public class Classe {
metodoStatic();
trace("class criada");

public static function metodoStatic():void { }
}

AS3 permite incluir no corpo de uma classe não somente declarações de atributos mas também comandos que serão executados somente uma vez. É executado primeiro a declaração de atributos e depois os comandos encontrados no corpo da classe. E estes comandos como no Java só podem acessar atributos e métodos também estáticos.

terça-feira, 14 de abril de 2009

Último dia do mês

Esta é simples mas bem útil.

Em muitas linguagens existe um construtor como Date(ano, mês, dia), então o mais prático é fazer o seguinte (código válido para AS3) para se obter o último dia do mês:


public function lastDay(source:Date):Date {
var retorno:Date = new Date(source.fullYear, source.month + 1, 1);
retorno.setDate(retorno.date - 1);

return retorno;
}

Mas lendo o post Working with Dates in AS3 do blog Amy's Flex Diary descobri uma forma mais enxuta:

public function lastDay(source:Date):Date {
return new Date(source.fullYear, source.month + 1, 0);
}

Estas duas formas evita o programador de fazer cálculos adicionais para saber se o ano é bissexto ou não.



domingo, 12 de abril de 2009

NumericInput

Estou disponibilizando um novo controle: NumericInput.
Este controle serve para a entrada de dados numéricos formatando-os conforme o locale: pt_BR ou en_US.

Criei este controle inspirado no controle do Fernando Incerti.

Características:
O NumericInput possue as propriedades: precision, useNegativeSign e useThousandsSeparator que são utilizadas para setar as propriedades homônimas do NumberFormatter que utilizo para formatar o valor digitado. Este NumberFormatter deixei public e bindable, caso seja necessário formatar um outro componente com as mesmas características do NumericInput. Qualquer alteração nestas propriedades dispara um evento.

Existe também a propriedade value que devolve um Number do valor digitado que também dispara um evento.

Deixei o método toNumber como público. Este recebe um Object e devolve um Number do Object.toString() com a mesma precision do NumericInput. Este método é um utilitário não alterando o valor do NumericInput.

A alteração do locale ou de qualquer uma das propriedades em runtime provoca a reformatação do valor atual.

Espero que seja útil para os amigos.
O código fonte com exemplo pode ser baixado aqui. O fonte também se encontra na seção de arquivos da Lista Flex-Brasil, só que é disponível somente para os membros da lista.

sábado, 11 de abril de 2009

DateChooserCustom

Um tempo atrás num post da Flex-Brasil foi falado sobre uma agenda de eventos usando o DateChooser.
Na época disponibilizei o controle DateChooserCustom.as na sua primeira versão na seção de arquivos da Flex-Brasil.
Criei este componente para mostrar o calendário da Bovespa (Menu Mercado > Calendário e Horários > Calendário) numa aplicação particular de controle de investimentos.

Com este componente é possível setar uma borda, uma cor de fundo e um tooltip para uma data específica. Nesta nova versão estou usando internacionalização evitando assim setar as propriedades dayNames e monthNames em código.

O código fonte com exemplo pode ser baixado aqui. O fonte também se encontra na seção de arquivos da Lista Flex-Brasil, só que é disponível somente para os membros da lista.
Obs.: No exemplo, os tooltips aparecem nas datas que estão marcadas como Feriados do Mercado mostrando assim o feriado correspondente.

Espero que seja útil para os amigos.

sexta-feira, 10 de abril de 2009

JavaMagazine nº 67 - JavaFX

Li artigo na JavaMagazine atual nº 67 um artigo falando do JavaFX.
Sinceramente, acho a forma de codificação muito pouco intuitiva. Mesmo sendo integrada com o Java, o que é uma vantagem, acredito que a curva de aprendizado será muito grande.

Tem bastante o que evoluir ainda, na minha opinião, objetos de menu e grid ainda não existem na versão atual.

SilverLight, não me lembro de ver exemplos, mas tb é recente e já li alguns posts falando que uma aplicação feita no .Net Framework de versão anterior não roda direito na versão mais nova, o velho problema de compatibilidade com versões anteriores, o que é bem comum nos softwares na Microsoft.

O JavaFX tem a versão Mobile que está para sair, se evoluir bastante neste ponto poderá pegar um mercado promissor. O Flex neste ponto tem o Flash Light, mas até onde li só suportará o ActionScript 2 e não o 3, o que limitará os recursos disponíveis.

Nesta corrida, na minha opinião, o Flex ainda sai ganhando, por ter um código bem intuitivo, bem documentado, ótimos recursos visuais, bastante maduro (está na versão 3.3, enquanto os sesus concorretes recentemente forão lançados), mas é necessário que a Adobe fique de olho nos seus adversários.

Conta Investimento

Acompanho a bolsa de valores (Bovespa) desde 2001.
Li vários livros de investimento, e até fiz um curso de Análise Fundamentalista e Análise Gráfica. Nos livros a maioria dos autores fala que o nosso pior inimigo é nós mesmos, mais exatamente as nossas emoções.

E isto é realmente importante, quando se estiver investindo é necessário ser frio e calculista, deixar as emoções de lado.

Dinheiro não é só dinheiro, dinheiro é a possibilidade de realizar sonhos, uma viagem, um curso, etc. O que explica como o dinheiro pode afetar tanto as nossas emoções.

Por isso, recomendo, nunca utilize dinheiro que irá precisar a curto prazo, uma semana, um mês, etc, as coisas podem não sair como planejado e ser necessário vender com prejuízo. Use somente dinheiro extra.

Outra sugestão que dou é: tenha uma conta somente para investimentos, uma conta isolada da sua conta bancária principal que você usa para pagar as contas do dia-a-dia. Ou tenha um bom software de finanças pessoais que as isole visualmente. O importante aqui é não misturar obrigações com investimentos e um poder afetar o outro.

quinta-feira, 9 de abril de 2009

Apresentação

Sendo este meu primeiro post, quero fazer uma rápida apresentação. Tentarei não me extender, pois isto é enfadonho para quem lê.
Sou programador a mais de 12 anos, o tempo passa. Programei com Clipper, Visual Basic 6, Fox 2.6 e atualmente programo em Java, Flex e Visual Fox.
Neste blog pretendo falar um pouco de Flex, Java entre outras coisas.

Resido e trabalho em Montenegro - RS. Trabalho na Sadig desde 2004 uma empresa de BI. No site da empresa em Produtos > Sadig Painéis vocês podem ver o meu último trabalho: um gerador de dashboards onde o cliente pode montar o seu painel / dashboard, utilizando as tecnologias Java, Adobe Flex e Visual Fox. Trabalho na ponta Flex.

Há alguns anos atrás comecei a aprender por conta própria ferramentas RIA: Java Server Faces, OpenLaszlo até chegar nas minhas mãos a MundoJava nº 20 onde tem um artigo do Fabio Terracini e Rafael Martinelli ambos da DClick falando sobre Adobe Flex 2, a partir daí me foquei nesta ferramenta acreditando ter encontrado a melhor das RIAs do momento, até conseguir introduzi-la no meu trabalho diário no início de 2008.

Participo dos fóruns:
GUJ
PortalJava
Flex-Brasil
Forum FlexBrasil
Com o nick: fabiophx.

Nos próximos dias pretendo disponibilizar alguns componentes.
Espero que todos gostem.

[]s
Fabio da Silva