<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Crafters</title>
	
	<link>http://blog.crafters.com.br</link>
	<description>Nossa histórias de craftmanship</description>
	<lastBuildDate>Fri, 13 Jan 2012 18:34:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/craftersblog" /><feedburner:info uri="craftersblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>MongoID e campos que armazenam valores monetários</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/TYsistaq72Y/</link>
		<comments>http://blog.crafters.com.br/2012/01/mongoid-e-campos-que-armazenam-valores-monetarios/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 18:19:07 +0000</pubDate>
		<dc:creator>Rafael Felix</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2139</guid>
		<description><![CDATA[Em um dos projetos que estamos trabalhando atualmente, estamos utilizando Rails e MongoDB juntamente com o Mongoid para fazer o relacionamento ODM (Object-Document-Mapper). Nesse projeto temos alguns documentos onde armazenamos valores monetários; a primera coisa que fizemos foi mapear o campo para BigDecimal seguindo a documentação do Mongoid. Não vou entrar nos méritos dos motivos [...]]]></description>
			<content:encoded><![CDATA[<p>Em um dos projetos que estamos trabalhando atualmente, estamos utilizando <a href="http://rubyonrails.com" target="_blank">Rails</a> e <a href="http://www.mongodb.org/" target="_blank">MongoDB</a> juntamente com o <a href="http://mongoid.org/" target="_blank">Mongoid</a> para fazer o relacionamento ODM (Object-Document-Mapper).</p>
<p>Nesse projeto temos alguns documentos onde armazenamos valores monetários; a primera coisa que fizemos foi mapear o campo para BigDecimal seguindo a documentação do Mongoid. Não vou entrar nos méritos dos motivos de se utilizar BigDecimal ao invés de Float pois não é esse o foco deste post. A questão é que não existe um tipo BigDecimal nativo no MongoDB, o Mongoid faz o trabalho sujo de converter esse valor pra você trabalhar em alto nivel, mas na base do MongoDB ele acaba sendo armazenado como String.</p>
<p>Não tinhamos problemas com isso maaaaaasssssssss, tudo na vida tem um porém, senão eu não estaria blogando sobre isso. Aconteceu que o cliente pediu para pesquisar por esses valores dentro de um range, por exemplo, de R$ 0,00 a R$ 1.000,00. Nenhum de nós percebeu problema nisso, e implementamos a busca, que aparentemente funcionou sem problemas. E digo aparentemente pois tinha funcionado em valores de 0 até 999.999, se eu usasse 800.000 a 1.000.000 por exemplo, mesmo existindo um documento com esse valor armazenado ele não listava.</p>
<p>O real problema era exatamente o fato de ele armazenar esses valores como String. Se usássemos inteiros ou floats a pesquisa funcionava, nossa intenção não era usar Float, pelos seus problemas naturais, e resolvemos usar Inteiros, armazenando-os com suas casas decimais, ou seja, o valor 1.530,99 seria armazenado como 153099. Confesso que é uma abordagem estranha, mas depois de alguns dias lutando com isso resolvemos seguir em frente e usar isso mesmo (se alguém souber algo por favor avise <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), outro ponto a ser comentado, é que na aplicação não queriamos trabalhar com esse nivel, e resolvemos fazer o que o mongodb faz com o BigDecimal, mas ao invés de retornar um BigDecimal, resolvemos usar um objeto que representasse valores monetários, nesse caso o <a href="https://github.com/RubyMoney/money" target="_blank">projeto Money</a>.</p>
<p>Seguindo a documentação do Mongoid de como criar tipos customizados, criamos um tipo chamado MoneyField, o nome tem o Field no final para não conflitar com o nome da Gem e o codigo desse tipo ficou assim:</p>
<p><script src="https://gist.github.com/1438215.js"> </script></p>
<p>e no nosso documento fizemos somente um:<br />
<code><br />
field :valor, type: Mongoid::MoneyField<br />
</code></p>
<p>o valor armazenado no mongodb é inteiro e o que tabalhamos na aplicação é um objeto to tipo Money.</p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2012/01/mongoid-e-campos-que-armazenam-valores-monetarios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2012/01/mongoid-e-campos-que-armazenam-valores-monetarios/</feedburner:origLink></item>
		<item>
		<title>Mocks são realmente maus?</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/9yV7yVRg1-4/</link>
		<comments>http://blog.crafters.com.br/2011/11/mocks-sao-realmente-maus/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 19:55:22 +0000</pubDate>
		<dc:creator>Rafael Felix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2133</guid>
		<description><![CDATA[Hoje rolou uma pequena discussão no twitter, sobre usar ou não usar mocks, tudo começou com o Felipe Rodrigues, depois o Alexandre Porcelli respondeu, eu defendi mocks, e por ai foi os vários outros tweets, como achei 140 caracteres pouco resolvi defender meu ponto de vista aqui. É um assunto antigo mas ainda causa confusão. [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje rolou uma pequena discussão no twitter, sobre usar ou não usar mocks, tudo começou com o <a href="http://twitter.com/#!/felipero/status/134318111745769472">Felipe Rodrigues</a>, depois o <a href="http://twitter.com/#!/porcelli/status/134318508484988928">Alexandre Porcelli respondeu</a>, eu defendi mocks, e por ai foi os vários outros tweets, como achei 140 caracteres pouco resolvi defender meu ponto de vista aqui.</p>
<p>É um assunto antigo mas ainda causa confusão. Devo eu usar mocks nos meus testes? A resposta é um “depende”. Existem alguns objetos que não possuem dependências, e esses objetos não necessitam de mocks, afim simular o comportamento do próprio objeto que estou testando e realmente algo ruim. Mas em muitos casos temos objetos com dependências, e essas dependências podem ser ou não externas.</p>
<p>Ao meu ver quando estou testando uma classe, esse teste deve ser exclusivo desse objeto, e as dependências dele não necessitam estar testadas, pois, presumimos que essa dependência possua um teste e está funcionando perfeitamente. Só pra ilustrar temos a seguinte situação, temos um objeto Order, que por sua vez tem como dependência um objeto Adapter, esse Adapter se conecta a um serviço qualquer de pagamento (Braspag, Cielo, PagSeguro, Paypal, escolha um <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ), o adapter tem a responsabilidade de moldar os dados do objeto Order de acordo com a especificação do gateway.</p>
<p><script type="text/javascript" src="https://gist.github.com/1352606.js?file=order.rb"></script>  </p>
<p>Ignorando o código do Adapter e do Gateway, que de qualquer forma eu não controlo o gateway, qual seria a vantagem de escrever um teste dessa classe que conecte ao meu gateway de pagamento, mesmo em ambiente de testes? O máximo que eu ganharia é uma lentidão nos meus testes, e provavelmente erros do servidor iriam alterar o comportamento esperado do meu teste, o que não seria bom. Existem alguns gateways que mesmo em ambiente de testes só aceitam um número de transação, e em um caso de um projeto real, o teste estava competindo com a aplicação que estava em staging pra homologação. Ou seja, o teste conectava realmente no gateway pra realizar a transação, mas quando os números das transações começaram a ficar iguais, os testes começaram a falhar por que o retorno não era o esperado.</p>
<p>Como eu escreveria esse teste:</p>
<p><script type="text/javascript" src="https://gist.github.com/1352606.js?file=order_spec.rb"></script></p>
<p>Qual a vantagem dessa abordagem? Por que não usar o objeto real e simular o gateway com projetos no estilo FakeWeb? Dessa forma eu tenho total isolamento no teste da minha classe Order, eu posso futuramente mudar meu adapter para qualquer outro gateway, e se ele atender a minha API (possuir um metodo pay que retorne um symbol com o resultado da transação), o teste vai continuar passando como deveria ser. Agora usando um projeto que simule as urls eu tenho um problema, se eu mudar do PagSeguro para o Paypal? Esses testes vão falhar, o que não seria interessante, pois o comportamento da minha classe Order não mudou, o que mudou foi o gateway, consequentemente tenho um novo adapter, ou o comportamento do meu Adapter mudou. Algo que simule as urls e os retornos seria interessante no teste do Adapter, mas no teste do Order não faria sentido algum. Sem falar que um teste dessa forma está muito mais DRY, as mudanças não precisam ser propagadas por todos os testes, e o custo de manutenção cai bastante.</p>
<p>Claro que nem sempre mocks são uma boa idéia, mas na minha opinião, na maioria das vezes, você deve fazer mock das dependências de um objeto e testar o comportamento dele de forma isolada.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/11/mocks-sao-realmente-maus/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/11/mocks-sao-realmente-maus/</feedburner:origLink></item>
		<item>
		<title>Rails 3.1 Is comming</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/QhWvEGep4t8/</link>
		<comments>http://blog.crafters.com.br/2011/08/rails-3-1-is-comming/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 15:24:52 +0000</pubDate>
		<dc:creator>Rafael Felix</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Releases]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2113</guid>
		<description><![CDATA[Amanhã, dia 30/08, se não houver maiores problemas deve ser lançada a versão do Rails 3.1 final. Então resolvi preparar um post com as novidades dessa versão, não vou muito afundo detalhar cada um dos itens, só vou ressaltar algumas mudanças e melhorias e claro, links para quem quiser se aprofundar em cada um dos [...]]]></description>
			<content:encoded><![CDATA[<p>Amanhã, dia 30/08, se não houver maiores problemas deve ser lançada a versão do Rails 3.1 final.</p>
<p>Então resolvi preparar um post com as novidades dessa versão, não vou muito afundo detalhar cada um dos itens, só vou ressaltar algumas mudanças e melhorias e claro, links para quem quiser se aprofundar em cada um dos itens.</p>
<p>A primeira novidade anunciada foi a adição do JQuery como plugin javascript padrão, ao inves do prototype que vinha se arrastando em cada versão, e era removido por uns 90% dos programadores rails. Na verdade o padrão anterior foi removido, não vem mais nenhum framework javascript padrão no rails, o que vem é o driver ujs do JQuery, o que permite uma remoção muito mais simples ou troca por outro framework disponível.</p>
<p>O maior chororó da comunidade ( <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ) foi quando foi anunciado que CoffeeScript e Scss seriam incorporados por padrão no Rails, formando o Asset Pipeline. Apartir da versão 3.1 o rails tera um novo diretório dentro da pasta app chamado assets, e dentro desse diretorio será incluido outros como images, javascripts e stylesheets a pasta public não mais terá por padrão esses diretórios, e é claro que o desenvolvedor pode alterar. Com a adição do Sprockets, todos os arquivos scss dentro da pasta stylesheets e arquivos .coffee dentro da pasta javascript serão compilados em um único arquivo chamado application, para css é application.css e para javascript é application.js. E outras bibliotecas podem ser adicionadas na pasta vendor/assets, por exemplo algum plugin do JQuery, <em>vendor/assets/javascripts</em>, e esses scripts de terceiros precisam ser aidicionados no arquivo de manifesto localizado em <em>app/assets/javascripts/application.js</em>.</p>
<p>Também foi adicionado suporte a chunked encoding para forçar arquivos JavaScript e CSS a serem carregados em parelelo enquanto a pagina é carregada.<br />
O suporte a mapas de identidade no ActiveRecord evita que várias cópias do mesmo objeto sejam instanciadas.</p>
<p>Outra funcionalidade bacana é o ActiveRecord::Base#has_secure_password , que adiciona ao seu model um mecanismo simples de password, usando a engine do BCrypt para criptografar as senhas:</p>
<p><script src="https://gist.github.com/1178571.js"> </script></p>
<p>Existem muitas outras coisa, vale a pena dar uma conferida e estudar um pouco mais sobre essa nova versão do Rails. alguns links para estudos:</p>
<p><a href="https://github.com/rails/rails/tree/3-1-stable">http://getsprockets.org/</a><br />
<a href="https://gist.github.com/958283"> https://gist.github.com/958283</a><br />
<a href="http://railscasts.com/episodes/265-rails-3-1-overview"> http://railscasts.com/episodes/265-rails-3-1-overview</a><br />
<a href="http://weblog.rubyonrails.org/releases"> http://weblog.rubyonrails.org/releases</a><br />
<a href="https://github.com/rails/rails/tree/3-1-stable"> https://github.com/rails/rails/tree/3-1-stable</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/08/rails-3-1-is-comming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/08/rails-3-1-is-comming/</feedburner:origLink></item>
		<item>
		<title>TDC 2011 – Florianópolis</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/sIz_GkBeTNk/</link>
		<comments>http://blog.crafters.com.br/2011/08/tdc-2011-florianopolis/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 14:17:18 +0000</pubDate>
		<dc:creator>Rafael Felix</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Backbone]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[TDC]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2108</guid>
		<description><![CDATA[E ae pessoal, Vamos atualizar um pouco o blog . Final de semana passado dias 20 e 21 de Agosto aconteceu o TDC 2011 em Florianópolis, muita gente bacana, bastante networking, e nada mais que 12 trilhas para o pessoal assistir com diversas palestras de alto nível, eu como bom catarinense, estive lá, e participei [...]]]></description>
			<content:encoded><![CDATA[<p>E ae pessoal,</p>
<p>Vamos atualizar um pouco o blog <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Final de semana passado dias 20 e 21 de Agosto aconteceu o TDC 2011 em Florianópolis, muita gente bacana, bastante networking, e nada mais que 12 trilhas para o pessoal assistir com diversas palestras de alto nível, eu como bom catarinense, estive lá, e participei das trilhas web e ruby/python. </p>
<p>Na trilha Web falei sobre Backbone.js, e fiquei muito contente em saber que existem empresas de SC trabalhando com o Backbone, algo que achei que estava sendo usado somente fora do Brasil, os slides da palestra estão abaixo:</p>
<div style="width:425px" id="__ss_8942617"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/felix.rafael/backbone-tdc-2011-floripa" title="Backbone - TDC 2011 Floripa" target="_blank">Backbone &#8211; TDC 2011 Floripa</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8942617" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/felix.rafael" target="_blank">Rafael Felix da Silva</a> </div>
</p></div>
<p>Na trilha de Ruby/Python falei sobre Design Patterns em Ruby, com pouca teoria e bastante código, tive um feedback legal da apresentação, e ela chegou a estar na home do slideshare por um tempo <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , muito obrigado a todos que compartilharam a apresentação, podem ver ela abaixo:</p>
<div style="width:425px" id="__ss_8963537"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/felix.rafael/ruby-design-patterns-tdc2011" title="Ruby - Design patterns tdc2011" target="_blank">Ruby &#8211; Design patterns tdc2011</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8963537" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/felix.rafael" target="_blank">Rafael Felix da Silva</a> </div>
</p></div>
<p>Obrigado a todos que participaram do TDC em Floripa, nos vemos ano que vem <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/08/tdc-2011-florianopolis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/08/tdc-2011-florianopolis/</feedburner:origLink></item>
		<item>
		<title>Backbone.JS</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/LtOSv5WcIq4/</link>
		<comments>http://blog.crafters.com.br/2011/07/backbone-js/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 18:55:22 +0000</pubDate>
		<dc:creator>Rafael Felix</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[backbone.js]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2095</guid>
		<description><![CDATA[Hoje vou aproveitar meu primeiro post no blog da Crafters e falar de um assunto que está me tomando um certo tempo. Estou estudando Backbone.JS WTF? Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não. O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem? [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou aproveitar meu primeiro post no blog da Crafters e falar de um assunto que está me tomando um certo tempo. Estou estudando <a href="http://documentcloud.github.com/backbone/" target="_blank">Backbone.JS</a></p>
<h3>WTF?</h3>
<p>Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não.</p>
<p>O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem?</p>
<p>1) Suporte a Mobile.<br />
2) Integrado com JQuery<br />
3) Visual Clean<br />
4) Focado em MVC<br />
5) Usa RestFull</p>
<p>5 itens para ressaltar o por que do Backbone.</p>
<h3><span id="more-2095"></span>Desenvolvendo</h3>
<div>O mais legal do Backbone é que ele é puro JavaScript, não existem tags geradas durante a execução, e seu CSS pode ser usado sem nenhum problema. E o principal o código gerado é o codigo escrito, usando tanto Inspect Element quanto um View Source não vão mostrar um código absurdo que somente seu navegador consegue ler. Nunca fui muito fã de aplicações RIA, justamente por que elas dificultam essa parte de inspeção dos elementos e foi justamente isso que me chamou a atenção no backbone.</div>
<div>Basicamente o Backbone é composto por Events, Models, Collections, Routers e Views.</div>
<div><strong>Event</strong>: É um modulo que pode ser anexado em outros objetos. Ele é simplesmente composto dos metodos bind, unbind e trigger.</div>
<div><strong>Model</strong>: É o núcleo da sua aplicação com Backbone, é nele que ficam as lógicas de persistencia, validação, e algum trabalho com a tela. Um model pode ser qualquer coisa, assim como no Rails seu model não precisa, necessariamente estar ligado a um base de dados. Um exemplo de um Model:<br />
<script type="text/javascript" src="https://gist.github.com/1092261.js">// <![CDATA[</p>
<p>// ]]&gt;</script></div>
<p>&nbsp;</p>
<div>O uso do window é usado somente para definir esse objeto como global para poder usar por exemplo new Album. Essa é uma das maiores classes do Backbone, vale a pena dar uma olhada na <a href="http://documentcloud.github.com/backbone/#Model" target="_blank">documentação</a>.</div>
<div><strong>Collection</strong>: Não são nada mais do que uma coleção de modelos. Para definir é necessário passar o model que representa essa collection e também um URL que será usada para buscar e preencher a listagem.<br />
<script type="text/javascript" src="https://gist.github.com/1092283.js">// <![CDATA[</p>
<p>// ]]&gt;</script></div>
<p>&nbsp;</p>
<div>Esse é outro objeto simples do backbone <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div><strong>Router</strong>: Router é responsavel por gerenciar as urls do backbone. e saber para qual callback redirecionar. as urls do backbone começam com um # ex: (#users/felix). Nem toda a aplicação precisa de um Router, mas se sua aplicação precisar de uma complexidade maior vai precisar sim <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<script type="text/javascript" src="https://gist.github.com/1092312.js">// <![CDATA[</p>
<p>// ]]&gt;</script><br />
PS: Na versão 0.3 do backbone ele era chamado de Controller.</div>
<div>Reparem que na definição da rota eu não preciso definir o # antes da url, mas para executa-la nas views o link deve ser <span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 19px; white-space: pre;">#collection/1/album/1 </span>reparem que substitui os wildcards (<span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;">:album_collection_id </span>e<span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"> :id</span>) pelos ids que vou trabalhar, esse link com o # dispara o router do backbone que já deve ser previamente inicializado (new), e deve existir uma (uma e somente uma),chamada ao metodo <span class="Apple-style-span" style="font-family: Monaco, Consolas, 'Lucida Console', monospace; font-size: 12px; line-height: 18px;">Backbone.history.start() </span>dessa forma o backbone inicia a leitura das URL.<strong>View</strong>: Uma view para o backbone é algo renderizado na tela, baseado em tags, vc pode renderizar suas telas usando JavaScript, cada view é responsavel por gerenciar seus eventos. Existem um atributo chamado events, onde os eventos podem ser definidos como por exemplo para submter o form da propria view você teria uma sintaxe parecida com essa &#8220;submit form&#8221;: &#8220;save&#8221;, onde submit é o evento, form é selector do JQuery, e save é o callback que será executado quando o form for submetido. Simples não?</div>
<div>
<h3>Exemplos</h3>
</div>
<div>Sem mais o que falar vou por alguns links aqui.</div>
<div><a href="http://addyosmani.com/resources/backbonegallery/index.php" target="_blank">http://addyosmani.com/resources/backbonegallery/index.php </a></div>
<div>Essa foi a aplicação base para fazer alguns estudos e me ajudou bastante a entender alguns conceitos sobre o backbone.</div>
<div>Reescrevi a mesma aplicação usando o Rails 3.1:</div>
<div><a href="https://github.com/fellix/backbone-rails-gallery" target="_blank">https://github.com/fellix/backbone-rails-gallery</a></div>
<div>Na wiki do Backbone tem muito mais exemplos não deixem de conferir, existe até um exemplo de Mobile <img src='http://blog.crafters.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div><a href="https://github.com/documentcloud/backbone/wiki/Tutorials%2C-blog-posts-and-example-sites" target="_blank">https://github.com/documentcloud/backbone/wiki/Tutorials%2C-blog-posts-and-example-sites</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/07/backbone-js/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/07/backbone-js/</feedburner:origLink></item>
		<item>
		<title>Criando Tiles no Windows Phone 7</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/zvrsxJiueEw/</link>
		<comments>http://blog.crafters.com.br/2011/07/criando-tiles-no-windows-phone-7/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 17:23:17 +0000</pubDate>
		<dc:creator>vquaiato</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Live Tiles]]></category>
		<category><![CDATA[Tiles]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2081</guid>
		<description><![CDATA[Fala galera, beleza? Uma das coisas bacanas do Windows Phone 7 é a idéia de &#8220;Live Tiles&#8221; que nada mais são do que informações sobre nossas apps na home do aparelho. O conceito de live/vivo vem da idéia de que podemos manter os Tiles atualizados, exibindo informações, mesmo se nossa app estiver fechada. Cool hã? [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Tile-criado-no-Windows-Phone-71.png"><img class="alignright size-medium wp-image-3844" title="Tile criado no Windows Phone 7" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Tile-criado-no-Windows-Phone-71-165x300.png" alt="" width="165" height="300" /></a>Fala galera, beleza? Uma das coisas bacanas do <a href="http://www.microsoft.com/windowsphone/en-gb/features/default.aspx#start-screen-live-tiles">Windows Phone 7 é a idéia de &#8220;Live Tiles&#8221;</a> que nada mais são do que informações sobre nossas apps na home do aparelho.<br />
O conceito de live/vivo vem da idéia de que podemos manter os Tiles atualizados, exibindo informações, mesmo se nossa app estiver fechada. Cool hã?<br />
(se você ainda não sabe nada do <a href="http://viniciusquaiato.com/blog/category/windows-phone-7/">Windows Phone 7 leia estes posts</a>, e <a href="http://msdn.microsoft.com/en-us/library/hh202948(v=VS.92).aspx">visite esta página no MSDN</a>)</p>
<h2>Criando Tiles no Windows Phone 7</h2>
<p>Criar Tiles no Windows Phone 7 é muito, mas muito simples mesmo (o modelo de desenvolvimento do WP7 é sensacional).</p>
<h3>Criando o background para seu tile do Windows Phone 7</h3>
<p>Primeiro vamos criar uma imagem para o nosso tile. As imagens para <a href="http://msdn.microsoft.com/en-us/library/hh202884(v=VS.92).aspx">tiles devem seguir alguns padrões, confira aqui.</a><br />
Como eu sou bem preguiçoso eu apenas criei uma imagem 173&#215;173 pixels no paint mesmo(salve como png).</p>
<h3>Criando Tiles via C#</h3>
<p>Agora vamos criar uma app para Windows Phone 7 no Visual Studio.<br />
Primeiro adicione sua imagem ao projeto e marque suas propriedades como abaixo:</p>
<div id="attachment_3836" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configurando-background-tile-no-projeto.png"><img class="size-medium wp-image-3836" title="Configurando background tile no projeto WP7" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configurando-background-tile-no-projeto-300x264.png" alt="Configurando background tile no projeto WP7" width="300" height="264" /></a><p class="wp-caption-text">Configurando background tile no projeto WP7</p></div>
<p><span id="more-2081"></span>Feito isso só nos resta criar o código para configurar nosso tile. Insira o código abaixo no construtor da sua MainPage por exemplo:</p>

<div class="wp_codebox"><table><tr id="p20812"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p2081code2"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> CreateApplicationTile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    var meuTile<span style="color: #008000;">=</span> ShellTile<span style="color: #008000;">.</span><span style="color: #0000FF;">ActiveTiles</span><span style="color: #008000;">.</span><span style="color: #0000FF;">First</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>meuTile<span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        var standardTile <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StandardTileData
                                <span style="color: #008000;">&#123;</span>
                                    Title <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Título Tile&quot;</span>,
                                    BackgroundImage <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Uri<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;arroba.png&quot;</span>, UriKind<span style="color: #008000;">.</span><span style="color: #0000FF;">Relative</span><span style="color: #008000;">&#41;</span>,
                                    Count <span style="color: #008000;">=</span> <span style="color: #FF0000;">7</span>
        <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
        meuTile<span style="color: #008000;">.</span><span style="color: #0000FF;">Update</span><span style="color: #008000;">&#40;</span>standardTile<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Explicando: na <strong><em>linha 2</em></strong> obtemos um objeto do tipo <a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.shelltile_members(v=VS.92).aspx">ShellTile</a>. Sempre existirá um tile para nossa aplicação, por isso podemos pegar o first neste caso.<br />
Na <strong><em>linha 5</em></strong> criamos um objeto do tipo <a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.standardtiledata_members(v=VS.92).aspx">StandardTileData</a> que é responsável por armazenar as informações de um Tile, ou seja é o ViewModel do tile.<br />
Neste caso estamos configurando 3 propriedades do nosso tile: Title, BackgroundImage e Count.</p>
<div id="attachment_3837" class="wp-caption aligncenter" style="width: 394px"><a href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Propriedades-de-um-tile-no-Windows-Phone-7.png"><img class="size-full wp-image-3837" title="Propriedades de um tile no Windows Phone 7" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Propriedades-de-um-tile-no-Windows-Phone-7.png" alt="Propriedades de um tile no Windows Phone 7" width="384" height="190" /></a><p class="wp-caption-text">Propriedades de um tile no Windows Phone 7</p></div>
<p>Se sua aplicação não faz uso de informações como Count basta deixar seu valor como 0 e então esta informação não será exibida.</p>
<h3>Pin to Start</h3>
<p>Como nós não somos intrusos, o tile está definido mas falta fixá-lo na home do nosso device. Para fazer isso basta pressionarmos o ícone da nossa app no Windows Phone e escolher a opção &#8220;pin to start&#8221;:</p>
<div id="attachment_3839" class="wp-caption aligncenter" style="width: 175px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Pin-tile-do-start-page-Windows-Phone-7.png"><img class="size-medium wp-image-3839" title="Pin tile do start page Windows Phone 7" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Pin-tile-do-start-page-Windows-Phone-7-165x300.png" alt="Pin tile do start page Windows Phone 7" width="165" height="300" /></a><p class="wp-caption-text">Pin tile do start page Windows Phone 7</p></div>
<p>E lá está nosso tile criado e na start page do Windows Phone 7:</p>
<div id="attachment_3840" class="wp-caption aligncenter" style="width: 315px"><a href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Tile-criado-no-Windows-Phone-7.png"><img class="size-full wp-image-3840" title="Tile criado no Windows Phone 7" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Tile-criado-no-Windows-Phone-7.png" alt="Tile criado no Windows Phone 7" width="305" height="554" /></a><p class="wp-caption-text">Tile criado no Windows Phone 7</p></div>
<h2>Resumo</h2>
<p>Tile é um recurso bastante interessante do Windows Phone 7. Preste bastante atenção ao guia sobre as cores e padrões para a criação dos tiles pois eles devem funcionar perfeitamente com qualquer esquema de cores que esteja sendo utilizado no phone.<br />
Nos próximos posts veremos como criar backtiles e como atualizar as informações do nosso tile utilizando Tile Push Notifications.</p>
<p>Abraços,<br />
Vinicius Quaiato.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/07/criando-tiles-no-windows-phone-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/07/criando-tiles-no-windows-phone-7/</feedburner:origLink></item>
		<item>
		<title>SessionState Provider com Windows Azure AppFabric Caching</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/DmdbwgazLuk/</link>
		<comments>http://blog.crafters.com.br/2011/07/sessionstate-provider-com-windows-azure-appfabric-caching/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 19:26:20 +0000</pubDate>
		<dc:creator>vquaiato</dc:creator>
				<category><![CDATA[Windows Azure]]></category>
		<category><![CDATA[Windows Azure AppFabric Caching]]></category>
		<category><![CDATA[Windows Azure AppFabric Caching SessionState Provider]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2076</guid>
		<description><![CDATA[Fala galera, depois de explicar como habilitar o Windows Azure AppFabric Caching no portal do Windows Azure vamos tirar proveito dele para armazenar o estado de nossas sessões em aplicações ASP.NET no Windows Azure. Por que usar o Windows Azure AppFabric Caching para Sessions? Quando estamos em um ambiente como o Windows Azure onde normalmente [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera, depois de explicar como <a href="http://viniciusquaiato.com/blog/windows-azure-appfabric-caching/">habilitar o Windows Azure AppFabric Caching no portal do Windows Azure</a> vamos tirar proveito dele para armazenar o estado de nossas sessões em aplicações ASP.NET no Windows Azure.</p>
<h2>Por que usar o Windows Azure AppFabric Caching para Sessions?</h2>
<p>Quando estamos em um ambiente como o Windows Azure onde normalmente trabalharemos com mais de uma máquina(instância) para nossas aplicações os requests que fizermos aos nossos sites poderão ser encaminhados para qualquer uma destas máquinas.<span id="more-2076"></span><br />
Quem faz este trabalho é um Load Balancer já configurado no Windows Azure. Veja a ilustração abaixo para entender como isso funciona:</p>
<div id="attachment_3803" class="wp-caption aligncenter" style="width: 457px"><a href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Windows-Azure-Load-Balancer.png"><img class="size-full wp-image-3803" title="Windows Azure Load Balancer" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Windows-Azure-Load-Balancer.png" alt="Windows Azure Load Balancer" width="447" height="391" /></a><p class="wp-caption-text">Windows Azure Load Balancer</p></div>
<p>Isto quer dizer que nosso request pode retornar da máquina 1. Quando pressionarmos um botão ele pode retornar para a máquina 2, e quando puxarmos um relatório ele pode vir da máquina N. Com isso precisamos mudar o mecanismo de sessões do ASP.NET.<br />
A solução para estes cenários é utilizar um mecanismo de armazenamento de sessões que seja persistente e independente de máquina. Um cache distribuído ou um banco de dados são soluções comuns. E é aqui que usarmos o Windows Azure AppFabric Caching pois por ser um mecanismo de caching distribuído qualquer uma de nossas instâncias(ou máquinas) fará acesso ao mesmo cache, assim se cairmos na máquina 1 ou na máquina N teremos acesso aos objetos de Session.</p>
<h2>Habilitando o Windows Azure AppFabric Caching no projeto ASP.NET</h2>
<p>A primeira coisa que precisamos fazer é referenciar 3 DLLs do SDK do Windows Azure AppFabric. <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=19925">Se você ainda não instalou faça o download aqui e instale</a>.<br />
As 3 DLLs que precisaremos são: <strong>Microsoft.ApplicationServer.Caching.Core</strong>, <strong>Microsoft.ApplicationServer.Caching.Client</strong> e <strong>Microsoft.Web.DistributedCache</strong> que podem ser encontradas em: <em>Program Files\Windows Azure AppFabric SDK\V1.0\Assemblies\NET4.0\Cache</em>.<br />
Após adicionar estas DLLs altere sua propriedade &#8220;Copy Local&#8221; para true.</p>
<div id="attachment_3805" class="wp-caption aligncenter" style="width: 238px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/adicionando-referencias-Windows-Azure-AppFabric-Caching.png"><img class="size-medium wp-image-3805" title="adicionando referencias Windows Azure AppFabric Caching" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/adicionando-referencias-Windows-Azure-AppFabric-Caching-228x300.png" alt="adicionando referencias Windows Azure AppFabric Caching" width="228" height="300" /></a><p class="wp-caption-text">adicionando referencias Windows Azure AppFabric Caching</p></div>
<p>Após adicionarmos as DLLs precisamos colocar algumas informações no web.config da nossa aplicação. Estas informações para o web.config dirão para a aplicação que estamos utilizando o Windows Azure AppFabric Caching e que estamos utilizando-o como Provider para o SessionState.<br />
O próprio portal do Windows Azure te fornece estar informações:</p>
<div id="attachment_3807" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Informacoes-client-para-o-Windows-Azure-AppFabric-Caching.png"><img class="size-medium wp-image-3807" title="Informacoes client para o Windows Azure AppFabric Caching" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Informacoes-client-para-o-Windows-Azure-AppFabric-Caching-300x181.png" alt="Informacoes client para o Windows Azure AppFabric Caching" width="300" height="181" /></a><p class="wp-caption-text">Informacoes client para o Windows Azure AppFabric Caching</p></div>
<p>Agora vamos configurar tudo. Primeiro adicione as linhas abaixo logo após a tagno seu web.config:</p>

<div class="wp_codebox"><table><tr id="p20768"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p2076code8"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;dataCacheClients&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core&quot;</span> <span style="color: #000066;">allowlocation</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">allowdefinition</span>=<span style="color: #ff0000;">&quot;Everywhere&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/section<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Se você já tiver uma área &lt;configSections&gt; apenas adicione a linha &lt;section&gt;:</p>

<div class="wp_codebox"><table><tr id="p20769"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p2076code9"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;dataCacheClients&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core&quot;</span> <span style="color: #000066;">allowlocation</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">allowdefinition</span>=<span style="color: #ff0000;">&quot;Everywhere&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/section<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Isto apenas cria uma section para preenchermos informações do Windows Azure AppFabric Caching. É uma forma de estender as configurações do web.config.</p>
<p>Agora adicione o seguinte trecho dentro de &lt;system.web&gt;:</p>

<div class="wp_codebox"><table><tr id="p207610"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p2076code10"><pre class="xml" style="font-family:monospace;">&nbsp;</pre></td></tr></table></div>

<p>Este trecho diz pra o ASP.NET que deve utilziar o <strong><em>AppFabricCacheSessionStoreProvider</em></strong> que está no assembly <em>Microsoft.Web.DistributedCache</em>.</p>
<p>E agora vamos inserir as informações da nossa conta no Windows Azure AppFabric Caching. Este trecho pode ser adicionado logo antes de &lt;/configuration&gt;:</p>

<div class="wp_codebox"><table><tr id="p207611"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p2076code11"><pre class="xml" style="font-family:monospace;">&nbsp;</pre></td></tr></table></div>

<p>O Token pode ser obtido nas informações de Configuração de Cliente da imagem acima ou também através do botão:</p>
<div id="attachment_3810" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Token-do-Windows-Azure-AppFabric-Caching.png"><img class="size-medium wp-image-3810" title="Token do Windows Azure AppFabric Caching" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Token-do-Windows-Azure-AppFabric-Caching-300x162.png" alt="Token do Windows Azure AppFabric Caching" width="300" height="162" /></a><p class="wp-caption-text">Token do Windows Azure AppFabric Caching</p></div>
<p>Pronto! Agora tudo está configurado e funcionando. Nada precisa ser alterado no seu código continue acessando o objeto Session da mesma forma:</p>

<div class="wp_codebox"><table><tr id="p207612"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p2076code12"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> Page_Load<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Session<span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;AppFabricCaching&quot;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Windows Azure AppFabric Caching para SessionState Provider&quot;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> ExibirSession_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SessionContent</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> Session<span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;AppFabricCaching&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h2>Resumo</h2>
<p>Não pense que isso não é algo importante: é! Se você subir qualquer site no Windows Azure que vá ser executado em mais de uma instância você precisará de um mecanismo de session persistente e que possa atender qualquer uma das instâncias de forma transparente. Caso você não faça isso suas sessions se perderão e você terá comportamentos estranhos e indesejados no seus sistema.<br />
Esta não é a única forma de fazer isso mas é uma das mais simples por já haver um provider disponibilizados pela Microsoft executando no ambiente do Windows Azure.</p>
<h2>Detalhe Importante</h2>
<p>É preciso que você crie um mecanismo para apagar as sessions que já estiverem expiradas, caso contrário elas permanecerão no cache ocupando espaço. Mas isso é assunto para outro post.</p>
<p>Abraços,<br />
Vinicius Quaiato.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/07/sessionstate-provider-com-windows-azure-appfabric-caching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/07/sessionstate-provider-com-windows-azure-appfabric-caching/</feedburner:origLink></item>
		<item>
		<title>Windows Azure Management Tools – Windows Azure MMC</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/ozjSo_KAjwQ/</link>
		<comments>http://blog.crafters.com.br/2011/07/windows-azure-management-tools-windows-azure-mmc/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 17:59:39 +0000</pubDate>
		<dc:creator>vquaiato</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Windows Azure]]></category>
		<category><![CDATA[Windows Azure Management Tools]]></category>
		<category><![CDATA[Windows Azure MMC]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2072</guid>
		<description><![CDATA[Fala galera, beleza? Aproveitando as dicas que já dei sobre como acessar o Storage Account do Windows Azure agora vou mostrar uma outra forma de fazer isso: utilizando o Windows Azure Management Tools ou Windows Azure MMC. Com o Windows Azure Management Tools podemos gerenciar nossos roles, explorar nossa storage account, e outras coisas. Neste [...]]]></description>
			<content:encoded><![CDATA[<p>Fala galera, beleza? Aproveitando as <a href="http://viniciusquaiato.com/blog/azure-storage-explorer-e-cerebrata-cloud-storage-studio/">dicas que já dei sobre como acessar o Storage Account do Windows Azure</a> agora vou mostrar uma outra forma de fazer isso: utilizando o <a href="http://wapmmc.codeplex.com/">Windows Azure Management Tools</a> ou <a href="http://wapmmc.codeplex.com/">Windows Azure MMC</a>.</p>
<p>Com o Windows Azure Management Tools podemos gerenciar nossos roles, explorar nossa storage account, e outras coisas. Neste primeiro post mostrarei como instalar, e nos psots subsequentes veremos como utilziar algumas das features do Windows Azure Management Tools.<span id="more-2072"></span></p>
<h2>Instalando o Windows Azure MMC</h2>
<p>A instalação é batsante simples, baixe o arquivo em: <a href="http://wapmmc.codeplex.com/">http://wapmmc.codeplex.com/</a>.<br />
Após baixar e executar alguns arquivos serão extraídos para a pasta de sua escolha. Entre nesta pasta e execute o arquivo <strong><em>StartHere.cmd</em></strong>. Este arquivo que começará de fato com a instalação:</p>
<div id="attachment_3759" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/AzureMMC_2011-07-14_19-04-11.png"><img class="size-medium wp-image-3759" title="Instalando Windows Azure MMC" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/AzureMMC_2011-07-14_19-04-11-300x182.png" alt="Instalando Windows Azure MMC" width="300" height="182" /></a><p class="wp-caption-text">Instalando Windows Azure MMC</p></div>
<p>.</p>
<p>O processo de instalação é bastante simples e executará sozinho:<br />
<a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-43-52.png"><img class="aligncenter size-medium wp-image-3760" title="Configuration Wizard - Windows Azure Management Tools" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-43-52-300x193.png" alt="Configuration Wizard - Windows Azure Management Tools" width="300" height="193" /></a></p>
<div id="attachment_3761" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-00.png"><img class="size-medium wp-image-3761" title="Configuration Wizard - Windows Azure Management Tools" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-00-300x193.png" alt="Configuration Wizard - Windows Azure Management Tools" width="300" height="193" /></a><p class="wp-caption-text">Configuration Wizard - Windows Azure Management Tools</p></div>
<div id="attachment_3762" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-14.png"><img class="size-medium wp-image-3762" title="Configuration Wizard - Windows Azure Management Tools" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-14-300x193.png" alt="Configuration Wizard - Windows Azure Management Tools" width="300" height="193" /></a><p class="wp-caption-text">Configuration Wizard - Windows Azure Management Tools</p></div>
<div id="attachment_3763" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-29.png"><img class="size-medium wp-image-3763" title="Configuration Wizard - Windows Azure Management Tools" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-44-29-300x193.png" alt="Configuration Wizard - Windows Azure Management Tools" width="300" height="193" /></a><p class="wp-caption-text">Configuration Wizard - Windows Azure Management Tools</p></div>
<div id="attachment_3764" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-49-07.png"><img class="size-medium wp-image-3764" title="Configuration Wizard - Windows Azure Management Tools" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/Configuration-Wizard-Windows-Azure-Management-Tools_2011-07-14_14-49-07-300x193.png" alt="Configuration Wizard - Windows Azure Management Tools" width="300" height="193" /></a><p class="wp-caption-text">Configuration Wizard - Windows Azure Management Tools</p></div>
<h2>Abrindo o Windows Azure Management Tools &#8211; Windows Azure MMC</h2>
<p>Pronto agora estamos com o Windows Azure MMC instalado. Utilize o ícone criado no desktop para acessá-lo.</p>
<div id="attachment_3765" class="wp-caption aligncenter" style="width: 310px"><a class="lightbox" href="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/WindowsAzureMmc-Console-Root_2011-07-14_14-50-47.png"><img class="size-medium wp-image-3765" title="Windows Azure Management Tools - Windows Azure MMC" src="http://viniciusquaiato.com/blog/wp-content/uploads/2011/07/WindowsAzureMmc-Console-Root_2011-07-14_14-50-47-300x205.png" alt="Windows Azure Management Tools - Windows Azure MMC" width="300" height="205" /></a><p class="wp-caption-text">Windows Azure Management Tools - Windows Azure MMC</p></div>
<p>É isso aê. Logo mais publico sobre como usar a ferramenta.</p>
<p>Abraços,<br />
Vinicius Quaiato.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/07/windows-azure-management-tools-windows-azure-mmc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/07/windows-azure-management-tools-windows-azure-mmc/</feedburner:origLink></item>
		<item>
		<title>Refactoring: O momento de buscar excelência técnica!</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/hAz194Yjfj8/</link>
		<comments>http://blog.crafters.com.br/2011/07/refactoring-buscar-excelencia-tecnica/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 12:47:07 +0000</pubDate>
		<dc:creator>Felipe Rodrigues</dc:creator>
				<category><![CDATA[DDD]]></category>
		<category><![CDATA[Engenharia]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2057</guid>
		<description><![CDATA[Hoje fui procurar resolver um problema em um código antigo, produzido por minha própria equipe. Ao tentar encontrar o problema, identifiquei alguns &#8220;mau cheiros&#8221; no código. Imediatamente iniciei um refactoring simples, porém que me serve como inspiração para este post. Refactoring de código é modificar a estrutura de um código sem alterar a sua funcionalidade. [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje fui procurar resolver um problema em um código antigo, produzido por minha própria equipe. Ao tentar encontrar o problema, identifiquei alguns &#8220;mau cheiros&#8221; no código. Imediatamente iniciei um refactoring simples, porém que me serve como inspiração para este post.</p>
<p>Refactoring de código é modificar a estrutura de um código sem alterar a sua funcionalidade. É incrível como as pessoas ainda confundem refactoring com modificação de código. Ouço frequentemente pessoas dizendo que vão refatorar um código, quando na verdade deveriam dizer que vão modificar uma funcionalidade. Bom, isso é assunto pra outro tipo de discussão.</p>
<p><span id="more-2057"></span></p>
<h2>O Problema</h2>
<p>Ao buscar o problema no código em questão, observei uma violação no isolamento dos métodos. É considerado &#8220;boa prática&#8221; isolar as ações dos métodos ou funções do seu código. Isso é disseminado como <a title="Single Responsibility Principle on Wikipedia" href="http://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank">Single Responsibility Principle</a>, um dos princípios da Orientação a Objetos muito ignorado por aí. Este princípio também faz parte do <a title="SOLID no wikipedia em inglês" href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)" target="_blank">SOLID</a>. <a title="Post do Vinícius Quaiato sobre Single Responsibility Principle" href="http://viniciusquaiato.com/blog/responsabilidade-unica-uma-historia-bem-contada/" target="_blank">Aqui há um post do Vinícius Quaiato falando sobre esse princípio</a>.</p>
<p>Dessa forma, lhe convido a analisar o código a seguir:</p>
<div id="gist-1084227" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">module</span> <span class="nn">Integration</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="k">class</span> <span class="nc">Transaction</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">initialize</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vi">@connection</span> <span class="o">=</span> <span class="no">Integration</span><span class="o">::</span><span class="no">Connection</span><span class="o">.</span><span class="n">new</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">create!</span><span class="p">(</span><span class="n">registration</span><span class="p">,</span> <span class="n">card</span><span class="p">)</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">message</span> <span class="o">=</span> <span class="n">xml_builder</span><span class="p">(</span><span class="s2">&quot;requisicao-transacao&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">xml</span><span class="o">|</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">xml</span><span class="o">.</span><span class="n">numero</span> <span class="n">registration</span><span class="o">.</span><span class="n">id</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">xml</span><span class="o">.</span><span class="n">valor</span> <span class="n">registration</span><span class="o">.</span><span class="n">training_class</span><span class="o">.</span><span class="n">price</span><span class="o">.</span><span class="n">to_i</span> <span class="o">*</span> <span class="mi">100</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">xml</span><span class="o">.</span><span class="n">moeda</span> <span class="s2">&quot;986&quot;</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1"># ... MONTA UM XML COMPLEXO ...</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">make_request!</span> <span class="n">message</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kp">private</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">make_request!</span><span class="p">(</span><span class="n">message</span><span class="p">)</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">params</span> <span class="o">=</span> <span class="p">{</span> <span class="n">mensagem</span><span class="p">:</span> <span class="n">message</span><span class="o">.</span><span class="n">target!</span> <span class="p">}</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1"># ... FAZ MAIS COISAS AQUI ...</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">result</span> <span class="o">=</span> <span class="vi">@connection</span><span class="o">.</span><span class="n">request!</span> <span class="n">params</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">parse_response</span><span class="p">(</span><span class="n">result</span><span class="p">)</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">parse_response</span><span class="p">(</span><span class="n">response</span><span class="p">)</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">case</span> <span class="n">response</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">when</span> <span class="no">Net</span><span class="o">::</span><span class="no">HTTPSuccess</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">document</span> <span class="o">=</span> <span class="no">REXML</span><span class="o">::</span><span class="no">Document</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">body</span><span class="p">)</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">parse_elements</span><span class="p">(</span><span class="n">document</span><span class="o">.</span><span class="n">elements</span><span class="p">)</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span><span class="ss">:erro</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="ss">:mensagem</span> <span class="o">=&gt;</span> <span class="s2">&quot;Impossível contactar o servidor&quot;</span><span class="p">}}</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">parse_elements</span><span class="p">(</span><span class="n">elements</span><span class="p">)</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">map</span><span class="o">=</span><span class="p">{}</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">elements</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">element</span><span class="o">|</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">element_map</span> <span class="o">=</span> <span class="p">{}</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1"># ... FAZ ALGO COM OS ELEMENTOS DO XML ...</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">map</span><span class="o">.</span><span class="n">merge!</span><span class="p">(</span><span class="n">element</span><span class="o">.</span><span class="n">name</span> <span class="o">=&gt;</span> <span class="n">element_map</span><span class="p">)</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">map</span><span class="o">.</span><span class="n">symbolize_keys</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC45'>&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC46'><span class="k">end</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1084227/2da17cbf593dfba9766d616ea4de40b48f91fca3/transaction.rb" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1084227#file_transaction.rb" style="float:right;margin-right:10px;color:#666">transaction.rb</a>
            <a href="https://gist.github.com/1084227">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Não sei se você reparou, mas todas os métodos da classe acima violam o princípio de responsabilidade única. Além disso viola outros princípios de design, como por exemplo a ideia de coesão e <a title="Intention-Revealing Interface" href="http://domaindrivendesign.org/node/113" target="_blank">Intention-Revealing Interface</a>. Esses métodos também não são testáveis. Uma forma fácil para identificar isso é tentando testar o método <em>create!</em>. Ele parece muito bom, certo? Errado!</p>
<p>Segundo a prática de Intention-Revealing Interface, o método create! deveria criar uma transaction e como tal, deveria retornar uma transaction. Neste caso, poderíamos até aplicar o conceito de <a title="Explicações sobre Supple Design e DDD" href="http://softwareengineering.vazexqi.com/2006/10/11/ddd-supple-design" target="_blank">Closure of Operations</a>, fazendo com que o método retornasse um objeto transaction, já que é o esperado por quem lê seu nome. Isso não acontece.</p>
<p>O retorno desse método é uma invocação de outro método: <em>make_request</em>, que por sua vez deveria realizar um request e de preferencia retornar um objeto que represente request. Isso não ocorre. Ao invés disso, <em>make_request</em> realiza o request, obtém o resultado e ao invés de retorná-lo, invoca outro método, o <em>parse_response</em>. Esse por sua vez, invoca <em>parse_elements</em>, que trata os valores e atributos do xml de resposta. <em>parse_elements</em> retorna um HASH. O retorno de <em>parse_elements</em> é também o retorno de <em>parse_response</em> e de <em>make_request</em>. Ah&#8230; lembra do método que deveria criar uma Transaction? Ele retorna um HASH com o resultado do request.</p>
<blockquote><p>Agora é a hora pra se dizer: &#8220;Que!? Um HASH!? O que isso tem a ver com o TRANSACTION que eu estava esperando?&#8221;</p></blockquote>
<h2>Fatores atenuantes</h2>
<p>Pois é. Esse código viola várias boas práticas. Algumas nem citadas neste artigo. Vale lembrar no entanto que frequentemente, no momento da criação de uma solução, o foco do desenvolvedor não é no design, mas nos pormenores que envolvem a solução do ponto de vista de negócio. A <a title="GESTALT no Wikipedia" href="http://pt.wikipedia.org/wiki/Gestalt" target="_blank">GESTALT</a> defende que não conseguimos focar em mais de uma coisa ao mesmo tempo, logo, no momento da criação desse código o foco não era a excelência técnica. O foco nesse momento era fazer funcionar. Com a ajuda de testes automatizados, com o conceito de refactoring e de TDD em mente, após esse foco inicial, deveríamos perceber o problema e refatorar o código corrigindo problemas de design. É assim que eu vejo o refactoring: <strong><em>O momento em que se busca a excelência técnica após solucionar um problema de negócio</em></strong>.</p>
<h2>Desafio</h2>
<p>Para tornar esse post mais interessante, deixo um desafio pra você:  COMO DEVERIA SER ESSE CÓDIGO APÓS UM BOM REFACTORING? Responda com <a title="Use gists pra colocar código nos comentários." href="http://gist.github.com" target="_blank">gists</a> nos comentários.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/07/refactoring-buscar-excelencia-tecnica/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/07/refactoring-buscar-excelencia-tecnica/</feedburner:origLink></item>
		<item>
		<title>Professional Scrum Developer Java</title>
		<link>http://feedproxy.google.com/~r/craftersblog/~3/inumJICMo80/</link>
		<comments>http://blog.crafters.com.br/2011/06/professional-scrum-developer-java/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 21:40:10 +0000</pubDate>
		<dc:creator>Felipe Rodrigues</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cursos]]></category>
		<category><![CDATA[PSD]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://blog.crafters.com.br/?p=2037</guid>
		<description><![CDATA[Muito tem se falado de Scrum para gestão de projetos de software, de forma que a maioria das empresas estão buscando adotar este framework. Há graus diferentes de adoção no mercado mas todos eles precisam de profissionais qualificados para ajudá-los na sua trajetória.rutoreQuando se adota Scrum em um projeto de software, nunca podemos negligenciar as [...]]]></description>
			<content:encoded><![CDATA[<p>Muito tem se falado de Scrum para gestão de projetos de software, de forma que a maioria das empresas estão buscando adotar este framework. Há graus diferentes de adoção no mercado mas todos eles precisam de profissionais qualificados para ajudá-los na sua trajetória.rutoreQuando se adota Scrum em um projeto de software, nunca podemos negligenciar as práticas de engenharia de software, necessárias para assegurar a qualidade e a produtividade da equipe, assim como reduzir o custo de manutenção do software produzido. Essas práticas não são tão difundidas quanto às práticas de gestão do Scrum, mesmo quando todas as empresas que usam Scrum para software devem utilizá-las.</p>
<p>Diante disso, a Crafters traz o curso de Professional Scrum Developer para o Brasil e América Latina. Um curso oficial da Scrum.org, entidade mantida pelo co-criador do Scrum, Ken Schwaber e montado especificamente para a plataforma Java. Este curso oferece ao participante o conhecimento das práticas de engenharia recomendadas pela comunidade Scrum de todo o mundo, baseado na experiência e vivência de seus instrutores e criadores. Os alunos aprenderão:<br />
<span id="more-2037"></span></p>
<h3>Scrum:</h3>
<ul>
<li>Overview do Scrum</li>
<li>Papéis do Scrum</li>
<li>Artefatos do Scrum (Product Backlog, Sprint Backlog, Release Burndown, Sprint Burndown)</li>
<li>Reunião de Planejamento de Sprint</li>
<li>Execução do Sprint</li>
<li>Daily Scrum</li>
<li>Review</li>
<li>Retrospectivas</li>
</ul>
<h3>Práticas de Desenvolvimento Ágil:</h3>
<ul>
<li>User Stories</li>
<li>Estimativas com Story Point e Planing Poker</li>
<li>Definição de Pronto</li>
<li>Test Driven Development</li>
<li>Qualidade de Código (Code Smells e Refactoring)</li>
<li>Integração Contínua</li>
<li>Programação em Par</li>
<li>Tratamento de Bugs</li>
</ul>
<h3>Teoria e Fundamentos:</h3>
<ul>
<li>Auto-organização</li>
<li>Princípios de sistemas puxados</li>
<li>Melhoria com Inspeção e Adaptação</li>
<li>Critérios de Aceitação</li>
</ul>
<p>&nbsp;</p>
<p>O curso de PSD da Crafters é montado para proporcionar a experiência de um projeto de software o mais próximo da realidade possível. Tem duração de 40 horas, sendo 30% teórico e 70% prático. Os alunos irão desenvolver uma aplicação Java durante o curso, com um ambiente adequado às atividades ágeis previamente montado, preparado para reforçar a experiência de projeto real que o curso traz.</p>
<p>Veja uma tabela mais completa extraída do site da Scrum.org:</p>
<table style="display: table; border-collapse: separate; border-spacing: 2px; border-color: gray; border: 0px solid; color: #000000; text-align: center;">
<tbody style="vertical-align: middle;">
<tr style="background-color: #dddddd; padding: 5px;">
<th></th>
<th>Monday</th>
<th>Tuesday</th>
<th>Wednesday</th>
<th>Thursday</th>
<th>Friday</th>
</tr>
<tr style="background-color: #dddddd; padding: 5px;">
<td style="text-align: center; padding: 5px;"><strong>Morning</strong></td>
<td style="text-align: center; padding: 5px;">Introduction, Introduction to Scrum, Familiarizing with Existing &#8220;Brownfield&#8221; Application, Sprint Planning Meeting</td>
<td style="text-align: center; padding: 5px;">Daily Scrum, User Stories, Review &amp; Retrospective Review Retrospective</td>
<td style="text-align: center; padding: 5px;">Daily Scrum, Test Driven Development, Dependency Injection, Review Retrospective</td>
<td style="text-align: center; padding: 5px;">Daily Scrum, Continuous Integration, Pair Programming, Review Retrospective</td>
<td style="text-align: center; padding: 5px;">Daily Scrum, Review Retrospective, Prepare Presentation</td>
</tr>
<tr style="background-color: #dddddd; padding: 5px;">
<td style="text-align: center; padding: 5px;"><strong>Afternoon</strong></td>
<td style="text-align: center; padding: 5px;" valign="top"><strong>SPRINT 1</strong><br />
Sprint Planning, Daily Scrum, Self-Organising Teams (Push vs Pull)</td>
<td style="text-align: center; padding: 5px;"><strong>SPRINT 2</strong><br />
Sprint Planning, User Stories, Definition of Done, Planning Poker</td>
<td style="text-align: center; padding: 5px;"><strong>SPRINT 3</strong><br />
Sprint Planning, Code Smells, Refactoring, Design for Testability</td>
<td style="text-align: center; padding: 5px;"><strong>SPRINT 4</strong><br />
Sprint Planning, Pair Programming, Refactoring and Tooling Revisited</td>
<td style="text-align: center; padding: 5px;">Presentation 1, Presentation 2, Presentation 3, Q&amp;A, Wrap-up</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Além da experiência que o aluno adquiri durante o curso, ao concluir as 40 horas do curso, o aluno ganha um voucher para realização da prova de certificação Professiona Scrum Developer da Scrum.org. Essa certificação só pode ser conquistada por aqueles que fizerem o treinamento e possibilita um título a mais no Currículo, que pode fazer a diferença na hora da contratação por alguma empresa. O mercado tem buscado cada vez mais profissionais proficientes em Scrum e essa certificação o colocará em destaque.</p>
<p>A primeira turma deste curso será realizada em São Paulo, com parceria da <a title="Globalcode cursos de Java" href="http://www.globalcode.com.br">Globalcode</a>. Veja mais informações sobre isso na <a title="Professional Scrum Developer de Java" href="http://www.crafters.com.br/training/psd">página do curso no site da Crafters</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crafters.com.br/2011/06/professional-scrum-developer-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.crafters.com.br/2011/06/professional-scrum-developer-java/</feedburner:origLink></item>
	</channel>
</rss>

