Terça-feira, 24 de Março de 2009

Asp.net Timer (C#)

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.

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.


‹%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %›

‹!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"›
‹html xmlns="http://www.w3.org/1999/xhtml"›
‹head runat="server"›
‹title›Exemplo: ASP.NET Timer‹/title›
‹/head›
‹body›
‹form id="form1" runat="server"›
‹!-- necessário para ajax.net --›
‹asp:ScriptManager ID="ScriptManager1" runat="server" /›
‹div›
‹!-- timer que atualiza o updatepanel --›
‹asp:Timer ID="timer" runat="server" Interval="1000"
Enabled="true" OnTick="timer_Tick"›‹/asp:Timer›

‹!-- região a ser atualizada --›
‹asp:UpdatePanel ID="UpdatePanel1"
runat="server" UpdateMode="Conditional"›
‹Triggers›
‹asp:AsyncPostBackTrigger ControlID="timer"/›
‹/Triggers›
‹ContentTemplate›
‹!-- controles afetados --›
‹asp:Label ID="Label1" runat="server"›
‹/asp:Label›
‹/ContentTemplate›
‹/asp:UpdatePanel›
‹/div›
‹/form›
‹/body›
‹/html›

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 RenderMode="Inline" na declaração do UpdatePanel.

E o code behind da página:


using System;
using System.Web.UI;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
timer.Tick += new EventHandler‹EventArgs›(timer_Tick);
}

public void timer_Tick(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
}
}

Como o ambiente é naturalmente lento, a frequência de atualização deve ser estimada com cuidado.

Sexta-feira, 13 de Março de 2009

Links Python


Python

The Python Challenge

PyGame

Quinta-feira, 11 de Dezembro de 2008

Custom Events em C#

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.

(This is a sample application written in C# that demonstrates how to trigger some action when an expensive function finishes its job.)

Para testar, basta criar uma aplicação do tipo console com o código abaixo:

using System;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (int myNum = 0; myNum ‹ 5; myNum++)
{
// Objeto de teste
CTest ct = new CTest();

// Método que será executado após o
// término do processamento demorado.
ct.TestCompleted += new CTest.TestEventHandler(
ct_TestCompleted);

// Roda o método demorado, liberando
// a aplicação principal.
new Thread(new ParameterizedThreadStart(
ct.Test)).Start(myNum);
}
}

// Sinaliza o término da tarefa.
static void ct_TestCompleted(
object sender, CTest.TestEventArgs e)
{
// Os parâmetros estarão no objeto (e)
Console.WriteLine("Completed: " + e.j);
}
}

class CTest
{
// Este é o método demorado.
// "myNum" Apenas identifica as threads.
public void Test(object myNum)
{
// Sinaliza o início da tarefa
Console.WriteLine("Starting: " + myNum);

// Simula um processamento demorado
Thread.Sleep(3000);

// Dispara o evento ao terminar
RaiseTestCompleted((int)myNum);
}

// Nesta classe são definidos
// objetos para uso posterior.
public class TestEventArgs : System.EventArgs
{
public int j; // um exemplo
public TestEventArgs(int j)
{
this.j = j;
}
}

// Declaração de um delegate
// e um evento auxiliares
public delegate void TestEventHandler(
object sender, TestEventArgs e);

public event TestEventHandler TestCompleted;

// Este método prepara os parâmetros
// e dispara o evento assíncrono.
private void RaiseTestCompleted(int j)
{
TestEventArgs args = new TestEventArgs(j);
OnTest(this, args);
}

protected virtual void OnTest(
object sender, TestEventArgs e)
{
if (TestCompleted != null)
TestCompleted(this, e);
}
}
}

Em passos gerais, é criada uma classe TestEventArgs com os objetos que serão expostos via argumentos da função executada logo após o término do processamento demorado.

Neste exemplo, disparo 5 threads que demoram alguns segundos. Note que, devido à concorrência do sistema, ocasionalmente elas podem finalizar fora de ordem.

Talvez um pouco confuso à primeira vista, mas muito útil em diversas aplicações.

Quinta-feira, 4 de Dezembro de 2008

Deserto Verde

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 3.600km pelo deserto verde, ou Aracruz Celulose, como preferir.

Quinta-feira, 20 de Novembro de 2008

Eu de Volta

Limpando as teias das aranhas que andam por aqui...

Resumindo, desde minha evolução da Kaizen Games para a AGX Tecnologia em julho/2008, tenho estado bem ocupado e deixei este blog às traças (não que fosse muito útil).

Saí de Sampa para São Carlos City e me envolvi com sistemas georreferenciados e sistemas embarcados. Tenho usado MapServer e PostgreSQL/PostGIS com C# (sim, é possível), microcontroladores PIC, MPLAB, linguagem C, meus velhos amigos Delphi e Visual Studio, e outras coisas open source.

Quando possível, ainda tento brincar com SDL em C++ e Python (PyGame), estudar redes neurais artificiais, ler Nietzsche, Bertrand Russell e Geraldão, assistir Fudêncio e passar um tempo no Ubuntu.

Continuo ouvindo Clannad, Joy Division, Haggard, Eluveitie, Los Orishas e Raul Seixas, obviamente.

Enfim, pretendo voltar a compartilhar algumas coisas que aprender - porém daqui alguns dias - neste final de semana devo viajar a serviço para Aracruz/ES. A proprósito: a 20km de uma praia de nudismo... hehehe

E os churras continuam os mesmos - ou melhores.

Domingo, 1 de Junho de 2008

Novos Blogs de Programação

Enfim tomei coragem (e juízo) para iniciar um novo blog, especializado em programação para Second Life. Chamei-o de Hello, Avatar! por motivos óbvios e é outro blog apenas por organização, pois os demais tópicos varzeados em geral vão continuar por aqui.

Também pretendo, muito em breve, iniciar um outro voltado para a programação de jogos, que chemei de AVE MVNDE (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.

Terça-feira, 27 de Maio de 2008

A Era dos Videogames

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 A Era do Videogame.

É 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.

Aproveitando o link, tem um joguinho legal brazuca de corrida com ótimos gráficos: Bucking Fuggy. E para quem quiser relembrar um crássico, aqui tem o Prince Of Persia rodando direto no browser.

Cumprida a obrigação, agora vem a diversão: se der cara, C# (libsecondlife). Se der coroa, C++ (SDL). Coroa venceu.

José Saramago

"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." José Saramago

Quinta-feira, 15 de Maio de 2008

The Fódest Game

Mais um joguinho para descontrair: The World's Hardest Game

Não é novidade, mas é legal.

Quinta-feira, 8 de Maio de 2008

Second Life and the Public Good

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 Cidade do Conhecimento. 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.

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.

Teletransportei-me então para a
International Island, 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 site do projeto, pela própria Tori Horton, que foi muito atenciosa.

Ao final do evento, ao acionar por descuido meu microfone e despertar interesse em alguns residentes pelo idioma "não identificado", em particular Rhiannon Chatnoir, integrante do The Vesuvius Group, mais um novo e interessante contato estava feito.

Depois disso tudo, alguém ainda poderia perguntar:

- Por quê usar Second Life?

e eu poderia responder simplesmente:

- 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.

mas esta experiência me mostrou que o ambiente virtual é realmente intangível e pode ir muito além dessa resposta superficial.