<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DestaqueBlog &#187; aplicação</title>
	<atom:link href="http://weblog.destaquenet.com/tag/aplicacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.destaquenet.com</link>
	<description>Blog da equipe Destaquenet.</description>
	<lastBuildDate>Tue, 23 Nov 2010 17:06:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Mensagens flash a la Rails para Django com django-flash</title>
		<link>http://weblog.destaquenet.com/2009/02/06/mensagens-flash-a-la-rails-para-django-com-django-flash/</link>
		<comments>http://weblog.destaquenet.com/2009/02/06/mensagens-flash-a-la-rails-para-django-com-django-flash/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 01:17:42 +0000</pubDate>
		<dc:creator>Daniel Martins</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[aplicação]]></category>
		<category><![CDATA[destaquenet]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://weblog.destaquenet.com/?p=328</guid>
		<description><![CDATA[Minha história com o Django começou mais ou  menos em Junho do ano passado, enquanto procurava uma ferramenta adequada a ser utilizada num trabalho que precisava ser feito na época. Francamente, eu achava que não iria dar certo, talvez por &#8230; <a href="http://weblog.destaquenet.com/2009/02/06/mensagens-flash-a-la-rails-para-django-com-django-flash/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Minha história com o <a href="http://www.djangoproject.com/">Django</a> começou mais ou  menos em Junho do ano passado, enquanto procurava uma ferramenta adequada a ser utilizada num trabalho que precisava ser feito na época.</p>
<p>Francamente, eu achava que não iria dar certo, talvez por culpa de uma screencast horrível que eu acabara de ver, não sei. Mas o fato é que, contrariando minhas expectativas, o Django vem se mostrando uma ferramenta muito interessante. Se você ainda não conhece, veja você mesmo o que Django (e <a href="http://www.python.org/">Python</a>, claro!) podem fazer por você.</p>
<p>Mas voltando ao assunto, a primeira vez que precisei usar algo que o Django não oferecia por padrão foi quando tentei utilizar um recurso muito querido  pelo pessoal do <a href="http://rubyonrails.org/">Rails</a>: as <a href="http://api.rubyonrails.org/classes/ActionController/Flash.html">mensagens <em>flash</em></a>.<sup class='footnote'><a href='#fn-328-1' id='fnref-328-1'>1</a></sup> Por esse motivo, eu comecei um projeto <a href="http://www.destaquenet.com/portifolio/">open source</a> chamado <a href="http://djangoflash.destaquenet.com/">django-flash</a>, cujo objetivo é (pasmem!) levar as mensagens flash do Rails ao Django. <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O projeto vem sido desenvolvido no meu tempo livre e hoje chega à <a href="http://pypi.python.org/pypi/django-flash/1.4.1">versão 1.4.1</a>, oferecendo todos os recursos então presentes no seu irmão mais velho. Acredito que o projeto chegou num grau interessante de maturidade: API estável, documentação abundante, código extremamente bem comentado e apoiado por testes (unitários e de integração).</p>
<p>Portanto, se você precisa de algo semelhante às mensagens <em>flash</em> do Rails em seu projeto Django, não deixe de conferir o <a href="http://djangoflash.destaquenet.com/">site do projeto</a>. Conto com a ajuda de vocês para tornar este projeto cada vez melhor!</p>
<p>Um bom fim de semana a todos!</p>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-328-1'>Na verdade a app <a href="http://docs.djangoproject.com/en/dev/topics/auth/">contrib.auth</a> do Django possui um método <code>user.message_set.create()</code>, que, convenhamos, é um <em>hack</em>. Além do mais, ele só funciona se o usuário estiver logado no site. <span class='footnotereverse'><a href='#fnref-328-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://weblog.destaquenet.com/2009/02/06/mensagens-flash-a-la-rails-para-django-com-django-flash/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Seaside: um framework web de verdade</title>
		<link>http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/</link>
		<comments>http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 01:44:39 +0000</pubDate>
		<dc:creator>Daniel Martins</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[aplicação]]></category>
		<category><![CDATA[componentes]]></category>
		<category><![CDATA[continuations]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[seaside]]></category>
		<category><![CDATA[smalltalk]]></category>
		<category><![CDATA[squeak]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://weblog.destaquenet.com/?p=78</guid>
		<description><![CDATA[Provavelmente isso não é novidade para alguns de vocês, mas já faz algum tempo que eu venho me aventurando pelo incrível mundo do Smalltalk. Dando prosseguimento à esta saga, tenho o orgulho de anunciar a minha próxima vítima: o framework &#8230; <a href="http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Provavelmente isso não é novidade para alguns de vocês, mas já faz algum tempo que eu venho me  aventurando pelo incrível mundo do <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a>. Dando prosseguimento à esta saga, tenho o orgulho de anunciar a minha próxima vítima: o <em>framework</em> <a href="http://seaside.st/">Seaside</a>!</p>
<p>O Seaside é um impressionante <em>framework web</em> escrito em Smalltalk focado no desenvolvimento de <del datetime="2008-10-01T00:58:21+00:00">sites</del> aplicações <em>stateful</em>. Mesmo conhecendo muito pouco a respeito do seu funcionamento &#8212; até então, nada além de um mísero <em>hello world</em> &#8212; resolvi tentar criar uma aplicação que realmente fizesse algo a mais do que simplesmente escrever um texto na tela.</p>
<p>A experiência foi muito boa, mas poderia ter sido melhor se o projeto contasse com uma documentação decente. O código do <em>framework</em> propriamente dito é muito bem documentado e é possível aprender bastante, mesmo tendo apenas o <em>Class Browser</em> do <a href="http://www.squeak.org/">Squeak</a> como recurso de pesquisa. Mas convenhamos: uma documentação <a href="http://djangobook.com/">como esta</a> ainda faz falta, principalmente para os aventureiros que, como eu, não fazem parte do <em>core team</em> do Seaside. <span id="more-78"></span></p>
<h3>Entendendo o exemplo</h3>
<p>Não mostrarei nada de muito complexo aqui, até porque eu também estou aprendendo. Mas o exemplo é interessante para conhecermos algumas das características principais do Seaside, que serão explicadas no decorrer deste <em>post</em>.</p>
<p><div id="attachment_79" class="wp-caption alignright" style="width: 215px"><a href="http://weblog.destaquenet.com/wp-content/uploads/2008/09/state.png"><img src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/state-205x300.png" alt="Diagrama de estados" title="Diagrama de estados" width="205" height="300" class="size-medium wp-image-79" /></a><p class="wp-caption-text">Diagrama de estados</p></div>Você conhece aquele jogo de &#8220;adivinhar o número&#8221;? Pois então&#8230; criaremos aqui algo parecido. Ao lado, você pode conferir uma imagem que ilustra como a aplicação deverá funcionar.</p>
<p>Ao abrir a aplicação, o usuário irá ver uma mensagem, que deverá confirmar para que o jogo comece. Quando o usuário confirma, o sistema gera um número aleatório entre 1 e 10 e mostra um formulário, que o usuário deve preencher com seu palpite. Em seguida, o sistema checa se o palpite do usuário corresponde ao número gerado aleatoriamente: se sim, o sistema mostra uma mensagem parabenizando o usuário; caso contrário, o sistema re-exibe o formulário, mostrando a contagem de &#8220;chutes&#8221; até o momento, além de uma mensagem com uma dica, para ajudar o usuário a adivinhar o número.</p>
<p>Esse ciclo continua até o usuário acertar. Por fim, o sistema pergunta se o usuário deseja jogar novamente: em caso afirmativo, um novo número é sorteado e o formulário re-exibido; senão, a mensagem de boas vindas é mostrada.</p>
<p>Ainda em relação ao diagrama, perceba que há um quadrado vermelho em torno de algumas atividades. Basicamente, isso quer dizer que a aplicação não deve permitir que o usuário volte (com o botão <em>back</em> do <em>browser</em>) e re-submeta um palpite após já tê-lo acertado. Em outras palavras, eu quero que as atividades dentro do quadrado vermelho representem um <em>workflow</em>, ou transação.</p>
<h3>Introdução</h3>
<p>O Seaside trabalha com o conceito de componentes. Neste exemplo, criaremos dois componentes para implementar a aplicação proposta. Um será responsável por controlar o fluxo de navegação do usuário pela aplicação, e o outro que receberá o <em>input</em> do usuário através de um formulário. Mas, antes de prosseguirmos, vamos aprender para que servem duas das mais importantes classes do Seaside: <code>WAComponent</code> e <code>WATask</code>.</p>
<p>A classe <code>WAComponent</code> será sua melhor amiga em um projeto Seaside, pois é através da criação de sub-classes de <code>WAComponent</code> que construímos a aplicação, pedaço por pedaço. Toda sub-classe de <code>WAComponent</code> deve implementar o método <code>#renderContentOn:</code>, pois é através deste que definimos como o componente deve ser renderizado no <em>browser</em> do usuário.</p>
<p>A classe <code>WATask</code>, por sua vez, é parecida com a classe <code>WAComponent</code> (de fato, ela a estende), com a diferença que ela não é usada para nada além de definir uma tarefa, ou melhor, a ordem com que outras tarefas e componentes devem ser chamados de modo a cumprir um determinado objetivo. Em poucas palavras: estenda <code>WATask</code> para definir <em>workflows</em>!</p>
<h3>Entendendo a interação entre os componentes</h3>
<p>Como pôde ser visto no diagrama de atividades mostrado anteriormente, o fluxo começa quando o usuário confirma que deseja jogar, passando o controle para o fomulário. O formulário é então renderizado no <em>browser</em> do usuário para que ele possa enviar um palpite. Em seguida, quando o usuário submete o formulário, o componente chamador (que é o próprio fluxo) recebe o palpite do usuário e o compara com o número gerado no início. Dependendo do resultado dessa comparação, o formulário é exibido novamente ou a mensagem de sucesso é mostrada.</p>
<p>Certo&#8230; talvez tenha ficado confusa a parte em que um componente &#8220;passa o controle&#8221; para outro. Esse é um conceito muito importante em um <em>framework</em> como o Seaside. Para entender essa coisa do &#8220;passa o controle&#8221;, imagine uma chamada de método comum:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">**</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// chama o método (&quot;passa o controle&quot;)</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// faz algo aqui</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Neste exemplo de código C, quando chamamos um método, o fluxo de execução é modificado, fazendo com que o método chamado assuma o controle. Então, quando o método termina, o fluxo retorna ao método chamador.</p>
<p>Simples não? Agora imagine isso <strong>funcionando na web</strong>. Imagine que o método <code>main</code> do exemplo fosse um componente da nossa aplicação, e que esse componente pudesse passar o controle para <strong>outros</strong> componentes, assim como a chamada de método no exemplo, só que com a possibilidade de manter essa pilha de execução entre as requisições HTTP! Isso resolveria um monte de problemas, não é?</p>
<p>Felizmente, é assim que o Seaside trabalha. O conceito por trás disso é chamado de <a href="http://en.wikipedia.org/wiki/Continuation">Continuation</a>. A imagem a seguir tenta ilustrar o funcionamento disso no contexto do nosso exemplo:</p>
<div id="attachment_80" class="wp-caption aligncenter" style="width: 310px"><a href="http://weblog.destaquenet.com/wp-content/uploads/2008/09/sequence.png"><img src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/sequence-300x189.png" alt="Sequência de requisições" title="Sequência de requisições" width="300" height="189" class="size-medium wp-image-80" /></a><p class="wp-caption-text">Sequência de requisições</p></div>
<p>Se desconsiderarmos por um momento o modelo (limitado) de <em>request/response</em> no qual o protocolo HTTP se baseia, a sequência de interações do usuário para com a aplicação se parece com o especificado no diagrama acima. No diagrama, é como se tivéssemos uma pilha de chamadas que não se perde entre as requisições!</p>
<p>O foco deste <em>post</em> não é explicar a teoria por trás desses conceitos todos, portanto, se você tem interesse em saber mais sobre o assunto, use o Google! <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Definindo o fluxo da aplicação</h3>
<p>Vamos criar o componente responsável por controlar o fluxo de navegação da aplicação. O componente a seguir estende <code>WATask</code> e possui as variávies de instância <code>number</code> e <code>form</code> que servem, respectivamente, para armazenar o número gerado e o formulário usado para receber o <em>input</em> do usuário:</p>

<div class="wp_syntax"><div class="code"><pre class="smalltalk" style="font-family:monospace;"><span style="color: #0000ff;">WATask</span> subclass: <span style="color: #7f0000;">#GuessingAppComponent</span>
    instanceVariableNames: <span style="color: #7f0000;">'number form'</span>
    classVariableNames: <span style="color: #7f0000;">''</span>
    poolDictionaries: <span style="color: #7f0000;">''</span>
    category: <span style="color: #7f0000;">'GuessingApp'</span>
&nbsp;
<span style="color: #0000ff;">GuessingAppComponent</span> class&gt;&gt;canBeRoot
    ^true
&nbsp;
<span style="color: #007f00; font-style: italic;">&quot;Accessors for instance variables&quot;</span>
&nbsp;
<span style="color: #0000ff;">GuessingAppComponent</span>&gt;&gt;children
    ^ <span style="color: #0000ff;">Array</span> with: <span style="color: #7f007f;">self</span> form
&nbsp;
<span style="color: #0000ff;">GuessingAppComponent</span>&gt;&gt;initialize
    <span style="color: #007f00; font-style: italic;">&quot;Configure initial values&quot;</span>
&nbsp;
    <span style="color: #7f007f;">self</span> number: <span style="color: #00007f;">10</span> atRandom;
        form: <span style="">&#40;</span><span style="color: #0000ff;">GuessNumberForm</span> new<span style="">&#41;</span>
&nbsp;
<span style="color: #0000ff;">GuessingAppComponent</span>&gt;&gt;go
    <span style="color: #007f00; font-style: italic;">&quot;Start application workflow&quot;</span>
&nbsp;
    <span style="color: #7f007f;">self</span> inform: <span style="color: #7f0000;">'Start the game pushing the button below!!'</span>.
    <span style="">&#91;</span><span style="color: #7f007f;">self</span> initialize;
        <span style="">&#91;</span><span style="color: #7f007f;">self</span> call: <span style="color: #7f007f;">self</span> form.
            <span style="color: #7f007f;">self</span> form number &lt; <span style="color: #7f007f;">self</span> number
                ifTrue: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form message: <span style="color: #7f0000;">'Try a higher value'</span><span style="">&#93;</span>
                ifFalse: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form message: <span style="color: #7f0000;">'Try a lower value'</span><span style="">&#93;</span><span style="">&#93;</span>
                doWhileFalse: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form number <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #7f007f;">self</span> number<span style="">&#93;</span><span style="">&#93;</span>
        doWhileTrue: <span style="">&#91;</span><span style="color: #7f007f;">self</span> confirm: <span style="color: #7f0000;">'You won the game using '</span> , <span style="color: #7f007f;">self</span> form guesses asString , <span style="color: #7f0000;">' guess(es)!! Play again?'</span><span style="">&#93;</span></pre></div></div>

<p>Todo o código é bem simples de se entender, com exceção do método <code>#go</code>. Veja que o corpo do método não passa de uma transcrição dos diagramas mostrados anteriormente. Atenção especial para a chamada <code>self call:</code>, que é o equivalente ao exemplo de chamada de método, com a diferença que estamos transferindo o controle para que outro componente possa executar no lugar do componente corrente. Perceba também que este método <strong>ainda não está pronto</strong>, pois, do jeito que está, a aplicação não está preparada para caso o usuário queira re-submeter um palpite após já tê-lo acertado&#8230; faremos isso depois! </p>
<h3>Recebendo o <em>input</em> do usuário</h3>
<p>Abaixo segue o código do componente usado para receber o palpite do usuário. O componente estende <code>WAComonent</code> e tem as variáveis de instância <code>number</code>, <code>message</code> e <code>guesses</code>. Essas variáveis servem, respectivamente, para: guardar o palpite do usuário quando o formulário é submetido; guardar a dica a ser exibida para o usuário (algo do tipo &#8220;chute um valor mais alto&#8221;, ou &#8220;mais baixo&#8221;); e guardar o número de vezes que o formulário foi submetido:</p>

<div class="wp_syntax"><div class="code"><pre class="smalltalk" style="font-family:monospace;"><span style="color: #0000ff;">WAComponent</span> subclass: <span style="color: #7f0000;">#GuessNumberForm</span>
    instanceVariableNames: <span style="color: #7f0000;">'message number guesses'</span>
    classVariableNames: <span style="color: #7f0000;">''</span>
    poolDictionaries: <span style="color: #7f0000;">''</span>
    category: <span style="color: #7f0000;">'GuessingApp'</span>
&nbsp;
<span style="color: #007f00; font-style: italic;">&quot;Accessors for instance variables&quot;</span>
&nbsp;
<span style="color: #0000ff;">GuessNumberForm</span>&gt;&gt;increment
    <span style="color: #007f00; font-style: italic;">&quot;Increments the number of guesses&quot;</span>
&nbsp;
    <span style="color: #7f007f;">self</span> guesses: <span style="color: #7f007f;">self</span> guesses + <span style="color: #00007f;">1</span>
&nbsp;
<span style="color: #0000ff;">GuessNumberForm</span>&gt;&gt;initialize
    <span style="color: #007f00; font-style: italic;">&quot;Configure initial values&quot;</span>
&nbsp;
    <span style="color: #7f007f;">self</span> number: <span style="color: #00007f;">1</span>;
        message: <span style="color: #7f0000;">'Try a number between 1 and 10'</span>;
        guesses: <span style="color: #00007f;">0</span>.
&nbsp;
<span style="color: #0000ff;">GuessNumberForm</span>&gt;&gt;renderContentOn: <span style="color: #00007f;">html</span>
    <span style="color: #007f00; font-style: italic;">&quot;Render component&quot;</span>
&nbsp;
    html heading: <span style="color: #7f007f;">self</span> message level: <span style="color: #00007f;">4</span>.
    <span style="color: #00007f;">html</span> heading: <span style="color: #7f0000;">'You did '</span> , <span style="color: #7f007f;">self</span> guesses asString , <span style="color: #7f0000;">' guess(es) until now'</span> level: <span style="color: #00007f;">5</span>.
    <span style="color: #00007f;">html</span> form
        with: <span style="">&#91;</span><span style="color: #00007f;">html</span> textInput value: <span style="color: #7f007f;">self</span> number;
                callback: <span style="">&#91;</span>:<span style="color: #00007f;">value</span> | <span style="color: #7f007f;">self</span> increment; number: <span style="color: #00007f;">value</span> asInteger; answer<span style="">&#93;</span>.
            <span style="color: #00007f;">html</span> submitButton value: <span style="color: #7f0000;">'check my guess!!'</span><span style="">&#93;</span></pre></div></div>

<p>Novamente, a simplicidade impera. <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  A única coisa deste código que vale explicar é o método <code>#renderContentOn:</code>, que serve para que possamos definir o que deve ser retornado ao usuário quando o componente precisar ser renderizado. O método recebe um objeto <code>WAHtmlCanvas</code> por parâmetro, responsável por gerar código <acronym title="eXtended Hyper Text Markup Language">XHTML</acronym> automaticamente. Para quem tem conhecimentos em <acronym title="Hyper Text Markup Language">HTML</acronym>, o código é bem trivial, com exceção do método <code>#callback</code>, onde colocamos algum código para ser executado quando o formulário for submetido. Perceba a chamada a <code>self answer</code> no final da linha, que é responsável por devolver o controle ao componente chamador (o que executou <code>self call: form</code>).</p>
<h3>Demarcando uma transação</h3>
<p>Se lembra do quadrado vermelho no diagrama de atividades? Então&#8230; precisamos dar um jeito de impedir que o usuário volte a dar palpites após ter descoberto o número. Ou seja: precisamos definir uma <strong>transação</strong>.</p>
<p>Isso é feito utilizando o método <code>#isolate:</code>, conforme pode ser visto abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="smalltalk" style="font-family:monospace;"><span style="color: #0000ff;">GuessingAppComponent</span>&gt;&gt;go
    <span style="color: #007f00; font-style: italic;">&quot;Start application workflow&quot;</span>
&nbsp;
    <span style="color: #7f007f;">self</span> inform: <span style="color: #7f0000;">'Start the game pushing the button below!!'</span>.
    <span style="">&#91;</span><span style="color: #7f007f;">self</span> initialize;
        isolate: <span style="">&#91;</span><span style="">&#91;</span><span style="color: #7f007f;">self</span> call: <span style="color: #7f007f;">self</span> form.
            <span style="color: #7f007f;">self</span> form number &lt; <span style="color: #7f007f;">self</span> number
                ifTrue: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form message: <span style="color: #7f0000;">'Try a higher value'</span><span style="">&#93;</span>
                ifFalse: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form message: <span style="color: #7f0000;">'Try a lower value'</span><span style="">&#93;</span><span style="">&#93;</span>
                doWhileFalse: <span style="">&#91;</span><span style="color: #7f007f;">self</span> form number <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #7f007f;">self</span> number<span style="">&#93;</span><span style="">&#93;</span><span style="">&#93;</span>
        doWhileTrue: <span style="">&#91;</span><span style="color: #7f007f;">self</span> confirm: <span style="color: #7f0000;">'You won the game using '</span> , <span style="color: #7f007f;">self</span> form guesses asString , <span style="color: #7f0000;">' guess(es)!! Play again?'</span><span style="">&#93;</span></pre></div></div>

<p>Não tem mais código, não! É só envolver o trecho desejado em um bloco e passá-lo ao método <code>#isolate:</code>! <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3>O resultado</h3>
<p>Confira abaixo algumas <em>screenshots</em> da aplicação em funcionamento:</p>

<a href='http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/attachment/02/' title='Tela inicial'><img width="150" height="150" src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/02-150x150.png" class="attachment-thumbnail" alt="Tela inicial" title="Tela inicial" /></a>
<a href='http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/attachment/03/' title='Lendo o palpite do usuário'><img width="150" height="150" src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/03-150x150.png" class="attachment-thumbnail" alt="Lendo o palpite do usuário" title="Lendo o palpite do usuário" /></a>
<a href='http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/attachment/04/' title='Tela de acerto'><img width="150" height="150" src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/04-150x150.png" class="attachment-thumbnail" alt="Tela de acerto" title="Tela de acerto" /></a>
<a href='http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/attachment/05/' title='Back button não permitido após término do jogo'><img width="150" height="150" src="http://weblog.destaquenet.com/wp-content/uploads/2008/09/05-150x150.png" class="attachment-thumbnail" alt="Back button não permitido após término do jogo" title="Back button não permitido após término do jogo" /></a>

<p>O que há de errado com a última <em>screenshot</em>? Nada&#8230; é isso que acontece quando o usuário, após já ter adivinhado o número secreto, volta algumas telas com o botão <em>back</em> do <em>browser</em> e tenta re-submeter um formulário. Não cheguei a pesquisar, mas acredito que esta página seja customizável.</p>
<h3>Desafio</h3>
<p>Mesmo em uma aplicação simples como a que foi descrita aqui, fica evidente o quanto o Seaside é produtivo e simples (embora eu ainda não saiba usá-lo direito). <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Portanto, proponho aos leitores deste <em>blog</em> que pensem no que deve ser feito para se criar uma aplicação <strong>igual</strong> (com as <strong>mesmas funcionalidades</strong>) a mostrada aqui (com a sua linguagem e <em>framework</em> preferidos). Tirando um ou outro, imagino que dê para contar nos dedos de uma só mão os <em>frameworks</em> capazes de fazer tanto com tão pouco. Enfim, sintam-se a vontade para expressar suas opiniões a respeito disso.</p>
<h3>Conclusão</h3>
<ul>
<li>Não precisei apelar para <em>frameworks</em> externos só para definir o <em>workflow</em> da aplicação;</li>
<li>Não precisei fazer gambiarras para controlar o estado da aplicação (lembrando que a aplicação <strong>suporta diversas instâncias</strong> do <em>browser</em> acessando a mesma aplicação <strong>concorrentemente</strong>);</li>
<li>Não precisei fazer gambiarras para tratar o botão <em>back</em> do <em>browser</em>;</li>
<li>Não precisei fazer gambiarras para que o código <acronym title="eXtended Hyper Text Markup Language">XHTML</acronym> gerado fosse válido;</li>
<li>Não precisei ficar reiniciando o servidor web ou fazendo <em>re-deploy</em> o tempo todo;</li>
<li>Não precisei pagar para conseguir um bom ambiente de desenvolvimento, pois o Squeak sozinho faz muito bem o serviço;</li>
</ul>
<p>É&#8230; acho que esses motivos já são o suficiente para que você dê uma olhada no Seaside. Se não for, santo Deus, o que mais você quer?! <img src='http://weblog.destaquenet.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.destaquenet.com/2008/09/30/seaside-um-framework-web-de-verdade/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

