<?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"
	>

<channel>
	<title>Tecnologia de Internet</title>
	<atom:link href="http://tecblog.locaweb.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://tecblog.locaweb.com.br</link>
	<description></description>
	<pubDate>Tue, 25 Nov 2008 02:34:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>QCon - Frameworks and DDD: Keeping the Model Clean</title>
		<link>http://tecblog.locaweb.com.br/2008/11/24/qcon-frameworks-and-ddd-keeping-the-model-clean/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/24/qcon-frameworks-and-ddd-keeping-the-model-clean/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 02:34:27 +0000</pubDate>
		<dc:creator>Fernando de Amorim</dc:creator>
		
		<category><![CDATA[.net]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[Técnicas de Desenvolvimento de Software]]></category>

		<category><![CDATA[ddd]]></category>

		<category><![CDATA[frameworks]]></category>

		<category><![CDATA[qcon]]></category>

		<category><![CDATA[qconsf2008]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=87</guid>
		<description><![CDATA[Tim McCarthy é autor de &#8220;.NET Domain-Driven Design with C#: Problem - Design - Solution&#8220;, um livro que propõe mostrar os passos da implementação de uma aplicação real utilizando DDD. O livro é dividido em módulos, cada um identificando um problema, elaborando o design e implementando a solução.
Em sua apresentação, ele mostrou algumas técnicas para [...]]]></description>
			<content:encoded><![CDATA[<p>Tim McCarthy é autor de &#8220;<a title=".NET Domain-Driven Design with C#: Problem - Design - Solution" href="http://www.wrox.com/WileyCDA/WroxTitle/-NET-Domain-Driven-Design-with-C-Problem-Design-Solution.productCd-0470147563.html" target="_blank">.NET Domain-Driven Design with C#: Problem - Design - Solution</a>&#8220;, um livro que propõe mostrar os passos da implementação de uma aplicação real utilizando <a title="Domain-Driven Design" href="http://domaindrivendesign.org/" target="_blank">DDD</a>. O livro é dividido em módulos, cada um identificando um problema, elaborando o design e implementando a solução.</p>
<p>Em sua <a title=".NET Domain-Driven Design with C#: How to keep your domain model clean while working inside of frameworks" href="http://qconsf.com/sf2008/presentation/.NET+Domain-Driven+Design+with+C%23%3A++How+to+keep+your+domain+model+clean+while+working+inside+of+frameworks" target="_blank">apresentação</a>, ele mostrou algumas técnicas para desacoplar o modelo de domínio da infra-estrutura da aplicação e ainda sim continuar usando recursos de frameworks em .NET.</p>
<p style="text-align: center;"><a href="http://tecblog.locaweb.com.br/wp-content/uploads/2008/11/ddd.jpg" target="_blank"><img class="aligncenter size-medium wp-image-88" title="Frameworks and DDD: Keeping the Model Clean - Tim McCarthy" src="http://tecblog.locaweb.com.br/wp-content/uploads/2008/11/ddd-300x199.jpg" alt="Frameworks and DDD: Keeping the Model Clean - Tim McCarthy" width="300" height="199" /></a></p>
<p>A idéia é sempre deixar o domínio intacto, somente com o código do coração do software. Se você utilizar as famosas ferramentas de &#8220;arrastar e soltar&#8221;, vai poluir as entidades do domínio com código de infra-estrutura.</p>
<p>Quando falou a respeito do <a title="ADO.NET Entity Framework" href="http://msdn.microsoft.com/en-us/library/bb399572.aspx" target="_blank">ADO.NET Entity Framework</a>, o novo framework de mapeamento objeto-relacional da Microsoft, Tim se expressou indignado: &#8220;Oh, my God!&#8221;. Segundo ele, arrastar e soltar tabela por tabela do seu banco de dados, deixando o Visual Studio gerar um monte de código para você é algo não muito bom para se fazer.</p>
<p>Essas ferramentas de geração de código podem ser uma armadilha para desenvolvedores inexperientes. Para sistemas pequenos, sem grandes pretensões, isso pode ser uma solução rápida e que atende sua necessidade. Mas para grandes aplicações é preciso se concentrar no domínio e eliminar qualquer código que polua suas entidades de negócio.</p>
<p>Não é uma boa idéia criar um modelo de domínio fazendo a relação de uma entidade por tabela no banco de dados. As tabelas do banco de dados pertencem à infra-estrutura do sistema. O seu modelo de domínio deve ser rico e refletir seu negócio, o mais próximo da realidade possível. A partir do seu modelo de domínio é que você constrói uma infra-estrutura de persistência de dados.</p>
<p>A apresentação de Tim McCarthy foi repleta de exemplos reais (e rodando) de código. Num deles, mostrou uma classe de entidade do domínio onde havia uma referência using para o namespace Microsoft.SharePoint. Esse foi um tipico exemplo de entidade de negócio poluída.</p>
<p>Também tivemos um exemplo de utilização de <a title="Repository" href="http://martinfowler.com/eaaCatalog/repository.html" target="_blank">repositórios (Repository)</a>, que segundo Tim, são um tipo de abstração da persistência, comparando-os como um tipo de coleção de dados, onde é possível listar, inserir, alterar e remover seus itens. Ele enfatizou que o classes do modelo de domínio podem usar repositórios, mas elas devem estar ligadas somente às interfaces dos repositórios, não acopladas às suas implementações.</p>
<p>Outra parte &#8220;prática&#8221; da apresentação foi a utilização de <a title="Dependency Injection" href="http://martinfowler.com/articles/injection.html" target="_blank">injeção de dependência (Dependency Injection)</a> de repositórios nas classes de serviço e alteração do tipo de persistência via arquivo de configuração.</p>
<p>Tim também mostrou a implementação de uma <a title="Unit of Work" href="http://martinfowler.com/eaaCatalog/unitOfWork.html" target="_blank">unidade de trabalho (Unit of Work)</a>, onde a mesma não conversava diretamente com a base de dados.</p>
<p>A apresentação excedeu 10 minutos do tempo previsto, pois tinha muito código interessante a ser mostrado. Isso só acabou instigando a dar uma olhada no seu livro, que vem com o código fonte de todos os passos de construção de uma aplicação em .NET aplicando os padrões de DDD.</p>
<p>Só não esqueça que todo esse código somente vai poder lhe ajudar se você definir bem seu modelo de domínio, consistente e conciso com a realidade do seu negócio.<br />
<span style="color: #ffffff;">.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/24/qcon-frameworks-and-ddd-keeping-the-model-clean/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon San Francisco 2008 - Entrevistas</title>
		<link>http://tecblog.locaweb.com.br/2008/11/24/qcon-san-francisco-2008-entrevistas/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/24/qcon-san-francisco-2008-entrevistas/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 19:12:01 +0000</pubDate>
		<dc:creator>AkitaOnRails</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Técnicas de Desenvolvimento de Software]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[couchdb]]></category>

		<category><![CDATA[erlang]]></category>

		<category><![CDATA[futuro]]></category>

		<category><![CDATA[qcon]]></category>

		<category><![CDATA[tendencias]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=86</guid>
		<description><![CDATA[Semana passada participei da QCon San Francisco 2008. Um evento da InfoQ que une diversos grandes nomes em diferentes áreas da tecnologia. Assuntos como Agile, SOA, Rest, Ruby e muito mais. Durante o evento, eu fiz várias entrevistas em áudio com alguns desses nomes.

Yehuda Katz - da Engine Yard, Mantenedor do Merb, nos explica sobre o [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada participei da <a href="http://qconsf.com/">QCon San Francisco 2008</a>. Um evento da InfoQ que une diversos grandes nomes em diferentes áreas da tecnologia. Assuntos como Agile, SOA, Rest, Ruby e muito mais. Durante o evento, eu fiz várias entrevistas em áudio com alguns desses nomes.</p>
<ul>
<li><a href="http://www.akitaonrails.com/2008/11/19/rails-podcast-brasil-qcon-special-yehuda-katz">Yehuda Katz</a> - da Engine Yard, Mantenedor do Merb, nos explica sobre o novo framework Web Merb, a biblioteca de ORM DataMapper e as recentes discussões sobre frameworks Web em Ruby.</li>
<li><a href="http://www.akitaonrails.com/2008/11/20/rails-podcast-brasil-qcon-special-jan-lenhardt-and-chris-anderson-from-couchdb">Jan Lehnard e Chris Anderson</a> - Core Committers do CouchDB, nos levam numa extensa jornada sobre o banco de dados orientado a documentos, CouchDB. Do que se trata, quais as principais características e onde ele se encaixa nesse novo cenário de bancos de dados não-relacionais.</li>
<li><a href="http://www.akitaonrails.com/2008/11/21/rails-podcast-brasil-qcon-special-nick-sieger-jruby-and-francesco-cesarini-erlang">Nick Sieger</a> - da Sun, Core Committer do JRuby, nos fala mais sobre o desenvolvimento do projeto JRuby, sobre como ele já é estável, rápido e compatível com o Ruby MRI (o oficial). Fala também sobre sua adição de Connection Pools no novo Rails 2.2.</li>
<li><a href="http://www.akitaonrails.com/2008/11/21/rails-podcast-brasil-qcon-special-nick-sieger-jruby-and-francesco-cesarini-erlang">Francesco Cesarini</a> - da Erlang Training and Consulting, com seus 15 anos de experiência com a linguagem Erlang, nos explica porque essa linguagem é tão poderosa e como a boa e velha programação funcional acidentalmente resolve os problemas modernos de computação paralela, concorrência e escalabilidade massiva.</li>
<li><a href="http://www.akitaonrails.com/2008/11/21/rails-podcast-brasil-qcon-special-john-straw-yellowpages-com-and-matt-aimonetti-merb">John Straw</a> - da YellowPages.com, nos conta como sua equipe substituiu um antigo projeto legado Java de 150 mil linhas de código, por um sistema altamente escalável de apenas 13 mil linhas de código Ruby on Rails, onde metade são testes automatizados.</li>
<li><a href="http://www.akitaonrails.com/2008/11/21/rails-podcast-brasil-qcon-special-john-straw-yellowpages-com-and-matt-aimonetti-merb">Matt Aimonetti</a> - Core Commiter e principal Evangelizador do projeto Merb, nos explica quais as diferenças com Ruby on Rails, em que cenários ele leva vantagem, suas principais características e aplicações.</li>
<li><a href="http://www.akitaonrails.com/2008/11/22/rails-podcast-brasil-qcon-special-ola-bini-jruby-ioke">Ola Bini</a> - da ThoughtWorks, num especial de quase 2 horas de duração, detalha diferentes estilos de programação que são ignorados pelo mercado de programação mas que agora voltam a ser altamente relevantes. Lambdas, High Order Functions, Prototypes, Condition System, Side-Effects, Message Passing e muito mais.</li>
</ul>
<p><span id="more-86"></span></p>
<p>Dentre alguns dos keynotes do evento, tanto Kent Beck quanto Tim Bray discutiram sobre tendências. Foi muito interessante notar que ambos estão ohando para <strong>CouchDB</strong> com muito interesse. O fato de haver várias palestras sobre Ruby, Erlang e assuntos relacionados também me deixou muito interessado. Além disso, claro, tivemos grandes nomes como Martin Fowler, Eric Evans, Ralph Johnson falando sobre Agile, Domain Driven Design e outros assuntos relacionados ao mundo Ágil.</p>
<p>Todos que estão envolvidos no mundo de tecnologia - e realmente gostam de tecnologia - provavelmente já devem estar adorando a idéia de que finalmente programação funcional talvez encontre seu nicho num mercado maior, o de alta escalabilidade. Para isso linguagens como Erlang provavelmente serão mais usadas.</p>
<p>Aos não iniciados, vamos recapitular: o mercado &#8216;atual&#8217; fala muito de Java, C#, PHP. A maioria das faculdades prepara as pessoas apenas para essas plataformas, paradigma Imperativo e Declarativo, derivados da era Fortran. Isso é pouco.</p>
<p>Se ainda não perceberam, chegamos ao fim da era do Gigahert, onde para um programa rodar mais rápido bastava esperar no ano que vem surgir um processador com mais Gigahertz. O mundo agora é de processamento paralelo. Qualquer notebook hoje já vem equipado com dois Cores.</p>
<p>Nesse sentido, programação monolítica é um problema grave. Programação com threads também não ajuda em nada e é recomendado somente se tudo que poderia ser feito antes já foi feito. Thread é algo tão ruim quanto os antigos GOTOs. O problema: estado compartilhado de memória. A solução: programação livre de efeitos colaterais.</p>
<p>Por acaso é exatamente isso que uma outra linhagem de linguagens vêm fazendo há décadas: as <strong>Linguagens Funcionais</strong>, derivadas de Lisp. Erlang é uma linguagem dessa categoria, criada pela Ericsson há 20 anos para criar sistemas de telecomunicação de altíssima-disponibilidade.</p>
<p>Linguagens orientadas a objeto como C# já flertaram com parte dessa idéia com construções como LINQ, que está na última versão do C#.</p>
<p>Erlang, por sua vez, foi usado para criar dois dos bancos de dados que estão para mudar o ambiente Relacional: o Amazon SimpleDB e o Apache CouchDB, o primeiro comercial e o segundo open source, ambos são bancos de dados não-relacionais, orientados a Documentos.</p>
<p>Esqueçam Joins, esqueçam chaves estrangeiras, triggers, stored procedures. Num mundo Web de crescimento massivo, esse tipo de recurso simplesmente não escala. Para ter uma idéia, existe hoje um projeto chamado Drizzle, que é uma versão do MySQL sendo modificado para não ter nenhum dos recursos que mencionei aqui. Sites enormes, como Facebook e Digg, simplesmente não usam mais esses recursos. Em cenários onde alta escalabilidade é um objetivo, a solução é escapar das limitações do mundo relacional e o CouchDB é um maiores proponentes a isso.</p>
<p>Finalmente, está claro que a filosofia Ágil já se provou com a única forma de desenvolver software de maneira sustentável, com qualidade e sucesso. Ainda há muito a se aprender, muitas pessoas e empresas ainda não entenderam como estão jogando dinheiro fora com metodologias tradicionais, mas num mundo em crise financeira, onde cada dólar gasto precisa ter valor, é uma boa hora para pensar de maneira séria em desenvolver software da maneira correta: com metodologias (e, principalmente, filosofia) Ágil e tecnologia Open Source.</p>
<p>O que eu vi na QCon está muito claro: a tendência é que os melhores programadores do mercado serão efetivamente os que dominarem não somente as tecnologias tradicionais (linguagens imperativas, bancos relacionais) mas também as que vão efetivamente solucionar os problemas de escalabilidade (linguagens funcionais, bancos não-relacionais) e, mais do que isso, as empresas de sucesso serão somente as que realmente entenderem a maneira Ágil de se pensar em software.</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/24/qcon-san-francisco-2008-entrevistas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon - TDD in a DbC World</title>
		<link>http://tecblog.locaweb.com.br/2008/11/21/qcon-tdd-in-a-dbc-world/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/21/qcon-tdd-in-a-dbc-world/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 00:12:51 +0000</pubDate>
		<dc:creator>carlos.mendonca</dc:creator>
		
		<category><![CDATA[.net]]></category>

		<category><![CDATA[Técnicas de Desenvolvimento de Software]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=84</guid>
		<description><![CDATA[Quinta-feira, durante a track sobre .NET, Greg Young falou sobre Design by Contract (DbC) como metodologia para enriquecer o TDD. Para isso ele apresentou o Spec#, uma linguagem desenvolvida pela Microsoft Research e usada, entre outros projetos, no sistema operacional Singularity (sim, o Windows e o Windows CE não são os únicos sistemas operacionais da [...]]]></description>
			<content:encoded><![CDATA[<p>Quinta-feira, durante a track sobre .NET, <a href="http://codebetter.com/blogs/gregyoung/">Greg Young</a> falou sobre <a href="http://en.wikipedia.org/wiki/Design_by_contract">Design by Contract (DbC)</a> como metodologia para enriquecer o TDD. Para isso ele apresentou o Spec#, uma linguagem desenvolvida pela Microsoft Research e usada, entre outros projetos, no sistema operacional <a href="http://www.codeplex.com/singularity">Singularity</a> (sim, o Windows e o Windows CE não são os únicos sistemas operacionais da Microsoft). O Spec# está sendo descontinuado, mas as funcionalidades de DbC estão sendo portadas para o C# em forma de <a href="http://research.microsoft.com/contracts/">bibliotecas</a>.</p>
<p>A idéia fundamental aqui é que com TDD você quer testar <em>behaviour </em>(comportamento) e <em>constraint </em>(restrição). Imagine um método que não pode receber argumentos nulos. Tipicamente você colocaria um bloco <em>if </em>e caso o argumento fosse nulo você lançaria algo como uma ArgumentNullException, mas antes deveria ter criado um teste para o caso do seu método receber o argumento nulo.</p>
<p>Agora imagine que você tenha, através da linguagem, um modo de estabelecer os contratos dos métodos. Neste caso você poderia escrever algo assim:</p>
<blockquote><p>void SomeMethod(object someArgument)<br />
    requires someArgument != null;<br />
{<br />
    // &#8230;<br />
}</p></blockquote>
<p>Esta palavra-chave <em>requires </em>é uma pré-condição (ou um <em>guard</em>). Ele estabelece um contrato que diz que o método SomeMethod não pode ser chamado caso o argumento someArgument seja nulo. Há vários outros tipos de contrato como invariantes e pós-condições, mas o importante de se entender aqui é que se o compilador for inteligente o suficiente para interpretar esta informação adicional, ele será capaz de fazer uma análise estática e determinar se o método SomeMethod é inválido ou pode ser inválido por causa do argumento que está recebendo de quem o está chamando.</p>
<p>Isto é especialmente poderoso, pois introduziria a “luz amarela” no seu ciclo de desenvolvimento TDD e eliminaria vários testes que com DbC são redundantes. Como se fala no mundo ágil que você deveria apenas testar o que possui <em>business value</em>, essas condições de contorno não precisariam ser testadas, pois seriam cobertas pelo DbC (a menos que as condições de contorno possuam, excepcionalmente, algum <em>business value</em>).</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/21/qcon-tdd-in-a-dbc-world/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon - HTTP Status Report</title>
		<link>http://tecblog.locaweb.com.br/2008/11/21/qcon-http-status-report/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/21/qcon-http-status-report/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 18:53:17 +0000</pubDate>
		<dc:creator>Maurício Dediana</dc:creator>
		
		<category><![CDATA[Sem Categoria]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=81</guid>
		<description><![CDATA[Essa foi uma palestra bastante pesada feita por Mark Nottingham, que trabalha no Yahoo! desenvolvendo e traçando estratégias para uso de web services RESTful, além de ser proponente e participante de especificações, como Atom, stale-if-error e stale-while-revalidate.
Ao longo de uma hora ele passou por diversos temas relacionados ao estado do HTTP hoje. Começou comentando sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Essa foi uma <a href="http://qconsf.com/sf2008/presentation/HTTP+Status+Report">palestra</a> bastante pesada feita por <a href="http://www.mnot.net/">Mark Nottingham</a>, que trabalha no Yahoo! desenvolvendo e traçando estratégias para uso de web services RESTful, além de ser proponente e participante de especificações, como <a href="http://www.ietf.org/rfc/rfc4287.txt">Atom</a>, <a href="http://www.mnot.net/drafts/draft-nottingham-http-stale-if-error-00.txt">stale-if-error</a> e <a href="http://www.mnot.net/drafts/draft-nottingham-http-stale-while-revalidate-00.txt">stale-while-revalidate</a>.</p>
<p>Ao longo de uma hora ele passou por diversos temas relacionados ao estado do HTTP hoje. Começou comentando sobre o grupo de trabalho <a href="http://www.ietf.org/html.charters/httpbis-charter.html">Hypertext Transfer Protocol Bis</a>, que visa revisar a <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616</a> (que especifica o HTTP 1.1) para torná-la mais clara, evitando problemas de interpretação que costumam ocorrer em implementações. Deixou claro que o grupo não deve adicionar nada à especificação, apenas organizá-la melhor. O protocolo foi separado em sete partes, e cada uma delas possui um documento próprio, ainda em draft: URIs, Connections, and Message Parsing, Message Semantics, Message Payload and Content Negotiation, Conditional Requests, Range Requests and Partial Responses, Caching e Authentication. Em teoria os trabalhos acabam em seis meses.</p>
<p>Depois disso, Mark Nottingham falou sobre o estado atual e perspectivas de vários tópicos, como o estado de implementação atual de clientes, servidores e intermediários, e especificações e implementações relacionadas a URIs, headers, caching, etc.</p>
<p>Ainda falou sobre o <a href="http://tools.ietf.org/html/draft-dusseault-http-patch-04">draft para a especificação de PATCH</a>, um novo método a ser adicionado no HTTP 1.1. Por sinal, com o uso cada vez mais disseminado de arquiteturas orientadas a recursos, esse método faz cada vez mais sentido, e foi comentado mais duas vezes na track de REST do evento. A questão é que um PUT implica em mandar <strong>todas</strong> as  informações sobre o recurso novamente para o servidor, o que muitas vezes é pouco prático e ineficiente.</p>
<p>Ao final, fez alguns comentários sobre o que chamou de O2.0, que são os padrões abertos de segurança que surgiram nos últimos tempos, como <a href="http://openid.net/">OpenID</a> e <a href="http://oauth.net/">OAuth</a>. A crítica que fez a eles foi a de que costumam se alinhar com o mínimo denominador comum de tecnologias existentes e que costumam simplificar excessivamente algumas questões de arquitetura, como ignorar a existência de intermediários, por exemplo.</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/21/qcon-http-status-report/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon - Can Patterns Help Quality?</title>
		<link>http://tecblog.locaweb.com.br/2008/11/21/qcon-can-patterns-help-quality/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/21/qcon-can-patterns-help-quality/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 07:50:24 +0000</pubDate>
		<dc:creator>Fernando de Amorim</dc:creator>
		
		<category><![CDATA[Técnicas de Desenvolvimento de Software]]></category>

		<category><![CDATA[patterns]]></category>

		<category><![CDATA[qcon]]></category>

		<category><![CDATA[qconsf2008]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=82</guid>
		<description><![CDATA[Existem algumas formas de mensurar a qualidade de um software, como performance, escalabilidade, segurança, usabilidade, manutenabilidade, reutilização, disponibilidade, etc. Mas existem algumas distinções sobre a perspectiva de qualidade.
Joseph Yoder, em sua apresentação &#8220;Software Patterns and Quality: Can Patterns Help Quality?&#8221; na QCon San Francisco 2008, distinguiu a qualidade de software em:

Qualidade interna
Qualidade externa

Com as seguintes [...]]]></description>
			<content:encoded><![CDATA[<p>Existem algumas formas de mensurar a qualidade de um software, como performance, escalabilidade, segurança, usabilidade, manutenabilidade, reutilização, disponibilidade, etc. Mas existem algumas distinções sobre a perspectiva de qualidade.</p>
<p>Joseph Yoder, em sua apresentação <a title="Software Patterns and Quality: Can Patterns Help Quality?" href="http://qconsf.com/sf2008/presentation/Software+Patterns+and+Quality%3A+Can+Patterns+Help+Quality%3F" target="_blank">&#8220;Software Patterns and Quality: Can Patterns Help Quality?</a>&#8221; na <a title="QCon San Francisco 2008" href="http://qconsf.com" target="_blank">QCon San Francisco 2008</a>, distinguiu a qualidade de software em:</p>
<ul>
<li>Qualidade interna</li>
<li>Qualidade externa</li>
</ul>
<p>Com as seguintes perspectivas:</p>
<ul>
<li>Do desenvolvedor</li>
<li>Do usuário final</li>
<li>Do gerente (manager)</li>
<li>Do CEO</li>
</ul>
<p>Por exemplo, o valor da qualidade de um software para um usuário final (qualidade externa) é totalmente diferente da visão de qualidade do desenvolvedor (qualidade interna). A qualidade do código ou do design do software não faz sentindo para o usuário, se o software não atende suas expectativas ou suas necessidades.</p>
<p>Na grande maioria dos casos, o usuário final quer saber se o software funciona, não se foi feito utilizando as melhores práticas de desenvolvimento ou com um determinado tipo de arquitetura. Em muitas situações, o próprio CEO tem essa concepção de valor de qualidade do usuário final.</p>
<p><a href="http://tecblog.locaweb.com.br/wp-content/uploads/2008/11/dsc00087.jpg" target="_blank"><img class="alignnone size-medium wp-image-83" title="QCon - Can Patterns Help Quality? - Joseph Yoder" src="http://tecblog.locaweb.com.br/wp-content/uploads/2008/11/dsc00087-300x225.jpg" alt="QCon - Can Patterns Help Quality? - Joseph Yoder" width="300" height="225" /></a></p>
<p>A qualidade interna nem sempre é alcançada facilmente. Pode haver dificuldades como algum custo adicional, prazo de entrega, investimentos na equipe, etc. Em cima dessas dificuldades, muitos pensam em qualidade de software de maneira quantitativa, tentando achar números para os tipos de qualidade: por exemplo, o quanto esse software é expansível, o quanto esse código e fácil de dar manutenção ou quão seguro é esse sistema.</p>
<p>Yoder usou o termo QWAN (Quality without a name), de <a title="Christopher Alexander" href="http://en.wikipedia.org/wiki/Christopher_Alexander" target="_blank">Christopher Alexander</a> para essas qualidades internas, as quais realmente não podem ser quantificadas. Os padrões de projeto (design patterns) ajudam a aumentar a qualidade interna do software, exatamente em cima das QWANs. Identificando o problema ou situação onde há necessidade de aumento de qualidade, escolhendo e aplicando o padrão adequado, a qualidade interna do software é afetada.</p>
<p>Algo que foi enfatizado na apresentação é a questão da definição dos padrões de projeto. Uma boa idéia de solução de um determinado problema de software não é um padrão. Essa idéia pode se tornar um padrão, depois de aplicada várias vezes. Os padrões vão de encontro com a experiência de utilização de soluções para problemas que se tornam comuns entre aplicações.</p>
<p>Padrões de projetos aplicados a uma determinada qualidade podem algumas vezes beneficiar outras qualidades do software. Um exemplo interessante mostrado foi a necessidade de aumentar a segurança em um sistema. Aplicando um padrão de segurança para essa necessidade, houve também um aumento de performance no sistema.</p>
<p>Existe uma série de padrões de projetos que vão muito <a href="http://hillside.net/patterns/books/alpha.html" target="_blank">além dos clássicos GoF</a>. Em geral, todos os padrões de projeto no final das contas acabam se referindo ao aumento de qualidade de software. O livro <a title="Implementation Patterns de Kent Beck" href="http://www.informit.com/store/product.aspx?isbn=0321413091" target="_blank">Implementation Patterns de Kent Beck</a> fala exatamente sobre padrões para criar código de qualidade.</p>
<p>Por outro lado, querer aumentar demais a qualidade, procurando a fórmula do código perfeito, pode gerar problemas. A perfeição no desenvolvimento do software acaba sendo inimiga da qualidade e, de fato é, inimiga da flexibilidade.</p>
<p>Em algumas situações é necessário usar a qualidade de &#8220;o bom o suficiente&#8221;, onde o software alcança os requisitos mínimos e atende as expectativas.</p>
<p>O que serve de lição é:<br />
- Conheça sua necessidade de aumento de qualidade<br />
- Estude os padrões<br />
- Identifique os padrões que se adequam à situação em questão<br />
- Aplique os padrões de forma concisa</p>
<p>Ah, e continue tendo boas idéias para aumentar a qualidade de seu código, mesmo que elas nunca se tornem padrão de projeto algum dia.</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/21/qcon-can-patterns-help-quality/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon - Responsive Design</title>
		<link>http://tecblog.locaweb.com.br/2008/11/20/qcon-responsive-design/</link>
		<comments>http://tecblog.locaweb.com.br/2008/11/20/qcon-responsive-design/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 22:20:53 +0000</pubDate>
		<dc:creator>Maurício Dediana</dc:creator>
		
		<category><![CDATA[Sem Categoria]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[qcon]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=80</guid>
		<description><![CDATA[A apresentação de Kent Beck sobre Responsive Design começou com 10 minutos de atraso porque as pessoas não paravam de chegar para vê-lo falar. Havia pessoas em pé no fundo e nos cantos da sala e sentadas no chão do corredor.
Logo no início deixou claro que a apresentação tratava do entendimento que ele têm sobre [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://qconsf.com/sf2008/presentation/Responsive+Design">apresentação</a> de Kent Beck sobre Responsive Design começou com 10 minutos de atraso porque as pessoas não paravam de chegar para vê-lo falar. Havia pessoas em pé no fundo e nos cantos da sala e sentadas no chão do corredor.</p>
<p>Logo no início deixou claro que a apresentação tratava do entendimento que ele têm sobre seu próprio processo de design. A idéia por trás de tudo é garantir um<strong> fluxo constante de implementação de funcionalidades</strong>, ou seja, adicionar uma funcionalidade após a outra sempre no mesmo ritmo. Para isso ser possível deve-se investir constantemente no design, de outra forma o que pode acontece é haver a necessidade de se parar de tempos em tempos para &#8220;ajeitar&#8221; o design para que ele possa suportar as próximas funcionalidades.</p>
<p>Depois disso, deu uma definição muito precisa para design: design são elementos relacionados beneficamente. Olhando por esse ponto de vista, design é livre de escala e não há diferença entre arquitetura e design, o que convencionou-se chamar de arquitetura é apenas design em um nível mais alto.</p>
<p>A partir daí falou sobre as coisas que compõem seu processo de design: valores, padrões, princípios, estratégias e refactoring, comentando mais sobre os três últimos.</p>
<p>Com relação a princípios, Kent Beck diferenciou os princípios universais dos específicos. Os primeiros são aqueles que se aplicam a qualquer software, como o DRY (&#8221;don&#8217;t repeat yourself&#8221;), por exemplo, enquanto os outros fazem parte da especificação de um software em particular (como &#8220;o sistema nunca deve deixar de escrever uma informação no banco de dados, mesmo em caso de falha&#8221;).</p>
<p>A parte mais tangível da apresentação foram as quatro estatégias para se evoluir o design:</p>
<p>- <strong>Leap</strong>: Sequência de pequenos passos na direção desejada. É importante que sejam pequenos para garantir que caso o código quebre no meio do caminho seja possível se voltar atrás. O tamanho dos passos depende de vários fatores - ferramentas, risco, experiência do programador, etc.</p>
<p>- <strong>Parallel</strong>: Manter dois designs diferentes que realizam a mesma coisa durante um certo período de tempo. Depois que o segundo design está estabelecido, pode-se começar a mover os clientes do design anterior para o novo.</p>
<p>- <strong>Stepping Stone</strong>: Quando o passo a ser dado para entender o problema é muito grande, adiciona-se uma etapa intermediária que ajude a chegar mais perto do destino final. Frameworks e APIs são exemplos dessa categoria. A diferença fundamental entre Leap e Stepping Stone é que o primeiro é o objetivo final, enquanto o segundo é o meio para se chegar ao objetivo.</p>
<p>- <strong>Simplification</strong>: Inserir ou retirar restrições no design para torná-lo mais fácil de ser trabalhado.</p>
<p>Por último falou sobre refactoring e de como vê o conceito ligeiramente diferente da forma como Martin Fowler o apresentou. Para ele todo refactoring é bi-direcional: se é possível criar um método novo a partir de um código existente, deve ser possível também subtituir as chamadas a um método pela sua implementação, por exemplo. Também comentou que achava que refactorings deveriam ser cidadãos de primeira classe nas linguagens, e não apenas modificações em arquivos texto, podendo inclusive ser incluídos com o código no controle de versão.</p>
<p>Para finalizar a apresentação Kent Beck reforçou que o princípio básico por trás disso tudo é garantir um fluxo constante de implementação de funcionalidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/11/20/qcon-responsive-design/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Evolução de Versionamento de Código: GIT</title>
		<link>http://tecblog.locaweb.com.br/2008/10/27/evolucao-de-versionamento-de-codigo-git/</link>
		<comments>http://tecblog.locaweb.com.br/2008/10/27/evolucao-de-versionamento-de-codigo-git/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 16:05:10 +0000</pubDate>
		<dc:creator>AkitaOnRails</dc:creator>
		
		<category><![CDATA[Técnicas de Desenvolvimento de Software]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[subversion]]></category>

		<category><![CDATA[svn]]></category>

		<category><![CDATA[versionamento]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=78</guid>
		<description><![CDATA[Uma coisa que não é mais sequer discutível é: todo projeto de software, independente do tamanho, precisa de um sistema de versionamento de código. Isso é imperativo. Mesmo com apenas um desenvolvedor, controlar as revisões, versões e modificações no projeto não é algo que se possa considerar opcional.
O problema seguinte é: qual sistema de versionamento? [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tecblog.locaweb.com.br/wp-content/uploads/2008/10/linus-torvalds-prezinta-un-nou-sistem-de-control-linux-2.jpg"><img class="alignleft size-full wp-image-79" title="Linus Torvalds" src="http://tecblog.locaweb.com.br/wp-content/uploads/2008/10/linus-torvalds-prezinta-un-nou-sistem-de-control-linux-2.jpg" alt="Criador do Git" width="220" height="244" /></a>Uma coisa que não é mais sequer discutível é: todo projeto de software, independente do tamanho, precisa de um sistema de versionamento de código. Isso é imperativo. Mesmo com apenas um desenvolvedor, controlar as revisões, versões e modificações no projeto não é algo que se possa considerar opcional.</p>
<p>O problema seguinte é: qual sistema de versionamento? A maioria dos desenvolvedores hoje está acostumado com CVS, Subversion ou mesmo Microsoft SourceSafe. Eles ajudam, com certeza, mas felizmente hoje sabemos que é possível fazer muito melhor, na realidade, ordens de grandeza melhor.</p>
<p>Linus Torvalds, o pai da kernel Linux, tinha esse problema: como controlar as colaborações de código vindas de centenas de programadores ao redor do mundo? No começo o controle era essencialmente manual, com pedaços de código sendo inseridos e testados manualmente. É um sistema altamente trabalhoso e que com o tempo tende a ser impossível. Logo no começo ele decidiu que não usaria nem CVS, nem Subversion. Resolveu optar por BitKeeper, um sistema essencialmente diferente por ser <strong>DISTRIBUÍDO</strong>. Essa é a palavra-chave. Mas nem ele era perfeito (além de ser comercial, o que irritou muitos da comunidade). Por isso, Linus olhou novamente o mercado e, na opinião dele, não havia nenhuma opção aceitável, portanto ele mesmo resolveu desenvolver seu próprio sistema de versionamento distribuído, de onde nasceu o <a href="http://git.or.cz/">GIT</a>.</p>
<p>Não perca nosso <a href="http://locawebcast.com.br/ProEventos.aspx" target="_blank">WebCast</a> no dia <strong>7 de novembro</strong>, onde pretendo dar um resumo sobre as funcionalidades do GIT.</p>
<p><span id="more-78"></span></p>
<h2>Futuro: Sistemas Distribuídos</h2>
<p>Sistemas de Versionamento Distribuídos (DVCS) sao muito diferentes de Sistemas Centralizados. Num fluxo de trabalho normal centralizado, cada desenvolvedor tem em sua máquina apenas a última revisão do projeto. Todo o resto, o histórico, fica armazenado num servidor central. Qualquer operação de atualização precisa necessariamente ocorrer via rede, portanto você só pode trabalhar se estiver conectado na sua rede local da empresa ou via internet. Ninguém pode gravar nada no servidor sem autorização, o que torna a colaboração em projetos open source muito mais complicada.</p>
<p>Com Sistemas Distribuídos, cada desenvolvedor tem em sua máquina local um clone completo do repositório original. No caso do Git, o repositório é extremamente otimizado. Por exemplo, a última revisão de código do Ruby on Rails tem cerca de 25Mb, já o repositório com todo o código, atualizações e modificações feita desde 2004, consome pouco mais de 20Mb.</p>
<p>Mais do que isso, como o repositório está todo local, o desenvolvedor não tem nenhum problema de permissão de escrita: está tudo local na máquina dele. Isso dá outra possibilidade: trabalhar totalmente offline, sem rede nem internet.</p>
<p>Como cada desenvolvedor tem o repositório inteiro em sua máquina, o que se chamaria de &#8220;servidor central&#8221; é apenas um dos clones que é elegido como &#8220;principal&#8221;, mas qualquer um pode preencher esse papel. Se eventualmente o &#8220;servidor&#8221; sofrer uma perda irreversível, não há problema: a natureza distribuída garante que qualquer um dos repositórios clonados possa ser eleita como &#8220;principal&#8221; e o fluxo nunca é quebrado.</p>
<p>Sobre colaboração, é inclusive possível que sub-equipes se formem para trabalhar numa determinada parte do projeto e só quando estiver pronto, mesclar as novidades com o repositório &#8220;principal&#8221;, de onde todos os outros podem puxar as atualizações. Isso flexibiliza muito a organização do trabalho.</p>
<p>No Git, trabalhar com &#8220;branches&#8221; é algo trivial e corriqueiro, sendo inclusive motivado. Isso facilita que os desenvolvedores trabalhem em partes diferentes do projeto, ao mesmo tempo. O desenvolvedor tem muito mais flexibilidade para organizar seu próprio trabalho.</p>
<p>Tudo isso se traduz em maior produtividade, maior segurança - já que não existe ponto único de falha, e uma consequência para equipes ágeis é também mais possibilidades de código de mais qualidade.</p>
<p>Aliás, é exatamente por ser descentralizada que a Internet pode existir: se fosse centralizada ela jamais escalaria até este ponto. Redes descentralizadas como a Internet são resistentes a falhas aleatórias e podem aumentar quase infinitamente.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/4XpnKHJAok8&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/4XpnKHJAok8&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
<h2>Usando Git</h2>
<p>Aprenda um pouco mais sobre Git no blog <a href="http://www.akitaonrails.com/2008/10/2/entendendo-git-e-instalando-gitorious-git-via-web" target="_blank">AkitaOnRails</a>.</p>
<p>Os planos de Hospedagem Compartilhada Linux da Locaweb suportam GIT faz meses. Diferente de Subversion ou CVS, não é necessário instalar servidores à parte ou configurar nada extra, sequer um ambiente web. Tudo pode ser resolvido via SSH.</p>
<p>Para começar, vou assumir que você está usando Linux, Mac ou um ambiente Unix. Vamos criar uma chave SSH e exportá-la para sua conta. Se estiver no Windows, siga estas <a href="http://kylecordes.com/2008/04/30/git-windows-go/">instruções</a>.</p>
<blockquote><p>ssh-keygen -t rsa</p></blockquote>
<p>Esse comando perguntará sobre senha, passphrase, apenas dê Enter para deixar tudo vazio. Isso criará os arquivos ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub</p>
<p>Agora precisamos transferir esse arquivo ao servidor:</p>
<blockquote><p>scp ~/.ssh/id_rsa.pub seu_login@seu_servidor:~/.ssh/authorized_keys</p></blockquote>
<p>Pronto, com isso você não precisa mais digitar a senha para fazer login na sua conta via SSH. Toda vez que estiver na sua máquina, o SSH usará o par de chaves criado para fazer a autenticação. Proteja bem sua chave privada em ~/.ssh/id_rsa.</p>
<p>Para criar um novo repositório GIT, faça o seguinte:</p>
<blockquote><p>ssh seu_login@seu_servidor<br />
mkdir -p repo/meu_projeto<br />
cd repo/meu_projeto<br />
git init</p></blockquote>
<p>Digite &#8216;exit&#8217; para voltar à sua máquina local. Agora crie um repositório local de GIT. Para isso escolha o projeto que quer versionar ou apenas crie um novo projeto, como no exemplo:</p>
<blockquote><p>rails meu_projeto<br />
cd meu_projeto<br />
git init<br />
git add .<br />
git commit -a -m &#8220;Initial Commit&#8221;</p></blockquote>
<p>Agora é só ligar as duas pontas. A partir do diretório do seu projeto, na máquina local, faça o seguinte:</p>
<blockquote><p>git remote add origin ssh://seu_login@seu_servidor:repo/meu_projeto<br />
git push origin master</p></blockquote>
<p>Pronto. Agora seu servidor está com todo o seu código. Você pode usar &#8220;git push&#8221; toda vez que quiser atualizar o servidor.</p>
<p>Se quiser que outro usuário, em outra máquina, use seu repositório. Crie um novo par de chaves SSH como mostrado acima. Daí faça o seguinte:</p>
<blockquote><p>scp ~/.ssh/id_rsa.pub seu_login@seu_servidor:~/.ssh<br />
ssh seu_login@seu_servidor<br />
cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys</p></blockquote>
<p>Pronto, isso adicionará uma nova chave à sua conta e permitirá o outro usuário de acessar seu repositório. Para que ele possa começar a colaborar, ele pode fazer, da máquina dele:</p>
<blockquote><p>git clone ssh://seu_login@seu_servidor:repo/meu_projeto</p></blockquote>
<p>Isso criará um clone na máquina local dele. Como expliquei, será um clone completo, com todo o histórico desde o primeiro commit feito por você. Ele pode contribuir usando &#8220;git push&#8221; e ambos podem pegar as atualizações que o outro fez no servidor usando o comando &#8220;git pull&#8221;.</p>
<h2>Usando Branches</h2>
<p>O modelo que expliquei acima é apenas uma das formas de colaboração. Novamente, veja <a href="http://www.akitaonrails.com/search?q=git&amp;x=0&amp;y=0">este link</a>, para mais detalhes.</p>
<p>A partir do seu projeto, na máquina local, você pode usar o comando &#8220;git branch&#8221;. Ele mostrará algo assim:</p>
<blockquote><p>&gt;&gt; git branch<br />
* master</p></blockquote>
<p>Ou seja, por padrão, o GIT sempre usa Branches e o primeiro branch criado automaticamente é o master. Inclusive é onde as atualizações vindas do seu repositório remoto vão residir. É uma boa prática sempre fazer seu desenvolvimento em outra branch separada, desta forma:</p>
<blockquote><p>git checkout -b novo_branch</p></blockquote>
<p>Feito isso você pode desenvolver normalmente no &#8220;novo_branch&#8221;. Toda vez que quiser puxar atualizações do servidor faça isto:</p>
<blockquote><p>git checkout master<br />
git pull<br />
git checkout novo_branch<br />
git rebase master</p></blockquote>
<p>Isso fará o seguinte:</p>
<ol>
<li>voltará o branch &#8220;master&#8221;</li>
<li>puxará as modificações que foram feitas no repositório remoto para dentro de &#8220;master&#8221;</li>
<li>muda de volta ao branch &#8220;novo_branch&#8221;</li>
<li>mescla as mudanças vindas do servidor no &#8220;novo_branch&#8221;</li>
</ol>
<p>É possível que, de tempos em tempos, você tenha conflitos (dois desenvolvedores mexeram no mesmo arquivo, exatamente na mesma linha). Nesse caso o comando &#8220;git rebase master&#8221; acima vai falhar e dizer qual arquivo é o ofensor. Nesse caso você deve abrir esse arquivo e resolver o conflito manualmente, e feito isso faça o seguinte:</p>
<blockquote><p>git add arquivo_corrigido<br />
git rebase &#8211;continue</p></blockquote>
<p>Daí o Git continuará o resto das mesclagens. Se ainda assim aparecer outra mensagem de erro sobre o mesmo arquivo, apenas faça &#8220;git rebase &#8211;skip&#8221;. O Git não faz mesclagens usando apenas as últimas revisões dos códigos: ele sabe usar a genealogia do conteúdo do arquivo. Por isso sua heurística de mesclagem é muito mais inteligente.</p>
<p>Toda vez que quiser gravar no seu repositório local alguma modificação para que não se perca, faça commit:</p>
<blockquote><p>git commit -a -m &#8220;descricao deste commit&#8221;</p></blockquote>
<p>Ao contrário do Subversion ou CVS, &#8220;commit&#8221; não manda nada ao servidor remoto, isso é tarefa do comando &#8220;git push&#8221;. O commit apenas empacota e grava as últimas modificações de código. É recomendado que se faça isso com bastante frequência para que você nunca perca nada e ainda possa mudar de idéia e voltar commits. Por exemplo, se quiser apagar os últimos 2 commits, por exemplo, faça assim:</p>
<blockquote><p>git reset &#8211;soft HEAD^2</p></blockquote>
<p>Isso irá desfazer os últimos 2 commits e suas modificações ainda estarão no lugar, daí você pode alterar o que precisar e fazer um novo commit.</p>
<p>Daí, digamos que você terminou o que estava desenvolvendo no &#8220;novo_branch&#8221;, e quer enviar tudo para o servidor. Sempre faça o processo de rebase como mostrado acima, para garantir que seu &#8220;novo_branch&#8221; está sincronizado com as últimas atualizações do servidor. Daí faça:</p>
<blockquote><p>git checkout master<br />
git merge master<br />
git push<br />
git branch -d novo_branch</p></blockquote>
<p>Esses comandos farão o seguinte:</p>
<ol>
<li>Volta ao branch &#8220;master&#8221;</li>
<li>Mescla todas as mudanças do branch &#8220;novo_branch&#8221; para o master</li>
<li>Envia os commits mesclados ao servidor</li>
<li>Apaga o branch &#8220;novo_branch&#8221;</li>
</ol>
<p>Na realidade existe um processo ainda melhor:</p>
<blockquote><p>git checkout master<br />
git merge novo_branch &#8211;squash<br />
git commit -a -m &#8220;descricao da nova funcionalidade&#8221;<br />
git push<br />
git branch -d novo_branch</p></blockquote>
<p>A diferença é a opção &#8220;&#8211;squash&#8221;. Digamos que no &#8220;novo_branch&#8221; você tinha 50 commits. Mas você não quer que apareça 50 commits no servidor. Faz mais sentido que o que você fez no &#8220;novo_branch&#8221; suba como um único commit que engloba uma nova funcionalidade, uma correção de bug ou uma nova documentação, por exemplo, então você pode &#8220;esmagar&#8221; os 50 commits em apenas 1 para manter tudo limpo e organizado no repositório remoto central.</p>
<p>Feito isso, os outros desenvolvedores com acesso ao repositório central podem fazer &#8220;git pull&#8221; e receberão suas modificações.</p>
<p>Como podem ver, o Git oferece muitas ferramentas e opções. Aqui acabei de mostrar o topo do iceberg, muito mais pode ser feito. O repositório do Git é muito robusto (ainda nunca ouvi falar de repositórios git corrompidos), muito rápido (roda local e as ferramentas de linha de comando são feitas em C, pelo próprio Linus) e garante a produtividade que você precisa num ambiente ágil.</p>
<p>Instale o Git na sua máquina local (usuários Windows, instalem o <a href="http://code.google.com/p/msysgit/">msysGit</a>) e aproveitem desde já o suporte a Git que a Locaweb já lhe fornece em suas contas Linux compartilhada. Outro detalhe: não, o Git ainda não tem nenhuma ferramenta visual competente. Por outro lado, o poder do Git só é liberado se o desenvolvedor tiver o conhecimento dos processos explicados acima. Escondê-los não ajudará em nada. Se seu desenvolvedor não conseguir aprender como usar o Git, o problema talvez seja reavaliar as capacidades desse desenvolvedor.</p>
<p>O uso do Git cresceu exponencialmente nos últimos meses. O website GitHub concentra a maioria dos projetos open source em repositórios Git. Ele nasceu há 1 ano e, começando do zero, hoje tem mais de 19 mil projetos em Git. O próprio Ruby on Rails, fora a kernel do Linux, estão em repositórios Git. Mais do que isso, graças à ferramenta git-svn é possível sincronizar (tanto leitura quanto escrita) com repositórios em Subversion, o que permite migração praticamente trivial de Subversion para Git.</p>
<p>Experimente e aprenda esta nova ferramenta. Alguns dos melhores desenvolvedores do mundo e projetos open source já estão migrando para Git. Aumente a produtividade na sua empresa adotando Git.</p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/10/27/evolucao-de-versionamento-de-codigo-git/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why Perl</title>
		<link>http://tecblog.locaweb.com.br/2008/10/21/why-perl/</link>
		<comments>http://tecblog.locaweb.com.br/2008/10/21/why-perl/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 14:24:34 +0000</pubDate>
		<dc:creator>otavio.fernandes</dc:creator>
		
		<category><![CDATA[Linguagens de Programação]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[Shell Scripts]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[scripts]]></category>

		<category><![CDATA[unix-like]]></category>

		<category><![CDATA[why perl]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=77</guid>
		<description><![CDATA[
Há alguns anos atrás eu precisava de uma boa ferramenta para concentrar anti-spam, anti-vírus, e muitas outras funções, dentre as possíveis escolhas eu elegi o Amavisd-new, por ser um projeto maduro e com referencias fortes. E, em um determinado momento eu estava cercado por situações nas quais eu não encontrava saída, mesmo nas listas de [...]]]></description>
			<content:encoded><![CDATA[<p>
<div style="text-align: justify;">Há alguns anos atrás eu precisava de uma boa ferramenta para concentrar anti-spam, anti-vírus, e muitas outras funções, dentre as possíveis escolhas eu elegi o <a href="http://www.ijs.si/software/amavisd/"><span style="font-weight: bold;">Amavisd-new</span></a>, por ser um projeto maduro e com referencias fortes. E, em um determinado momento eu estava cercado por situações nas quais eu não encontrava saída, mesmo nas listas de discussão e documentação, então, senti-me &#8220;<span style="font-style: italic;">obrigado</span>&#8221; a ler os fontes. Inicialmente foi uma das piores experiências da minha vida, o software é todo escrito em <a href="http://en.wikipedia.org/wiki/Perl">Perl</a> (claro!) e na época tinha mais de 18 mil linhas de código&#8230; Porem, foi também, uma das melhores oportunidades da minha vida profissional! Vou explicar o porque.</div>
<div style="text-align: justify;">
<p>Para quem não tem muita experiência com a linguagem, <span style="font-weight: bold;"><a href="http://en.wikipedia.org/wiki/Perl">Perl</a> é um tanto</span> quanto <span style="font-weight: bold;">complicado</span>, pois tem uma estrutura bastante diferenciadas e utiliza elementos que <span style="font-weight: bold;">não são auto-explicativos</span>. Ou seja, sem conhecer a linguagem eu não poderia entender como aquele software trabalha.</p>
<p>Comecei então a procurar um bom artigo ou tutorial sobre introdução e na maioria deles eu era <span style="font-weight: bold;">redirecionado às <a href="http://en.wikipedia.org/wiki/Manpages">manpages</a></span>. Na época me parecia estranho aprender uma linguagem de programação através de suas <a href="http://en.wikipedia.org/wiki/Manpages">manpages</a>, pois eu nunca havia pensado nisso.  No entanto, segui o conselho e comecei: <span style="font-weight: bold;">&#8220;$ <a href="http://perldoc.perl.org/">perldoc</a> perl&#8221;</span>. Devo admitir, <span style="font-weight: bold;">tudo o que você precisa, quer ou terá necessidade estão em suas <a href="http://en.wikipedia.org/wiki/Manpages">manpages</a></span>, e todo o conteúdo está  mais do que bem explicado, cheio de exemplos e textos adicionais. Sem dúvida, as <a href="http://perldoc.perl.org/">manpages do Perl</a> são mais do que suficientes.</p>
<p><a href="http://en.wikipedia.org/wiki/Perl"><span style="font-weight: bold;">Perl</span></a> é uma linguagem <span style="font-weight: bold;">extremamente poderosa e madura</span>, criada por <a href="http://en.wikipedia.org/wiki/Larry_Wall">Larry Wall</a> em 1987 com o enfoque de ter recursos para processamento de texto, foi principalmente influenciada por <a href="http://en.wikipedia.org/wiki/ANSI_C">C</a>, <a href="http://en.wikipedia.org/wiki/Shell_script">Shell Script</a>, <a href="http://en.wikipedia.org/wiki/Awk">AWK</a>, <a href="http://en.wikipedia.org/wiki/Sed">Sed</a> e <a href="http://en.wikipedia.org/wiki/Lisp">Lisp</a>, hoje, <a href="http://en.wikipedia.org/wiki/Perl">Perl</a> encontra-se na versão <a href="http://dev.perl.org/perl5/">5.10</a>, e <span style="font-weight: bold;">está presente em quase todas as plataformas</span>.</p>
<p><span style="font-weight: bold;">Afinal, Porque Perl?</span></p>
</div>
<ul style="text-align: justify;">
<li>Com mais de 20 anos de idade esta linguagem está mais do que consolidada no mercado, hoje é praticamente impossível ver um sistema operacional unix-like sem o seu interpretador, e mais, sem ter dezenas de scripts para as mais variadas funções, escritos em Perl;</li>
<li>É o canivete-suíço das linguagens de programação pois, comprovadamente, é flexível e adaptável;</li>
<li>Sua sintaxe é inspirada em linguagem C (ANSI), então, é simples, direta e prazerosa de escrever;</li>
<li>Reúne as listas de Lisp, os <a href="http://en.wikipedia.org/wiki/Associative_arrays">Arrays Associativos</a> do AWK e as <a href="http://en.wikipedia.org/wiki/Regular_expressions">Expressões Regulares</a> do Sed, ou seja, o melhor destes mundos com inúmeras outras inovações;</li>
<li>Também suporta estrutura de dados complexas, <a href="http://en.wikipedia.org/wiki/First_Class_Functions">First Class Functions</a> (construção de novas funções em tempo de execução), <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">Closures</a>, <a href="http://en.wikipedia.org/wiki/OOP">Orientação a Objetos</a>, bem como a mistura de vários paradigmas, fica a critério do programador, e muito muito mais;</li>
<li>Toda a liberdade ao desenvolvedor, possibilitando escrever instruções complexas em poucas linhas de código (quanto menos linhas de código menos bugs);</li>
<li>É rápido e produtivo, pois provê ao programador todas as ferramentas necessárias para colocar os seus anseios em prática;</li>
<li><span style="font-weight: bold;">&#8220;There is more than one way to do it&#8221;</span>;</li>
<li><a href="http://search.cpan.org/">CPAN</a>, um repositório com milhares de <a href="http://en.wikipedia.org/wiki/Perl_module">módulos Perl</a>, largamente utilizados, e conseqüentemente, testados pela comunidade;</li>
<li>Liberdade. Não te prende à burocracia, e subentende de que o desenvolvedor tem consciência do que faz e quer liberdade para isso;</li>
</ul>
<div style="text-align: justify;">Porem é necessário deixar claro que <a href="http://en.wikipedia.org/wiki/Perl">Perl</a> é uma linguagem <span style="font-weight: bold;">voltada às soluções e meios para atingir os objetivos, e, não necessariamente voltada a quem vai desenvolver</span> estas soluções, ou seja, ela vai exigir dos programadores <span style="font-weight: bold;">conceitos e disciplina</span>, na minha opinião, isso é muito bom nos dias de hoje.</p>
<p><span style="font-weight: bold;">Links:</span></p>
</div>
<ul style="text-align: justify;">
<li><span style="font-weight: bold;">São Paulo Perl Mongers:</span> <a href="http://sao-paulo.pm.org/">http://sao-paulo.pm.org/</a></li>
<li><span style="font-weight: bold;">Perl Mongers:</span> <a href="http://en.wikipedia.org/wiki/Perl_Mongers">http://en.wikipedia.org/wiki/Perl_Mongers</a></li>
<li><span style="font-weight: bold;">Perl 6:</span> <a href="http://en.wikipedia.org/wiki/Perl_6">http://en.wikipedia.org/wiki/Perl_6</a></li>
<li><span style="font-weight: bold;"> Programming Perl:</span> <a href="http://en.wikipedia.org/wiki/Programming_Perl">http://en.wikipedia.org/wiki/Programming_Perl</a></li>
<li><span style="font-weight: bold;">Perl Foundation:</span> <a href="http://en.wikipedia.org/wiki/The_Perl_Foundation">http://en.wikipedia.org/wiki/The_Perl_Foundation</a></li>
<li><span style="font-weight: bold;">Perl Monks:</span> <a href="http://en.wikipedia.org/wiki/Perl_Monks">http://en.wikipedia.org/wiki/Perl_Monks</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/10/21/why-perl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Impressões Sun Tech Day 2008</title>
		<link>http://tecblog.locaweb.com.br/2008/10/02/impressoes-sun-tech-day-2008/</link>
		<comments>http://tecblog.locaweb.com.br/2008/10/02/impressoes-sun-tech-day-2008/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 12:49:35 +0000</pubDate>
		<dc:creator>Eugenio</dc:creator>
		
		<category><![CDATA[Sem Categoria]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=76</guid>
		<description><![CDATA[Amigos ,
Nos dias 29 e 30 estive em um dos maiores eventos de JAVA do Brasil o “Sun Tech Day 2008 ” ,  nele os maiores desenvolvedores e empresas conhecem as tendências e caminhos traçados pela  SUN Microsystems que dita as regras de java no mundo.
Este evento é marcado pelo fortalecimento da Marca SUN Microsystems [...]]]></description>
			<content:encoded><![CDATA[<p>Amigos ,<br />
Nos dias 29 e 30 estive em um dos maiores eventos de JAVA do Brasil o “<strong>Sun Tech Day 2008 </strong>” ,  nele os maiores desenvolvedores e empresas conhecem as tendências e caminhos traçados pela  SUN Microsystems que dita as regras de java no mundo.</p>
<p>Este evento é marcado pelo fortalecimento da Marca SUN Microsystems no mercado e desta vez não foi diferente o foco deste foi no sistema operacional  Opensolaris .</p>
<p>Assisti algumas palestras  voltadas a administração do JAVA e novidades que futuramente podemos implantar :</p>
<p><strong>GlassFish e o futuro do Java EE </strong>-  Estou acompanhando o crescimento deste server que tende a ser o substituto imediato do Tomcat , foi salientada a versão 3 que sairá em 2009  este server será o carro chefe da Sun para servidores Web.</p>
<p><strong>(J)Ruby e Rails</strong> - Como no evento JUST JAVA a única linguagem mencionada no evento fora o JAVA foi o ruby on rails , está é a grande tendência para 2009 para quem quer saber mais acesse o curso grátis :www.javapassion.com</p>
<p><strong>EJB 3, Spring e SEAM</strong> - Aplicações robustas desenvolvimento e injeção de dependências foi o forte dessa palestra que aguçou e muito meu interesse por estas tecnologias.</p>
<p><strong>Conectando o mundo com REST, Melhorando a Performance em Java e  Desenvolvendo e administrando com segurança</strong></p>
<p>Foram palestras voltadas para a administração do ambiente JAVA utilizando o OpenSolaris</p>
<p><strong>Conclusões :</strong></p>
<p>A Sun através deste evento anual fortalece sua marca e consequentemente os patrocinadores como a Locaweb e fornece um ambiente adequado e completo para o desenvolvedor oferecendo :</p>
<p>Sistema Operacional : <strong>Opensolaris</strong></p>
<p>Linguagem de desenvolvimento :<strong> JAVA</strong></p>
<p>Banco de dados : <strong>MYSQL (Adquirido pela Sun 2008)</strong></p>
<p>IDE de desenvolvimento : <strong>Netbeans (Incorporado a Sun)</strong></p>
<p>Server JAVA : <strong>Glassfish</strong></p>
<p>Para que curte plataforma Linux , se atentem a estas ferramentas que serão padrões mais rápido do que a gente pensa.</p>
<p>Até mais .</p>
<p><strong>Carlos Eugênio</strong></p>
<p>Complementando as impressões do Eugênio, segue:</p>
<p><strong>Virtualização:</strong> A Sun criou o VirtualBox (Sun xVM VirtualBox), ainda não testei, mas pelas demonstrações que tive, superou as expectativas.</p>
<p>Os interessados em ver as imagens dele em ação, basta acessar http://www.sun.com/software/products/virtualbox/ e clicar nas figuras contidas na seção xVM VirtualBox Gallery.</p>
<p>PHP e Java são amigos.</p>
<p>Com o <strong>Quercus</strong>, desenvolvido pela Caucho, é possível fazer o PHP rodar sob o Java e ter acesso aos seus recursos, dentre eles, JDBC e às suas demais classes. Detalhes podem ser obtidos em http://www.caucho.com/resin-3.0/quercus/</p>
<p><strong>jMaki, Framework Ajax</strong><br />
O projeto jMaki faz parte da comunidade do Glassfish, e este framework pode ser utilizado tanto para Java quanto para Ruby, PHP e Phobos. O site deste projeto pode ser acessado através da URL https://ajax.dev.java.net/</p>
<p>Também fui na palestra sobre MySQL e a web 2.0. Kaj Arnö, palestrante, vice presidente de relações comunitárias da MySQL AB, citou com ética e carisma a questão do MySQL em relação aos demais sistemas de gerenciamento de banco de dados e sobre a importância do LAMP (Linux Apache MySQL P(PHP/Perl/Python)), onde podemos concluir que a Sun, assim como a Microsoft, também se preocupa e investe em recursos para o PHP. Para os desenvolvedores desta linguagem, é uma vasta variedade de opções para o desenvolvimento de soluções.<br />
<strong><br />
Glauco Furlaneto</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/10/02/impressoes-sun-tech-day-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Propriedades do CSS1 ao CSS3</title>
		<link>http://tecblog.locaweb.com.br/2008/09/30/propriedades-do-css1-ao-css3/</link>
		<comments>http://tecblog.locaweb.com.br/2008/09/30/propriedades-do-css1-ao-css3/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 02:35:52 +0000</pubDate>
		<dc:creator>Giovani Generali</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://tecblog.locaweb.com.br/?p=75</guid>
		<description><![CDATA[O site meiert.com criou um índice de atualização permante contendo a maioria das propriedades disponíveis no CSS1, CSS2, CSS2.2 e CCS3.
Essa é uma excelente fonte de consulta, aproveite!
Acesse: CSS Properties Index
]]></description>
			<content:encoded><![CDATA[<p>O site <a href="http://meiert.com/en/" target="_blank">meiert.com</a> criou um índice de atualização permante contendo a maioria das propriedades disponíveis no CSS1, CSS2, CSS2.2 e CCS3.</p>
<p>Essa é uma excelente fonte de consulta, aproveite!</p>
<p>Acesse: <a href="http://meiert.com/en/indices/css-properties/" target="_blank">CSS Properties Index</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tecblog.locaweb.com.br/2008/09/30/propriedades-do-css1-ao-css3/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
