<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Blog de desenvolvimento da Milfont Consulting, Client e Server-side &#187; Linguagens</title>
	<atom:link href="http://www.milfont.org/tech/category/linguagens/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/tech</link>
	<description>Blog da Comunidade Milfont Consulting, uma empresa especializada em desenvolvimento Web, principalmente Javascript, node.js e muito Javascript.</description>
	<lastBuildDate>Thu, 26 Jan 2012 11:30:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>CoffeeScript</title>
		<link>http://www.milfont.org/tech/2011/07/25/coffeescript/</link>
		<comments>http://www.milfont.org/tech/2011/07/25/coffeescript/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 18:57:55 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[coffeescript]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1407</guid>
		<description><![CDATA[Resolvi falar sobre CoffeeScript porque algumas pessoas com poder de influência em diversas comunidades estão evangelizando essa aberração. História Vou começar pelo começo, aproximadamente entre os anos de 99 e 2009 a comunidade Javascript passou se degladiando sobre o futuro da linguagem, uma parte defendia algo próximo ao ActionScript [exemplo fácil só para um termo [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2011/07/25/coffeescript/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p>Resolvi falar sobre <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a> porque algumas pessoas com poder de influência em diversas comunidades estão evangelizando essa aberração.</p>
<h2>História</h2>
<p>Vou começar pelo começo, aproximadamente entre os anos de 99 e 2009 a comunidade Javascript passou se degladiando sobre o futuro da linguagem, uma parte defendia algo próximo ao ActionScript [exemplo fácil só para um termo de comparação], com classes e outras características que não existem na linguagem que é <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">prototype-based</a>. Venceu a turma conservadora, que defendia js se manter como estava.</p>
<p>Para terem uma idéia da confusão, hoje existe a especificação <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">ECMA 262</a> versão 3 e versão 5, justamente porque a 4 ficou no meio dessa briga e <a href="http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm">nunca chegou a existir</a>.</p>
<h2>Desculpas</h2>
<p>De 2006 pra cá algumas linguagens antigas como ruby e python influenciaram todas as comunidades de desenvolvedores com argumentos &#8211; dos quais concordo em parte &#8211; como expressividade, facilidade na leitura por humanos com menos ruído sintático em vez de apenas performance ou outra característica técnica que poderia muito bem ser trabalhada em um nível inferior (Como por exemplo, para cada linha que voce evita de escrever em Python, existem centenas em C que fazem o trabalho).</p>
<p>Primeiro argumento do uso de Coffeescript é justamente sobre ruído sintático do Javascript, mas inventaram uma SINTAXE NOVA que não é igual a Ruby e nem Python, mas há métodos e características de ambas para justificar seu uso. Ora bolas, porque não terem implementado um subset direto do Ruby?</p>
<p>Incluíram o <a href="http://my.safaribooksonline.com/book/programming/javascript/9781449399115/code-reuse-patterns/klass">Pattern Klass</a> como funcionalidade dessa linguagem sendo que Frameworks antigos como <a href="http://www.prototypejs.org/">Prototype</a> já implementavam isso.</p>
<p>Em Javascript você consegue <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closure</a>, <a href="http://en.wikipedia.org/wiki/Currying">Currying</a> e outras construções funcionais porque function é um cidadão de primeira classe na linguagem, consegue ter <a href="http://en.wikipedia.org/wiki/Mixin">Mixin</a> até mais fácil do que em Ruby porque além de dinâmico é de tipos fracos.</p>
<p>A justificativa de se usar Coffeescript por causa de sintaxe é a mesma de muitos que usam Groovy porque a &#8220;curva&#8221; de Java seria menor. Falácia grave. O problema de um desenvolvedor não aprender uma sintaxe porque é assim ou assado já demonstra em muito que ele não quer aprender as características da linguagem e vai continuar &#8220;programando em Java&#8221; usando Groovy.</p>
<p>Isso é muito comum, já passei por muito programador PHP programando em Ruby como PHP ou programador Java programando em javascript como Java.</p>
<p>Alguns entusiastas de Ruby defendem o uso porque lembraria a sintaxe que se sentem familiar e por ironia citam List Comprehensions, funcionalidade que existe no Python e não no Ruby. Como voce contorna isso no Ruby? Vamos parar com a covardia e sair da zona de conforto?</p>
<h2>Problemas</h2>
<p>Eu tenho um problema com linguagens intermediárias com Enhanced, mas vá lá, podemos viver com isso.</p>
<p>javascript tem muitos problemas, mas não é apenas sintaxe, precisamos normalizar todas as versões e especificações e atacar as fraquezas conhecidas, não sair criando pseudo-linguagem.</p>
<p><a href="http://en.wikipedia.org/wiki/List_comprehension">List Comprehensions</a> que já citamos, <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Array_comprehensions">tem na versão 1.7</a> que o SpiderMonkey implementa (usado pelo Firefox) , mas o V8 (usado no Chrome, Safari e no node.js) não implementa, Rhino implementa e assim vai, uma confusão só. Os navegadores basicamente implementam a versão 1.5 que é equivalente a ECMA 262 &#8211; versão 3 que chamamos de ES3 (ECMA Standard 3), o V8 implementa a ES5 e mantém compatibilidade com 1.5. SpiderMonkey implementa a 1.5, mas não tem compatibilidade entre ES5 e 1.5, se quiser usar funcionalidades definidas na ES5 tem que usar versão 1.8. Confuso? É assim mesmo.</p>
<p>Se Javascript não se encaixa no seu projeto, não a use, é porque não serve mesmo, agora tentar mudar as características (como assincronismo, só para aproveitar o momento e bater em ferramentas como <a href="https://github.com/creationix/step">Step</a>) para se encaixar é querer usar a furadeira para pregar um prego.</p>
<p>Se você é obrigado, já que não existe outra alternativa na camada de apresentação em Webapps (RIP ActionScript <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ), use os frameworks modernos que já implementam o Crossbrowser aceitável (nunca vai ser decente) e se beneficiam de sua idiossincrasia. Coffeescript só está em evidência por causa do node.js, já que há várias bibliotecas e até Frameworks implementados com isso, se a discussão aqui for navegador, nem invente.</p>
<p>Eu por exemplo sinto mais falta de incluírem o &#8220;<a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/noSuchMethod">method_missing</a>&#8221; na especificação do que interpolação de strings.</p>
<p>Ainda pra completar há uma rivalidade entre os defensores de Frameworks como entre o jQuery e Mootools que não sei de onde surgiu, mas nós humanos somos assim mesmo, brigamos por religião e por Framework.</p>
<p>Javascript é de tipos fracos, dinâmicos, sem classes, orientada a protótipos e assíncrono&#8230; aprenda a linguagem. Já basta de uma linguagem a mais para cada chilique de desenvolvedor por causa de um &#8220;{&#8221; ou &#8220;;&#8221;. Como alguém, que não lembro quem foi, escreveu no twitter dias desses: &#8220;Antigamente todo mundo queria seu próprio Framework, hoje todo mundo quer sua própria linguagem&#8221;.</p>
<p>Aproveite e vá me assistir no <a href="http://qconsp.com/palestra/christiano-milfont/combinando-programacao-funcional-e-o-o-em-javascript-de-forma-pratica">QCONSP 2011</a> que vou demonstrar algumas coisas bacanas de se fazer com Javascript e como a sintaxe não atrapalha <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2011/07/25/coffeescript/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Orientação a Objetos em Javascript</title>
		<link>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/</link>
		<comments>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 12:35:29 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1364</guid>
		<description><![CDATA[Post indexador sobre o que escrevi sobre OO em Javascript nesse blog apenas para guardar como referência rápida de consulta, estou revisando todos os posts para verificar o que falta escrever. Name Binding Herança no javascript Overloading e overriding no Javascript]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p>Post indexador sobre o que escrevi sobre OO em <a href="http://www.milfont.org/tech/javascript/">Javascript</a> nesse blog apenas para guardar como referência rápida de consulta, estou revisando todos os posts para verificar o que falta escrever.</p>
<p><a href="http://www.milfont.org/tech/2007/10/01/early-vs-late-binding/">Name Binding</a></p>
<p><a href="http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/">Herança no javascript</a></p>
<p><a href="http://www.milfont.org/tech/2007/10/01/overloading-e-overriding-no-javascript/">Overloading e overriding</a> no Javascript</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso Javascript para JavaCE Social</title>
		<link>http://www.milfont.org/tech/2010/10/28/curso-javascript-para-javace-social/</link>
		<comments>http://www.milfont.org/tech/2010/10/28/curso-javascript-para-javace-social/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 17:07:03 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[javace]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[JavaCE Social]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1099</guid>
		<description><![CDATA[Como prometido ontem, estou doando o curso de javascript para o projeto JavaCE Social, o curso foi formatado para 4 horas, bem focado. O conteúdo para o curso é a seguinte: Javascript: Orientação a Objetos Orientação a objetos Prototyped-Based, objeto literal e JSON Estratégias de construção de objetos (Factory, Constructor, Prototype e escopos de visibilidade) [...]]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2010/10/28/curso-javascript-para-javace-social/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p>Como <a href="http://www.milfont.org/tech/2010/10/27/javace-social/">prometido ontem</a>, estou doando o <a href="http://www.javace.org/novo-curso-para-o-1o-javace-social-iprede/">curso de javascript</a> para o projeto <a href="http://www.javace.org/javace-social/">JavaCE Social</a>, o curso foi formatado para 4 horas, bem focado. O conteúdo para o curso é a seguinte:</p>
<ol>
<li>Javascript: Orientação a Objetos
<ul>
<li>Orientação a objetos Prototyped-Based, objeto literal e JSON</li>
<li>Estratégias de construção de objetos (Factory, Constructor, Prototype e escopos de visibilidade)</li>
</ul>
</li>
<li>Javascript: Funcional
<ul>
<li>Closure e Currying</li>
<li>Array Comprehensions</li>
</ul>
</li>
</ol>
<p>O curso de Javascript completo é cerca de 16h no mínimo, mas dá para demonstrar bastante coisa em 4h. Esse curso serve principalmente para compreender bem como funciona um framework client-side como o Jquery, principalmente se precisar criar ou modificar plugins. Se der tempo pretendo ainda fazer algumas demonstrações de estratégias de otimizações, técnicas de ajax, entre outras coisas.</p>
<p>Vamos usar o firebug para praticar, não dá tempo de instalar e configurar um <a href="http://www.mozilla.org/rhino/">Rhino</a> ou <a href="http://nodejs.org/">Node</a>, então fica para os próximos algo mais avançado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/10/28/curso-javascript-para-javace-social/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Transparência inédita na saúde pública</title>
		<link>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/</link>
		<comments>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:13:01 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[crowds]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Model 3]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[crowd]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[reverse ajax]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=872</guid>
		<description><![CDATA[É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará. O governo do estado inaugurou essa semana &#8220;A Conta do Paciente&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse [...]]]></description>
			<content:encoded><![CDATA[<p>É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará.</p>
<p>O governo do estado <a href="http://diariodonordeste.globo.com/materia.asp?codigo=745869">inaugurou essa semana</a> &#8220;<a href="http://www.ceara.gov.br/noticias/pacientes-poderao-saber-custos-dos-tratamentos">A Conta do Paciente</a>&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse tipo de atuação aproxima o governo da agilidade que a sociedade cobra em relação à transparência nas contas públicas, antes era quase impossível saber o custo real por paciente. Fora que a secretaria vai saber precisamente e em tempo real os custos por unidade, além de facilitar a tomada de decisões que podem salvar vidas.</p>
<p>Esse formulário detalhado com a conta do paciente é possível graças ao <a href="http://pt.wikipedia.org/wiki/Erp">ERP</a> especialista em gestão hospitalar pública da empresa Insystem, nosso cliente e parceiro. A Insytem acreditou em nosso trabalho e é um dos maiores Cases, senão o melhor.</p>
<p>O ERP foi construído 100% com base em <a href="http://www.milfont.org/tech/tag/tdd/">TDD</a> em Java usando DWR, Hibernate e  Spring basicamente. Alguns requisitos necessários de usabilidade utilizam Reverse Ajax com DWR. O sistema é totalmente ajax e utiliza o <a href="http://www.milfont.org/tech/2009/06/29/introducao-ao-ext/">Extjs</a> seguindo a filosofia <a href="http://www.milfont.org/tech/2008/09/08/mvc-model-3-e-camadas/">model 3</a>. Fizemos <a href="http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/">algumas customizações</a> no Extjs para se integrar ao DWR de forma transparente.</p>
<p>Fomos ágeis desde o primeiro momento, mas nunca nos preocupamos em implantação de processo, metodologia ou qualquer coisa que o foco não fosse software saudável. XP foi algo natural, valores e princípios foram assimilados desde o primeiro dia, mas foi e é o software funcionando e livre de erros [o mais livre possível] que nos moveu.</p>
<p>Destaque para o <a href="http://javaneses.wordpress.com/">Felipe Andrade</a>, funcionário da Insystem que se tornou especialista em Extjs com DWR e hoje domina e é talvez o maior conhecedor da união desses Frameworks no estado.</p>
<p>Agradecimentos especiais aos diretores Evando Chaves e Marcelo Meirelles que investiram nessa solução e tiveram a sagacidade de sair na frente da concorrência entendendo que software funcionando é mais importante do que processos bonitos e pomposos, afinal o barco não chega na frente por causa do tambor e sim dos remadores. A Insystem está de parabéns por ter enfrentado todas as correntes contrárias e ter chegado a essa vitória investindo e apostando no fator humano como responsável para a vitória.</p>
<p>Esse é um Case que entrou para a história, estamos procurando outra solução semelhante na saúde pública do Brasil e até agora não encontramos nada.</p>
<p>Orgulhoso por participar dessa conquista.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Você está nivelando por baixo e/ou não conhece seus desenvolvedores</title>
		<link>http://www.milfont.org/tech/2010/01/21/voce-esta-nivelando-por-baixo-eou-nao-conhece-seus-desenvolvedores/</link>
		<comments>http://www.milfont.org/tech/2010/01/21/voce-esta-nivelando-por-baixo-eou-nao-conhece-seus-desenvolvedores/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 14:34:01 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[linguagens dinâmicas]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ruby rails]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2010/01/21/voce-esta-nivelando-por-baixo-eou-nao-conhece-seus-desenvolvedores/</guid>
		<description><![CDATA[Um amigo fez a seguinte pergunta que é muito comum hoje em dia com adoção crescente sobre linguagens dinâmicas, principalmente Ruby: (&#8230;)&#8221;A dúvida era essa: Linguagens dinâmicas dão maiores possibilidades de inclusão de erro no código com isso aumentando de forma significativa a refatoração.&#8221;(&#8230;) Em conversa com um excelente desenvolvedor aqui no Ceará, Delberto Muniz, [...]]]></description>
			<content:encoded><![CDATA[<p>Um amigo fez a seguinte pergunta que é muito comum hoje em dia com adoção crescente sobre linguagens dinâmicas, principalmente Ruby:</p>
<blockquote><p><strong>(&#8230;)&#8221;A dúvida era essa: Linguagens dinâmicas dão maiores possibilidades de inclusão de erro no código com isso aumentando de forma significativa a refatoração.&#8221;(&#8230;)</strong></p></blockquote>
<p>Em conversa com um excelente desenvolvedor aqui no Ceará, <a href="http://twitter.com/delbert_ce">Delberto Muniz</a>, ele escreveu a seguinte resposta:</p>
<blockquote><p>Estava relendo um livro sobre os primórdios da programação e houve um debate semelhante: Os programadores Assembly achavam que programar em Fortan dava maiores possibilidades de erros porquê o programador não tinha total controle sobre o código gerado.</p>
<p>Dez anos depois o pessoal do Fortran falou mal do Algol porquê Algol abstraía demais e o programador não tinha total controle sobre a linguagem.</p>
<p>Aí veio o pessoal do C/C++ dizendo que Java abstraía demais, deixando margens a bugs serem introduzidos nos programas pelo compilador e/ou pela vm ou porquê simplesmente ele não estava alocando/desalocando memória manualmente.</p>
<p>Só mudaram as linguagens &#8211; o debate é sempre o mesmo: Se eu aumentar a abstração, meus programadores vão fazer besteira?<br />
<strong><br />
Se você está com essa dúvida, sinto muito: Você está nivelando por baixo e/ou não conhece seus desenvolvedores.</strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/01/21/voce-esta-nivelando-por-baixo-eou-nao-conhece-seus-desenvolvedores/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Maré de Agilidade</title>
		<link>http://www.milfont.org/tech/2009/08/05/mare-de-agilidade/</link>
		<comments>http://www.milfont.org/tech/2009/08/05/mare-de-agilidade/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 13:56:37 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[CearaOnRails]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[maredeagilidade]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ruby rails]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=731</guid>
		<description><![CDATA[Ontem começou o Maré de Agilidade com o curso RR11 de Ruby on Rails da Caelum com o Fábio Kung, que não precisa de apresentações [se você não sabe quem é Fábio Kung então mude de profissão]. Como o Kung está indo integrar o time da Locaweb, [apesar de continuar como instrutor na Caelum] essa [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.igocoelho.com.br/wp-content/uploads/2009/05/mare_agilidade.jpeg" alt="Mare de Agilidade" /></p>
<p>Ontem começou o <a href="http://www.maredeagilidade.com.br/">Maré de Agilidade</a> com o curso <a href="http://www.caelum.com.br/curso/rr-11-ruby-on-rails/">RR11 de Ruby on Rails</a> da <a href="http://www.caelum.com.br">Caelum</a> com o <a href="http://www.fabiokung.com">Fábio Kung</a>, que não precisa de apresentações [se você não sabe quem é Fábio Kung então mude de profissão].</p>
<p>Como o Kung está <a href="http://fabiokung.com/2009/07/27/status-report-new-job-new-life/">indo integrar o time da Locaweb</a>, [apesar de continuar como instrutor na Caelum] essa é a última oportunidade de tê-lo conosco para ministrar esse curso, a turma foi agraciada com a sorte.</p>
<p><img src="http://s3.amazonaws.com/twitpic/photos/large/21428094.jpg?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&amp;Expires=1249479118&amp;Signature=4CwqGUZlOTxWlDFv3et3mnthV3Q%3D" alt="mare na Milfont Consulting" /></p>
<p>Na quinta e na sexta <a href="http://www.maredeagilidade.com.br/programacao.html">acontecerão os minicursos</a> oficiais do Maré de Agilidade com o <a href="http://manoelpimentel.blogspot.com/">Manoel Pimentel</a> da <a href="http://www.visaoagil.com/">Visão Ágil</a> e a turma da empresa <a href="http://www.seatecnologia.com.br">SEA Tecnologia</a> [ <a href="http://www.maredeagilidade.com.br/palestrantes.html?#willi">Renato Willi</a>, <a href="http://expressocapital.blogspot.com/">Bruno Pedroso</a> e <a href="http://www.maredeagilidade.com.br/palestrantes.html?#alegomes">Alexandre Gomes</a>],  ambos organizadores do evento.</p>
<p>No sábado acontecerão as palestras com todos que ministraram/rão cursos além de <a href="http://blogue.claviustales.com.br/">Clavius Tales</a>, Fabiano Milani da <a href="http://www.adaptworks.com.br/">Adaptworks</a> e um tal de Christiano Milfont.</p>
<p>Todos os minicursos estão com vagas esgotadas, se você quiser ainda participar do Maré de Agilidade, <a href="http://www.fortestreinamentos.com.br/v3/inscricaoOnline.php?id=465">corra para a inscrição das palestras</a> enquanto há tempo.</p>
<p>Para finalizar o Maré, a Adaptworks promove o curso &#8220;Planejamento e estimativas em projetos ágeis&#8221;, através do telefone (11)5585-7738 ou pelo e-mail contato@adaptworks.com.br na sede do CGDT.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/08/05/mare-de-agilidade/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Palestra Test Driven Development</title>
		<link>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/</link>
		<comments>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 10:58:46 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Agilismo]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=600</guid>
		<description><![CDATA[Palestra realizada no evento do grupo XPCE em 28/03/2009. Test Driven Development View more presentations from Christiano Milfont.]]></description>
			<content:encoded><![CDATA[<p>Palestra realizada no evento do grupo <a href="http://groups.google.com.br/group/xpce">XPCE</a> em <a href="../2009/03/27/primeiro-encontro-xpce-mudancas-na-grade/">28/03/2009</a>.</p>
<div id="__ss_1216427" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Test Driven Development" href="http://www.slideshare.net/cmilfont/test-driven-development-1216427?type=presentation">Test Driven Development</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/cmilfont">Christiano Milfont</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Minificação de Javascript com Ant Task</title>
		<link>http://www.milfont.org/tech/2008/12/16/minificacao-de-javascript-com-ant-task/</link>
		<comments>http://www.milfont.org/tech/2008/12/16/minificacao-de-javascript-com-ant-task/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 20:06:34 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[High Performance]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Otimização]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[YUI]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant task]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[minificação]]></category>
		<category><![CDATA[minified]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=459</guid>
		<description><![CDATA[Em um post passado eu falei da importância de unir e minificar arquivos js em determinados casos e discuti &#8220;quando&#8221; fazer isso, vou mostrar &#8220;como&#8221; minificar usando o YUI Compressor com tasks do Apache Ant montados por Viktor Lieskovsky do Javaflight. Esse pequeno tutorial-guia faz parte do material dos meus cursos de Javascript e Ajax [...]]]></description>
			<content:encoded><![CDATA[<p>Em um <a href="http://www.milfont.org/tech/2008/02/10/javascript-inline-e-external/">post passado</a> eu falei da importância de unir e minificar arquivos js em determinados casos e discuti &#8220;quando&#8221; fazer isso, vou mostrar &#8220;como&#8221; minificar usando o <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a> com tasks do <a href="http://ant.apache.org/">Apache Ant</a> <a href="http://code.google.com/p/javaflight-code/">montados por Viktor Lieskovsky</a> do <a href="http://javaflight.blogspot.com/">Javaflight</a>.</p>
<p>Esse pequeno tutorial-guia faz parte do material dos meus cursos de Javascript e Ajax e serve para deixar um histórico acessível aos alunos e fácil para leitores que por ventura precisem.</p>
<p>Preparei um ambiente de execução com todas as dependências no <a href="http://www.milfont.org/tech/projetos/">projeto</a> <a href="http://code.google.com/p/remendux/">Remendux</a> onde vocês podem fazer <a href="http://code.google.com/p/remendux/source/checkout">checkout</a> e rodar o build ant localmente como um projeto do eclipse &#8211; estou usando o plugin para o <a href="http://subclipse.tigris.org/">SVN Subclipse</a>.</p>
<p>Montei um script ant padrão bem simples de ser entendido por iniciantes:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;jsmin&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;main&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #808080; font-style: italic;">&lt;!-- Propriedades para definir nomes de pastas que usaremos --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;js&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;js&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;build&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;lib&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;lib&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;output&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;output&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #808080; font-style: italic;">&lt;!-- Propriedades para definir nomes os arquivos necessários --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor.jar&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${lib}/yuicompressor-2.4.2.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor-ant-task.jar&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${lib}/yui-compressor-ant-task-0.3.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #808080; font-style: italic;">&lt;!-- Incluir as libs necessárias no classpath --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;task.classpath&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pathelement</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${yui-compressor.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pathelement</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${yui-compressor-ant-task.jar}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #808080; font-style: italic;">&lt;!-- Definição da task para o Ant reconhecer --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;taskdef</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;yui-compressor&quot;</span> </span>
<span style="color: #009900;"><span style="color: #000066;">classname</span>=<span style="color: #ff0000;">&quot;net.noha.tools.ant.yuicompressor.tasks.YuiCompressorTask&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;classpath</span> <span style="color: #000066;">refid</span>=<span style="color: #ff0000;">&quot;task.classpath&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/taskdef<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;clean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;build&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;output&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;build&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;output&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;main&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;clean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #808080; font-style: italic;">&lt;!-- Tag do Ant para concatenar arquivos </span>
<span style="color: #808080; font-style: italic;">		[ http://ant.apache.org/manual/CoreTasks/concat.html] </span>
<span style="color: #808080; font-style: italic;">		os arquivos são unidos na sequência de definição </span>
<span style="color: #808080; font-style: italic;">		no fileset</span>
<span style="color: #808080; font-style: italic;">		--&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;concat</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${output}/remendux.js&quot;</span> <span style="color: #000066;">force</span>=<span style="color: #ff0000;">&quot;no&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${js}/util.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${js}/remendux.js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/concat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #808080; font-style: italic;">&lt;!-- Task do yui-compressor --&gt;</span>
		 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;yui-compressor</span> <span style="color: #000066;">warn</span>=<span style="color: #ff0000;">&quot;false&quot;</span>  <span style="color: #000066;">munge</span>=<span style="color: #ff0000;">&quot;true&quot;</span>  </span>
<span style="color: #009900;">				<span style="color: #000066;">preserveallsemicolons</span>=<span style="color: #ff0000;">&quot;false&quot;</span> </span>
<span style="color: #009900;">				<span style="color: #000066;">fromdir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${build}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/yui-compressor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Após a importação, para executar o script &#8211; que chamei de build-yui.xml &#8211; basta apenas executar com o ant pelo eclipse &#8211; vide imagem abaixo &#8211; ou em linha de comando. Estou usando o Ant 7.1 com java 6u10 e Eclipse 3.4, portanto caso haja um erro atente para a versão das ferramentas usadas.</p>
<p><img src="http://www.milfont.org/tech/wp-content/uploads/2008/12/build.jpg" alt="" title="build"  class="aligncenter size-medium wp-image-464" /></p>
<p>Após executar, observe a redução de tamanho na versão minificada [../build/remendux-min.js] para a versão concatenada [../output/remendux.js ]. A versão final ficou com 30% do tamanho com documentação e identação.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;">Buildfile<span style="color: #808080;">:</span> C<span style="color: #808080;">:</span>\workspace\remendux\build<span style="color: #808080;">-</span>yui<span style="color: #808080;">.</span>xml
     <span style="color: #808080;">&#91;</span>echo<span style="color: #808080;">&#93;</span> Building <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">output</span>
clean<span style="color: #808080;">:</span>
    <span style="color: #808080;">&#91;</span>mkdir<span style="color: #808080;">&#93;</span> Created dir<span style="color: #808080;">:</span> C<span style="color: #808080;">:</span>\workspace\remendux\build
    <span style="color: #808080;">&#91;</span>mkdir<span style="color: #808080;">&#93;</span> Created dir<span style="color: #808080;">:</span> C<span style="color: #808080;">:</span>\workspace\remendux\<span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">output</span>
main<span style="color: #808080;">:</span>
<span style="color: #808080;">&#91;</span>yui<span style="color: #808080;">-</span>compressor<span style="color: #808080;">&#93;</span>
 <span style="color: #808080;">&#91;</span><span style="color: #3399ff;">30</span><span style="color: #808080;">%</span><span style="color: #808080;">&#93;</span> remendux<span style="color: #808080;">.</span>js <span style="color: #808080;">&#91;</span><span style="color: #3399ff;">5775</span><span style="color: #808080;">&#93;</span> <span style="color: #808080;">---&gt;</span> <span style="color: #202020;">remendux</span><span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">min</span><span style="color: #808080;">.</span>js <span style="color: #808080;">&#91;</span><span style="color: #3399ff;">1734</span><span style="color: #808080;">&#93;</span>
<span style="color: #808080;">&#91;</span>yui<span style="color: #808080;">-</span>compressor<span style="color: #808080;">&#93;</span>
 <span style="color: #808080;">&#91;</span>JavaScript<span style="color: #808080;">&#93;</span> Compressed <span style="color: #3399ff;">1</span> files <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> <span style="color: #3399ff;">30</span><span style="color: #808080;">%</span> <span style="color: #808080;">&#40;</span>5KB <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> 1KB<span style="color: #808080;">,</span> saving 4KB<span style="color: #808080;">&#41;</span>
<span style="color: #808080;">&#91;</span>yui<span style="color: #808080;">-</span>compressor<span style="color: #808080;">&#93;</span>
 <span style="color: #808080;">&#91;</span>CSS<span style="color: #808080;">&#93;</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">No</span> files <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> compress<span style="color: #808080;">,</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">or</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">all</span> files already <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">up to</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">date</span>
<span style="color: #808080;">&#91;</span>yui<span style="color: #808080;">-</span>compressor<span style="color: #808080;">&#93;</span>
 Compressed <span style="color: #3399ff;">1</span> files <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> <span style="color: #3399ff;">30</span><span style="color: #808080;">%</span> <span style="color: #808080;">&#40;</span>5KB <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> 1KB<span style="color: #808080;">,</span> saving 4KB<span style="color: #808080;">&#41;</span>
BUILD SUCCESSFUL
Total <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">time</span><span style="color: #808080;">:</span> <span style="color: #3399ff;">12</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">seconds</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/16/minificacao-de-javascript-com-ant-task/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criteria na JPA 2.0: Public Review!</title>
		<link>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/</link>
		<comments>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:13:53 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Criteria]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=450</guid>
		<description><![CDATA[Na &#8220;Public Review&#8221; da JSR317 &#8211; que trata da JPA 2.0 &#8211; foi adicionado suporte a Criteria API na especificação. Pode ser que em menos de dois anos possamos evoluir nessa especificação e usar menos as implementações, minha esperança é que melhorem pelo menos até a versão final, programada para o início de 2009. Como [...]]]></description>
			<content:encoded><![CDATA[<p>Na &#8220;<a href="http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html">Public Review</a>&#8221; da <a href="http://jcp.org/en/jsr/detail?id=317">JSR317</a> &#8211; que trata da JPA 2.0 &#8211; foi adicionado suporte a <a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#querycriteria">Criteria API</a> na especificação. Pode ser que em menos de dois anos possamos evoluir nessa especificação e usar menos as implementações, minha esperança é que melhorem pelo menos até a versão final, programada para o início de 2009.</p>
<p>Como sempre criaram uma nomenclatura totalmente diferente para entidades da API, dificultando o entendimento da comunidade com anos de uso da única implementação que possuía essa API: <a href="http://www.hibernate.org/">Hibernate</a>. Comparem a <a href="http://www.milfont.org/docs/hibernate-3.2/doc/api/">API de Criteria do Hibernate</a> com a <a href="http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html">API de Criteria da Spec</a>. Ok, podemos aceitar isso, política&#8230;</p>
<p>Faltou muita coisa ainda, mas parece que estão trabalhando para melhorar até a versão final, pelo visto DELETE_ORPHAN vai sair de alguma forma:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Target<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>METHOD, FIELD<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> @Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> OneToMany <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">Class</span> targetEntity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #000066; font-weight: bold;">void</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">;</span>
    CascadeType<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> cascade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    FetchType fetch<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> LAZY<span style="color: #339933;">;</span>
    <span style="color: #003399;">String</span> mappedBy<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>   
    <span style="color: #000066; font-weight: bold;">boolean</span> orphanRemoval<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nota para os leitores:</p>
<blockquote><p>Open Issue: We also discussed the alternative of introducing a separate annotation for the orphanRemoval functionality and the alternative of introducing a REMOVE_ORPHAN cascade<br />
option. We would welcome feedback on the form that this metadata should take.</p></blockquote>
<p>Não encontrei nada sobre como manipular as estratégias de fetching &#8211; que é primordial &#8211; nos relacionamentos como temos no Hibernate: <span class="emphasis"><em>Select fetching, </em></span><span class="emphasis"><em>Subselect fetching, </em></span><span class="emphasis"><em>Join fetching e </em></span><span class="emphasis"><em>Batch fetching. </em>Nem a API de Criteria possui estratégia com FetchMode, apenas uma &#8220;Issue&#8221; aberta para a interface FetchJoinObject que deverá trabalhar isso, eu espero.<em><br />
</em></span></p>
<p>Ainda assim continuamos <a href="http://www.milfont.org/tech/2008/10/27/especificacao-ou-implementacao/">indicando o uso do Hibernate direto ao invés da especificação</a> até que a especificação seja estável o suficiente com features decentes para um desenvolvimento sério em Java. A API de Criteria da implementação Hibernate continua ainda muito superior principalmente se você precisar de consultas <a href="http://blog.caelum.com.br/2008/09/11/divisions-com-hibernate-uso-avancado-da-criteria-api/">um pouco mais avançadas</a>.</p>
<p>Confiram o material e decidam.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Existem balas de prata!</title>
		<link>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/</link>
		<comments>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 09:12:18 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Bala de prata]]></category>
		<category><![CDATA[Silver Bullet]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=434</guid>
		<description><![CDATA[Existe um tipo de falácia bem comum que está crescendo ultimamente se aproveitando da célebre frase: Não existe bala de prata! Quando invocamos a necessidade de não considerar todos os problemas como um prego e a única arma um martelo, não estamos fornecendo a chave da irrestrita flexibilidade irresponsável. Quando assumimos que em tudo depende, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet1.jpg"><img class="alignleft size-medium wp-image-435" title="silverbullet1" src="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet1.jpg" alt="" width="133" height="138" /></a></p>
<p>Existe um tipo de falácia bem comum que está crescendo ultimamente se aproveitando da célebre frase: <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet">Não existe bala de prata</a>!</p>
<p>Quando invocamos a necessidade de não considerar todos os problemas como um prego e a única arma um martelo, não estamos fornecendo a chave da irrestrita flexibilidade irresponsável.</p>
<p>Quando assumimos que em tudo depende, não estamos dizendo que não há uma fronteira. O avanço significativo do cálculo só foi possível com o advento do limite matemático.</p>
<p>Fazer ciência é investigar e fazer a pergunta certa ao contrário da resposta certa. Para isso identificamos padrões e formulamos teorias.</p>
<p>Antes de abandonar uma teoria devemos substituí-la por outra mais apropriada. Isso soa conservador mas é preciso para se fazer ciência, propor o abandono de uma determinada teoria sem a substituição por outra mais adequada é leviano.</p>
<p>Para entender como algo funciona não podemos simplesmente achar que qualquer solução é válida e sim descobrir qual a solução adequada.</p>
<p>Entender que existem soluções mais apropriadas &#8211; e que sim, existe um jeito certo ou um modo melhor de se fazer algo &#8211; não quer dizer que outras abordagens simplesmente estão erradas,  podem ser apenas incompletas e/ou inviáveis.</p>
<p>Em muitas discussões que tenho travado ultimamente sempre quando tento argumentar que uma solução específica é melhor do que determinada outra, ouço:</p>
<p>&#8220;Não existem balas de prata&#8221;. Bingo!</p>
<p>Essa pessoa não entende ou não quer aceitar por motivo qualquer que a solução dela está errada ou não satisfaz.</p>
<p>Aqui a proposta é pontual, para determinado conjunto de fatores existe uma solução mais adequada, isso é fato.</p>
<h2>Existem Balas de prata!</h2>
<p>Mas como somos fans de <a href="http://en.wikipedia.org/wiki/Supernatural_(TV_series)">Supernatural</a>, sabemos que o que mata é acertar no coração. O trabalho deve ser direcionado a combater a complexidade no coração do problema e não simplesmente num jogo de escolher a ferramenta certa.</p>
<p>Na área de desenvolvimento de software a maioria dos desenvolvedores se apegam a uma metodologia/ferramenta/arquitetura e tentam encaixá-la para a construção de qualquer sistema. Não entendem que aquela solução não vai resolver todos os problemas.</p>
<p>Até aqui tudo bem, o problema é aproveitar a defesa de que não existe uma ferramenta para todos os propósitos e considerar que &#8220;não existe o melhor&#8221; ou a &#8220;forma apropriada&#8221;, quando justamente por não existir ferramenta universal é que devemos usar algo por sua especialidade.</p>
<p><a href="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet2.jpg"><img class="alignright size-medium wp-image-441" title="silverbullet2" src="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet2.jpg" alt="" width="139" height="139" /></a></p>
<p>O <a href="http://www.manifestoagil.com.br/">manifesto ágil</a> tem um trecho que diz:</p>
<blockquote><p>&#8220;Estamos descobrindo maneiras <strong>melhores de desenvolver software</strong> fazendo-o nós mesmos e ajudando outros a fazê-lo.&#8221;</p></blockquote>
<p>Observe que ele diz &#8220;<strong>melhores</strong>&#8221; e não &#8220;<strong>diferente</strong>&#8221; ou &#8220;<strong>de outra forma</strong>&#8220;.</p>
<p>No final diz:</p>
<blockquote><p>&#8220;Ou seja, mesmo havendo valor nos itens à direita, valorizamos mais os itens à esquerda.&#8221;</p></blockquote>
<p>Aqui reconhece que os itens à direita não estão errados, apenas que os da esquerda levam a uma melhor forma de tratar o campo específico que é desenvolver software.</p>
<p>Tentar levar o manifesto ágil para gestão de projetos, construção civil ou limpeza da sua casa o faz ser uma bala de prata e que não vai matar nada porque você não está atigindo o coração, apenas tentando criar um martelo genérico para um uso universal.</p>
<p>Todo o &#8220;KnowHow&#8221; associado ao manifesto ágil se refere única e exclusivamente ao processo de desenvolver software da melhor forma, atinge o pontual.</p>
<p><em>Agiletards </em>sabem ser chatos também quando seguem metodologias de caixinhas e querem criar um novo dogma de desenvolvimento de software.</p>
<p>Existe o melhor e a forma mais adequada, procurar é nosso dever!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

