<?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.caelum.com.br</title>
	<atom:link href="http://blog.caelum.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 16 May 2013 22:46:06 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Rails 4 no Heroku</title>
		<link>http://blog.caelum.com.br/rails-4-no-heroku/</link>
		<comments>http://blog.caelum.com.br/rails-4-no-heroku/#comments</comments>
		<pubDate>Mon, 13 May 2013 12:55:14 +0000</pubDate>
		<dc:creator>Joviane Jardim</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails4]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5532</guid>
		<description><![CDATA[Rails 4 está chegando e é interessante verificar se vai dar muita dor de cabeça para migrar sua aplicação atual. Para isso, seguem alguns problemas comuns que podem acontecer no momento do deploy e as soluções para os mesmos. No Heroku, a stack a ser utilizada deve ser a stack Cedar. Caso sua aplicação esteja <a href="http://blog.caelum.com.br/rails-4-no-heroku/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2020/05/Heroku-Ruby-Rails.jpg" width="240" />
		</p><p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2020/05/Heroku-Ruby-Rails.jpg"><img class="alignleft size-medium wp-image-5556" alt="Heroku and Ruby on Rails" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2020/05/Heroku-Ruby-Rails-300x230.jpg" width="300" height="230" /></a></p>
<p>Rails 4 está chegando e é interessante verificar se vai dar muita dor de cabeça para migrar sua aplicação atual.<br />
Para isso, seguem alguns problemas comuns que podem acontecer no momento do deploy e as soluções para os mesmos. No Heroku, a stack a ser utilizada deve ser a stack <a href="https://devcenter.heroku.com/articles/cedar">Cedar</a>. Caso sua aplicação esteja nas stacks anteriores, será necessário criar uma nova aplicação utilizando esta stack.</p>
<p>O primeiro ponto que vamos atacar é a configuração para guardar a <em>session</em> no Rails. Esta configuração serve para quem utiliza cookie como forma de armazenamento e quer continuar utilizando. Na versão 4.0.0.beta1 ela possibilitava que o armazenamento fosse feito de forma encriptada através de uma opção no arquivo <code>config/initializers/session_store.rb</code> cadastrada da seguinte maneira:</p>
<pre class="brush: ruby; title: ; notranslate">
config.session_store :encrypted_cookie_store
</pre>
<p>Na versão 4.0.0.rc1 do Rails esta característica passa a ser um comportamento padrão, conforme descrito no <a href="https://github.com/rails/rails/blob/4-0-stable/actionpack/CHANGELOG.md" target="_blank">changelog</a> e a única opção mantida foi:</p>
<pre class="brush: ruby; title: ; notranslate">
config.session_store :cookie_store
</pre>
<p>Caso o arquivo esteja com a opção antiga, no momento do startup do servidor o Rails já vai acusar um erro, como o abaixo:</p>
<pre class="brush: plain; title: ; notranslate">
/Users/joviane/.rvm/gems/ruby-1.9.3-p392/bundler/gems/rails-04d27153fcef/railties/lib/rails/application/configuration.rb:144:in `const_get': uninitialized constant ActionDispatch::Session::EncryptedCookieStore (NameError)
</pre>
<p>Esse é um ponto que se deve ter cuidado. Caso você venha do Rails 3 direto, basta fazer do último jeito caso venha da beta do Rails 4, lembre-se de alterar novamente.</p>
<p>Outra mudança que veio com o Rails 4 foi a <a href="https://github.com/rails/rails/blob/4-0-stable/railties/CHANGELOG.md" >localização</a> dos comandos para subir o servidor, criar projetos novos, executar as tasks, etc&#8230; Agora todos eles ficam dentro da pasta <code>bin/</code> do seu projeto Rails. Apenas essa alteração não impacta em nada na nossa vida, já que quando você fizer <code>bundle install</code>, e estiver usando o Rails 4, os arquivos já serão gerados no lugar certo.</p>
<p>O problema é que se você tiver utilizando o binstubs do Bundler, o conteúdo também será gerado dentro do diretório <code>/bin</code> e com isso vai sobrescrever alguns dos comandos, que passaram a funcionar de maneira errada pois o Rails verifica se o conteúdo do <code>script/rails</code> é o mesmo do <code>bin/rails</code>. Como o conteúdo é diferente, o Rails sempre mostrará o help do novo comando. Por exemplo, caso você tente fazer <code>rails s</code> vai aparecer o help do rails new.<br />
Esta situação inclusive está comentado numa <a href="https://github.com/carlhuda/bundler/issues/2253">issue</a> lá no próprio Bundler.</p>
<p>Além disso, dependendo da task que você quer executar, pode aparecer uma mensagem indicando que não foi encontrado o railties nas suas gems:</p>
<pre class="brush: plain; title: ; notranslate">
/app/vendor/ruby-1.9.3/lib/ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find railties amongst [...] (Gem::LoadError)
</pre>
<p>Para resolver estes problemas, basta que após a instalação do Rails 4 seja executado o comando <code>bundle config --delete bin</code> para que o Bundler deixe de gerar os stubs e o comando <code>rake rails:update:bin</code> para que o Rails atualize os arquivos e os deixe funcionando da maneira correta. A saída do console será parecida com:</p>
<pre class="brush: plain; title: ; notranslate">
exist  bin
identical  bin/bundle
conflict  bin/rails
Overwrite /Users/joviane/caelum/test/project/bin/rails? (enter &quot;h&quot; for help) [Ynaqdh] a
force  bin/rails
conflict  bin/rake
force  bin/rake
</pre>
<p>A nova versão do Rails, já mostra inclusive uma mensagem comentando que deve ser atualizado o bin:</p>
<pre class="brush: plain; title: ; notranslate">
Looks like your app's ./bin/rails is a stub that was generated by Bundler.

In Rails 4, your app's bin/ directory contains executables that are versioned
like any other source code, rather than stubs that are generated on demand.

Here's how to upgrade:

  bundle config --delete bin    # Turn off Bundler's stub generator
  rake rails:update:bin         # Use the new Rails 4 executables
  git add bin                   # Add bin/ to source control

You may need to remove bin/ from your .gitignore as well.

When you install a gem whose executable you want to use in your app,
generate it and add it to source control:

  bundle binstubs some-gem-name
  git add bin/new-executable
</pre>
<p>O diretório <code>/bin</code> atualizado deve ser <em>commitado</em> e somente depois deve ser feito o <em>push</em> para o Heroku. Com os comandos gerados, os comandos do Rails são executados normalmente.</p>
<p>Hora de fazer o deploy. Ao tentarmos efetuá-lo utilizando o Rails 4, o Bundler do Heroku irá acusar que existem erros na instalação como a mensagem abaixo:</p>
<pre class="brush: plain; title: ; notranslate">
remote:        Gem::InstallError: activesupport requires Ruby version &gt;= 1.9.3.
remote:        An error occurred while installing activesupport (4.0.0.beta1), and Bundler
remote:        cannot continue.
remote:        Make sure that `gem install activesupport -v '4.0.0.beta1'` succeeds before
remote:        bundling.
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Heroku push rejected, failed to compile Ruby/rails app
</pre>
<p>Isto acontece pois o Rails 4 requer pelo menos a versão 1.9.3 do Ruby, sendo a versão 2.0.0 a recomendada. Porém, atualmente o Heroku utiliza por padrão a versão 1.9.2 do Ruby. Para que o deploy consiga ser efetuado, é necessário especificar no Gemfile a versão do Ruby que deve ser utilizada, por exemplo:</p>
<pre class="brush: ruby; title: ; notranslate">
ruby &quot;1.9.3&quot;
</pre>
<p>Agora o deploy funcionou, mas ao executarmos a aplicação, vemos que o css e o js não estão sendo carregados. Se olharmos no log do Heroku, vemos que os arquivos com os assets não estão sendo encontrados:</p>
<pre class="brush: plain; title: ; notranslate">
ActionController::RoutingError (No route matches [GET] &quot;/assets/application-a802b6f76dc4b7e26213ed231e5c407d.css&quot;)
ActionController::RoutingError (No route matches [GET] &quot;/assets/application-75a7854682675193d462515d38e028bc.js&quot;)
</pre>
<p>Este problema se deve ao fato de que no Rails 3, o Heroku injetava como plugin no momento do deploy as funcionalidades para servir assets estáticos e efetuar log da aplicação. Como no Rails 4 foi removido o sistema de plugins, o Heroku disponibilizou duas <a href="https://devcenter.heroku.com/articles/rails4#heroku-gems" target="_blank">gems</a> que devem ser inseridas no Gemfile para habilitar o comportamento antigo:</p>
<pre class="brush: ruby; title: ; notranslate">
gem 'rails_log_stdout', github: 'heroku/rails_log_stdout'
gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
</pre>
<p>Pronto, depois de realizada essas alterações tudo deve funcionar normalmente. Boa parte desses problemas foram passados durante a migração do <a href="http://www.agendatech.com.br/" target="_blank">Agendatech</a> para a nova versão do Rails. E você já está pensando em migrar sua aplicação? Passou por algum outro problema? Não deixe de comentar aqui no blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/rails-4-no-heroku/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como posso aprender Java e iniciar na carreira?</title>
		<link>http://blog.caelum.com.br/como-posso-aprender-java-e-iniciar-na-carreira/</link>
		<comments>http://blog.caelum.com.br/como-posso-aprender-java-e-iniciar-na-carreira/#comments</comments>
		<pubDate>Tue, 07 May 2013 17:15:41 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apostilas]]></category>
		<category><![CDATA[aprendizado]]></category>
		<category><![CDATA[carreira]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5480</guid>
		<description><![CDATA[&#8216;Aprender Java é muito difícil&#8217;! É uma exclamação frequente no fórum do GUJ.com.br e uma dúvida dos alunos da Caelum. O Java é, junto com .NET, frontend, desenvolvimento mobile, php e ruby, uma das plataformas que mais interessam aos estudantes e iniciantes. Há vários motivos para isso. Você pode ter um primo mais velho que <a href="http://blog.caelum.com.br/como-posso-aprender-java-e-iniciar-na-carreira/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/android.jpg" width="240" />
		</p><p>&#8216;Aprender Java é muito difícil&#8217;! É uma exclamação frequente no fórum do GUJ.com.br e uma dúvida dos alunos da Caelum.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/di-logo-java-blue.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/di-logo-java-blue-300x240.png" alt="di-logo-java-blue" width="300" height="240" class="aligncenter size-medium wp-image-5492" /></a></p>
<p>O Java é, junto com .NET, frontend, desenvolvimento mobile, php e ruby, uma das plataformas que mais interessam aos estudantes e iniciantes. Há vários motivos para isso. Você pode ter um primo mais velho que já trabalha com Java, sua faculdade pode estar cobrando exercícios e trabalhos nessa linguagem, quer programar para Android ou simplesmente gostou do logo da plataforma. Como começar?</p>
<p>Aqui na Caelum, aprimoramos nosso <a href="http://www.caelum.com.br/curso-java-orientacao-objetos/">curso de Java e orientação a objetos</a> durante anos, desde sua elaboração durante os cursos de verão da USP. Caso você não tenha disponibilidade de fazer nosso curso, não tem problema: a <a href="http://www.caelum.com.br/apostila-java-orientacao-objetos/">apostila está totalmente disponível na internet</a>. </p>
<p>Vale lembrar que, para encarar essa apostila, você precisa ter um certo conhecimento de  lógica de programação e de uma primeira linguagem, seja através de um curso ou de um bom livro.</p>
<p>Mas basta a leitura de uma apostila? Certamente não.</p>
<p><strong>Pratique muito</strong>. No começo, evite ferramentas como Eclipse e Netbeans. Sofrer no prompt do DOS ou no shell do linux, com o javac, faz parte do processo de aprendizado. Não fique apenas nos exercícios que você vê nas apostilas ou na sua faculdade. É seu papel ir além, buscar implementar tudo aquilo que passa pela sua cabeça. Tente variações dos exercícios. Não se contente apenas com &#8220;agora deu certo&#8221;. Vá atrás de entender o que passa por debaixo dos panos. É uma característica importante de um programador.</p>
<p><strong>E como vou ter meu primeiro emprego com Java?</strong></p>
<p>Enviar currículos dizendo que está estudando Java básico pode não ser o suficiente. Apesar do mercado parecer eternamente bom para desenvolvedores de qualquer linguagem, as empresas buscam alguém que possa produzir desde o primeiro dia de trabalho, mesmo que o mínimo. Há dois caminhos de estudo que te possibilitarão mostrar um pouco de serviço, tanto na entrevista quando no início de trabalho: a <strong>Web</strong> e o <strong>Android</strong>.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/web.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/web-300x211.jpg" alt="web" width="300" height="211" class="aligncenter size-medium wp-image-5551" /></a></p>
<p>A Web é repleta de sistemas que rodam Java. Há também a <a href="http://www.caelum.com.br/apostila-java-web/">apostila</a> do curso <a href="http://www.caelum.com.br/curso-java-web/">Java para Web</a> da Caelum disponível. Servlets e JSP são a base desse desenvolvimento, apesar de, na maioria das vezes, trabalharmos com frameworks web MVC. Criar seu próprio pequeno sistema web, algo que resolva um problema que você mesmo tem, além de ajudar no seu aprendizado pode servir para mostrar no currículo e em uma entrevista.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/android.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/android-300x239.jpg" alt="android" width="300" height="239" class="aligncenter size-medium wp-image-5552" /></a></p>
<p>Para o Android, o Java é a linguagem utilizada no desenvolvimento da maioria absoluta de suas aplicações. Apesar da máquina virtual não ser uma JVM, seu conhecimento de Java básico será utilizado o tempo todo, desde a sintaxe até as bibliotecas principais. Programar para Android é mais divertido do que você pode imaginar, e você pode rapidamente mostrar o resultado de seus estudos para amigos e parentes e para seu futuro chefe!</p>
<p>Seja qual for o caminho que você escolher, praticar e exercitar a linguagem são as principais forma de fixar seu conhecimento e demonstrá-lo! Conhecer profundamente as APIS básicas, como java.lang, java.util e java.io, além dos conceitos de orientação a objetos, é um grande diferencial que boas empresas saberão valorizar. É melhor focar seus estudos no coração da plataforma do que conhecer diversos frameworks e bibliotecas sem este embasamento.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/como-posso-aprender-java-e-iniciar-na-carreira/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Disparando eventos customizados no Android</title>
		<link>http://blog.caelum.com.br/disparando-eventos-customizados-no-android/</link>
		<comments>http://blog.caelum.com.br/disparando-eventos-customizados-no-android/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 12:48:37 +0000</pubDate>
		<dc:creator>Erich Egert</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[fragments]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5541</guid>
		<description><![CDATA[Na plataforma Android, o uso de Fragments para flexibilizar o desenvolvimento é uma prática cada vez mais difundida, em especial para aplicações que precisam rodar em tablets. Através dos Fragments é possível isolar o comportamento de pequenos trechos da tela, ajudando a reduzir a quantidade de código nas activities e permitindo maior flexibilidade no momento <a href="http://blog.caelum.com.br/disparando-eventos-customizados-no-android/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/tela_3_fragments.png" width="240" />
		</p><p>Na plataforma Android, o uso de Fragments para flexibilizar o desenvolvimento é uma prática cada vez mais difundida, em especial para aplicações que precisam rodar em tablets. Através dos Fragments é possível isolar o comportamento de pequenos trechos da tela, ajudando a reduzir a quantidade de código nas activities e permitindo maior flexibilidade no momento de fazer a mesma aplicação rodar em Smartphones e Tablets.</p>
<p>Uma questão relevante nesse cenário é: O que devemos fazer quando um evento em um Fragment impacta em outros Fragments?</p>
<p>Suponha uma tela de um Tablet no qual existam 3 Fragments. À esquerda uma listagem de posts de um blog, no canto superior direito um Fragment que mostra os detalhes do post selecionado, no canto inferior direito para a criação de uma resposta para o post selecionado da listagem:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/tela_3_fragments.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/tela_3_fragments.png" alt="tela_3_fragments" width="258" height="178" class="aligncenter size-full wp-image-5542" />Tela da aplicação com 3 fragments</a></p>
<p>Quando clicamos em um item do <code>ListView</code> precisamos passar esse item para os demais Fragments, podemos fazer isso diretamente no <code>Fragment</code> que apresenta a listagem na tela:</p>
<pre class="brush: java; title: ; notranslate">
getListView().setOnItemClickListener(new OnItemClickListener() {
	public void onItemClick(AdapterView&lt;?&gt; adapter, View view, int posicao,	long id) {
		BlogPost postSelecionado = 
			(BlogPost) adapter.getItemAtPosition(posicao);
		
		FragmentManager manager = getFragmentManager();
		PostSelecionadoFragment telaDetalhesPost = (PostSelecionadoFragment)
			manager.findFragmentById(R.id.direita_superior);
				
		telaDetalhesPost.lidaCom(postSelecionado);
		
		NovoPostFragment telaNovoPost = (NovoPostFragment) 
			manager.findFragmentById(R.id.direita_inferior);
				
		telaNovoPost.lidaCom(postSelecionado);
		
		PostsActivity activity = (PostsActivity) getActivity();
		activity.lidaComSelecao(postSelecionado);
	}
});
</pre>
<p>Mas será que é responsabilidade de um <code>Fragment</code> conhecer os demais? Podemos delegar a responsabilidade de lidar com a tela como um todo para a <code>Activity</code> que já a está gerenciando , isolando todo o código acima:</p>
<pre class="brush: java; title: ; notranslate">
getListView().setOnItemClickListener(new OnItemClickListener() {
	public void onItemClick(AdapterView&lt;?&gt; adapter, View view, int posicao,	long id) {
		BlogPost postSelecionado = 
			(BlogPost) adapter.getItemAtPosition(posicao);
		
		PostsActivity activity = (PostsActivity) getActivity();
		activity.lidaComSelecao(postSelecionado);
	}
});
</pre>
<p>O problema é que acoplamos nosso <code>Fragment</code> de listagem com uma <code>Activity</code> em específico, dificultando seu reaproveitamento. Se resolvermos dar suporte a smartphones, inclusive de tamanho de tela pequena, precisaremos quebrar essa tela em duas ou até três, tornando o método da Activity que lida com a seleção cada vez mais complexo.</p>
<p>Uma maneira de reduzir o acoplamento é trabalhar com mensagens, de maneira semelhante à que os desenvolvedores no iOS fazem com o NSNotificationCenter.</p>
<p>Na seleção de um item, podemos usar o <code>LocalBroadcastManager</code> para disparar uma mensagem de broadcast que não sairá dos limites de nossa aplicação (ajudando nos quesitos segurança e performance).</p>
<pre class="brush: java; title: ; notranslate">
getListView().setOnItemClickListener(new OnItemClickListener() {
	public void onItemClick(AdapterView&lt;?&gt; adapter, View view, int posicao,	long id) {
		BlogPost postSelecionado = 
			(BlogPost) adapter.getItemAtPosition(posicao);
		
		Intent intent = new Intent(&quot;post-foi-selecionado&quot;);

		intent.putExtra(&quot;blogpost&quot;, post);
		LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
	}
});
</pre>
<p>Agora podemos registrar os Fragments interessados nesse evento: </p>
<pre class="brush: java; title: ; notranslate">
public class BlogPostSelecionado extends BroadcastReceiver {
	private  FragmentObservador observador;

	public static BlogPostSelecionado registraParaLidarComASelecao(FragmentObservador o) {
		BlogPostSelecionado receiver = new BlogPostSelecionado();
		receiver.observador = o;
		
		LocalBroadcastManager.getInstance(o.getContext())
			.registerReceiver(receiver, new IntentFilter(&quot;post-foi-selecionado&quot;));

		return receiver;
	}
}
</pre>
<p>Agora os Fragments interessados em nosso evento apenas precisam implementar a interface <code>FragmentObservador</code>:</p>
<pre class="brush: java; title: ; notranslate">
public interface FragmentObservador {
	Context getContext();
	void lidaCom(Post post);
}
</pre>
<p>Dessa forma invertemos a responsabilidade de propagar o evento para a plataforma, reduzindo o acoplamento e facilitando a manutenção.</p>
<p>Querendo aprender desenvolvimento Android? <a href="http://www.caelum.com.br/curso-android/">Conheça o nosso curso</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/disparando-eventos-customizados-no-android/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Desmistificando branches remotas com Git</title>
		<link>http://blog.caelum.com.br/desmitificando-branches-remotas-com-git/</link>
		<comments>http://blog.caelum.com.br/desmitificando-branches-remotas-com-git/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 18:33:26 +0000</pubDate>
		<dc:creator>William Mizuta</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Branch]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[pm-87]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5475</guid>
		<description><![CDATA[Você já usa o básico do Git e quer dar um passo além: trabalhar com os temidos branches. Uma das grandes vantagens do git ou de qualquer sistema de controle de versão distribuído é a possibilidade de trabalhar com branches localmente. Com isso, outras pessoas do projeto não precisam conhecer uma branch que foi criada <a href="http://blog.caelum.com.br/desmitificando-branches-remotas-com-git/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/Git-Logo.png" width="240" />
		</p><p>Você já usa <a href="http://blog.caelum.com.br/passo-a-passo-para-comecar-com-git-e-novo-curso-online/">o básico do Git</a> e quer dar um passo além: trabalhar com os temidos branches.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/Git-Logo.png"><img class="aligncenter size-medium wp-image-5535" alt="Git-Logo" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/Git-Logo-300x125.png" width="300" height="125" /></a></p>
<p>Uma das grandes vantagens do git ou de qualquer sistema de controle de versão distribuído é a possibilidade de trabalhar com branches localmente. Com isso, outras pessoas do projeto não precisam conhecer uma branch que foi criada apenas para facilitar o trabalho de um desenvolvedor. Mas quando desejamos distribuir o conteúdo de uma branch local para que outros desenvolvedores possam contribuir, precisamos que ela se torne remota.</p>
<p>Imaginem que uma das tarefas consiste em modificar o design de uma determinada página. Para isso, criaremos uma branch local chamada <code>design</code>, onde serão realizadas os commits com as alterações, e depois entramos nela:</p>
<pre class="brush: plain; title: ; notranslate">
git branch design
git checkout design
</pre>
<p>Agora você pode trabalhar normalmente, fazendo commits nesse branch, que ficará armazenado localmente. Dessa forma você não incomoda os outros desenvolvedores que estão trabalhando na branch master, nem precisará mandar todo o novo design pra lá num único commit!</p>
<p><strong>Criando branches remotas</strong></p>
<p>Contudo, você gostaria que uma outra pessoa também pudesse contribuir com as alterações nessa branch. No Git, para disponibilizar uma branch local remotamente basta rodar o seguinte comando:</p>
<pre class="brush: plain; title: ; notranslate">
git push origin design
</pre>
<p><strong>Copiando uma branch remota localmente</strong></p>
<p>Agora, outras pessoas que quiserem contribuir numa determinada branch remota, precisam copiá-la localmente. Isto é feito com o seguinte comando:</p>
<pre class="brush: plain; title: ; notranslate">
git checkout -t origin/design
</pre>
<p>Feito isso, você terá uma branch local chamanda design e pode trabalhar nela como qualquer outra branch local.</p>
<p><strong>Depois do design pronto: &#8216;juntando&#8217; os branches</strong></p>
<p>Dentro do branch design, uma vez terminadas as modificações que queríamos fazer em paralelo, podemos jogar de volta as modificações para o branch master:</p>
<pre class="brush: plain; title: ; notranslate">
git checkout master
git merge design
</pre>
<p>Isso deixará o master atualizado com um novo commit, trazendo todas as modificações da branch design. Fica só faltando atualizar o master do remoto, com o simples <code>git push</code>.</p>
<p>Há também a opção de fazer um <code>rebase</code>, mas deve-se tomar cuidado, pois ele altera o histórico do master, tentando adicionar os commits do outro branch.</p>
<p><strong>Removendo branches remotas</strong></p>
<p>Uma vez a tarefa foi concluída e integrada na branch principal (master), a branch que criamos anteriormente não é mais necessária. Para não ficar poluindo o nosso repositório, uma boa prática é remover branches que não são mais necessárias. Para isso, basta rodar o seguinte comando:</p>
<pre class="brush: plain; title: ; notranslate">
git push origin :design
</pre>
<p>Perceba que a única diferença com o comando de disponibilizar reomotamente uma branch local é um dois pontos (:).</p>
<p>Aprenda mais no nosso <a href="http://www.caelum.com.br/curso-praticas-ageis/">curso de práticas ágeis</a> e no <a href="http://www.caelum.com.br/curso/online/git/">curso online de Git</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/desmitificando-branches-remotas-com-git/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Como foi o MobileConf 2013</title>
		<link>http://blog.caelum.com.br/como-foi-o-mobileconf-2013/</link>
		<comments>http://blog.caelum.com.br/como-foi-o-mobileconf-2013/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 14:34:39 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5523</guid>
		<description><![CDATA[Na última sexta-feira, dia 5 de Abril, aconteceu em São Paulo a primeira edição do MobileConf. Foi um dia completo com 500 participantes focados apenas em desenvolvimento mobile. Palestras Foram 3 tracks no evento, com um total de 19 palestras e 3 painéis de discussão no final. Vários dos slides e códigos foram disponibilizados pelos <a href="http://blog.caelum.com.br/como-foi-o-mobileconf-2013/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/mobileconf.jpg" width="240" />
		</p><p><img class="aligncenter size-full wp-image-5524" alt="logo-mobileconf" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/logo-mobileconf.png" width="330" height="110" /></p>
<p>Na última sexta-feira, dia 5 de Abril, aconteceu em São Paulo a primeira edição do <a href="http://www.mobileconf.com.br/">MobileConf</a>. Foi um dia completo com 500 participantes focados apenas em desenvolvimento mobile.</p>
<p><img class="aligncenter size-full wp-image-5525" alt="mobileconf" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/mobileconf.jpg" width="550" height="365" /></p>
<h2>Palestras</h2>
<p>Foram 3 tracks no evento, com um total de 19 palestras e 3 painéis de discussão no final. Vários dos slides e códigos foram disponibilizados pelos palestrantes:</p>
<p>Abertura do evento: <a href="http://www.slideshare.net/caelumdev/mobile-conf">Os caminhos de uma estratégia mobile</a>, Sérgio Lopes</p>
<h3>Track HTML5 e Web</h3>
<ul>
<li><a href="http://www.slideshare.net/horacio.soares/mobile-first-palestra-no-mobileconf-2013">Mobile first</a>, Horácio Soares</li>
<li><a href="https://github.com/soapdog/apresentacao-mobileconf-firefoxos">Desenvolvendo para o novo Firefox OS</a>, Andre Garzia</li>
<li><a href="http://www.slideshare.net/loianeg/mobileconf-2013-phonegap">PhoneGap e desenvolvimento multiplataforma</a>, Loiane Groner</li>
<li><a href="http://cdn.qmx.me/presentations/2013/mobileconf/aerogear-enterprise-mobile-made-simple/index.html#/">AeroGear: Mobile Enterprise sem Complicação</a>, Douglas Campos</li>
</ul>
<h3>Track Android</h3>
<ul>
<li><a href="http://www.slideshare.net/ErichEgert/mobile-conf-erich">Aplicações Android flexíveis e de facil manutenção</a>, Erich Egert</li>
<li><a href="http://www.slideshare.net/macolinkalkin/mobileconf-18425100">Construindo sua app para conquistar os usuários </a>, André Silva</li>
<li><a href="http://www.slideshare.net/andersonleite/mobileconf-18434950">Desenvolvimento de Jogos com Android</a>, Anderson Leite</li>
<li><a href="http://www.slideshare.net/albertosouza332/mobileconf-dicasandroid">Dicas Android</a>, Alberto Souza</li>
<li><a href="http://ricardolecheta.com.br/?p=272">Google Cloud Messaging</a>, Ricardo Lecheta</li>
</ul>
<h3>Track iOS</h3>
<ul>
<li><a href="https://speakerdeck.com/dchohfi/palestra-sobre-uitableview-na-mobileconf-2013">Customizando o elemento UITableView como gente grande</a>, Diego Chohfi </li>
<li><a href="http://ferbass.com/mobileconf/#/">Do Zero à AppStore</a>, Fernando Bass</li>
<li><a href="http://www.slideshare.net/osnipso/primeiros-passos-no-ios-com-objectivec">Primeiros passos com iOS e Objective-C</a>, Osni Oliveira</li>
<li><a href="https://www.dropbox.com/sh/vlwd62yi27rqhrs/CzKR8ktwKC">Desenvolvimento de games mobile</a>, Andre Toyama</li>
</ul>
<h2>Novidades</h2>
<p>Durante o evento, a <a href="http://www.casadocodigo.com.br">Casa do Código</a> lançou dois novos livros: <a href="http://sergiolopes.org/livro-web-mobile/">A Web Mobile</a> (meu, Sérgio Lopes) e <a href="http://www.casadocodigo.com.br/products/livro-jogos-android">Desenvolvimento de Jogos para Android</a> (Anderson Leite).</p>
<p>E se você quer entrar em alguma dessas áreas de desenvolvimento mobile, a Caelum tem cursos de <a href="http://www.caelum.com.br/cursos/web/">Web e HTML5</a>, <a href="http://www.caelum.com.br/curso-android/">programação Android</a> e <a href="http://www.caelum.com.br/curso-ios-iphone-ipad/">programação iOS</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/como-foi-o-mobileconf-2013/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Trabalhe com CDI extensions</title>
		<link>http://blog.caelum.com.br/trabalhe-com-cdi-extensions/</link>
		<comments>http://blog.caelum.com.br/trabalhe-com-cdi-extensions/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 12:38:40 +0000</pubDate>
		<dc:creator>Alberto Souza</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cdi]]></category>
		<category><![CDATA[ejb]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5452</guid>
		<description><![CDATA[No final do ano passado, implementamos uma integração inicial do VRaptor com CDI. Durante o desenvolvimento tivemos que usar bastante funcionalidades dessa poderosa especificação.  O desafio que tivemos foi o de manter a compatibilidade em relação ao construtor com argumentos do VRaptor. O problema é que todo ponto de injeção para o CDI deve estar <a href="http://blog.caelum.com.br/trabalhe-com-cdi-extensions/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/04/valve-extensions.jpg" width="240" />
		</p><p>No final do ano passado, implementamos uma integração inicial do <a href=" https://github.com/asouza/vraptor/tree/master/vraptor-core">VRaptor com CDI</a>. Durante o desenvolvimento tivemos que usar bastante funcionalidades <a title="motivos de sobra para usar o CDI" href="http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/">dessa poderosa especificação</a>.  O desafio que tivemos foi o de manter a compatibilidade em relação ao construtor com argumentos do VRaptor. O problema é que todo ponto de injeção para o CDI deve estar marcado com a anotação <code>@Inject</code>, diferente de como é no VRaptor. Abaixo segue um exemplo:</p>
<pre class="brush: java; title: ; notranslate">
  @Component
  public class CDIComponent implements ComponentFactory {
   private final MyRequestComponent component;

   @Inject
   public CDIComponent(MyRequestComponent component) {
     this.component = component;
   }

   public ComponentToBeProduced getInstance() {
     return new ComponentToBeProduced();
   }
  }
</pre>
<p>Só que os usuários do VRaptor estão acostumados a apenas declarar um construtor, receber os argumentos e deixar que o framework se vire para realizar a injeção de dependências. Aí é que está justamente o ponto de customização. Precisamos pegar todas essas classes que possuem construtor com argumentos e avisar ao CDI que ele deve considerar esses construtores como se estivessem anotados com <code>@Inject</code>. Para fazer isso, <a href="http://docs.jboss.org/weld/reference/latest/en-US/html/extend.html">a especificação fornece diversos pontos de extensão</a>, onde podemos registrar classes novas que não foram previamente scaneadas, excluir classes que não precisamos além de poder alterar as configurações registradas para uma determinada classe.</p>
<p>Abaixo segue o exemplo da classe que já vamos criar! Para sermos notificados sobre o evento de configuração das classes, vamos utilizar a anotação <code>@Observes</code>, fazendo uso da implementação do Design Pattern <a title="eventos no cdi" href="http://blog.caelum.com.br/diminua-suas-dependencias-com-os-eventos-do-cdi/">Observer</a>, que já é suportado nativamente por qualquer implementação do CDI.</p>
<pre class="brush: java; title: ; notranslate">
  public class AddInjectToConstructorExtension {
    public void processAnnotatedType(@Observes final ProcessAnnotatedType pat) {
     //nossa mágica vai entrar aqui
    }
  }
</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">O objeto do tipo </span><em style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">ProcessAnnotatedType </em><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">representa as configurações de uma determinada classe. Uma das coisas que podemos fazer com esse objeto é, por exemplo, saber quais anotações existem em cada elemento da classe. Podemos também adicionar novas informações, por exemplo que a classe tem a anotação <code>@Inject</code> no seu construtor. O primeiro passo é criar um novo objeto do tipo </span><em style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">ProcessAnnotatedType</em><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">, que vai ser o substituto do original. Para não gastarmos tempo implementando isso na mão, vamos usar um projeto da Apache chamado </span><a title="site do deltaspike" href="http://incubator.apache.org/deltaspike/" target="_blank"><strong style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">Delta Spike</strong></a><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">. Ele possui diversas extensões para ajudar em projetos que usam CDI.</span></p>
<pre class="brush: java; title: ; notranslate">
  public class AddInjectToConstructorExtension {&lt;/pre&gt;
    public void processAnnotatedType(@Observes final ProcessAnnotatedType pat) {
       AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder();
       //lendo as configurações originais
       builder.readFromType(pat.getAnnotatedType());
    }
  }

</pre>
<p>Agora precisamos adicionar a anotação no construtor e informar ao container que ele deve usar essa nova configuração:</p>
<pre class="brush: java; title: ; notranslate">
  public class AddInjectToConstructorExtension {
    public void processAnnotatedType(@Observes final ProcessAnnotatedType pat) {
       AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder();
       builder.readFromType(pat.getAnnotatedType());
       List&lt;Constructor&gt; constructors = //pega os construtores com argumentos da classe
       if(hasArgsConstructorAndNoInjection) {
	  Constructor constructor = constructors.get(0);
	  builder.addToConstructor(constructor, new AnnotationLiteral&lt;Inject&gt;() {});
          // aqui efetivamente trocamos a configuração que o CDI vai usar ler a classe.
          pat.setAnnotatedType(builder.create());
       }
     }
   }
</pre>
<p>O código de verificação do construtor foi deixado de fora de maneira proposital, apenas para não perdermos o foco do post. Caso queira dar uma olhada no código completo, basta seguir este <a title="código no github" href="https://github.com/asouza/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/ioc/cdi/extensions/AddInjectToConstructorExtension.java">link</a>.</p>
<p>Agora que já temos nossa extensão, vamos aos detalhes menores. Toda extensão no CDI deve implementar a interface de marcação chamada <em>Extension</em>. Basicamente segue a mesma ideia da interface <em>Serializable</em>:</p>
<pre class="brush: java; title: ; notranslate">
  public class AddInjectToConstructorExtension implements Extension {
    public void processAnnotatedType(@Observes final ProcessAnnotatedType pat) {
       AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder();
       builder.readFromType(pat.getAnnotatedType());
       List&lt;Constructor&gt; constructors = //pega os construtores com argumentos da classe
       if(hasArgsConstructorAndNoInjection){
	  Constructor constructor = constructors.get(0);
	  builder.addToConstructor(constructor, new AnnotationLiteral&lt;Inject&gt;() {});
          //aqui efetivamente trocamos a configuração que o CDI vai usar ler a classe.
          pat.setAnnotatedType(builder.create());
        }
    }
 }
</pre>
<p>Também precisamos avisar ao container que ele deve carregar essa nossa extensão, assim como avisamos a um container web que ele deve carregar nosso <em>Listener</em>. Para fazer isso, basta declarar um arquivo chamado <code>javax.enterprise.inject.spi.Extension</code>, dentro de uma pasta chamada <code>services</code>. Essa pasta deve ficar dentro da <code>META-INF</code>.  Agora basta que seja escrito o nome completo de cada classe que representa uma extensão:</p>
<pre class="brush: plain; title: ; notranslate">
  br.com.caelum.vraptor.ioc.cdi.extensions.AddInjectToConstructorExtension
  br.com.caelum.vraptor.ioc.cdi.extensions.ComponentExtension
  br.com.caelum.vraptor.ioc.cdi.extensions.ComponentFactoryExtension
</pre>
<p>Pronto! Nossa extensão vai ser carregada e todas as configurações de classes que tiverem construtor com argumentos, e não tiverem adicionado a anotação <code>@Inject</code>, vão ser alteradas. Tudo isso de maneira completamente transparente para quem está usando o VRaptor! Em breve, o CDI vai entrar como mais um provider de injeção no VRaptor, juntando-se ao Spring, Guice e Pico.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/trabalhe-com-cdi-extensions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Kanban além do gerenciamento de software</title>
		<link>http://blog.caelum.com.br/kanban-alem-do-gerenciamento-de-software/</link>
		<comments>http://blog.caelum.com.br/kanban-alem-do-gerenciamento-de-software/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 12:35:49 +0000</pubDate>
		<dc:creator>Danuta Pereira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[kanban]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5497</guid>
		<description><![CDATA[Métodos ágeis são hoje bastante conhecidas para os desenvolvedores de software, mas suas ideias podem ser aplicadas em diversas outras áreas. Aliás, muitas delas nasceram fora da área de desenvolvimento. Há algum tempo usamos um Kanban em nosso departamento comercial para otimizar e gerenciar a produção de tarefa de todos. O objetivo inicial era fazer <a href="http://blog.caelum.com.br/kanban-alem-do-gerenciamento-de-software/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/trello2.png" width="240" />
		</p><p>Métodos ágeis são hoje bastante conhecidas para os desenvolvedores de software, mas suas ideias podem ser aplicadas em diversas outras áreas. Aliás, muitas delas nasceram fora da área de desenvolvimento. Há algum tempo usamos um Kanban em nosso departamento comercial para otimizar e gerenciar a produção de tarefa de todos. O objetivo inicial era fazer com que toda a equipe soubesse quais eram as próximas atividades a serem cumpridas por cada um dos seus membros.</p>
<p>A quantidade de atividades a serem feitas semanalmente não é pouca: recontatar alunos, relatório de turmas a iniciar, geração de contratos, reservas de alunos, depoimentos, salas de aula, material de apoio ao curso, impressão de certificados, controle de presenças, e etc. Em nossa equipe de 7 pessoas, era comum que algumas dessas atividades passem despercebidas e não sejam feitas no prazo requerido.</p>
<p>Hoje nosso kanban é organizado da seguinte maneira: cada membro da equipe tem uma cor que representa suas atividades. Toda segunda-feira a equipe organiza o kanban com as tarefas, em ordem de prioridade, que devem ser desenvolvidas ao longo da semana. As etapas do nosso kanban são <strong>a fazer</strong>, <strong>em andamento</strong> e <strong>concluído</strong>. O nome das etapas já deixa bem claro o status daquela tarefa. </p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/kanban.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/kanban-300x225.jpg" alt="kanban" width="300" height="225" class="aligncenter size-medium wp-image-5498" /></a></p>
<p>Dessa forma, é mais fácil supervisionar as tarefas estipuladas e a eventual cobrança do andamento delas. Nossa equipe é muito pró-ativa, e uma das diferenças que o Kanban nos trouxe, é que ao perceber que um dos membros não deu andamento em uma de suas tarefas ainda, um outro membro pode ajudar, tornando o processo mais ágil.</p>
<p>Há algum tempo atrás, optamos por abandonar o kanban, pois acreditávamos que todos os membros já estavam bem cientes de suas atividades. Hoje já voltamos a utilizá-lo novamente, devido a todas as vantagens relacionadas a visibilidade que já foram comentadas. Mas atualmente fazemos uso de um kanban virtual. O <a href="http://trello.com">Trello</a>  foi a ferramenta escolhida, e todos temos acesso ao quadro das tarefas.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/trello2.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/trello2-300x101.png" alt="trello2" width="300" height="101" class="aligncenter size-medium wp-image-5501" /></a></p>
<p>A utilização do Kanban fez com que nossa equipe se tornasse mais dinâmica, flexível. Além disso, ele deixou claro que para conseguirmos realizar as tarefas com excelência, é necessária a colaboração e supervisão de todos.</p>
<p>Você já utilizou Scrum ou algum outro método ágil fora de software? O que acha de implementar o Kanban em sua empresa? Em nosso <a href="http://www.caelum.com.br/curso-agile-scrum/">curso de agilidade</a>, discutimos metodologias ágeis dentro e fora de software. Otimizar processos não é algo útil somente nessa área.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/kanban-alem-do-gerenciamento-de-software/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Conheça as principais novidades no JavaEE 7</title>
		<link>http://blog.caelum.com.br/novidades-javaee7-2/</link>
		<comments>http://blog.caelum.com.br/novidades-javaee7-2/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 13:45:16 +0000</pubDate>
		<dc:creator>Mário Amaral</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[java ee]]></category>
		<category><![CDATA[java ee 7]]></category>
		<category><![CDATA[jcp]]></category>
		<category><![CDATA[jsr]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5471</guid>
		<description><![CDATA[Previsto para abril de 2013, a nova versão do JavaEE vem com atualizações para as principais especificações, além da adição de várias outras focadas em facilitar o desenvolvimento de aplicações para nuvem no modelo PAAS. Vejamos as principais novidades: JPA 2.1 (JSR-338) Agora a JPA irá suportar chamadas a procedures de maneira transparente, sem a <a href="http://blog.caelum.com.br/novidades-javaee7-2/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/Screen-Shot-2013-03-11-at-7.03.58-PM.png" width="240" />
		</p><p>Previsto para abril de 2013, a nova versão do <strong>JavaEE</strong> vem com atualizações para as principais especificações, além da adição de várias outras focadas em facilitar o desenvolvimento de aplicações para nuvem no modelo <em>PAAS</em>. </p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/Screen-Shot-2013-03-11-at-7.03.58-PM.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/03/Screen-Shot-2013-03-11-at-7.03.58-PM-300x205.png" alt="Screen Shot 2013-03-11 at 7.03.58 PM" width="300" height="205" class="aligncenter size-medium wp-image-5496" /></a></p>
<p>Vejamos as principais novidades:</p>
<p><strong>JPA 2.1</strong> (<a href="http://jcp.org/en/jsr/detail?id=338" title="JSR-338" target="_blank">JSR-338</a>)<br />
Agora a JPA irá suportar chamadas a <em>procedures</em> de maneira transparente, sem a necessidade de usar código específico de nenhuma implementação:</p>
<pre class="brush: java; title: ; notranslate">
  //prepara a procedure
  StoredProcedureQuery query = EntityManager.createStoredProcedureQuery(&quot;processaBoletos&quot;);
  //registra os parametros da procedure
  query.registerStoredProcedureParameter(1, String.class, ParameterMode.OUT); //saída
  query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN); //entrada
  query.setParameter(2, 001); //seta o parametro
  query.execute();
  String resposta= query.getOutputParameterValue(1);
</pre>
<p>Podemos também invocar qualquer função que esteja disponível no banco de dados, através do novo comando <code>FUNCTION</code> da <code>JPQL</code>:</p>
<pre class="brush: sql; title: ; notranslate">
  SELECT c
  FROM Cliente c
  WHERE FUNCTION(‘EhClienteEspecial’, c.id)
</pre>
<p>Os <code>EntityListeners</code> da JPA agora também estão integrados com o <strong>CDI</strong>, permitindo receber por injeção qualquer dependência usando o <code>@Inject</code>:</p>
<pre class="brush: java; title: ; notranslate">
  class PedidoListener{
    @Inject
    private GeredorDeNumero gerador;

    @PrePersist
    public void geraNumero (Object o){
      Pedido p = (Pedido) o;
      P.setNumero(gerador.novoNumero());
    }
  }
</pre>
<p>Também foi incluído o suporte a operações de update e delete em lote usando criteria, <a href="https://blogs.oracle.com/arungupta/entry/jpa_2_1_early_draft" target="_blank">além de outras funcionalidades</a>.</p>
<p><strong>CDI 1.1</strong> (<a href="http://jcp.org/en/jsr/detail?id=346" title="JSR-346" target="_blank">JSR-346</a>)</p>
<p>Apenas pequenas mudanças e melhorias serão incluídas nessa versão. Entre algumas das novidades esperadas estão permitir a ordenação de <em>Interceptors</em> e <em>Decorators</em>, uma API para criação de contextos personalizados, injeção de objetos estáticos e criação de eventos relacionados a API de <em>Servlets</em>, como inicio/fim de um <code>HTTPServletRequest</code> por exemplo.</p>
<p><strong>EJB 3.2</strong> (<a href="http://jcp.org/en/jsr/detail?id=345" title="JSR-345" target="_blank">JSR-345</a>)<br />
Aqui o foco é continuar facilitando cada vez mais a configuração e o uso de <strong>EJBs</strong>. Agora teremos suporte a transações dentro de <em>callbacks</em> do ciclo de vida dos <em>beans</em>:</p>
<pre class="brush: java; title: ; notranslate">
@Stateful
public class CarrinhoBean{
  @PersistenceContext
  private EntityManager em;

  @TransactionAttribute
  @PrePassivate
  public void armazenaNoBanco(){
     // algum código transacional
  }
     ...
}
</pre>
<p>As configurações sobre quais interfaces serão expostas nos <em>beans</em> também foram simplificadas:</p>
<pre class="brush: java; title: ; notranslate">
  public interface Agendador{}
  public interface Executador{}
    //todas as interfaces são locais
    @Stateless
    public class AgendadorBean implements Executador, Agendador{
    ...
  }

  //todas as interfaces são remotas
  @Remote
  @Stateless
  public class AgendadorBean implements Executador, Agendador{
    ...
  }
</pre>
<p>Caso deseje que apenas uma das interfaces seja exposta, é só adicionar a anotação desejada:</p>
<pre class="brush: java; title: ; notranslate">
  @Remote
  public interface Agendador{}

  //apenas a interface Agendador é exposta como remota
  @Stateless
  public class AgendadorBean implements Executador, Agendador{
    ...
  }
</pre>
<p><strong>JSF 2.2</strong> (<a href="http://jcp.org/en/jsr/detail?id=344" title="JSR-344" target="_blank">JSR-344</a>)</p>
<p>Algumas <em>features</em> que antes só estavam disponíveis através do <strong>Seam3</strong> agora fazem parte da especificação. Isso acontece com a tag <code>viewAction</code> e a possibilidade de receber injeção de dependências via <code>CDI</code> em qualquer componente do JSF, como <code>Validator</code>, <code>Converters</code> e até mesmo em componentes customizados.</p>
<p>Uma nova <em>annotation</em> <code>@ViewScoped</code> foi criada em substituição a atual para permitir integração do CDI com <em>ManagedBeans</em> neste escopo. E falando em escopos, o <code>@FlowScoped</code> foi adicionado para ajudar na criação de fluxos pré-definidos, como <em>wizards</em>, sequências de passos em algum fluxo de negócio, etc.</p>
<p>Além destas, ainda há uma integração melhor com <strong>HTML5</strong>, suporte a configuração programática, um novo componente para <em>upload</em> de arquivos usando <em>ajax</em>, e muitas outras, como é possível ver na <a title="lista de novidades no JSF 2.2" href="http://jdevelopment.nl/jsf-22" target="_blank">lista de novidades no JSF 2.2</a></p>
<p><strong>JAX-RS 2.0</strong> (<a href="http://jcp.org/en/jsr/detail?id=339" title="JSR-339" target="_blank">JSR-339</a>)</p>
<p>Agora com suporte a uma API de cliente, é possível implementar chamadas a um serviço <em>rest</em> de maneira portável entre os servidores sem a necessidade de bibliotecas externas:</p>
<pre class="brush: java; title: ; notranslate">
  Client client = ClientFactory.newClient();

  //Dispara uma requisição GET para a url http://.../produtos?nome=Caneta
  Produto p = client.target(&quot;http://.../produtos&quot;)
                    .queryParam(&quot;nome&quot;, &quot;Caneta&quot;)
                    .request().get(Produto.class);
</pre>
<p><a href="http://java.dzone.com/articles/whats-new-jax-rs-20" target="_blank">Outras novidades</a> são a integração com <strong>Bean Validation</strong>, suporte a requisições assíncronas tanto na API cliente quanto na servidor, filtros e interceptors.</p>
<p><strong>JMS 2.0</strong> (<a href="http://jcp.org/en/jsr/detail?id=343" title="JSR-343" target="_blank">JSR-343</a>)</p>
<p>JMS foi uma das especificações que mais sofreram alterações, removendo a maior parte do código desnecessário para enviar mensagens:</p>
<pre class="brush: java; title: ; notranslate">
  @Stateless
  public class EnviadorDeMensagens
    @Resource(lookup = &quot;jms/connectionFactory&quot;)
    ConnectionFactory connectionFactory;

    @Resource(lookup=&quot;jms/fila&quot;)
    Queue fila;

    public void sendMessageNew (String msg) {
      try (JMSContext context = connectionFactory.createContext();){
        context.send(fila,msg);
      }
    }
  }
</pre>
<p>Além de <a href="http://www.slideshare.net/arungupta1/jms20"target="_blank">outras alterações e novas funcionalidades</a>, como o suporte a <em>Paas</em>, melhorias nos <em>Message Driven Beans</em> e envio de mensagens com hora marcada.</p>
<p><strong>Bean Validation 1.1</strong> (<a href="http://jcp.org/en/jsr/detail?id=349" title="JSR-349" target="_blank">JSR-349</a>)</p>
<p>As anotações de validação agora podem ser utilizadas em parametros de métodos:</p>
<pre class="brush: java; title: ; notranslate">
public void login (@NotNull String login, @NotNull String pass){
  ...
}
</pre>
<p>Componentes como <code>ConstraintValidator</code> agora são integrados ao <strong>CDI</strong>, <a href="http://relation.to/18584.lace" target="_blank">além de outras pequenas mudanças</a>.</p>
<p>Outras especificações foram adicionadas ao JavaEE, como <a href="http://jcp.org/en/jsr/detail?id=107" target="_blank">JCACHE</a> para gerenciamento de cache de objetos, <a href="https://blogs.oracle.com/arungupta/entry/batch_applications_in_java_ee" target="_blank">Batch</a> para execução de tarefas em lote, similar ao <a href="http://static.springsource.org/spring-batch/" target="_blank">Spring Batch</a>, <a href="http://jcp.org/en/jsr/detail?id=353" target="_blank">JSON-P</a> com as mesmas funcionalidades do JAX-B, mas para Json. <a href="https://blogs.oracle.com/arungupta/entry/java_ee_7_key_features" target="_blank">Na lista completa de funcionalidades do JavaEE 7</a> você pode acompanhar todas as <em>JSRs</em> e conhecer mais sobre as novas especificações e evoluções da plataforma Java.</p>
<p>O que acha das novidades? O que você sente falta no desenvolvimento Java EE?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/novidades-javaee7-2/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Apostilas da Caelum offline com Application Cache do HTML 5</title>
		<link>http://blog.caelum.com.br/apostilas-da-caelum-offline-com-application-cache-do-html-5/</link>
		<comments>http://blog.caelum.com.br/apostilas-da-caelum-offline-com-application-cache-do-html-5/#comments</comments>
		<pubDate>Tue, 05 Mar 2013 13:14:14 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[apostilas]]></category>
		<category><![CDATA[appcache]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[offline]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5485</guid>
		<description><![CDATA[Você já conhece as apostilas abertas da Caelum. Disponíveis gratuitamente desde 2004 para download, elas são um diferencial nessa proposta pioneira da Caelum de difundir o conhecimento. E as apostilas estão em constante evolução e inovação. Sempre atualizamos o conteúdo com novos exercícios e mais explicações &#8211; aliás, é por isso que você deve sermpre <a href="http://blog.caelum.com.br/apostilas-da-caelum-offline-com-application-cache-do-html-5/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/apostilas.jpg" width="240" />
		</p><p>Você já conhece as <a href="http://www.caelum.com.br/apostilas/">apostilas abertas</a> da Caelum. Disponíveis gratuitamente desde 2004 para download, elas são um diferencial nessa proposta pioneira da Caelum de difundir o conhecimento.</p>
<p>E as apostilas estão em <b>constante evolução e inovação</b>. Sempre atualizamos o conteúdo com novos exercícios e mais explicações &#8211; aliás, é por isso que você deve sermpre baixar a versão mais nova na <a href="http://www.caelum.com.br/apostilas/">página oficial</a>. E sempre tentamos inovar na distribuição da apostila.</p>
<p><img class="aligncenter size-full wp-image-5310" title="apostilas" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/apostilas.jpg" alt="" width="550" height="252" /></p>
<p>Na começo, publicamos <b>PDFs</b> pra você baixar e imprimir. Com a popularização dos ereaders, começamos a publicar versões de <b>ebook em ePub e mobi</b> (Kindle).  Mas, às vezes, você quer apenas olhar um assunto rapidamente, ou mandar um link sobre algum tópico pra um amigo. Pra isso, lançamos 6 meses atrás as <b>apostilas em HTML pra ler no navegador</b>. Não precisa baixar nada, só clicar, ler, navegar, linkar.</p>
<p>A última inovação que acabamos de colocar no ar é suporte a <b>leitura offline na versão HTML</b>. Ou seja, você não precisa mais baixar o PDF ou os ebooks se quiser ler quando não estiver conectado a Internet. A versão HTML funciona em qualquer navegador moderno, incluindo <b>tablets e smartphones</b>, já que tem uma interface responsiva.</p>
<p>As novas apostilas HTML com suporte a offline juntam as vantagens das versões para download com as vantagens da Web. Para instalar, acesse o menu superior da apostila e vá na opção <i>Leitura offline</i>:</p>
<ul>
<li><a href="http://www.caelum.com.br/apostila-java-orientacao-objetos/">Java e Orientação a Objetos</a></li>
<li><a href="http://www.caelum.com.br/apostila-java-web/">Java para Desenvolvimento Web</a></li>
<li><a href="http://www.caelum.com.br/apostila-java-testes-xml-design-patterns/">Laboratório Java com Testes, XML e Design Patterns</a></li>
<li><a href="http://www.caelum.com.br/apostila-ruby-on-rails/">Desenvolvimento Ágil para Web com Ruby on Rails 3</a></li>
<li><a href="http://www.caelum.com.br/apostila-vraptor-hibernate/">Desenvolvimento Ágil para a Web 2.0 com VRaptor, Hibernate e AJAX</a></li>
<li><a href="http://www.caelum.com.br/apostila-java-estrutura-dados/">Algoritmos e Estrutura de Dados em Java</a></li>
</ul>
<p>E, claro, as outras opções para download (PDF, ePub, mobi) continuam disponíveis. Você escolhe a opção que for melhor pra você.</p>
<h3>A implementação</h3>
<p>O suporte a leitura offline é implementado usando a <a href="https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache">Application Cache API</a> disponível no HTML 5. O <a href="http://caniuse.com/offline-apps">suporte nos navegadores</a> é muito bom: Chrome, Firefox, Opera, Internet Explorer (a partir da versão 10), iOS, Android e Blackberry. </p>
<p>A experiência na criação desse recurso gerou uma <a href="http://sergiolopes.org/palestra-appcache-html5-offline/">palestra sobre o HTML5 offline e Application Cache</a> que você pode consultar para aprender mais. Se estiver curioso, dê uma espiada no <a href="http://www.caelum.com.br/apostila-java-orientacao-objetos/offline/cache.manifest">arquivo de manifest</a> da apostila FJ-11. É um arquivo texto bem simples de ler, e ele lista todos os componentes da apostila que serão baixados pelo navegador. A partir dele que é feita a instalação com a Application Cache API.</p>
<p>Essa novidade ainda está em beta, apesar dos testes extensivos que fizemos. Teste você também e deixe sua opinião nos comentários!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/apostilas-da-caelum-offline-com-application-cache-do-html-5/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Internet Explorer, testes cross browsers e a política de compatibilidade</title>
		<link>http://blog.caelum.com.br/internet-explorer-testes-cross-browsers-e-a-politica-de-compatibilidade/</link>
		<comments>http://blog.caelum.com.br/internet-explorer-testes-cross-browsers-e-a-politica-de-compatibilidade/#comments</comments>
		<pubDate>Mon, 18 Feb 2013 17:59:48 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[navegadores]]></category>
		<category><![CDATA[política]]></category>
		<category><![CDATA[wd-43]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5465</guid>
		<description><![CDATA[Quais versões de que browsers você deve suportar no seu website? Qual política deve ser adotada pela sua empresa? Decisões difíceis, dado que tempo e verba são escassos. Muitos desistiam de suportar versões antigas do Internet Explorer, cortando uma fatia significativa de possíveis consumidores. O fantasma do Internet Explorer assombrou a Web durante muito tempo. <a href="http://blog.caelum.com.br/internet-explorer-testes-cross-browsers-e-a-politica-de-compatibilidade/#more-'" class="more-link">more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/02/internet-explorer.jpeg" width="240" />
		</p><p>Quais versões de que browsers você deve suportar no seu website? Qual política deve ser adotada pela sua empresa?</p>
<p>Decisões difíceis, dado que tempo e verba são escassos. Muitos desistiam de suportar versões antigas do Internet Explorer, cortando uma fatia significativa de possíveis consumidores.</p>
<p>O fantasma do Internet Explorer assombrou a Web durante muito tempo. Navegadores ruins, não cumprimento dos padrões, problemas de segurança, péssima performance, e uma chatice pra testar os sites. <strong>Não mais.</strong> O mundo é outro hoje em dia e o tempo de fazer piada com o Internet Explorer está ficando pra trás.</p>
<p>O problema do IE está se resolvendo de várias maneiras:</p>
<ul>
<li>As versões mais novas são realmente muito boas &#8211; IE9 e IE10.</li>
<li>A Microsoft fez um update automático para todos os usuários de IE levando à versão mais recente disponível. Isso fez IE6 e IE7 praticamente sumirem.</li>
<li>Testar os sites no IE está muito fácil, inclusive no Mac e no Linux.</li>
<li>Muita gente migrou para outros browsers &#8211; <a href="http://gs.statcounter.com/#browser-BR-monthly-201106-201301">Chrome já é o browser mais usado no Brasil há bastante tempo</a>!</li>
</ul>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/02/internetexplorer9logo.png" alt="internetexplorer9logo" width="256" height="256" class="aligncenter size-full wp-image-5468" /></p>
<h2>Como testar no Internet Explorer no Windows, Mac e Linux?</h2>
<p>Primeiro, só um serviço remoto de screenshots não resolve. Você precisa <strong>testar na sua máquina</strong>, usar o site. Pra isso, precisa instalar várias versões juntas. E o problema é que o IE vem embutido no Windows de tal forma que isso é impossível.</p>
<p>Existem algumas gambiarras que tentam fazer vários IEs rodarem ao mesmo tempo. Ou tem gente que só instala a versão mais nova e usa o modo de compatibilidade nas ferramentas pra emular os IEs velhos. <strong>Não faça isso</strong>, nada disso serve. Pra realmente testar o IE, você precisa de uma instalação limpa de cada um deles. Ou seja, você precisa de vários Windows.</p>
<p>Como fazer? <strong>Use máquinas virtuais</strong>, claro. Mas, até mês passado, isso significava comprar um Windows de cada versão (XP, Vista, 7 e 8). Não mais.</p>
<p>A Microsoft lançou <strong>máquinas virtuais oficiais</strong> com IE 6, 7, 8, 9, 10, no XP, Vista, Windows 7 e 8. Tudo <strong>legalizado</strong>, focado nos testes pra desenvolvedores Web. E mais: tem versões pra Windows, Mac e Linux, rodando em várias plataformas de virtualização: VMWare, VirtualBox e VirtualPC (Parallels a caminho). <a href="http://www.modern.ie/virtualization-tools">É só baixar e rodar</a>.</p>
<p>Há o trabalho de abrir a VM, claro, toda vez que for testar. Mas, por favor, <strong>faça isso</strong>. Dica bônus: se você colocar 8GB de memória e um SSD na sua máquina, consegue rodar fácil 3 Windows ao mesmo tempo, além do seu sistema normal.</p>
<h2>Quais versões do IE preciso testar?</h2>
<p>Depende bastante do seu público. Mas já é meio consenso que <a href="http://gs.statcounter.com/#browser_version_partially_combined-BR-monthly-201208-201301">IE6 e IE7 já eram</a>. Claro, pode ser que seu público ainda use, então veja suas estatísticas. </p>
<p>O IE8 é um caso mais particular, já que é a última versão disponível no Windows XP, então muita gente ainda tem &#8211; 7,5% no Brasil em Janeiro/2013. Mesmo assim, muita gente já não suporta mais, como <a href="http://googleappsupdates.blogspot.com.br/2012/09/supporting-modern-browsers-internet.html">o Google</a>.</p>
<h2>Qual a política da Caelum?</h2>
<p>Analisando os números do <a href="http://www.caelum.com.br/">site da Caelum</a>, vemos uma distribuição bem parecida com a população geral do Brasil: 60% de Chrome, 25% Firefox e 7,5% de todos os IEs.</p>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/02/stats-caelum-jan2013-browser.png" alt="stats-caelum-jan2013-browser" width="238" height="273" class="aligncenter size-full wp-image-5466" /></p>
<p>Se observarmos as versões do IE então, vamos ver que IE9 e IE8 dominam, com o IE10 crescendo rápido. Mesmo assim, se calculasse com relação a total de usuários, teríamos: 4,3% de IE9, 2,4% de IE8, 0,5% de IE10, 0,24% de IE7 e 0,03% de IE6.</p>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/02/stats-caelum-jan2013-ie.png" alt="stats-caelum-jan2013-ie" width="202" height="203" class="aligncenter size-full wp-image-5467" /></p>
<p>(E você pode comparar a evolução com <a href="http://blog.caelum.com.br/evolucao-dos-navegadores-e-estatisticas-de-acesso/">esse post nosso de 2011</a>, quando mostramos que 21% das pessoas usavam IE, sendo 16,8% só de IE8.)</p>
<p>Com isso, a <strong>política hoje da Caelum em 2013</strong> é:</p>
<ul>
<li>Suportar IE8+ nos sites de audiência mais aberta (<a href="http://www.caelum.com.br">site principal</a>, <a href="http://www.guj.com.br">GUJ</a> etc).</li>
<li>Suportar IE9+ nos sites mais específicos (como <a href="http://online.caelum.com.br">plataforma Online</a>)</li>
</ul>
<h2>Uma nota final sobre o IE10</h2>
<p>O IE10 é um <strong>excelente navegador</strong> &#8211; até a Microsoft tá <a href="http://browseryoulovedtohate.com/">tirando sarro com isso</a>, de tão <i>inusitado</i>, mas é verdade.</p>
<p>Um ponto importante: teste no IE10 também. Reparem nas estatísticas  que IE10 já passou IE7+IE6 e já já passa IE8. A questão com o IE10 é que ele traz alguns desafios. Ele roda por enquanto só no Windows 8 e se integra de tal forma a ser o único browser disponível na versão tablet &#8211; e o &#8220;Metro Mode&#8221;. Quando sair a versão pra Windows 7 (esse semestre), deve passar todos os outros facilmente.</p>
<p>Hoje, pra testar o IE10, você precisa do Windows 8 (tem de graça lá no site da Microsoft de VMs). E existem 3 modos do IE10 que você precisa testar: Desktop-mode (IE normal), Metro mode, e Snap Mode. A boa notícia é que o IE10 é muito bom em padrões web, performance e usabilidade; não deve dar muito trabalho.</p>
<p>É isso. O cenário de testes e suporte ao IE tem melhorado a cada momento. As últimas versões são bastante boas, as versões antigas perdem market share rapidamente, e as novas VMs gratuitas disponibilizadas pela Microsoft facilitam muito o desenvolvimento. Por isso, considere fortemente incluir as versões antigas.</p>
<p>E qual é sua política de suporte a browsers? Alguma dica para facilitar esse trabalho? A gente discute esses e outros pontos sobre desenvolvimento Web no <a href="http://www.caelum.com.br/curso-html-css-javascript/">curso de front-end</a> da Caelum.</p>
<p>No desenvolvimento mobile os testes podem ser ainda mais complicados e a variação de resolução, viewport e fabricantes deixa tudo desafiador. Participe do <a href="http://www.mobileconf.com.br/">MobileConf Brasil</a>, que acontecerá dia 5 de abril e conheça mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/internet-explorer-testes-cross-browsers-e-a-politica-de-compatibilidade/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
