<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Bernardo Rufino</title>
	<atom:link href="https://bermonruf.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://bermonruf.wordpress.com</link>
	<description>Javascript CSS XHTML PHP Ruby</description>
	<lastBuildDate>Wed, 21 Jan 2009 18:35:27 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<site xmlns="com-wordpress:feed-additions:1">568848</site><cloud domain='bermonruf.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>Bernardo Rufino</title>
		<link>https://bermonruf.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://bermonruf.wordpress.com/osd.xml" title="Bernardo Rufino" />
	<atom:link rel='hub' href='https://bermonruf.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Controle De Acesso Em Rails</title>
		<link>https://bermonruf.wordpress.com/2009/01/21/controle-de-acesso-em-rails/</link>
					<comments>https://bermonruf.wordpress.com/2009/01/21/controle-de-acesso-em-rails/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Wed, 21 Jan 2009 18:07:30 +0000</pubDate>
				<category><![CDATA[Ruby On Rails]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2009/01/21/controle-de-acesso-em-rails/</guid>

					<description><![CDATA[Recentemente precisei criar um meio de controlar o acesso de usuários de acordo com seus respectivos papéis no sistema. Foi aí que fiz uma pesquisa sobre o assunto e descobri em um post uma maneira bem simples e elegante de resolver o problema porém ainda faltava maior suporte. Pesquisei plugins e encontrei esse review, muito [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/access_control.jpg" width="450" /></p>
<p>Recentemente precisei criar um meio de controlar o acesso de usuários de acordo com seus respectivos papéis no sistema. Foi aí que fiz uma pesquisa sobre o assunto e descobri em um <a href="http://metautonomo.us/2008/09/30/easy-role-based-authorization/">post</a> uma maneira bem simples e elegante de resolver o problema porém ainda faltava maior suporte. Pesquisei plugins e encontrei esse <a href="http://steffenbartsch.com/blog/2008/08/rails-authorization-plugins">review</a>, muito bom por sinal, nele o autor cria uma nova solução completa separando a lógica do acesso do resto do sistema. Mas como alguns sabem estou voltando aos poucos ao mundo Rails e resolvi encarar o problema como forma de me familiarizar novamente com a linguagem e o framework, solução: criar meu próprio sistema! Vou descrever o desenvolvimento passo a passo neste post.</p>
<p>Primeiro precisamos separar algumas coisas, muitos pensam que autenticação e autorização são a mesma coisa, mas não são. Autenticação de usuários é a identificação do usuário quando da entrada ao sistema, ou seja, ou você é um visitante ou é um usuário dentro da aplicação. Já autorização é um conceito um pouco mais amplo, dentro de uma aplicação geralmente cada usuário tem seu papel, em um jornal, por exemplo, temos leitores, editores, administradores e assim em diante, cada um com certas permissões. A autenticação pode ser considerada um nível de autorização já que restringimos a visualização de certas áreas a usuários identificados/logados no sistema.</p>
<p>O código que fiz cobre somente a parte de autorização (apesar de vermos algo relacionado à autenticação também), mas autenticação é algo muito trivial de se fazer, também existem plugins para isso, consulte <a href="http://www.google.com/search?q=rails+authentication">o oráculo</a> para maiores informações. Agora começa a parte interessante! =P</p>
<h3>Definindo modelos</h3>
<p>Vamos definir nossos modelos, como você verá ao longo do post, o código é bastante versátil, tudo poderá ser personalizado em uma única linha. De qualquer modo, vamos assumir que temos uma classe <b>User </b>e que cada usuário tem um papel, uma <b>Role</b>, ou seja <b>Role has_many :users</b> e <b>User belongs_to :role</b>.</p>
<h3>Organização E Configuração Do Sistema</h3>
<p>Criei um módulo chamado <b>AccessControl</b>, esse módulo será incluido no <b>ApplicationController</b> por meio de um <b>include</b> (não me diga&#8230;). Coloquei tudo dentro de um arquivo separado &#8220;access_control.rb&#8221; dentro de &#8220;app/controllers&#8221;. Depois criei um método para configurar o sistema, vejam abaixo:</p>
<pre class="brush: ruby; title: ; notranslate">
module AccessControl
  
  Options = {:class =&gt; :User, :roles =&gt; :role, :map =&gt; :name, :user =&gt; :user};
  
  def self.included(klass)
    klass.class_eval do
      extend AccessControl::ClassMethods;
    end
  end
  
  module ClassMethods
  
    def access_control_setup(opts)
      opts[:class] = opts[:a] || opts[:an] || opts[:class];
      opts[:roles] = opts[:has_one] || opts[:has_many] || opts[:role] || opts[:roles];
      opts[:map] = opts[:map_its] || opts[:map];
      opts[:user] = opts[:class].to_s.downcase.to_sym;
      AccessControl::Options.merge!(opts); 
    end
  
  end
  
end
</pre>
<p>O código já está bem auto-explicativo. Em <b>access_control_setup</b> você deve ter reparado que existem diversos &#8220;sinônimos&#8221; para uma mesma opção, isso é para deixar a configuração mais intuitiva:</p>
<pre class="brush: ruby; title: ; notranslate">
class ApplicationController &lt; ActionController::Base
  include AccessControl;
  access_control_setup :an =&gt; User, :has_one =&gt; :role, :map_its =&gt; :name
  # Ou se a classe é Person e a relação com Role é do tipo many-to-many
  access_control_setup :a =&gt; Person, :has_many =&gt; :roles, :map =&gt; :name;
  #...
end
</pre>
<h3>Definindo Regras De Restrição</h3>
<p>Meu objetivo é poder fazer as declarações de restrição a acesso das actions nos controllers, na própria classe mesmo, algo como:</p>
<pre class="brush: ruby; title: ; notranslate">
class ArticlesController &lt; ApplicationController
  # Nenhum visistante poderá vizualizar/criar/editar/deletar artigos
  restrict_access :from =&gt; [:guest], :message =&gt; &quot;Efetue login primeiro&quot;;
  # Somente editores e admins poderão criar artigos
  restrict_access :of =&gt; [:new], :to =&gt; [:editor, :admin];
  # Somente admins poderão criar artigos, e editores seus próprios artigos 
  restrict_access :of =&gt; [:edit], :to =&gt; [:admin, :editor], :check =&gt; {
    :editor =&gt; check_user_by(:user_id)
  };
  #...
end
</pre>
<p>Bem intuitivo, não? Agora vamos implementar o método <strong>restrict_access</strong>, também definido dentro de <b>ClassMethods</b>. Esse método deverá receber as actions que controlará o acesso (opção <b>:of</b>), para todas deve-se fornecer <b>:all</b> ou não especificar nenhuma action. Receberá também os tipos de usuário que poderão acessar (opção <b>:to</b>) ou os que não poderão (opção <b>:from</b>). </p>
<p>Além disso também aceita um bloco de código ou um <b>Proc</b> fornecido à opção <b>:check</b>, esse bloco será executado e decidirá se a action poderá seguir retornando <b>true</b> ou <b>false</b>, nesse caso o bloco será executado para todos os tipos de usuário. Mas também pode-se fornecer um <b>Hash</b> para a respectiva opção, e nele as chaves serão os tipos de usuário sobre os quais os <b>Proc</b>s (os valores) serão executados. Essa opção <b>check</b> é útil para testar, por exemplo, se determinado editor é dono de um artigo. Opções extras poderão ser recuperadas mais tarde em um método <b>access_denied</b>, útil para definir mensagens ou endereços de redirecionamento.</p>
<pre class="brush: ruby; title: ; notranslate">
def restrict_access(opts={}, &amp;amp;check)
  opts = {:of =&gt; :all}.merge(opts);
  check ||= opts.delete(:check);
  (@restrictions ||= []) &lt;&lt; AccessControl::Restriction.new(opts.delete(:of), opts.delete(:to), opts.delete(:from), check, opts);
  before_filter(:check_authorization) unless before_filters.include?(:check_authorization);
end
&amp;#91;/sourcecode&amp;#93;

Ele adiciona a uma variável de instância um objeto do tipo &lt;b&gt;Restriction&lt;/b&gt;, depois define um filtro para ser executado antes da action caso já não exista. Precisamos criar um método &lt;b&gt;restrictions&lt;/b&gt; para que o filtro possa acessar a lista de restrições, dentro de &lt;b&gt;ClassMethods&lt;/b&gt; também:


def restrictions; @restrictions; end
</pre>
<h3>Lógica Das Restrições</h3>
<p>A classe <b>Restriction</b> é responsável pela lógica por trás da autorização de execução das actions, é ela que decide se poderá prosseguir de acordo com regras definidas. Sua definição também está dentro do modulo <b>AccessControl</b>.</p>
<pre class="brush: ruby; title: ; notranslate">
class Restriction
  attr_reader :actions, :options;
  
  CheckDefault = lambda{true;};
  @@options = AccessControl::Options;
  
  def initialize(actions, included_roles, excluded_roles, check=nil, opts={})
    @actions = (actions == :all) ? actions : [actions].flatten.map(&amp;:to_sym);
    @roles = [(included_roles || excluded_roles)].flatten.map(&amp;:to_sym);
    @mode = ActiveSupport::StringInquirer.new((included_roles) ? &quot;inclusive&quot; : &quot;exclusive&quot;);
    @check = check || CheckDefault;
    @options = opts;
  end
  
  def ok?(user, action, controller)
    # Could be in one line, but it&#039;d be a mess
    if @actions == :all or @actions.include?(action)
      set_check_for(user) if @check.kind_of?(Hash);
      ((@mode.inclusive? and (roles_of(user) &amp;amp; @roles).size &gt; 0) or
      (@mode.exclusive? and (roles_of(user) &amp;amp; @roles).empty?)) and
      @check.bind(controller).call;
    else true; end
  end
  
  private
  def roles_of(user)
    [user.send(@@options[:roles])].flatten.map(&amp;amp;@@options[:map].to_sym).map(&amp;:to_sym);
  end
  
  def set_check_for(user)
    #@check.flatten_keys!; 
    @check = @check[(@check.keys &amp;amp; roles_of(user)).first] || CheckDefault;
  end
  
end
</pre>
<p>Ao iniciar ela armazena as opções, as actions e define se o modo de restrição é do tipo inclusivo ou exclusivo. O método <b>set_check_for</b> determina se o bloco de código deverá ser executado para o tipo de usuário atual. A lógica que determina o acesso a action esta dentro do método <b>ok?</b>. </p>
<h3>Filtrando As Actions</h3>
<p>O filtro <b>check_authorization</b> verifica se alguma restrição não permite o acesso a action, caso exista chama o método <b>access_denied</b>, que deverá ser implementado, com as opções extras fornecidas (veja o método <b>restric_access</b>).</p>
<pre class="brush: ruby; title: ; notranslate">
def check_authorization
  action = request.path_parameters[:action].to_sym;
  restriction = self.class.restrictions.detect do |restriction|
    !restriction.ok?(current_user || AccessControl.guest, action, self);
  end
  access_denied(restriction.options) if restriction;
  return !restriction;
end
</pre>
<p>Assumi que você tem um método <b>current_user</b> que retorna o usuário logado atualmente ou <b>nil</b> caso seja um visitante. Perceba ali na linha 4 que se o usuário for um visitante ele vai fornecer um objeto que atuará como usuário mas do tipo visitante (portando você não precisa definir uma <b>Role</b> <b>guest</b>), um Mock, esse objeto é devolvido pelo método <b>guest</b>:</p>
<pre class="brush: ruby; title: ; notranslate">
def self.guest # Simple mock object
  Struct.new(Options[:roles]).new(Struct.new(Options[:map]).new(:guest));
end
</pre>
<h3>Acesso Negado</h3>
<p>Pronto, agora só falta a implementação do método <b>access_denied</b>, que pode ser feita no próprio módulo <b>AccessControl</b> ou dentro de <b>ApplicationController</b> como um método protegido. Veja um modelo abaixo:</p>
<pre class="brush: ruby; title: ; notranslate">
def access_denied(opts)
  flash[:warning] = opts[:message] || &quot;Você não tem permissão para acessar este recurso.&quot;;
  session[:redirect_to] = request.path;
  redirect_to(opts[:redirect_url] || login_path);
end
</pre>
<p>Ele é útil pois pode-ser fornecer uma mensagem (com a opção <b>:message</b>) e um endereço (<b>:redirect_url</b>) em <b>restrict_access</b> que serão usados aqui ou caso nenhum seja fornecido ele exibe uma mensagem padrão e redireciona para a tela de login se existir.</p>
<h3>Checks Automatizados</h3>
<p>Você deve ter reparado um método chamado <b>check_user_by</b>, ele retorna um <b>Proc</b> para automatizar o teste de usuário, veja dois métodos desse tipo:</p>
<pre class="brush: ruby; title: ; notranslate">
def check_user_by(param)
  lambda{current_user.id == params[param.to_sym].to_i;};
end
  
def check_user; check_user_by(:id); end
</pre>
<p>O segundo assume o parametro <b>:id</b> como default. Ambos devem ser definidos dentro de <b>ClassMethods</b>.</p>
<p>É isso pessoal, para utilizar é só dar uma olhada nos exemplos do próprio post. Não implementei helpers para serem usados nas views, mas não é uma tarefa muito dificil. Quem quiser pode também baixar o <a href="http://bermonruf.googlecode.com/files/access_control.rb">arquivo com o código</a>. Não tenho certeza ainda, mas talvez eu porte para um plugin, mas ainda preciso fazer os testes (não, não fiz teste nenhum, eu sei, eu sei&#8230;). Espero que tenham gostado, críticas são bem vindas! Flwss</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2009/01/21/controle-de-acesso-em-rails/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">88</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/access_control.jpg" medium="image" />
	</item>
		<item>
		<title>Voltando Aos Poucos</title>
		<link>https://bermonruf.wordpress.com/2009/01/15/voltando-aos-poucos/</link>
					<comments>https://bermonruf.wordpress.com/2009/01/15/voltando-aos-poucos/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Fri, 16 Jan 2009 02:37:17 +0000</pubDate>
				<category><![CDATA[Others]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2009/01/15/voltando-aos-poucos/</guid>

					<description><![CDATA[De volta! Não completamente, mas pretendo voltar às atividades aos poucos, ainda que os posts continuem raros, preciso de um tempo pra voltar à blogosfera, 2008 foi um ano muito lotado pra mim, não sobrou muito tempo para o blog. Peço desculpas a todos, principalmente àqueles que não retiraram meu feed do seu leitor ;D. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>De volta! Não completamente, mas pretendo voltar às atividades aos poucos, ainda que os posts continuem raros, preciso de um tempo pra voltar à blogosfera, 2008 foi um ano muito lotado pra mim, não sobrou muito tempo para o blog. Peço desculpas a todos, principalmente àqueles que não retiraram meu feed do seu leitor ;D. Anyway, pretendo correr atrás do tempo perdido em se tratando de Ruby, Rails e Javascript. Estou lendo os milhões de artigos marked as starred no Google Reader que não tinha tempo de ler, a principio o objetivo é me atualizar, quem sabe aprender novos frameworks, novas linguagens? Qualquer dica é bem vinda, comente!<br />Pra piorar ainda mais a situação o meu desktop está com problemas, especificamente na placa de video, por enquanto estou me virando pra blogar. Sonho comprar um novo com o <a href="http://en.wikipedia.org/wiki/Intel_Core_3">Core i7</a> da Intel lá pro meio do ano, sonho&#8230; Até consertar o meu deve demorar um pouco.<br />Apesar de estar me sentindo <del>um pouco</del> <ins>muito</ins> perdido, tenho planos para esse ano, pretendo fazer um projeto pessoal em Rails, por enquanto sem maiores detalhes =P. No mais, é isso. Obrigado a todos!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2009/01/15/voltando-aos-poucos/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">81</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>
	</item>
		<item>
		<title>Novidades Rails E Mootools</title>
		<link>https://bermonruf.wordpress.com/2008/07/04/novidades-rails-e-mootools/</link>
					<comments>https://bermonruf.wordpress.com/2008/07/04/novidades-rails-e-mootools/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Fri, 04 Jul 2008 18:43:17 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/?p=79</guid>

					<description><![CDATA[Pessoal, está muito dificil continuar mantendo o blog, estou totalmente sem tempo, as postagens já diminuiram consideravelmente. Peço desculpas e paciência a todos que lêem (liam) o blog, um dia voltarei ao ritmo de antes. Mas para não deixar passar, vou deixar links para dois assuntos sobre os quais eu queria falar mas não consegui: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Pessoal, está muito dificil continuar mantendo o blog, estou totalmente sem tempo, as postagens já diminuiram consideravelmente. Peço desculpas e paciência a todos que lêem (liam) o blog, um dia voltarei ao ritmo de antes. Mas para não deixar passar, vou deixar links para dois assuntos sobre os quais eu queria falar mas não consegui:</p>
<ul>
<li><a href="http://juliogreff.blog.br/lancada-a-mootools-12">Mootools 1.2</a></li>
<li><a href="http://www.nomedojogo.com/2008/06/06/o-primeiro-livro-sobre-rails-21-e-brasileiro">Ruby On Rails 2.1</a></li>
<p>Espero a compreensão de todos</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/07/04/novidades-rails-e-mootools/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">79</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>
	</item>
		<item>
		<title>Método Para Traduzir String</title>
		<link>https://bermonruf.wordpress.com/2008/05/02/metodo-para-traduzir-string/</link>
					<comments>https://bermonruf.wordpress.com/2008/05/02/metodo-para-traduzir-string/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Fri, 02 May 2008 16:53:20 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/05/02/metodo-para-traduzir-string/</guid>

					<description><![CDATA[Sempre pensei em um método que traduzisse uma String, na linguagem mesmo, encapsulado, sem precisar de classes de terceiros, etc. Há algum tempo atrás resolvi fazê-lo em Ruby e ficou guardado um bom tempo, até eu realmente precisar usá-lo, aproveito e mostro a vocês. Ele faz uma consulta ao Google Tradutor e retorna o resultado [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/flags.jpg" width="450" /></p>
<p>Sempre pensei em um método que traduzisse uma String, na linguagem mesmo, encapsulado, sem precisar de classes de terceiros, etc. Há algum tempo atrás resolvi fazê-lo em Ruby e ficou guardado um bom tempo, até eu realmente precisar usá-lo, aproveito e mostro a vocês.</p>
<pre class="brush: ruby; title: ; notranslate">
require &quot;net/http&quot;;
require &quot;uri&quot;;
require &quot;hpricot&quot;;

class String
  
  def translate(from, to, opts={})
    params = {
      &quot;text&quot; =&gt; self, 
      &quot;langpair&quot; =&gt; &quot;#{from}|#{to}&quot;, 
      &quot;ie&quot; =&gt; opts.delete(:encode) || &quot;UTF-8&quot;, 
      &quot;hl&quot; =&gt; &quot;pt-BR&quot;
    }.merge(opts);
    text = Net::HTTP.post_form(URI.parse(&quot;http://translate.google.com/translate_t&quot;), params).body;
    Hpricot(text).search(&quot;#result_box&quot;).inner_html;
  end
  
end

&quot;A simple text to be translated&quot;.translate(:en, :pt);  #=&gt; &quot;Um simples texto a ser traduzido&quot;
</pre>
<p>Ele faz uma consulta ao <a href="http://translate.google.com.br/translate_t">Google Tradutor</a> e retorna o resultado traduzido. O primeiro parâmetro é a abreviação da língua na qual a String foi escrita e o segundo a língua para qual ela será traduzida, há também um terceiro, um hash com dados a serem enviados via POST. Ele usa a biblioteca <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a> para buscar o trecho correspondente à tradução no documento HTML, poderia ser feito com expressões regulares, mas ficaria feio.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/05/02/metodo-para-traduzir-string/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">78</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/flags.jpg" medium="image" />
	</item>
		<item>
		<title>Diz Que Até Não É Um Mau Blog</title>
		<link>https://bermonruf.wordpress.com/2008/03/17/diz-que-ate-nao-e-um-mau-blog/</link>
					<comments>https://bermonruf.wordpress.com/2008/03/17/diz-que-ate-nao-e-um-mau-blog/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Mon, 17 Mar 2008 21:48:22 +0000</pubDate>
				<category><![CDATA[Meme]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/03/17/diz-que-ate-nao-e-um-mau-blog/</guid>

					<description><![CDATA[O Júlio Greff nomeou meu blog como uma de suas referências. Valew Júlio, muito obrigado, e tomara que um dia meu blog chegue a altura do seu! Como parte do meme, tenho que indicar blogs dignos de tal &#8220;selo&#8221;: tmferreira: Um pouco parado, mas já vi muitos artigos bons lá. Walter Cruz &#8211; devlog: Desenvolvimento [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="float:right;margin:5px 0 5px 5px;"><img src="https://i0.wp.com/www.juliogreff.blog.br/images/nao-e-um-mau-blog.jpg" /></p>
<p>O <a href="http://juliogreff.blog.br/">Júlio Greff</a> nomeou meu blog como uma de suas referências. Valew Júlio, muito obrigado, e tomara que um dia meu blog chegue a altura do seu! Como parte do meme, tenho que indicar blogs dignos de tal &#8220;selo&#8221;:</p>
<ul>
<li><a href="http://www.tmferreira.com.br/blog">tmferreira</a>: Um pouco parado, mas já vi muitos artigos bons lá.</li>
<li><a href="http://devlog.waltercruz.com/">Walter Cruz &#8211; devlog</a>: Desenvolvimento web, Python, etc.</li>
<li><a href="http://www.nomedojogo.com/">Nome do Jogo</a>: Blog super atualizado de Ruby On Rails e afins.</li>
<li><a href="http://www.akitaonrails.com/">Akita On Rails</a>: Sobre Rails também, muitos artigos de qualidade.</li>
<li><a href="http://eustaquiorangel.com">TaQ</a>: Tecnologia e Ruby.</li>
<li><a href="http://blog.klaus.pro.br/">Klaus Paiva</a>: Desenvolvimento web, Ruby On Rails.</li>
<li><a href="http://www.web2ponto0.com.br/">Web 2 Ponto 0</a>: PHP, Ruby On Rails</li>
</ul>
<p>Termino por aqui, esses blogs são muito bons, vale a pena dar uma conferida!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/03/17/diz-que-ate-nao-e-um-mau-blog/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">77</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://www.juliogreff.blog.br/images/nao-e-um-mau-blog.jpg" medium="image" />
	</item>
		<item>
		<title>RadRails 1.0 Lançado</title>
		<link>https://bermonruf.wordpress.com/2008/03/17/radrails-10-lancado/</link>
					<comments>https://bermonruf.wordpress.com/2008/03/17/radrails-10-lancado/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Mon, 17 Mar 2008 21:11:28 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/03/17/radrails-10-lancado/</guid>

					<description><![CDATA[Há algum tempo foi lançada a versão 1.0 do RadRails, que agora faz parte do projeto Aptana. A vantagem é que o Aptana já era uma ótima IDE para XHTML, CSS e Javascript, depois que integrou o RadRails e suporte a PHP ficou melhor ainda. Nessa nova versão do RadRails vieram algumas melhorias e acertos, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/radrails_presents.jpg" width="450" /></p>
<p>Há algum tempo foi lançada a versão 1.0 do <a href="http://www.aptana.com/rails">RadRails</a>, que agora faz parte do projeto <a href="http://www.aptana.com/">Aptana</a>. A vantagem é que o Aptana já era uma ótima IDE para XHTML, CSS e Javascript, depois que integrou o RadRails e suporte a PHP ficou melhor ainda. Nessa nova versão do RadRails vieram algumas melhorias e acertos, além de uma interface um pouco melhorada. Algumas das novas funcionalidades:</p>
<ul>
<li>Suporte ao Rails 2.0</li>
<li>Suporte a JRuby nativo (viva!)</li>
<li>Aba de vizualização RDoc</li>
<li>Code Completion agora sugere argumentos de métodos</li>
</ul>
<p>O suporte, via IDE, dos servidores foi melhorado, agora eles iniciam automáticamente com a criação do projeto. Falando nisso, a tela de criação de projeto melhorou, foram adicionadas novas opções muito úteis como a versão do Rails que vai ser usada no projeto, o tipo de banco de dados (fim do sqlite como default), e os servidores que serão criados. Novo Rails Shell, para quem prefere usar a linha de comando às janelas da IDE. Vale a pena conferir!</p>
<p>Para instalar/atualizar o RadRails no Aptana:  Help &gt; Software Updates &gt; Find and Install… &gt; Search for new features to install &gt; Next &gt; Selecione &#8220;Aptana: RadRails Development Enviroment&#8221; &gt; Finish</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/03/17/radrails-10-lancado/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">76</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/radrails_presents.jpg" medium="image" />
	</item>
		<item>
		<title>Efeitos Na Mootools</title>
		<link>https://bermonruf.wordpress.com/2008/03/12/efeitos-na-mootools/</link>
					<comments>https://bermonruf.wordpress.com/2008/03/12/efeitos-na-mootools/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Wed, 12 Mar 2008 16:54:17 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mootools]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/03/12/efeitos-na-mootools-2/</guid>

					<description><![CDATA[Voltei pessoal! E falando da Mootools, que andei estudando recentemente, mais especificamente sobre efeitos, uma parte muito divertida e legal. Os efeitos na Mootools são divididos em algumas classes, que estão dentro de Fx, cada uma delas com um objetivo diferente. Falarei hoje nesse post da Fx.Style, Fx.Styles e inevitávelmente da Fx.Transitions, as duas primeiras [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/fireworks.jpg" width="450" /></p>
<p>Voltei pessoal! E falando da  <a href="http://www.mootools.net/">Mootools</a>, que andei estudando recentemente, mais especificamente sobre efeitos, uma parte muito divertida e legal.<br />
Os efeitos na Mootools são divididos em algumas classes, que estão dentro de <b>Fx</b>, cada uma delas com um objetivo diferente. Falarei hoje nesse post da <b>Fx.Style</b>, <b>Fx.Styles</b> e inevitávelmente da <b>Fx.Transitions</b>, as duas primeiras basicamente mudam uma propriedade de estilo CSS gradualmente ao longo de um tempo de acordo com uma determinada transição, que está contida dentro da última classe referida. A principal diferença entre as duas classes é que a primeira só aplica efeito sobre uma propriedade e a segunda sobre mais de uma propriedade, as duas relacionadas a um elemento.</p>
<h3>Transições</h3>
<p>A classe <b>Fx.Transitions</b> nos fornece uma <a href="http://docs.mootools.net/Effects/Fx-Transitions.js">lista de transições</a>, que alterarão a animação, para serem usadas em nossos efeitos. Transições são responsáveis por modificar os valores intermediarios entre o inicio e o fim de uma animação. Por exemplo, quando se quer modificar a largura de um elemento de 10 a 15 pixels, a transição será responsável por definir que, por exemplo, no 300º milissegundo da animação a largura terá 12 pixels. Cada transição, exceto a <b>linear</b>, contem 3 opções de easing:<strong><br />
</strong></p>
<ul>
<li><strong>easeIn</strong>: o efeito é mais intenso no ínicio da animação</li>
<li><b>easeOut</b>: o efeito é mais intenso no final da animação</li>
<li><b>easeInOut</b>: o efeito é mais intenso no ínicio e no final</li>
</ul>
<p>Escolhida a transição e o método easing, você pode obte-lá desse modo:</p>
<pre class="brush: jscript; title: ; notranslate">
// Fx.Transitions.[tipo de transição].[método easing]
Fx.Transitions.Sine.easeInOut
</pre>
<p>A dica pra escolher a combinação certa é testando, verifique cada transição nesse <a href="http://demos.mootools.net/Fx.Transitions">demo de transições</a>.</p>
<h3>Alterando Uma Única Propriedade CSS Com <b>Fx.Style</b></h3>
<p>Primeiro nos precisamos decidir o elemento que receberá o efeito, depois disso temos dois meios de criar o efeito. O primeiro, clássico, usando o construtor, que aceita três argumentos: o primeiro o elemento em si, o segundo a propriedade CSS que será modificada e o terceiro uma lista de opções:</p>
<pre class="brush: jscript; title: ; notranslate">
var obj = $(&quot;box&quot;);
var fx = new Fx.Style(obj, &quot;height&quot;, {
	&quot;transition&quot;: Fx.Transitions.Sine.easeInOut, // Transição a ser usada na animação
	&quot;duration&quot;: 1000, // Duração em milissegundos
	&quot;unit&quot;: &quot;px&quot;, // Unidade usada para alterar a propriedade
	&quot;wait&quot;: true, // Aguardar ou não a animação anterior de mesma instância para começar
	&quot;fps&quot;: 50 // Quadros por segundo da animação, quanto maior melhor e mais lento
});
</pre>
<p>O segundo meio, que eu prefiro, é um atalho no próprio objeto (instância de Element), o método <b>effect</b>, que recebe os argumentos 2 e 3 iguais do construtor acima:</p>
<pre class="brush: jscript; title: ; notranslate">
var obj = $(&quot;box&quot;);
var fx = obj.effect(&quot;height&quot;, {
	// Mesmas opções
});
</pre>
<p>Terminada a criação do efeito, temos que iniciá-lo efetivamente, para isso temos o método <b>start</b>. Ele aceita 1 ou 2 argumentos, no primeiro caso o primeiro argumento é o valor final da propriedade, o inicial será o valor atual:</p>
<pre class="brush: jscript; title: ; notranslate">
fx.start(350); // O objeto terá a largura igual a 350 pixels no final
</pre>
<p>Já no segundo caso, o primeiro argumento é o valor inicial e o segundo o final:</p>
<pre class="brush: jscript; title: ; notranslate">
fx.start(10, 350); // O objeto terá 10 pixels no ínicio do efeito e 350 depois de terminado
</pre>
<p>Dica: Se você for alterar a mesma propriedade várias vezes não crie uma nova instância a cada vez, use a que já foi criada e chame o método <b>start</b> pra cada efeito.<br />
Pronto, bem mais legal do que mudar propriedades sem efeito, né?!</p>
<h3>Alterando Várias Propriedades CSS Com <b>Fx.Styles</b></h3>
<p>Quase a mesma coisa que a classe <b>Fx.Style</b>, porém algumas diferenças. Continuamos com 2 meios de se obter a instância, ou pelo construtor, que aceita 2 argumentos iguais ao anterior: o elemento e as opções, a exeção é o nome da propriedade que será modificada, já que são mais de uma propriedades elas serão definidas na hora de iniciar o efeito:</p>
<pre class="brush: jscript; title: ; notranslate">
var obj = $(&quot;box&quot;);
var fx = new Fx.Styles(obj, {
	// Mesmas opções
});
</pre>
<p>Ou pelo método <b>effects</b> do objeto:</p>
<pre class="brush: jscript; title: ; notranslate">
var obj = $(&quot;box&quot;);
var fx = obj.effects({
	// Mesmas opções
});
</pre>
<p>Agora vamos iniciar o efeito, a diferença principal para <b>Fx.Style</b> é que é aqui que serão definidos os valroes das propriedades atrávez de um objeto (JSON):</p>
<pre class="brush: jscript; title: ; notranslate">
fx.start({
	&quot;height&quot;: 350, // Efeito iniciará com altura atual e terminará com 350 pixels
	&quot;width&quot;: [10, 350], // Efeito iniciará com largura 10 pixels e terminará com 350 pixels
	&quot;background-color&quot;: [&quot;#FF0000&quot;, &quot;#0000FF&quot;], // Cor de fundo vermelha no início e azul no final
	&quot;color&quot;: &quot;#FFFFFF&quot; // Cor do texto atual no início e branca no final
});
</pre>
<p>Como se pode perceber, se você fornecer um Array como valor da propriedade, o primeiro elemento será o valor para ser usado no início do efeito e o segundo no final, ou se fornecer somente um valor, esse será o valor final e o inicial será o valor atual da propriedade.<br />
A mesma dica anterior também vale aqui, porém como aqui se modificam várias propriedades, a regra é: se você tiver que aplicar vários efeitos a um elemento várias vezes, use a mesma instância e chame o método <b>start</b>.</p>
<p>Viu como não é difícil brincar com a Mootools, gostei muito do suporte a efeitos, animações, esse tipo de coisa, é muito transparente, quem já implementou (ou tentou implementar) algo assim sabe como é difícil fazer um trabalho bem feito e ao mesmo tempo simples de se usar. Esse é um ponto forte da Mootools.</p>
<p>Flws pessoal, até a próxima!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/03/12/efeitos-na-mootools/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">75</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/fireworks.jpg" medium="image" />
	</item>
		<item>
		<title>Contando Troco No Ruby Quiz</title>
		<link>https://bermonruf.wordpress.com/2008/01/30/contando-troco-no-ruby-quiz/</link>
					<comments>https://bermonruf.wordpress.com/2008/01/30/contando-troco-no-ruby-quiz/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Wed, 30 Jan 2008 14:53:31 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/01/30/contando-troco-no-ruby-quiz/</guid>

					<description><![CDATA[Vindo do blog Nome Do Jogo, fiquei sabendo do novo desafio do Ruby Quiz. Há um tempo atrás acompanhava cada novo desafio, alguns que eu achava interessante, tentava resolvê-los, mas nunca cheguei a enviar a solução pra lá. Mas esse desafio é simples e bastante divertido. O desafio é criar um método que recebe dois [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/coins.jpg" width="450" /></p>
<p>Vindo do blog <a href="http://www.nomedojogo.com/2008/01/28/ruby-quiz-brincando-com-moedas/">Nome Do Jogo</a>, fiquei sabendo do novo desafio do <a href="http://www.rubyquiz.com/index.html">Ruby Quiz</a>. Há um tempo atrás acompanhava cada novo desafio, alguns que eu achava interessante, tentava resolvê-los, mas nunca cheguei a enviar a solução pra lá. Mas esse desafio é simples e bastante divertido.</p>
<p>O desafio é criar um método que recebe dois argumentos, um deles é um valor que deve ser dividido em moedas fornecidas no segundo argumento, o método tem que retornar um array com a menor combinação possível de moedas. Imagine ter que dar 37 centavos em moedas de 25, 10, 5 e 1? O certo seria receber uma de 25, uma de 10 e duas de 1, veja o código pra entender melhor:</p>
<pre class="brush: ruby; title: ; notranslate">
irb(main):005:0&gt; make_change(37, [25, 10, 5, 1])
=&gt; [25, 10, 1, 1]
</pre>
<p>Entendeu?! Agora vamos implementar o método, somente o método, não farei nenhuma classe. Primeiro vamos fazer alguns testes antes de criar o método:</p>
<pre class="brush: ruby; title: ; notranslate">
require &quot;test/unit&quot;;

class ChangeTest &lt; Test::Unit::TestCase
  
  def test_should_raise_error_when_change_is_impossible
    assert_raise(ChangeError) do
      make_change(23, &amp;#91;10, 5&amp;#93;);
    end
  end
  
  def test_should_accept_diferent_coins
    assert_equal &amp;#91;17, 17, 4&amp;#93;, make_change(38, &amp;#91;17, 4&amp;#93;);
    assert_equal &amp;#91;52&amp;#93;, make_change(52, &amp;#91;52&amp;#93;);
  end
  
  def test_should_give_minimun_number_of_coins
    assert_equal &amp;#91;25, 10, 1, 1&amp;#93;, make_change(37);
    assert_equal &amp;#91;1, 1, 1&amp;#93;, make_change(3);
    assert_equal &amp;#91;3, 3&amp;#93;, make_change(6, &amp;#91;3&amp;#93;);
  end
  
end
&amp;#91;/sourcecode&amp;#93;

Se a troca for impossível com as moedas fornecidas, o método vai devolver uma exceção do tipo ChangeError. O método também tem por default moedas de 25, 10, 5 e 1 para serem usadas. Feitos os testes, vamos partir para a implementação, para isso precisaremos adicionar um método &lt;b&gt;sum&lt;/b&gt; na classe Array que soma os elementos de dentro do Array:


class Array
  
  def sum
    inject{|sum, n| sum + n;};
  end
  
end
</pre>
<p>Pronto, agora podemos partir para a implementação: </p>
<pre class="brush: ruby; title: ; notranslate">
class ChangeError &lt; StandardError; end

def make_change(amount, coins=&amp;#91;25, 10, 5, 1&amp;#93;)
  change = coins.sort.reverse.inject(&amp;#91;&amp;#93;) do |change, coin|
    change &lt;&lt; coin until change.sum + coin &gt; amount;
    change;
  end
  raise ChangeError unless change.sum == amount;
  change;
end
</pre>
<p>Na linha 4, eu ordeno o Array de maior para menor e uso o método <b>inject</b>, que é basicamente responsável por reduzir o Array a um valor. Nesse caso dentro do bloco de código eu coloco as moedas no Array <b>change</b> até que elas ultrapassarem o valor total, e devolvo esse Array. Na linha 8 eu checo se a soma do Array <b>change</b> é igual ao valor pedido, se não for retorna uma exceção ChangeError.</p>
<p>Não foi muito difícil, tem desafios mais elaborados no site, vale a pena dar uma conferida. Fiquei sabendo também que parece que esse é um dos últimos desafios do <a href="http://www.rubyquiz.com/index.html">Ruby Quiz</a>.</p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/01/30/contando-troco-no-ruby-quiz/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">72</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/coins.jpg" medium="image" />
	</item>
		<item>
		<title>Ruby 1.9</title>
		<link>https://bermonruf.wordpress.com/2008/01/01/ruby-19/</link>
					<comments>https://bermonruf.wordpress.com/2008/01/01/ruby-19/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Wed, 02 Jan 2008 02:59:18 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2008/01/01/ruby-19/</guid>

					<description><![CDATA[Antes de tudo um feliz ano novo para todos! Como todos já devem saber o Ruby 1.9 já foi lançado, e como um presente de natal, justamente no dia 25. Como o próprio Matz disse, essa ainda não é uma versão totalmente estável e nem para ser usada em produção, não a receba como substituta [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><img src="https://i0.wp.com/i85.photobucket.com/albums/k43/bermonruf/net/blog/rubies.jpg" width="450" /></p>
<p>Antes de tudo um feliz ano novo para todos! Como todos já devem saber o <a href="http://www.ruby-forum.com/topic/136553">Ruby 1.9 já foi lançado</a>, e como um presente de natal, justamente no dia 25. Como o próprio Matz disse, essa ainda não é uma versão totalmente estável e nem para ser usada em produção, não a receba como substituta do Ruby 1.8, ela é experimental ainda. Tivemos grande mudanças como <a href="http://www.atdot.net/yarv/">YARV</a>, threads nativas, mais splats de Arrays, UTF-8, métodos de Enumerable sem bloco e etc, veja <a href="http://eigenclass.org/hiki.rb?Changes+in+Ruby+1.9">mais mudanças</a> e um tutorial para <a href="http://ruby.tie-rack.org/28/installing-19/">instalar o Ruby 1.9</a>.</p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2008/01/01/ruby-19/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">71</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>

		<media:content url="http://i85.photobucket.com/albums/k43/bermonruf/net/blog/rubies.jpg" medium="image" />
	</item>
		<item>
		<title>Internet Explorer 8 Nos Padrões</title>
		<link>https://bermonruf.wordpress.com/2007/12/20/internet-explorer-8-nos-padroes/</link>
					<comments>https://bermonruf.wordpress.com/2007/12/20/internet-explorer-8-nos-padroes/#comments</comments>
		
		<dc:creator><![CDATA[Bernardo Rufino]]></dc:creator>
		<pubDate>Thu, 20 Dec 2007 20:46:16 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[XHTML]]></category>
		<guid isPermaLink="false">http://bermonruf.wordpress.com/2007/12/20/internet-explorer-8-nos-padroes/</guid>

					<description><![CDATA[Esse vídeo não é falso (espero!), o Internet Explorer 8 passou no teste Acid2. Finalmente podemos ver uma luz no final do túnel em relação aos padrões e o Internet Explorer. Isso será um fato histórico se a versão final comprir o que promete. Há quanto tempo você xinga a Microsoft enquanto desenvolve um layout?! [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><iframe class="youtube-player" width="450" height="254" src="https://www.youtube.com/embed/0i4CDZgQJwo?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-br&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe><br />
Esse vídeo não é falso (espero!), o Internet Explorer 8 passou no <a href="http://www.webstandards.org/files/acid2/test.html">teste Acid2</a>. Finalmente podemos ver uma luz no final do túnel em relação aos padrões e o Internet Explorer. Isso será um fato histórico se a versão final comprir o que promete. Há quanto tempo você xinga a Microsoft enquanto desenvolve um layout?! Isso vai acabar! Isso não quer dizer que usarei IE agora, nem perto disso, Firefox está a anos-luz dele, mas é uma notícia que merece ser comemorada. Fiquei sabendo no <a href="http://revolucao.etc.br/archives/ie8-passa-no-teste-do-acid2/">Revolução Etc</a>, notícia original no site da evangelizadora dos padrões, que foi contratada pela Microsoft, Molly: <a href="http://www.molly.com/2007/12/19/yes-ladies-and-gentleman-we-have-a-smiley/">Sim senhoras e senhores, nós temos um sorriso</a>.</p>
<p></p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://bermonruf.wordpress.com/2007/12/20/internet-explorer-8-nos-padroes/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">70</post-id>
		<media:content url="https://1.gravatar.com/avatar/18f4686d46f4d186b009292e1f88c0a884570e027b1be2bacd8f19f65bbbd308?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Bernardo Rufino</media:title>
		</media:content>
	</item>
	</channel>
</rss>
