Neste screencast eu faço uma introdução sobre o flexorm. Sua integração com o banco de dados SQLite em uma aplicaçõa AIR.
No exemplo é criada uma aplicação Mobile que utiliza o banco de dados nativo do AIR o SQLite.
Neste screencast eu faço uma introdução sobre o flexorm. Sua integração com o banco de dados SQLite em uma aplicaçõa AIR.
No exemplo é criada uma aplicação Mobile que utiliza o banco de dados nativo do AIR o SQLite.
Eu confesso que nunca me interessei em desenvolver sites e muito menos aplicações web utilizando ASP.net, sempre achei que a metodologia “drag and drop” que o Web Forms nos proporciona não funciona legal na web, pois ela gera muito “lixo” para o navegador, e isso é crucial em uma WebAPP.
Portanto, desde que migrei de desktop (Delphi 7) para web, tenho trabalhado com o nosso querido Flex no Front End e o C#.net no Back End. Mas desde que o ASP.net MVC foi lançado, tenho acompanhado de perto a sua evolução, e confesso que ele tem me agradado bastante.
Para não perder o costume, venho hoje compartilhar com vocês um pouco do que tenho estudado, este post faz uma comparação de um projeto idêntico criado usando as duas metodologias.
Então chega de conversa e vamos ao que interessa:
As ferramentas que utilizei para criar os projetos foram:
• SQL Server 2008 Express
• Visual Web Developer Express 2010
• Framework ASP.net MVC 2.0
O projeto acessa uma base de dados com apenas uma tabela, com a seguinte estrutura:
Não utilizei nenhum framework ORM, fiz o mapeamento das entidades manualmente, usando as classes nativas do Framework. (SqlConnection, SqlCommand e SqlDataReader).
Quando criei os projetos, utilizei os templates do prório Visual Web Developer:
Para o projeto Web Forms, usei ASP.NET Web Application.
Para o projeto MVC usei: ASP.NET MVC 2 Web Application.
É claro que não vou fazer um passo a passo de como criar o projeto, o foco deste post não é isso, mas depois de pronto, nosso Solution Explorer do projeto WebForms ficará assim:
Já o projeto MVC, tem uma estrutura um pouco maior, porque ele trabalha completamente “tipado”, temos as classes Model, Controller e View, como manda o figurino:
Certo, agora vamos ao objetivo, quando executo o projeto WebForms e acesso a página de clientes, o Framework gera este código HTML:
"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"http://www.w3.org/1999/xhtml" xml:lang="en">"../Styles/Site.css" rel="stylesheet" type="text/css" />
Dêem uma olhada em quanto código os componentes criam. É muita coisa, imaginem isso em um grande portal? Americanas.com gerando este código? Meio inviável não? Aproveito para destacar o código gerado pelo ViewState, herói e vilão do Web Forms.
Agora vamos comparar a mesma página gerada pelo projeto MVC:
"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"http://www.w3.org/1999/xhtml">Index "Content/Site.css" rel="stylesheet" type="text/css" />class="page">"header">"title">My MVC Application
"logindisplay"> [ "/Account/LogOn">Log On ]"menucontainer">"menu">
- "/">Home
- "/Home/About">About
"main">Listagem completa de clientes:
"/Cliente/Create">Novo cliente...
Código Nome CPF RG Idade 30 Jo?o 123.123.123-12 12.312.123-1 30 "/Cliente/Edit?Id_Cliente=30">Editar | "/Cliente/Delete?Id_Cliente=30" onclick="return confirm('Tem certeza?');">Excluir | 32 Jos? 444.444.444-44 44.444.444-4 21 "/Cliente/Edit?Id_Cliente=32">Editar | "/Cliente/Delete?Id_Cliente=32" onclick="return confirm('Tem certeza?');">Excluir | 31 Maria 999.999.999-99 99.999.999-9 35 "/Cliente/Edit?Id_Cliente=31">Editar | "/Cliente/Delete?Id_Cliente=31" onclick="return confirm('Tem certeza?');">Excluir | "footer">
O que acham? As duas páginas fazem exatamente a mesma coisa, no entato o MVC gera beeeem menos código.
Bom pessoal, essa é apenas uma das vantagens do MVC, posso destacar outras:
Bom é isso, vou me despedindo, mas antes deixo o código fonte dos dois projetos disponíveis para download.
Esta é uma tradução do seguinte artigo: 10 Things A Good Flex Developer Should Know
Para ser um bom programador Flex é preciso mais que simplesmente saber como usar alguns componentes nativos do Flex. É preciso muito mais.
Aqui está minha contribuição sobre o assunto… juntamente com alguns recursos ou algumas palavras-chave que você poderá pesquisar facilmente através do Google.
Por favor, comente no blog se você achar que esqueci algo (o que é inevitável) ou se quiser sugerir alguns recursos interessantes que devo acrescentar.
O Flex se baseia na linguagem ActionScript3, que é totalmente orientada a objetos. Embora não seja um conceito fácil de aprender, programação orientada a objeto é um pré-requisito para aprender Flex. Se já possui experiência com OO (Java, C#, Ruby, etc), então você está pronto. Se não, você precisará pegar um livro sobre OO e começar a aprender o mais rápido possível.
· Head First Java (Java? Sim, Eu sei. Mas confie em mim.)
· Object-oriented programming with ActionScript 3.0
Nota: Alguns de vocês poderão perguntar – “O que são padrões de projetos?”. Vamos dar um passo de cada vez? Preocupe-se em entender classes e objetos, interfaces, herança, composição, polimorfismo, encapsulamento, etc. Só então considere estudar padrões de projetos. De fato, se eu escrever um post intitulado “10 coisas que um GRANDE programador Flex deve saber”, padrões de projeto estará nessa lista.
ActionScript é a linguagem de programação usada juntamente com MXML para criar aplicações Flex. MXML é uma linguagem de marcação baseada em XML. Cada tag MXML é mapeada diretamente para uma classe ActionScript correspondente. MXML é usado pelos desenvolvedores Flex principalmente para apresentar a interface do usuário, enquanto que, o ActionScript é usado para a lógica de negócio. Com exceções, é claro.
O Framework Flex inclui centenas de classes ActionScript e interfaces usadas para desenvolver aplicações Flex. Seu nível de habilidade como um desenvolvedor Flex está diretamente ligado ao seu conhecimento em relação ao ActionScript e MXML.
Nota: Fique ? vontade com a API do Flex. Como um desenvolvedor Flex, você vai usá-la diariamente.
Boa parte do tempo de qualquer programador é gasto no debugging. Obviamente, é necessário debugar para rastrear a causa de bugs. No entanto, também é uma ótima maneira de conhecer o código fonte.
Felizmente, existem muitas ferramentas disponíveis para ajudá-lo com o trabalho de debugging. Invista algum tempo para aprender essas ferramentas. Seu investimento irá proporcionar retorno imediato.
Aplicações Flex são orientadas a eventos. Toda ação é o resultado de um evento assíncrono.
Como um desenvolvedor Flex, você deve saber como responder a eventos e como criar e disparar eventos. Para isso, é necessária uma sólida compreensão da arquitetura de eventos do Flex, incluindo familiaridade com os seguintes conceitos:
· Eventos nativos (Flash Player ou Framework de eventos Flex)
· Eventos customizados (Eventos criados pelo desenvolvedor, que estende a classe Event ou uma de suas subclasses)
· Disparar eventos, propagação de eventos (ver classe EventDispatcher e seu método dispatchEvent)
· Event listeners, event handlers (ver classe EventDispatcher e seus métodos addEventListener e removeEventListener)
· Fases do evento (capture, target & bubbling phases; target vs. currentTarget)
· Objetos do evento, tipos de eventos (ver classe Event e subclasses)
· Comportamento do evento default (ver classe Event e subclasses e seu método preventDefault)
Aparentemente, data binding é um “no brainer”[1]. É só vincular o valor de uma propriedade ao valor de outra propriedade usando chaves. Quando o valor da propriedade de origem for alterado, o valor da propriedade de destino também é alterado.
No entanto, existe uma sobrecarga associada ao uso indiscriminado de data binding, podendo haver implicações no desempenho. Uma sólida compreensão de data binding ajudará a determinar quando é apropriado o seu uso e quando não é.
· Flex Tips – Using Bindable Metadata Events
· Michael Labriola’s presentation entitled Diving in the Data Binding Waters
Uma característica de uma aplicação Flex bem projetada é a apresentação dos dados de uma forma visualmente atraente. O Flex oferece uma série de controles baseados em listas (DataGrid, List, TileList, HorizontalList, etc) responsável pela apresentação dos dados. Portanto, pode-se personalizar a exibição dos dados com a ajuda de item renderers.
Você irá consumir muito tempo trabalhando com item renderers. Então é melhor saber bem como ele funciona.
· Flex Examples – Item Renderers in Practice
· A Deep Dive into Flex 4 Lists and Layouts
Você conhece muitas aplicações que não interagem com os dados? Eu também não. Saiba como recuperar dados através de HTTPServive, WebService e RemoteObject. A arquitetura do framework Flex também poderá ajudá-lo com isso (ver #9).
· Retrieving and handling data with HTTPService
· Retrieving and handling data with WebService
· Retrieving and handling data with RemoteObject
Não vamos nos esquecer que o Flex é uma tecnologia de interface e, como tal, certamente há expectativas em relação ao design. Como um desenvolvedor Flex, você deve ser capaz de personalizar a aparência de seus aplicativos usando estilos CSS, gráficos e/ou skins.
Com o Flex 4, não há mais desculpas. Use um pouco do seu tempo para conhecer de uma vez o lado direito do seu cérebro. É uma excelente mudança de paradigma, e vai ajudá-lo a diferenciar-se dos outros desenvolvedores Flex.
· Introduction to Flex: Part 3 – Styles & Skins
A maioria dos frameworks de arquitetura Flex impõe uma separação de camadas através da implementação do MVC (model-view-controller). Além disso, esses mesmos frameworks especificam como seu código deve ser organizado dentro do projeto Flex.
Embora muitos argumentariam que os frameworks são desnecessários, acredito que os desenvolvedores Flex se beneficiam em muitos aspectos da experiência de usá-los. Basta assistir ? s técnicas (boas ou más) empregadas por um framework para resolver problemas complexos de arquitetura. Isso contribuirá para seu crescimento como um desenvolvedor Flex.
Além disso, é difícil negar o fato de que a experiência com framework aumentará substancialmente o seu valor comercial como um desenvolvedor Flex. Jesse Warden me disse recentemente “Existem poucas empresas que não usam frameworks, mas isso é raro. Queiramos ou não, está na ‘moda’”. Eu concordo com Jesse.
· Parsley
· PureMVC
· Mate
· Swiz
Eu não estava convencido da necessidade de aprender o ciclo de vida de componentes Flex ou da display list até que escrevi o meu primeiro componente customizado (na verdade foi um componente semi-customizado que se estendia do componente Canvas). Até essa época eu usava componentes nativos do Flex, usando apenas o MXML enquanto que a display list era renderizada para mim. Em nenhuma vez tive que usar os métodos addChild, createChildren ou commitProperties, e usava o evento creatiomComplete para tudo.
Meu primeiro componente customizado usava uma quantidade enorme de eventos assíncronos, e eu não poderia prever a ordem em que cada evento seria disparado. Só depois que eu aprendi os métodos e variáveis do ciclo de vida dos componentes do Flex que eu pude ter um certo controle.
Estes métodos do ciclo de vida estão lá para serem usados. Saiba como funcionam e use-os para o seu benefício. Sua vida será mais fácil e você perderá menos cabelos.
· Colin Moock’s Lost ActionScript Weekend – The Display List
· Creating New Components in Flex 3
· Diving Deep with the Flex Component Lifecycle
· Understanding the Flex 3 Component and Framework Lifecycle
[1] Expressão americana usada para algo que requer pouco esforço mental ou inteligência para realizar ou compreender
Como a maioria deve saber o significado de RIA é rich internet applications. Há muito tempo atrás, assistindo a um dos screencasts do? Vedovelli, ele falou que o flex é muito rico e que você pode melhorar a experiência dos usuários trabalhando os pequenos detalhes da aplicação. Coisas como limpar os campos e mudança de foco são primordiais para deixar suas aplicações mais intuitivas e fáceis de serem usadas.
Baseado nisso eu passei a prestar um pouco mais de atenção nesses detalhes e uma das coisas que veio ? cabeça foi os eventos de teclado. Claro eu não poderia de deixar de citar meu amigo? @brunoaraujo_id que foi o primeiro que eu vi a manipular esse tipo de evento e quem também me mostrou um exemplo no qual vou mostrar aqui.
Historinhas ? parte, vamos ao que interessa.
Nesse tutorial eu irei (tentarei) explicar como trabalhar com eventos de teclado e também como eles podem ser úteis na sua aplicação.
Primeiro vamos a um simples exemplo para que possamos observar um pouco melhor a classe KeyboardEvent.
Seu browser não suporta iframes.
No exemplo acima tem duas caixas de texto, quando você digita algo na primeira caixa de texto ele exibe na caixa de baixo as propriedades do evento. Nesse primeiro passo nós iremos observar apenas o? charCode e o? keyCode.
O mapeamento desses eventos é bem simples você deve apenas verificar qual a tecla pressionada e apartir dai executar alguma ação. Exemplo.
switch(event.keyCode)
//Quando o usuário apertar o esc
case 27:
//Executa alguma ação
break;
//Quando o usuário apertar o enter
case 13:
//Executa alguma ação
break;
Bom, já sabemos qual evento iremos trabalhar e como pegar o código de uma tecla apertada, mas em que isso será útil? O próximo evento ilustra isso perfeitamente.
No exemplo acima eu estou mapeando os eventos do enter e do esc.
Quando o usuário está no state de login e pressiona enter ele verifica se o campo está vazio, se estiver mostrará uma mensagem de erro, caso contrário ele passará para o próximo state. Se o usuário pressionar esc o campo será limpo.
No state de senha ao pressionar esc ele também verifica se o campo está vazio, se estiver ele vai volta para o state de usuário, caso contrário ele irá limpar o campo. Se o usuário apertar enter ele irá dar uma alert avisando que naquele momento seria a hora de fazer o login.
Bom, mais explicações pelo código fonte, ele está bem simples de fácil compreensão.
Você pode também criar atalhos em seu aplicativo, pode por exemplo, fazer com que um ctrl+n deixe o texto em negrito.
Vamos a uma rápida passada sobre isso.
Volte para o primeiro exemplo e pressione ctrl + i.
O resultado do evento será:
[KeyboardEvent type="keyDown" bubbles=true cancelable=false eventPhase=3 charCode=105 keyCode=73 keyLocation=0 ctrlKey=true altKey=false shiftKey=false]
Notem que agora o ctrlKey tem o valor true. Usando no seu código você verifica se ele é true e depois verifica o código da tecla para criar as combinações de atalhos. Agora é só usar a criatividade.
Espero que essas informações tenham sido úteis para vocês.
Abraço e até a próxima.
Para ajudar quem está começando com Flex farei uma serie de postagens “flex-basico”. Segue a primeira.
Adicinar PopUps na sua aplicação com PopUpManager é muito simples. Segue o código:
Veja o exemplo aqui?e o código fonte aqui.
protected function btAbrePopUp_clickHandler(event:MouseEvent):void{
// http://blog.cognitivasolucoes.com
// Crie janela
var janela:TitleWindow = new TitleWindow();
janela.width = 619;
janela.height = 248;
// Cria popUp
PopUpManager.addPopUp(janela, this);
PopUpManager.centerPopUp(janela);
}
}
Encontrei o texto abaixo no blog 1up4developers em um post do Plínio Balduino, e como partilho 100% dessa ideia, tomei a liberdade de compartilhar e fazer a tradução livre para o português.
Sometimes things go wrong: hardware is not acting as expected, the API you rely on is not reliable, some vital information is missing. But you don’t care, as you are a hero, a tough Charles Bronson-like guy that will accomplish the mission no matter what.
Another project is saved? Maybe. But someone made a very stupid choice and will pay for it. And I’m talking about you, Bruce Lee.
In six months nobody will remember the adversities you’ve been through. The sleepless nights. The weird bugs. The managers on you back, asking for status reports every five minutes. But something will linger: your name in the source code. It will be there in the SCM, ready to prove that you are a lousy coder and committed buggy/ugly code.
So, next time you find yourself in this kind of situation, take a deep breath and raise the red flag. Share the problem. It’s not fair to chain yourself to something bad just to show that you are tough.
Tradução:
As vezes as coisas dão errado: o hardware não funciona como esperado, a API não é confíavel, alguma informação vital está faltando. Mas não se preocupe, por que você é um heroi, um cara durão como Charles Bronson, que vai cumprir a missão não importe qual seja.
Outro projeto foi salvo? Talvez. Mas alguém fez uma escolha estúpida e vai pagar por isso. E estou falando de você, Bruce Lee.
Em 6 meses ninguém vai lembrar das adversidades que passamos. As noites viradas Os bugs estranhos. Os gerentes na suas costas, perguntando o status a cada 5 minutos. Mas algo vai tardar mas não falhar, o seu nome no código fonte. Vai estar lá no GIT ou SVN, pronto para provar que você é um programador ruim que comitou código feio e com bug.
Então, na próxima vez que se deparar com esse tipo de situação, respire fundo e levante a bandeira vermelha. Compartilhe o problema. Não é justo com toda a cadeia que algo ruim aconteça só para provar que você é um heroi.
Infelizmente já ví isso acontecer inúmeras vezes, o pior é que em uma dúzia delas eu fui o protagonista da história.
Mas aprendi que levantar o problema é o caminho mais curto para a sua resolução.
Esse tema me fez lembrar de um trecho da palestra do DHH na Rails Conf 2009 onde ele falou sobre o segredo da alta produtividade:
Por isso baixe sua guarda, mostre seus defeitos, não banque o durão, muito menos o heroi, pois a construção de um software de qualidade evolve muitas vidas, uma grande porção de dinheiro, várias horas de trabalho e dedição que são MUITO mais importante que o seu EGO.
Recentemente Mirko Bordjoski postou em seu blog um editor de efeito de cores de imagens feito para Adobe Flex 4.5 utilizando o CMVC, segundo Mirko, uma customização do PureMVC.
Baixe o código fonte completo pra seus estudos.
Bons estudos…
Como nós já vimos em posts anteriores, é muito simples alterar o skin de um componente Spark. Com o exemplo abaixo, você aprenderá a customizar a aparência do componente Spark ButtonBar e também a inserir ícones em seus botões.
Your browser does not support iframes.
Download do código fonte do projeto:
CustomButtonBar – 573kb
Espero que tenham gostado e até a próxima!
O livro “Dominando Orientação a objetos” está quase pronto. Estamos na fase de diagramação e revisão do texto. Muito em breve entraremos na pré venda.
Para matar a curiosidade geral da nação
, seguem algumas informações sobre o livro.
?
?
?
No capítulo 2, iremos com o uso da linguagem PHP explicar os principais conceitos da programação OO, conceitos estes que estão presentes em todas as linguagens que permitem a implementação de objetos.
No capítulo 3, ainda usando o PHP, iremos abordar um exemplo prático do uso da OO para facilitar o desenvolvimento de páginas HTML. Este exemplo visa reforçar os conceitos aprendidos e, o mais importante, visa mostrar que o uso do OO pode ser benéfico para o seu dia a dia.
No capítulo 4, iremos abordar o Java e exibir as suas principais características. O Java, por ser uma linguagem 100% OO, apresenta todas as funcionalidades que o OO possui, como classes abstratas, interfaces, sobrecarga de métodos, entre outros. Veremos apenas algumas teorias, que serão melhor explicadas no decorrer da obra.
No capítulo 5 apresentamos o C#, linguagem pertencente ao framework .Net da Microsoft, que é semelhante ao Java. Com esta linguagem, abordamos um exemplo para criação de SQLs para o acesso ao banco de dados.
No capítulo 6 apresentamos o Action Script, juntamente com o framework Flex, para aprendermos exclusivamente sobre Interfaces, algo tão falado e mal entendido pelos programadores. Você irá aprender a otimizar o seu código com o uso correto das interfaces.
O capítulo 7 volta a usar a linguagem PHP para introduzir o conceito de padrões de projeto. Usar somente OO não garante que o sistema está livre de problemas, é preciso combinar o conhecimento OO com os padrões (patterns) para que possamos criar sistemas com mais dinamiso e, principalmente, manuteníveis. Com o PHP iremos aprender o primeiro padrão, chamado “Factory”.
No capítulo 8 continuamos a estudar os padrões de projeto, usando agora o ActionScript e o Flex para ilustrar o padrão Observer, que apesar se ser pouco conhecido, é um ótimo aliado no desenvolvimento OO.
No capítulo 9 iremos aprender o padrão Singleton, muito usado em diversos frameworks. Inicialmente apresentamos o conceito e exibimos um exemplo em ActionScript para manipulação de janelas, além de um exemplo em PHP para leitura/escrita de um arquivo de log.
No capítulo 10 iremos, com PHP, criar um pequeno framework que envolve os conceitos de MVC e de injeção de dependência, além de usar outros padrões como o Singleton e o Factory.
No capítulo 11 criamos três exemplos que exibem inicialmente uma solução rápida para o problema proposto, mas ruim para a manutenção do código. Depois exibimos como usar a OO para melhorar cada um dos exemplos, utilizando inclusive padrões de projeto.
?
Gostaria de agradecer a todos os leitores que me escreveram sugerindo temas para o livro. Conforme combinado, as pessoas a seguir ganharão 20% de desconto na compra do livro
?
Você poderá comprar o livro no site www.danielschmitz.com.br, que é a nossa loja virtual. Ainda não está disponível para venda. Siga @Daniel_Schmitz para saber exatamente quando começará a pré venda
O livro “Dominando Orientação a objetos” está quase pronto. Estamos na fase de diagramação e revisão do texto. Muito em breve entraremos na pré venda.
Para matar a curiosidade geral da nação
, seguem algumas informações sobre o livro.
?
?
?
No capítulo 2, iremos com o uso da linguagem PHP explicar os principais conceitos da programação OO, conceitos estes que estão presentes em todas as linguagens que permitem a implementação de objetos.
No capítulo 3, ainda usando o PHP, iremos abordar um exemplo prático do uso da OO para facilitar o desenvolvimento de páginas HTML. Este exemplo visa reforçar os conceitos aprendidos e, o mais importante, visa mostrar que o uso do OO pode ser benéfico para o seu dia a dia.
No capítulo 4, iremos abordar o Java e exibir as suas principais características. O Java, por ser uma linguagem 100% OO, apresenta todas as funcionalidades que o OO possui, como classes abstratas, interfaces, sobrecarga de métodos, entre outros. Veremos apenas algumas teorias, que serão melhor explicadas no decorrer da obra.
No capítulo 5 apresentamos o C#, linguagem pertencente ao framework .Net da Microsoft, que é semelhante ao Java. Com esta linguagem, abordamos um exemplo para criação de SQLs para o acesso ao banco de dados.
No capítulo 6 apresentamos o Action Script, juntamente com o framework Flex, para aprendermos exclusivamente sobre Interfaces, algo tão falado e mal entendido pelos programadores. Você irá aprender a otimizar o seu código com o uso correto das interfaces.
O capítulo 7 volta a usar a linguagem PHP para introduzir o conceito de padrões de projeto. Usar somente OO não garante que o sistema está livre de problemas, é preciso combinar o conhecimento OO com os padrões (patterns) para que possamos criar sistemas com mais dinamiso e, principalmente, manuteníveis. Com o PHP iremos aprender o primeiro padrão, chamado “Factory”.
No capítulo 8 continuamos a estudar os padrões de projeto, usando agora o ActionScript e o Flex para ilustrar o padrão Observer, que apesar se ser pouco conhecido, é um ótimo aliado no desenvolvimento OO.
No capítulo 9 iremos aprender o padrão Singleton, muito usado em diversos frameworks. Inicialmente apresentamos o conceito e exibimos um exemplo em ActionScript para manipulação de janelas, além de um exemplo em PHP para leitura/escrita de um arquivo de log.
No capítulo 10 iremos, com PHP, criar um pequeno framework que envolve os conceitos de MVC e de injeção de dependência, além de usar outros padrões como o Singleton e o Factory.
No capítulo 11 criamos três exemplos que exibem inicialmente uma solução rápida para o problema proposto, mas ruim para a manutenção do código. Depois exibimos como usar a OO para melhorar cada um dos exemplos, utilizando inclusive padrões de projeto.
?
Gostaria de agradecer a todos os leitores que me escreveram sugerindo temas para o livro. Conforme combinado, as pessoas a seguir ganharão 20% de desconto na compra do livro
?
Você poderá comprar o livro no site www.danielschmitz.com.br, que é a nossa loja virtual. Ainda não está disponível para venda. Siga @Daniel_Schmitz para saber exatamente quando começará a pré venda