<?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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>seiti.eti.br</title>
	
	<link>http://seiti.eti.br/blog</link>
	<description>Programação e cacarecos tecnológicos</description>
	<lastBuildDate>Wed, 04 Aug 2010 23:44:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/seiti" /><feedburner:info uri="seiti" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>KISS, YAGNI e DRY</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/RjFAMkD_1j4/kiss-yagni-e-dry</link>
		<comments>http://seiti.eti.br/blog/2010/kiss-yagni-e-dry#comments</comments>
		<pubDate>Wed, 04 Aug 2010 23:43:09 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1208</guid>
		<description><![CDATA[Hoje fui lembrado de algo importante, que&#8230;, hmm.., bem&#8230;, às vezes é esquecido: o desenvolvedor deve entregar software. E acho que não sou só eu que devo ser lembrado disto, pois há até um site cujo propósito é lembrar isto &#8230; <a href="http://seiti.eti.br/blog/2010/kiss-yagni-e-dry">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoje fui lembrado de algo importante, que&#8230;, hmm.., bem&#8230;, às vezes é esquecido: o <strong>desenvolvedor</strong> deve <em>entregar software</em>.</p>
<p>E acho que não sou só eu que devo ser lembrado disto, pois há até um <a href="http://agilemanifesto.org/">site cujo propósito é lembrar isto</a> (bom,  existe <a href="http://sadtrombone.com/">site para tudo</a>, mas enfim&#8230;).</p>
<p>Como não poderia deixar de ser nesta área, existem alguns acrônimos e lemas que te auxiliam nesta tarefa tão importante, que é entregar um software de valor e respeito no prazo. <strong>KISS</strong>, <strong>YAGNI</strong> e <strong>DRY</strong>. Comecemos pelo mais simpático:</p>
<h2><em>KISS &#8211; Keep It Simple, Stupid</em></h2>
<p>Mantenha simples. A simplicidade facilita o entendimento. O que é simples é fácil de usar, de manipular. É fácil de explicar. Mas isto não quer dizer que a simplicidade como objetivo é algo simples. Complexo?</p>
<p>A simplicidade, a elegância são características que necessitam de experiência, de criatividade para serem alcançadas. Usando um  exemplo já surrado , o iPhone. Simples. Elegante. Lembra-se dos smartphones antes dele? Pois então. E o que fazer? Estudar, compreender, testar e inventar. E depois ver se sua mãe compreendeu seu invento.</p>
<h2><em>YAGNI &#8211; You Ain&#8217;t Gonna Need It</em></h2>
<p>Não implemente <em>nada</em>, a não ser que seja <em>necessário</em> para seu produto. Não produza o que não será usado. Senão será mais trabalho no momento de criar e no momento de dar manutenção.</p>
<p>Entra a questão: e o que realmente é necessário? Pergunta difícil. Se perguntar ao cliente o que é necessário, você terá de criar o <em>Facebook</em>.  A resposta requer experiência e análise fundamentada do problema em questão. Entra novamente um pouco de senso estético. <a href="http://www.brainyquote.com/quotes/quotes/e/edsgerdijk204339.html">Elegância</a>. Descreva as <em>features</em>. Elimine todas quanto possível.  Tire qualquer uma em que restem dúvidas.  Depois de criar este conjunto mínimo, escolha uma <em>feature</em> para jogar fora. Aí, talvez, sobre uma lista contendo apenas o que é necessário.</p>
<p>Mas sejamos pragmáticos também. A aplicação de YAGNI deve levar em conta também o custo de implementação. Se é barato fazer agora e barato depois, deixe para depois. Se é barato agora, mas ficará caríssimo depois, faça agora. Este conhecimento, de novo, requer prática e experiência.</p>
<h2><em>DRY &#8211; Don&#8217;t Repeat Yourself</em></h2>
<p>Uma regra, uma especificidade (repita em voz alta, comendo paçoca Amor), um pedaço do conhecimento deve estar declarada, escrita, de forma clara, em um único ponto do sistema.</p>
<p>Pode ser fácil. Ou bem difícil. Depende do tamanho. Do tamanho do produto e da equipe.  É muito comum equipes grandes de desenvolvimento escreverem diversas soluções para o mesmo problema, sem um ter conhecimento da solução do outro.</p>
<p>Já ouvi que isso ocorre em alguns lugares entre equipes de departamentos distintos, que são muito &#8220;ciosos&#8221; de seu código&#8230;</p>
<p>O fato é que é preciso que o sistema seja claro o suficiente e que os desenvolvedores se comuniquem de maneira eficiente para a aplicação do DRY. Como fazer isso? Seria uma boa perguntar ao Fred Brooks.</p>
<h2>Disk-sistema entregas rápidas</h2>
<p>E o que isto tudo significa? Significa a prática da <strong>Programação Zen</strong>. <em>O melhor código é o não-código</em>. Executar isso difícil. Requer perseverança e auto-controle. Exerçamos a <a href="http://seiti.eti.br/blog/?p=276">melhor qualidade de um programador</a>. Mantenha o sistema limpo, enxuto, conciso. Não crie, não produza a mais. Menos <em>features</em>, menos código, menos trabalho, menos tempo gasto. Talvez até dê para cumprir aquele prazo&#8230;.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/-qhvp9vAvWpMGbkrx3eeC-fq8ww/0/da"><img src="http://feedads.g.doubleclick.net/~a/-qhvp9vAvWpMGbkrx3eeC-fq8ww/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-qhvp9vAvWpMGbkrx3eeC-fq8ww/1/da"><img src="http://feedads.g.doubleclick.net/~a/-qhvp9vAvWpMGbkrx3eeC-fq8ww/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/RjFAMkD_1j4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/kiss-yagni-e-dry/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/kiss-yagni-e-dry</feedburner:origLink></item>
		<item>
		<title>Fluent NHibernate</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/CMuxvBitoLI/fluent-nhibernate</link>
		<comments>http://seiti.eti.br/blog/2010/fluent-nhibernate#comments</comments>
		<pubDate>Tue, 20 Jul 2010 00:12:29 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1184</guid>
		<description><![CDATA[O NHibernate é um port para .NET do Hibernate, um mapeador objeto relacional (ou ORM) com esteróides. Vamos ver como usá-lo para mapear e persistir nossos objetos no banco de dados. O NHibernate é um grande auxílio para quem deseja &#8230; <a href="http://seiti.eti.br/blog/2010/fluent-nhibernate">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://nhforge.org">NHibernate</a> é um port para .NET do <a href="http://hibernate.org/">Hibernate</a>, um <strong>mapeador objeto relacional</strong> (ou ORM) com esteróides. Vamos ver como usá-lo para mapear e persistir nossos objetos no banco de dados.</p>
<p>O NHibernate é um grande auxílio para quem deseja implementar um sistema usando DDD (não, não é quando você liga para o programador que mora longe. É <em>Domain Driven Design</em>).</p>
<div id="attachment_1185" class="wp-caption aligncenter" style="width: 74px"><a href="http://nhforge.org"><img class="size-full wp-image-1185 " title="NhLogo" src="http://seiti.eti.br/blog/wp-content/uploads/2010/07/NhLogo.png" alt="Me deixa dormir!" width="64" height="63" /></a><p class="wp-caption-text">Me deixa dormir!</p></div>
<p style="text-align: left;">Quem já usou o Hibernate sabe que configurá-lo pode ser a porta de entrada para o primeiro dos <a href="http://en.wikipedia.org/wiki/Inferno_%28Dante%29">nove círculos do inferno</a>. Bom, não passei por isto,  pois nunca havia usado diretamente o Hibernate. Se existe algo  bom em chegar na festa por <strong>último</strong> no mundo do desenvolvimento, é de ter mais coisas prontas e mastigadinhas. Entra então o <strong><em>Fluent NHibernate</em></strong>.</p>
<h2 style="text-align: left;">Historinha para bovinos hibernarem</h2>
<p style="text-align: left;">Primeiro o contexto. Enfrento um código legado (código legado == código sem testes, segundo <a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052">Feathers</a>) que usa o framework <em>Castle ActiveRecord</em> (Castle AR). Embora este framework facilite bastante a vida, poupando o pobre programador da tarefa de escrever muito código CRUD, ganhando uma tendinite, ele não se dá muito bem com o DDD, tornando mais trabalhoso que o necessário a separação das <em>Entidades</em> do sistema de <em>persistência.</em></p>
<p style="text-align: left;">Outro problema é que, apesar do Castle AR fornecer uma camada de abstração sobre o Hibernate, é necessário que você saiba como o Hibernate funciona. Decidi então me livrar do Castle AR e usar apenas o  Hibernate. E como não quero editar os arquivos XML do Hibernate eu mesmo (o Castle AR fazia este trabalho) decidi usar o Fluent NHibernate.</p>
<h2>Programação, sistemas e zumbis</h2>
<p>O Fluent NHibernate segue uma sintaxe <em>fluente</em> para realizar toda a configuração do Hibernate usando a própria linguagem de programação. No meu caso, C#.</p>
<p>Primeiro um esquema altamente complexo do sistema que servirá de exemplo:</p>
<div class="wp-caption aligncenter" style="width: 510px"><a title="Diagrama do sistema by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4809510719/"><img src="http://farm5.static.flickr.com/4114/4809510719_ef4e9bea45.jpg" alt="Diagrama do sistema" width="500" height="281" /></a><p class="wp-caption-text">Chamem o Chris Redfield!</p></div>
<p style="text-align: left;">Um <span style="text-decoration: line-through;">RaccoonCity</span> <em>City</em> possui inúmeros <em>Zombies</em>. O <em>City</em> tem uma data, <em>Month</em>, com mês e ano, de quando se iniciou a infecção de sua população. <em>Zombie</em> possui uma data, <em>Month</em>,  de quando ele mesmo foi infectado. Por enquanto não podemos estimar estas datas com precisão de dias, por isso queremos apenas mês e ano.</p>
<p>O diagrama acima gerou as seguintes classes:<br />
<a href="http://seiti.eti.br/blog/wp-content/uploads/2010/07/screen1.png"><img class="aligncenter size-full wp-image-1187" title="screen" src="http://seiti.eti.br/blog/wp-content/uploads/2010/07/screen1.png" alt="" width="462" height="294" /></a></p>
<ul>
<li><tt>City</tt> é uma <em>Entidade</em>. E é uma Raíz de  Agregado, ou <em>Aggregate Root</em>;</li>
<li><tt>Zombie</tt> é um <em>Objeto Valor</em>, ou<em> Value Object</em>. Quer dizer que todos os zumbis são iguais, desde que tenham as mesmas propriedades: <em>FormerName</em> e <em>Infected</em>. Deixei um Id mesmo assim;</li>
<li><tt>Month</tt> também é um Objeto Valor. Ele determina um mês e ano. Não estou interessado no dia.</li>
</ul>
<p>Uma preocupação na modelagem foi quanto à lista <em>Zombies</em>. Para se adicionar um Zombie em um City é preciso usar o método AddZombie(). Assim tenho um lugar onde posso checar e validar o Zombie antes da adição.</p>
<p>Mas se eu exponho Zombies como um <em>List&lt;Zombie&gt;</em> nada impede o programador de fazer isso:</p>
<pre class="brush: csharp;">
City raccoon = new City(&quot;Raccoon City&quot;, new Month(2010, 4));
raccoon.Zombies.Add(new Zombie(&quot;Zé Ninguém&quot;, new Month(2010, 7)));
</pre>
<p>ao invés de:</p>
<pre class="brush: csharp;">
City raccoon = new City(&quot;Raccoon City&quot;, new Month(2010, 4));
raccoon.AddZombie(new Zombie(&quot;Zé Ninguém&quot;, new Month(2010, 7)));
</pre>
<p>Para resolver este problema eu guardo a lista como um <em>List&lt;Zombie&gt;</em> e exponho apenas um <em>IEnumerable&lt;Zombie&gt;:</em></p>
<pre class="brush: csharp;">
    public class City
    {
        public virtual int Id { get; private set; }

        public virtual string Name { get; private set; }

        public virtual Month InfectionStart { get; private set; }

        private readonly IList&lt;Zombie&gt; _zombies = new List&lt;Zombie&gt;();

        public virtual IEnumerable&lt;Zombie&gt; Zombies
        {
            get { return _zombies; }
        }

        protected City()
        {}

        public City(string name, Month startMonth)
        {
            Name = name;
            InfectionStart = startMonth;
        }

        public virtual void AddZombie(Zombie z)
        {
            _zombies.Add(z);
        }

    }
</pre>
<p>O IEnumerable apenas expõe método de consulta. Exatamente o que eu queria.</p>
<p>Vamos agora implementar a classe <em>Zombie</em>. Esta acaba sendo mais complicada, pois se trata de um VO (<em>Value Object</em>). É necessário realizar um override nos métodos <em>Equals()</em> e <em>GetHashCode()</em> para que o sistema possa comprar dois zumbis com as mesmas propriedades, mesmo que de instâncias diferentes, e devolver um resultado útil. E já podemos aproveitar para fazer override nos operadores == e !=, para que devolvam o mesmo resultado que o Equals():</p>
<pre class="brush: csharp;">
    public class Zombie
    {
        public virtual int Id { get; private set;}
        public virtual string FormerName { get; set; }
        public virtual Month Infected { get; set; }

        public static bool operator ==(Zombie b1, Zombie b2)
        {
            return b1.FormerName == b2.FormerName &amp;&amp; b1.Infected == b2.Infected;
        }

        public static bool operator !=(Zombie b1, Zombie b2)
        {
            return b1.FormerName != b2.FormerName || b1.Infected != b2.Infected;
        }

        public static bool operator &gt;(Zombie b1, Zombie b2)
        {
            return b1.Infected &gt; b2.Infected;
        }

        public static bool operator &lt;(Zombie b1, Zombie b2)
        {
            return b1.Infected &lt; b2.Infected;
        }

        public static bool operator &gt;=(Zombie b1, Zombie b2)
        {
            return b1.Infected &gt;= b2.Infected;
        }

        public static bool operator &lt;=(Zombie b1, Zombie b2)
        {
            return b1.Infected &lt;= b2.Infected;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is Zombie))
                return false;

            return this == (Zombie)obj;
        }

        public override int GetHashCode()
        {
            return FormerName.GetHashCode() ^ Infected.GetHashCode();
        }
    }
</pre>
<p>Até aproveitei para implementar os operadores &lt; e &gt;, que dependem da data de infecção do safado.</p>
<p>E só resta a classe <em>Month</em>:</p>
<pre class="brush: csharp;">
    public class Month: IComparable
    {
        private int Dia { get { return 1; } }
        public int Mes { get; private set; }
        public int Ano { get; private set; }

        protected Month()
        {}

        public Month(int ano, int mes)
        {
            if (!AnoValido(ano))
                throw new ArgumentOutOfRangeException(String.Format(&quot;Ano não cabível. Ano apresentado: {0}&quot;, ano));

             if (!MesValido(mes))
                throw new ArgumentOutOfRangeException(String.Format(&quot;Mês não cabível. Mês apresentado: {0}&quot;, mes));

            Ano = ano;
            Mes = mes;
        }

        private bool AnoValido(int ano)
        {
            // Valores válidos para o SQL Server.
            // Observe que dado o escopo do problema não faz sentido nada fora deste intevalo mesmo.
            if (1753 &lt;= ano &amp;&amp; ano &lt;= 9999)
                return true;

            return false;
        }

        private bool MesValido(int mes)
        {
            if (1 &lt;= mes &amp;&amp; mes &lt;= 12)
                return true;

            return false;
        }

        public DateTime AsDateTime()
        {
            return new DateTime(Ano, Mes, Dia);
        }

        public override string ToString()
        {
            return AsDateTime().ToString();
        }

        public static bool operator ==(Month d1, Month d2)
        {
            return d1.Ano == d2.Ano &amp;&amp; d1.Mes == d2.Mes;
        }

        public static bool operator !=(Month d1, Month d2)
        {
            return d1.Ano != d2.Ano || d1.Mes != d2.Mes;
        }

        public static bool operator &lt;=(Month d1, Month d2)
        {
            if (d1 == d2)
                return true;

            if (d1.Ano &lt; d2.Ano)
                return true;

            if (d1.Ano &gt; d2.Ano)
                return false;

            if (d1.Mes &lt; d2.Mes)
                return true;

            return false;
        }

        public static bool operator &gt;=(Month d1, Month d2)
        {
            if (d1 == d2)
                return true;

            if (d1.Ano &gt; d2.Ano)
                return true;

            if (d1.Ano &lt; d2.Ano)
                return false;

            if (d1.Mes &gt; d2.Mes)
                return true;

            return false;
        }

        public static bool operator &lt;(Month d1, Month d2)
        {
            if (d1 == d2)
                return false;

            if (d1.Ano &lt; d2.Ano)
                return true;

            if (d1.Ano &gt; d2.Ano)
                return false;

            if (d1.Mes &lt; d2.Mes)
                return true;

            return false;
        }

        public static bool operator &gt;(Month d1, Month d2)
        {
            if (d1 == d2)
                return false;

            if (d1.Ano &gt; d2.Ano)
                return true;

            if (d1.Ano &lt; d2.Ano)
                return false;

            if (d1.Mes &gt; d2.Mes)
                return true;

            return false;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is Month))
                return false;

            return this == (Month) obj;
        }

        public override int GetHashCode()
        {
            return Ano.GetHashCode() ^ Mes.GetHashCode();
        }

        public int CompareTo(object obj)
        {
            Month d = (Month)obj;

            if (this &lt; d)
                return -1;
            else if (this &gt; d)
                return 1;

            return 0;

        }
    }
</pre>
<p>Mesma história dos Zumbis: implementei Equals(), e GetHashCode() e os operadores. Asism posso escrever código do tipo:</p>
<pre class="brush: csharp;">
Data d1 = new Data(2000, 1);
Data d2 = new Data(2000, 1);
if (d1 == d2)
    doSomething();
else if (d1 &gt; d2)
    doSomethingElse();
else if (d1 &lt; d2)
    doEtc();
</pre>
<p>Com as classes do modelo implementadas, posso adicionar validações, testes e tudo mais, sem me preocupar com a camada de persistência, tornando a criação de testes unitários um trabalho bem simples. Mas este post não é sobre DDD.</p>
<h2>Persistência != Teimosia</h2>
<p>Vamos mapear nossas estimadas classes, usando o <em>Fluent NHibernate</em>, para que possam ir para o banco de dados.  Comecemos com a classe <em>Zombie</em>, mapeada pela classe <strong>ZombieMap</strong>:</p>
<pre class="brush: csharp;">
public class ZombieMap: ClassMap&lt;Zombie&gt;
{
    public ZombieMap()
    {
        Id(x =&gt; x.Id);
        Map(x =&gt; x.FormerName);
        Map(x =&gt; x.Infected);
    }
}
</pre>
<p>Bem simples, não? Isto nos informa que a classe <em>Zombie</em> será mapeada para uma tabela <tt>Zombie</tt>, com campos <strong>FormerName</strong> (com tipo  nvarchar(255))  e <strong>Infected</strong> (com tipo &#8230; hmmm, calma aí, veremos adiante).</p>
<p>Vamos ver a classe City:</p>
<pre class="brush: csharp;">
public class CityMap: ClassMap&lt;City&gt;
{
    public  CityMap()
    {
        Id(x =&gt; x.Id);
        Map(x =&gt; x.Name);
        Map(x =&gt; x.InfectionStart);
        HasMany&lt;Zombie&gt;(x =&gt; x.Zombies)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan()
            .AsBag();
    }
}
</pre>
<p>Também bem simples. A diferença aqui fica por conta do <strong>HasMany&lt;Zombie&gt;</strong>, cujo significado é bem simples, um City possui muitos Zombies.</p>
<p>Algo não tão óbvio é o <em>Access.CamelCaseField(Prefix.Underscore)</em>. Isto diz que a propriedade Zombies possui um campo que serve de suporte, com nome escrito no estilo camelCase (diferente de PascalCase) e iniciado por um underscore. Se trata do campo <strong>_zombies</strong>, que é Zombies escrito em camelCase e iniciado por underscore.</p>
<p><em>Cascade.AllDeleteOrphans()</em> informa ao NHibernate para apagar os Zombies órfãos, quer dizer, que não possuem um City.</p>
<p><em>AsBag()</em> é mais complicado. Primeiro é preciso entender que o NHibernate lida com <a href="http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/06/12/mapping-collections-in-nhibernate-part-1.aspx">vários tipos de coleções</a>: <strong>Set</strong>, <strong>Bag</strong>, <strong>Map</strong> e <strong>List</strong>. Cada uma com características próprias. No caso optei por <strong>bag</strong>, mas poderia ter usado <strong>list</strong> (que é um bag indexado).</p>
<p>Bom, resta agora a classe <em><strong>Month</strong></em>. Decidi não guardar o month em uma tabela própria. Ela nada mais é que uma data, onde apenas mês e ano importam. Então é apropriado guardá-lo em um campo DATETIME no banco de dados.</p>
<p>Para isso acontecer configuramos o NHibernate para tratar o Month como um DATETIME na hora de persistir tanto o <em>City</em> quanto o <em>Zombie</em> (campos <em>Infected</em>), criando uma classe que implementa a interface <strong><em>IUserType</em></strong>:</p>
<pre class="brush: csharp;">
public class MonthUserType: IUserType
{
    public new bool Equals(object x, object y)
    {
        if (ReferenceEquals(x, y)) return true;

        if (x == null || y == null) return false;

        return x.Equals(y);
    }

    public int GetHashCode(object x)
    {
        return x == null ? typeof(Month).GetHashCode() : x.GetHashCode();
    }

    //voltando do BD: passar de datetime para Month
    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var date = NHibernateUtil.DateTime.NullSafeGet(rs, names[0]) as DateTime?;

        if (date == null) return null;

        return new Month(date.Value.Year, date.Value.Month);
    }

    //indo pro BD: passar de Month para datetime
    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        DateTime? date = null;

        if (value != null)
            date = ((Month) value).AsDateTime();

        NHibernateUtil.DateTime.NullSafeSet(cmd, date, index);
    }

    public object DeepCopy(object value)
    {
        return value;
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return cached;
    }

    public object Disassemble(object value)
    {
        return value;
    }

    public SqlType[] SqlTypes
    {
        get { return new[] { NHibernateUtil.DateTime.SqlType }; }
    }

    public Type ReturnedType
    {
        get { return typeof (Month); }
    }

    public bool IsMutable
    {
        get { return false; }
    }
}
</pre>
<p>Esta classe vai tratar do trabalho de converter de Month para DATETIME e vice-versa. Para usar nosso MonthUserType é necessário configurar os mapeamentos das classes City e Zombie:</p>
<pre class="brush: csharp;">
Map(x =&gt; x.Infected).CustomType(typeof(MonthUserType));
</pre>
<p>Mas eu não usei esta abordagem. Imagine que tenhamos mais que essas duas classes para alterar ou que eu deseje deixar a configuração mais limpa.  Podemos deixar os mapeamentos já configurados do mesmo jeito, e informar o NHibernate  a usar o MonthUserType usando <a href="http://wiki.fluentnhibernate.org/Conventions">Convenções</a> (<em>Conventions</em>).</p>
<p>Basta implementar uma classe com a informação de que nossa convenção é usar MonthUserType para persistir objetos Month:</p>
<pre class="brush: csharp;">
    public class MonthUserTypeConvention: UserTypeConvention&lt;MonthUserType&gt;
    {
    }
</pre>
<p>É assim mesmo, vazio. No caso nem foi necessário realizar nenhum override dos métodos <em>Apply()</em> ou <em>Accept()</em>.</p>
<p>E pronto! Suas classes estão prontas para serem persistidas no banco de dados.</p>
<h2>Infraestrutura</h2>
<p>Bom, mas para se gravar os dados no banco é preciso ao menos saber como se conectar ao banco. Vamos facilitar nossa vida criando um método fábrica de objetos fábricas (ou algo assim):</p>
<pre class="brush: csharp;">
    public static class FluentSessionFactory
    {
        public static ISessionFactory CreateFactory(string connectionString)
        {
            return Fluently.Configure()
              .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString))
              .Mappings(
                m =&gt; m.FluentMappings
                    .AddFromAssemblyOf&lt;City&gt;()
                    .Conventions.AddFromAssemblyOf&lt;MonthUserTypeConvention&gt;()
              )
              .ExposeConfiguration(BuildSchema)
              .BuildSessionFactory();
        }

        private static void BuildSchema(Configuration config)
        {
            SchemaExport schema = new SchemaExport(config);
            schema.Drop(false, true);
            schema.Create(false, true);
        }

    }
</pre>
<p>Note que meu banco é um Sql Server 2005. Acerte o código para teu banco de dados. E para usar:</p>
<pre class="brush: csharp;">
ISessionFactory factory = FluentSessionFactory.CreateFactory(@&quot;Database=test_db;Server=localhost\sqlexpress;user=theuser;pwd=thepassword;&quot;);
ISession session = factory.OpenSession();
/** cria objetos e manda para o bd usando Session.Save(objeto) **/
session.Close();
</pre>
<p>Mas tome <strong>cuidado</strong>. Note um <em>schema.Drop()</em> e um <em>schema.Create()</em> lá em cima. Eles jogam as tabelas do banco fora e depois recriam-nas. Bom para o ambiente de desenvolvimento. Ruim para ambiente de produção. Muito ruim.</p>
<h2>1, 2, 3 Testando</h2>
<p>Nada melhor que usar testes automatizados para verificar se está tudo funcionando. Quer dizer, comer camarão na praia tomando cerveja é melhor que isso, mas vamos lá.</p>
<p>O Fluent NHibernate conta com um método muito útil para verificar se os mapeamentos estão redondinhos. Se trata do <em>PersistenceSpecification.VerifyTheMappings().</em></p>
<p>Veja como é simples:<em><br />
</em></p>
<pre class="brush: csharp;">
[TestClass]
public class CityMapTest
{
    private static readonly string ConnString = @&quot;Database=db_test;Server=localhost\sqlexpress;user=theuser;pwd=thepassword;&quot;;
    private static ISession Session;

    private TestContext testContextInstance;

    public TestContext TestContext
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext)
    {
        ISessionFactory factory = FluentSessionFactory.CreateFactory(ConnString);
        Session = factory.OpenSession();
    }

    [ClassCleanup()]
    public static void MyClassCleanup()
    {
        Session.Close();
    }

    [TestMethod]
    public void CrudTest()
    {
        new PersistenceSpecification&lt;City&gt;(Session)
            .CheckProperty(x =&gt; x.Id, 1)
            .CheckProperty(x =&gt; x.Name, &quot;Raccoon City&quot;)
            .CheckProperty(x =&gt; x.InfectionStart, new Month(1998, 8))
            .CheckList(
                x =&gt; x.Zombies,
                new []
                {
                    new Zombie { FormerName  =  &quot;John Doe&quot;, Infected = new Month(1998, 7) },
                    new Zombie { FormerName  =  &quot;José da Silva&quot;, Infected = new Month(1998, 6) }
                },
                (r, z) =&gt; r.AddZombie(z))
            .VerifyTheMappings();
    }
}
</pre>
<p>Ao executar o teste acima serão criadas as tabelas City e Zombie no banco de dados, que serão preenchidas com os dados fornecidos. Depois esses dados serão lidos e convetidos em objetos do sistema. Daí estes objetos serão comparados com os objetos originais. Se estiver tudo ok, o teste sinalizará <strong>verde</strong>. Se não, hora de corrigir <strong>bugs</strong>.</p>
<p>E é isso. Ah, para quem quiser o <a href="http://dl.dropbox.com/u/2295190/blog/FluentNH.zip">código do projeto&#8230;</a>
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/linq-to-sql" rel="bookmark" title="13 de abril de 2009">Linq to Sql</a></li>
<li><a href="http://seiti.eti.br/blog/2008/ddd" rel="bookmark" title="28 de maio de 2008">DDD</a></li>
<li><a href="http://seiti.eti.br/blog/2009/encodings-e-charsets-em-aspnet" rel="bookmark" title="13 de maio de 2009">Encodings e charsets em Asp.NET</a></li>
<li><a href="http://seiti.eti.br/blog/2009/dns-poisoning-na-net-virtua" rel="bookmark" title="14 de abril de 2009">DNS poisoning na NET Virtua</a></li>
</ul>
<p><!-- Similar Posts took 7.800 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/cZcLPtl_cWFfR4U1WBTHk1Xaze0/0/da"><img src="http://feedads.g.doubleclick.net/~a/cZcLPtl_cWFfR4U1WBTHk1Xaze0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/cZcLPtl_cWFfR4U1WBTHk1Xaze0/1/da"><img src="http://feedads.g.doubleclick.net/~a/cZcLPtl_cWFfR4U1WBTHk1Xaze0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/CMuxvBitoLI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/fluent-nhibernate/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/fluent-nhibernate</feedburner:origLink></item>
		<item>
		<title>Exceções do .Net</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/6yfFOZ0V17A/excecoes-do-net</link>
		<comments>http://seiti.eti.br/blog/2010/excecoes-do-net#comments</comments>
		<pubDate>Wed, 07 Jul 2010 21:22:48 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1176</guid>
		<description><![CDATA[Uma lista de exceções úteis para utilizar em seu sistema, sem ter que criar sempre outra classe e escrever mais código. Ultimamente tenho pensado numa programação Zen: o melhor código é o não-código. Quanto menos código você escrever, menos terá &#8230; <a href="http://seiti.eti.br/blog/2010/excecoes-do-net">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Uma lista de exceções úteis para utilizar em seu sistema, sem ter que criar sempre outra classe e escrever mais código.</p>
<p>Ultimamente tenho pensado numa programação Zen: o melhor código é o não-código. Quanto menos código você escrever, menos terá para manter, menos terá para entender, menos terá para depurar. Ou talvez esteja exacerbando apenas a <a href="http://seiti.eti.br/blog/?p=276">melhor qualidade de um programador</a>.</p>
<p>Chega de papo-furado, segue a lista (todas no namespace <tt>System</tt>):</p>
<table>
<tr>
<td>
ApplicationException
</td>
<td>
The exception that is thrown when a non-fatal application error occurs.
</td>
</tr>
<tr>
<td>
ArgumentException
</td>
<td>
The exception that is thrown when one of the arguments provided to a method is not valid.
</td>
</tr>
<tr>
<td>
<p>ArgumentNullException
</td>
<td>
<p>The exception that is thrown when a null reference (Nothing in Visual Basic) is passed to a method that does not accept it as a valid argument.
</td>
</tr>
<tr>
<td>
<p>ArgumentOutOfRangeException
</td>
<td>
<p>The exception that is thrown when the value of an argument is outside the allowable range of values as defined by the invoked method.
</td>
</tr>
<tr>
<td>
ArithmeticException
</td>
<td>
<p>The exception that is thrown for errors in an arithmetic, casting, or conversion operation.
</td>
</tr>
<tr>
<td>
<p>ArrayTypeMismatchException
</td>
<td>
<p>The exception that is thrown when an attempt is made to store an element of the wrong type within an array.
</td>
</tr>
<tr>
<td>
FieldAccessException
</td>
<td>
<p>The exception that is thrown when there is an invalid attempt to access a private or protected field inside a class.</p>
</td>
</tr>
<tr>
<td>
FormatException
</td>
<td>
<p>The exception that is thrown when the format of an argument does not meet the parameter specifications of the invoked method.
</td>
</tr>
<tr>
<td>
IndexOutOfRangeException
</td>
<td>
<p>The exception that is thrown when an attempt is made to access an element of an array with an index that is outside the bounds of the array. This class cannot be inherited.
</td>
</tr>
<tr>
<td>
<p>InvalidOperationException
</td>
<td>
<p>The exception that is thrown when a method call is invalid for the object’s current state.
</td>
</tr>
<tr>
<td>
NotFiniteNumberException
</td>
<td>
<p>The exception that is thrown when a floating-point value is positive infinity, negative infinity, or Not-a-Number (NaN).
</td>
</tr>
<tr>
<td>
NotImplementedException
</td>
<td>
<p>The exception that is thrown when a requested method or operation is not implemented.</p>
</td>
</tr>
<tr>
<td>
NotSupportedException
</td>
<td>
<p>The exception that is thrown when an invoked method is not supported, or when there is an attempt to read, seek, or write to a stream that does not support the invoked functionality.</p>
</td>
</tr>
<tr>
<td>
NullReferenceException
</td>
<td>
<p>The exception that is thrown when there is an attempt to dereference a null object reference.</p>
</td>
</tr>
<tr>
<td>
ObjectDisposedException
</td>
<td>
<p>The exception that is thrown when an operation is performed on a disposed object.
</td>
</tr>
<tr>
<td>
<p>PlatformNotSupportedException
</td>
<td>
<p>The exception that is thrown when a feature does not run on a particular platform.
</td>
</tr>
<tr>
<td>
<p>RankException
</td>
<td>
<p>The exception that is thrown when an array with the wrong number of dimensions is passed to a method.</p>
</td>
</tr>
<tr>
<td>
<p>SystemException
</td>
<td>
<p>Defines the base class for predefined exceptions in the namespace.
</td>
</tr>
<tr>
<td>
<p>TimeoutException
</td>
<td>
<p>The exception that is thrown when the time allotted for a process or operation has expired.
</td>
</tr>
<tr>
<td>
<p>TypeInitializationException
</td>
<td>
<p>The exception that is thrown as a wrapper around the exception thrown by the class initializer. This class cannot be inherited.</p>
</td>
</tr>
<tr>
<td>
<p>UnauthorizedAccessException
</td>
<td>
<p>The exception that is thrown when the operating system denies access because of an I/O error or a specific type of security error.</p>
</td>
</tr>
</table>
<p>Fonte: <a href="http://mikevallotton.wordpress.com/2009/07/08/net-exceptions-all-of-them/">http://mikevallotton.wordpress.com/2009/07/08/net-exceptions-all-of-them/</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/7GUqaG6z3OH2PMGSZUprR_wOC58/0/da"><img src="http://feedads.g.doubleclick.net/~a/7GUqaG6z3OH2PMGSZUprR_wOC58/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7GUqaG6z3OH2PMGSZUprR_wOC58/1/da"><img src="http://feedads.g.doubleclick.net/~a/7GUqaG6z3OH2PMGSZUprR_wOC58/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/6yfFOZ0V17A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/excecoes-do-net/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/excecoes-do-net</feedburner:origLink></item>
		<item>
		<title>WordPress 3.0</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/b7HwH5wLdO8/wordpress-3-0</link>
		<comments>http://seiti.eti.br/blog/2010/wordpress-3-0#comments</comments>
		<pubDate>Sat, 19 Jun 2010 05:02:58 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1150</guid>
		<description><![CDATA[Atualizei o site para o WordPress 3.0, em PT-BR e, como sempre, sem problemas! E junto vem o novo tema default Twenty Ten, que finalmente substitui o tema anterior, Kubrick. E não é só para dar um tapa no visual, &#8230; <a href="http://seiti.eti.br/blog/2010/wordpress-3-0">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Atualizei o site para o WordPress 3.0, em PT-BR e, como sempre, sem problemas!  E junto vem o novo tema default <em>Twenty Ten</em>, que finalmente substitui o tema anterior, Kubrick.</p>
<p>E não é só para dar um tapa no visual, o novo tema mostra os novos recursos do WordPress, como podemos ver no vídeo.</p>
<p>Acho que está na hora de trocar a cara do site (se bem que, com o Google Reader e demais leitores de feeds,  ninguém mais visita blogs)</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="360" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="guid=BQtfIEY1&amp;width=640&amp;height=360&amp;locksize=no&amp;dynamicseek=false&amp;qc_publisherId=p-18-mFEk4J448M" /><param name="src" value="http://v.wordpress.com/wp-content/plugins/video/flvplayer.swf?ver=1.21" /><param name="wmode" value="transparent" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="360" src="http://v.wordpress.com/wp-content/plugins/video/flvplayer.swf?ver=1.21" allowfullscreen="true" wmode="transparent" flashvars="guid=BQtfIEY1&amp;width=640&amp;height=360&amp;locksize=no&amp;dynamicseek=false&amp;qc_publisherId=p-18-mFEk4J448M"></embed></object></p>

<p><a href="http://feedads.g.doubleclick.net/~a/TK9qAdww5iAkJwEfLTgt3C1F7Rk/0/da"><img src="http://feedads.g.doubleclick.net/~a/TK9qAdww5iAkJwEfLTgt3C1F7Rk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TK9qAdww5iAkJwEfLTgt3C1F7Rk/1/da"><img src="http://feedads.g.doubleclick.net/~a/TK9qAdww5iAkJwEfLTgt3C1F7Rk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/b7HwH5wLdO8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/wordpress-3-0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/wordpress-3-0</feedburner:origLink></item>
		<item>
		<title>Erro no deploy automático: Hudson versus MSBuild</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/n60-plNkdgo/erro-no-deploy-automatico-hudson-versus-msbuild</link>
		<comments>http://seiti.eti.br/blog/2010/erro-no-deploy-automatico-hudson-versus-msbuild#comments</comments>
		<pubDate>Tue, 11 May 2010 23:48:15 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[msbuild]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1126</guid>
		<description><![CDATA[Usamos o excelente Hudson como servidor de integração contínua, junto do plugin MSBuild. Mas estes dias criei um projeto no Hudson, referente à uma solução já no framework .NET v4, escrita no Visual Studio 2010 (v10). O primeiro passo foi &#8230; <a href="http://seiti.eti.br/blog/2010/erro-no-deploy-automatico-hudson-versus-msbuild">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Usamos o excelente Hudson como servidor de integração contínua, junto do plugin MSBuild.</p>
<div class="wp-caption aligncenter" style="width: 106px"><a href="http://hudson-ci.org/"><img title="Hudson" src="http://hudson-ci.org/images/butler.png" alt="" width="96" height="96" /></a><p class="wp-caption-text">O fiel mordomo</p></div>
<p>Mas estes dias criei um projeto no Hudson, referente à uma solução já no framework .NET v4, escrita no Visual Studio 2010 (v10).</p>
<p>O primeiro passo foi entrar nas configurações do Hudson e criar outra entrada para o plugin MSBuild, apontando para a versão 4 do mesmo. Basta ir para <em>Gerenciar Hudson</em> → <em>Configurar Sistema</em> → <em>MSBuild</em> e incluir:</p>
<blockquote>
<pre>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</pre>
</blockquote>
<p>Feito isto, configurei o novo projeto para usar esta nova entrada do MSBuild. E o projeto falhou na construção com a seguinte mensagem:</p>
<blockquote>
<pre style="overflow: auto;">error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the &lt;Import&gt; declaration is correct, and that the file exists on disk.
</pre>
</blockquote>
<p>O jeito foi atender a demanda: criei as respectivas pastas e copiei o arquivo do meu micro para o servidor. Pronto. Agora só resta resolver alguns pepinos com <em>assemblies</em>&#8230;</p>
<p><strong>Update</strong>: parece que preciso instalar ou o Visual Studio 2010 ou o Windows 7 SDK  no servidor em questão. Mas ocorrem dois problemas: (1) o VS2010 é caro e (2) o SDK ainda <a href="http://blogs.msdn.com/windowssdk/archive/2010/04/07/coming-soon-win-sdk-for-windows-7-and-net-4.aspx">não saiu</a>. O jeito é aguardar meados de junho.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/compilando-seu-web-application-project-com-o-msbuild" rel="bookmark" title="6 de maio de 2009">Compilando seu Web Application Project com o MSBuild</a></li>
<li><a href="http://seiti.eti.br/blog/2009/problema-rodando-testes-mbunit-no-vs2008-test-runner" rel="bookmark" title="3 de agosto de 2009">Problema rodando testes MbUnit no VS2008 Test Runner</a></li>
<li><a href="http://seiti.eti.br/blog/2006/aspnet-development-server-integrated-web-server" rel="bookmark" title="19 de setembro de 2006">ASP.NET Development Server (integrated web server)</a></li>
<li><a href="http://seiti.eti.br/blog/2009/linq-to-sql" rel="bookmark" title="13 de abril de 2009">Linq to Sql</a></li>
</ul>
<p><!-- Similar Posts took 6.723 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/gh2WEc1DWgMyHLO-_wtD2PoK9eM/0/da"><img src="http://feedads.g.doubleclick.net/~a/gh2WEc1DWgMyHLO-_wtD2PoK9eM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gh2WEc1DWgMyHLO-_wtD2PoK9eM/1/da"><img src="http://feedads.g.doubleclick.net/~a/gh2WEc1DWgMyHLO-_wtD2PoK9eM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/n60-plNkdgo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/erro-no-deploy-automatico-hudson-versus-msbuild/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/erro-no-deploy-automatico-hudson-versus-msbuild</feedburner:origLink></item>
		<item>
		<title>Apps favoritos no Milestone</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/_vPyj9J-vUg/apps-favoritos-no-milestone</link>
		<comments>http://seiti.eti.br/blog/2010/apps-favoritos-no-milestone#comments</comments>
		<pubDate>Sat, 08 May 2010 01:59:54 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[cacarecos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[smartphone]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1119</guid>
		<description><![CDATA[Logo que consegui meu Motorola Milestone publiquei um post com os apps mais interessantes que encontrei. Passado quase 5 meses com o aparelho, e já com o Android 2.1 nos circuitos, é hora de mais uma lista! Permaneço fie à &#8230; <a href="http://seiti.eti.br/blog/2010/apps-favoritos-no-milestone">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Logo que consegui meu <strong>Motorola Milestone</strong> publiquei um post com os <a href="http://seiti.eti.br/blog/2009/milestone-e-o-android-market"><em>apps</em> mais interessantes</a> que encontrei. Passado quase 5 meses com o aparelho, e já com o Android 2.1 nos circuitos, é hora de mais uma lista!</p>
<p>Permaneço fie à alguns <em>apps</em>, como o APNDroid, NetCounter, MotoID,  Nesoid e o SNesoid. Mas muita coisa mudou.  O <strong>Twidroid</strong> eu deixei de lado pelo <strong>Seesmic</strong>, que também foi deixado de lado.  O <strong>wpToGo </strong>foi descontinuado, com o programador sendo contratado pela própria <strong>WordPress</strong>. O site da <strong>Wikipédia </strong>se tornou um exemplo de site projetado para browsers de dispositivos móveis, tornando o <strong>Wapedia </strong>quase obsoleto.</p>
<h3>twitter para Android</h3>
<p>É o <a href="http://blog.twitter.com/2010/04/twitter-for-android-robots-like-to.html">cliente oficial do twitter</a>, para Android. Possui uma excelente integração com o resto do sistema. Embora o Seesmic também seja excelente e venha com um bom widget, o twitter oficial será páreo duro. Só precisa de um tema com mais culhões.</p>
<h3>EStrongs File Explorer</h3>
<p>Um gerenciador de arquivos. Permite que você copie, cole, apague e abra tudo que estiver em seu SD, numa rede local ou até num ftp.</p>
<h3>EStrongs Task Manager</h3>
<p>Gerenciado de tarefas que as apresenta de uma maneira mais clara que o do próprio Android.</p>
<h3>Super Mario Sounds &amp; Ringtones</h3>
<p>Este aqui baixei para poder personalizar as notificações. Ao receber um SMS ouço o som de um cogumelo verde.</p>
<h3>Evernote</h3>
<p>Um caderno de notas. Eu uso para visualizar as notas que guardo. Para criar as notas eu so o  email mesmo. É mais prático. Mas o app é bom para guardar fotos com comentários. Bem útil para levar nas lojas e mercados, para comparar os preços em outros lugares.</p>
<p>Para subir imagens no Flickr e notas no Evernote, como comentei acima, uso o bom e velho email (ou Gmail).</p>
<h3>Dropbox</h3>
<p>Dropbox. Em seu bolso.</p>
<h3>Raging Thunder 2 Lite</h3>
<p>Algo que sinto falta no Android são jogos <strong>bons</strong>. Que tenham produção caprichada, música e gráficos idem. Este jogo, apesar de ser uma versão light, atende a estes quesitos.  Finalmente um jogo que usa o poder do Milestone.  Muito bacana para jogar no metrô ou na fila.</p>
<h3>MotoTorch LED</h3>
<p>Finalmente uma lanterna útil. Diferente dos outros apps flashlight, este aqui não usa a tela do aparelho. Ele usa o flash LED, o mesmo da câmera. Ilumina bem mais, além de ser mais direcionável.  E ainda vem com um widget para facilitar o uso. Uma mão na roda para quando falta luz.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/53Q3oedAIbGQ-Y9HKR5xmGprVGg/0/da"><img src="http://feedads.g.doubleclick.net/~a/53Q3oedAIbGQ-Y9HKR5xmGprVGg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/53Q3oedAIbGQ-Y9HKR5xmGprVGg/1/da"><img src="http://feedads.g.doubleclick.net/~a/53Q3oedAIbGQ-Y9HKR5xmGprVGg/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/_vPyj9J-vUg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/apps-favoritos-no-milestone/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/apps-favoritos-no-milestone</feedburner:origLink></item>
		<item>
		<title>Web Deployment Project e o Visual Studio 2008</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/TOi-Yui6L24/web-deployment-project-e-o-visual-studio-2008</link>
		<comments>http://seiti.eti.br/blog/2010/web-deployment-project-e-o-visual-studio-2008#comments</comments>
		<pubDate>Mon, 12 Apr 2010 18:01:44 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1111</guid>
		<description><![CDATA[O Web Deployment Project é uma extensão do Visual Studio 2008 que permite a prévia compilação de páginas e controles de uma aplicação web. Assim podemos detectar se determinada página apresentará erro antes de algum usuário visitar a página em &#8230; <a href="http://seiti.eti.br/blog/2010/web-deployment-project-e-o-visual-studio-2008">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.microsoft.com/downloads/details.aspx?familyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&amp;displaylang=en">Web Deployment Project</a> é uma extensão do Visual Studio 2008 que permite a prévia compilação de páginas e controles de uma aplicação web. Assim podemos detectar se determinada página apresentará erro antes de algum usuário visitar a página em questão.</p>
<p>A parte chata é que isto impossbilita a edição das páginas e controles à quente, direto no servidor. Opa, na verdade esta é parte boa.</p>
<p>Após instalar basta clicar com o botão direito sobre o seu projeto no Visual Studio que surgirá uma opção <em>Add Web Deployment Project&#8230;</em>. Clicando nesta opção o projeto deveria ser criado. Deveria. Ao menos aqui no Windows 7 não funciona.</p>
<p>Um erro surge dizendo, entre outras coisas: <strong>Unable to create the project file</strong>. </p>
<p>Como solucionar?  Você deve rodar o Visual Studio como <strong>Administrador</strong>. Simples assim.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2008/substituindo-texto-com-perl-e-estouro-de-pilha" rel="bookmark" title="29 de outubro de 2008">Substituindo texto com Perl e Estouro de Pilha</a></li>
<li><a href="http://seiti.eti.br/blog/2006/agrupando-arquivos-na-arvore-do-vs-2005" rel="bookmark" title="21 de dezembro de 2006">Agrupando arquivos na árvore do VS 2005</a></li>
<li><a href="http://seiti.eti.br/blog/2008/esquema-de-cores-para-o-visual-studio-2008" rel="bookmark" title="27 de outubro de 2008">Esquema de cores para o Visual Studio 2008</a></li>
</ul>
<p><!-- Similar Posts took 5.449 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/LMOSxn_qGj5i-k4RSRH8t3ujG-Q/0/da"><img src="http://feedads.g.doubleclick.net/~a/LMOSxn_qGj5i-k4RSRH8t3ujG-Q/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/LMOSxn_qGj5i-k4RSRH8t3ujG-Q/1/da"><img src="http://feedads.g.doubleclick.net/~a/LMOSxn_qGj5i-k4RSRH8t3ujG-Q/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/TOi-Yui6L24" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/web-deployment-project-e-o-visual-studio-2008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/web-deployment-project-e-o-visual-studio-2008</feedburner:origLink></item>
		<item>
		<title>Login failed for user ‘NT AUTHORITY\NETWORK SERVICE’</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/zKHdD3PPxbE/login-failed-for-user-nt-authoritynetwork-service</link>
		<comments>http://seiti.eti.br/blog/2010/login-failed-for-user-nt-authoritynetwork-service#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:46:25 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Sql Server]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1104</guid>
		<description><![CDATA[Acabou de instalar o SQL Server? Surgiu um dos seguintes erros? Login failed for user &#8216;NT AUTHORITY\NETWORK SERVICE&#8217; ou Falha no login &#8216;AUTORIDADE NT\SERVIÇO DE REDE&#8217; Não se preocupe. Execute o seguinte no banco de dados master no SQL Server: &#8230; <a href="http://seiti.eti.br/blog/2010/login-failed-for-user-nt-authoritynetwork-service">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Acabou de instalar o SQL Server? Surgiu um dos seguintes erros?</p>
<blockquote><p>Login failed for user &#8216;NT AUTHORITY\NETWORK SERVICE&#8217;</p></blockquote>
<p>ou </p>
<blockquote><p>Falha no login &#8216;AUTORIDADE NT\SERVIÇO DE REDE&#8217;</p></blockquote>
<p>Não se preocupe. Execute o seguinte no banco de dados <strong>master</strong> no SQL Server:</p>
<pre class="brush: plain;">
sp_grantlogin 'NT AUTHORITY\NETWORK SERVICE'
</pre>
<p>ou</p>
<pre class="brush: plain;">
sp_grantlogin 'AUTORIDADE NT\SERVIÇO DE REDE'
</pre>
<p>Pronto, sua aplicação conversará com seu banco de dados.</p>
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2010/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server" rel="bookmark" title="14 de março de 2010">Linked Server: consultando o PostGreSQL através do MS SQL Server</a></li>
<li><a href="http://seiti.eti.br/blog/2008/linked-server-com-oracle" rel="bookmark" title="2 de dezembro de 2008">Linked server com Oracle</a></li>
<li><a href="http://seiti.eti.br/blog/2006/acessando-o-ms-sql-server-atraves-do-postgresql" rel="bookmark" title="19 de setembro de 2006">Acessando o MS SQL Server através do PostGreSQL</a></li>
<li><a href="http://seiti.eti.br/blog/2008/linked-servers" rel="bookmark" title="27 de novembro de 2008">Linked Servers</a></li>
</ul>
<p><!-- Similar Posts took 5.822 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/ewrprVW7CN8mcDOHRcFzDdyLFDc/0/da"><img src="http://feedads.g.doubleclick.net/~a/ewrprVW7CN8mcDOHRcFzDdyLFDc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ewrprVW7CN8mcDOHRcFzDdyLFDc/1/da"><img src="http://feedads.g.doubleclick.net/~a/ewrprVW7CN8mcDOHRcFzDdyLFDc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/zKHdD3PPxbE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/login-failed-for-user-nt-authoritynetwork-service/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/login-failed-for-user-nt-authoritynetwork-service</feedburner:origLink></item>
		<item>
		<title>Impressora Epson TX600FW</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/BO4yjzcNbq8/impressora-epson-tx600fw</link>
		<comments>http://seiti.eti.br/blog/2010/impressora-epson-tx600fw#comments</comments>
		<pubDate>Mon, 15 Mar 2010 03:59:11 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[cacarecos]]></category>
		<category><![CDATA[impressora]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1090</guid>
		<description><![CDATA[A  Epson TX600FW é uma multifuncional de rede, direcionada ao mercado SOHO &#8211; escritórios pequenos ou em casa -  oferecendo interfaces tanto ethernet quanto Wi-Fi. Isto significa independência de um computador conectado e ligado.  Para quem tem em sua casa &#8230; <a href="http://seiti.eti.br/blog/2010/impressora-epson-tx600fw">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A  Epson TX600FW é uma multifuncional de rede, direcionada ao mercado SOHO &#8211; escritórios pequenos ou em casa -  oferecendo interfaces tanto ethernet quanto Wi-Fi. Isto significa independência de um computador conectado e ligado.  Para quem tem em sua casa mais de um computador, significa comodidade e facilidade de uso. Mas infelizmente facilidade de uso não é igual a facilidade na instalação.</p>
<p><a title="Epson TX600FW by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4433737775/"><img src="http://farm5.static.flickr.com/4057/4433737775_086c64e63e.jpg" alt="Epson TX600FW" width="500" height="430" /></a></p>
<h3>Windows Vista</h3>
<p>Com o CD de instalação que acompanha o produto só consegui identificar e configurar a impressora na rede. A instalação final da impressora no próprio Windows Vista não deu muito certo, sempre falhando ao final, acusando falta de drivers. O jeito foi baixar o pacote com os drivers mais recentes:</p>
<p><a href="http://www.epson.com.sg/epson/drivers/driver_download.htm?mode=3&amp;catid=4&amp;productModel=4&amp;catid=&amp;pid=1401&amp;ad=1&amp;downloadType=Windows">Drivers para Windows e Mac OS</a></p>
<p>Mas ao instalar não havia a opção TCP/IP ou Rede nas portas disponíveis. O que fiz foi escolher o USB e proceder com a instalação. Após instalado, acessei as <strong>propriedades</strong> da impressora, na guia <strong>portas</strong>, e adicionei uma porta do tipo TCP/IP, apontando para o endereço 192.168.1.4. Este IP é o da impressora, que eu mesmo verifiquei através do roteador.</p>
<p>Após este procedimento a impressora finalmente ficou disponível para uso no Windows Vista.</p>
<p>Quanto ao scanner, instalei os drivers obtidos no link acima. Mas o software de digitalização da EPSON simplesmente não funcionou. Achei que era por falta de configuração e entrei no <em>Definições EPSON Scan</em>. Aha! Precisava mesmo configurar o IP da multifuncional. Mas  mesmo após identificá-lo, o EPSON Scan dava pau. Bom, ainda bem que existe o GIMP, que consegue digitalizar facilmente usando a TX600FW. Quer dizer que os drivers estão ok, mas o software de digitalizaçao da EPSON não.</p>
<h3>Windows 7</h3>
<p>No mesmo link indicado acima existem os drivers para Windows 7. Ou então acesse este:  <a href="http://www.suporte-epson.com.br">http://www.suporte-epson.com.br</a>.<br />
Usando o Firefox eu não consegui baixar o arquivo de primeira. Analisando o código fonte do popup dá pra ver que o culpado é um javascript sem vergonha. Assim montei na mão mesmo a <a href="http://189.125.111.120/suporte_down/arquivo1.asp?path=arquivos_temp/CI_TX600FW_WINXPX64_VISTA64_7X64.EX">URL para o arquivo</a>. Ou use o IE.</p>
<p>O link para o arquivo é bem lento e propenso a interrupções. Mas com paciência consegue-se o driver.</p>
<h3>Ubuntu</h3>
<p>Num primeiro momento eu ia baixar e instalar os drivers do site da Avasys: <a href="http://www.avasys.jp/lx-bin2/linux_e/spc/DL1.do">drivers para Linux</a> (Ubuntu e cia.). Mas infelizmente não existem os drivers para a arquitetura 64bits lá no site.</p>
<p>Mas então me ocorreu tentar instalar a impressora sem o uso de drivers externos. Bom, o Ubuntu deu conta do recado. Identificou, configurou e adicionou a impressora em dois cliques. E dizem que Windows é que é simples de usar! Bah.</p>
<p>O scanner ainda não configurei, mas posso adiantar que só instalar o pacote do site Avasys não é suficiente. As instruções que consegui nos <a href="http://ubuntuforums.org/showthread.php?t=1393162">fóruns</a> do Ubuntu são:</p>
<p>- instalar os driver da Avasys;</p>
<p>- instalar o plugin do sane <a href="http://linux.avasys.jp/drivers/scanner-plugins/iscan-network-nt/1.1.0/iscan-network-nt_1.1.0-2_i386.deb">iscan-network-nt</a>;</p>
<p>- editar o arquivo /etc/sane.d/dll.conf, certificando-se de comentar as linhas <em>epson</em> e <em>epson2</em> e incluir o <em>epkowa</em>;</p>
<p>- editar o arquivo /etc/sane.d/epkowa.conf incluindo a linha net 192.168.1.4 (troque pelo IP da tua máquina).</p>
<p>(ok, ok, o Windows é que é fácil de usar&#8230;)</p>
<p>Se alguém conseguir, é só dizer aí embaixo!</p>
<h3>Sem computador</h3>
<p>A Epson TX600FW ainda digitaliza imagens e guarda automaticamente em um cartão de memória inserido nela, dispensando o uso de um computador. Uma pasta chamada EPSCAN é criada e uma outra pasta numerada dentro dela, contendo a imagem digitalizada.</p>
<div class="wp-caption aligncenter" style="width: 234px"><a title="Guia EPSON by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4433714173/"><img title="Imagem digitalizada direto para o cartão de memória" src="http://farm3.static.flickr.com/2742/4433714173_447541518e.jpg" alt="Guia EPSON" width="224" height="500" /></a><p class="wp-caption-text">Imagem digitalizada direto para o cartão de memória</p></div>
<p style="text-align: center;">
<p>Só faltou criar um PDF, mas para isto ela precisa de um computador.</p>
<p>Outras funções que não necessitam de um computador são de cópia de documentos &#8211; ou &#8220;xerox&#8221;, impressão de fotos a partir do cartão de memória e os serviços de fax  (que nem se funcionam, pois uso VoIP. Aliás usar FAX sobre uma linha de telefone criada em cima de uma conexão de internet usando pacotes TCP/IP em cima de uma infraestrutura de cabos coaxiais me lembra uma massa folhada&#8230;). Um dia ainda testo isso.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2008/impressora-lexmark-z645-no-ubuntu-linux" rel="bookmark" title="2 de dezembro de 2008">Impressora Lexmark Z645 no Ubuntu Linux</a></li>
<li><a href="http://seiti.eti.br/blog/2007/ubuntu-606-dapper-drake-num-laptop-sharp" rel="bookmark" title="14 de junho de 2007">Ubuntu 6.06 Dapper Drake num Laptop Sharp</a></li>
<li><a href="http://seiti.eti.br/blog/2008/ubuntu-8041-lancado-hoje" rel="bookmark" title="3 de julho de 2008">Ubuntu 8.04.1 lançado hoje</a></li>
<li><a href="http://seiti.eti.br/blog/2009/lerdeza-para-remover-arquivos-no-vista" rel="bookmark" title="24 de abril de 2009">Lerdeza para remover arquivos no Vista?</a></li>
</ul>
<p><!-- Similar Posts took 7.279 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/mXojwdQLf1DOA6y2BbpiQfejX_k/0/da"><img src="http://feedads.g.doubleclick.net/~a/mXojwdQLf1DOA6y2BbpiQfejX_k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mXojwdQLf1DOA6y2BbpiQfejX_k/1/da"><img src="http://feedads.g.doubleclick.net/~a/mXojwdQLf1DOA6y2BbpiQfejX_k/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/BO4yjzcNbq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/impressora-epson-tx600fw/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/impressora-epson-tx600fw</feedburner:origLink></item>
		<item>
		<title>Linked Server: consultando o PostGreSQL através do MS SQL Server</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/lZDv4kAn9wk/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server</link>
		<comments>http://seiti.eti.br/blog/2010/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server#comments</comments>
		<pubDate>Sun, 14 Mar 2010 19:51:57 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Sql Server]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1083</guid>
		<description><![CDATA[Antes de tudo é necessário instalar os drivers ODBC do PostGreSQL no servidor em que se encontra o MS SQL Server. Depois registre um System DSN, ou Fonte de Dados do Sistema. Para isto basta se encaminhar para: Painel de &#8230; <a href="http://seiti.eti.br/blog/2010/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Antes de tudo é necessário instalar os <a href="http://www.postgresql.org/ftp/odbc/versions/msi/">drivers ODBC</a> do PostGreSQL no servidor em que se encontra o MS SQL Server.</p>
<p>Depois registre um <em>System DSN</em>, ou Fonte de Dados do Sistema. Para isto basta se encaminhar para:</p>
<blockquote><p>Painel de Controle → Ferramentas Administrativas → Fontes de Dados ODBC.</p></blockquote>
<p>Basta preencher as caixinhas e depois testar. Com a conexão funcionando,  agora é hora de se criar um <em>Linked Server</em> entre o MS SQL Server e o PostGreSQL.</p>
<pre class="brush: plain;">
EXEC master.dbo.sp_droplinkedsrvlogin
          @rmtsrvname=N'LINKEDSERVERNAME'
	, @locallogin=NULL

EXEC master.dbo.sp_dropserver
	  @server = 'LINKEDSERVERNAME'

EXEC master.dbo.sp_addlinkedserver
	  @server = 'LINKEDSERVERNAME'
	, @provider = 'Postgresql OLE DB'
	, @datasrc = 'Postgresql ANSI'

EXEC master.dbo.sp_addlinkedsrvlogin
	  @rmtsrvname=N'LINKEDSERVERNAME'
	, @useself=N'False'
	, @locallogin=NULL
	, @rmtuser='usuariopostgres'
	, @rmtpassword='senhapostgres'
</pre>
<p>Agora você pode fazer consultas assim:</p>
<pre class="brush: plain;">
SELECT * FROM openquery(LINKEDSERVERNAME, 'SELECT * FROM TABELADOPOSTGRES')
</pre>
</pre>
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2006/acessando-o-ms-sql-server-atraves-do-postgresql" rel="bookmark" title="19 de setembro de 2006">Acessando o MS SQL Server através do PostGreSQL</a></li>
<li><a href="http://seiti.eti.br/blog/2008/linked-server-com-oracle" rel="bookmark" title="2 de dezembro de 2008">Linked server com Oracle</a></li>
<li><a href="http://seiti.eti.br/blog/2010/login-failed-for-user-nt-authoritynetwork-service" rel="bookmark" title="31 de março de 2010">Login failed for user &#8216;NT AUTHORITY\NETWORK SERVICE&#8217;</a></li>
<li><a href="http://seiti.eti.br/blog/2008/linked-servers" rel="bookmark" title="27 de novembro de 2008">Linked Servers</a></li>
</ul>
<p><!-- Similar Posts took 7.323 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/BKpnrze0pp0lZdDAOMNbiwtqvTk/0/da"><img src="http://feedads.g.doubleclick.net/~a/BKpnrze0pp0lZdDAOMNbiwtqvTk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/BKpnrze0pp0lZdDAOMNbiwtqvTk/1/da"><img src="http://feedads.g.doubleclick.net/~a/BKpnrze0pp0lZdDAOMNbiwtqvTk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/lZDv4kAn9wk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/linked-server-consultando-o-postgresql-atraves-do-ms-sql-server</feedburner:origLink></item>
		<item>
		<title>Funções Geoespaciais do MS SQL Server 2008</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/Q04vR7Lyy-I/funcoes-geoespaciais-do-ms-sql-server-2008</link>
		<comments>http://seiti.eti.br/blog/2010/funcoes-geoespaciais-do-ms-sql-server-2008#comments</comments>
		<pubDate>Fri, 12 Mar 2010 21:24:28 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[geo]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1078</guid>
		<description><![CDATA[O MS SQL Server 2008 (MSSQL) possui um tipo próprio para guardar geometrias: geometry (tem um geography também, mais útil para representar feições mais extensas). E ainda implementa os métodos definidos pela OGC. Isto possibilita operações CRUD sobre o dados &#8230; <a href="http://seiti.eti.br/blog/2010/funcoes-geoespaciais-do-ms-sql-server-2008">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O MS SQL Server 2008 (MSSQL) possui um tipo  próprio para guardar geometrias: <a href="http://msdn.microsoft.com/en-us/library/cc280487.aspx"><em>geometry</em></a> (tem um <em>geography</em> também, mais útil para representar feições mais extensas).</p>
<p>E ainda <a href="http://msdn.microsoft.com/en-us/library/bb933973.aspx"> implementa</a> os métodos definidos pela OGC.</p>
<p>Isto  possibilita operações CRUD sobre o dados georreferenciados, diretamente através de  comandos SQL.</p>
<p>Os métodos estáticos, acessíveis através de <tt>geometry::NomeDoMétodo()</tt>,  são:</p>
<ul>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl00" href="http://msdn.microsoft.com/en-us/library/bb933823.aspx">STGeomFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl01" href="http://msdn.microsoft.com/en-us/library/bb933821.aspx">STPointFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl02" href="http://msdn.microsoft.com/en-us/library/bb933839.aspx">STLineFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl03" href="http://msdn.microsoft.com/en-us/library/bb933922.aspx">STPolyFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl04" href="http://msdn.microsoft.com/en-us/library/bb933833.aspx">STMPointFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl05" href="http://msdn.microsoft.com/en-us/library/bb933836.aspx">STMLineFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl06" href="http://msdn.microsoft.com/en-us/library/bb933986.aspx">STMPolyFromText (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl07" href="http://msdn.microsoft.com/en-us/library/bb933818.aspx">STGeomCollFromText (geometry  Data Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl08" href="http://msdn.microsoft.com/en-us/library/bb933882.aspx">STGeomFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl09" href="http://msdn.microsoft.com/en-us/library/bb933813.aspx">STPointFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl10" href="http://msdn.microsoft.com/en-us/library/bb933980.aspx">STLineFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl11" href="http://msdn.microsoft.com/en-us/library/bb933907.aspx">STPolyFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl12" href="http://msdn.microsoft.com/en-us/library/bb933801.aspx">STMPointFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl13" href="http://msdn.microsoft.com/en-us/library/bb933800.aspx">STMLineFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl14" href="http://msdn.microsoft.com/en-us/library/bb933964.aspx">STMPolyFromWKB (geometry Data  Type)</a></li>
<li><a id="ctl00_MainContent_ctl27_ctl00_ctl15" href="http://msdn.microsoft.com/en-us/library/bb933889.aspx">STGeomCollFromWKB (geometry  Data Type)</a></li>
</ul>
<p>E os métodos do objeto <em>geometry</em>:</p>
<ul>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl00" href="http://msdn.microsoft.com/en-us/library/bb933923.aspx">STArea</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl01" href="http://msdn.microsoft.com/en-us/library/bb933881.aspx">STAsBinary</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl02" href="http://msdn.microsoft.com/en-us/library/bb933977.aspx">STAsText</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl03" href="http://msdn.microsoft.com/en-us/library/bb933985.aspx">STBoundary</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl04" href="http://msdn.microsoft.com/en-us/library/bb933963.aspx">STBuffer</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl05" href="http://msdn.microsoft.com/en-us/library/bb933847.aspx">STCentroid</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl06" href="http://msdn.microsoft.com/en-us/library/bb933904.aspx">STContains</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl07" href="http://msdn.microsoft.com/en-us/library/bb933878.aspx">STConvexHull</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl08" href="http://msdn.microsoft.com/en-us/library/bb933838.aspx">STCrosses</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl09" href="http://msdn.microsoft.com/en-us/library/bb933893.aspx">STDifference</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl10" href="http://msdn.microsoft.com/en-us/library/bb933848.aspx">STDimension</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl11" href="http://msdn.microsoft.com/en-us/library/bb933909.aspx">STDisjoint</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl12" href="http://msdn.microsoft.com/en-us/library/bb933952.aspx">STDistance</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl13" href="http://msdn.microsoft.com/en-us/library/bb933879.aspx">STEndpoint</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl14" href="http://msdn.microsoft.com/en-us/library/bb933896.aspx">STEnvelope</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl15" href="http://msdn.microsoft.com/en-us/library/bb933902.aspx">STEquals</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl16" href="http://msdn.microsoft.com/en-us/library/bb933955.aspx">STExteriorRing</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl17" href="http://msdn.microsoft.com/en-us/library/bb933831.aspx">STGeometryN</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl18" href="http://msdn.microsoft.com/en-us/library/bb933825.aspx">STGeometryType</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl19" href="http://msdn.microsoft.com/en-us/library/bb933843.aspx">STInteriorRingN</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl20" href="http://msdn.microsoft.com/en-us/library/bb933832.aspx">STIntersection</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl21" href="http://msdn.microsoft.com/en-us/library/bb933899.aspx">STIntersects</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl22" href="http://msdn.microsoft.com/en-us/library/bb933815.aspx">STIsClosed</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl23" href="http://msdn.microsoft.com/en-us/library/bb933975.aspx">STIsEmpty</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl24" href="http://msdn.microsoft.com/en-us/library/bb933982.aspx">STIsRing</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl25" href="http://msdn.microsoft.com/en-us/library/bb933974.aspx">STIsSimple</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl26" href="http://msdn.microsoft.com/en-us/library/bb933890.aspx">STIsValid</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl27" href="http://msdn.microsoft.com/en-us/library/bb933978.aspx">STLength</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl28" href="http://msdn.microsoft.com/en-us/library/bb933910.aspx">STNumGeometries</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl29" href="http://msdn.microsoft.com/en-us/library/bb933845.aspx">STNumInteriorRing</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl30" href="http://msdn.microsoft.com/en-us/library/bb933916.aspx">STNumPoints</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl31" href="http://msdn.microsoft.com/en-us/library/bb933817.aspx">STOverlaps</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl32" href="http://msdn.microsoft.com/en-us/library/bb933908.aspx">STPointN</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl33" href="http://msdn.microsoft.com/en-us/library/bb933826.aspx">STPointOnSurface</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl34" href="http://msdn.microsoft.com/en-us/library/bb933915.aspx">STRelate</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl35" href="http://msdn.microsoft.com/en-us/library/bb933851.aspx">STSrid</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl36" href="http://msdn.microsoft.com/en-us/library/bb933804.aspx">STStartPoint</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl37" href="http://msdn.microsoft.com/en-us/library/bb933820.aspx">STSymDifference</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl38" href="http://msdn.microsoft.com/en-us/library/bb933953.aspx">STTouches</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl39" href="http://msdn.microsoft.com/en-us/library/bb933850.aspx">STUnion</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl40" href="http://msdn.microsoft.com/en-us/library/bb933991.aspx">STWithin</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl41" href="http://msdn.microsoft.com/en-us/library/bb933828.aspx">STX</a></li>
<li><a id="ctl00_MainContent_ctl54_ctl00_ctl42" href="http://msdn.microsoft.com/en-us/library/bb933990.aspx">STY</a></li>
</ul>
<p>Estes métodos podem ser chamados da seguinte forma, por exemplo:</p>
<pre class="brush: plain;">

SELECT coluna1.STArea() FROM tabela
</pre>
<p>onde <tt>coluna1</tt> é do tipo <em>geometry</em>.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server" rel="bookmark" title="10 de março de 2010">Inserindo registros geoespaciais: ArcSDE e SQL Server</a></li>
<li><a href="http://seiti.eti.br/blog/2009/arcsde-e-ms-sql-server-2008" rel="bookmark" title="23 de outubro de 2009">ArcSDE e MS SQL Server 2008</a></li>
<li><a href="http://seiti.eti.br/blog/2009/arcgis-javascript-dojo-e-o-metodo-require" rel="bookmark" title="16 de setembro de 2009">ArcGIS Javascript, Dojo e o método require</a></li>
<li><a href="http://seiti.eti.br/blog/2008/sig-sistema-de-informacao-geografica" rel="bookmark" title="23 de abril de 2008">SIG &#8211; Sistema de Informação Geográfica</a></li>
</ul>
<p><!-- Similar Posts took 8.017 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/l-w8lh4QefatD8A1CRVTrcrYjSY/0/da"><img src="http://feedads.g.doubleclick.net/~a/l-w8lh4QefatD8A1CRVTrcrYjSY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/l-w8lh4QefatD8A1CRVTrcrYjSY/1/da"><img src="http://feedads.g.doubleclick.net/~a/l-w8lh4QefatD8A1CRVTrcrYjSY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/Q04vR7Lyy-I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/funcoes-geoespaciais-do-ms-sql-server-2008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/funcoes-geoespaciais-do-ms-sql-server-2008</feedburner:origLink></item>
		<item>
		<title>Lua de Mel em Natal – Rio Grande no Norte</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/VuV1XUA80g8/lua-de-mel-em-natal-rio-grande-no-norte</link>
		<comments>http://seiti.eti.br/blog/2010/lua-de-mel-em-natal-rio-grande-no-norte#comments</comments>
		<pubDate>Fri, 12 Mar 2010 16:55:29 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[vida®]]></category>
		<category><![CDATA[lua de mel]]></category>
		<category><![CDATA[viagem]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1086</guid>
		<description><![CDATA[Em uma de minhas poucas viagens para fora de SP, fui conhecer em lua de mel, com minha querida esposa,  Natal  &#8211; RN. A cidade possui praias lindas. Mesmo quem, como eu, não costuma mergulhar ou se banhar nas àguas &#8230; <a href="http://seiti.eti.br/blog/2010/lua-de-mel-em-natal-rio-grande-no-norte">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Em uma de minhas poucas viagens para fora de SP, fui conhecer em <em>lua de mel</em>, com minha querida esposa,  <strong>Natal  &#8211; RN</strong>.</p>
<p>A cidade possui praias lindas. Mesmo quem, como eu, não costuma mergulhar ou se banhar nas àguas do mar, não se cansa de admirar o visual. Areias claras contrastando com o um mar esverdeado brilhante,  com o céu azul  e límpido. Parecia que havia um photoshop em ação sobre minha visão.</p>
<h3>Divi-Divi</h3>
<div class="wp-caption alignnone" style="width: 510px"><a title="Adeus, dividivi by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4416668133/"><img title="Divi-Divi" src="http://farm3.static.flickr.com/2743/4416668133_11cbdfec19.jpg" alt="Adeus, dividivi" width="500" height="374" /></a><p class="wp-caption-text">Bar e psicina do Divi-Divi</p></div>
<p>Ficamos no hotel <a href="http://www.dividivi.com.br/"><em>Divi-Divi</em></a>, que apesar de pequeno, tinha o quarto e banheiros bem grandes. Duas piscinas — uma delas é aí na foto — e um jardim pequeno, mas bem colorido, cercando o bar.</p>
<h3>Ponta Negra</h3>
<div class="wp-caption alignnone" style="width: 510px"><a title="Morro do careca by Ricαrdo, on Flickr" href="http://www.flickr.com/photos/ricardor/3263586951/"><img title="Morro do Careca" src="http://farm1.static.flickr.com/239/3263586951_e5f4538515.jpg" alt="Morro do careca" width="500" height="336" /></a><p class="wp-caption-text">Vista para o Morro do Careca</p></div>
<p>O hotel fica na praia de Ponta-Negra, que me parece ser a porta de  entrada para os turistas. Possui <strong>vários</strong> hotéis, pousadas,  restaurantes, bares.</p>
<p>É nela que se encontra um dos cartões postais de Natal: o Morro do Careca. Antigamente faziam o <em>ski-bunda</em> para descer pelo morro, mas hoje a prática é proibida, mesmo subir o morro é proibido. Parece que a movimentação estava destruindo o morro, com a areia toda descendo morro abaixo.</p>
<p>A praia é bem urbanizada, tendo pela orla um calçadão correndo ao lado da rua. Durante a noite ela é bem iluminada, cheia de casais sentados nos bancos,  <span style="text-decoration: line-through;">se pegando</span> namorando. Apesar de alertas dos guias locais quanto à segurança e tudo mais, achei a praia bem calma para passear durante a noite. E anoitece bem rápido por lá: às 18 horas o céu já está escuro.</p>
<p>Durante o dia vários quiosques, restaurantes, bares e ambulantes.  Mas com a citada urbanização surgem <strong>os problemas</strong> que te impedem de relaxar.  A todo momento alguém te oferece alguma coisa, pede dinheiro, e, o pior e mais irritante,  os <strong>carrinhos de som</strong> . Estes carrinhos são empurrados pela areia, tocando invariavelmente alguma música que você não suporta, em um volume que você não agüenta. E existem <strong>VÁRIOS</strong> deles. Em um dia em que fui aproveitar a praia durante o dia, estacionaram uns três carrinhos logo ao lado, tocando algo que ainda escuto em meus pesadelos. Ok, forcei a barra, mas era duro de agüentar.</p>
<p>Outro problema era andar pelo calçadão. Deve-se tomar cuidado para não ser atropelado por ciclistas e motociclistas que correm entre os pedestres. Quase me levaram o braço. E, pelo que percebi, geralmente os motociclistas são entregadores, levando produtos para os quiosques e quase atropelando seus clientes.</p>
<p>Pensando bem, parecia uma praia de SP, mas com um visual lindo e águas limpas. Bom, mas se quiser sossego o jeito é ir para as outras praias da cidade.</p>
<h3>Passeios</h3>
<p>As agências oferecem vários passeios. Eu não fiz todos, na verdade não fechei quase nenhum pacote. Mas um que fechei e recomendo é o passeio de<strong><em> buggy</em></strong>.<strong><em> </em></strong>O buggy te leva desde a porta do hotel até a praia de Muriú (se não me engano), passando pela Via Costeira, pelo parque das Dunas e outras praias do litoral norte.</p>
<p>Em meio às Dunas tinham até dromedários, que podem ser montados caso você se disponha a gastar R$30 reais (nem só o mar é salgado). Muitos turistas se contentam em tirar fotos.</p>
<p>Outro passeio foi o <strong>City Tour</strong>, que passa pelo centro histórico da cidade e depois vai em visita ao maior cajueiro do mundo, uma anomalia genética que se estenderá por todo o planeta, ao lado da praia de Pirangi. Na praia fica a marina Badauê, que oferce passeio de barco e mergulho em piscinas naturais.</p>
<p>Na praia optei por não comer no resturante da marina, querendo experimentar o peixe preparado numa barraca na praia. O peixe estava bom, acompanhado de arroz e fritas.</p>
<p>Aliás, uma das coisas que mais fiz por lá foi comer. Comer camarão. Natal é a capital do camarão, sendo a principal exportadora do crustáceo no país &#8211; a &#8220;plantação&#8221; de camarões é chamada <strong>carcinicultura</strong>. E, comparando com São Paulo, o camarão lá é barato e sempre fresco. Para quem adora, como eu, dá para aproveitar para comer todo dia.</p>
<p>Outro passeio que eu queria experimentar era de ver  o <strong>pôr do Sol em João Pessoa, ao som do <a href="http://www.kickassclassical.com/classical-music-popular-famous-best-composers-a-z.html#Ravel">bolero de Ravel</a></strong>. Opa, João Pessoa? Também achei estranho que um dos passeios mais oferecidos na região fosse de ir para a capital do estado vizinho. Deve ser bacana mesmo! Mas eu não quis fechar pacote (economizar para comer camarão!) e pegamos um dia para alugar um carro e ir pro litoral Sul.</p>
<p>Passamos primeiro na praia de  <strong>Tibau do Sul</strong>. Lá um garoto, um dos guias mirins da região, se ofereceu para nos levar para a praia de Pipa.  Aliás, este garoto contava umas histórias muito curiosas. Ao chegar na gente, ele disse ser amigo do Sérgio, da locadora em que alugamos o carro.  Super simpático, disse que às vezes passeava com o Sérgio e tudo mais.  Após darmos uma volta pela praia e tomar uma água de coco, aceitamos a  oferta e pegamos o carro e o garoto em direção à praia de <strong>Cacimbinha</strong> e <strong>Ponta  da Madeira</strong>.</p>
<p>Não lembro bem em qual delas é preciso descer uma escadaria de madeira. Deve ser a Ponta da <em>Madeira</em>, acho. Só sei que se não fosse o garoto eu teria passado direto por esta praia. E perdido a bela paisagem.  A entrada é direto pela estrada, por um portão estreito em um muro. Estranho, mas verdade. Tiramos fotos, demos outra volta, olhamos de longe a <strong>Praia do Amor</strong> e  rumamos para <strong>Pipa</strong>, afinal, teríamos de estar em João Pessoa <strong>antes</strong> do anoitecer.  E na viagem a gente ia conversando, e o menino disse saber falar várias línguas, por conta do bico de guia.  Até já tinha tinha ido para a Suíça para a casa da tia. Mas lá era  chato e ele preferia o Brasil.</p>
<p>Chegamos a última praia em nosso roteiro. Todas as praias são lindas, e Pipa não é exceção. Mas Pipa é mais badalada, tem um cidadezinha antes da praia que se parece com um vilarejo rústico. E <strong>é</strong> um vilarejo rústico, a não ser por várias lojas de moda praia, decoração presentes etc, que se encontram por lá, além de restaurantes e café, que pareciam bem caros.</p>
<p>Bom, demos uma volta, tiramos umas fotos, cortei a sola do pé nas pedras da praia, comemos alguns pastéis, largamos o garoto na saída da cidade e zarpamos para Paraíba. Pelo caminho ainda acompanhamos a orla de algumas praias, uma mais linda que a outra. Durante a viagem a gente ia acompanhando o sol já descendo no horizonte&#8230; Será que vai dar tempo?</p>
<h3>Rumo a Paraíba</h3>
<p>Seguindo placas finalmente chegamos em João Pessoa. Restava achar o <strong>pôr do Sol</strong>. A informação que tínhamos era que existia, em João Pessoa, um pôr do Sol ao som do bolero de Ravel. Onde? Paramos num posto e perguntamos ao frentista:</p>
<p>- Onde a gente consegue ver o pôr do Sol ao som do bolero de Ravel?</p>
<p>E ele responde de bate pronto:</p>
<p>- Em Cabedelo, é só seguir adiante e ir vendo as placas.</p>
<p>Parecia um diálogo cifrado do Agente 86&#8230;</p>
<p>E com Sol já meio baixo, rumamos para Cabedelo. Chegando em Cabedelo me lembrei de um tal de praia do Jacaré, onde ficava o pôr do Sol. E fizemos um retorno seguindo para a praia do Jacaré. Chegamos! Uns 15 minutos antes do Sol ir embora. E o mistério de ver o pôr do Sol na praia, no Brasil, foi desvendado. A gente assistiu o Sol se pondo na margem oposta do Rio Jacaré.  Com o Jurandy do Sax tocando o bolero de Ravel, com a última nota sendo lançada no momento do último brilho do Sol.  Espetacular!</p>
<p style="text-align: center;"><a title="Pôr do Sol na praia do Jacaré by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4660463025/"><img class="aligncenter" src="http://farm5.static.flickr.com/4055/4660463025_25bbf42ae6.jpg" alt="Pôr do Sol na praia do Jacaré" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Pôr do Sol na praia do Jacaré by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4661086678/"><img class="aligncenter" src="http://farm5.static.flickr.com/4036/4661086678_83fd00be2b.jpg" alt="Pôr do Sol na praia do Jacaré" width="500" height="375" /></a></p>
<p>Depois da epopéia de um dia, voltamos para descansar em Natal. No dia seguinte devolvemos o carro e descobrimos que o garoto, guia mirim, era paieiro. Não conhecia Sérgio nenhum e que na verdade todos os guias mirins da cidade conheciam de cor os carros de locadoras, inclusive sabendo a placa e de que locadora era, inclusive o nome das pessoas responsáveis pelas locadoras. o.O</p>
<p>E a história de vários idiomas e ter ido para a Suíca? Mistério&#8230;</p>
<h3>Restaurantes</h3>
<p>Comer é viver, e vice-versa. Então relaciono os lugares em que comi:</p>
<ul>
<li><em><a href="http://www.camaroes.com.br/">Camarões</a></em> e <em>Camarões &#8211; Potiguar</em> &#8211; EXCELENTE:  ótimos restaurantes,  comida muito boa, assim como o atendimento. O preço é razoável, mas pensando num restaurante do mesmo nível em  Sampa, fica barato. Se puder comer fora apenas uma vez quando estiver na cidade, coma em algum deles. Mas escolha mesa para não-fumante. A proibição só existe em São Paulo!</li>
<li><em>O Peixe</em> -  BOM: prato bom e bem servido por um preço camarada. Fica ao lado do restaurante Camarões. Muito bom para comer camarão no almoço sem esvaziar (muito) a carteira. Encher a barriga de camarão ficou em torno de 30 ~40 reais para o casal.</li>
<li><em>Taiyo</em> -BOM: comida japonesa, passei lá para jantar e comer um teppan de, adivinhe. Isso, <strong>camarão</strong>. Muito boa comida e os donos são excelentes pessoas, daquelas de passar a noite toda conversando, mesmo sendo a primeira vez que encontra na vida.</li>
<li><em>Divi Divi</em> &#8211; BOM: o restaurante do próprio hotel em que fiquei também tinha uma comida muito boa . O preço ficava na média da região.</li>
<li><em>Terra do Camarão</em> &#8211; BOM para RUIM: este oferecia um rodízio de camarão.  Tinha desde estrogonofe de camarão até espaguete ao sugo com camarão, camarão frito e tudo mais.  Alguns pratos eram bons. Por exempo,  o caldinho estava uma delícia, assim como o bobó. Mas alguns pecavam e não tinham muito gosto, como o espaguete e outros cheios de óleo, como o à francesa. Pelo preço achei que não compensou.</li>
<li><em><a href="http://www.paradaobrigatorianatal.com.br/">Parada Obrigatória</a></em> &#8211; RUIM: atendimento muito demorado, mesmo considerando o ta<em>lento</em> da região. E meio ríspido também. A comida também deixou a desejar. Existem muito lugares para comer na cidade. Pule este.</li>
<li><em>Pittsburg</em> &#8211; RAZOÁVEL: nem toda refeição pode ter camarão. Esta é uma hamburgueria estilo McDonalds, Bobs etc.  Enfim, a comida da minha terrinha: fast food. Mas pelo menos pedi uma porção de macaxeira frita, ao invés das batatas de sempre.</li>
<li>Pastelaria na Praia de Pipa &#8211; BOM: lá comi um pastel que nunca tinha experimentado. Pastel de lagosta. Era a carne de lagosta desfiada, recheando bem um pastel frito na hora. Nipônico de São Paulo,  já comi muitos pastéis nesta vida, e os da praia estavam apenas ok. Mas vale a pena pelos recheios: lagosta, caranguejo etc.</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/cwfpcpK2QCGkmaI4Z2NNTnnY4Vg/0/da"><img src="http://feedads.g.doubleclick.net/~a/cwfpcpK2QCGkmaI4Z2NNTnnY4Vg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/cwfpcpK2QCGkmaI4Z2NNTnnY4Vg/1/da"><img src="http://feedads.g.doubleclick.net/~a/cwfpcpK2QCGkmaI4Z2NNTnnY4Vg/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/VuV1XUA80g8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/lua-de-mel-em-natal-rio-grande-no-norte/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/lua-de-mel-em-natal-rio-grande-no-norte</feedburner:origLink></item>
		<item>
		<title>Inserindo registros geoespaciais: ArcSDE e SQL Server</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/FgTUofcHzts/inserindo-registro-geoespaciais-arcsde-e-sql-server</link>
		<comments>http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server#comments</comments>
		<pubDate>Wed, 10 Mar 2010 21:13:34 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[geo]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1070</guid>
		<description><![CDATA[Inserir registros diretamente através de comandos SQL é bem simples. Note que estou usando como tipo de dado geoespacial o GEOMETRY, nativo do SQL Server 2008. Primeiro  é necessário criar uma tabela no SQL Server e registrá-la junto ao ArcSDE. &#8230; <a href="http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Inserir registros diretamente através de comandos SQL é bem simples. Note que estou usando como tipo de dado geoespacial o <a href="http://seiti.eti.br/blog/2009/arcsde-e-ms-sql-server-2008">GEOMETRY</a>, nativo do SQL Server 2008.</p>
<p>Primeiro  é necessário criar uma tabela no SQL Server e registrá-la junto ao ArcSDE. Isto é bem simples de se realizar utilizando o ArcCatalog (note que também dá para se criar a tabela via SQL e registrá-la no ArcSDE via linha de comando).  Basta entrar no ArcCatalog, conectar-se com sua instância do ArcSDE e clicar com o botão direito no ícone do banco de dados. Depois é só escolher o <em>Feature Class</em>:</p>
<div class="wp-caption aligncenter" style="width: 343px"><a title="Feature Class by Seiti Yamashiro, on Flickr" href="http://www.flickr.com/photos/seiti/4423382146/"><img title="Criando um Feature Class" src="http://farm5.static.flickr.com/4068/4423382146_547ffd9792.jpg" alt="Feature Class" width="333" height="376" /></a><p class="wp-caption-text">Criando um Feature Class</p></div>
<p>É apresentada então uma caixa de diálogo para criar sua tabela que conterá sua feição. Criei uma tabela chamada <em>MeuFeatureClass</em>. As colunas <strong>OBJECTID</strong> e <strong>SHAPE</strong> são criadas por padrão. Adicionei um <strong>campo1</strong> e um <strong>campo2</strong> também. E escolhi o tipo da geometria como <em>POINT</em>.</p>
<p>Criada a tabela é bem simples de se inserir um registro através de comando SQL:</p>
<pre class="brush: plain;">
INSERT INTO
MeuBD.sde.MeuFeatureClass
(OBJECTID, campo1, campo2, shape)
VALUES
(1, valor1, valor2, geometry::STGeomFromText('POINT (-46.616667 -23.533333)', 4674))
</pre>
<p>O comando acima insere um registro na tabela contendo um ponto localizado no município de São Paulo &#8211; SP, usando o SRID 4674 (<a href="http://seiti.eti.br/blog/2010/sirgas-2000">SIRGAS 2000</a>).</p>
<p>Note que não usamos uma função típica do T-SQL  para transformar o texto dado em uma coordenada válida pro sistema.  Isto me deixou confuso no início, pois eu não encontrava funções geoespaciais no banco de dados. Liste as funções existentes no banco de dados do ArcSDE que oê não encontrará nada relacionado ao sistema geo.</p>
<p>Estas funções ficam disponíveis como métodos da classe e objetos  <strong><em>geometry</em></strong>.  No caso acima, o <tt>STGeomFromText</tt> é um método estático da classe <tt>geometry</tt>. Os mundos da Orientação a Objetos e do SQL se mesclam cada vez mais&#8230;
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/arcsde-e-ms-sql-server-2008" rel="bookmark" title="23 de outubro de 2009">ArcSDE e MS SQL Server 2008</a></li>
<li><a href="http://seiti.eti.br/blog/2010/funcoes-geoespaciais-do-ms-sql-server-2008" rel="bookmark" title="12 de março de 2010">Funções Geoespaciais do MS SQL Server 2008</a></li>
<li><a href="http://seiti.eti.br/blog/2008/sig-sistema-de-informacao-geografica" rel="bookmark" title="23 de abril de 2008">SIG &#8211; Sistema de Informação Geográfica</a></li>
<li><a href="http://seiti.eti.br/blog/2010/cache-camadas-no-arcgis-server" rel="bookmark" title="8 de fevereiro de 2010">Cache e camadas no ArcGIS Server</a></li>
</ul>
<p><!-- Similar Posts took 12.018 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/obpibdv94LT3Jgf540KTdqAIcOc/0/da"><img src="http://feedads.g.doubleclick.net/~a/obpibdv94LT3Jgf540KTdqAIcOc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/obpibdv94LT3Jgf540KTdqAIcOc/1/da"><img src="http://feedads.g.doubleclick.net/~a/obpibdv94LT3Jgf540KTdqAIcOc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/FgTUofcHzts" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server</feedburner:origLink></item>
		<item>
		<title>Cache e camadas no ArcGIS Server</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/EqdeVcklM1A/cache-camadas-no-arcgis-server</link>
		<comments>http://seiti.eti.br/blog/2010/cache-camadas-no-arcgis-server#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:59:30 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[arcgis]]></category>
		<category><![CDATA[gis]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=956</guid>
		<description><![CDATA[Estou trabalhando com o ArcGIS Server 9.3.1 e tenho de inserir alguns serviços nele. Cada serviço corresponde à uma camada, ou  layer, em meu mapa. Para melhorar o  desempenho &#8211; sofrível se comparado com o MapServer &#8211; existe uma opção &#8230; <a href="http://seiti.eti.br/blog/2010/cache-camadas-no-arcgis-server">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estou trabalhando com o ArcGIS Server 9.3.1 e tenho de inserir alguns serviços nele. Cada serviço corresponde à uma camada, ou <em> layer</em>, em meu mapa.</p>
<p>Para melhorar o  desempenho &#8211; sofrível se comparado com o <a href="http://mapserver.org/">MapServer</a> &#8211; existe uma opção para a utilização de <em>cache</em> no ArcGIS Server que funciona bem. Ao invés do servidor ter de reconstruir a imagem, toda vez que ela é requisitada, ele gera esta imagem apenas uma vez, grava em algum lugar e depois apenas a repassa para o servidor de aplicação.</p>
<p>Isto gerou um problema. Quando as imagens era geradas dinamicamente, havia a possibilidade do ArcGIS Server reprojetar e/ou reposicionar o mapa para  combiná-la com todos os layers.  Se um serviço usa EPSG:<a href="http://spatialreference.org/ref/epsg/4618/">4618</a> e outro usa <a href="http://spatialreference.org/ref/sr-org/95/">SR-ORG:95</a>,  por exemplo. Mas com o uso do cache, a imagem criada possui apenas o sistema de referenciamento definida no serviço, não podendo mudar.</p>
<p>Assim, ao combinar dois layers cujos sistemas de referenciamento espacial são diferentes, temos as seguintes situações:</p>
<ul>
<li>Os dois layers são dinâmicos:  um sistema é escolhido e os dois layers utilizam este;</li>
<li>Um dos layers é dinâmico e o outro possui cache: o dinâmico é projetado/adaptado ao sistema do que tem cache;</li>
<li>Os dois layers usam cache: apenas um deles é exibido. Não há reprojeção.</li>
</ul>
<p>O ideal então é manter um único sistema de referenciamento espacial nos serviços. E aproveitar para deixar todos no <a href="http://seiti.eti.br/blog/2010/sirgas-2000">SIRGAS2000</a>.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/arcgis-javascript-dojo-e-o-metodo-require" rel="bookmark" title="16 de setembro de 2009">ArcGIS Javascript, Dojo e o método require</a></li>
<li><a href="http://seiti.eti.br/blog/2010/sirgas-2000" rel="bookmark" title="27 de janeiro de 2010">SIRGAS 2000</a></li>
<li><a href="http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial" rel="bookmark" title="18 de janeiro de 2010">Sistema de Referenciamento Espacial</a></li>
<li><a href="http://seiti.eti.br/blog/2008/sig-sistema-de-informacao-geografica" rel="bookmark" title="23 de abril de 2008">SIG &#8211; Sistema de Informação Geográfica</a></li>
</ul>
<p><!-- Similar Posts took 9.369 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/TXSGuwcybVV4ixAnIUxV3zopE_c/0/da"><img src="http://feedads.g.doubleclick.net/~a/TXSGuwcybVV4ixAnIUxV3zopE_c/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TXSGuwcybVV4ixAnIUxV3zopE_c/1/da"><img src="http://feedads.g.doubleclick.net/~a/TXSGuwcybVV4ixAnIUxV3zopE_c/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/EqdeVcklM1A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/cache-camadas-no-arcgis-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/cache-camadas-no-arcgis-server</feedburner:origLink></item>
		<item>
		<title>Carregando bibliotecas Javascript abertas</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/c2N4_t8y0is/carregando-bibliotecas-javascript-abertas</link>
		<comments>http://seiti.eti.br/blog/2010/carregando-bibliotecas-javascript-abertas#comments</comments>
		<pubDate>Fri, 05 Feb 2010 15:49:34 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=44</guid>
		<description><![CDATA[Ext, jQuery, prototype, MooTools, Dojo, scrip.taculo.us, YUI. São algumas das feras que um desenvolvedor web tem de enfrentar, no caminho para matar o Dragão. Algo que pode ajudar nesta tarefa é usar a própria API Google para carregar estas outras &#8230; <a href="http://seiti.eti.br/blog/2010/carregando-bibliotecas-javascript-abertas">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ext, jQuery, prototype, MooTools, Dojo, scrip.taculo.us, YUI. São algumas das feras que um desenvolvedor web tem de enfrentar, no caminho para <a href="http://www.scribd.com/doc/320372/How-to-kill-a-Dragon-with-Programming">matar o Dragão</a>.</p>
<p>Algo que pode ajudar nesta tarefa é usar a própria API Google para carregar estas outras APIs:</p>
<p><a href="http://code.google.com/apis/ajaxlibs/">http://code.google.com/apis/ajaxlibs/</a></p>
<p>O código, retirado direto do site, é o seguinte:</p>
<pre class="brush: plain;">
// Load Google JS API
&lt;script src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
&lt;script&gt;
// Load jQuery
google.load(&quot;jquery&quot;, &quot;1&quot;);
&lt;/script&gt;
</pre>
<p>Você simplesmente:</p>
<ul>
<li>carrega a API javascript do Google;</li>
<li>utiliza a API do Google para carregar as outras APIs, podendo escolher a versão, inclusive.</li>
</ul>
<p>A opção de escolher a versão do script ajuda bastante a manter seus sistemas atualizados de forma bem simples.</p>
<p>O problema é apenas não poder guardar as APIs no servidor. Em uma rede local sem acesso à internet, por exemplo, isto já não serve.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/arcgis-javascript-dojo-e-o-metodo-require" rel="bookmark" title="16 de setembro de 2009">ArcGIS Javascript, Dojo e o método require</a></li>
<li><a href="http://seiti.eti.br/blog/2009/ext-js" rel="bookmark" title="12 de maio de 2009">Ext JS</a></li>
<li><a href="http://seiti.eti.br/blog/2009/type-casting-no-javascript" rel="bookmark" title="11 de maio de 2009">Type &#8220;casting&#8221; no Javascript</a></li>
<li><a href="http://seiti.eti.br/blog/2008/campo-datefield-em-um-formulario-extjs" rel="bookmark" title="24 de julho de 2008">Campo DateField em um formulário ExtJS</a></li>
</ul>
<p><!-- Similar Posts took 6.244 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/FXWKHh-ffTSX6LlIhTKtp7z4bHs/0/da"><img src="http://feedads.g.doubleclick.net/~a/FXWKHh-ffTSX6LlIhTKtp7z4bHs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FXWKHh-ffTSX6LlIhTKtp7z4bHs/1/da"><img src="http://feedads.g.doubleclick.net/~a/FXWKHh-ffTSX6LlIhTKtp7z4bHs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/c2N4_t8y0is" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/carregando-bibliotecas-javascript-abertas/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/carregando-bibliotecas-javascript-abertas</feedburner:origLink></item>
		<item>
		<title>Bluebirds.exe ??</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/Fjs3mKkERrs/bluebirds-exe</link>
		<comments>http://seiti.eti.br/blog/2010/bluebirds-exe#comments</comments>
		<pubDate>Wed, 27 Jan 2010 19:37:19 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[cacarecos]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=749</guid>
		<description><![CDATA[Em minha última montagem de PC, acabei comprando um gravador de DVD, desses comuns, da LG. Instalado o sistema operacional, e configurada a conexão com a internet, removi o DVD de instalação do SO. Foi quando notei que uma mídia &#8230; <a href="http://seiti.eti.br/blog/2010/bluebirds-exe">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Em minha última montagem de PC, acabei comprando um gravador de DVD, desses comuns, da LG.</p>
<p>Instalado o sistema operacional, e configurada a conexão com a internet, removi o DVD de instalação do SO. Foi quando notei que uma mídia ainda era detectada, mesmo não havendo disco algum no drive.  E além de tudo ainda apresentava um executável no autorun.</p>
<p>Muito estranho! Não tem disco <strong>nenhum</strong> no drive e o sistema me diz que tem, e ainda por cima pede para executar um tal de <strong>Bluebirds.exe</strong>?  Já teria pego um vírus?</p>
<p>Na verdade se tratava do firmware do drive, que, quando vazio, achava por bem simular  um disco de instalação de software.  Daqueles que vem junto do drive e você usa de porta-copo ou de frisbee.</p>
<p>A solução é atualizar o firmware. É só baixar e executar:</p>
<p><a href="http://www.lge.com/us/support/product/support-product-profile.jsp?customerModelCode=GH22NS50">http://www.lge.com/us/support/product/support-product-profile.jsp?customerModelCode=GH22NS50</a></p>
<p>Pronto. Seu drive vazio continuará vazio.</p>
<p>Referência: <a href="http://www.msfn.org/board//index.php?act=ST&amp;f=5&amp;t=135300">http://www.msfn.org/board//index.php?act=ST&amp;f=5&amp;t=135300</a>
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2008/impressora-lexmark-z645-no-ubuntu-linux" rel="bookmark" title="2 de dezembro de 2008">Impressora Lexmark Z645 no Ubuntu Linux</a></li>
<li><a href="http://seiti.eti.br/blog/2009/roteador-3com-3crwer101u" rel="bookmark" title="18 de maio de 2009">Roteador 3Com 3CRWER101U</a></li>
</ul>
<p><!-- Similar Posts took 4.469 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/MEn7Cum3OHgmZnuDRusodh9JUEs/0/da"><img src="http://feedads.g.doubleclick.net/~a/MEn7Cum3OHgmZnuDRusodh9JUEs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/MEn7Cum3OHgmZnuDRusodh9JUEs/1/da"><img src="http://feedads.g.doubleclick.net/~a/MEn7Cum3OHgmZnuDRusodh9JUEs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/Fjs3mKkERrs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/bluebirds-exe/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/bluebirds-exe</feedburner:origLink></item>
		<item>
		<title>SIRGAS 2000</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/1G9wkRK9zAw/sirgas-2000</link>
		<comments>http://seiti.eti.br/blog/2010/sirgas-2000#comments</comments>
		<pubDate>Wed, 27 Jan 2010 16:50:32 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[gis]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=951</guid>
		<description><![CDATA[Antes Sistema de Referencia Geocéntrico para America del Sur e agora Sistema de Referencia Geocéntrico para las Américas, o SIRGAS é o sistema de referenciamento espacial padrão do Brasil, definido pelo IBGE. Seu SRID, num sistema geográfico, é  EPSG:  4674: &#8230; <a href="http://seiti.eti.br/blog/2010/sirgas-2000">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Antes <em>Sistema de Referencia Geocéntrico para America del Sur</em> e agora <em>Sistema de Referencia Geocéntrico para las Américas</em>, o <a href="http://www.sirgas.org">SIRGAS</a> é o <a href="http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial">sistema de referenciamento espacial</a> padrão do Brasil, definido pelo <a href="http://www.ibge.gov.br/sirgas/">IBGE</a>.</p>
<p>Seu SRID, num<a href="http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial"> sistema geográfico</a>, é  <a href="http://www.spatialreference.org/ref/epsg/4674/">EPSG:  4674</a>:</p>
<pre class="brush: plain;">
GEOGCS[&quot;SIRGAS 2000&quot;,
    DATUM[&quot;Sistema_de_Referencia_Geocentrico_para_America_del_Sur_2000&quot;,
        SPHEROID[&quot;GRS 1980&quot;,6378137,298.257222101,
            AUTHORITY[&quot;EPSG&quot;,&quot;7019&quot;]],
        TOWGS84[0,0,0,0,0,0,0],
        AUTHORITY[&quot;EPSG&quot;,&quot;6674&quot;]],
    PRIMEM[&quot;Greenwich&quot;,0,
        AUTHORITY[&quot;EPSG&quot;,&quot;8901&quot;]],
    UNIT[&quot;degree&quot;,0.01745329251994328,
        AUTHORITY[&quot;EPSG&quot;,&quot;9122&quot;]],
    AUTHORITY[&quot;EPSG&quot;,&quot;4674&quot;]]
</pre>
<p>Na prática o SIRGAS utiliza <strong>o mesmo</strong> elipsóde de referência do WGS84 &#8211; <em>GRS 1980</em>. Veja mais no <a href="http://www6.ufrgs.br/engcart/Teste/refer_exp.html">site da UFRGS</a>. O mesmo ocorre com o <strong>posicionamento</strong> do elipsóide, com seus centros situando-se bem próximos um do outro.</p>
<p>Isto significa que as medidas dados pelo SIRGAS são quase iguais aos dados pelo WGS84,  onde uma diferença entre as medidas pode ser menor que o erro aproximado de seu instrumento GPS, pois esta diferença está na ordem de centímetros.</p>
<p>Assim, se seu equipamento for antigo é bem provável que ocorram duas coisas:</p>
<ul>
<li>ele não tenha uma precisão tão boa a ponto de se distinguir entre WGS84 e SIRGAS 2000;</li>
<li>ele não possua o SIRGAS 2000 em seu rol de referências.</li>
</ul>
<p>Então use o WGS84 e seja feliz.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial" rel="bookmark" title="18 de janeiro de 2010">Sistema de Referenciamento Espacial</a></li>
<li><a href="http://seiti.eti.br/blog/2008/sig-sistema-de-informacao-geografica" rel="bookmark" title="23 de abril de 2008">SIG &#8211; Sistema de Informação Geográfica</a></li>
<li><a href="http://seiti.eti.br/blog/2009/arcsde-e-ms-sql-server-2008" rel="bookmark" title="23 de outubro de 2009">ArcSDE e MS SQL Server 2008</a></li>
<li><a href="http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server" rel="bookmark" title="10 de março de 2010">Inserindo registros geoespaciais: ArcSDE e SQL Server</a></li>
</ul>
<p><!-- Similar Posts took 8.961 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/VaFNbubxinVTHrkTTixecG1Z_ZA/0/da"><img src="http://feedads.g.doubleclick.net/~a/VaFNbubxinVTHrkTTixecG1Z_ZA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VaFNbubxinVTHrkTTixecG1Z_ZA/1/da"><img src="http://feedads.g.doubleclick.net/~a/VaFNbubxinVTHrkTTixecG1Z_ZA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/1G9wkRK9zAw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/sirgas-2000/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/sirgas-2000</feedburner:origLink></item>
		<item>
		<title>Sistema de Referenciamento Espacial</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/hHLHeWWakeA/sistema-de-referenciamento-espacial</link>
		<comments>http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial#comments</comments>
		<pubDate>Mon, 18 Jan 2010 20:19:09 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[gis]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=934</guid>
		<description><![CDATA[Spatial Reference System,  ou Sistema de Referenciamento Espacial, define como descrever uma posição, uma localização no espaço. Para determinarmos essa posição precisamos de duas coisas: um ponto de referência e um sistema de coordenadas. Datum Para descrever esta localização temos &#8230; <a href="http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Spatial Reference System</em>,  ou Sistema de Referenciamento Espacial, define como descrever uma posição, uma localização no espaço.</p>
<p>Para determinarmos essa posição precisamos de duas coisas: um ponto de referência e um sistema de coordenadas.</p>
<h2><em>Datum</em></h2>
<p>Para descrever esta localização temos de levar em conta algumas coisas. Primeiro, a Terra não é plana. Verdade. E nem uma bola.  Mas podemos aproximar sua superfície à algumas formas geométricas.  A primeira que vem à mente é a <strong>esfera</strong>. É boa para se montar globos escolares e pintar os continentes em  bolas de  praia. Mas, como aprendemos na escolinha, a Terra é achatada nos pólos. Mas a aproximação com a esfera serve para qualquer coisa que conte com uma escala pequena.</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 390px"><a href="http://pt.wikipedia.org/wiki/Ficheiro:GEO_Globe.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/9/9f/GEO_Globe.jpg" alt="" width="380" height="400" /></a><p class="wp-caption-text">Globo terrestre</p></div>
<p>Segue então uma segunda aproximação: um <strong>elipsóide ou esferóide</strong>. Ou uma esfera achatada.  Esta forma geométrica é bastante utilizada para descrever a superfície do planeta,  parte por facilitar bastante os cálculos envolvidos e parte por se adequar razoavelmente à superfície verdadeira da Terra. Para obter um grau maior de aproximação modificamos os tamanhos dos eixos do elipsóide e também deslocamos seu centro, ajeitando-o com relação à Terra.</p>
<p>Ou seja, se a Terra fosse um esferóide perfeito, todos os pontos de sua superfície iriam tocar nos pontos do esferóide de referência.  Como isso não ocorre, a gente ajeita o esferóide, <em>definindo em que pontos</em> o esferóide toca a superfície do planeta.  Note que definição de pontos tem <em>data de validade</em>, ou pelo menos data de referência, visto que a <a href="http://pt.wikipedia.org/wiki/Deriva_continental">posição relativa entre os continentes muda com o tempo</a>. Digamos que nosso esferóide toca a superfície do planeta em um ponto específico de Pindamonhangaba e em outro em Paris. Infelizmente estes pontos não corresponderão exatamente ao mesmo local no dia seguinte. Por isso temos nomes como WGS84, SAD69. Os números se referem ao ano .</p>
<div class="wp-caption aligncenter" style="width: 393px"><a href="http://pt.wikipedia.org/wiki/Ficheiro:OblateSpheroid.PNG"><img src="http://upload.wikimedia.org/wikipedia/commons/b/b5/OblateSpheroid.PNG" alt="" width="383" height="294" /></a><p class="wp-caption-text">Esferóide</p></div>
<p>Uma outra forma é a <strong>geóide</strong>. A geóide se trata de uma figura geométrica cuja superfície possui sempre a mesma força gravitacional, correspondendo mais ou menos ao nível médio do mar. Uma esfera não rolaria para lado nenhum em cima da superfície de uma geóide. Os cálculos sobre esta figura são mais complicados, mas é uma aproximação bastante útil para analisar a construção de canais, rodovias extensas e redes de água e esgoto.</p>
<div class="wp-caption aligncenter" style="width: 500px"><a href="http://pt.wikipedia.org/wiki/Ficheiro:Geoids_sm.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/5/56/Geoids_sm.jpg" alt="" width="490" height="230" /></a><p class="wp-caption-text">Geóide</p></div>
<p>A escolha da figura geométrica, a definição de suas dimensões e o posicionamento desta figura com relação à Terra nos dá o <em><strong>datum</strong></em> (nota: só estou considerando sistema geocêntricos, deixando os topocêntricos de lado).</p>
<div class="wp-caption aligncenter" style="width: 410px"><a href="http://en.wikipedia.org/wiki/File:Sperm-egg.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/8/86/Sperm-egg.jpg" alt="" width="400" height="274" /></a><p class="wp-caption-text">Espermatozóide</p></div>
<p style="text-align: center;">
<h2>Sistema Geográfico de Coordenadas</h2>
<p>Temos um <em>datum</em>. Mas isto não basta. Precisamos de um sistema de coordenadas para localizar o que quer que seja. Para isto temos um Sistema Geográfico de Coordenadas (<em>geographic coordinate system</em> ou <strong>GCS</strong>), também conhecido como sistema <strong>esférico</strong> de coordenadas,  que inclui uma unidade de medida angular, um meridiano principal e um <em>datum</em>.</p>
<div class="wp-caption aligncenter" style="width: 330px"><a href="http://en.wikipedia.org/wiki/File:Geographic_coordinates_sphere.svg"><img class=" " src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Geographic_coordinates_sphere.svg/500px-Geographic_coordinates_sphere.svg.png" alt="" width="320" height="315" /></a><p class="wp-caption-text">Latitude (φ) e Longitude (λ)</p></div>
<p>Com o <em>datum</em>, o equador e o meridiano principal, geralmente o de <em>Greenwich</em>, conseguimos um ponto de referência,  onde φ = 0° e λ = 0°,  e o centro do esferóide, a partir do qual todas as medidas são baseadas. Só para constar, a cidade de São Paulo se encontra em <tt>23°33′0″ S, 46°38′0″ W</tt>, ou seja, latitude  <tt>-23°33′0″</tt> e longitude<tt> -46°38′0″</tt>.</p>
<h2>Sistema de Coordenadas Projetadas</h2>
<p>O GCS ajuda a localizar algum ponto. Mas para visualizar o mapa no papel, ou na tela do computador, precisamos levar tudo que está em um objeto 3D em pontos correspondentes em um plano 2D. Isto se chama <strong>projeção</strong>. A mesma projeção que se ensina nas aulas de matemática da escolinha, mas <a href="http://en.wikipedia.org/wiki/Map_projection">aplicada em nossos mapas</a>.</p>
<p>Pensando na superfície da Terra, podemos pensar em algumas características:</p>
<ul>
<li>Área</li>
<li>Forma</li>
<li>Direção</li>
<li>Posicionamento relativo</li>
<li>Distância</li>
<li>Escala</li>
</ul>
<p>Quando projetamos esta superfície em um plano, podemos preservar algumas delas. Mas não todas. Por isto existem vários tipos de projeção. Cada uma prioriza alguma das propriedades descritas. A mais famosa é a Projeção de Mercator, que privilegia direção e posicionamento relativo.</p>
<div class="wp-caption aligncenter" style="width: 474px"><a href="http://en.wikipedia.org/wiki/File:Mercator-projection.jpg"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Mercator-projection.jpg/773px-Mercator-projection.jpg" alt="" width="464" height="359" /></a><p class="wp-caption-text">Projeção de Mercator</p></div>
<p>A projeção de Mercator é do tipo cilíndrica. Pense em uma bola de tênis enfiada em uma lata de batatas Pringles.  O problema dela é que deforma bastante a área conforme nos afastamos da linha do Equador. É só reparar no tamanho da Ántártica, que não é nem o dobro da do Brasil.</p>
<p>O cilindro em que é projetado o mapa tem seu eixo na mesma direção do eixo de rotação da Terra,  ou seja, o cilindro toca a Terra ao longo da linha do Equador.</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 275px"><a href="http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?TopicName=About_map_projections"><img src="http://webhelp.esri.com/arcgisdesktop/9.2/published_images/lightbulb.gif" alt="" width="265" height="219" /></a><p class="wp-caption-text">Projeção cilíndrica</p></div>
<p>Isto nos leva à outra projeção importante: o Sistema Universal Transverso de Mercator (<strong>UTM</strong>). Ele é bastante semelhante à projeção de Mercator tradicional.</p>
<p>As diferenças são que o eixo do cilindro faz 90° com o eixo de rotação da Terra e o próprio cilindro é rotacionado  para obtermos projeções  mais precisas em cada fatia em que o cilindro toca a Terra.</p>
<div id="attachment_941" class="wp-caption aligncenter" style="width: 541px"><a href="http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/projections.html"><img class="size-full wp-image-941" title="projections.parsys.19330.Image" src="http://seiti.eti.br/blog/wp-content/uploads/2010/01/projections.parsys.19330.Image_.gif" alt="" width="531" height="376" /></a><p class="wp-caption-text">Universal Transverse of Mercator</p></div>
<p>Estas fatias são então quadriculadas em uma grade. Cada quadrado desta grade forma então um sistema de coordenadas cartesianas, onde a unidade de medida é o <strong>metro</strong>.</p>
<h2>Sistema de Referenciamento Espacial (Spatial Reference System)</h2>
<p>E por fim temos o sistema de referencimento espacial, que nada mais é que a descrição de um conjunto que tem tudo que esta aí em cima. Um exemplo:</p>
<pre class="brush: plain;">
GEOGCS[&quot;SAD69&quot;,
    DATUM[&quot;South_American_Datum_1969&quot;,
        SPHEROID[&quot;GRS 1967 (SAD69)&quot;,6378160,298.25,
            AUTHORITY[&quot;EPSG&quot;,&quot;7050&quot;]],
        AUTHORITY[&quot;EPSG&quot;,&quot;6618&quot;]],
    PRIMEM[&quot;Greenwich&quot;,0,
        AUTHORITY[&quot;EPSG&quot;,&quot;8901&quot;]],
    UNIT[&quot;degree&quot;,0.01745329251994328,
        AUTHORITY[&quot;EPSG&quot;,&quot;9122&quot;]],
    AUTHORITY[&quot;EPSG&quot;,&quot;4618&quot;]]
</pre>
<p>O que é descrito acima, num formato conhecido como <em>Well Known Text</em> (WKT),  é o sistema SAD 69. Note é descrito o sistema geográfico de coordenadas (<strong>GEOGCS</strong>) com o <em>datum</em> utilizado,  o meridiano principal &#8211; Greenwich e a unidade de medida &#8211; <em>degree</em>,  assim como outras informações.  É comum utilizar apenas um número para nos referir a esta referência espacial. Este número, o <a href="http://en.wikipedia.org/wiki/SRID">SRID</a>,  pode ser visto na última linha: <strong>EPSG 4618.</strong> Muito mais exemplos em <a href="http://www.spatialreference.org/">SpatialReference.org</a>.</p>
<p>Outro exemplo:</p>
<pre class="brush: plain;">
PROJCS[&quot;SIRGAS 2000 / UTM zone 23S&quot;,
    GEOGCS[&quot;SIRGAS 2000&quot;,
        DATUM[&quot;Sistema_de_Referencia_Geocentrico_para_America_del_Sur_2000&quot;,
            SPHEROID[&quot;GRS 1980&quot;,6378137,298.257222101,
                AUTHORITY[&quot;EPSG&quot;,&quot;7019&quot;]],
            TOWGS84[0,0,0,0,0,0,0],
            AUTHORITY[&quot;EPSG&quot;,&quot;6674&quot;]],
        PRIMEM[&quot;Greenwich&quot;,0,
            AUTHORITY[&quot;EPSG&quot;,&quot;8901&quot;]],
        UNIT[&quot;degree&quot;,0.01745329251994328,
            AUTHORITY[&quot;EPSG&quot;,&quot;9122&quot;]],
        AUTHORITY[&quot;EPSG&quot;,&quot;4674&quot;]],
    UNIT[&quot;metre&quot;,1,
        AUTHORITY[&quot;EPSG&quot;,&quot;9001&quot;]],
    PROJECTION[&quot;Transverse_Mercator&quot;],
    PARAMETER[&quot;latitude_of_origin&quot;,0],
    PARAMETER[&quot;central_meridian&quot;,-45],
    PARAMETER[&quot;scale_factor&quot;,0.9996],
    PARAMETER[&quot;false_easting&quot;,500000],
    PARAMETER[&quot;false_northing&quot;,10000000],
    AUTHORITY[&quot;EPSG&quot;,&quot;31983&quot;],
    AXIS[&quot;Easting&quot;,EAST],
    AXIS[&quot;Northing&quot;,NORTH]]
</pre>
<p>Neste caso é descrito um sistema de coordenadas projetadas (<strong>PROJCS</strong>), o que requer, além das informações previstas para o GEOGCS, qual o tipo de projeção &#8211; <em>Transverse Mercator</em> &#8211; e localização do ponto de referência  que determina o origem do sistema de medidas, no caso  em metros.  O srid é <strong>31983.</strong></p>
<p>Ao invés de passar toda estas informações para alguém, basta informar o SRID.  Finalmente sabemos de onde vem o tal SRID que popula nossos banco de dados geográficos, e que devemos passar como parâmetro para as APIs Geo deste  mundão esferóide afora.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2010/sirgas-2000" rel="bookmark" title="27 de janeiro de 2010">SIRGAS 2000</a></li>
<li><a href="http://seiti.eti.br/blog/2009/arcsde-e-ms-sql-server-2008" rel="bookmark" title="23 de outubro de 2009">ArcSDE e MS SQL Server 2008</a></li>
<li><a href="http://seiti.eti.br/blog/2008/sig-sistema-de-informacao-geografica" rel="bookmark" title="23 de abril de 2008">SIG &#8211; Sistema de Informação Geográfica</a></li>
<li><a href="http://seiti.eti.br/blog/2010/inserindo-registro-geoespaciais-arcsde-e-sql-server" rel="bookmark" title="10 de março de 2010">Inserindo registros geoespaciais: ArcSDE e SQL Server</a></li>
</ul>
<p><!-- Similar Posts took 9.331 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/BDw20PBmnlDRRINL-MMhHdLo1NA/0/da"><img src="http://feedads.g.doubleclick.net/~a/BDw20PBmnlDRRINL-MMhHdLo1NA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/BDw20PBmnlDRRINL-MMhHdLo1NA/1/da"><img src="http://feedads.g.doubleclick.net/~a/BDw20PBmnlDRRINL-MMhHdLo1NA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/hHLHeWWakeA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial</feedburner:origLink></item>
		<item>
		<title>O Menu Asp.NET e o Chrome (e Safari)</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/AZnt7UJrHic/o-menu-asp-net-e-o-chrome-e-safari</link>
		<comments>http://seiti.eti.br/blog/2010/o-menu-asp-net-e-o-chrome-e-safari#comments</comments>
		<pubDate>Mon, 11 Jan 2010 18:52:08 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=928</guid>
		<description><![CDATA[Existe um problema no controle Menu no Asp.NET WebForms que faz com que ele não seja renderizado corretamente no Safari e no Google Chrome. O que acontece é que o servidor detecta o user-agent do navegador do cliente e monta &#8230; <a href="http://seiti.eti.br/blog/2010/o-menu-asp-net-e-o-chrome-e-safari">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Existe um problema no controle Menu no Asp.NET WebForms que faz com que ele não seja renderizado corretamente no Safari e no Google Chrome. O que acontece é que o servidor detecta o <em>user-agent</em> do navegador do cliente e monta a página de acordo.  Mas o  Asp.NET não reconhece o Safari e o Chrome como<strong> navegadores capazes</strong>, e por isso não conseguem renderizar um Menu em toda sua glória infestada de table&#8217;s, tr&#8217;s e td&#8217;s. Então lhes é servido um menu mais pobre, feio e maltratado .</p>
<p>O jeito é então alertar o Asp.NET  da existência destes navegadores.  E para isto basta criar uma pasta e um arquivo.</p>
<p>Se já não existir, crie em seu projeto uma pasta <em>App_Browsers</em>. E dentro dela crie um arquivo chamado <em>safari.browser</em>, que deve conter o seguinte:</p>
<pre class="brush: plain;">
&lt;browsers&gt;
    &lt;browser refID=&quot;Safari1Plus&quot;&gt;
        &lt;controlAdapters&gt;
            &lt;adapter controlType=&quot;System.Web.UI.WebControls.Menu&quot; adapterType=&quot;&quot; /&gt;
        &lt;/controlAdapters&gt;
    &lt;/browser&gt;
&lt;/browsers&gt;
</pre>
<p>E pronto! Tanto Safari quanto Chrome agora poderão mostrar seus lindos menus <em>tablefull.</em>
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/problema-rodando-testes-mbunit-no-vs2008-test-runner" rel="bookmark" title="3 de agosto de 2009">Problema rodando testes MbUnit no VS2008 Test Runner</a></li>
<li><a href="http://seiti.eti.br/blog/2006/aspnet-development-server-integrated-web-server" rel="bookmark" title="19 de setembro de 2006">ASP.NET Development Server (integrated web server)</a></li>
<li><a href="http://seiti.eti.br/blog/2009/httppostedfile-ie-versus-firefox" rel="bookmark" title="17 de maio de 2009">HttpPostedFile: IE versus Firefox</a></li>
<li><a href="http://seiti.eti.br/blog/2008/criando-um-metodo-de-log-em-aspnet" rel="bookmark" title="28 de agosto de 2008">Criando um método de log em Asp.NET</a></li>
</ul>
<p><!-- Similar Posts took 6.506 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/soapEmJVYELmtC-YkHHv9ztXtmw/0/da"><img src="http://feedads.g.doubleclick.net/~a/soapEmJVYELmtC-YkHHv9ztXtmw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/soapEmJVYELmtC-YkHHv9ztXtmw/1/da"><img src="http://feedads.g.doubleclick.net/~a/soapEmJVYELmtC-YkHHv9ztXtmw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/AZnt7UJrHic" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/o-menu-asp-net-e-o-chrome-e-safari/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/o-menu-asp-net-e-o-chrome-e-safari</feedburner:origLink></item>
		<item>
		<title>Desligando o automount no Ubuntu</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/oREsCAVezYI/desligando-o-automount-no-ubuntu</link>
		<comments>http://seiti.eti.br/blog/2010/desligando-o-automount-no-ubuntu#comments</comments>
		<pubDate>Tue, 05 Jan 2010 16:10:04 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=921</guid>
		<description><![CDATA[Meu cartão micro SD de 16GB resolveu deixar de funcionar. Embora ele possa ser aberto e eu até consiga listar o primeiro nível de diretórios, não há jeito de abrir arquivos, ou mesmo copiar muitos deles. Sorte que, salvo algumas &#8230; <a href="http://seiti.eti.br/blog/2010/desligando-o-automount-no-ubuntu">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Meu cartão micro SD de 16GB resolveu deixar de funcionar. Embora ele possa ser aberto e eu até consiga listar o primeiro nível de diretórios, não há jeito de abrir arquivos, ou mesmo copiar muitos deles. Sorte que, salvo algumas fotos recentes, quase todos os arquivos eu tenho guardado no HD ou no Google ou no Flickr.</p>
<p>A parte chata é tentar desmontar, no Ubuntu,  o cartão. Como o cartão estava com defeito o gnome travava e era preciso matar uns processos. A fato é que não conseguia desmontar o cartão, que era montado automaticamente. E eu precisava dele desmontado, mas inserido no sistema, para tentar rodar um <em>dosfsck</em> ou  uma formatação.</p>
<p>A solução foi desligar o automount do Ubuntu 9.10 &#8211; Karmic Koala. Como? Assim:</p>
<pre class="brush: plain;">
gconftool-2 --type bool --set /apps/nautilus/preferences/media_automount false
</pre>
<p>E pronto! Pena que o cartão não teve jeito. RIP, cartão de 16GB&#8230;
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2010/impressora-epson-tx600fw" rel="bookmark" title="15 de março de 2010">Impressora Epson TX600FW</a></li>
<li><a href="http://seiti.eti.br/blog/2007/eclipse-no-ubuntu-antes" rel="bookmark" title="29 de março de 2007">Eclipse no Ubuntu (antes)</a></li>
<li><a href="http://seiti.eti.br/blog/2008/kubuntu-kde41-em-um-notebook-pavilion-serie-dv" rel="bookmark" title="12 de agosto de 2008">Kubuntu + KDE4.1 em um Notebook Pavilion Série DV</a></li>
<li><a href="http://seiti.eti.br/blog/2008/ubuntu-8041-lancado-hoje" rel="bookmark" title="3 de julho de 2008">Ubuntu 8.04.1 lançado hoje</a></li>
</ul>
<p><!-- Similar Posts took 6.818 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/DFrG1ShgA0JAsG078XiXMk5iEvY/0/da"><img src="http://feedads.g.doubleclick.net/~a/DFrG1ShgA0JAsG078XiXMk5iEvY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DFrG1ShgA0JAsG078XiXMk5iEvY/1/da"><img src="http://feedads.g.doubleclick.net/~a/DFrG1ShgA0JAsG078XiXMk5iEvY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/oREsCAVezYI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2010/desligando-o-automount-no-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2010/desligando-o-automount-no-ubuntu</feedburner:origLink></item>
	</channel>
</rss>
