<?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>Subindo a ladeira</title>
	<atom:link href="http://subindoaladeira.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://subindoaladeira.wordpress.com</link>
	<description>Vivendo a vida em zero vinte um</description>
	<lastBuildDate>Mon, 18 Oct 2010 02:59:41 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='subindoaladeira.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/e7be2a5cd6c15c8f0759f62e51cde39c?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Subindo a ladeira</title>
		<link>http://subindoaladeira.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://subindoaladeira.wordpress.com/osd.xml" title="Subindo a ladeira" />
	<atom:link rel='hub' href='http://subindoaladeira.wordpress.com/?pushpress=hub'/>
		<item>
		<title>NHibernate Custom Type</title>
		<link>http://subindoaladeira.wordpress.com/2010/10/17/nhibernate-custom-type/</link>
		<comments>http://subindoaladeira.wordpress.com/2010/10/17/nhibernate-custom-type/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 02:59:41 +0000</pubDate>
		<dc:creator>Gustavo Rocha</dc:creator>
				<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">http://subindoaladeira.wordpress.com/?p=45</guid>
		<description><![CDATA[Certa vez, em um projeto onde nada era suficiente, recebi a seguinte missão: todo percentual do sistema, deveria ser gravado no banco dividindo seu valor por 100 e ao se recuperar o valor, deveria multiplicar o mesmo também por 100. Fiquei pensando como iria resolver isso e imaginei algumas possibilidades, analisando prós e contras: Através [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=45&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Certa vez, em um projeto onde nada era suficiente, recebi a seguinte missão:</p>
<p style="text-align:justify;">todo percentual do sistema, deveria ser gravado no banco dividindo seu valor por 100 e ao se recuperar o valor, deveria multiplicar o mesmo também por 100.</p>
<p style="text-align:justify;">Fiquei pensando como iria resolver isso e imaginei algumas possibilidades, analisando prós e contras:</p>
<ul style="text-align:justify;">
<li>Através de get&#8217;s e set&#8217;s além de depender que cada desenvolvedor o faça na implementação, iria gerar uma replicação de código terrível</li>
<li>Se fizesse os sets e gets ainda através de uma classe helper, continuaria dependendo da lembrança do desenvolvedor</li>
<li>Através de componentes não iria abranger todos os outros processos não visuais</li>
<li>e mais algumas loucuras&#8230;</li>
</ul>
<p>Eu percebi que precisaria ir mais a fundo pra dar uma solução de uso simples, funcional e genérica.</p>
<p>Foi aí que surgiu a oportunidade de usar um tipo customizado do <a title="NHibernate" href="http://www.nhforge.org/" target="_blank">NHibernate</a>.   A idéia é criar um tipo específico de dados, que de maneira transparente, se encarregaria de fazer o devido tratamento a informação segundo o critério estabelecido.</p>
<p>Para isso, são necessários basicamente três passos: criar um tipo de dado específico que seus objetos vao fazer uso através de propriedades, criar uma classe que ira tratar o uso desse tipo pelo NH e vincular o mapeamento do dado de seu objeto com a classe tratadora.</p>
<p><em>Passo 1 &#8211; Criar um tipo específico e fazer uso em nossos objetos</em></p>
<p>A criação de um tipo específico, que vamos chamar de <em><strong>Percent</strong></em>, nos dá a possibilidade de lidar com um outro conceito bem interessante no .NET: operadores implícitos. Nosso tipo precisa receber um valor conversível em percentual, seja ele inteiro, decimal, double ou quaisquer variações. O uso desse tipo está exemplificado nesse trecho de código:</p>
<p>
<pre class="brush: csharp;">&lt;br /&gt;
public class Venda : EntityBase&lt;br /&gt;
{&lt;br /&gt;
  public virtual Percent Percentual { get; set; }&lt;br /&gt;
}&lt;br /&gt;
</pre>
</p>
<p>Em minha classe <strong>Venda</strong>, além de Id, tenho uma propriedade Percentual, do meu tipo customizado onde quero atribuir valores de maneira simples, das seguintes formas:</p>
<p>
<pre class="brush: csharp;">&lt;/p&gt;
&lt;p&gt;// Decimal            &lt;br /&gt;
venda.Percentual = 2.3M;&lt;/p&gt;
&lt;p&gt;// Inteiro            &lt;br /&gt;
venda.Percentual = 10;&lt;/p&gt;
&lt;p&gt;// Double            &lt;br /&gt;
venda.Percentual = 12.3;&lt;br /&gt;
</pre>
</p>
<p>Como ficou meu tipo e como é possível fazer essas atribuições? Aqui está o código da classe <em><strong>Percent</strong></em><span style="font-family:Consolas;"> </span></p>
<p>
<pre class="brush: csharp; collapse: true; highlight: [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]; light: false; toolbar: true;">&lt;br /&gt;
public class Percent&lt;br /&gt;
{&lt;br /&gt;
    #region Attributes&lt;/p&gt;
&lt;p&gt;    public Double? Value { get; private set; }&lt;br /&gt;
    public Boolean HasValue { get { return Value.HasValue; } }&lt;/p&gt;
&lt;p&gt;    #endregion&lt;/p&gt;
&lt;p&gt;    #region Operators&lt;/p&gt;
&lt;p&gt;    public static implicit operator Percent(Int32? value)&lt;br /&gt;
    {&lt;br /&gt;
        return new Percent(value);&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public static implicit operator Percent(Double? value)&lt;br /&gt;
    {&lt;br /&gt;
        return new Percent(value);&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public static implicit operator Percent(Decimal? value)&lt;br /&gt;
    {&lt;br /&gt;
        return new Percent(value);&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    #endregion&lt;/p&gt;
&lt;p&gt;    #region Constructors&lt;/p&gt;
&lt;p&gt;    public Percent(Int32? value)&lt;br /&gt;
    {&lt;br /&gt;
        this.Value = value;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Percent(Double? value)&lt;br /&gt;
    {&lt;br /&gt;
        this.Value = value;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Percent(Decimal? value)&lt;br /&gt;
    {&lt;br /&gt;
        this.Value = (Double?)value;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    #endregion&lt;/p&gt;
&lt;p&gt;    #region Methods&lt;/p&gt;
&lt;p&gt;    public override Boolean Equals(Object obj)&lt;br /&gt;
    {&lt;br /&gt;
        Percent objToCompare = obj as Percent;&lt;/p&gt;
&lt;p&gt;        if (objToCompare == null)&lt;br /&gt;
            return !this.HasValue || this.Value.IsDefaultValue();&lt;/p&gt;
&lt;p&gt;        return objToCompare.Value.Equals(this.Value);&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public override int GetHashCode()&lt;br /&gt;
    {&lt;br /&gt;
        return Value.GetHashCode();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public override string ToString()&lt;br /&gt;
    {&lt;br /&gt;
        return Value.ToString();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    #endregion&lt;br /&gt;
}&lt;br /&gt;
</pre>
</p>
<p>O segredo da atribuição a propriedade, está nas linhas marcadas. De 10 a 27.  Os operadores implicitos, unidos aos construtores que conseguem administrar os tipos recebidos, permitem que passemos os valores de diversas formas. Reparem que o valor em si, eu mantenho numa propriedade interna da classe.</p>
<p><em>Passo 2 &#8211; C</em><em>riar uma classe que irá tratar o uso do tipo <strong>Percent</strong> pelo NHibernate</em></p>
<p><strong><em>Percent </em></strong>por si só, ja é capaz de manter valores de tipo percentual. Agora vamos fazer com que o NH saiba o que fazer quando um valor for passado a uma propriedade desse tipo<em><strong>. </strong></em>O NHibernate tem no namespace <em>NHibernate.UserTypes </em>algumas interfaces que nos ajudam nesse processo. Vamos fazer uso de <em>IUserType. </em>Ao implementar essa interface, alguns métodos sao auto explicativos mas outros merecem maior atenção. Chamei minha classe de <em><strong>PercentType</strong></em></p>
<p>
<pre class="brush: csharp; collapse: true; light: false; toolbar: true;">&lt;br /&gt;
[Serializable]&lt;br /&gt;
public class PercentType : IUserType&lt;br /&gt;
{&lt;br /&gt;
    #region IUserType Members&lt;br /&gt;
    private static readonly NHibernate.SqlTypes.SqlType[] SQL_TYPES = { NHibernateUtil.Double.SqlType };&lt;/p&gt;
&lt;p&gt;    public SqlType[] SqlTypes&lt;br /&gt;
    {&lt;br /&gt;
        get { return SQL_TYPES; }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Type ReturnedType&lt;br /&gt;
    {&lt;br /&gt;
        get { return typeof(Percent); }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public new bool Equals(Object x, Object y)&lt;br /&gt;
    {&lt;br /&gt;
        if (ReferenceEquals(x, y)) return true;&lt;/p&gt;
&lt;p&gt;        if (x == null || y == null) return false;&lt;/p&gt;
&lt;p&gt;        return x.Equals(y);&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Object DeepCopy(Object value)&lt;br /&gt;
    {&lt;br /&gt;
        return value;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Boolean IsMutable&lt;br /&gt;
    {&lt;br /&gt;
        get { return false; }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Object NullSafeGet(IDataReader rs, String[] names, Object owner)&lt;br /&gt;
    {&lt;br /&gt;
        var obj = NHibernateUtil.Decimal.NullSafeGet(rs, names[0]);&lt;/p&gt;
&lt;p&gt;        if (obj == null)&lt;br /&gt;
            return new Percent(null);&lt;br /&gt;
        {&lt;br /&gt;
            Decimal result = (Decimal)obj;&lt;br /&gt;
            if (result != default(Decimal))&lt;br /&gt;
                return new Percent(result * 100);&lt;br /&gt;
            else&lt;br /&gt;
                return new Percent(result);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Object Assemble(Object cached, Object owner)&lt;br /&gt;
    {&lt;br /&gt;
        return cached;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Object Disassemble(Object value)&lt;br /&gt;
    {&lt;br /&gt;
        return value;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public Int32 GetHashCode(Object x)&lt;br /&gt;
    {&lt;br /&gt;
        return x.GetHashCode();&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public void NullSafeSet(IDbCommand cmd, Object value, Int32 index)&lt;br /&gt;
    {&lt;br /&gt;
        if (value == null)&lt;br /&gt;
            ((IDbDataParameter)cmd.Parameters[index]).Value = DBNull.Value;&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            Percent percent = value as Percent;&lt;br /&gt;
            ((IDbDataParameter)cmd.Parameters[index]).Value = percent.Value / 100;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    public object Replace(object original, object target, object owner)&lt;br /&gt;
    {&lt;br /&gt;
        return original;&lt;br /&gt;
    }&lt;br /&gt;
    #endregion&lt;br /&gt;
} &lt;br /&gt;
</pre>
</p>
<p>Nesse bloco de código, informamos ao NH os tipos SQL que serão tratados por nossa classe</p>
<p>
<pre class="brush: csharp;">&lt;br /&gt;
    private static readonly NHibernate.SqlTypes.SqlType[] SQL_TYPES = { NHibernateUtil.Double.SqlType };&lt;/p&gt;
&lt;p&gt;    public SqlType[] SqlTypes&lt;br /&gt;
    {&lt;br /&gt;
        get { return SQL_TYPES; }&lt;br /&gt;
    }&lt;br /&gt;
</pre>
</p>
<p>Aqui, temos outros blocos importantes, nos métodos <em>NullSafeGet</em> e <em>NullSaveSet. </em>Nesses métodos, dizemos ao NH como tratar os valores no objeto:</p>
<p>
<pre class="brush: csharp; collapse: true; light: false; toolbar: true;">&lt;br /&gt;
    public Object NullSafeGet(IDataReader rs, String[] names, Object owner)&lt;br /&gt;
    {&lt;br /&gt;
        var obj = NHibernateUtil.Decimal.NullSafeGet(rs, names[0]);&lt;/p&gt;
&lt;p&gt;        if (obj == null)&lt;br /&gt;
            return new Percent(null);&lt;br /&gt;
        {&lt;br /&gt;
            Decimal result = (Decimal)obj;&lt;br /&gt;
            if (result != default(Decimal))&lt;br /&gt;
                return new Percent(result * 100);&lt;br /&gt;
            else&lt;br /&gt;
                return new Percent(result);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void NullSafeSet(IDbCommand cmd, Object value, Int32 index)&lt;br /&gt;
    {&lt;br /&gt;
        if (value == null)&lt;br /&gt;
            ((IDbDataParameter)cmd.Parameters[index]).Value = DBNull.Value;&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            Percent percent = value as Percent;&lt;br /&gt;
            ((IDbDataParameter)cmd.Parameters[index]).Value = percent.Value / 100;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>Em <em>NullSafeGet </em>eu obtenho o valor que vem do banco, multiplico por 100 e devolvo uma instancia de <strong><em>Percent</em></strong> já com valor tratado. Em <em>NullSafeSet, </em>inverto o cálculo e passo o valor ao parametro que irá para o banco. Simples assim. Seguindo essa linha de raciocínio, as possibilidades de tratamento de tipos são incontáveis. Vai da necessidade e/ou imaginação.</p>
<p><em>Passo 3 &#8211; Mapear no NH, a associação de uma propriedade <strong>Percent </strong>com o tratamento de <strong>PercentType</strong></em></p>
<p>Como o objetivo desse post nao é configuracação e uso de <em><a title="NHibernate" href="http://www.nhforge.org/" target="_blank">NHibernate</a></em> em si, vou mostrar somente um caso de forma de mapeamento. Eu estou usando <em><a title="Fluent NHibernate" href="http://fluentnhibernate.org/" target="_blank">Fluent NHibernate</a> </em>mas é perfeitamente possível fazer com <em><a title="Mapeamento NH com xml" href="http://nhforge.org/doc/nh/en/index.html#quickstart-mapping" target="_blank">hbm </a></em>ou <em><a title="Active Record" href="http://www.castleproject.org/activerecord/" target="_blank">Active Record</a> </em>visto que é uma funcionalidade do NH. Este é o mapeamento via fluent: </p>
<p>
<pre class="brush: csharp;">public class VendaMap : ClassMap&amp;lt;Venda&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    public VendaMap()&lt;br /&gt;
    {&lt;br /&gt;
        Id(x =&amp;gt; x.Id)&lt;br /&gt;
            .GeneratedBy&lt;br /&gt;
                .Native(&amp;quot;SEQVENDA&amp;quot;);&lt;/p&gt;
&lt;p&gt;        Map(x =&amp;gt; x.Percentual)&lt;br /&gt;
            .CustomType&amp;lt;PercentType&amp;gt;();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>Segue tambem um pequeno teste para demonstrar o uso e funcionamento do que fizemos. É um teste simples e nada abrangente mas mostra que funciona. Não explico também a gestão da sessão do NH mas ser voce tiver tudo funcionando ok <span style="font-family:Georgia;">na sua máquina é facil reproduzir o teste.</span></p>
<pre><span style="font-family:Georgia;">
<pre class="brush: csharp;">

    [TestMethod]
    public void PercentTypeTest()
    {
        Int32 value = 20;

        Venda venda = new Venda();
        venda.Percentual = value;

        FluentHelper.Instance.CurrentSession.Save(venda);

        Assert.AreEqual(venda.Percentual, value);
    }
</pre>
<p> </span></pre>
<p>É isso. Se houver interesse eu disponibilizo o projeto completo pra download. Vou tentar no próximo post, falando um pouco mais de NH, mostrar como usar um interceptor para gerenciar numeração incremental customizada nas suas entidades.</p>
<p>Abraaaaaaaço</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subindoaladeira.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subindoaladeira.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subindoaladeira.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=45&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subindoaladeira.wordpress.com/2010/10/17/nhibernate-custom-type/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b270d3e6a4e1090dc30961042662da5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gustavo Rocha</media:title>
		</media:content>
	</item>
		<item>
		<title>Eleição para presidente 2010</title>
		<link>http://subindoaladeira.wordpress.com/2010/10/09/eleicao-para-presidente-2010/</link>
		<comments>http://subindoaladeira.wordpress.com/2010/10/09/eleicao-para-presidente-2010/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 00:39:01 +0000</pubDate>
		<dc:creator>Gustavo Rocha</dc:creator>
				<category><![CDATA[Outos]]></category>

		<guid isPermaLink="false">http://subindoaladeira.wordpress.com/?p=26</guid>
		<description><![CDATA[Eu sei que é bizonho demais iniciar um blog com foco em tecnologia, nao postar nada durante meses e chegar agora e postar sobre política.

Eu concordo mas aqui é um lugar público, que ninguém vem ver, e ainda é meu. So tenho aqui mesmo pra me manifestar publicamente sobre esse assunto.

Os atuais candidatos a presidência não me agradam. Podia dar empate sem votos e os dois desistirem. Contudo, algumas coisas que eu considero  balelas tem me incomodado muito. Sob o meu ponto de vista, que isso fique bem claro.
<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=26&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Eu sei que é bisonho demais iniciar um blog com foco em tecnologia, não postar nada durante meses e chegar agora e postar sobre política.</p>
<p style="text-align:justify;">Eu concordo mas aqui é um lugar público, que ninguém vem ver, e ainda é meu. Só tenho aqui mesmo pra me manifestar publicamente sobre esse assunto.</p>
<p style="text-align:justify;">Os atuais candidatos a presidência não me agradam. Podia dar empate sem votos e os dois desistirem. Contudo, algumas coisas que eu considero balela tem me incomodado muito. Sob o meu ponto de vista, que isso fique bem claro.</p>
<p style="text-align:justify;"><span id="more-26"></span></p>
<p style="text-align:justify;">Primeiro as campanhas: &#8220;for dummies.&#8221;  São verdadeiros shows. Vão se agravando, se agravando e até o fim desse mês, quando termina o segundo turno, eles estarão se xingando, podem anotar ai. Como eu já falei antes, caso &#8220;cenzinho&#8221; no chão com qualquer um como na próxima eleição presidencial as campanhas vão ser dignas de Broadway ou Cirque du Soleil.</p>
<p style="text-align:justify;">Não é isso que precisamos. Nem de promessas baseadas em pequenos pseudo feitos. Mas de propostas, de certeza e hoje em dia, de confiança se possível.</p>
<p style="text-align:justify;">Antes também quero deixar claro que não tenho nada contra o Lula como figura, como representante. Ate votei nele em seu primeiro mandato. Eu acredito que personalização de uma estrutura realmente influencia. E a figura simpatica de nosso presidente conquista espaço. O problema é que presidente sozinho não faz nada e o grupo que ele levou mostrou que era péssima escolha.</p>
<p style="text-align:justify;">Outra coisa que tem me incomodado muito é ver os candidatos assumirem a responsabilidade do crescimento de nosso país. E nesse assunto é que está o &#8220;core&#8221; do meu pensamento. O crescimento não é graças a esse governo nem ao anterior. O país cresceu pq TINHA que crescer. Era inevitável. Não teve influencia de ninguém. Só tinham duas opções: virávamos Cuba2 ou viveríamos. Alguém pode me falar: Ahhh mas cuba tem uma saúde excelente. Tem sim mas e dai? Eh uma merda de morar. O pessoal la toda hora quer fugir. Eles tem saúde que não faz o pais melhor. Nós temos o melhor futebol e estamos ai enrolados também.</p>
<p style="text-align:justify;">O que eu quero dizer é que isso iria acontecer de qualquer jeito. No meu entendimento, nós somos inexperientes. Algo que eu chamo de &#8220;Imaturidade Democrática&#8221;. Não temos nem 30 anos ainda de democracia real. A primeira eleição pra presidente tinha bilhões de candidatos, uma zona. Nesse mesmo período que fomos nos adaptando, aprendendo e amadurecendo à força como é essa tal democracia, o mundo estava em ebulição: tecnologia em geral, globalização, comunicação e outras coisas. Não tinha como fugir disso, ou acompanhava ou se fechava(olha Cuba aí).</p>
<p style="text-align:justify;">No geral, não houve influencia com exceção de duas coisas que me recordo. Podem haver mais mas eu me lembro desses dois itens: Plano Real(quem se lembra da URV?) e a abertura comercial ao exterior feita pelo Collor. Ele fez merda sim(imaturo democrático) mas ele deu o grande passo pro nosso crescimento. Na verdade pro nosso não fechamento.</p>
<p style="text-align:justify;">Não acho justo ninguém querer assumir responsabilidade por isso. Iria acontecer de qualquer jeito. Ai fico indignado com as políticas de miséria e esmola como essas bolsas. Eu tenho certeza que ajudam muita gente que precisa delas e sem, não poderiam viver dignamente. Mas também tenho convicção que se ainda houver um pouco de orgulho em todas essas pessoas, mesmo depois de tanto desgaste em nosso país, que elas preferiam conquistar o meio de obter os rendimentos e não recebe-los diretamente. Qualquer um honesto e ainda com um pouco de orgulho e/ou dignidade preferia trabalho e serviço público decente ao invés de um &#8220;bolsa-algumacoisa&#8221;.</p>
<p style="text-align:justify;">Antes de ir embora quero falar novamente sobre a imaturidade democrática: ela deve ser contida! Logo. E o jeito é assumi-la. Precisamos perceber essa imaturidade, assumir que a temos e trata-la melhor. Essa mesma imaturidade gerou genuinos, dirceus, valérios e colegas. Quem diria que la dentro teriam figuras corruptas deste nível? Sabe pq? Imaturidade. Olha q incrível: eles não estavam preparados nem mesmo para ser honestos.</p>
<p style="text-align:justify;">Acho que é isso.<br />
Espero ter sido claro e comentários são bem vindos.</p>
<p style="text-align:justify;">Abraaaaaaaaaaaaço<!--more--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subindoaladeira.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subindoaladeira.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subindoaladeira.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=26&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subindoaladeira.wordpress.com/2010/10/09/eleicao-para-presidente-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b270d3e6a4e1090dc30961042662da5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gustavo Rocha</media:title>
		</media:content>
	</item>
		<item>
		<title>Agora MCPD Web 2.0</title>
		<link>http://subindoaladeira.wordpress.com/2009/11/04/agora-mcpd-web-2-0/</link>
		<comments>http://subindoaladeira.wordpress.com/2009/11/04/agora-mcpd-web-2-0/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:14:19 +0000</pubDate>
		<dc:creator>Gustavo Rocha</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://subindoaladeira.wordpress.com/?p=12</guid>
		<description><![CDATA[<img class="alignnone size-full wp-image-15" title="MCPD Web 2.0" src="http://subindoaladeira.wordpress.com/files/2009/11/mcpdrgb_504.png" alt="MCPD Web 2.0" width="227" height="80" />

Como eu já havia previsto, e tinham me dito, dar andamento a essa parada de Blog não é mesmo fácil. E não é por falta de conteúdo ou experiências mas sim o mesmo motivo de todos: o danado do tempo.

Como tempo é o que me falta resolvi compartilhar o que anda me tomando tanto dele.

<!--more-->
<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=12&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://subindoaladeira.files.wordpress.com/2009/11/mcpdrgb_504.png"><img class="alignnone size-full wp-image-13" title="MCPD Web 2.0" src="http://subindoaladeira.files.wordpress.com/2009/11/mcpdrgb_504.png?w=227&#038;h=80" alt="" width="227" height="80" /></a></p>
<p>Como eu já havia previsto, e tinham me dito, dar andamento a essa parada de Blog não é mesmo fácil. E não é por falta de conteúdo ou experiências mas sim o mesmo motivo de todos: o danado do tempo.</p>
<p>Como tempo é o que me falta resolvi compartilhar o que anda me tomando tanto dele.</p>
<p><span id="more-12"></span></p>
<p>Um dos motivos é um novo contrato de consultoria que fechamos eu e <a href="http://twitter.com/Fred_Castro_" target="_blank">@Fred_Castro_</a> O trabalho é consultoria em um ERP Web SaaS desde concepção e acompanhamento da arquitetura passando por desenvolvimento de Framework.  Tem sido um trabalho muito bom pela liberdade para soluções e experimentação. Sem a pressão do <a href="http://pt.wikipedia.org/wiki/Retorno_sobre_investimento" target="_blank">ROI </a> gritando nessa fase.</p>
<p>O outro motivo e matéria desse post é que estava estudando como um camelo para a prova <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-547" target="_blank">70-547</a> da <a href="http://www.microsoft.com/pt/br/default.aspx" target="_blank">Microsoft</a>. Fiz a prova e passei. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Com essa certificação obtive o título de <a href="http://www.microsoft.com/learning/mcp/mcpd/webdev/" target="_blank">MCPD Web 2.0</a>.</p>
<p>Essa prova estava pendurada no meu backlog havia bastante tempo e é um passo no meu sonhado skill path. Meu próximo passo é o upgrade para a versão 3.5 antes que cheguem as novas.</p>
<p>Resolvi compartilhar meu sentimento com relação à prova.</p>
<p>Primeiro uma coisa que achei chato: A <a href="http://www.microsoft.com/pt/br/default.aspx" target="_blank">Microsoft</a> não manda mais o Welcome Kit, que continha o seu certificado impresso em um papel bonito que dava orgulho. Faz parte de uma campanha de redução do consumo de papel pró ambiente. O estranho é que se você fizer questão do certificado, pagando, aí sim eles lhe enviam.</p>
<p>Enfim, a prova. Tive o melhor aproveitamentos das 3 que eu fiz apesar de toda a insegurança antes de começar. Tive um rotina de estudos mal regrada e isso sempre me preocupa. Mas foi uma prova extremamente interessante.</p>
<p>Diferente da <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;locale=en-us">70-356</a> e <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-528&amp;locale=en-us">70-528</a> que eu havia feito, essa foi a que teve o maior conteúdo teórico. Ela realmente tem o foco em projeto e não apenas em linguagem e programação. Te testa com relação a componentes, criação de um Framework e pasmem: todo o processo de levantamento e desenho de solução.</p>
<p>Como entusiasta de <a href="http://www.manifestoagil.com.br/">Agile</a> e sendo <a href="http://www.scrumalliance.org/pages/certified_scrummaster">ScrumMaster Certificado</a> me causou espanto ler no <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1823005&amp;sid=89561525010128341845550181&amp;k5=143C72F5&amp;uid">Training Kit</a> coisas como: visão, levantamento junto ao usuário, stories e não use cases e ainda questionamento sobre eficácia dos use cases. Achei muito interessante a visão pessoal levada nos primeiros capítulos do livro onde você é conduzido através do processo de levantamento e desenho das melhores solucões para <em><strong>atender o projeto</strong></em>. E atentem para o destaque: <em><strong>atender o projeto</strong><span style="font-style:normal;"> e não utilizar qualquer tecnologia ou solução por indução de A ou B.</span></em></p>
<p>Depois desse início excelente o treinamento te leva ao processo de desenvolvimento de um Framework visando sempre o que é melhor pra atender o projeto e pensando não numa implementação mas numa solução para uma equipe de desenvolvimento. ( função de um arquiteto, talvez?!)</p>
<p>Me identifiquei muito com o andamento, como arquiteto e desenvolvedor. Na parte prática passamos por componentes, soluções avançadas de segurança , ambiente e deploy, entre outros.</p>
<p>Um outro item que me chamou bastante atenção foi a dedicação dada à tratamento de exceções e refatoração. Teoria e prática. Mais uma boa surpresa.</p>
<p>Enfim, acho que foi a prova que eu mais gostei. Pude aprender muito novamente no processo de estudo e vou seguir em frente no path.</p>
<p>Espero não demorar tanto pra postar da próxima vez e trazer algo prático. To com alguns mistérios nas mangas que assim que tiver uma solução trago à tona.</p>
<p><em>Esses dias tenho pensado muito sobre administração da pressão. Acho ainda que a melhor maneira é a absorção da pior parte e compartilhamento com quem está envolvido/comprometido. Opção essa, contrária a tentar esconder e acabar espalhando ou cascateando( que é pior ) a pressão. Você pode fazer inimigos. E se tá ruim, diga que tá ruim. Mostrar sensibilidade e não tentar dar uma de simpático( formador de caô)  é essencial pra conquistar confiança. Pensando nisso tudo me veio uma frase que repito há anos: </em></p>
<blockquote><p><em>&#8220;Nada é melhor do que trocar uma idéia&#8221;</em></p></blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subindoaladeira.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subindoaladeira.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subindoaladeira.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=12&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subindoaladeira.wordpress.com/2009/11/04/agora-mcpd-web-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b270d3e6a4e1090dc30961042662da5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gustavo Rocha</media:title>
		</media:content>

		<media:content url="http://subindoaladeira.files.wordpress.com/2009/11/mcpdrgb_504.png" medium="image">
			<media:title type="html">MCPD Web 2.0</media:title>
		</media:content>
	</item>
		<item>
		<title>Hello world!</title>
		<link>http://subindoaladeira.wordpress.com/2009/10/07/hello-world-2/</link>
		<comments>http://subindoaladeira.wordpress.com/2009/10/07/hello-world-2/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 00:53:05 +0000</pubDate>
		<dc:creator>Gustavo Rocha</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://subindoaladeira.wordpress.com/2009/10/07/hello-world-2</guid>
		<description><![CDATA[Bem vindos ao meu Blog. Como todos dizem: o primeiro post é fácil.

O objetivo é falar de tudo um pouco, do que der na cabeça mas tentar manter o foco em TI. Tentar pelo menos.

Ainda não encontrei o nome ideal, a cor ideal, tema, mas vou tentando. Tenho o objetivo também de tentar manter o Blog em uma estrutura .NET, como não podia deixar de ser.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=4&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;">Bem vindos ao meu Blog. Como todos dizem: o primeiro post é fácil.</span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;">O objetivo é falar de tudo um pouco, do que der na cabeça mas tentar manter o foco em TI. Tentar pelo menos.</span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;">Ainda não encontrei o nome ideal, a cor ideal, tema, mas vou tentando. Tenho o objetivo também de tentar manter o Blog em uma estrutura .NET, como não podia deixar de ser.</span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;">Pra começar, vou postar a solução que encontrei para uma questão levantada essa semana no trabalho:</span></span></p>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">{</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">public event EventHandler OnTest;</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">public void Test()</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">{</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">if (OnTest != null)</div>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:93px;width:1px;height:1px;">OnTest(this, EventArgs.Empty);</div>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;">Como saber se um evento de um objeto foi assinado?</span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;"><span id="more-4"></span></span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;">Pra começar, vamos declarar uma classe com um evento disponível:</span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;"><span style="color:#000000;line-height:19px;font-size:13px;"><span style="font-size:small;"> </span></span></p>
<p style="font-size:15px;line-height:1.6em;color:#444444;margin:0 0 1.4em 12px;padding:0 18px 0 0;">
<pre class="brush: csharp;">
public class Quency
{
  public event EventHandler OnTest;
  public void Test()
  {
    if (OnTest != null)
      OnTest(this, EventArgs.Empty);
  }
}
</pre>
<p>Vamos criar uma instância desse objeto e assinar o evento OnTest dele:</p>
<pre class="brush: csharp;">

Quency quency = new Quency();

quency.OnTest += new EventHandler(quency_OnTest);
</pre>
<p>Para cada evento de um objeto, o framework cria internamente um Field( campo privado ) em sua instância que mantém todos os métodos ( delegates ) associados a este evento.<br />
Vamos encontrar esse campo, fazer um cast dele para o tipo MulticastDelegate e, se houver alguma assinatura, ele terá a lista de métodos que foram associados:</p>
<pre class="brush: csharp;">
MulticastDelegate multiCastDelegate = (MulticastDelegate)quency.GetType().GetField(&quot;OnTest&quot;, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(quency);
if (multiCastDelegate != null)
  Delegate[] delegates = multiCastDelegate.GetInvocationList();
</pre>
<p>Com essa lista de métodos e acesso ao campo de evento em mãos você pode agora remover, adicionar e até executar os métodos. Lembrando que fizemos todo esse acesso via Reflection e, com sorte, vamos falar muito ainda sobre isso.<br />
Bom é isso. Primeiro Blog, primeiro post. Ja está tarde pra cacete e espero melhorar muito a qualidade dos próximos posts.<br />
Frase do dia, muito conhecida pela equipe de um certo projeto: &#8220;Nada é fácil!&#8221;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/subindoaladeira.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/subindoaladeira.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/subindoaladeira.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=subindoaladeira.wordpress.com&amp;blog=9881468&amp;post=4&amp;subd=subindoaladeira&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://subindoaladeira.wordpress.com/2009/10/07/hello-world-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b270d3e6a4e1090dc30961042662da5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gustavo Rocha</media:title>
		</media:content>
	</item>
	</channel>
</rss>
