<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Algumas Idéias</title>
	
	<link>http://algumasideias.net</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 11 Apr 2010 03:53:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/algumasideias" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="algumasideias" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Problemas com o RedCloth</title>
		<link>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/</link>
		<comments>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/#comments</comments>
		<pubDate>Mon, 31 Mar 2008 12:09:07 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/?p=27</guid>
		<description><![CDATA[Usando o helper textilize notei que ele estava tendo um comportamento estranho quando o texto tinha quebras de linha.
Fuçando no wiki descobri que a versão 3.0.4 da gem RedCloth, utilizada pelo helper, tem um bug que não identifica corretamente as quebras de linha como parágrafos.
Como solução, é indicado o downgrade/atualização para as versões 3.0.3 ou [...]]]></description>
			<content:encoded><![CDATA[<p>Usando o helper <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001054">textilize</a> notei que ele estava tendo um comportamento estranho quando o texto tinha quebras de linha.</p>
<p>Fuçando no <a href="http://wiki.rubyonrails.org/rails/pages/redcloth">wiki</a> descobri que a versão 3.0.4 da gem <a href="http://whytheluckystiff.net/ruby/redcloth/">RedCloth</a>, utilizada pelo helper, tem um bug que não identifica corretamente as quebras de linha como parágrafos.</p>
<p>Como solução, é indicado o downgrade/atualização para as versões 3.0.3 ou 4.0 da gem (ainda em desenvolvimento) ou a utilização do patch abaixo no environment.rb.</p>
<pre>class RedCloth
  # Patch for RedCloth.  Fixed in RedCloth r128 but _why hasn't released it yet.
  # <a href="http://code.whytheluckystiff.net/redcloth/changeset/128">http://code.whytheluckystiff.net/redcloth/changeset/128</a>
  def hard_break( text )
    text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1" ) if hard_breaks
  end
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando o Castle ActiveRecord</title>
		<link>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/</link>
		<comments>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 00:11:48 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/</guid>
		<description><![CDATA[O Castle ActiveRecord é uma implementação do pattern Active Record desenvolvido em .NET em cima do NHibernate.
Ele faz parte do pacote de frameworks do projeto Castle Projet, e tem forte influencia da implementação do Active Record do framework Ruby On Rails.
Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.castleproject.org/activerecord/index.html">Castle ActiveRecord</a> é uma implementação do pattern <a href="http://martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> desenvolvido em .NET em cima do <a href="http://www.nhibernate.org">NHibernate</a>.</p>
<p>Ele faz parte do pacote de frameworks do projeto <a href="http://www.castleproject.org">Castle Projet</a>, e tem forte influencia da implementação do <a href="http://ar.rubyonrails.org">Active Record</a> do framework <a href="http://www.rubyonrails.org">Ruby On Rails</a>.</p>
<p>Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos e não dos famigerados arquivos xml e um mecanismo de validação eficiente e flexível.</p>
<p><span id="more-21"></span></p>
<h4>Criando o projeto</h4>
<p>Acesse a página de <a href="http://www.castleproject.org/castle/download.html">download</a> do projeto, baixe o arquivo <a href="http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download">Castle-net-2.0-release-2007-9-20.zip</a> e descompacte em algum diretório da sua preferência.</p>
<p>Em seguida crie um novo projeto web e faça referência as assemblies abaixo:</p>
<blockquote><p>Castle.ActiveRecord.dll<br />
Castle.Core.dll<br />
Castle.Components.Validator.dll<br />
Castle.DynamicProxy.dll<br />
NHibernate.dll<br />
Iesi.Collections.dll<br />
log4net.dll</p></blockquote>
<h4>Criando a tabela de Contatos</h4>
<p>Crie uma base de dados chamada ContatosAR e em seguida crie uma tabela com a estrutura abaixo.</p>
<pre>CREATE TABLE [dbo].[Contatos](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [varchar](255) NOT NULL,
	[Email] [varchar](255) NOT NULL,
 CONSTRAINT [PK_Contatos] PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]</pre>
<h4>Criando a classe Contato</h4>
<p>Agora vamos criar a classe que vai representar a nossa tabela.</p>
<pre>using System;

public class Contato
{
  private int id;
  private string nome;
  private string email;

  public int Id
  {
    get { return id; }
    set { id = value; }
  }

  public string Nome
  {
    get { return nome; }
    set { nome = value; }
  }

  public string Email
  {
    get { return email; }
    set { email = value; }
  }
}</pre>
<h4>Mapeando a classe Contato</h4>
<p>Mapeando a nossa classe para o NHibernate. Só que em vez do xml entra em cena os atributos disponíveis no ActiveRecord.</p>
<pre>[ActiveRecord("Contatos")]
public class Contato : ActiveRecordValidationBase&lt;Contato&gt;
{
    private int id;
    private string nome;
    private string email;

    [PrimaryKey(PrimaryKeyType.Native, "Id")]
    public int Id
    {
      get { return id; }
      set { id = value; }
    }

    [Property("Nome")]
    [ValidateNonEmpty("Nome é requirido")]
    [ValidateLength(1, 255, "Nome deve ter no máximo 255 caracteres")]
    public string Nome
    {
      get { return nome; }
      set { nome = value; }
    }

    [Property("Email")]
    [ValidateNonEmpty("E-mail é requirido")]
    [ValidateLength(1, 255, "E-mail deve ter no máximo 255 caracteres")]
    [ValidateEmail("E-mail inválido")]
    public string Email
    {
      get { return email; }
      set { email = value; }
    }
}</pre>
<h4>Configurando o ActiveRecord</h4>
<p>No arquivo Web.Config adicione o código abaixo e altere a chave hibernate.connection.connection_string para apontar para a sua instância do SQL Server.</p>
<pre>&lt;?xml version="1.0"?&gt;

&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name="activerecord"
                   type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" /&gt;
  &lt;/configSections&gt;

  &lt;activerecord isWeb="true"&gt;
    &lt;config&gt;
      &lt;add key="hibernate.connection.driver_class"
                 value="NHibernate.Driver.SqlClientDriver" /&gt;
      &lt;add key="hibernate.dialect"
                 value="NHibernate.Dialect.MsSql2005Dialect" /&gt;
      &lt;add key="hibernate.connection.provider"
                 value="NHibernate.Connection.DriverConnectionProvider" /&gt;
      &lt;add key="hibernate.connection.connection_string"
                 value="Data Source=.;Initial Catalog=ContatosAR;Integrated Security=True" /&gt;
    &lt;/config&gt;
  &lt;/activerecord&gt;
&lt;/configuration&gt;</pre>
<p>E no arquivo Global.asax adicione o código abaixo.</p>
<pre>&lt;%@ Application Language="C#" %&gt;

&lt;%@ Import Namespace="Castle.ActiveRecord" %&gt;
&lt;%@ Import Namespace="Castle.ActiveRecord.Framework" %&gt;
&lt;%@ Import Namespace="Castle.ActiveRecord.Framework.Config" %&gt;

&lt;script runat="server"&gt;
    void Application_Start(object sender, EventArgs e)
    {
        IConfigurationSource source = ActiveRecordSectionHandler.Instance;
        ActiveRecordStarter.Initialize(source, typeof(Contato));
    }
&lt;/script&gt;</pre>
<h4>Listando os contatos</h4>
<p>Agora, com o ActiveRecord configurado, vamos criar uma página para listar todos os contatos cadastrados na base de dados (nenhum até o momento).</p>
<pre>&lt;asp:GridView ID="gvContatos" AutoGenerateColumns="false" runat="server"&gt;
    &lt;Columns&gt;
        &lt;asp:HyperLinkField DataNavigateUrlFields="Id"
                DataNavigateUrlFormatString="EditarContato.aspx?Id={0}"
		DataTextField="Nome" HeaderText="Nome" /&gt;

	    &lt;asp:BoundField DataField="Email" HeaderText="E-mail" /&gt;
    &lt;/Columns&gt;
&lt;/asp:GridView&gt;</pre>
<p>ListarContatos.aspx.cs</p>
<pre>public partial class ListarContatos : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        gvContatos.DataSource = Contato.FindAll();
        gvContatos.DataBind();
    }
}</pre>
<h4>Inserindo um contato</h4>
<p>Montando o formulário de inserção. De propósito vou deixar para fazer a validação no servidor.</p>
<pre>&lt;h3&gt;Novo contato&lt;/h3&gt;

&lt;asp:Panel ID="pnMensagem" runat="server" Visible="false"&gt;
    &lt;asp:Label ID="lblMensagem" runat="server" /&gt;
&lt;/asp:Panel&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblNome" runat="server" AssociatedControlID="txtNome"&gt;Nome:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtNome" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblEmail" runat="server" AssociatedControlID="txtEmail"&gt;E-mail:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtEmail" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;				

&lt;asp:Button ID="btnSalvar" runat="server" OnClick="btnSalvar_Click" Text="Salvar" /&gt;
ou &lt;a href="ListarContatos.aspx"&gt;Voltar&lt;/a&gt;</pre>
<p>NovoContato.aspx.cs</p>
<pre>public partial class NovoContato : System.Web.UI.Page
{
    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        pnMensagem.Visible = true;
        lblMensagem.Text = "";

        Contato contato = new Contato();

        contato.Nome = txtNome.Text;
        contato.Email = txtEmail.Text;

        if (contato.IsValid())
        {
            contato.Create();

            lblMensagem.Text = "Contato criado com sucesso.";

            txtNome.Text = "";
            txtEmail.Text = "";
        }
        else
        {
            foreach (string s in contato.ValidationErrorMessages)
                lblMensagem.Text += s;
        }
    }
}</pre>
<h4>Editando um contato</h4>
<pre>&lt;h3&gt;Editar contato&lt;/h3&gt;

&lt;asp:Panel ID="pnMensagem" runat="server" Visible="false"&gt;
    &lt;asp:Label ID="lblMensagem" runat="server" /&gt;
&lt;/asp:Panel&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblNome" runat="server" AssociatedControlID="txtNome"&gt;Nome:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtNome" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblEmail" runat="server" AssociatedControlID="txtEmail"&gt;E-mail:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtEmail" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;				

&lt;asp:Button ID="btnSalvar" runat="server" OnClick="btnSalvar_Click" Text="Salvar" /&gt;
ou &lt;a href="ListarContatos.aspx"&gt;Voltar&lt;/a&gt;</pre>
<p>EditarContato.aspx.cs</p>
<pre>public partial class EditarContato : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Contato contato = Contato.Find(Convert.ToInt32(Request.QueryString["Id"]));

            txtNome.Text = contato.Nome;
            txtEmail.Text = contato.Email;
        }
    }

    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        pnMensagem.Visible = true;
        lblMensagem.Text = "";

        Contato contato = Contato.Find(Convert.ToInt32(Request.QueryString["Id"]));

        contato.Nome = txtNome.Text;
        contato.Email = txtEmail.Text;

        if (contato.IsValid())
        {
            contato.Update();

            lblMensagem.Text = "Dados do contato atualizados com sucesso.";
        }
        else
        {
            foreach (string s in contato.ValidationErrorMessages)
                lblMensagem.Text += s;
        }
    }
}</pre>
<h4>Código do projeto</h4>
<p>O <a href='http://algumasideias.net/wp-content/uploads/2008/03/contatosar.zip' title='Cadastro de Contatos'>código do projeto</a> está disponivel para download.</p>
<p>Ele foi desenvolvido usando o Microsoft Visual Web Developer 2008 Express Edition com o SQL Server Express 2005.</p>
<h4>Em breve</h4>
<p>Depois dessa passada superficial vou tentar preparar uma série de posts detalhando mais as funcionalidades do framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Automatic Properties</title>
		<link>http://algumasideias.net/2008/03/27/automatic-properties/</link>
		<comments>http://algumasideias.net/2008/03/27/automatic-properties/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 13:31:21 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/automatic-properties/</guid>
		<description><![CDATA[No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.
O Automatic Properties.
public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}
Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a [...]]]></description>
			<content:encoded><![CDATA[<p>No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.</p>
<p>O Automatic Properties.</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}</pre>
<p>Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a propriedade.</p>
<p>Também é possível declarar uma propriedade como somente leitura usando o accessor private.</p>
<pre>public class Pessoa {
  public int Id { get; private set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}</pre>
<p>E caso você precise usar atributos é necessário fazer a declaração da propriedade do modo tradicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/automatic-properties/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object e Collection Initializers</title>
		<link>http://algumasideias.net/2008/03/27/object-e-collection-initializers/</link>
		<comments>http://algumasideias.net/2008/03/27/object-e-collection-initializers/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 13:05:57 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/object-e-collection-initializers/</guid>
		<description><![CDATA[Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.
Object Initializers
Agora podemos ao instanciar um objeto passar valores para as suas propriedades.
public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", [...]]]></description>
			<content:encoded><![CDATA[<p>Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.</p>
<h4>Object Initializers</h4>
<p>Agora podemos ao instanciar um objeto passar valores para as suas propriedades.</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", Email = "joao@gmail.com" };
Pessoa maria = new Pessoa() { Nome = "Maria", Email = "maria@gmail.com" };</pre>
<p>No exemplo acima, são instanciados dois objetos do tipo Pessoa, chamando o construtor padrão, e em seguida setadas as propriedades Nome e Email.</p>
<p>Tudo em uma única linha de código.</p>
<p>Também é possível passar parâmetros para o construtor, conforme o exemplo a seguir:</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
  public int Idade { get; set; }</pre>
<pre>  public Pessoa(string nome)
  {
    this.Nome = nome;
  }
}</pre>
<pre>Pessoa pedro = new Pessoa("Pedro") {
  Email = "pedro@gmail.com",
  Idade = 20
};</pre>
<h4>Collection Initializers</h4>
<p>Já nas coleções podemos passar um conjunto de objetos.</p>
<p>No exemplo abaixo a coleção pessoas é instanciada com os objetos joao, maria e pedro como os seus membros.</p>
<pre>IList&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;() { joao, maria, pedro }</pre>
<p>É aqui uma combinação das duas formas.</p>
<pre>IList&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;() {
  joao, maria, pedro,
  new Pessoa() { Nome = "Jose", Email = "jose@gmail.com" }
}</pre>
<h4>Conclusão</h4>
<p>Como vimos nesse segundo post, o C# 3.0 vem trazendo grandes melhorias para a implementação de um código mais legível e bonito.</p>
<p>Muitas dessas melhorias foram influenciadas por dois projetos da Microsoft Research, o <a href="http://research.microsoft.com/fsharp">F#</a> e o <a href="http://research.microsoft.com/comega">Cω</a>.</p>
<p><a href="http://tomasp.net/articles/csharp3-concepts.aspx">Nesse post</a>, Tomas Petricek detalha as novidades incorporadas no C# 3.0 vindas desses dois projetos.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/object-e-collection-initializers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extension Methods</title>
		<link>http://algumasideias.net/2008/03/26/extension-methods/</link>
		<comments>http://algumasideias.net/2008/03/26/extension-methods/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 00:18:26 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/26/extension-methods-2/</guid>
		<description><![CDATA[Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.
Essa funcionalidade é chamada de Extension Methods.
Criando um Extension Method
Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a [...]]]></description>
			<content:encoded><![CDATA[<p>Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.</p>
<p>Essa funcionalidade é chamada de Extension Methods.</p>
<h4>Criando um Extension Method</h4>
<p>Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).</p>
<pre>static class Program
{
  static void Main(string[] args)
  {
    string emailCliente = System.Console.ReadLine();

    if (!Utilidades.IsEmailValido(emailCliente))
      System.Console.WriteLine("E-mail informado inválido.");
  }
}</pre>
<p>Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.</p>
<pre><code>if (!emailCliente.IsEmailValido())
  System.Console.WriteLine("E-mail informado inválido.");</code></pre>
<p>A criação do Extension Method se resume a definição de uma classe estática com um método estático.</p>
<pre>namespace Utilidades
  public static class Extensoes
  {
    public static bool IsEmailValido(this string email)
    {
      return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    }
  }
}</pre>
<p>Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.</p>
<p>E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.</p>
<pre>using Utilidades;</pre>
<h4>Passando parâmetros para o Extension Method</h4>
<pre>namespace Utilidades
  public static class Extensoes
  {
    public static bool IsMaiorQue(this string s, int tamanho)
    {
      return s.Length &gt; tamanho;
    }
  }
}

string nome = "Joao da Silva";

if (nome.IsMaiorQue(10))
  System.Console.WriteLn("Nome só pode ter 10 caracteres");</pre>
<p>Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possível criar extension methods para interfaces e generics.</p>
<p>Abaixo três boas referências que valem à pena dar uma lida.</p>
<ul>
<li><a href="http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx">http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3">http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3</a></li>
<li><a href="http://blogs.msdn.com/vbteam/pages/articles-about-extension-methods.aspx">http://blogs.msdn.com/vbteam/pages/articles-about-extension-methods.aspx</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/26/extension-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Um pouco de mágica</title>
		<link>http://algumasideias.net/2008/03/03/um-pouco-de-magica/</link>
		<comments>http://algumasideias.net/2008/03/03/um-pouco-de-magica/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 23:58:24 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/03/um-pouco-de-magica/</guid>
		<description><![CDATA[A minha idéia inicial era botar em prática o que tinha visto no screencast do Fábio Akita sobre o plugin resource_controller. Mas já que estava fazendo um dry up no código dos controles fiquei pensando se não conseguia fazer fazer o mesmo com os modelos usando a gem Magic Models do Dr Nic&#8217;s.
&#8220;A gem Magic [...]]]></description>
			<content:encoded><![CDATA[<p>A minha idéia inicial era botar em prática o que tinha visto no <a href="http://www.akitaonrails.com/2008/1/25/easy-restful-rails-screencast">screencast</a> do <a href="http://www.akitaonrails.com">Fábio Akita</a> sobre o plugin <a href="http://jamesgolick.com/resource_controller/rdoc/index.html">resource_controller</a>. Mas já que estava fazendo um dry up no código dos controles fiquei pensando se não conseguia fazer fazer o mesmo com os modelos usando a gem <a href="http://magicmodels.rubyforge.org/dr_nic_magic_models/">Magic Models</a> do <a href="http://www.drnicwilliams.com/">Dr Nic&#8217;s</a>.</p>
<blockquote><p>&#8220;A gem Magic Models estende o ActiveRecord permitindo que ele consiga gerar os relacionamentos (belongs e has_many) e validações (presence, length, numericality, inclusion e uniqueless) dos modelos automáticamente a partir da estrutura da base de dados.&#8221;</p></blockquote>
<p>Você pode ver o código no <a href="http://pastie.caboo.se/160869">Pastie</a> ou <a href="http://algumasideias.net/wp-content/uploads/2008/03/magicbooks.zip">baixar</a> o projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/03/um-pouco-de-magica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NetBeans interface language</title>
		<link>http://algumasideias.net/2008/02/22/netbeans-interface-language/</link>
		<comments>http://algumasideias.net/2008/02/22/netbeans-interface-language/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 12:42:48 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/02/22/netbeans-interface-language/</guid>
		<description><![CDATA[Por padrão o NetBeans usa a linguagem definida no Windows como a padrão para a sua interface.
Uso o Windows XP Professional English com a localidade e configurações regionais definidas para as brasileiras mas a interface do NetBeans sempre ficou em inglês.
Mas depois de ter atualizado ele ontem algumas opções começaram a aparecer em português. De [...]]]></description>
			<content:encoded><![CDATA[<p>Por padrão o NetBeans usa a linguagem definida no Windows como a padrão para a sua interface.</p>
<p>Uso o Windows XP Professional English com a localidade e configurações regionais definidas para as brasileiras mas a interface do NetBeans sempre ficou em inglês.</p>
<p>Mas depois de ter atualizado ele ontem algumas opções começaram a aparecer em português. De menus até a estrutura do projeto Rails na aba Projects.</p>
<p>Como prefiro a IDE em inglês isso começou a me irritar. Por sorte a solução é bem simples.</p>
<p>Basta editar o arquivo &#8220;netbeans.conf&#8221;, por padrão em C:\Program Files\NetBeans 6.0.1\etc, e na opção &#8220;netbeans_default_options&#8221; adicionar ao final da string os parâmetros abaixo:</p>
<p>-J-Duser.language=en -J-Duser.region=US</p>
<p>Referência: <a href="http://blogs.sun.com/tao/entry/set_netbeans_user_interface_language">http://blogs.sun.com/tao/entry/set_netbeans_user_interface_language</a></p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/02/22/netbeans-interface-language/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Brincando com o TinyRails</title>
		<link>http://algumasideias.net/2008/02/21/brincando-com-o-tinyrails/</link>
		<comments>http://algumasideias.net/2008/02/21/brincando-com-o-tinyrails/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 16:44:40 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/02/21/brincando-com-o-tinyrails/</guid>
		<description><![CDATA[Assim que o Fabio Akita postou sobre o TinyRails fui testar o código. E claro que quebrei a cara já que o thin ainda não roda no Windows.
Como queria  testar a idéia e estava com preguiça de instalar o Ubuntu em uma máquina virtual acabei reescrevendo um pedaço do código e mudando do thin [...]]]></description>
			<content:encoded><![CDATA[<p>Assim que o Fabio Akita <a href="http://www.akitaonrails.com/2008/2/18/tinyrails">postou</a> sobre o <a href="http://github.com/lifo/fabs/tree/master/rails-mini/tinyrails.rb">TinyRails</a> fui testar o código. E claro que quebrei a cara já que o <a href="http://code.macournoyer.com/thin/">thin</a> ainda não roda no Windows.</p>
<p>Como queria  testar a idéia e estava com preguiça de instalar o Ubuntu em uma máquina virtual acabei reescrevendo um pedaço do código e mudando do thin para a dupla <a href="http://mongrel.rubyforge.org/">Mongrel</a> / <a href="http://www.webrick.org/">WEBrick</a>.</p>
<p>Aproveitei o embalo  e montei um &#8220;SQLite3 resource scaffold&#8221;.</p>
<p>Como ainda não configurei direito o Wordpress para postagem de código, coloquei os scripts no Pastie.</p>
<p><a href="http://pastie.caboo.se/155367">http://pastie.caboo.se/155367 </a></p>
<p>UPDATE: Onde tudo começou: <a href="http://m.onkey.org/2008/2/16/single-file-rails-application">Single file Rails Application</a></p>
<p><a href="http://pastie.caboo.se/155367"> </a></p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/02/21/brincando-com-o-tinyrails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
