<?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>1up4Developers &#187; web</title>
	<atom:link href="http://1up4dev.org/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://1up4dev.org</link>
	<description>Nadando contra o Waterfall. tail -f /mind/realworld &#62;&#62; /blog</description>
	<lastBuildDate>Thu, 29 Jul 2010 04:27:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Gerando rotas com parâmetros dinâmicos no Rails de modo fácil</title>
		<link>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/</link>
		<comments>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 09:00:23 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=680</guid>
		<description><![CDATA[A API de rotas do Rails simplifica consideravelmente o desenvolvimento fornecendo um padrão de geração e utilização de URLs para toda aplicação. Porém algumas necessidades especificas e relativamente simples podem gerar dores de cabeça se forem implementadas incorretamente.
Um caso bastante comum são URLs compostas que sempre apontam para um mesmo recurso. Por exemplo, um blog que [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://api.rubyonrails.org/classes/ActionController/Routing.html">API de rotas</a> do Rails simplifica consideravelmente o desenvolvimento fornecendo um padrão de geração e utilização de URLs para toda aplicação. Porém algumas necessidades especificas e relativamente simples podem gerar dores de cabeça se forem implementadas incorretamente.</p>
<p>Um caso bastante comum são URLs compostas que sempre apontam para um mesmo recurso. Por exemplo, um blog que possua rotas para seus posts no formato <code>/posts/autor/categoria/permalink</code> provavelmente terá uma rota mapeada como <code>map.post "posts/:author/:category/:permalink"</code> gerando automaticamente os helpers <code>post_path</code> e <code>post_url</code>.</p>
<p>Muito bom, porém para <a href="http://guides.rubyonrails.org/routing.html#generating-urls-from-code">usufruirmos desta facilidade</a> precisamos fornecer os valores dos parâmetros dinâmicos nos <em>controllers</em> e <em>views</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">post_path<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>E mesmo que você forneça os <a href="http://guides.rubyonrails.org/routing.html#route-generation-from-arrays">parâmetros em um array</a>, vai dar muito trabalho além de deixar muito código repetido pela aplicação.</p>
<h2>Entendi! Mas como resolvo este problema?</h2>
<p>Para este caso, apenas implementar o método <code><a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001840">to_param</a></code> do model não vai servir. Uma solução seria reescrever o método <code>post_path</code> (que é gerado automaticamente) no respectivo helper (posts_helper.rb):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> post_path<span style="color:#006600; font-weight:bold;">&#40;</span>post, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> post.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Outra solução seria sobrescrever o método <code><a href="http://api.rubyonrails.org/classes/ActionController/Base.html#M000467">default_url_options</a></code> no <em>controller</em> para retorna os parâmetros padrões da rota:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> default_url_options<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  options.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:author</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">author</span>, <span style="color:#ff3333; font-weight:bold;">:category</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">category</span>, <span style="color:#ff3333; font-weight:bold;">:permalink</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@post</span>.<span style="color:#9900CC;">permalink</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#996600;">&quot;show&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>A má notícia é que você terá que fazer isto para todos seus controllers e respectivos models.</p>
<p>A terceira solução (e mais elegante) é padronizar a maneira com que os parâmetros opcionais da rota são obtidos a partir do controller e seu respectivo model. Basta adicionar os seguintes métodos no seu <em>ApplicationController</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> default_url_options<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>model = controller_model<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    dynamic_route_params<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>param<span style="color:#006600; font-weight:bold;">|</span>
      options<span style="color:#006600; font-weight:bold;">&#91;</span>param<span style="color:#006600; font-weight:bold;">&#93;</span> = model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>param<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> model.<span style="color:#9900CC;">respond_to</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>param<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  options
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> controller_model<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  clazz = <span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">singularize</span>.<span style="color:#9900CC;">camelize</span>.<span style="color:#9900CC;">constantize</span> <span style="color:#9966CC; font-weight:bold;">rescue</span> ActiveRecord<span style="color:#006600; font-weight:bold;">&#41;</span>
  options.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>key, value<span style="color:#006600; font-weight:bold;">|</span> value.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>clazz<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">second</span>
<span style="color:#9966CC; font-weight:bold;">rescue</span>
  <span style="color:#0000FF; font-weight:bold;">nil</span>
<span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> dynamic_route_params<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  returning <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>dynamic_params<span style="color:#006600; font-weight:bold;">|</span>
    matched_routes = <span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">routes</span>.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>route<span style="color:#006600; font-weight:bold;">|</span>
      route.<span style="color:#9900CC;">matches_controller_and_action</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">&#93;</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    dynamic_segments = matched_routes.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>:segments<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>segment<span style="color:#006600; font-weight:bold;">|</span>
      dynamic_params <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> segment.<span style="color:#9900CC;">key</span> <span style="color:#9966CC; font-weight:bold;">if</span> segment.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::DynamicSegment</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Assim, os valores defaults dos parâmetros da rota serão obtidos diretamente do model. Caso queiram contribuir, este código está disponível no <a href="http://github.com/1up4dev/random-samples/blob/master/dynamic_route_params/dynamic_route_params.rb">github</a>.</p>
<p><strong>Referências</strong><br />
<a href="http://railsguts.com/routing_inside_out.html">Rails Routing from the Inside Out</a><br />
<a href="http://guides.rubyonrails.org/routing.html">Rails Guides: Routing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2010/07/gerando-rotas-com-parametros-dinamicos-no-rails-de-modo-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paginação no Rails com will_paginate e Ajax de modo fácil</title>
		<link>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/</link>
		<comments>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 03:30:48 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=503</guid>
		<description><![CDATA[Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem WillPaginate que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.
Instalando a gem:
sudo gem install will_paginate
Para utilizar na aplicação, adicione [...]]]></description>
			<content:encoded><![CDATA[<p>Paginação é um recurso simples e indispensável em qualquer aplicação séria. Em se tratando de Rails, a solução mais popular é a gem <a href="http://github.com/mislav/will_paginate/tree/master" target="_blank">WillPaginate</a> que basicamente adiciona o método &#8220;paginate_&#8221; aos models do ActiveRecord e fornece um helper para renderização dos links da paginação nas views.</p>
<p>Instalando a gem:</p>
<pre>sudo gem install will_paginate</pre>
<p>Para utilizar na aplicação, adicione no final do <code>config/environment.rb</code>:</p>
<pre>require 'will_paginate'</pre>
<p>Altere o controller para utilizar paginação:</p>
<pre>def index
  @posts = Post.paginate :all, :page =&gt; params[:page], :per_page =&gt; 10
end</pre>
<p>E adicione os links da paginação na view:</p>
<pre>&lt;%= will_paginate @posts %&gt;</pre>
<p>Pronto! Ao clicar nos links da paginação o parâmetro &#8220;page&#8221; será incluído automaticamente na requisição.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/07/posts.png"><img class="alignnone size-medium wp-image-509" title="posts" src="http://1up4dev.org/wp-content/uploads/2009/07/posts-300x253.png" alt="" width="300" height="253" /></a></p>
<h2>Legal, mas cadê o &#8220;ajax&#8221;?</h2>
<p>Por padrão o WillPaginate não se preocupa com isso. O próprio desenvolvedor <a href="http://wiki.github.com/mislav/will_paginate/ajax-pagination" target="_blank">recomenda usar javascript</a> para interceptar o &#8220;click&#8221; dos links e renderizar o resultado na mesma página.</p>
<p>Outra alternativa seria estender a classe responsável por renderizar os links da paginação para utilizar requisições com ajax.</p>
<p>Inclua em <code>app/helpers</code> o arquivo <code>ajax_will_paginate.rb</code> com o código:</p>
<pre>class AjaxWillPaginate &lt; WillPaginate::LinkRenderer
  def prepare(collection, options, template)
    @update = options[:update]
    super
  end
  protected
  def page_link(page, text, attributes = {})
    @template.link_to_remote(text, {
      :url     =&gt; url_for(page),
      :method  =&gt; :get,
      :update =&gt; @update
    })
  end
end</pre>
<p>Então adicione no final do arquivo <code>config/environment.rb</code>:</p>
<pre>  WillPaginate::ViewHelpers.pagination_options[:renderer] = 'AjaxWillPaginate'</pre>
<p>E altere a chamada do helper na view para:</p>
<pre>&lt;%= will_paginate @posts, :update =&gt; 'div_principal' %&gt;</pre>
<p>Informe na opção <code>:update</code> o Id de um objeto html que contenha todo o conteúdo da paginação que será substituído nas requisições seguintes.</p>
<p>É importante lembrar que esta solução altera o comportamento de todos os helpers de paginação da aplicação, por isso deve ser utilizada com cautela. <a href="http://www.botvector.net/2008/08/willpaginate-on-ajax.html" target="_blank">Outras</a> <a href="http://weblog.redlinesoftware.com/2008/1/30/willpaginate-and-remote-links" target="_blank">soluções</a> parecidas podem ser encontradas <a href="http://www.google.com.br/search?q=ajax+will+paginate" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/07/paginacao-no-rails-com-will_paginate-e-ajax-de-modo-facil/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agendando tarefas em aplicações Rails com rufus-scheduler</title>
		<link>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/</link>
		<comments>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/#comments</comments>
		<pubDate>Sun, 31 May 2009 18:33:06 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=501</guid>
		<description><![CDATA[Rufus é um conjunto de gems utilizado para Workflow e BPM. O rufus-scheduler é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o Quartz não vai ter dificuldade em utilizá-la.
Instalação:
sudo gem install rufus-scheduler
Utilização:
require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rufus.rubyforge.org/" target="_blank">Rufus</a> é um conjunto de gems utilizado para <a href="http://pt.wikipedia.org/wiki/Fluxo_de_Trabalho" target="_blank">Workflow</a> e <a href="http://pt.wikipedia.org/wiki/Business_Process_Management" target="_blank">BPM</a>. O <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">rufus-scheduler</a> é a gem responsável pelo agendamento e execução de tarefas (jobs). Se você programa em Java e conhece o <a href="http://www.opensymphony.com/quartz/wikidocs/QuickStart.html" target="_blank">Quartz</a> não vai ter dificuldade em utilizá-la.</p>
<p>Instalação:</p>
<pre>sudo gem install rufus-scheduler</pre>
<p>Utilização:</p>
<pre>require 'rubygems'
require 'rufus/scheduler'

scheduler = Rufus::Scheduler.start_new

scheduler.every '5m' do
  puts 'Executando a cada 5 minutos'
end

scheduler.schedule '0 18 * * *' do
  puts 'Executando todos os dias as 18h'
end</pre>
<p>Simples assim! Consulte a <a href="http://rufus.rubyforge.org/rufus-scheduler/" target="_blank">documentação</a> oficial ou <a href="http://github.com/jmettraux/rufus-scheduler/tree/master" target="_blank">contribua com o código</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/agendando-tarefas-em-aplicacoes-rails-com-rufus-scheduler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery DataTables, GitHub API e links da semana</title>
		<link>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/</link>
		<comments>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/#comments</comments>
		<pubDate>Mon, 04 May 2009 04:00:27 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[jquey]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=477</guid>
		<description><![CDATA[jQuery DataTables
Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &#60;table/&#62; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável automagicamente.

Para usar, basta incluir o plugin na página após o jQuery e executar o script:
$(document).ready(function() {
    $("id-tabela").dataTable();
}
No site oficial é possível [...]]]></description>
			<content:encoded><![CDATA[<h2><a href="http://www.datatables.net/" target="_blank">jQuery DataTables</a></h2>
<p>Nós somos fãs de jQuery pela sua simplicidade e poder de extensão através de plugins. Falando nisso, este plugin torna qualquer tabela &lt;table/&gt; em um &#8220;grid&#8221; ordenável, pesquisavel e paginável <em>automagicamente</em>.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/05/datatables.png"><img class="aligncenter size-medium wp-image-490" title="datatables" src="http://1up4dev.org/wp-content/uploads/2009/05/datatables-300x86.png" alt="" width="300" height="86" /></a></p>
<p>Para usar, basta incluir o plugin na página após o jQuery e executar o script:</p>
<pre>$(document).ready(function() {
    $("id-tabela").dataTable();
}</pre>
<p>No <a href="http://www.datatables.net/" target="_blank">site oficial</a> é possível consultar a documentação, exemplos e a <a href="http://www.datatables.net/plug-ins#language" target="_blank">tradução</a> para pt-br.</p>
<h2><a title="github api take two" href="http://github.com/blog/413-github-api-take-two">GitHub API, version 2</a></h2>
<p>Os caras do GitHub não são fracos não&#8230; já faz um tempinho, mas antes tarde do que nunca, anunciaram em seu <a title="GitHub Blog" href="http://github.com/blog">blog</a> a versão 2 do GitHub API. Ela provê acesso à &#8220;Repository, User, Commit, Object and Network&#8221; e futuramente ao Gist também. Como é a primeira release e ainda estão trabalhando nela, o próprio pessoal do Github pede ajuda a &#8220;desbravadores&#8221; e que abram tickets, caso encontrem algo. Documentação você encontra em  <a title="GitHub API Documentation" href="http://develop.github.com">develop.github.com</a>.</p>
<h2>Links da semana</h2>
<p><a href="http://www.desenvolvimentoparaweb.com/usabilidade/8-caracteristicas-de-user-interfaces-ui-de-sucesso/" target="_blank">8 características de User Interfaces (UI) de sucesso</a></p>
<p><a href="http://github.com/ryanb/nifty-generators/tree/master" target="_blank">Nifty Generators para Ruby on Rails</a></p>
<p><a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/" target="_blank">JRuby on Rails no Google App Engine</a></p>
<p><a href="http://www.ajaxianos.com.br/2008/10/grid-com-ordenacao-e-paginacao-animados/" target="_blank">Grid com ordenação e paginação animados</a></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/05/jquery-datatables-github-apilinks-semana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Guia de Ruby do Why e Autospec-notification</title>
		<link>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/</link>
		<comments>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 04:00:03 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[testes unitários]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=422</guid>
		<description><![CDATA[O comovente guia de Ruby do Why
Este livro é sensacional e demonstra exatamente o espírito do Ruby: papo de programador.

O livro é bem divertido. As tirinhas das raposas são ótimas. Várias pessoas contribuíram com a tradução para pt-br que está disponível no Github.
Leitura obrigatória. Chunky bacon!
Autospec-notification
O Autospec é um script gerado pelo RSpec que utiliza [...]]]></description>
			<content:encoded><![CDATA[<h2>O comovente guia de Ruby do Why</h2>
<p>Este <a href="http://poignantguide.net/ruby/" target="_blank">livro</a> é sensacional e demonstra exatamente o espírito do Ruby: papo de programador.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/04/thefoxes-3.png"><img class="aligncenter size-full wp-image-463" title="thefoxes-3" src="http://1up4dev.org/wp-content/uploads/2009/04/thefoxes-3.png" alt="" width="500" height="145" /></a></p>
<p>O livro é bem divertido. As tirinhas das raposas são ótimas. Várias <a href="http://www.nomedojogo.com/2008/10/28/why%E2%80%99s-poignant-guide-to-ruby-em-portugues/" target="_blank">pessoas</a> <a href="http://akitaonrails.com/2008/5/14/vamos-traduzir-o-why-s-poignant-guide-to-ruby" target="_blank">contribuíram</a> com a tradução para pt-br que está disponível no <a href="http://github.com/carlosbrando/poignant-br/tree/master" target="_blank">Github</a>.</p>
<p><a href="http://why.nomedojogo.com/" target="_blank">Leitura obrigatória</a>. Chunky bacon!</p>
<h2>Autospec-notification</h2>
<p>O <a href="http://www.nateclark.com/articles/2008/09/17/_autotest_-is-now-_autospec_-how-to-set-up-autospec-for-rspec-and-rails-with-zentest" target="_blank">Autospec</a> é um script gerado pelo <a href="http://rspec.info/" target="_blank">RSpec</a> que utiliza o Autotest para rodar os testes automaticamente a cada alteração no código.</p>
<p>Unindo o útil ao agradável, foi criado o <a href="http://www.mouseoverstudio.com/blog/2008/10/10/autospec-autotest-notification-autospec-notification-e-novidades/" target="_blank">Autospec-notification</a>, que exibe as notificações do autospec no desktop.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/04/sucesso.png"><img class="aligncenter size-full wp-image-465" title="sucesso" src="http://1up4dev.org/wp-content/uploads/2009/04/sucesso.png" alt="" width="500" height="173" /></a></p>
<p>Para instalar, comece pela gem ZenTest:</p>
<pre style="padding-left: 30px;">sudo gem install ZenTest</pre>
<p>No linux, instale o Libnotify:</p>
<pre style="padding-left: 30px;">sudo apt-get install libnotify-bin</pre>
<p>Agora instale a gem do autotest-notification:</p>
<pre style="padding-left: 30px;">sudo gem install carlosbrando-autotest-notification --source=http://gems.github.com</pre>
<p>Ative o autotest-notification e rode o autospec no seu projeto:</p>
<pre style="padding-left: 30px;">an-install</pre>
<pre style="padding-left: 30px;">script/autospec</pre>
<p>O código está no <a href="http://github.com/carlosbrando/autotest-notification/tree/master" target="_blank">Github</a>. Escreva seus testes e divirta-se!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/04/guia-de-ruby-do-why-autospec-autotest-notification/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remarkable, jqGrid no Rails, Heroku e Github issues</title>
		<link>http://1up4dev.org/2009/04/remarkable-jqgrid-no-rails-heroku-e-github-issues/</link>
		<comments>http://1up4dev.org/2009/04/remarkable-jqgrid-no-rails-heroku-e-github-issues/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 04:00:42 +0000</pubDate>
		<dc:creator>Equipe 1up4dev</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[jquey]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=412</guid>
		<description><![CDATA[Este é o primeiro post que publicaremos semanalmente reunindo novidades sobre desenvolvimento, artigos, notícias e temas variados sobre Rails.
Remarkable 3.0
Foi lançada a nova versão do Remarkable, um framework para testes com RSpec. Dentre as novidades, estão:

I18n, possibilitando gerar o output das specs no seu idioma favorito fluente
Pending Macros, facilitando o agrupamento das specs pendentes
Macro stubs [...]]]></description>
			<content:encoded><![CDATA[<p>Este é o primeiro post que publicaremos semanalmente reunindo novidades sobre desenvolvimento, artigos, notícias e temas variados sobre Rails.</p>
<h2><a href="http://www.nomedojogo.com/2009/04/14/remarkable-30-is-out-and-its-well-remarkable/" target="_blank">Remarkable 3.0</a></h2>
<p>Foi lançada a nova versão do Remarkable, um framework para testes com RSpec. Dentre as novidades, estão:</p>
<ul>
<li>I18n, possibilitando gerar o output das specs no seu idioma <span style="text-decoration: line-through;">favorito</span> fluente</li>
<li>Pending Macros, facilitando o agrupamento das specs pendentes</li>
<li>Macro stubs e mais opções de Matchers, simplificando testes com mocks</li>
</ul>
<p>Para instalar basta um <code>sudo gem install remarkable_rails</code></p>
<p>Saiba mais no site do <a href="http://www.nomedojogo.com/2009/04/14/remarkable-30-is-out-and-its-well-remarkable/" target="_blank">Carlos Brando</a>, lendo a <a href="http://remarkable.rubyforge.org/rails/" target="_blank">documentação</a> ou espiando o código no <a href="http://github.com/carlosbrando/remarkable/tree/master" target="_blank">Github</a>.</p>
<h2><a href="http://www.2dconcept.com/jquery-grid-rails-plugin" target="_blank">jqGrid no Rails</a></h2>
<p><a href="http://jquery.com/" target="_blank">jQuery</a> é um dos frameworks Javascript mais populares do mercado. O que <a href="http://www.2dconcept.com/articles/8-jquery-grid-rails-plugin" target="_blank">esse cara</a> fez foi juntar o <a href="http://www.trirand.com/jqgrid35/jqgrid.html" target="_blank">jqGrid</a>, que é um plugin muito bom para trabalhar com grids, num plugin para Rails, facilitando sua utilização.</p>
<p>Veja <a href="http://www.2dconcept.com/jquery-grid-rails-plugin" target="_blank">aqui</a> um guia de utilização do plugin, a <a href="http://github.com/ahe/jqgrid_demo_app/tree/master" target="_blank">aplicação de exemplo</a> ou confira o código no <a href="http://github.com/ahe/2dc_jqgrid/tree/master" target="_blank">Github</a>.</p>
<h2><a title="Heroku" href="http://heroku.com/" target="_blank">Heroku</a></h2>
<p>Apesar da simplicidade do <a title="Business Bingo Generator" href="http://1up4dev.org/2009/04/business-bingo-generator/" target="_blank">Business Bingo Generator</a>, houve muitas &#8220;manhas&#8221; aprendidas no seu desenvolvimento. O Heroku foi uma delas, onde pudemos publicar rapidamente a aplicação. Se você quer hospedar um projeto simples feito em Rails, nós o recomendamos. O seu uso é muito simples e a incrível idéia de usar o git como interface para deploy é realmente sensacional. Basta instalar o client do Heroku, dar um &#8220;git push&#8221; e pronto: a aplicação está no ar!</p>
<h2><a title="Github Issue Tracker" href="http://github.com/blog/411-github-issue-tracker" target="_blank">Github Issue Tracker</a></h2>
<p>Nova funcionalidade no GitHub para facilitar nossas vidas, permitindo informar os &#8220;bugs&#8221; nos projetos. No link acima, contém o vídeo &#8220;I<em>ntroduction to GitHub Issues</em>&#8221; para mais detalhes.</p>
<p>Caso já use um Issue Tracker para o seu projeto no github, você pode desabilitá-lo na seção  do <em>Features </em>na aba<em> Admin</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/04/remarkable-jqgrid-no-rails-heroku-e-github-issues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Business Bingo Generator</title>
		<link>http://1up4dev.org/2009/04/business-bingo-generator/</link>
		<comments>http://1up4dev.org/2009/04/business-bingo-generator/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 12:03:13 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[marketing]]></category>
		<category><![CDATA[projetos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[business bingo]]></category>
		<category><![CDATA[buzzword bingo]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=398</guid>
		<description><![CDATA[Para quem tem algum tempo de internet, é fácil notar como as piadas se repetem, ou melhor, assim como olimpíadas ou copa do mundo, re-aparecem a cada quatro anos por exemplo. Não foi diferente com a piada que recebi (novamente) a pouco tempo, o Business Bingo. O que torna a piada muito divertida é o [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem tem algum tempo de internet, é fácil notar como as piadas se repetem, ou melhor, assim como olimpíadas ou copa do mundo, re-aparecem a cada quatro anos por exemplo. Não foi diferente com a piada que recebi (novamente) a pouco tempo, o Business Bingo. O que torna a piada muito divertida é o seu alto teor sarcástico e real, foi quando pensei, porque não imprimir esta cartela e realmente testar! Foi assim que surgiu a idéia de fazer um gerador de cartelas para o Business Bingo! <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://1up4dev.org/wp-content/uploads/2009/04/ideia.jpg"><img class="size-medium wp-image-401 alignleft" src="http://1up4dev.org/wp-content/uploads/2009/04/ideia-299x300.jpg" alt="idéia" width="66" height="67" /></a></p>
<h2 style="text-align: left;"><a href="http://business-bingo.heroku.com/">Business Bingo! Generator</a></h2>
<p>A idéia deste post, além de ajudar a divulgar o site, é ter um local central para <strong>comentários, sugestões, reclamações e elogios</strong> para o <a href="http://business-bingo.heroku.com/">Business Bingo Generator</a>.</p>
<h3>Curiosidade</h3>
<ul>
<li>O Business Bingo, também conhecido como <a href="http://en.wikipedia.org/wiki/Buzzword_bingo">Buzzword Bingo</a>, ganhou notoridade em 1994, com uma tirinha publicada do <a href="http://dilbert.com/fast/1994-02-22/">Dilbert</a>.</li>
<li>Um dos &#8220;grandes&#8221; eventos &#8220;documentados&#8221;, foi em 1996, que alunos do MIT o usaram no discurso do vice-presidente dos EUA, Al-Gore.</li>
</ul>
<h3>Uma nota rápida a desenvolvedores</h3>
<p>A primeira versão foi desenvolvida em dois dias, isso mesmo, dois dias e já estava em produção. Eu e o Rodrigo Panachi resolvemos implementar a idéia do <em>&#8220;generator&#8221;</em> para aprender na prática como funciona o Ruby on Rails. Num post futuro irei colocar mais detalhes técnicos, que apesar de ser uma aplicação muito pequena, podemos tirar proveito de grandes aulas. Para quem quiser contribuir, o <a href="http://github.com/rpanachi/business-bingo-generator/tree/master">Business Bingo Generator está no GitHub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/04/business-bingo-generator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TPW &#8211; Dicas para a qualidade do Software</title>
		<link>http://1up4dev.org/2009/01/tpw-dicas-para-a-qualidade-do-software/</link>
		<comments>http://1up4dev.org/2009/01/tpw-dicas-para-a-qualidade-do-software/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 10:32:52 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[real world]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[pragmatic waterfall]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=280</guid>
		<description><![CDATA[Desenvolvedores em geral sabem como é chato quando uma tela que fez ou alterou dá erro durante uma homologação ou até produção. No caso de um sistema Web, a raiva aumenta ainda mais se a causa for incompatibilidade de navegadores.
Antes de começar a apresentar o &#8220;the best of my rotina&#8221;, é bom deixar bem claro [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolvedores em geral sabem como é chato quando uma tela que fez ou alterou dá erro durante uma homologação ou até produção. No caso de um sistema Web, a raiva aumenta ainda mais se a causa for incompatibilidade de navegadores.</p>
<p>Antes de começar a apresentar o &#8220;the best of my rotina&#8221;, é bom deixar bem claro o meu cenário:</p>
<ul>
<li>Trabalho sozinho no projeto, sou humano e faço pair programming com a cpu, que eu tenho certeza que é <a href="http://desciclo.pedia.ws/wiki/POG">pogger</a>!</li>
<li>O meu cliente, o que requisita correções e/ou novas funcionalidades, é um cliente interno e eu tenho acesso direto a ele.</li>
<li>O sistema não tem testes unitários, testes de integração e etc.</li>
<li>Muito código foi copiado, não somente na camada de negócio, mas também nas views. As páginas por aqui, também são conhecidas como <em>business-view</em>.</li>
<li>Tem mais complicações, mais acho que já tem o suficiente para entenderem o meu cenário.</li>
</ul>
<p>O que já fizemos para começar a arrumar a casa:</p>
<ul>
<li>Implantamos um bug tracker, conhecido como <a href="http://www.redmine.org/">Redmine</a>. Sabe aquele velho problema de planilha pra lá e pra cá e ninguém nunca sabia quem, e o que estava fazendo? Pois bem, este problema está quase resolvido aqui (quase porque ainda tem projeto faltando para migrar).</li>
<li>Implantamos um servidor de integração continua, com o <a href="https://hudson.dev.java.net/">Hudson</a>. Apesar de eu não ter testes, havia um sério problema aqui para implantar novas versões em homologação e produção, e agora com o Hudson centralizando o build, ele mesmo já disponibiliza o war.</li>
<li>Por sinal, montar e começar a usar o war foi outro trampo também.</li>
</ul>
<p>Sabendo que o meu contexto é diferente do seu, sinta-se livre para adaptar qualquer coisa. Tentei deixar as dicas o mais genérico possível.</p>
<h3>1. Trabalhe com tarefas Curtas</h3>
<p>Tarefas curtas são muito mais fáceis para desenvolver, testar e se livrar! Por exemplo, se tem que desenvolver aquele formulário com vinte telas, não tenha dúvida, quebre isto em pequenas funcionalidades. Para identificar as partes &#8220;quebráveis&#8221;, leve em conta o que a torna funcional, ainda no exemplo anterior, se das vinte telas, você fizer a primeira e a última são suficientes para um cadastro básico, está ai a sua primeira tarefa. Muitas pessoas não dão importância para isso, mas saber &#8220;extrair&#8221; as tarefas certas de um novo desenvolvimento ou manutenção, traz um leque de vantagens:</p>
<ul>
<li> Testar uma funcionalidade curta é muito mais rápido e fácil do que testar uma gigantesca;</li>
<li> Fica mais dificil perder o foco.</li>
<li> Os prazos ficam mais &#8220;coerentes&#8221;.</li>
<li> Você pode retirar ou incluir novas funcionalidades, a &#8220;negociação&#8221; com o cliente fica mais simples.</li>
</ul>
<h3>2. Monte e use um roteiro de teste</h3>
<p>Pra quem usa <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, este passo pode pular. Pra quem trabalha com legados e ainda não tem testes (meu caso), eu costumo fazer um roteiro de testes antes de implementar a funcionalidade curta. Este roteiro costuma ser enxuto e abrangente, isto permite que eu descanse meu cerebro enquanto testo, pois com ele, acaba se tornando um processo mecânico. Vou colocar um exemplo recente de roteiro que usei:</p>
<p><strong>Teste de Primeiro Acesso</strong></p>
<ul>
<li> Limpar a base, apagar os registros da tabela xpto e suas dependências.</li>
<li> Limpar os cookies.</li>
<li> Acessar o index.jsp da Aplicação (esta página simula um login via cookie).</li>
<li> A tela inicial só permite cadastrar os dados do perfil, os links &#8220;xxx&#8221; e &#8220;zzz&#8221; não ficam disponíveis.</li>
<li> Após o Teste de Restrições ao Editar o Perfil, verificar que os links &#8220;xxx&#8221; e &#8220;zzz&#8221; estão disponíveis.</li>
<li> Clicar em salvar novamente para verificar se o problema de &#8220;unique id&#8221; não ocorre.</li>
</ul>
<p>Estes roteiros se tornaram um costume, eu perco pouquissimo tempo pra fazer e apesar de parecer besta, ele me ajuda muito na hora de executar um teste de sanidade por exemplo. O ideal seria transformar este roteiro num teste unitário ou até mesmo num script via Selenium, mas devido a estrutura (ou a falta dela?!) eu ainda não consegui esta automação tão sonhada.<br />
Apesar deste roteiro ser descartável e somente para ajudá-lo, uma idéia legal que venho fazendo é colocá-lo como comentário caso use um bug tracker.</p>
<h3>3. Teste seu sistema num ambiente isolado</h3>
<p>Estes últimos dois anos tenho usado <a href="http://www.ubuntu.com/">linux</a> no desktop para desenvolvimento. Infelizmente, todos nós sabemos que todo sistema web tem que ser testado nos IE*s e cia. É claro que durante o inicio do desenvolvimento, uso meu firefox local mesmo, mas assim que termino a funcionalidade, uso uma máquina virtual para averiguar a compatibilidade com os navegadores mais utilizados.<br />
Usando o <a href="http://www.virtualbox.org/">Virtual Box</a> e <a href="http://tredosoft.com/Multiple_IE">Multiple IEs</a> mais o opcional roteiro de testes, consigo validar o sistema numa boa gama de navegadores. Para usar o Multiple IEs não tem segredo, é só atualizar para o IE7 e depois rodar o executável do mesmo.</p>
<p style="text-align: center;"><a href="http://1up4dev.org/wp-content/uploads/2009/01/virtualbox_multiple_ies.png"><img class="aligncenter size-medium wp-image-288" title="virtualbox e multiple IEs" src="http://1up4dev.org/wp-content/uploads/2009/01/virtualbox_multiple_ies-300x187.png" alt="" width="424" height="264" /></a></p>
<h3>4. Automatize o que for possível</h3>
<p>Já ocorreu de você precisar preencher <em>n</em> campos, navegar em <em>n</em> telas e descobrir que você errou o nome de uma variável javascript e ter que fazer tudo de novo? Pois bem, comigo já aconteceu muito, e uma das soluções que venho usando é o <a href="http://seleniumhq.org/projects/ide/">Selenium Ide</a>. Com o plugin do firefox, eu gravo scripts temporários (durante o desenvolvimento da tarefa) que preenche os <em>n</em> campos e navegam nas <em>n</em> telas, assim pelo menos este tempo de navegação eu só perco uma vez.</p>
<h3>Finalizando &#8230;</h3>
<p>Todas estas &#8220;técnicas&#8221; nada mais são do que uma retrospectiva minha, de uma tentativa (frustada por sinal) de Scrum Solo. Aqui estou colocando o que vem dando resultado, e se você achou besteira ou legal, gostaria muito do seu comentário. Sabe aquela <a href="http://www.jlcarneiro.com/macas-ideias-e-conhecimento/">frase da maça e conhecimento</a>, então, minha única expectativa com este post é esta: Novas Idéias!</p>
<p>Valeu e feliz ano novo a todos!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2009/01/tpw-dicas-para-a-qualidade-do-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pensando na gente (desenvolvedores!)</title>
		<link>http://1up4dev.org/2008/07/pensando-na-gente-desenvolvedores/</link>
		<comments>http://1up4dev.org/2008/07/pensando-na-gente-desenvolvedores/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 20:01:06 +0000</pubDate>
		<dc:creator>miguelbaldi</dc:creator>
				<category><![CDATA[marketing]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://1up4dev.wordpress.com/?p=48</guid>
		<description><![CDATA[
Bom pessoal, hoje estou aqui pra pedir ajuda. Sim, pedir ajuda pra todos àqueles que utilizam a web(www) para alguma coisa, seja para estudar, trabalhar, jogar ou ficar rico! E falo por todos desenvolvedores que tem o navegador como container de suas aplicações, que tem que lidar com as diversidades de dois mundos, MS Internet [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://1up4dev.org/?p=45" target="_self"><img class="alignleft size-medium wp-image-50" src="http://1up4dev.org/wp-content/uploads/2008/07/logo.gif?w=300" alt="" width="300" height="61" /></a></p>
<p>Bom pessoal, hoje estou aqui pra pedir ajuda. Sim, pedir ajuda pra todos àqueles que utilizam a web(<a title="World Wide Web" href="http://en.wikipedia.org/wiki/World_Wide_Web" target="_blank">www</a>) para alguma coisa, seja para estudar, trabalhar, jogar ou ficar rico! E falo por todos desenvolvedores que tem o navegador como <em>container</em> de suas aplicações, que tem que lidar com as diversidades de dois mundos, MS Internet Explorer 6 contra a rapa!</p>
<p>O dia-a-dia no desenvolvimento de software web é um tanto sofrido para quem tem que, além de fazer uma aplicação com boa usabilidade, performance e ainda bonitinha, tem de manter compatibilidade com a ferramenta &lt;voz_do_faustão&gt;da gloriosa Microsoft&lt;/voz_do_faustão&gt; que vem com o Windows XP: IE6. Sempre que você faz algum milagre em JavaScript, ou usa alguma técnica Web 2.0 pensando em agradar o usuário final (ou até mesmo o seu gerente!), tem que ficar com os dois pés atrás, pois você só pode comemorar depois de testar no IE6. O IE6 com certeza pode ser apontando como o pior navegador de todos os tempos, lento, péssima usabilidade, segurança terrível e ainda vai na contra-mão de todos os padrões WWW. O fato é que muita gente que programa não sabe que na verdade nem <a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank">JavaScript</a> este browser suporta, na verdade ele suporta um clone da Microsoft chamado <a title="JScript" href="http://en.wikipedia.org/wiki/JScript" target="_blank">JScript</a>, este sim é o que deixa os programadores do mundo todo de cabelo em pé.</p>
<p>É claro que eu não podia deixar de fazer um comentário maldoso. Atualmente ainda temos muitas aplicações que não usam muitos recursos maravilhosos que a nova gereção de navegadores oferecem por culpa de empresas que não tem coragem de chutar o balde e forçar seus clientes à migrarem seus navegadores em prol de uma melhoria para todos, desenvolvedores e usuários! É claro que este tipo de empresa casualmente adotam metodologias duvidosas (waterfall puro!!), que refletem diretamente na qualidade de seus aplicativos, mas por outro lado temos empresas que lideram um movimento que deveria ser seguido por todos àqueles que querem se manter no mercado, uma delas é a <a title="37signals" href="http://www.37signals.com/" target="_blank">37Signals</a>, que já manifestou algumas vezes o seu abandono ao IE6 dizendo que apartir do dia 15 de agosto todas suas aplicações passariam a não ter o compromisso de suportar o IE6.</p>
<p>Bom, acho que já ficou claro até aqui, que o passoal do 1Up4Developers apoia esta causa, e é por isso que escrevo este post, para mostrar a nossa aderência à campanha <a title="SaveTheDevelopers" href="http://www.savethedevelopers.org" target="_blank">SaveTheDelelopers.</a></p>
<p>Assim como nós, muitas pessoas começam a apoiar essa campanha através de seus blogs, pessoas que são referência no desenvolvimento de software web. Eu descobri esta campanha através do blog <a title="Nome do Jogo" href="http://www.nomedojogo.com/2008/07/06/salve-os-desenvolvedores-diga-nao-ao-internet-explorer-6/" target="_blank">Nome do Jogo</a>, do Carlos Brando, e de imediato pensei em fazer este post.</p>
<p>Pessoal, disseminem esta idéa em todos os lugares, quando algum parente chamar você para consertar seu computador diga: só se você atualizar o seu navegador!</p>
<p>Abraço</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2008/07/pensando-na-gente-desenvolvedores/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ressuscitando o webdesigner</title>
		<link>http://1up4dev.org/2008/05/ressuscitando-o-webdesigner/</link>
		<comments>http://1up4dev.org/2008/05/ressuscitando-o-webdesigner/#comments</comments>
		<pubDate>Wed, 28 May 2008 18:16:00 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://1up4dev.wordpress.com/2008/05/28/ressuscitando-o-webdesigner/</guid>
		<description><![CDATA[Ultimamente temos acompanhados posts-desabafo sobre metodologias e o cenário atual do mercado de desenvolvimento de software. Pois bem, mudemos de assunto um pouco.
Outro dia estava tendo uma conversa discussão com meu amigo Nivaldo sobre interfaces web com uso abusivo de javascript. Aí lembrei o que o Miguel disse sobre interfaces citando como parâmetro o Google [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente temos acompanhados posts-desabafo sobre metodologias e o cenário atual do mercado de desenvolvimento de software. Pois bem, mudemos de assunto um pouco.</p>
<p>Outro dia estava tendo uma <span style="text-decoration: line-through;">conversa</span> discussão com meu amigo Nivaldo sobre interfaces web com uso abusivo de javascript. Aí lembrei o que o <a href="http://log4dev.com/">Miguel</a> disse sobre interfaces citando como parâmetro o Google e a Apple e a pouca importância que as empresas dão para esse assunto.</p>
<p>O mercado (alvo) está cada vez mais competitivo. Usuários não querem simplesmente um sistema funcional; ele deve ser bonito, intuitivo, agradável de usar. Um bom exemplo do que estou falando é o popular Goggle Reader: será que estaria tão popular se não fosse sua interface &#8220;rica&#8221;?</p>
<p>Acredito que atualmente, para sistemas web, a interface deve(ria) ser o principal &#8220;exciter&#8221; e onde as forças devem atuar consideravelmente. Digo isso porque as outras partes de um sistema (estou falando do negócio e banco de dados) estão razoávelmente maduras em termos de conceitos (OO, Teste, ORM), frameworks, etc.</p>
<p>Foi o tempo em que precisavamos saber apenas escrever código funcional. O desenvolvedor de hoje precisa saber muito bem HTML, CSS e JavaScript. E para isso, felizmente podemos (e devemos) utilizar recursos e <a href="http://rodrigopanachi.eti.br/weblog/post/simplifique-javascript-com-jquery/">frameworks</a> para isso.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2008/05/ressuscitando-o-webdesigner/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>