Blog do Urubatan
msgbartop
Desenvolvedor, Palestrante, Escritor, Nerd Assumido e Pai do Marcus :D
msgbarbottom

26 Feb 09 Dicas e truques: Adobe Flex – MXML é para Layout, ActionScript para o código

Uma das melhores idéias do Flex, e o que o torna bastante produtivo na minha opinião é a existencia de uma “linguagem” para layout de telas, é o tal de MXML.
Claro que eu sei que é apenas XML, mas é XML com acesso direto as classes existentes e recem criadas, e uma mão na roda para separar o código do layout, facilitando bastante a escrita de código MVC compliant.
O maior problema da arquitetura básica do Flex é não ser “óbvio” como escrever o código de tratamento dos eventos gerados sem poluir o MXML com muitas tags “mx:Script” e muito código ActionScript.
Claro que existem alguns frameworks para o desenvolvimento de aplicações Flex como o Cairngorm e o PureMVC, mas algumas vezes estes frameworks mais complicam do que ajudam, e mesmo utilizando um deles, esta dica que vou apresentar agora de como simular o “code behind” do “.NET” em flex pode ser utilizada sem maiores problemas …

A idéia principal é separa o código ActionScript do código XML, como se fosse uma “partial class” do “.NET”, o Flex não suporta Partial Classes, mas suporta herança, e podemos tirar proveito disto …

Vou mostrar um exemplo bastante simplista aqui, apenas para que vocês peguem a idéia, vejam o código da tela abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
	<mx:Script>
		<![CDATA[
			import mx.controls.DataGrid;
			import mx.events.ListEvent;
			[Bindable]
			private var current : Object = new Object();
			[Bindable]
			private var all : Array = [];
			private function saveCurrent(nome : String, idade : Number) : void {
				var obj : Object = {nome : nome, idade : idade, id : all.length + 1};
				var temp : Array = all.slice(0,all.length);
				temp.push(obj);
				all  = temp;
				current = obj;
			}
			private function updateCurrent(nome : String, idade : Number) : void {
				current.nome = nome;
				current.idade = idade;
			}
			private function newCurrent() : void {
				current = new Object();
			}
			private function selectionChange(evt : ListEvent) : void {
				current = (evt.target as DataGrid).selectedItem;
			}
		]]>
	</mx:Script>
	<mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/>
	<mx:HBox width="100%">
		<mx:Label text="Nome:" width="100"/>
		<mx:TextInput id="currentNome" text="{current.nome}"/>
	</mx:HBox>
	<mx:HBox width="100%">
		<mx:Label text="Idade:" width="100"/>
		<mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/>
	</mx:HBox>
	<mx:HBox width="100%" horizontalAlign="center">
		<mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/>
		<mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/>
		<mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/>
	</mx:HBox>
	<mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)">
		<mx:columns>
			<mx:DataGridColumn headerText="Id" dataField="id"/>
			<mx:DataGridColumn headerText="Nome" dataField="nome"/>
			<mx:DataGridColumn headerText="Idade" dataField="idade"/>
		</mx:columns>
	</mx:DataGrid>
</mx:VBox>

Apenas para este bastatne simples, já temos quase metade do arquivo contendo ActionScript e metade contendo MXML.
Em um caso simples destes isto não chega a incomodar, mas quando o arquivo começa a crescer, isto atrapalha a leitura do código fonte, o que é bastante ruim. Então a minha sugestão, ou “dica” de como resolver isto, é separar o código ActionScript em um arquivo .as e manter apenas o layout no arquivo MXML, como pode ser visto no seguinte exemplo (considerando que o nome do arquivo mostrado acima seja telaexemplo.mxml)
Criar a classe “exemplo.TelaExemploBase” no diretório correspondente com o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package exemplo
{
	import mx.containers.VBox;
	import mx.controls.DataGrid;
	import mx.events.ListEvent;
 
	public class TelaExemploBase extends VBox
	{
		[Bindable]
		protected var current : Object = new Object();
		[Bindable]
		protected var all : Array = [];
		public function TelaExemploBase()
		{
			super();
		}
		protected function saveCurrent(nome : String, idade : Number) : void {
			var obj : Object = {nome : nome, idade : idade, id : all.length + 1};
			var temp : Array = all.slice(0,all.length);
			temp.push(obj);
			all  = temp;
			current = obj;
		}
		protected function updateCurrent(nome : String, idade : Number) : void {
			current.nome = nome;
			current.idade = idade;
		}
		protected function newCurrent() : void {
			current = new Object();
		}
		protected function selectionChange(evt : ListEvent) : void {
			current = (evt.target as DataGrid).selectedItem;
		}
 
	}
}

Alterar o arquivo MXML para o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<TelaExemploBase xmlns="exemplo.*" xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" >
	<mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/>
	<mx:HBox width="100%">
		<mx:Label text="Nome:" width="100"/>
		<mx:TextInput id="currentNome" text="{current.nome}"/>
	</mx:HBox>
	<mx:HBox width="100%">
		<mx:Label text="Idade:" width="100"/>
		<mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/>
	</mx:HBox>
	<mx:HBox width="100%" horizontalAlign="center">
		<mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/>
		<mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/>
		<mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/>
	</mx:HBox>
	<mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)">
		<mx:columns>
			<mx:DataGridColumn headerText="Id" dataField="id"/>
			<mx:DataGridColumn headerText="Nome" dataField="nome"/>
			<mx:DataGridColumn headerText="Idade" dataField="idade"/>
		</mx:columns>
	</mx:DataGrid>
</TelaExemploBase>

A idéia básica é utilizar o MXML para extender a classe ActionScript que contem o código, a diferença é que tudo o que deve ser acessado do MXML na classe criada não pode ser privado, tem que ser no mínimo protected (o que foi utilizado no exemplo).
Outro truque é definir o “xmlns” para o pacote da classe que vai ser extendida como pode ser visto na linha 2.
E para testar isto é necessária uma “aplicação flex”, eu utilizei apenas o código abaixo para o projeto de testes:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
	<local:telaexemplo width="100%" height="100%"/>
</mx:Application>

Mas claro que você pode fazer algo mais elaborado :D

Espero que esta dica ajude alguem, ja que eu tive bastante trabalho reorganizando código depois que descobri que isto era muito melhor do que colocar tudo no MXML logo que comecei a trabalhar com Flex.

Tags: , ,

10 Feb 09 Sun Certified Developer for Java Web Services 5 – Passei na prova Beta

A algum tempo atrás eu disse que nunca mais iria fazer uma prova de certificação Beta, mas como eu disse neste post, no final do ano passado eu fiz a versão Beta da nova certificação da SUN “Sun Certified Developer for Java Web Services 5″.
Uma das coisas chatas de uma prova beta é que leva mais de 6 semanas para darem o resultado da prova, e hoje fui acessar o site da prometric para ver o resultado (como tenho feito uma vez por semana a algum tempo) e eu passei na prova :D

Isto quer dizer que eu tenho mais algumas letras sem muita utilidade para enfeitar o meu currículo (SCDJWS) :D

Eu sei que certificações não provam nada, ainda mais com provas difíceis como esta, em que eu esqueci da prova e não estudei nada (o que prova que com o conhecimento adquirido no trabalho é possível passar em uma prova de certificação), mas mesmo assim, foi uma prova que levei 3 horas para fazer, então merece pelo menos um post no blog de comemoração :D .

Tags: ,

06 Feb 09 Dicas e truques: Adobe Flex – Evitando acesso a objetos nulos

Uma forma possível de se iterar pelo conteúdo de um array em Flex é:

1
2
3
4
5
private function iterarSobreArray(arr : Array) : void {
  for(var i : int = 0; i < arr.length; i++){
    fazerAlgumaCoisaCom(arr[i]);
  }
}

Mas esta forma vai causar problemas caso o array seja nulo, para evitar isto basta utilizar a forma abaixo.

1
2
3
4
5
private function iterarSobreArray(arr : Array) : void {
  for each(var o : Object in arr){
    fazerAlgumaCoisaCom(o);
  }
}

Desta forma temos menos variáveis declaradas, e não corremos risco de tentar ler o tamanho de um “null” na linha 2 do primeiro exemplo …

Tags: , ,

05 Feb 09 Mais um livro sobre Ruby On Rails publicado!!

Capa Livro Ruby On Rails Urubatan

Desta vez é o meu livro que acaba de ser lançado (na verdade ele esta em pré lançamento, mas me disseram que ele chega nas bancas rapidinho :D ) pela editora Novatec (http://www.novatec.com.br).
É um Livro focado em Ruby On Rails, tentando mostrar todo o necessário para ser produtivo com o Rails de uma forma 100% prática …
Por que comprar este livro e não algum outro que ja exista por ai? A tradução de algum livro conhecido?
Bom, este livro foi escrito originalmente em portugues, utiliza uma linguagem bem descontraida.
Tentei escreve-lo como se estivesse conversando com o leitor.
O livro é 100% prático.

Durante o livro são desenvolvidas duas aplicações, que você vai poder utilizar como referência mais tarde.
Depois do capitulo sobre testes, a segunda aplicação é desenvolvida utilizando BDD com RSpec.
Todos os conceitos e recursos do Rails são apresentados utilizando as aplicações desenvolvidas, ou seja, você vai desenvolvendo uma aplicação e aprendendo a trabalhar com Rails.
No livro falo de Ruby (uma breve introdução, não é um curso completo de Ruby)
Rails
Ajax
BDD
TDD
Recursos avançados do Active Record
Recursos avançados do Rails
Boas práticas
CSS
XHTML
Um pouquinho de Javascript
Como escrever menos código
DRY

Mas mesmo assim, o livro é recomendado para iniciante e intermediario no máximo, pois existem alguns tópicos mais avançados que não são tratados, mas nada que faça falta no dia a dia.

Acho que o maior diferencial do livro é ser 100% prático, apresentar todos os conceitos utilizando exemplos desenvolvidos pelo próprio leitor, facilitando o aprendizado.
Garanto que se você ler o livro e fizer todos os exercícios e as duas aplicações propostas no livro, no final você vai conseguir desenvolver as suas aplicações em RoR sem maiores problemas.
Se tiver dúvidas, vou ficar feliz em responde-las e com certeza, se vocês gostarem do livro, as dúvidas vão ajudar a melhorar a próxima versão do livro :D
Então agora é só vocês comprarem o livro e começar a estudar.

Para quem quiser dar uma olhada antes do livro chegar nas bancas, segue o “indice” com o título dos capítulos:

  1. Dedicatória
  2. Agradecimentos
  3. Sobre o autor
  4. Prefácio
  5. Introdução ao Ruby
    • Instalação do Ruby
    • Primeiros passos
    • Variáveis e escopo
    • Tipos básicos do Ruby
    • Blocos de código
    • Procs
    • Números
    • Valores booleanos
    • Strings
    • Constantes
    • Intervalos numéricos
    • Arrays
    • Hashes
    • Símbolos
    • Expressões regulares
    • Classes e métodos
    • Métodos
    • Módulos
    • Operadores condicionais e loops
    • If elsif else end
    • case when else end
    • Operadores de loop
    • while
    • for
    • until
    • begin
    • loop
    • Padrões importantes
      • Nomes de arquivos
      • Classes, e atributos e métodos de acesso
      • Nomenclatura de métodos
      • Dominando o Ruby!
  6. Ambiente de desenvolvimento
    • Multi plataforma
      • Aptana RadRails
      • NetBeans
      • IntelliJ IDEA
      • Vim
    • Windows
      • Notepad++
      • E-TextEditor
    • Linux
      • GEdit
      • Kate
    • Mac
      • TextMate
    • Plug-ins para os editores
    • Escolhendo o seu
  7. Rails básico
    • Criando a primeira aplicação
    • Estrutura de diretórios de uma aplicação
      Rails

      • Scripts padrão do Rails
      • Gerando código, um cadastro instantâneo
      • A primeira Migration
      • O primeiro model
      • O primeiro controlador
      • Métodos básicos do ActiveRecord
      • Recebendo parâmetros nos controladores
    • Respondendo a requisições
    • As primeiras views
    • Precisando de ajuda para limpar o código das
      views?
    • Configurando rotas, um nome bonito para URLs
    • Continuando o desenvolvimento
    • Conferindo as migrations geradas
    • Escrevendo modelos
    • Gerando todo o código
    • Um pouco de segurança na aplicação
    • Um layout menos ruim para a aplicação
    • Associando usuários a projetos
    • Adicionando tipos de tarefa a um projeto
      • Cadastrando as horas trabalhadas
      • Um relatório para a aplicação
      • Limpando um pouco o código e se livrando um pouco do
        inglês
  8. Suporte a testes no Rails
    • RUnit básico
    • Testando modelos
    • Escrevendo fixtures
      • Testando as validações
      • Asserções disponíveis
      • Testes funcionais, testando os controladores e
        helpers
      • Tornando testes mais divertidos e úteis (inclusive
        para o seu chefe)
      • Notificação de testes executados
      • De volta às User Stories
      • Uma olhada nas especificações
      • Utilizando objetos falsos ou mocks
      • Finalizando a definição de comportamento do
        sistema com as User Stories
  9. ActiveRecord avançado
    • Utilizando o ActiveRecord para consultas
      • Métodos de busca dinâmicos por atributos
      • ActiveRecord::Base.find
      • ActiveRecord::Base.find_bysql
    • Associações polimorficas
    • Mais sobre associações
      • Callbacks para associações
    • Outros métodos úteis do ActiveRecord
  10. Use todo o poder do RESTful
    • Introdução ao REST
    • Métodos do protocolo HTTP
    • Princípios do REST
    • RESTful: The Rails way
      • Tema de casa
  11. Paginação
    • Paginação manual
    • Will_paginate
    • Outros plug-ins
      • paginating_find
      • Paginator
  12. Upload de arquivos
    • Attachment_fu
    • File_column
  13. Outros plug-ins úteis
    • Brazilian-rails
    • Exception_logger
    • Exception_notifier
    • JRails
    • Restful_authentication
    • Annotate_models
    • Acts_as_taggable_on_steroids
    • Juggernaut
    • Mydry
    • Calendar_date_select
    • Css_graph
    • Backgroundrb
    • Quais plug-ins utilizar na sua aplicação
  14. AJAX on Rails Quase sem JavaScript
  15. Reutilizando código entre projetos
    • O plug-in biblioteca
    • Plug-ins de geração de código
    • Finalizando o assunto
  16. Colocando tudo isto em produção
    • CGI
    • FastCGI
    • Mongrel
    • Mod_rails
    • JRuby
    • Opções de deployment

Junto com o livro vou colocar no ar o site http://livro.urubatan.com.br onde vou publicar mais exemplos, quaisquer correções que sejam necessárias, e qualquer um que comprar o livro vai poder deixar a opinião e fazer perguntas.

PS.: Este livro não vai te transformar em um ninja fodão que desenvolve qualquer sistema em 2 horas. Mas é um bom começo se você quer aprender Ruby On Rails.

Tags: , , , ,