<?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>Fri, 11 Nov 2011 21:14:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</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>SonicWall NetExtender no Ubuntu 64</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/uHhJRt_2qjA/sonicwall-netextender-no-ubuntu-64</link>
		<comments>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-ubuntu-64#comments</comments>
		<pubDate>Sun, 30 Oct 2011 05:24:21 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1269</guid>
		<description><![CDATA[Bom, voltei ao Ubuntu, mas desta vez o 11.10 64bits. Fiquei feliz que o sistema está bem mais estável &#8211; até o momento &#8211; que o 11.04. Mas tem sempre algo que não funciona, que é o caso do cliente &#8230; <a href="http://seiti.eti.br/blog/2011/sonicwall-netextender-no-ubuntu-64">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bom, voltei ao Ubuntu, mas desta vez o 11.10 64bits. Fiquei feliz que o sistema está bem mais estável &#8211; até o momento &#8211; que o 11.04. Mas tem sempre algo que não funciona, que é o caso do cliente de VPN <em>NetExtender da SonicWall</em>.</p>
<p>Eu tinha feito <a title="SonicWall NetExtender no Debian 64" href="http://seiti.eti.br/blog/2011/sonicwall-netextender-no-debian-64">funcionar no Debian 64</a>, mas a mesma solução não coube aqui. O Ubuntu <strong>não tem</strong> uma variável de ambiente <tt>LD_LIBRARY_PATH</tt>. Como resolver então? Passando por cima do arquivo <tt>/etc/ ld.so.conf</tt> e definindo o <a href="http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html">caminho para as bibliotecas na mão</a>:</p>
<pre class="brush: plain; title: ; notranslate">sudo /lib/ld-linux.so.2 --library-path /lib32 ./netExtender -u username -d example.com vpn.example.com:4433</pre>
<p>E é isso!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/mGcfJaZJvYtVq_8gtpmlYb2gfJ8/0/da"><img src="http://feedads.g.doubleclick.net/~a/mGcfJaZJvYtVq_8gtpmlYb2gfJ8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mGcfJaZJvYtVq_8gtpmlYb2gfJ8/1/da"><img src="http://feedads.g.doubleclick.net/~a/mGcfJaZJvYtVq_8gtpmlYb2gfJ8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/uHhJRt_2qjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-ubuntu-64/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-ubuntu-64</feedburner:origLink></item>
		<item>
		<title>SonicWall NetExtender no Debian 64</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/dXFYmHQQnHo/sonicwall-netextender-no-debian-64</link>
		<comments>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-debian-64#comments</comments>
		<pubDate>Tue, 06 Sep 2011 14:02:12 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1232</guid>
		<description><![CDATA[Ao migrar do Ubuntu 11.04 &#8211; que estava dando muita dor de cabeça &#8211; para o Debian 64 tive alguns problemas para configurar o NetExtender (trocando dor de cabeça por diversão). Baixei o programa e instalei o tarball. Ao executar &#8230; <a href="http://seiti.eti.br/blog/2011/sonicwall-netextender-no-debian-64">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ao migrar do Ubuntu 11.04 &#8211; que estava dando muita dor de cabeça &#8211; para o Debian 64 tive alguns problemas para configurar o NetExtender (trocando dor de cabeça por diversão).</p>
<div id="attachment_1256" class="wp-caption aligncenter" style="width: 410px"><a href="http://seiti.eti.br/blog/wp-content/uploads/2011/09/esticador_rede.jpg"><img class="size-full wp-image-1256 " title="esticador_rede" src="http://seiti.eti.br/blog/wp-content/uploads/2011/09/esticador_rede.jpg" alt="" width="400" height="300" /></a><p class="wp-caption-text">NetExtender</p></div>
<p>Baixei o programa e instalei o tarball. Ao executar o cliente gráfico, <tt>netExtenderGui</tt>, foi apresentado o erro:<br />
<code><br />
There was a problem loading the NetExtender JNI library.<br />
Please reinstall NetExtender, and make sure you have a<br />
compatible version of Java installed. SonicWALL recommends<br />
Sun Java 1.4 or higher.<br />
</code></p>
<p>Bom, estou com o Sun Java 1.6 e ele está configurado corretamente. Olhando no terminal, o erro é um pouco mais específico, mas não ajudou muito:<br />
<code><br />
Could not load libNetExtender.so<br />
</code></p>
<p>Jogando a mensagem no Google encontrei <a href="https://bbs.archlinux.org/viewtopic.php?id=73641">um post</a> com pessoas com o mesmo problema, que é a arquitetura usada: 64bits.</p>
<p>Sabendo qual o problema fica mais fácil resolver. No diretório <tt>/usr/lib32</tt> crie dois arquivos simbólicos:</p>
<pre class="prettyprint">sudo ln -s libcrypto.so.0.9.8 libcrypto.so.6
sudo ln -s libssl.so.0.9.8 libssl.so.6</pre>
<p>Se não existirem o libssl.so.0.9.8 e o libcrypto.so.0.9.8, instale o pacote <strong><tt>ia32-libs</tt></strong>.<br />
Agora crie um script para configurar o LD_CONFIG_PATH:</p>
<pre class="prettyprint">#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib32:$LD_LIBRARY_PATH
export COMMAND=/home/seiti/devel/netExtenderClient/netExtender
$COMMAND "$@"</pre>
<p>Basta agora dar permissão de execução e correr pro abraço:<br />
<code><br />
./netExtender.sh -u usuario -p 'senha' -d example.com vpn.example.com:1234<br />
</code></p>

<p><a href="http://feedads.g.doubleclick.net/~a/Vh03t47Rmk8l-CLO40dgC7bh5ko/0/da"><img src="http://feedads.g.doubleclick.net/~a/Vh03t47Rmk8l-CLO40dgC7bh5ko/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Vh03t47Rmk8l-CLO40dgC7bh5ko/1/da"><img src="http://feedads.g.doubleclick.net/~a/Vh03t47Rmk8l-CLO40dgC7bh5ko/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/dXFYmHQQnHo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-debian-64/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2011/sonicwall-netextender-no-debian-64</feedburner:origLink></item>
		<item>
		<title>Asp.Net, Web Forms e Ninjas – Parte 1</title>
		<link>http://feedproxy.google.com/~r/seiti/~3/pJWdf4fMw7U/asp-net-web-forms-e-ninjas-parte-1</link>
		<comments>http://seiti.eti.br/blog/2011/asp-net-web-forms-e-ninjas-parte-1#comments</comments>
		<pubDate>Mon, 05 Sep 2011 03:48:48 +0000</pubDate>
		<dc:creator>seiti</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[di]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://seiti.eti.br/blog/?p=1228</guid>
		<description><![CDATA[Um padrão que facilita muito a montagem de um sistema orientado à objetos é o de Inversão de Controle e Injeção de Dependência &#8211; Inversion of Control / Dependency Injection, ou simplesmente IoC/DI. O padrão tira das mãos do programador &#8230; <a href="http://seiti.eti.br/blog/2011/asp-net-web-forms-e-ninjas-parte-1">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Um padrão que facilita muito a montagem de um sistema orientado à objetos é o de Inversão de Controle e Injeção de Dependência &#8211; <em>Inversion of Control / Dependency Injection</em>, ou simplesmente <strong>IoC/DI</strong>. O padrão tira das mãos do programador o trabalho de instanciar objetos &#8211; que pode ficar bem complicado, restando apenas configurar a aplicação.</p>
<h2>IoC/DI</h2>
<div class="wp-caption aligncenter" style="width: 74px"><img title="Ninja!!!!" src="http://www.linux.ime.usp.br/~cef/mac499-05/monografias/roberto/figuras/nukenin_animado_2.gif" alt="Ninja!!!!" width="64" height="64" /><p class="wp-caption-text">Ninja!!!!</p></div>
<p>Programando para a web, geralmente temos de aprender o ciclo de vida da aplicação web, quais os pontos de chamadas de páginas, controles, beans e etc. Quem tem o controle da aplicação é o servidor de aplicação &#8211; IIS/.NET, JBoss, WebSphere &#8211; e não o programador. Isto é um tipo de Inversão de Controle.</p>
<p>No caso da Injeção de Dependência, a Inversão de Controle se refere a quem cria os objetos. Quem deve criar os objetos é a própria aplicação. Por que isto? A criação de objetos pode ser complexa e cheia de dependências. Um exemplo: a criação de um objeto <strong>Samurai</strong>. Mas um Samurai obrigatoriamente precisa de uma <strong>Espada</strong>. Então você deve primeiro criar uma Espada, para depois criar o Samurai. Mas para criar uma Espada você precisa de uma <strong>Forja</strong> e um <strong>Ferreiro</strong> e assim por diante.</p>
<p>A solução é usar um contêiner &#8211; ou <em>container</em> &#8211; que faça este trabalho e crie estes objetos para nós. Ao programador resta elaborar e estabeler as regras para esta criação.</p>
<p>Um contêiner DI muito utilizado em Java é o Spring Framework. Em .Net temos vários, mas nenhum em amplo uso e aval da MS. Aqui vou falar de um que considero bem prático de usar e cuja configuração não é baseada em XML. O <a title="Ninject!" href="http://ninject.org/">Ninject</a>.</p>
<h2>Ninjas!</h2>
<p>Ok, criar objetos pode ser complicado e sujo, então contratemos ninjas para fazê-lo. O Ninject possui uma <a title="Wiki do Ninject" href="https://github.com/ninject/ninject/wiki">documentação</a> bem simples de se acompanhar, mas vejamos aqui mesmo o básico.</p>
<p>Segue um código com comentários para exemplificar como o Ninject funciona:</p>
<pre class="brush: csharp; title: ; notranslate">
class Samurai {
  readonly IWeapon _weapon;

  //O atributo 'Inject' faz com que o Ninject, ao instanciar um Samurai, instancie primeiro um IWeapon.
  //Este IWeapon é então passado para o Samurai como um parâmetro do construtor.
  [Inject]
  public Samurai(IWeapon weapon) {
    _weapon = weapon;
  }
  public void Attack(string target) {
    _weapon.Hit(target);
  }
}

class Espada implements IWeapon {
  public Metal Metal { get; private set; }
  public double Weight { get; private set; }
  public double Length { get; private set; }
  public string Name{ get; private set; }
  public Blacksmith Blacksmith { get; private set; }

  //Este 'Inject' é semelhante ao de cima, com a diferença do Ninject instanciar e atribuir um
  //DamageCalculator após a construção desta Espada.
  //Seria semelhante à um new Espada(...) { DamageCalculator = new DamageCalculator(...) }
  [Inject]
  public DamageCalculator Calculator { get; set; }

  [Inject]
  public Espada(Blacksmith blacksmith) {
    Metal = Metal.Iron;
    Weight = 1;
    Length = 2;
    Name = name;
    Blacksmith = blacksmith;
  }

  public Espada(Metal metal, double weight, double length, string name, Blacksmith blacksmith) {
    Metal = metal;
    Weight = weight;
    Length = length;
    Name = name;
    Blacksmith = blacksmith;
  }
  public void Hit(string target) {
     //código com o ataque, levando em conta as características da espada etc.
  }
}

//etc...
</pre>
<p>Acima vemos onde marcar nosso código de forma a instruir o Ninject onde agir. Mas como o Ninject sabe qual arma criar para o Samurai, se o Samurai recebe qualquer coisa que implemente IWeapon? Utilizando NinjectModule:</p>
<pre class="brush: csharp; title: ; notranslate">
public class SamuraiModule : NinjectModule
{
    public override void Load()
    {
        //Sempre que o código pedir um Samurai, um Samurai será criado
        Bind&lt;Samurai&gt;().ToSelf();
        //Sempre que o código pedir um IWeapon, uma Espada será criada
        Bind&lt;IWeapon&gt;().To&lt;Espada&gt;();
        Bind&lt;Blacksmith&gt;().ToSelf();
    }
}
</pre>
<p>Basta agora configurar sua aplicação para ter um Ninject funcional sempre que necessário. Como escolhi, por vários motivos, criar meu projeto como um Asp.NET Web Forms (ao contrário do Asp.NET MVC), tive de alterar o Ninject para dar suporte. Sorte que <a title="Ninject, ASP.NET and Custom Controls" href="http://stackoverflow.com/questions/1274026">alguém já havia feito isto</a>.<br />
Basta baixar o código fonte do Ninject, aplicar o patch e compilar.</p>
<p>Agora devemos alterar o <tt>Global.asax.cs</tt> para que ele estenda <strong>NinjectHttpApplication</strong> e instanciar um novo Ninject.IKernel sempre que a aplicação subir.<br />
É o IKernel o responsável pelo tedioso e oneroso trabalho de instanciar seus objetos, suprindo-os dos elementos necessários para seu funcionamento.</p>
<pre class="brush: csharp; title: ; notranslate">
public class Global : NinjectHttpApplication
{
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();
    }

    protected override Ninject.IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(
            new List()
            {
                new SamuraiModule()
            }.ToArray()
        );

        return kernel;
    }
}
</pre>
<p>Nos próximos posts mostrarei como usar o Ninject e o NHibernate em uma aplicação Asp.NET Web Forms.
<p><strong>Posts relacionados</strong>
<ul class="similar-posts">
<li><a href="http://seiti.eti.br/blog/2009/gerando-boletos-bancarios-em-aspnet-parte-ii" rel="bookmark" title="16 de julho de 2009">Gerando boletos bancários em Asp.NET &#8211; Parte II</a></li>
<li><a href="http://seiti.eti.br/blog/2009/ligando-um-controle-a-um-enum" rel="bookmark" title="15 de maio de 2009">Ligando um controle à um Enum</a></li>
<li><a href="http://seiti.eti.br/blog/2009/gerando-boletos-bancarios-em-aspnet-parte-i" rel="bookmark" title="13 de maio de 2009">Gerando boletos bancários em Asp.NET &#8211; Parte I</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 7.378 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/8nCmu3E0L3Uds_MEun1kPKnoHKs/0/da"><img src="http://feedads.g.doubleclick.net/~a/8nCmu3E0L3Uds_MEun1kPKnoHKs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8nCmu3E0L3Uds_MEun1kPKnoHKs/1/da"><img src="http://feedads.g.doubleclick.net/~a/8nCmu3E0L3Uds_MEun1kPKnoHKs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/seiti/~4/pJWdf4fMw7U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://seiti.eti.br/blog/2011/asp-net-web-forms-e-ninjas-parte-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://seiti.eti.br/blog/2011/asp-net-web-forms-e-ninjas-parte-1</feedburner:origLink></item>
		<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 reading <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>1</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 reading <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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
    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; title: ; notranslate">
    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; title: ; notranslate">
    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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
    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; title: ; notranslate">
    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; title: ; notranslate">
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; title: ; notranslate">
[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 6.952 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/OriEzll9gPnUXd7Wxu2dg63Ju6k/0/da"><img src="http://feedads.g.doubleclick.net/~a/OriEzll9gPnUXd7Wxu2dg63Ju6k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OriEzll9gPnUXd7Wxu2dg63Ju6k/1/da"><img src="http://feedads.g.doubleclick.net/~a/OriEzll9gPnUXd7Wxu2dg63Ju6k/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>6</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 reading <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 reading <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 reading <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 7.118 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/k8_htdwvWOX4cjSJctTfK6y0o8w/0/da"><img src="http://feedads.g.doubleclick.net/~a/k8_htdwvWOX4cjSJctTfK6y0o8w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/k8_htdwvWOX4cjSJctTfK6y0o8w/1/da"><img src="http://feedads.g.doubleclick.net/~a/k8_htdwvWOX4cjSJctTfK6y0o8w/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 reading <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 reading <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 4.400 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/1U6FuBiMEXkxbiT6mL2EiCZUkkc/0/da"><img src="http://feedads.g.doubleclick.net/~a/1U6FuBiMEXkxbiT6mL2EiCZUkkc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1U6FuBiMEXkxbiT6mL2EiCZUkkc/1/da"><img src="http://feedads.g.doubleclick.net/~a/1U6FuBiMEXkxbiT6mL2EiCZUkkc/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 reading <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; title: ; notranslate">
sp_grantlogin 'NT AUTHORITY\NETWORK SERVICE'
</pre>
<p>ou</p>
<pre class="brush: plain; title: ; notranslate">
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.938 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/xgTPZ0HyA2w0JTPEyal-zB52Stk/0/da"><img src="http://feedads.g.doubleclick.net/~a/xgTPZ0HyA2w0JTPEyal-zB52Stk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xgTPZ0HyA2w0JTPEyal-zB52Stk/1/da"><img src="http://feedads.g.doubleclick.net/~a/xgTPZ0HyA2w0JTPEyal-zB52Stk/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 reading <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 6.051 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/g4Pgg-wPAkf6niOu8_pXSJgEs5U/0/da"><img src="http://feedads.g.doubleclick.net/~a/g4Pgg-wPAkf6niOu8_pXSJgEs5U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/g4Pgg-wPAkf6niOu8_pXSJgEs5U/1/da"><img src="http://feedads.g.doubleclick.net/~a/g4Pgg-wPAkf6niOu8_pXSJgEs5U/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>15</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 reading <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; title: ; notranslate">
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; title: ; notranslate">
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 4.892 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/gfTrweP8ZMZML6lismUNghFbkq8/0/da"><img src="http://feedads.g.doubleclick.net/~a/gfTrweP8ZMZML6lismUNghFbkq8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gfTrweP8ZMZML6lismUNghFbkq8/1/da"><img src="http://feedads.g.doubleclick.net/~a/gfTrweP8ZMZML6lismUNghFbkq8/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 reading <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; title: ; notranslate">

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 5.692 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/V6hPILcV3yp_qtegjS0SNBk59S0/0/da"><img src="http://feedads.g.doubleclick.net/~a/V6hPILcV3yp_qtegjS0SNBk59S0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/V6hPILcV3yp_qtegjS0SNBk59S0/1/da"><img src="http://feedads.g.doubleclick.net/~a/V6hPILcV3yp_qtegjS0SNBk59S0/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 reading <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 reading <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; title: ; notranslate">
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 5.389 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/vH_x8wgtXob_FfRivj05vvYXIeg/0/da"><img src="http://feedads.g.doubleclick.net/~a/vH_x8wgtXob_FfRivj05vvYXIeg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vH_x8wgtXob_FfRivj05vvYXIeg/1/da"><img src="http://feedads.g.doubleclick.net/~a/vH_x8wgtXob_FfRivj05vvYXIeg/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 reading <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 7.095 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/YD5DEh_TQpqybsreguPH4qPd0A0/0/da"><img src="http://feedads.g.doubleclick.net/~a/YD5DEh_TQpqybsreguPH4qPd0A0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/YD5DEh_TQpqybsreguPH4qPd0A0/1/da"><img src="http://feedads.g.doubleclick.net/~a/YD5DEh_TQpqybsreguPH4qPd0A0/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 reading <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; title: ; notranslate">
// 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 4.889 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/FbKwGSbv_Hp4L-a9Prxkmu6ODhA/0/da"><img src="http://feedads.g.doubleclick.net/~a/FbKwGSbv_Hp4L-a9Prxkmu6ODhA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FbKwGSbv_Hp4L-a9Prxkmu6ODhA/1/da"><img src="http://feedads.g.doubleclick.net/~a/FbKwGSbv_Hp4L-a9Prxkmu6ODhA/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 reading <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.588 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/H6mJi7r202mzUXC6yBWF88Wdngs/0/da"><img src="http://feedads.g.doubleclick.net/~a/H6mJi7r202mzUXC6yBWF88Wdngs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/H6mJi7r202mzUXC6yBWF88Wdngs/1/da"><img src="http://feedads.g.doubleclick.net/~a/H6mJi7r202mzUXC6yBWF88Wdngs/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 reading <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; title: ; notranslate">
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 9.021 ms --></p>

<p><a href="http://feedads.g.doubleclick.net/~a/1n79PiOTtPcV71tNijucqnUZbD0/0/da"><img src="http://feedads.g.doubleclick.net/~a/1n79PiOTtPcV71tNijucqnUZbD0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1n79PiOTtPcV71tNijucqnUZbD0/1/da"><img src="http://feedads.g.doubleclick.net/~a/1n79PiOTtPcV71tNijucqnUZbD0/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>
	</channel>
</rss>

