<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-6243877953240735013</id><updated>2009-10-17T08:24:07.333-03:00</updated><title type='text'>Communicare (((vs)))</title><subtitle type='html'>Uruense por excelência, torno públicos interesses pessoais e profissionais. Um brinde à todos!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default?start-index=26&amp;max-results=25'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-1465100698071046769</id><published>2009-03-24T23:52:00.005-03:00</published><updated>2009-03-25T01:16:00.065-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Asp.net Timer (C#)</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Este é um exemplo simples de como atualizar automaticamente o conteúdo de um UpdatePanel através de um controle Timer do ASP.NET - nada muito diferente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Talvez a única observação interessante a acrescentar seja que o timer é definido como sendo um gatilho (trigger) externo ao UpdatePanel. Dessa maneira, o conteúdo do painel é atualizado automaticamente a cada ciclo do timer, sem que o restante da página seja afetado.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;‹%@ Page Language="C#" AutoEventWireup="true"&lt;br /&gt;CodeFile="Default.aspx.cs" Inherits="_Default" %›&lt;br /&gt;&lt;br /&gt;‹!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"›&lt;br /&gt;‹html xmlns="http://www.w3.org/1999/xhtml"›&lt;br /&gt;‹head runat="server"›&lt;br /&gt;  ‹title›Exemplo: ASP.NET Timer‹/title›&lt;br /&gt;‹/head›&lt;br /&gt;‹body›&lt;br /&gt;  ‹form id="form1" runat="server"›&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;‹!-- necessário para ajax.net --›&lt;/span&gt;&lt;br /&gt;     ‹asp:ScriptManager ID="ScriptManager1" runat="server" /›&lt;br /&gt;     ‹div›&lt;br /&gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;‹!-- timer que atualiza o updatepanel --›&lt;/span&gt;&lt;br /&gt;         ‹asp:Timer ID="timer" runat="server" Interval="1000"&lt;br /&gt;         Enabled="true" OnTick="timer_Tick"›‹/asp:Timer›&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;‹!-- região a ser atualizada --›&lt;/span&gt;&lt;br /&gt;         ‹asp:UpdatePanel ID="UpdatePanel1"&lt;br /&gt;         runat="server" UpdateMode="Conditional"›&lt;br /&gt;            ‹Triggers›&lt;br /&gt;               ‹asp:AsyncPostBackTrigger ControlID="timer"/›&lt;br /&gt;            ‹/Triggers›&lt;br /&gt;            ‹ContentTemplate›&lt;br /&gt;               &lt;span style="color: rgb(0, 153, 0);"&gt;‹!-- controles afetados --›&lt;/span&gt;&lt;br /&gt;               ‹asp:Label ID="Label1" runat="server"›&lt;br /&gt;               ‹/asp:Label›&lt;br /&gt;            ‹/ContentTemplate›&lt;br /&gt;        ‹/asp:UpdatePanel›&lt;br /&gt;     ‹/div›&lt;br /&gt;  ‹/form›&lt;br /&gt;‹/body›&lt;br /&gt;‹/html›&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;Também é interessante observar que, numa situação mais específica como, por exemplo, UpdatePanels aninhados, alguns comportamentos esdrúxulos podem aparecer. Neste caso, talvez ajude incluir a propriedade &lt;span style="color: rgb(255, 0, 0);"&gt;RenderMode="Inline"&lt;/span&gt; na declaração do UpdatePanel.&lt;br /&gt;&lt;br /&gt;E o code behind da página:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;&lt;br /&gt;public partial class _Default : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;  protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;     if (!IsPostBack)&lt;br /&gt;        timer.Tick += new EventHandler‹EventArgs›(timer_Tick);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void timer_Tick(object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;     Label1.Text = DateTime.Now.ToString();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Como o ambiente é naturalmente lento, a frequência de atualização deve ser estimada com cuidado.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-1465100698071046769?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/1465100698071046769/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=1465100698071046769&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1465100698071046769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1465100698071046769'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2009/03/aspnet-timer-c.html' title='Asp.net Timer (C#)'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-894501963623151879</id><published>2009-03-13T23:03:00.002-03:00</published><updated>2009-03-13T23:08:48.547-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Links Python</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.python.org/"&gt;Python&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.pythonchallenge.com/"&gt;The Python Challenge&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://pygame.org/"&gt;PyGame&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-894501963623151879?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/894501963623151879/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=894501963623151879&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/894501963623151879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/894501963623151879'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2009/03/links-python.html' title='Links Python'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-5858679657482918913</id><published>2008-12-11T20:33:00.004-02:00</published><updated>2008-12-12T00:46:29.885-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Custom Events em C#</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;Segue um exemplo sobre como criar eventos personalizados em C# e usá-los para realizar ações assim que um processamento mais demorado for concluído, deixando a thread principal da aplicação livre para outros trabalhos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(This is a sample application written in C# that demonstrates how to trigger some action when an expensive function finishes its job.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para testar, basta criar uma aplicação do tipo console com o código abaixo:&lt;/span&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Threading;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;namespace &lt;/span&gt;ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Program&lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; Main(&lt;span style="color: rgb(51, 51, 255);"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;for &lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;myNum = 0; myNum ‹ 5; myNum++)&lt;br /&gt;          {&lt;br /&gt;              &lt;span style="color: rgb(0, 153, 0);"&gt;// Objeto de teste&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: rgb(51, 153, 153);"&gt;CTest &lt;/span&gt;ct = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;CTest&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;              &lt;span style="color: rgb(0, 153, 0);"&gt;// Método que será executado após o&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                // término do processamento demorado.&lt;/span&gt;&lt;br /&gt;              ct.TestCompleted += &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;CTest&lt;/span&gt;.&lt;span style="color: rgb(51, 153, 153);"&gt;TestEventHandler&lt;/span&gt;(&lt;br /&gt;                  ct_TestCompleted);&lt;br /&gt;&lt;br /&gt;              &lt;span style="color: rgb(0, 153, 0);"&gt;// Roda o método demorado, liberando&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                // a aplicação principal.&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Thread&lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ParameterizedThreadStart&lt;/span&gt;(&lt;br /&gt;                  ct.Test)).Start(myNum);&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 153, 0);"&gt;// Sinaliza o término da tarefa.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; ct_TestCompleted(&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 153, 153);"&gt;CTest&lt;/span&gt;.&lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;e)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(0, 153, 0);"&gt;// Os parâmetros estarão no objeto (e)&lt;/span&gt;&lt;br /&gt;          Console.WriteLine("Completed: " + e.j);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;CTest&lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt;      &lt;span style="color: rgb(0, 153, 0);"&gt;// Este é o método demorado.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        // "myNum" Apenas identifica as threads.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;public void&lt;/span&gt; Test(&lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;myNum)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(0, 153, 0);"&gt;// Sinaliza o início da tarefa&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(204, 0, 0);"&gt;"Starting: "&lt;/span&gt; + myNum);&lt;br /&gt;&lt;br /&gt;          &lt;span style="color: rgb(0, 153, 0);"&gt;// Simula um processamento demorado&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(51, 153, 153);"&gt;Thread&lt;/span&gt;.Sleep(3000);&lt;br /&gt;        &lt;br /&gt;          &lt;span style="color: rgb(0, 153, 0);"&gt;// Dispara o evento ao terminar&lt;/span&gt;&lt;br /&gt;          RaiseTestCompleted((&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt;)myNum);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 153, 0);"&gt;// Nesta classe são definidos&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        // objetos para uso posterior.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;public class&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;: System.&lt;span style="color: rgb(51, 153, 153);"&gt;EventArgs&lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;public int&lt;/span&gt; j; &lt;span style="color: rgb(0, 153, 0);"&gt;// um exemplo&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;public &lt;/span&gt;TestEventArgs(&lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;j)&lt;br /&gt;          {&lt;br /&gt;              &lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;.j = j;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 153, 0);"&gt;// Declaração de um delegate&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        // e um evento auxiliares&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;public delegate void&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventHandler&lt;/span&gt;(&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;e);&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;public event&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventHandler &lt;/span&gt;TestCompleted;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 153, 0);"&gt;// Este método prepara os parâmetros&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        // e dispara o evento assíncrono.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;private void&lt;/span&gt; RaiseTestCompleted(&lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;j)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;args = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs&lt;/span&gt;(j);&lt;br /&gt;          OnTest(&lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;, args);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt;protected virtual void&lt;/span&gt; OnTest(&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;e)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;if &lt;/span&gt;(TestCompleted != &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;              TestCompleted(&lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;, e);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Em passos gerais, é criada uma classe &lt;span style="color: rgb(51, 153, 153);"&gt;TestEventArgs &lt;/span&gt;com os objetos que serão expostos via argumentos da função executada logo após o término do processamento demorado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Neste exemplo, disparo 5 threads que demoram alguns segundos. Note que, devido à concorrência do sistema, ocasionalmente elas podem finalizar fora de ordem.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Talvez um pouco confuso à primeira vista, mas muito útil em diversas aplicações.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-5858679657482918913?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/5858679657482918913/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=5858679657482918913&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5858679657482918913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5858679657482918913'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/12/custom-events-em-c.html' title='Custom Events em C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-8147579355270615576</id><published>2008-12-04T01:28:00.013-02:00</published><updated>2009-01-12T20:40:19.621-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cultura'/><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Deserto Verde</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;Relato de uma viagem a serviço de São Carlos/SP a Aracruz/ES, com uma esticada até Teixeira de Freitas/BA - uma brincadeira de &lt;a href="http://uruensepelomundo.blogspot.com/2008/12/deserto-verde.html" target="_blank"&gt;3.600km pelo deserto verde&lt;/a&gt;, ou Aracruz Celulose, como preferir.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-8147579355270615576?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/8147579355270615576/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=8147579355270615576&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/8147579355270615576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/8147579355270615576'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/12/deserto-verde.html' title='Deserto Verde'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-6403786317400241505</id><published>2008-11-20T21:04:00.006-02:00</published><updated>2008-12-04T21:31:35.110-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cultura'/><category scheme='http://www.blogger.com/atom/ns#' term='Relações Humanas'/><title type='text'>Eu de Volta</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Limpando as teias das aranhas que andam por aqui...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Resumindo, desde minha evolução da Kaizen Games para a &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.agx.com.br/" target="_blank"&gt;AGX Tecnologia&lt;/a&gt;&lt;span style="font-family:arial;"&gt; em julho/2008, tenho estado bem ocupado e deixei este blog às traças (não que fosse muito útil).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Saí de Sampa para São Carlos City e me envolvi com sistemas &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Sistema_de_informa%C3%A7%C3%A3o_geogr%C3%A1fica" target="_blank"&gt;georreferenciados&lt;/a&gt;&lt;span style="font-family:arial;"&gt; e sistemas embarcados. Tenho usado &lt;/span&gt;&lt;a style="font-family: arial;" href="http://mapserver.gis.umn.edu/" target="_blank"&gt;MapServer&lt;/a&gt;&lt;span style="font-family:arial;"&gt; e &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.postgresql.org/" target="_blank"&gt;PostgreSQL&lt;/a&gt;&lt;span style="font-family:arial;"&gt;/&lt;/span&gt;&lt;a style="font-family: arial;" href="http://postgis.refractions.net/" target="_blank"&gt;PostGIS&lt;/a&gt;&lt;span style="font-family:arial;"&gt; com C# (sim, é &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pgfoundry.org/projects/npgsql/" target="_blank"&gt;possível&lt;/a&gt;&lt;span style="font-family:arial;"&gt;), microcontroladores &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.microchip.com/" target="_blank"&gt;PIC&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, MPLAB, linguagem C, meus velhos amigos Delphi e Visual Studio, e outras coisas open source.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Quando possível, ainda tento brincar com &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsdl.org/" target="_blank"&gt;SDL&lt;/a&gt;&lt;span style="font-family:arial;"&gt; em C++ e Python (&lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.pygame.org/" target="_blank"&gt;PyGame&lt;/a&gt;&lt;span style="font-family:arial;"&gt;), estudar &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Rede_neural" target="_blank"&gt;redes neurais&lt;/a&gt;&lt;span style="font-family:arial;"&gt; artificiais, ler &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Friedrich_Nietzsche" target="_blank"&gt;Nietzsche&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Bertrand_Russell" target="_blank"&gt;Bertrand Russell&lt;/a&gt;&lt;span style="font-family:arial;"&gt; e &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www2.uol.com.br/glauco/geraldao.shtml" target="_blank"&gt;Geraldão&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, assistir &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Fud%C3%AAncio_e_Seus_Amigos" target="_blank"&gt;Fudêncio&lt;/a&gt;&lt;span style="font-family:arial;"&gt; e passar um tempo no Ubuntu.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Continuo ouvindo Clannad, Joy Division, &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.haggard.de/" target="_blank"&gt;Haggard&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.eluveitie.ch/" target="_blank"&gt;Eluveitie&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, Los Orishas e Raul Seixas, obviamente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Enfim, pretendo voltar a compartilhar algumas coisas que aprender - porém daqui alguns dias - neste final de semana devo viajar a serviço para &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.google.com/maps?f=q&amp;amp;hl=pt-BR&amp;amp;geocode=&amp;amp;q=aracruz,+es&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=59.512696,113.203125&amp;amp;ie=UTF8&amp;amp;ll=-19.747317,-40.274506&amp;amp;spn=0.560956,0.884399&amp;amp;t=h&amp;amp;z=10&amp;amp;g=aracruz,+es&amp;amp;iwloc=addr" target="_blank"&gt;Aracruz&lt;/a&gt;&lt;span style="font-family:arial;"&gt;/ES. A proprósito: a 20km de uma praia de nudismo... hehehe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;E os churras continuam os mesmos - ou melhores.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-6403786317400241505?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/6403786317400241505/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=6403786317400241505&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6403786317400241505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6403786317400241505'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/11/eu-de-volta.html' title='Eu de Volta'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-7702635746649739670</id><published>2008-06-01T13:37:00.004-03:00</published><updated>2008-06-01T13:45:19.380-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Linden Scripting Language'/><title type='text'>Novos Blogs de Programação</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;Enfim tomei coragem (e juízo) para iniciar um novo blog, especializado em programação para Second Life. Chamei-o de &lt;/span&gt;&lt;a style="font-family: arial;" href="http://helloavatar.blogspot.com/" target="_blank"&gt;Hello, Avatar!&lt;/a&gt;&lt;span style="font-family: arial;"&gt; por motivos óbvios e é outro blog apenas por organização, pois os demais tópicos varzeados em geral vão continuar por aqui.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Também pretendo, muito em breve, iniciar um outro voltado para a programação de jogos, que chemei de &lt;/span&gt;&lt;a style="font-family: arial;" href="http://avemunde.blogspot.com/" target="_blank"&gt;AVE MVNDE&lt;/a&gt;&lt;span style="font-family: arial;"&gt; (advinhe por quê). Porém, como meus conhecimentos e experiência nesta área ainda são bem limitados, este outro blog será populado com as evoluções dos meus estudos, mas já iniciará com algum conteúdo prático como C++ e SDL, sprites, simulação de física e detecção de colisões. Mais à frente, pretendo abordar também sobre C# e XNA.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-7702635746649739670?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/7702635746649739670/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=7702635746649739670&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/7702635746649739670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/7702635746649739670'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/06/novos-blogs-de-programao.html' title='Novos Blogs de Programação'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-2629439420683875676</id><published>2008-05-27T21:38:00.006-03:00</published><updated>2008-05-27T22:12:57.914-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Cultura'/><title type='text'>A Era dos Videogames</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Já faz um bom tempo que o Discovery Channel disponibilizou uma série sobre a história dos videogames, mas ainda há um link para uma versão interativa do documentário, chamado de &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.discoverybrasil.com/videogame/" target="_blank"&gt;A Era do Videogame&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YK-I1cKIr2o/SDyuaswxoLI/AAAAAAAAAIg/FapXzVtZAh4/s1600-h/eradosgames.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_YK-I1cKIr2o/SDyuaswxoLI/AAAAAAAAAIg/FapXzVtZAh4/s200/eradosgames.jpg" alt="" id="BLOGGER_PHOTO_ID_5205227043049021618" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;É um trabalho interessante, à altura do Discovery Channel, e divertido, pois o leitor obtém as informações conforme progride em pequenos games. O material abrange desde os primórdios na década de 70 até os dias atuais. Vale ver.&lt;br /&gt;&lt;br /&gt;Aproveitando o link, tem um joguinho legal brazuca de corrida com ótimos gráficos: &lt;a href="http://www.buckingfuggy.com/" target="_blank"&gt;Bucking Fuggy&lt;/a&gt;. E para quem quiser relembrar um crássico, aqui tem o &lt;a href="http://www.oestemania.com.br/jogos/31.htm" target="_blank"&gt;Prince Of Persia&lt;/a&gt; rodando direto no browser.&lt;br /&gt;&lt;br /&gt;Cumprida a obrigação, agora vem a diversão: se der cara, C# (libsecondlife). Se der coroa, C++ (SDL). Coroa venceu.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-2629439420683875676?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/2629439420683875676/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=2629439420683875676&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2629439420683875676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2629439420683875676'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/era-dos-videogames.html' title='A Era dos Videogames'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YK-I1cKIr2o/SDyuaswxoLI/AAAAAAAAAIg/FapXzVtZAh4/s72-c/eradosgames.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-1602482343704926952</id><published>2008-05-27T21:29:00.004-03:00</published><updated>2008-12-04T21:33:19.192-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Literatura'/><title type='text'>José Saramago</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"Quero recordar-lhes que, sem vaidade, eu também nasci num lugar pobre, de analfabetos. Em minha infância não tive livros, nem televisão, internet ou playstation, mas quem não tem nada sempre inventa algo. Jamais se aborrece."&lt;/span&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pt.wikipedia.org/wiki/Jos%C3%A9_Saramago" target="_blank"&gt;José Saramago&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-1602482343704926952?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/1602482343704926952/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=1602482343704926952&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1602482343704926952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1602482343704926952'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/jos-saramago.html' title='José Saramago'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-4188229020179730452</id><published>2008-05-15T18:31:00.001-03:00</published><updated>2008-05-15T18:41:21.702-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><title type='text'>The Fódest Game</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;Mais um joguinho para descontrair: &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.onemorelevel.com/game/the_worlds_hardest_game" target="_blank"&gt;The World's Hardest Game&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YK-I1cKIr2o/SCyt5AQQEJI/AAAAAAAAAIY/cNFm1fAdOws/s1600-h/hardestgame.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YK-I1cKIr2o/SCyt5AQQEJI/AAAAAAAAAIY/cNFm1fAdOws/s200/hardestgame.JPG" alt="" id="BLOGGER_PHOTO_ID_5200722864538390674" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family: arial;"&gt;Não é novidade, mas é legal.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-4188229020179730452?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/4188229020179730452/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=4188229020179730452&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/4188229020179730452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/4188229020179730452'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/fdest-game.html' title='The Fódest Game'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_YK-I1cKIr2o/SCyt5AQQEJI/AAAAAAAAAIY/cNFm1fAdOws/s72-c/hardestgame.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-6536581683171321242</id><published>2008-05-08T00:09:00.014-03:00</published><updated>2008-05-21T00:51:47.218-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metaversos'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='Relações Humanas'/><title type='text'>Second Life and the Public Good</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Uma parceria entre a USP e a Kaizen Games resultou em mais uma ilha incluída na Mainland Brasil, destinada a um projeto de e-learning chamado &lt;a href="http://slurl.com/secondlife/MLBR%20Cidade%20Conhecimento/128/127/22" target="_blank"&gt;Cidade do Conhecimento&lt;/a&gt;. Até aí nada impressionante, embora seja uma boa notícia e de interesse público. Começa a melhorar quando me foi delegada a nobre tarefa de entrar em contato com Tori Horton, da University of Southern California (USC), e conseguir uma cópia de um auditório para o projeto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Após alguns e-mails, recados na secretária eletrônica, mensagens off-line e outros desencontros como o fuso horário, finalmente nos encontramos in-world. Na ocasião, ela teria um evento iniciando em precisos 7 minutos e não poderia tratar sobre o anfiteatro naquele momento, mas me convidou para participar.&lt;br /&gt;&lt;br /&gt;Teletransportei-me então para a &lt;/span&gt;&lt;a style="font-family: arial;" href="http://slurl.com/secondlife/International%20Island/124/25/26" target="_blank"&gt;International Island&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, onde Cory Ondrejka, uma das pessoas mais importantes para o desenvolvimento do Second Life na Linden Lab até o ano passado (ao lado do ex-CEO Phillip Rosedale), e Douglas Thomas, professor associado na Annenberg School for Communication da USC, convidavam os residentes a imaginar meios pelos quais os ambientes virtuais como o próprio Second Life poderiam contribuir para com o bem-estar geral da população. Os melhores trabalhos ainda poderão ser patrocinados, como descrito no &lt;/span&gt;&lt;a style="font-family: arial;" href="http://networkculture.usc.edu/index.php?option=com_content&amp;amp;view=article&amp;amp;id=35" target="_blank"&gt;site do projeto&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, pela própria Tori Horton, que foi muito atenciosa.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Ao final do evento, ao acionar por descuido meu microfone e despertar interesse em alguns residentes pelo idioma "não identificado", em particular &lt;/span&gt;&lt;a style="font-family: arial;" href="http://whymysl.blogspot.com/" target="_blank"&gt;Rhiannon Chatnoir&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, integrante do &lt;a href="http://www.thevesuviusgroup.com/" target="_blank"&gt;The Vesuvius Group&lt;/a&gt;, mais um novo e interessante contato estava feito.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Depois disso tudo, alguém ainda poderia perguntar:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;- Por quê usar Second Life?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;e eu poderia responder simplesmente:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;- Porque SL é um ambiente virtual em três dimensões interativo e em tempo real que possui uma infra-estrutura sofisticada, ampla e relativamente simples de aprender e usar. Permite, através de pequenos scripts em alto nível, o uso de recursos como simulação de física ou comunicação web via requisições http.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;mas esta experiência me mostrou que o ambiente virtual é realmente intangível e pode ir muito além dessa resposta superficial.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-6536581683171321242?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/6536581683171321242/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=6536581683171321242&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6536581683171321242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6536581683171321242'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/sl-and-public-good.html' title='Second Life and the Public Good'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-779401502562229106</id><published>2008-05-06T22:04:00.006-03:00</published><updated>2008-05-27T00:04:57.833-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Win32 API Tutorial</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Segue um excelente tutorial online (em inglês) sobre programação para Windows. O texto começa pela criação de uma simples janela, passa pelo tratamento de mensagens (message handling) e evolui até demonstrar os controles visuais mais comuns (como button e textbox).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.winprog.org/tutorial/" target="_blank"&gt;theForger's Win32 API Tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;O site tráz também várias outras informações para complementar o tutorial básico e aprofundar os conhecimentos do leitor (criação de uma aplicação simples, interface de dispositivos gráficos, ferramentas e documentação, apêndices).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para testes rápidos, tenho usado o &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.bloodshed.net/dev/devcpp.html" target="_blank"&gt;Bloodshed Dev-C++&lt;/a&gt;&lt;span style="font-family:arial;"&gt; e até o momento ele tem atendido bem as espectativas.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-779401502562229106?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/779401502562229106/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=779401502562229106&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/779401502562229106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/779401502562229106'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/win32-api-tutorial.html' title='Win32 API Tutorial'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-7212466589265343874</id><published>2008-05-05T23:32:00.008-03:00</published><updated>2008-05-27T00:05:10.514-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e-Books'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>C++ Beginner's Guide</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;Livro &lt;span style="font-style: italic;"&gt;C++ Beginner's Guide&lt;/span&gt;, de Herbert Schildt, disponibilizado para &lt;a href="http://www.zshare.net/download/106035225fbe1b19/" target="_blank"&gt;download (17MB)&lt;/a&gt; em formato PDF pela Microsoft. Para facilitar, coloquei um zip no &lt;a href="http://www.zshare.net/" target="_blank"&gt;zshare&lt;/a&gt;. Capítulos do livro:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;01 - C++ Fundamentals&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;02 - Introducing Data Types and Operators&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;03 - Program Control Statements&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;04 - Arrays, Strings, and Pointers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;05 - Introducing Functions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;06 - A Closer Look at Functions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;07 - More Data Types and Operators&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;08 - Classes and Objects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;09 - A Closer Look at Classes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;10 - Inheritance, Virtual Functions, and Polymorphism&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;11 - The C++ I/O System&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;12 - Exceptions, Templates, and Other Advanced Topics&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em inglês, com linguagem bem clara e acessível.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-7212466589265343874?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/7212466589265343874/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=7212466589265343874&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/7212466589265343874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/7212466589265343874'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/05/c-beginners-guide.html' title='C++ Beginner&apos;s Guide'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-5343450506252878137</id><published>2008-04-07T23:16:00.005-03:00</published><updated>2008-04-08T00:03:05.030-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Detecção de Eventos no Windows</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;Demonstração em C# de como detectar a ocorrência de eventos do sistema através dos recursos de instrumentação do Windows. Embora este exemplo identifique a abertura ou fechamento de uma aplicação qualquer, os eventos __InstanceCreationEvent e __InstanceDeletionEvent também podem identificar a criação ou exclusão de arquivos, unidades de discos, entre outras coisas.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Management;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Desc.: Captura eventos do sistema.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Prog.: vagnercsousa@yahoo.com.br&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Data.: 2008/04/07/23:00, Osasco&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;http://msdn2.microsoft.com/en-us/library/aa393250(VS.85).aspx&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;namespace &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;EventosDoSistema&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Program&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; Main(&lt;span style="color: rgb(51, 51, 255);"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;   {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;MonitoraçãoEventos&lt;/span&gt;.Monitorar(&lt;span style="color: rgb(153, 0, 0);"&gt;"calc.exe"&lt;/span&gt;,&lt;br /&gt;       &lt;span style="color: rgb(51, 153, 153);"&gt;MonitoraçãoEventos&lt;/span&gt;.&lt;span style="color: rgb(51, 153, 153);"&gt;TipoEvento&lt;/span&gt;.Encerrar);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.Read(); &lt;span style="color: rgb(0, 153, 0);"&gt;// aguarda&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;MonitoraçãoEventos&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;static &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ManagementEventWatcher &lt;/span&gt;watcher;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;public static void&lt;/span&gt; Monitorar&lt;br /&gt;     (&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;nmProcesso, &lt;span style="color: rgb(51, 153, 153);"&gt;TipoEvento &lt;/span&gt;tpEvento)&lt;br /&gt;   {&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// qdo aplicação inicia ou encerra&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;evento = (tpEvento == &lt;span style="color: rgb(51, 153, 153);"&gt;TipoEvento&lt;/span&gt;.Iniciar) ?&lt;br /&gt;       &lt;span style="color: rgb(153, 0, 0);"&gt;"__InstanceCreationEvent"&lt;/span&gt; : &lt;span style="color: rgb(153, 0, 0);"&gt;"__InstanceDeletionEvent"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// procuro o fechamento de uma aplicação específica&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;condicao = &lt;span style="color: rgb(153, 0, 0);"&gt;"TargetInstance ISA \"Win32_Process\""&lt;/span&gt;&lt;br /&gt;       + &lt;span style="color: rgb(153, 0, 0);"&gt;" AND TargetInstance.Name = \""&lt;/span&gt; + nmProcesso + &lt;span style="color: rgb(153, 0, 0);"&gt;"\""&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// qdo não há provider de eventos explícito&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;TimeSpan &lt;/span&gt;intervalo = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;TimeSpan&lt;/span&gt;(0, 0, 1);&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// estrutura a consulta&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;WqlEventQuery &lt;/span&gt;query = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(51, 153, 153);"&gt;WqlEventQuery&lt;/span&gt;(evento, intervalo, condicao);&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// prepara o objeto que fará a detecção&lt;/span&gt;&lt;br /&gt;     watcher = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ManagementEventWatcher&lt;/span&gt;(query);&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// método para tratar ocorrências do evento&lt;/span&gt;&lt;br /&gt;     watcher.EventArrived += &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(51, 153, 153);"&gt;EventArrivedEventHandler&lt;/span&gt;(watcher_EventArrived);&lt;br /&gt;          &lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// inicia monitoração&lt;/span&gt;&lt;br /&gt;     watcher.Start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; watcher_EventArrived&lt;br /&gt;     (&lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 153, 153);"&gt;EventArrivedEventArgs &lt;/span&gt;e)&lt;br /&gt;   {&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// suspende monitoração&lt;/span&gt;&lt;br /&gt;     ((&lt;span style="color: rgb(51, 153, 153);"&gt;ManagementEventWatcher&lt;/span&gt;)sender).Stop();&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(e.NewEvent);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;public enum&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;TipoEvento&lt;/span&gt;&lt;br /&gt;   {&lt;br /&gt;     Iniciar, Encerrar&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-5343450506252878137?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/5343450506252878137/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=5343450506252878137&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5343450506252878137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5343450506252878137'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/04/deteco-de-eventos-no-windows.html' title='Detecção de Eventos no Windows'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-2810552221971562687</id><published>2008-04-07T22:41:00.012-03:00</published><updated>2008-05-27T00:05:19.671-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Streets Of Rage e Quake II</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Download do &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.bombergames.net/sorr_project/" target="_blank"&gt;Streets Of Rage&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, game de ação clássico para consoles Sega, em um remake não-oficial e freeware para PC. Totalmente excelente! &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.zshare.net/download/276008719a6594/" target="_blank"&gt;Download&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YK-I1cKIr2o/R_rQOj60rII/AAAAAAAAAG8/ml4gZn6ANpQ/s1600-h/sor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YK-I1cKIr2o/R_rQOj60rII/AAAAAAAAAG8/ml4gZn6ANpQ/s200/sor.png" alt="" id="BLOGGER_PHOTO_ID_5186686869449256066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Como de costume, economizando posts, segue o link para a versão demo do game &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.vertigo.com/quake2.htm" target="_blank"&gt;Quake II&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, com códigos-fontes nativo e  gerenciado em C++ incluídos.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-2810552221971562687?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/2810552221971562687/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=2810552221971562687&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2810552221971562687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2810552221971562687'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/04/sor-e-quake.html' title='Streets Of Rage e Quake II'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_YK-I1cKIr2o/R_rQOj60rII/AAAAAAAAAG8/ml4gZn6ANpQ/s72-c/sor.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-423497086646161401</id><published>2008-03-29T01:06:00.008-03:00</published><updated>2008-05-05T21:41:45.458-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Ajustar Data-Hora em C#</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Exemplo em C# que demonstra como atualizar a data e hora do sistema utilizando chamadas à API do Windows. Para isso, basta dizer à aplicação que existe uma função externa pronta, onde encontrá-la (a DLL), quais parâmetros recebe e seu tipo de retorno.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Runtime.InteropServices; &lt;span style="color: rgb(0, 153, 0);"&gt;// DllImport()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;Microsoft.Win32; &lt;span style="color: rgb(0, 153, 0);"&gt;// evento TimeChanged()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Desc.: Ajusta data e hora do sistema.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Prog.: vagnercsousa@yahoo.com.br&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    Data.: 2008/03/29/00:00, Osasco&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Referências:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// SetSystemTime Function&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;http://msdn2.microsoft.com/en-us/library/ms724942(VS.85).aspx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// struct SYSTEMTIME&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;http://msdn2.microsoft.com/en-us/library/ms724950(VS.85).aspx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// exemplo Windows API&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;http://vsousa.blogspot.com/2008/03/bringtofront.html&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;namespace &lt;/span&gt;SystemFunctionsTeste&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; Main(&lt;span style="color: rgb(51, 51, 255);"&gt;string&lt;/span&gt;[] args)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;SystemTime&lt;/span&gt;.Testar();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;SystemTime&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;/* Estrutura (unmanaged) no arquivo WinBase.h:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        typedef struct _SYSTEMTIME {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wYear;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wMonth;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wDayOfWeek;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wDay;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wHour;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wMinute;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wSecond;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            WORD wMilliseconds;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;        } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   // Declaração da estrutura necessária&lt;/span&gt;&lt;br /&gt; [&lt;span style="color: rgb(51, 153, 153);"&gt;StructLayout&lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;LayoutKind&lt;/span&gt;.Sequential)]&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;public struct&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wYear;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wMonth;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wDayOfWeek;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wDay;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wHour;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wMinute;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wSecond;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;public ushort&lt;/span&gt; wMilliseconds;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; [&lt;span style="color: rgb(51, 153, 153);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(153, 0, 0);"&gt;"Kernel32.dll"&lt;/span&gt;)]&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static extern bool&lt;/span&gt; SetSystemTime(&lt;span style="color: rgb(51, 51, 255);"&gt;ref &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME &lt;/span&gt;pST);&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;// BOOL WINAPI SetSystemTime&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   //     (__in const SYSTEMTIME* lpSystemTime);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; [&lt;span style="color: rgb(51, 153, 153);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(153, 0, 0);"&gt;"Kernel32.dll"&lt;/span&gt;)]&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static extern void&lt;/span&gt; GetSystemTime(&lt;span style="color: rgb(51, 51, 255);"&gt;ref &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME &lt;/span&gt;pST);&lt;br /&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;// void WINAPI GetSystemTime&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   //     (__out LPSYSTEMTIME lpSystemTime);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   // Objeto do tipo da estrutura criada&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME &lt;/span&gt;pST = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;public static void&lt;/span&gt; Testar()&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// handler para evento (usar tecla TAB)&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;SystemEvents&lt;/span&gt;.TimeChanged += &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: rgb(51, 153, 153);"&gt;EventHandler&lt;/span&gt;(SystemEvents_TimeChanged);&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// Função externa que obtém dados&lt;/span&gt;&lt;br /&gt;     GetSystemTime(&lt;span style="color: rgb(51, 51, 255);"&gt;ref &lt;/span&gt;pST);&lt;br /&gt;&lt;br /&gt;     Exibe(pST); &lt;span style="color: rgb(0, 153, 0);"&gt;// apenas lista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     pST.wDay = 13;&lt;span style="color: rgb(0, 153, 0);"&gt; // alteração de exemplo&lt;/span&gt;&lt;br /&gt;     pST.wMonth = 6;&lt;br /&gt;     pST.wYear = 2009;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// Função externa que atualiza&lt;/span&gt;&lt;br /&gt;     SetSystemTime(&lt;span style="color: rgb(51, 51, 255);"&gt;ref &lt;/span&gt;pST);&lt;br /&gt;&lt;br /&gt;     Exibe(pST); &lt;span style="color: rgb(0, 153, 0);"&gt;// lista novamente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(0, 153, 0);"&gt;// Aguarda evento TimeChanged&lt;/span&gt;&lt;br /&gt;     System.Threading.&lt;span style="color: rgb(51, 153, 153);"&gt;Thread&lt;/span&gt;.Sleep(1000);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; Exibe(&lt;span style="color: rgb(51, 153, 153);"&gt;SYSTEMTIME &lt;/span&gt;pST)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wDay "&lt;/span&gt; + pST.wDay);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wDayOfWeek "&lt;/span&gt; + pST.wDayOfWeek);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wHour "&lt;/span&gt; + pST.wHour);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wMillisec "&lt;/span&gt; + pST.wMilliseconds);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wMinute "&lt;/span&gt; + pST.wMinute);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wMonth "&lt;/span&gt; + pST.wMonth);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wSecond "&lt;/span&gt; + pST.wSecond);&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"wYear "&lt;/span&gt; + pST.wYear);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static void&lt;/span&gt; SystemEvents_TimeChanged&lt;br /&gt;     (&lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 153, 153);"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"Data atualizada."&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Um detalhe que merece atenção especial é o tipo de dados na declaração dos membros da estrutura (WORD neste exemplo) que representa um valor de 16 bits e, por isso, os membros da estrutura gerenciada foram declarados como &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:arial;" &gt;uint&lt;/span&gt;&lt;span style="font-family:arial;"&gt;, também de capacidade igual 16 bits. Da mesma forma, caso houvesse algum membro declarado como DWORD (32 bits), usaríamos o tipo gerenciado &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-family:arial;" &gt;int&lt;/span&gt;&lt;span style="font-family:arial;"&gt; de 32 bits. Isto garante que a exportação do código gerenciado para o não-gerenciado seja coerente e não gere resultados inesperados.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-423497086646161401?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/423497086646161401/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=423497086646161401&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/423497086646161401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/423497086646161401'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/03/setsystemtime.html' title='Ajustar Data-Hora em C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-6441418666638302623</id><published>2008-03-25T22:54:00.006-03:00</published><updated>2008-03-29T03:01:03.704-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Relações Humanas'/><category scheme='http://www.blogger.com/atom/ns#' term='pérolas'/><title type='text'>Leis de Murphy</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"If something can go wrong, it will."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Algumas leis militares de Murphy:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"A coisa mais perigosa na zona de combate é um oficial com um mapa."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"O problema em usar a saída mais fácil é que ela já foi minada pelo inimigo."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"O companheirismo é essencial à sobrevivência. Ele dá ao inimigo outra pessoa em quem atirar."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Algumas leis de Murphy para a Programação:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"Todo programa, quando acabado, estará obsoleto."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"Se um programa é útil, ele deve ser modificado."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"Se um programa é inútil, ele deve ser documentado."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"A complexidade de um programa cresce até exceder a capacidade do programador que deve mantê-lo."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Variantes relativas a projetos:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"As falhas de projetos andam sempre em grupos."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;"Errar é humano, mas para fazer coisas realmente idiotas é necessário um computador."&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Consultores são pessoas místicas que perguntam algo à empresa e depois dizem a mesma coisa de volta para ela."&lt;/span&gt; Lei de MacDonald&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Se os engenheiros construíssem prédios como os programadores escrevem programas, um único picapau seria capaz de destruir a civilização."&lt;/span&gt; Lei de Weinberg&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Nada é impossível para o homem que não tem que fazer por conta própria."&lt;/span&gt; Lei de Weiler&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Nunca programe e beba cerveja ao mesmo tempo."&lt;/span&gt; Lei de Woltman&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Sempre existe mais um bug."&lt;/span&gt; Lei de Lubersky da Entomologia Cibernética&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Variantes diversas:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Para cada ação existe uma crítica igual e no sentido contrário."&lt;/span&gt; Postulado de Harrison&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Se um objeto está em movimento, ele está indo na direção errada. Se um objeto está parado, ele está no lugar errado."&lt;/span&gt; Lei de Gerrold das dinâmicas infernais&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Um contrato verbal é aquele que não vale o papel em que seria escrito."&lt;/span&gt; Lei dos contratos de Goldwin&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"É um erro deixar qualquer objeto mecânico perceber que você está com pressa."&lt;/span&gt; Observação de Ralph&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Um contribuinte é alguém que não tem que fazer um concurso para trabalhar para o governo."&lt;/span&gt; Observação de Krueger&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;"Tudo depende."&lt;/span&gt; Lei de Langsam&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Trechos (selecionados e reordenados) de documento de autoria desconhecida (2002, traduzido por José Barreto Júnior), obtido no site eBooksBrasil.com no formato Rocket eBook alguns anos atrás (velhos arquivos-fantasmas assombrando meu sussego).&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-6441418666638302623?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/6441418666638302623/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=6441418666638302623&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6441418666638302623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/6441418666638302623'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/03/leis-de-murphy.html' title='Leis de Murphy'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-1693432575065741617</id><published>2008-03-19T22:59:00.009-03:00</published><updated>2008-05-05T21:43:19.483-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Envio de KeyStrokes em C#</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;No post anterior, minha extensão da classe &lt;span style="font-style: italic;"&gt;System.Diagnostics.Process&lt;/span&gt; implementou um método capaz de trazer a janela associada a um processo qualquer para o primeiro plano da área de trabalho. Neste post, segue a implementação que efetivamente envia keystrokes para a aplicação, como se as teclas fossem normalmente digitadas pelo teclado. O que fazer com isso? Lembra do bambú? Bom... e&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;nvia por keystrokes!&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;Criei uma nova classe chamada Stroker com um método público responsável por dar uma "cutucada" na aplicação. Este estímulo será enviado somente aos processos que, dentre a listas de todos os processos em execução, correspondam ao especificado pelo parâmetro formal do método.&lt;br /&gt;&lt;br /&gt;O estímulo à aplicação que se tornou a janela ativa é realizado por uma thread parametrizada, empregada para garantir um certo grau de isolamento entre o funcionamento geral da ferramenta e o envio de uma série de keystrokes específica. É minha solução atual e possivelmente será aperfeiçoada (mas funfa muito bem).&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Windows.Forms;&lt;span style="color: rgb(0, 153, 0);"&gt; // para SendKeys&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Diagnostics;&lt;span style="color: rgb(0, 153, 0);"&gt; // para processos&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Threading;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;namespace &lt;/span&gt;KeyStroker&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Stroker&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static public void &lt;/span&gt;Cutucada(&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;processo)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Process&lt;/span&gt;[] processos = &lt;span style="color: rgb(51, 153, 153);"&gt;Process&lt;/span&gt;.GetProcesses();&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;foreach &lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;Process &lt;/span&gt;p in processos)&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;// cada programa em execução&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: rgb(51, 51, 255);"&gt;if &lt;/span&gt;(p.ProcessName.IndexOf(processo) != -1)&lt;br /&gt;         {&lt;br /&gt;             &lt;span style="color: rgb(0, 153, 0);"&gt;// DLL do post anterior&lt;/span&gt;&lt;br /&gt;             Processo.&lt;span style="color: rgb(51, 153, 153);"&gt;Processo&lt;/span&gt;.Mostrar(p);&lt;br /&gt;&lt;br /&gt;             Cutucar(&lt;span style="color: rgb(153, 0, 0);"&gt;"A"&lt;/span&gt;);&lt;span style="color: rgb(0, 153, 0);"&gt; // teclas a enviar&lt;/span&gt;&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;private static void &lt;/span&gt;Cutucar(&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;param)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Thread &lt;/span&gt;t = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Thread&lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: rgb(51, 153, 153);"&gt;ParameterizedThreadStart&lt;/span&gt;(bg_SendKey));&lt;br /&gt;&lt;br /&gt;     t.Start(param);&lt;br /&gt;     t.Join(&lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;TimeSpan&lt;/span&gt;(0, 0, 4));&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;if &lt;/span&gt;(t.IsAlive)&lt;br /&gt;         t.Abort();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;static void &lt;/span&gt;bg_SendKey(&lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;param)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;Thread&lt;/span&gt;.Sleep(&lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;TimeSpan&lt;/span&gt;(0, 0, 2));&lt;br /&gt;     &lt;span style="color: rgb(51, 153, 153);"&gt;SendKeys&lt;/span&gt;.SendWait((&lt;span style="color: rgb(51, 51, 255);"&gt;string&lt;/span&gt;)param);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;A thread leva como parâmetro real a tecla "pressionada" e, após disparada, paralisa a thread principal da ferramenta (através do método &lt;span style="font-style: italic;"&gt;Thread.Join()&lt;/span&gt;) até que seu trabalho seja concluído ou o tempo limite especificado exceda em caso de algum problema. Neste caso, a thread será forçada a abortar sua execução.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Finalizando, a thread "filha" aguarda algum tempo (2 segundos no exemplo) para garantir que a janela já tenha se tornado ativa, e efetivamente envia o keystroke fornecido pelo parâmetro.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Obs.1: nesta implementação, a classe percorre todos os processos que atendam ao nome fornecido, alternando entre as janelas e enviando os keystrokes para cada uma delas.&lt;br /&gt;&lt;br /&gt;Obs.2: O exemplo ainda não está completo, falta uma aplicação qualquer que "use" a classe criada, mas postar isso já seria demais.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Útil? Para mim foi...&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-1693432575065741617?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/1693432575065741617/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=1693432575065741617&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1693432575065741617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1693432575065741617'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/03/e-o-bambu.html' title='Envio de KeyStrokes em C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-2409061920205231307</id><published>2008-03-19T01:35:00.011-03:00</published><updated>2008-05-05T21:44:01.764-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='Código-fonte'/><title type='text'>Process.BringToFront() em C#</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Após algum tempo de dedicação quase que exclusiva ao metaverso &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.forterrainc.com/" target="_blank"&gt;Forterra OLIVE&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, surgiu a necessidade de criar uma ferramenta capaz de enviar key strokes para uma aplicação específica que pode, inclusive, ter várias instâncias simultâneas.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Simples, basta obter uma lista de processos, executar algum método BringToFront() e então aplicar os key strokes. Fudéos! Não há um método mágico destes (que eu conheça), mas há uma gambiarra salvadora. Os key strokes ficarão para a próxima, focarei no método ausente.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;A idéia é relativamente simples. Não há o método mágico que traz uma aplicação para primeiro plano, mas há a propriedade &lt;span style="color: rgb(0, 0, 0); font-style: italic;"&gt;IntPtr Process&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.MainWindowHandle&lt;/span&gt;, que retorna um número identificador para a janela principal associada ao processo (ou zero se o processo não possuir GUI - interface gráfica).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Com este identificador (handle) em mãos, podemos apelar para o velho Windão e suas magníficas bibliotecas dinâmicas (DLL's). Neste caso, foram usadas as funções &lt;span style="font-style: italic;"&gt;SetForegroundWindow()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;ShowWindow()&lt;/span&gt;, ambas implementadas na DLL User32.dll, daí o atributo &lt;span style="font-style: italic;"&gt;System.Runtime.InteropServices.DllImport()&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Agora basta juntar estas tralhas, especificar a ação que a janela executará (detalhes no arquivo-cabeçalho &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.woodmann.com/fravia/sources/WINUSER.H" target="_blank"&gt;winuser.h&lt;/a&gt;&lt;span style="font-family:arial;"&gt;), e está pronto.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Um pulo-do-gato interessante é extender a classe &lt;span style="font-style: italic;"&gt;System.Diagnostics.Process&lt;/span&gt; num projeto do tipo class library (em que o assembly produzido é uma DLL) e incluir esta brincadeira, como fiz no exemplo a seguir.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Diagnostics; // classe Process&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using &lt;/span&gt;System.Runtime.InteropServices; // atributo DllImport&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Desc.: Biblioteca para complementar classe Process&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Prog.: vagnercsousa@yahoo.com.br&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Data.: 2008/03/18/23:00, Osasco&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;namespace &lt;/span&gt;Processo&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Processo &lt;/span&gt;: &lt;span style="color: rgb(51, 153, 153);"&gt;Process&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;[&lt;span style="color: rgb(51, 153, 153);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(153, 0, 0);"&gt;"User32.dll"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;static extern IntPtr &lt;/span&gt;SetForegroundWindow(&lt;span style="color: rgb(51, 51, 255);"&gt;IntPtr &lt;/span&gt;hWnd);&lt;br /&gt;&lt;br /&gt;[&lt;span style="color: rgb(51, 153, 153);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(153, 0, 0);"&gt;"User32.dll"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;static extern IntPtr &lt;/span&gt;ShowWindow&lt;br /&gt; (&lt;span style="color: rgb(51, 51, 255);"&gt;IntPtr &lt;/span&gt;hWnd, &lt;span style="color: rgb(51, 51, 255);"&gt;int &lt;/span&gt;nCmdShow);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public void &lt;/span&gt;Mostrar()&lt;br /&gt;{&lt;br /&gt;   Mostrar(&lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;, SW_Modos.SW_RESTORE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public void &lt;/span&gt;Mostrar(SW_Modos sw)&lt;br /&gt;{&lt;br /&gt;   Mostrar(&lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;, sw);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public static void &lt;/span&gt;Mostrar(&lt;span style="color: rgb(51, 153, 153);"&gt;Process &lt;/span&gt;p)&lt;br /&gt;{&lt;br /&gt;   Mostrar(p, SW_Modos.SW_RESTORE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public static void &lt;/span&gt;Mostrar(&lt;span style="color: rgb(51, 153, 153);"&gt;Process &lt;/span&gt;p, SW_Modos sw)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;IntPtr &lt;/span&gt;wptr = p.MainWindowHandle;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;if &lt;/span&gt;((&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt;)wptr != 0) &lt;span style="color: rgb(0, 153, 0);"&gt;// 0 se não possui GUI&lt;/span&gt;&lt;br /&gt;   {&lt;br /&gt;       SetForegroundWindow(wptr);&lt;br /&gt;       ShowWindow(wptr, (&lt;span style="color: rgb(51, 51, 255);"&gt;int&lt;/span&gt;)sw);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public enum &lt;/span&gt;SW_Modos&lt;br /&gt;{&lt;br /&gt;   SW_HIDE = 0,&lt;br /&gt;   SW_SHOWNORMAL = 1,&lt;br /&gt;   SW_NORMAL = 1,&lt;br /&gt;   SW_SHOWMINIMIZED = 2,&lt;br /&gt;   SW_SHOWMAXIMIZED = 3,&lt;br /&gt;   SW_MAXIMIZE = 3,&lt;br /&gt;   SW_SHOWNOACTIVATE = 4,&lt;br /&gt;   SW_SHOW = 5,&lt;br /&gt;   SW_MINIMIZE = 6,&lt;br /&gt;   SW_SHOWMINNOACTIVE = 7,&lt;br /&gt;   SW_SHOWNA = 8,&lt;br /&gt;   SW_RESTORE = 9,&lt;br /&gt;   SW_SHOWDEFAULT = 10,&lt;br /&gt;   SW_FORCEMINIMIZE = 11,&lt;br /&gt;   SW_MAX = 11&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Pronto. Agora sempre que precisar trazer uma aplicação para primeiro plano, basta referenciar a DLL gerada, usar a nova classe Processo e executar o método Mostrar() conforme as regras de negócio do projeto. Em execução:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YK-I1cKIr2o/R-EUsokI3HI/AAAAAAAAAFw/zTnJm2s99b0/s1600-h/KeyStroker.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_YK-I1cKIr2o/R-EUsokI3HI/AAAAAAAAAFw/zTnJm2s99b0/s200/KeyStroker.JPG" alt="" id="BLOGGER_PHOTO_ID_5179443803488574578" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-2409061920205231307?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/2409061920205231307/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=2409061920205231307&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2409061920205231307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/2409061920205231307'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/03/bringtofront.html' title='Process.BringToFront() em C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YK-I1cKIr2o/R-EUsokI3HI/AAAAAAAAAFw/zTnJm2s99b0/s72-c/KeyStroker.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-1589347745823061289</id><published>2008-03-05T17:56:00.009-03:00</published><updated>2008-04-05T15:33:43.794-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pérolas'/><title type='text'>[OFF] Geraldão</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Quem se lembra do Geraldão, personagem clássico do Glauco? Para relembrar os bãos tempos:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YK-I1cKIr2o/R88LDc8htLI/AAAAAAAAAFc/_98VEeVYSC8/s1600-h/Geraldao.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YK-I1cKIr2o/R88LDc8htLI/AAAAAAAAAFc/_98VEeVYSC8/s200/Geraldao.JPG" alt="" id="BLOGGER_PHOTO_ID_5174366650809562290" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Aproveitando o post, o show do Iron Maiden em SP foi espetacular&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YK-I1cKIr2o/R_fF6b78wSI/AAAAAAAAAG0/ryHtNNjBSLY/s1600-h/ironmaidensp.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YK-I1cKIr2o/R_fF6b78wSI/AAAAAAAAAG0/ryHtNNjBSLY/s200/ironmaidensp.jpg" alt="" id="BLOGGER_PHOTO_ID_5185831103662702882" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Algumas &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.orkut.com/Album.aspx?uid=16881449102771698194&amp;amp;aid=1204524437" target="_blank"&gt;(péssimas) fotos&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Up the Irons!!&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-1589347745823061289?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/1589347745823061289/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=1589347745823061289&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1589347745823061289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1589347745823061289'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/03/off-topic.html' title='[OFF] Geraldão'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YK-I1cKIr2o/R88LDc8htLI/AAAAAAAAAFc/_98VEeVYSC8/s72-c/Geraldao.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-4461588363366738271</id><published>2008-02-18T15:31:00.003-03:00</published><updated>2008-03-29T02:43:33.681-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gerência Projetos'/><title type='text'>Project Management Intro</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;Não costumo repassar notícias ou artigos, mas alguns são relevantes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"(...)IT projects fail at the beginning — not the end — due to a lack of sufficient planning. An IT organization must consider the resources it needs to devote to a project, the skills required and the people who need to be involved, and realistically consider the time it will take to create, test and implement the project deliverables. Otherwise, the project will be a mess. The IT organization will never complete it on time, on budget or with the required functionality, which are three common factors for project success.(...)"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://www.cio.com/article/40342" target="_blank"&gt;An Introduction to IT Project Management&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-4461588363366738271?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/4461588363366738271/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=4461588363366738271&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/4461588363366738271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/4461588363366738271'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/02/project-management-intro.html' title='Project Management Intro'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-5164249987434718092</id><published>2008-01-28T10:21:00.004-02:00</published><updated>2008-05-05T21:45:16.669-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='Lógica'/><category scheme='http://www.blogger.com/atom/ns#' term='Linden Scripting Language'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Jogo de Lógica em LSL e C#</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;Aí está. Deu trampo, mas saiu.&lt;br /&gt;&lt;br /&gt;Minha versão em LSL de um jogo de raciocínio citado no livro "Dominando Visual Studio .net com C#", do Fábio Camara.&lt;br /&gt;&lt;br /&gt;Por pura preguiça, não vou postar o exemplo todo aqui, apenas o &lt;a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=1660"&gt;link para o artigo&lt;/a&gt;, que saiu no &lt;a href="http://www.linhadecodigo.com.br/"&gt;Linha de Código&lt;/a&gt;. Aí estão umas imagens do meu cenário para o jogo.&lt;br /&gt;&lt;br /&gt;Imagem 1:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YK-I1cKIr2o/R53QaYa4rAI/AAAAAAAAAFM/cnMlV2nA36A/s1600-h/JogoLogica01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YK-I1cKIr2o/R53QaYa4rAI/AAAAAAAAAFM/cnMlV2nA36A/s200/JogoLogica01.jpg" alt="" id="BLOGGER_PHOTO_ID_5160509899686849538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;Imagem 2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YK-I1cKIr2o/R53QiYa4rBI/AAAAAAAAAFU/XIvWX7-RFwk/s1600-h/JogoLogica02.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YK-I1cKIr2o/R53QiYa4rBI/AAAAAAAAAFU/XIvWX7-RFwk/s200/JogoLogica02.JPG" alt="" id="BLOGGER_PHOTO_ID_5160510037125803026" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Bem sugestivo.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-5164249987434718092?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/5164249987434718092/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=5164249987434718092&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5164249987434718092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/5164249987434718092'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/01/jogo-de-lgica.html' title='Jogo de Lógica em LSL e C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YK-I1cKIr2o/R53QaYa4rAI/AAAAAAAAAFM/cnMlV2nA36A/s72-c/JogoLogica01.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-3868820677947229466</id><published>2008-01-07T09:38:00.006-02:00</published><updated>2008-03-29T03:05:53.461-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recursividade'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='pérolas'/><title type='text'>AlcoholicException</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Decidi disponibilizar o código-fonte que rege aproximadamente 98% do meu comportamento.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;// vagner's main behaviour&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;void&lt;/span&gt; Main(&lt;span style="color: rgb(0, 204, 204);"&gt;Cerva &lt;/span&gt;c)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  try&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    while &lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;true&lt;/span&gt;) { ++c.bebe; }&lt;br /&gt; }&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  catch &lt;/span&gt;(&lt;span style="color: rgb(0, 204, 204);"&gt;AlcoholicException &lt;/span&gt;e)&lt;br /&gt; {&lt;br /&gt;   myFígado.Dispose();&lt;br /&gt; }&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  finally&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;   Main(&lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;Cerva&lt;/span&gt;(-4.5));&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Desconsiderando algumas inicializações de rotina, isso roda que é uma beleza. Inclusive, acho que vou fazer uma versão 2.0 multi-thread, empregando também a classe &lt;span style="color: rgb(0, 204, 204);"&gt;Whisky&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-3868820677947229466?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/3868820677947229466/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=3868820677947229466&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/3868820677947229466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/3868820677947229466'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/01/alcoholicexception.html' title='AlcoholicException'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-172252846599150079</id><published>2008-01-04T18:51:00.000-02:00</published><updated>2008-01-04T18:56:55.433-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metaversos'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><title type='text'>Rumo Aos Metaversos</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Os metaversos serão, nos próximos anos, o que a internet representa hoje. O que começou como uma ferramenta militar, tornou-se um meio de comunicação acessível e cotidiano. Ela passou do modo texto para o conteúdo estático e então evoluiu para o dinâmico.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Mas nossa ambição não pára por aí. Do que era a foto de um produto num site qualquer, agora podemos tocá-lo e realizar interações como se aquilo estivesse em nossas mãos. Definitivamente, isto não é uma moda passageira e sim a direção pela qual o futuro vem se aproximando. Segue o que assim me faz acreditar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;É claro que os passos são tímidos, e devem ser cautelosos, embora os números apontem os brasileiros como a segunda maior comunidade de "secondlifeanos" no mundo. No entanto, ainda temos uma participação pouco ativa. Este cenário torna-se paradoxal ao considerar que o envolvimento com o mundo virtual não impõe custo algum aos seus residentes e que investe apenas:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;1. Quem desejar (preferencialmente com uma boa estratégia na agulha, assim como em qualquer negócio).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Redobrando a característica pessoal deste texto, acredito que devemos deslocar nosso espectro de costumes usuais e pensar como habitantes de um metaverso. Em outras palavras, imagine entrar em uma casa virtual e, ao invés de móveis convencionais, ela lhe propiciar experiências limitadas no mundo real. Esta "casa" pode ser qualquer espaço e as experiências podem ser tanto profissionais como de entretenimento. Particularmente, eu adoraria ver a Chapada Diamantina em tempo real numa parede e ler Bertrand Russell em outra, enquanto participo de uma conferência com o avatar do meu chefe.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Indo ainda mais longe, talvez até demais e além do que o Second Life pode oferecer atualmente, esta mesma conferência virtual poderia ser transmitida dentro do metaverso por uma espécie de holograma. Isto já seria um mundo virtual elevado ao quadrado, mas evitaria transpor uma limitação física humana para o avatar. Confuso, mas da mesma forma que uma pessoa não é capaz de se teletransportar no mundo real (por enquanto e desconsiderando a possibilidade de conversão de massa em energia à velocidade da luz como defendido por Einstein na Teoria da Relatividade), impor que um avatar deva fazê-lo no virtual para interagir com outro torna-se contraditório. Mas isso já é viajar longe em uma bola de neve.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;O fato é que os metaversos são a tendência para a web que conhecemos, além de fascinantes, e estão aí para serem desbravados. Coragem, homens!&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-172252846599150079?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/172252846599150079/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=172252846599150079&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/172252846599150079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/172252846599150079'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/01/rumo-aos-metaversos.html' title='Rumo Aos Metaversos'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-1652176023053236674</id><published>2008-01-03T17:21:00.004-02:00</published><updated>2008-05-05T21:46:39.226-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Práticas'/><category scheme='http://www.blogger.com/atom/ns#' term='Gerência Projetos'/><title type='text'>Game Design Documents</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;(Esse é sério, não outra &lt;a href="http://vsousa.blogspot.com/2007/11/design-document.html"&gt;tira&lt;/a&gt;!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Seguem alguns links para design documents aplicados a jogos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.vancouver.wsu.edu/fac/peabody/game-book/ACGD.pdf"&gt;The Art of Computer Game Design&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, Chris Crawford&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.engin.umd.umich.edu/CIS/course.des/cis587/design-tx/game.html"&gt;2D Game Design Documents&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, Vários documentos/autores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.sloperama.com/advice.html"&gt;Game Biz Advice&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, Tom Sloper&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://kb.lutherlink.de/Introducao_GameDesign.pdf"&gt;Introdução ao Game Design&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, Ricardo Vladimiro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;É isso.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-1652176023053236674?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/1652176023053236674/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=1652176023053236674&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1652176023053236674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/1652176023053236674'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2008/01/game-design.html' title='Game Design Documents'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6243877953240735013.post-3375164883454796689</id><published>2007-12-19T20:51:00.005-02:00</published><updated>2008-05-05T21:47:05.260-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Linden Scripting Language'/><title type='text'>Prims Rezzing em LSL</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Segue um rápido exemplo sobre programação para Second Life em Linden Scripting Language.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Trata-se de uma demonstração simples e interessante sobre como criar novas instâncias de objetos via código, além de obter um efeito visualmente interessante.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para este exemplo e utilizando uma primitiva com dimensões de, digamos, 10 x 2 x 0.1 metros, teremos o seguinte resultado:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YK-I1cKIr2o/R2mmAhOLjRI/AAAAAAAAAE0/keplaVJ1WhU/s1600-h/rez04.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YK-I1cKIr2o/R2mmAhOLjRI/AAAAAAAAAE0/keplaVJ1WhU/s200/rez04.JPG" alt="" id="BLOGGER_PHOTO_ID_5145826577095560466" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para tanto, é necessário apenas que o script a seguir e uma cópia do objeto a ser replicado sejam colocados no inventário da primitiva principal. Esta mesma primitiva fará cópias do objeto, sendo que as novas instâncias são posicionadas estrategicamente, resultando numa forma mais atraente regida por um padrão de comportamento específico.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Neste caso, as cópias terão um deslocamento vertical para cima composto com uma pequena rotação em torno do eixo Z, de maneira que a altura da figura como um todo não ultrapasse 10 metros e que a resultante desses incrementos de rotação complete uma volta de giro.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Na verdade, o código é mais simples do que a explicação, mas, de qualquer forma, o que nos interessa é, principalmente, as equações para determinar a posição e a rotação.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;- Para a posição, basta acrescentar à altura do último objeto o incremento desejado, que neste exemplo é a relação entre a altura máxima pretendida o número total de objetos. Outra maneira, mais conveniente em termos de programação, é acrescentar à posição da primitiva principal o produto entre o número da cópia atual e o incremento, resultando também no offset desejado. Por fim, a posição será dada por, simplesmente,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;llGetPos() + &lt;0,&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;- Para a rotação, um raciocínio análogo é aplicado. Desejamos que cada objeto tenha uma pequena rotação em relação ao anterior, mas que entre o primeiro e o último objeto, tenhamos completado uma volta de giro. Como uma volta completa são 360 graus ou 2*PI radianos, nosso incremento angular será dado pela razão entre 360º e o número total de objetos. Em relação à primitiva root, o offset angular para cada objeto será dado por, também simplesmente e utilizando a notação de Euler,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;0,&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Daí, o restante do código apenas executa as iterações necessárias para criação das cópias, como pode ser visto completamentamente a seguir:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;default&lt;br /&gt;{&lt;br /&gt; state_entry()&lt;br /&gt; {&lt;br /&gt;   llSay(0, "Ola, avatar! " +&lt;br /&gt;     "Toque no objeto para ver o resultado.");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; touch_start(integer total_number)&lt;br /&gt; {&lt;br /&gt;   integer objetos = 30;&lt;br /&gt;   integer atual;&lt;br /&gt;&lt;br /&gt;   for (atual = 1; atual &lt;= objetos; ++atual)     {       float incremento = 10.0 / objetos;       vector pos = llGetPos() + &lt;0,&gt;;&lt;br /&gt;&lt;br /&gt;     float incAngular = atual * TWO_PI / objetos;&lt;br /&gt;     rotation rot = llEuler2Rot(&lt;0,&gt;);&lt;br /&gt;&lt;br /&gt;     llRezObject("Object", pos, ZERO_VECTOR, rot, 0);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Como sempre, a matemática nos ajudando. Daí para uma auto-montável-árvore de natal basta um pulo. E o objeto inicial era apenas uma tábua de madeira:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YK-I1cKIr2o/R2mp4ROLjSI/AAAAAAAAAE8/w8caQ_gL8sY/s1600-h/rez03.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YK-I1cKIr2o/R2mp4ROLjSI/AAAAAAAAAE8/w8caQ_gL8sY/s200/rez03.JPG" alt="" id="BLOGGER_PHOTO_ID_5145830833408150818" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6243877953240735013-3375164883454796689?l=vsousa.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vsousa.blogspot.com/feeds/3375164883454796689/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6243877953240735013&amp;postID=3375164883454796689&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/3375164883454796689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6243877953240735013/posts/default/3375164883454796689'/><link rel='alternate' type='text/html' href='http://vsousa.blogspot.com/2007/12/prims-rezzing.html' title='Prims Rezzing em LSL'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03825684545520129533'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YK-I1cKIr2o/R2mmAhOLjRI/AAAAAAAAAE0/keplaVJ1WhU/s72-c/rez04.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>