<?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>Comunidade Portuguesa de Rich Internet Applications &#187; Flash</title>
	<atom:link href="http://www.riapt.org/category/flash/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.riapt.org</link>
	<description></description>
	<lastBuildDate>Thu, 12 Aug 2010 20:39:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>RiaPT Meeting no Porto &#8211; A experiência, conclusão e os slides!</title>
		<link>http://www.riapt.org/2010/03/24/riapt-meeting-no-porto-a-experiencia-conclusao-e-os-slides/</link>
		<comments>http://www.riapt.org/2010/03/24/riapt-meeting-no-porto-a-experiencia-conclusao-e-os-slides/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 22:07:54 +0000</pubDate>
		<dc:creator>Mauro Martins</dc:creator>
				<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[Amfphp]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=701</guid>
		<description><![CDATA[Bem, já lá vai mais de uma semana que o Meeting do Porto decorreu.
Posso dizer que, de início, pensamos em colocar um limite de 100 pessoas no evento, mas depois pensamos que a procura não iria ser muita, uma vez que no último encontro eramos apenas&#8230; três pessoas!
No entanto, lá nos aventuramos em colocar o [...]]]></description>
			<content:encoded><![CDATA[<p>Bem, já lá vai mais de uma semana que o Meeting do Porto decorreu.</p>
<p>Posso dizer que, de início, pensamos em colocar um limite de 100 pessoas no evento, mas depois pensamos que a procura não iria ser muita, uma vez que no último encontro eramos apenas&#8230; três pessoas!</p>
<p>No entanto, lá nos aventuramos em colocar o limite de 70 + 10 speakers e a aposta foi ganha! No final, e totalizando toda a gente, eramos 67 pessoas juntas no evento!</p>
<p>O que correu bem?</p>
<ul>
<li><strong>O almoço</strong></li>
</ul>
<p>- Eramos cerca de doze pessoas e foi interessante falar das expectativas sobre o evento, de conversar com pessoas com quem não tivemos hipótese de trocar ideias noutros eventos, etc. O lombo estava bom e mesmo a queimar as duas, lá conseguimos pagar todos e lá fomos para o local onde ia decorrer o evento.</p>
<ul>
<li><strong>O evento</strong></li>
</ul>
<p>- Como todos notaram, o evento começou com cerca de vinte minutos de atraso. Não havia problema se ninguém se esticasse nas apresentações (o que não foi o caso!).</p>
<p>- Uma coisa a referir foi o espírito de todos! Durante as cerca de cinco horas em que tivemos no edifício Maus Hábitos houve sempre um bom convívio, as piadas típicas dos apresentadores ao qual a plateia correspondia sempre com umas gargalhadas. O que dizer do Luís Martins que arranjou um milagroso projector porque o nosso era &#8220;esverdeado&#8221;.</p>
<ul>
<li><strong>O jantar</strong></li>
</ul>
<p>Depois de tantas horas no evento, que bem que soube comer umas belas pizzas de&#8230; 50 centímetros, no S. Marino! Eramos também cerca de doze pessoas e o convívio foi muito interessante, dando para trocar ideias e falar sobre o que se passou no evento, sobre as novas tecnologias, experiências que tenhamos tido, etc. Tudo acabou, por volta da uma da manhã no Rivolli, onde decorria o Fantasporto.</p>
<ul>
<li><strong>Conclusões</strong></li>
</ul>
<p>Como nunca nada corre perfeito, temos noção que houve várias falhas, mas todas elas devido à pouca experiência que os organizadores tinham em realizar eventos.</p>
<ol>
<li>O local &#8211; Embora o local fosse interessante, era notório a falta de condições para a projecção dos conteúdos através do projector. O facto de ter ficado muito escuro a partir do meio do evento, fez com que o público quase não conseguisse ver os speakers.</li>
<li>Talvez devêssemos ter apenas uma refeição em conjunto. Assim, podíamos tentar ter mais pessoas no mesmo espaço;</li>
<li>O controlo do tempo. Esta sim, uma falha um pouco grave, umas vez que perdemos completamente a noção do tempo;</li>
</ol>
<p><strong>Apresentações:</strong></p>
<p>Ainda não consegui que os vídeos ficassem todos disponíveis uma vez que temos limite, tanto no Vimeo, como no Youtube, de tempo para os vídeos (só dá para 10 minutos em cada).</p>
<p>No entanto, já podem ver o vídeo de introdução do evento <a title="intro riapt meeting porto" href="http://www.vimeo.com/10306292" target="_blank">aqui</a></p>
<p>Sendo assim, ficam aqui as apresentações que já nos foram facultadas pelos speakers. Quando me enviarem mais, actualizarei aqui o post</p>
<p><strong>Mauro Martins:</strong></p>
<p><a title="Web, construir é diferente de ver" href="http://www.slideshare.net/Mauredo/riapt-mm" target="_blank">Web &#8211; Construir é diferente de ver</a></p>
<p><strong>Nuno Gomes:</strong></p>
<p><a title="HTML 5, a realidade da utopia" href="http://docs.google.com/present/view?id=dcdk3w8w_19cbr65scc&amp;interval=5" target="_blank">HTML 5, a Realidade da Utopia</a></p>
<p><strong>Miguel Pinto:</strong></p>
<p><a title="Zend framework e flash" href="http://www.slideshare.net/lookatitude/flash-platform-zend-amf" target="_blank">Zend Framework e Flash</a></p>
<p><strong>Felipe Ávila:</strong></p>
<p><a title="The Usability Page" href="http://www.slideshare.net/guestca03209/usability-evolution" target="_blank">The Usability Page</a></p>
<p>Cumprimentos a todos, e preparem-se porque vêm aí mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2010/03/24/riapt-meeting-no-porto-a-experiencia-conclusao-e-os-slides/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RiaPT meeting no Porto!</title>
		<link>http://www.riapt.org/2010/02/08/riapt-meeting-no-porto/</link>
		<comments>http://www.riapt.org/2010/02/08/riapt-meeting-no-porto/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 10:33:23 +0000</pubDate>
		<dc:creator>rduartes</dc:creator>
				<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[Amfphp]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flash remoting]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Introduções]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Showcase]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=632</guid>
		<description><![CDATA[No próximo dia 6 de Março de 2010 vai-se realizar uma reunião do RiaPT no Porto. Vai ser um evento do tipo stand-up and speak com comunicações de elevado interesse com 20 minutos de duração cada para garantir que apenas temos "sumo"...]]></description>
			<content:encoded><![CDATA[<p><strong>6 de Março de 2010 o RiaPT vai voltar ao Porto!</strong></p>
<p>Marca desde já essa data na agenda e prepara-te para passar uma tarde bem disposta juntamente com pessoas que partilham contigo interesses e paixões pela Internet e não só!</p>
<p>Vamos ter speakers a abordar temas de elevado interesse da actualidade que te vão deixar com água na boca para aprender, explorar e procurar as inovações para o design e desenvolvimento das tuas aplicações!</p>
<p>O universo de desenvolvimento de aplicações web está em perfeita erupção! Não são só as tecnologias cliente, mas toda a &#8220;pilha&#8221; de desenvolvimento com as suas diversas tecnologias, linguagens e ferramentas está a ser posta em causa e cada um quer encontrar o seu nicho nesta realidade. Não perca esta oportunidade de ouvir alguns experts  portugueses na área do desenvolvimento de Rich Internet Applications.</p>
<p>Como se isto não fosse suficiente ainda vamos ter prémios para distribuir pelo pessoal que estiver a assistir que vão desde licenças de software a vouchers de cursos de formação e outros.</p>
<p><strong>Não percam! Dia 6 de Março, no Edifício &#8220;Maus Hábitos&#8221;, às 14:00, e sim, no Porto!</strong></p>
<p>Inscreve-te em: <a title="http://riapt.stagehq.com/events/182/booking/new" href="http://riapt.stagehq.com/events/182/booking/new" target="_blank">http://riapt.stagehq.com/events/182/booking/new</a></p>
<h3>Agenda</h3>
<table width="100%">
<tbody>
<tr>
<td>14:00</td>
<td>Abertura</td>
<td>Rui Silva, Mauro Martins</td>
</tr>
<tr>
<td>14:10</td>
<td>Zend Framework com Flash</td>
<td>Miguel Pinto</td>
</tr>
<tr>
<td>14:35</td>
<td>Web &#8211; Construir é diferente de ver!</td>
<td>Mauro Martins</td>
</tr>
<tr>
<td>15:00</td>
<td>Flex Decoupled &#8211; Build Strong from the Foundation</td>
<td>Vítor Monteiro</td>
</tr>
<tr>
<td>15:25</td>
<td>Balsamiq Mockups e Napkee: A arte de &#8220;rabiscar&#8221;</td>
<td>Rui Silva</td>
</tr>
<tr>
<td>15:50</td>
<td>Papervision 3D</td>
<td>João Crispim</td>
</tr>
<tr>
<td>16:10</td>
<td>Coffee Break</td>
<td>Networking</td>
</tr>
<tr>
<td>16:25</td>
<td>Make Web not War: A plataforma Microsoft</td>
<td>Luís Martins</td>
</tr>
<tr>
<td>16:50</td>
<td>Silverlight 101: Anatomia de uma Aplicação</td>
<td>Ricardo Castelhano</td>
</tr>
<tr>
<td>17:15</td>
<td>Swiz e Flex</td>
<td>João Fernandes</td>
</tr>
<tr>
<td>17:40</td>
<td>&#8220;HYPE&#8221;: Voltar à criatividade em Flash!</td>
<td>João Gonçalves</td>
</tr>
<tr>
<td>18:05</td>
<td>HTML5: A realidade da utopia</td>
<td>Nuno Gomes</td>
</tr>
<tr>
<td>18:30</td>
<td>Encerramento &#8211; Prémios</td>
<td>Rui Silva, Mauro Martins</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2010/02/08/riapt-meeting-no-porto/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Introdução ao seno e coseno com Actionscript</title>
		<link>http://www.riapt.org/2010/01/26/sin-cos-actionscript/</link>
		<comments>http://www.riapt.org/2010/01/26/sin-cos-actionscript/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 18:11:05 +0000</pubDate>
		<dc:creator>semmais</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Introduções]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cos]]></category>
		<category><![CDATA[coseno]]></category>
		<category><![CDATA[matemática]]></category>
		<category><![CDATA[maths]]></category>
		<category><![CDATA[seno]]></category>
		<category><![CDATA[sin]]></category>
		<category><![CDATA[trignometria]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=602</guid>
		<description><![CDATA[Trigonometria
Quando se fala em trigonometria geralmente é associada por grande parte a um &#8220;bicho daqueles maus&#8221; com cosenos, senos e mais um monte de fórmulas.
A verdade é que nos mais variados problemas é constante termos que aliar o actionscript com este ramo da matemática.

- PI:
É um numero irracional, eu normalmente uso apenas a aproximação com [...]]]></description>
			<content:encoded><![CDATA[<h1><strong>Trigonometria</strong></h1>
<p>Quando se fala em trigonometria geralmente é associada por grande parte a um &#8220;bicho daqueles maus&#8221; com cosenos, senos e mais um monte de fórmulas.<br />
A verdade é que nos mais variados problemas é constante termos que aliar o actionscript com este ramo da matemática.<br />
<span id="more-602"></span></p>
<h2>- PI:</h2>
<p>É um numero irracional, eu normalmente uso apenas a aproximação com duas casas decimais 3,14. O <a href="http://bellard.org/pi/pi2700e9/announce.html" target="_blank">record</a> actualmente do numero mais aproximado é de Fabrice Bellard — um programador, claro!</p>
<h2>Mas o que é visualmente este valor PI?</h2>
<p>Importa saber que se fizermos um circulo perfeito com um raio de 1 unidade usando por exemplo uma corda, se esticarmos essa corda numa linha recta vamos ver que ela mede 2*PI. Portanto, metade da corda mede PI — um valor aproximado a 3.14159 26535 89793 23846 26433 83279 50288 4197 &#8230;. unidades! É a mesma coisa que dizer que o <strong>raio</strong> cabe PI vezes no arco de meia circunferência (um arco de circunferência de 180 graus).<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_pi-1_1436523020"
			class="flashmovie"
			width="430"
			height="255">
	<param name="movie" value="http://www.riapt.org/wp-content/uploads/2010/01/pi-1.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.riapt.org/wp-content/uploads/2010/01/pi-1.swf"
			name="fm_pi-1_1436523020"
			width="430"
			height="255">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<h2>- Está bem, pronto.. já gravei o que é o PI e agora o que faço com ele?</h2>
<p>As funções Math.cos, Math.sin e outras no actionscript aceitam como parâmetro uma variável em radianos, esta variável indicam uma amplitude, um ponto especifico do nosso circulo.</p>
<h2>A definição de Radiano</h2>
<p>&#8220;O ângulo definido no centro de um círculo por um arco de circunferência com o mesmo comprimento que o raio do círculo é 1 radiano&#8221;<br />
Ou seja, dizer que o raio do circulo &#8220;cabe&#8221; n vezes numa determinada parte do arco pode-se simplificar e dizer simplesmente que essa parte mede &#8220;n&#8221; radianos</p>
<p>Num sistema de coordenadas no plano cartesiano centrando um circulo com uma unidade de raio, fixa-se o ponto (a) mais à direita do circulo e mede-se o arco em sentido contrário ao sentido dos ponteiros do relógio obtendo um segundo ponto (b);<br />
- a medida do arco entre os dois pontos &#8220;n radianos&#8221; (a verde), corresponde o parâmetro que usamos no coseno e no seno (entre outras funções do actionscript).<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_pi-2_1590628057"
			class="flashmovie"
			width="430"
			height="255">
	<param name="movie" value="http://www.riapt.org/wp-content/uploads/2010/01/pi-2.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.riapt.org/wp-content/uploads/2010/01/pi-2.swf"
			name="fm_pi-2_1590628057"
			width="430"
			height="255">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<h2>Seno</h2>
<p>- traça-se uma recta paralela ao eixo dos xx&#8217;s que passa pelo ponto b e vai interceptar o eixo dos yy&#8217;s obtendo o valor do seno para &#8220;n radianos&#8221; (a laranja)<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_pi-3_1804731575"
			class="flashmovie"
			width="430"
			height="255">
	<param name="movie" value="http://www.riapt.org/wp-content/uploads/2010/01/pi-3.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.riapt.org/wp-content/uploads/2010/01/pi-3.swf"
			name="fm_pi-3_1804731575"
			width="430"
			height="255">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<h2>Coseno</h2>
<p>- traça-se uma recta paralela ao eixo dos yy&#8217;s que passa pelo ponto b e que vai interceptar o eixo dos xx&#8217;s obtendo o valor do coseno para &#8220;n radianos&#8221; (a azul)<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_pi-4_1939502392"
			class="flashmovie"
			width="430"
			height="255">
	<param name="movie" value="http://www.riapt.org/wp-content/uploads/2010/01/pi-4.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.riapt.org/wp-content/uploads/2010/01/pi-4.swf"
			name="fm_pi-4_1939502392"
			width="430"
			height="255">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Isto é a parte chata da coisa, mas é o suficiente para fazermos milhares e milhares de cenas espectaculares <img src='http://www.riapt.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<h3>Problema 1:</h3>
<p>- Desenhar os pontos referentes às horas de um relógio analógico com raio de 80 pixeis e centro no ponto (200,122)</p>
<p>Resposta:</p>
<p>Sabemos que um circulo tem um arco de 2*PI, queremos dividir em 12 partes, portanto vamos ter 2*PI/12 como a medida de cada arco.<br />
A partir daqui podemos passar estes arcos para coordenadas x,y usando o coseno e o seno.<br />
Como queremos um raio maior que uma unidade temos que multiplicar os valores obtidos pelo novo raio desejado.</p>
<p><code>var arco_hora:Number=Math.PI*2/12;// simplificando Math.pi/6<br />
var raio:Number=80;//raio do nosso relogio<br />
this.graphics.lineStyle(4,0xff0000);//vamos por os pontos vermelhos</code></p>
<p>for (var i:int=0;i&lt;12;i++)<br />
{<br />
var posx:Number=Math.cos(arco_hora*i)*raio;<br />
var posy:Number=Math.sin(arco_hora*i)*raio;<br />
this.graphics.drawCircle(posx,posy,4);<br />
}</p>
<p>Ok, mas isto ficou no ponto (0,0), agora é necessário fazer uma translação para a posição final.</p>
<p><code>var arco_hora:Number=Math.PI*2/12;// simplificando Math.pi/6<br />
var raio:Number=80;//raio do nosso relogio<br />
var centro:Point=new Point(200,122);//posição central do relógio<br />
this.graphics.lineStyle(4,0xff0000);//vamos por os pontos vermelhos</code></p>
<p>for (var i:int=0;i&lt;12;i++)<br />
{<br />
var posx:Number=Math.cos(arco_hora*i)*raio+centro.x;<br />
var posy:Number=Math.sin(arco_hora*i)*raio+centro.y;<br />
this.graphics.drawCircle(posx,posy,4);<br />
}<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_pi-5_345732516"
			class="flashmovie"
			width="430"
			height="255">
	<param name="movie" value="http://www.riapt.org/wp-content/uploads/2010/01/pi-5.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.riapt.org/wp-content/uploads/2010/01/pi-5.swf"
			name="fm_pi-5_345732516"
			width="430"
			height="255">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<h3>Desafio:</h3>
<p>- Desenhar os ponteiros</p>
<blockquote><p>Dica: Assim por alto podemos por um TIMER de 1000 e no evento TimerEvent.TIMER obtemos a hora e actualizamos os ponteiros.<br />
Os ponteiros podem ser desenhados com<br />
<code><br />
graphics.lineStyle(4,0xff0000);<br />
graphics.moveTo(centro.x, centro.y);<br />
graphics.lineTo(posx, posy);<br />
</code></p></blockquote>
<h3>Cuidados:</h3>
<p>O coseno e seno são funções pesadas, o processador queixa-se se quando os usamos intensamente como por exemplo em sistemas de partículas.<br />
Por isso uma leitura a este <a href="http://lab.polygonal.de/2007/07/18/fast-and-accurate-sinecosine-approximation/" target="_blank">post</a> do Michael Baczynski é recomendada.</p>
<p>Obrigado,<br />
Paulo Afonso (semmais)<br />
<a href="http://www.semmais.com/">http://www.semmais.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2010/01/26/sin-cos-actionscript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Slides da apresentação &#8220;Enterprise RIAs 2&#8243; no 3º Aniversário do RiaPT</title>
		<link>http://www.riapt.org/2010/01/18/slides-da-apresentacao-enterprise-rias-2-no-3%c2%ba-aniversario-do-riapt/</link>
		<comments>http://www.riapt.org/2010/01/18/slides-da-apresentacao-enterprise-rias-2-no-3%c2%ba-aniversario-do-riapt/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 15:20:51 +0000</pubDate>
		<dc:creator>João Saleiro</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Flash remoting]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Formação]]></category>
		<category><![CDATA[Gumbo]]></category>
		<category><![CDATA[RIAPT]]></category>
		<category><![CDATA[Rich UI]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=560</guid>
		<description><![CDATA[Tal como prometido, aqui estão os slides da apresentação &#8220;Enterprise RIAs 2- Meet our dirty secrets&#8221;. A apresentação anterior, &#8220;Enterprise RIAs &#8211; This is how we do it&#8221; pode ser encontrada aqui. As minhas desculpas se estava mais murcho e cansado do que o costume, mas estava meio adoentado.
Queria dar os parabéns à organização (exemplares!!), [...]]]></description>
			<content:encoded><![CDATA[<p>Tal como prometido, aqui estão os slides da apresentação &#8220;Enterprise RIAs 2- Meet our dirty secrets&#8221;. A apresentação anterior, &#8220;Enterprise RIAs &#8211; This is how we do it&#8221; pode ser encontrada <a href="http://www.riapt.org/2009/06/27/slides-da-apresentacao-enterprise-rias-no-flashcamp/" target="_blank">aqui</a>. As minhas desculpas se estava mais murcho e cansado do que o costume, mas estava meio adoentado.</p>
<p>Queria dar os parabéns à organização (exemplares!!), aos patrocinadores e principalmente aos oradores que estiveram fantásticos, com apresentações de elevada qualidade.</p>
<p style="text-align: left;">Não se esqueçam de deixar o vosso comentário à apresentação, e se houverem questões, não tenham problemas em contactar-me. Espero que tenham gostado e que a apresentação vos tenha sido útil.</p>
<p style="text-align: left;">[Update] Duas pessoas pediram-me a versão digital do documento da Webfuel, mas como não fiquei com o contacto delas, aqui vai o <a href="http://www.webfuel.pt/WebfuelOverview.pdf" target="_blank">link</a> [/Update]</p>
<p style="text-align: center;">
<p style="text-align: center;"><object style="width: 600px; height: 500px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.riapt.org/wp-content/uploads/2010/01/Enterprise-RIAs-2-Meet-our-dirty-tricks.swf" /><embed style="width: 600px; height: 500px;" type="application/x-shockwave-flash" width="600" height="500" src="http://www.riapt.org/wp-content/uploads/2010/01/Enterprise-RIAs-2-Meet-our-dirty-tricks.swf"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2010/01/18/slides-da-apresentacao-enterprise-rias-2-no-3%c2%ba-aniversario-do-riapt/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Supond &#8211; Vencedor do Sapo Codebits 2009</title>
		<link>http://www.riapt.org/2009/12/09/supond-vendedor-do-sapo-codebits-2009/</link>
		<comments>http://www.riapt.org/2009/12/09/supond-vendedor-do-sapo-codebits-2009/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 12:34:45 +0000</pubDate>
		<dc:creator>João Fernandes</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=512</guid>
		<description><![CDATA[Nos passados dia 3,4 e 5 de Dezembro teve lugar mais uma edição do Sapo Codebits onde perto de 600 pessoas estiveram presentes para assistir a mais uma vaga de apresentações assim como, participar no desafio de coding durante 24 horas.
Este ano, os vencedores foram o Nuno Morgadinho, Paulo Afonso e Jorge Varandas com a aplicação [...]]]></description>
			<content:encoded><![CDATA[<p>Nos passados dia 3,4 e 5 de Dezembro teve lugar mais uma edição do <a title="Codebits" href="http://codebits.eu/" target="_blank">Sapo Codebits</a> onde perto de 600 pessoas estiveram presentes para assistir a mais uma vaga de apresentações assim como, participar no desafio de coding durante 24 horas.</p>
<p>Este ano, os vencedores foram o <a href="http://www.morgadinho.org">Nuno Morgadinho</a>, <a title="Paulo Afonso" href="http://www.semmais.com/blog/" target="_blank">Paulo Afonso</a> e Jorge Varandas com a aplicação SUPOND <strong><strong>The Idea – “Apple Time Machine”-like interface to your Lifestream</strong></strong></p>
<p>A aplicação é uma adaptação do time machine da Apple utilizado as APIs do novo serviço da SAPO &#8211; <a href="http://web.pond.pt/" target="_blank">POND</a> onde visualizamos a nossa timeline de conteúdos provenientes de vários serviços com um aspecto 3D, não recorrendo a Papervision3D mas às APIs 3D nativas do Flash Player.</p>
<p>O projecto foi desenvolvido em Flash Builder e Flash CS4, resultando numa aplicação web e desktop via AIR.</p>
<p>Mais informações na página oficial do <a href="http://www.morgadinho.org/2009/12/06/supond-is-codebits-2009-winner/">Nuno</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2009/12/09/supond-vendedor-do-sapo-codebits-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parte I &#8211; Flex, AIR &amp; SQLite</title>
		<link>http://www.riapt.org/2009/09/30/parte-i-flex-air-sqlite/</link>
		<comments>http://www.riapt.org/2009/09/30/parte-i-flex-air-sqlite/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 23:56:11 +0000</pubDate>
		<dc:creator>Mauro Martins</dc:creator>
				<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=459</guid>
		<description><![CDATA[ 

Introdução:
Esta é a primeira parte de uma série de três tutoriais que vou colocar sobre a integração de Flex com AIR e SQLite. A primeira (esta) vai centrar-se em uma breve introdução ao AIR com SQLite e vamos criar uma aplicação onde vamos adicionar uma base de dados local, inserir vários tipos de dados e [...]]]></description>
			<content:encoded><![CDATA[<p><strong> </strong></p>
<p><strong><img class="alignnone size-full wp-image-491" src="http://www.riapt.org/wp-content/uploads/2009/09/adobe-air.jpg" alt="adobe-air" width="450" height="397" /></strong></p>
<p><strong>Introdução:</strong></p>
<p>Esta é a primeira parte de uma série de três tutoriais que vou colocar sobre a integração de Flex com AIR e SQLite. A primeira (esta) vai centrar-se em uma breve introdução ao AIR com SQLite e vamos criar uma aplicação onde vamos adicionar uma base de dados local, inserir vários tipos de dados e depois coloca-los directamente em uma datagrid em Flex.</p>
<p>A parte dois que será colocada mais tarde (estou a trabalhar nela) será centrada em criar uma form para adicionar dinamicamente informação à base de dados e em colocar várias tabelas a interagirem entre si em que a primeira tem dados e a segunda possui várias informações relativas aos items anteriores.</p>
<p>A terceira será depois a integração das chamadas da base de dados com itemClasses e também ValueObjects.</p>
<p>Espero que gostem! Mauro.</p>
<p><strong>Parte I</strong></p>
<p>Sem dúvida que se há uma coisa que o Adobe AIR tem de interessante é a capacidadede ser possível criar base de dados locais sem a necessidade de nenhum servidor local como o wamp ou semelhante e com extrema facilidade.</p>
<p>Ter a possibilidade de inserir, actualizar e retirar informação de uma estrutura de base de dados é sem dúvida mais fácil de gerir do que, por exemplo, a utilização de ficheiros de texto ou então ficheiros com estruturas em XML como por vezes acontece.</p>
<p>Este tipo de interactividade entre o Flex ou Flash com estas estruturas permitem-nos fazer relações entre várias tabelas, podendo assim associar facilmente dados que poderão estar organizados nas famosas sequências “one-to-many” (uma entrada na tabela TAB_1 tem várias entradas associadas na tabela TAB_2). Isto torna a injecção de dados em componentes de Flex ou Flash numa acção simples e quase directa.</p>
<p>Para começar a utilizar este tipo de estrutura e para podermos ter qualquer interacção com uma base de dados em SQLite através do AIR, são precisos ,no mínimo, três elementos: um ficheiro (base de dados), uma conexão e uma declaração (query).</p>
<p>Este tutorial vai ser constituído por três partes sendo a primeira mais simples, com criação, adição e preenchimento de uma dataGrid em Flex. A segunda parte do tutorial terá também relação entre mais que uma tabela na mesma base de dados (relações on-to-many) e mais tarde, vamos utilizar itemClasses para termos um mapeamento perfeito e mais correcto da nossa aplicação.</p>
<p><strong>Passando ao código..</strong></p>
<p>// Criamos uma variável que vai guardar a referencia ao nosso ficheiro de base de dados<br />
private var dbFile:File;</p>
<p>// Criamos uma nova conexão e abrimos o ficheiro que contem a base de dados<br />
private var conn:SQLConnection;</p>
<p>// Método init para iniciar as nossas variáveis e associar-lhes valores<br />
private function init () : void {<br />
    dbFile = File.applicationStorageDirectory.resolvePath(&#8220;employees.db&#8221;);<br />
    conn = new SQLConnection();<br />
    conn.open(dbFile);<br />
    createDataBase();<br />
    insertDataBase();<br />
    selectDataBase();<br />
}</p>
<p>// Primeiro criamos a nossa base de dados local<br />
private function createDataBase() : void<br />
{<br />
    // Criamos a variável que vai executar a nossa query, atribuimos a nossa conexão, e criamos a query para depois executar<br />
    var statement : SQLStatement = new SQLStatement();<br />
    statement.sqlConnection = conn;<br />
    statement.text = &#8220;CREATE TABLE employees (empId INTEGER PRIMARY KEY AUTOINCREMENT, empName VARCHAR(255))&#8221;;<br />
    statement.execute();<br />
}</p>
<p>Da mesma forma que é fácil criar uma base de dados, também é fácil adicionarmos conteúdo à mesma bastanto quase copiar o código anterior mudando apenas a nossa query.</p>
<p>private function insertDataBase():void<br />
{<br />
    var dbStatement:SQLStatement = new SQLStatement();<br />
    dbStatement.sqlConnection = conn;<br />
    dbStatement.text = &#8220;INSERT INTO employees (empName) VALUES (:empName)&#8221;;<br />
    dbStatement.parameters[ ":empName" ] = &#8220;António&#8221;;<br />
    dbStatement.execute();<br />
}</p>
<p>Agora que já temos conteúdo, podemos ir buscá-lo através de um SELECT à base de dados</p>
<p>private function selectDataBase():void<br />
{<br />
    var dbStatement:SQLStatement = new SQLStatement();<br />
    dbStatement.sqlConnection = conn;</p>
<p>    dbStatement.text = &#8220;SELECT * FROM employees&#8221;;<br />
    dbStatement.execute();</p>
<p>    // Se quiserem ver o resultado da vossa query&#8230;<br />
    var ac:ArrayCollection = new ArrayCollection(dbStatement.getResult().data);<br />
    var acLength : Number = ac.length;<br />
    for ( var i:uint; i &lt; acLength; i++ )<br />
    {<br />
        trace( ac[i].empId + &#8221; &#8211; &#8221; + ac[i].empName );<br />
    }</p>
<p>}<br />
Já temos aqui uma primeira base mas ainda nos falta controlar várias acções, nomeadamente controlar a execução dos eventos e ter a certeza que estes ocorrem correctamente e só acedemos aos dados quando estes são recebidos / inseridos na nossa aplicação.</p>
<p><strong>Exemplo:</strong></p>
<p>Passando para um exemplo mais concreto, temos, nesta parte I deste tutorial, uma lista de trabalhadores de uma empresa que está guardada em uma base de dados SQLite.</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br />
&lt;mx:WindowedApplication xmlns:mx=&#8221;http://www.adobe.com/2006/mxml&#8221;<br />
                        layout=&#8221;absolute&#8221;<br />
                        creationComplete=&#8221;init()&#8221;&gt;</p>
<p>    &lt;mx:Script&gt;<br />
        &lt;![CDATA[<br />
            import mx.collections.ArrayCollection;</p>
<p>            // Variável que vai ter a informação para o array e que bind para a nossa datagrid<br />
            [Bindable]<br />
            private var empArray : ArrayCollection;</p>
<p>            // Variáveis de conexão<br />
            private var dbFile : File;<br />
            private var conn : SQLConnection;<br />
            private var dbStatement : SQLStatement;</p>
<p>            // Variáveis para controlar as nossas queries<br />
            private var empNames : Array = new Array( &#8220;António Amaro&#8221;, &#8220;Marco Silva&#8221;, &#8220;Luis Ribeiro&#8221;, &#8220;Salvador Mesquita&#8221;, &#8220;Lourenço Pinto&#8221;, &#8220;João Guimarães&#8221; );<br />
            private var empLoc : Array = new Array( &#8220;Financeira&#8221;, &#8220;Desenvolvimento&#8221;, &#8220;Recursos Humanos&#8221;, &#8220;Transportes&#8221;, &#8220;Desenvolvimento&#8221;, &#8220;Vendas&#8221; );<br />
            private var empTel : Array = new Array( &#8220;351&#8243;, &#8220;456&#8243;, &#8220;745&#8243;, &#8220;860&#8243;, &#8220;254&#8243;, &#8220;555&#8243; );<br />
            private var empPos : Number = 0;</p>
<p>            /**<br />
             * INIT<br />
             */<br />
            private function init() : void<br />
            {<br />
                // Criamos a referência para o nosso ficheiro<br />
                dbFile = File.applicationStorageDirectory.resolvePath( &#8220;employees.db&#8221; );</p>
<p>                // Criamos uma nova conexão que nos vai ligar à base de dados<br />
                conn = new SQLConnection();</p>
<p>                // Se a base de dados existe abrimos, senão criamos uma nova<br />
                // Dependendo da acção atribuimos diferentes listeners para invocarmos diferentes métodos<br />
                if ( !dbFile.exists )<br />
                {<br />
                    conn.addEventListener( SQLEvent.OPEN, connOpen );<br />
                } else<br />
                {<br />
                    conn.addEventListener( SQLEvent.OPEN, selectDataBase );<br />
                }<br />
                // Abrimos a base de dados<br />
                conn.open( dbFile );<br />
            }</p>
<p>            /**<br />
             * connOpen<br />
             */<br />
            private function connOpen( e : SQLEvent ) : void<br />
            {<br />
                // abriu a conexão, vai então criar a base de dados<br />
                createDataBase();<br />
            }</p>
<p>            /**<br />
             * createDataBase<br />
             */<br />
            private function createDataBase() : void<br />
            {<br />
                // Criamos a variável que vai executar a nossa query, atribuimos a nossa conexão, e criamos a query para depois executar<br />
                dbStatement = new SQLStatement();<br />
                dbStatement.sqlConnection = conn;<br />
                dbStatement.addEventListener( SQLEvent.RESULT, insertEmpNames, false, 0, true );<br />
                dbStatement.text = &#8220;CREATE TABLE employees (empId INTEGER PRIMARY KEY AUTOINCREMENT, empName VARCHAR(255), empLoc VARCHAR(255), empTel INTEGER)&#8221;;<br />
                dbStatement.execute();<br />
            }</p>
<p>            /**<br />
             * insertEmpNames<br />
             */<br />
            private function insertEmpNames( e : SQLEvent ) : void<br />
            {<br />
                // Depois de criada a base de dados vamos preencher informação<br />
                insertDataBase();<br />
            }</p>
<p>            /**<br />
             * insertDataBase<br />
             */<br />
            private function insertDataBase() : void<br />
            {</p>
<p>                dbStatement = new SQLStatement();<br />
                dbStatement.sqlConnection = conn;</p>
<p>                // Vamos inserindo novos elementos à base de dados até percorrermos todo o nosso array<br />
                if ( empPos &lt; empNames.length &#8211; 1 )<br />
                {<br />
                    dbStatement.addEventListener( SQLEvent.RESULT, insertEmpNames, false, 0, true );<br />
                } else<br />
                {<br />
                    dbStatement.addEventListener( SQLEvent.RESULT, selectDataBase, false, 0, true );<br />
                }</p>
<p>                // Agora vamos adicionar para cada campo, um objecto com o valor que queremos inserir na tabela<br />
                dbStatement.text = &#8220;INSERT INTO employees (empName, empLoc, empTel) VALUES (:empName, :empLoc, :empTel)&#8221;;<br />
                dbStatement.parameters[ ":empName" ] = empNames[ empPos ];<br />
                dbStatement.parameters[ ":empLoc" ] = empLoc[ empPos ];<br />
                dbStatement.parameters[ ":empTel" ] = empTel[ empPos ];<br />
                empPos++;<br />
                dbStatement.execute();</p>
<p>            }</p>
<p>            /**<br />
             * selectDataBase<br />
             */<br />
            private function selectDataBase( e : SQLEvent ) : void<br />
            {<br />
                dbStatement = new SQLStatement();<br />
                dbStatement.sqlConnection = conn;<br />
                dbStatement.addEventListener( SQLEvent.RESULT, attribDataGrid, false, 0, true );</p>
<p>                // Depois de inseridos todos os registos vamos seleccionar tudo que está na base de dados<br />
                dbStatement.text = &#8220;SELECT * FROM employees&#8221;;<br />
                dbStatement.execute();<br />
            }</p>
<p>            private function attribDataGrid( e : SQLEvent ) : void<br />
            {<br />
                // Vamos buscar o valor retornado pela base de dados e colocar directo num array collection<br />
                empArray = new ArrayCollection( dbStatement.getResult().data );<br />
            }<br />
        ]]&gt;<br />
    &lt;/mx:Script&gt;</p>
<p>    &lt;mx:Panel width=&#8221;100%&#8221;<br />
              paddingTop=&#8221;10&#8243;<br />
              paddingBottom=&#8221;10&#8243;<br />
              paddingLeft=&#8221;10&#8243;<br />
              paddingRight=&#8221;10&#8243;<br />
              title=&#8221;TRABALHADORES DA SOFT S.A.&#8221;&gt;</p>
<p>        &lt;mx:DataGrid width=&#8221;100%&#8221;<br />
                     dataProvider=&#8221;{empArray}&#8221;&gt;<br />
            &lt;mx:columns&gt;<br />
                &lt;mx:DataGridColumn headerText=&#8221;Nome&#8221;<br />
                                   dataField=&#8221;empName&#8221;/&gt;<br />
                &lt;mx:DataGridColumn headerText=&#8221;Departamento&#8221;<br />
                                   dataField=&#8221;empLoc&#8221;/&gt;<br />
                &lt;mx:DataGridColumn headerText=&#8221;Telefone&#8221;<br />
                                   dataField=&#8221;empTel&#8221;/&gt;<br />
            &lt;/mx:columns&gt;<br />
        &lt;/mx:DataGrid&gt;<br />
    &lt;/mx:Panel&gt;</p>
<p>&lt;/mx:WindowedApplication&gt;</p>
<p>Como podem ver, é bem simples criamos um sistema de base de dados que a cria, adiciona e mostra os resultados para uma datagrid. Como disse mais a cima, na parte dois do tutorial vamos avançar para relações entre várias tabelas na mesma base de dados para podermos associar a um só item de uma tabela, várias informações de outra.</p>
<p>NOTA: Se quiserem ir testando a criação dos ficheiros de base de dados e não conseguem porque a base de dados já está criada podem apagar &#8220;à mão&#8221; os ficheiros que ficam guardados no vosso computador.</p>
<p>WINDOWS: C:\Users\&lt;user&gt;\AppData\Roaming</p>
<p>MAC: &lt;user&gt;\Libraries\preferences\</p>
<p>Podem descarregar o projecto aqui:</p>
<p><a title="download" href="http://www.imauro.com/tutoriais/dbTutorial.zip" target="_blank">download do ficheiro</a></p>
<p>Para mais informações sobre SQLite no AIR:<br />
<a href="http://coenraets.org/blog/2008/02/sqlite-admin-for-air-10/" target="_blank">http://coenraets.org/blog/2008/02/sqlite-admin-for-air-10/</a><br />
<a href="http://livedocs.adobe.com/flex/3/langref/localDatabaseSQLSupport.html" target="_blank">http://livedocs.adobe.com/flex/3/langref/localDatabaseSQLSupport.html</a></p>
<p>Uma ferramenta muito boa para poderem ver o que vai acontecendo e a estrutura da vossa base de dados, eu aconselhava a instalarem o <a href="http://www.dehats.com/drupal/?q=node/58" target="_blank">Lita</a> que foi referenciado num anterior post meu sobre <a href="http://imauro.com/blog/?p=25" target="_blank">As melhores aplicações AIR para Designers e Developer</a>.</p>
<p>Até à próxima e espero que tenham gostado!</p>
<p>Mauro Martins.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2009/09/30/parte-i-flex-air-sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Slides da apresentação &#8220;Flash&amp;Arduino &#8211; uma ligação com sentimento&#8221;</title>
		<link>http://www.riapt.org/2009/09/25/slides-da-apresentacao-flasharduino-uma-ligacao-com-sentimento/</link>
		<comments>http://www.riapt.org/2009/09/25/slides-da-apresentacao-flasharduino-uma-ligacao-com-sentimento/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 12:05:21 +0000</pubDate>
		<dc:creator>Grettir</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Flash Player]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=457</guid>
		<description><![CDATA[Ontem realizei uma apresentação no AdobeUserGroup sobre a ligação do Flash à placa Arduino.

]]></description>
			<content:encoded><![CDATA[<p>Ontem realizei uma apresentação no AdobeUserGroup sobre a ligação do Flash à placa Arduino.</p>
<p style="text-align: center;"><object id="presentation" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="430" height="442" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="align" value="middle" /><param name="allowScriptAccess" value="sameDomain" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><param name="allowFullScreen" value="true" /><param name="src" value="http://www.ricardocastelhano.com/talks/Flash-Arduino.swf" /><param name="name" value="presentation" /><param name="allowfullscreen" value="true" /><embed id="presentation" type="application/x-shockwave-flash" width="430" height="442" src="http://www.ricardocastelhano.com/talks/Flash-Arduino.swf" allowfullscreen="true" bgcolor="#ffffff" quality="high" allowscriptaccess="sameDomain" align="middle" name="presentation"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2009/09/25/slides-da-apresentacao-flasharduino-uma-ligacao-com-sentimento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slides da apresentação &#8220;Rich Internet Applications &#8211; Uma Visão Geral&#8221; no CTIC 2009</title>
		<link>http://www.riapt.org/2009/07/02/slides-da-apresentacao-rich-internet-applications-uma-visao-geral-no-ctic-2009/</link>
		<comments>http://www.riapt.org/2009/07/02/slides-da-apresentacao-rich-internet-applications-uma-visao-geral-no-ctic-2009/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 15:01:30 +0000</pubDate>
		<dc:creator>João Saleiro</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Formação]]></category>
		<category><![CDATA[Introduções]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=428</guid>
		<description><![CDATA[Deixo abaixo os slides da minha apresentação &#8220;Rich Internet Applications &#8211; Uma visão geral&#8221; no CTIC 2009 em Viseu a 13 de Maio. Esta apresentação é útil para quem está a entrar nesta coisa das RIAs e quer perceber exactamente o que são, e quais as diferenças e vantagens face às aplicações Desktop e Web. [...]]]></description>
			<content:encoded><![CDATA[<p>Deixo abaixo os slides da minha apresentação &#8220;Rich Internet Applications &#8211; Uma visão geral&#8221; no CTIC 2009 em Viseu a 13 de Maio. Esta apresentação é útil para quem está a entrar nesta coisa das RIAs e quer perceber exactamente o que são, e quais as diferenças e vantagens face às aplicações Desktop e Web. Espero que vos seja útil.</p>
<p><object style="width: 600px; height: 550px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="550" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.riapt.org/wp-content/uploads/2009/07/RIAs-Uma-Visao-Geral.swf" /><embed style="width: 600px; height: 550px;" type="application/x-shockwave-flash" width="600" height="550" src="http://www.riapt.org/wp-content/uploads/2009/07/RIAs-Uma-Visao-Geral.swf"></embed></object></p>
<p>Aceitam-se comentários <img src='http://www.riapt.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2009/07/02/slides-da-apresentacao-rich-internet-applications-uma-visao-geral-no-ctic-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Portugal FlashCamp 2009, dia 25 de Junho no ISCTE, Lisboa</title>
		<link>http://www.riapt.org/2009/06/22/portugal-flashcamp-2009-dia-25-de-junho-no-iscte-lisboa/</link>
		<comments>http://www.riapt.org/2009/06/22/portugal-flashcamp-2009-dia-25-de-junho-no-iscte-lisboa/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 23:53:29 +0000</pubDate>
		<dc:creator>João Saleiro</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Formação]]></category>
		<category><![CDATA[RIAPT]]></category>
		<category><![CDATA[Rich UI]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=421</guid>
		<description><![CDATA[
No próximo dia 25 de Junho, Quinta-feira, vai ocorrer no ISCTE das 14h30 às 19h30 o Portugal Flash Camp 2009. A agenda é a seguinte:
Andrew Shorten (Adobe Systems) &#8211; Flash Catalyst and Flash Builder 4
João Fernandes (Cofina SGPS) &#8211; Data Centric Development
João Saleiro (Webfuel) &#8211; Enterprise RIAs: This is how we do it
Paulo Moreira (Ayumikata) [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://images.eventbrite.com/logos/334584752.jpg?rand=48921" title="Logotipo do FlashCamp 2009" class="alignnone" width="450" height="68" /></p>
<p>No próximo dia 25 de Junho, Quinta-feira, vai ocorrer no ISCTE das 14h30 às 19h30 o Portugal Flash Camp 2009. A agenda é a seguinte:</p>
<p>Andrew Shorten (Adobe Systems) &#8211; Flash Catalyst and Flash Builder 4<br />
João Fernandes (Cofina SGPS) &#8211; Data Centric Development<br />
João Saleiro (Webfuel) &#8211; Enterprise RIAs: This is how we do it<br />
Paulo Moreira (Ayumikata) &#8211; Olha mãe, sem rato nem teclado<br />
Rui Silva (Alert) &#8211; Testes Unitários em Flex<br />
Rui Vieira(FullSix) &#8211; Get out There</p>
<p>A morada do ISCTE é: </p>
<p>Avenida das Forças Armadas<br />
Lisboa, 1649-026<br />
Portugal<br />
(Google Maps <a href="http://maps.google.com/maps?q=Avenida+das+For%C3%A7as+Armadas+Lisboa%2C+1649-026+Portugal">link</a>)</p>
<p>As inscrições são gratuítas e limitadas a 350 pessoas. O endereço para se inscrever é <a href="http://portugalflashcamp2009.eventbrite.com/">http://portugalflashcamp2009.eventbrite.com/</a>.</p>
<p>Mais informações no site oficial do Adobe User Group: <a href="http://aug.riapt.org">http://aug.riapt.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2009/06/22/portugal-flashcamp-2009-dia-25-de-junho-no-iscte-lisboa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aumentar a velocidade no carregamento de PNG&#8217;s convertendo-os para SWF</title>
		<link>http://www.riapt.org/2008/12/04/aumentar-a-velocidade-no-carregamento-de-pngs-convertendo-os-para-swf/</link>
		<comments>http://www.riapt.org/2008/12/04/aumentar-a-velocidade-no-carregamento-de-pngs-convertendo-os-para-swf/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 15:04:43 +0000</pubDate>
		<dc:creator>João Saleiro</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rich UI]]></category>

		<guid isPermaLink="false">http://www.riapt.org/?p=396</guid>
		<description><![CDATA[Fizemos na Webfuel um projecto há uns meses para um dos principais criadores de joias nacionais. Um dos requisitos do cliente era que na secção de showroom, cada joia pudesse ser apresentada dentro de uma ferramenta de zoom que permitisse ver a joia em detalhe &#8211; implicando que as fotos das joias tivessem resoluções superiores [...]]]></description>
			<content:encoded><![CDATA[<p>Fizemos na Webfuel um projecto há uns meses para um dos principais criadores de joias nacionais. Um dos requisitos do cliente era que na secção de showroom, cada joia pudesse ser apresentada dentro de uma ferramenta de zoom que permitisse ver a joia em detalhe &#8211; implicando que as fotos das joias tivessem resoluções superiores a 700&#215;700 pixeis. Outro dos requisitos, era que as imagens das joias não tivessem <em>fundo </em>para que pudessem encaixar correctamente no layout do site &#8211; implicando que teria que ser escolhido um formato que suportasse transparência, neste caso PNG. Para terminar, era imperativo que o cliente, sem quaiquer conhecimentos de informática, pudesse adicionar e actualizar as fotos das joias através do backoffice &#8211; implicando que cada foto fosse um PNG colocado no servidor pelo cliente através das funcionalidades do backoffice.</p>
<p>Estas pré-condições implicaram o recurso ao formato PNG &#8211; o único que permitiria resolver o problema, visto a norma JPEG2000 não ser suportada pelo Flash Player. Porém, adoptar o formato PNG para as fotos das joias com as dimensões acima referidas resultou em ficheiros de cerca de 500KB. Isto, num site com cerca de 200 a 300 jóias, com várias fotos cada.</p>
<p>Depois do <em>deployment </em>do site constatou-se o esperado: em ligações rápidas, os 500KB de cada foto não representavam grandes problems, mas em ligações lentas podia ser desesperante esperar de 10 a 20 segundos para a foto carregar. E com o disseminar recente das ligações 3,5G (kangurus, vodafone e tmn connect box, etc), tornou-se problemático pelo que tivemos que procurar por uma solução.</p>
<p>Encontrámos uma extensão chamada <a href="http://www.swftools.org/png2swf.html">PNG2SWF</a> pertencente ao pacote SWFTools que permitia converter um PNG para um SWF. Como é sabido, um PNG embebido em SWF pode levar compressão sendo mantida a transparência, pelo que decidimos fazer algumas experiências. Após alguns testes, tivemos resultados impressionantes: imagens de 500 Kb passaram para 60 Kb sem serem perdidos os canais alpha. Exactamente o que precisávamos!</p>
<p>O problema que surgiu de seguida consistia em saber como integrar o PNG2SWF com o site / backoffice sem afectar a experiência do utilizador. Era importante que o cliente continuasse a utilizar o backoffice como sempre, sem trabalho adicional.</p>
<p>Fizemos então um script simples, que vos ofereço adiante, e que consiste num género de proxy para carregar PNGs, só que devolve o PNG convertido para SWF, e escalado para dimensões arbitrárias escolhidas pelo programador.</p>
<p>O download do script pode ser feito aqui: <a href="http://www.riapt.org/wp-content/uploads/2008/12/pngoptimize.zip">pngoptimize</a> . O source code pode ser visto abaixo:</p>
<pre>&lt;?php

    // 31-10-2008
    // pngOptimize.php by João Saleiro - Webfuel ( joao.saleiro@webfuel.pt)
    // Todo:
    // - receive quality from $_GET vars
    // - set default values for quality, w and h

    $image = $_GET['url'];
    $w = $_GET['w'];
    $h = $_GET['h'];

    $date = filemtime($image);

    // Generate SWF filename
    $swf = $image . $w . $h .'_'. $date .'.swf';

    // Generate SWF if it doesn't exist
    if (!file_exists($swf))
    {
        // Calculate dimensions
        list($width, $height) = getimagesize($image);

        $proportion = 1;
        if ($width &gt; $height)
            $proportion = $w/$width;
        else
            $proportion = $h/$height;

        // Load image and preserver transparency
        $im = @imageCreateFromPNG ($image);
        imagealphablending($im, false);
        imageinterlace ( $im, 0);
        imagesavealpha($im, true);

        // Create new Image
        $im_dest = imagecreatetruecolor ($width*$proportion,  $height*$proportion);

        // Set transparency
        $background = imagecolortransparent($im);
        imagecolortransparent($im_dest, $background);
        imagealphablending($im_dest, false);
        imagesavealpha($im_dest, true);

        // Resize old image to new image
        imagecopyresampled($im_dest, $im, 0, 0, 0, 0, $width*$proportion, $height*$proportion, $width, $height);

        // Save new image
        $tempName=$image.'temp.png';
        imagepng($im_dest, $tempName);

        // Clean memory
        imagedestroy($im);
        imagedestroy($im_dest);    

        // Convert new image to SWF
        shell_exec("./png2swf -j 85 -o $swf $tempName");

        // Remove temp file
        unlink($tempName);
    }

    // If we get here, and there's no file, we don't return nothing
    if (!file_exists($swf))
        exit(0);

    // Return generated SWF
    header("Content-type: application/x-shockwave-flash");
    $fp = fopen($swf,"rb");
    fpassthru($fp);
    fclose($fp);
?&gt;</pre>
<p>O algoritmo é relativamente simples:</p>
<ol>
<li>O script recebe por GET os parâmetros: url, w e h, que correspondem ao endereço relativo do PNG, e as dimensões que queremos para o nosso SWF resultante;</li>
<li>O script vai então gerar um nome de ficheiro único para aquele url, com aquelas dimensões, e para a data do PNG (i.e. se o PNG for actualizado pelo cliente o script detecta que há um PNG novo, o que implica gerar um novo SWF com novo nome);</li>
<li>É verificado se já existe algum SWF com aquele nome único (i.e. uma versão em cache daquele PNG já convertido para SWF com aquelas dimensões). Se existir, o SWF é aberto e lido, e feito um fpassthru do ficheiro (i.e. é devolvido o conteúdo do ficheiro SWF), depois de definido o header application/x-shockwave-flash para que o Flash possa interpretar o resultado do ficheiro PHP como sendo um SWF;</li>
<li>Se não existir nenhum SWF, o script vai abrir o PNG referido no URL, e criar um novo PNG temporário com as dimensões referidas, mantendo a transparência;</li>
<li>É então feita a conversão desse PNG temporário para SWF através de um shell_exec que executa o png2swf com os parâmetros necessários para a conversão, sendo gerado um SWF com o nome de ficheiro referido acima, e devolvido com o fpassthru.</li>
</ol>
<pre></pre>
<p>Para utilizar este script é necessário:</p>
<ul>
<li>Colocar no servidor, na mesma directoria do pngConvert.php, o png2swf (linux) ou png2swf.exe (windows);</li>
<li>Permissões de execução do png2swf nessa directoria;</li>
<li>Permissões do php para a chamada de comandos externos (shell_exec);</li>
<li>Permissões de escrita nas directorias onde estão os ficheiros PNG para serem lá colocados os ficheiros SWF;</li>
</ul>
<p>Do lado do cliente, o código necessário para carregar um PNG convertido para SWF através do pngConvert é:</p>
<ul>
<li> MXML:</li>
</ul>
<pre>
&lt;mx:Image source="pngConvert.php?url=imagem.png&amp;w=100&amp;h=100"/&gt;</pre>
<ul>
<li>Actionscript 3 (i.e. Flash)</li>
</ul>
<pre>var l:Loader=new Loader();</pre>
<pre>l.load(new URLRequest('pngConvert.php?url=imagem.png&amp;w=100&amp;h=100'));</pre>
<pre>addChild(l);</pre>
<p>O script ainda pode levar algumas melhorias, nomeadamente:</p>
<ul>
<li>a qualidade da imagem também ser passada por GET;</li>
<li>se os parâmetros w e h não estiverem definidos, o SWF gerado é da mesma dimensão que o PNG original.</li>
</ul>
<p>Não implementei essas melhorias porque não precisei na altura, mas se alguém quiser melhorar, é bem vindo &#8211; publicarei depois aqui a versão melhorada, com devidos créditos.</p>
<p>Espero que esta informação e script vos sejam úteis. O script pode ser utilizado livremente e só pedimos que seja colocado um comentário neste post com o endereço do site onde o estão a usar, para alegrarem o nosso dia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.riapt.org/2008/12/04/aumentar-a-velocidade-no-carregamento-de-pngs-convertendo-os-para-swf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
