
Desde as 00h:00m de hoje está online o novo site institucional da PT Inovação que utiliza tecnologia da plataforma Flash. Escrevo este post com a satisfação de ver finalmente em acção a as3localelib, num projecto de maior dimensão, como solução para localizar o interface com o utlizador.
Já alguma vez se deparam com a seguinte situação?
Criam um TextField com o texto multi linha, seleccionável e com autoSize. Tudo porreiro até que resolvem seleccionar o texto até o fim e por mania do flash player este faz scroll de uma linha. Argh! F******! 
Ler mais…
Desde ontem está disponível no Google Code o código fonte, documentação e um novo exemplo que melhor demonstra como utilizar a livraria.
Mais uma vez, feedback é sempre bem-vindo.
http://code.google.com/p/as3localelibrary/
O título deste post pode não ser o mais feliz, mas à falta de melhor tradução é que se pode arranjar.
O que quero eu dizer com localizar o conteúdo? Disponibilizar ao utilizador da aplicação/site informação no idioma que melhor se adeque, trocando por miúdos… multilíngua.
O Flash IDE de algumas versões para cá que incorpora uma ferramenta para o fazer, Strings Panel, mas nunca me predispus a perceber até que ponto era flexível para colocar a funcionar fora do ambiente Flash IDE.
Posto isto, há cerca de 6 meses resolvi tentar criar uma pequena livraria que simplifica o processo mas até há pouco tempo nunca tinha tido a oportunidade de a testar num ambiente de produção. Como fiquei satisfeito com o resultados resolvi abrir este projecto ao público para ter um maior feedback e conseguir evolui-lo.
A estrutura é a seguinte:
- A classe LocaleManager (Singleton) gere o carregamento dos diferentes ficheiros de linguagem, em xml, consoante a necessidade e informa todos as instâncias que estejam registadas.
- A classe LocaleContainer é a base dos elementos visuais que contenham elementos que necessitem de localização. Classes que a estendam apenas estão registadas no manager enquanto pertencem à Display List, e apenas assim recebem notificação quando é mudado o idioma. Sempre que uma classe que implemente o interface ILocaleComponent é adicionada à Display List o LocaleContainer guarda a sua referência para notificar quando for notificado pelo manager, uma espécie de notificações em cadeia.
- As classes que queiram ser notificadas quando ocorre uma mudança de idioma têm necessariamente de implementar o interface ILocaleComponent, garantido assim que dispõem de um método público através do qual podem ser notificadas e actualizarem o que necessitem.
Isto é a base e algo que é efectuado “under the hood“, o exemplo seguinte mostra a simplicidade em utilizar esta solução.
O plugin de syntax highlight da minha instalação do wordpress tirou o dia para me por fora do sério e parece-me mais saudável para o meu teclado que disponibilize o exemplo juntamente com a source e documentação.
Gostava de receber algum feedback se experimentarem com exemplos/sugestões/correcções que ajudem a melhorar o projecto.
DOWNLOAD AS3LOCALELIBRARY
Após 8 meses e 2 dias volta a existir “vida” por aqui, tanto tempo que a primeira tarefa foi a actualização do Wordpress para a release 2.7.1 (ainda tinha a 2.5).
Agora que voltei a ter um contacto diário com a plataforma, não prometo… mas espero colocar conteúdo mais regularmente.
Até já.
Se nesta altura está a pensar o que será o FlashDevelop, aconselho a leitura de um post anterior (Flash em ambiente Open Source).
A utilização de templates pode aumentar bastante a produtividade ganhando tempo em tarefas repetitivas, e.g. ao utilizar uma framework regularmente.
Ao criar um projecto já existem alguns disponíveis (Class, Event, MXML, etc) que servem a maioria dos propósitos, mas podemos adaptar/criar templates às nossas preferências pessoais (ou equipa) e assim uniformizar o código.
Exemplo
Criar o um interface com um bloco de comentário com uma licença (MIT neste caso).
- "Tools->Custom Arguments" inserir um par de valores, sendo assim possível adicionar qualquer argumento não disponível.
- "Tools->Applications Files" abre a pasta onde estão os ficheiros que permitem personalizar a aplicação. Crie um ficheiro "Interface.as.fdt" na pasta "./Templates/ProjectFiles/AS3Project/" com o seguinte:
Actionscript:
$
(LicenceMIT
)
package $
(Package
)$
(CSLB
) {
public interface $(FileName)$(CSLB) {
$(EntryPoint)
}
}
Agora está disponível para adicionar a qualquer projecto AS3.

O código gerado:
Actionscript:
/**
Copyright (c) 2008 Nuno Rosa, http://www.nunorosa.com
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
package com.
nunorosa.
sample
{
public interface SampleInterface
{
}
}
Simples e eficaz, mais informações disponíveis na documentação do FlashDevelop.
O desafio foi lançado (no início do mês), criar uma aplicação simples em Flex que carregue um texto dinamicamente contendo uma frase específica e esperar que o Google a indexe.
A ideia de um concurso veio do Platform Evangelist, Ryan Stewart, e todas as participações têm de seguir as seguintes regras:
- Utilizar a Flex Framework
- A frase tem de ser carregada dinamicamente, ou seja, não pode existir aquando da compilação.
- O carregamento tem de ser feito apenas se ocorrer interacção (e.g. click num botão).
- O resultado dado pelo Google (se tal acontecer) deverá apontar directamente para o estado onde essa frase é carregada (deeplinking).
- Código fonte disponível
- Várias participações permitidas
(+Detalhes)
O que realmente interessa aqui é saber se o Google está a indexar conteúdos percorrendo uma aplicação como pseudo-utilizador e o que se nota é que ao colocar a variável concurso se desvirtua o concurso.
Eu percebo que o Ryan apenas tenha colocado a hipótese de prémios para tentar que o máximo de programadores tentassem as mais variadas maneiras de contruir a aplicação mas o que se viu é que sem regras que foquem o objectivo final isso é difícl. Por exemplo:
- Apenas permitir a frase no conteúdo carregado para o Flash Player.
O que se nota é que a maior parte do conteúdo indexado é a sobre as aplicações e não as aplicações em si.
- Outro caso, um dos participantes comprou o domínio e nomeou o swf com a mesma palavra e é isso que faz aparecer a sua entrada em 1º, mesmo que o conteúdo não esteja a ser indexado (até hoje,19Julho, não estava).
Finalmente a minha participação:
Esta tentativa baseia-se em 3 pressupostos que penso serem os que garantem melhores hipóteses de o Google realmente indexar o conteúdo, lembro que são apenas palpites e que aparte do Google/Adobe ninguém sabe o que se passa.
- Display List: Cada vez que o Flash Player faz o render o playerbot percorre a display list e quanto encontra objectos de descendam/contenham do/o TextField, indexa o texto. Se isto acontecer, a probabilidade de os objectos serem encontrados aumenta com a proximidade à raiz (Stage) da display list.
- HTTP: O playerbot deve monotorizar todos os requests feitos pelo Flash Player, se o pedido feito for um ficheiro ASCII (XML) é mais fácil ser indexado do que um formato binário (AMF Remoting).
- Formatação: É provável que o Google de relevância à formatação do texto, como em HTML, por isso a palavra chave está formatada com uma tag H1 definida em CSS.
Sem mais demoras e com código fonte disponível (Right-Click > View Source):
http://blog.nunorosa.com/wp-content/uploads/exemplos/Flex/SEO/
PS:Estou a fazer o tracking dos clicks através do Google Analytics mas penso que este não regista a passagem de bots. Alguém tem uma dica de como fazer isso?
A Adobe anunciou que tem estado a trabalhar com a Google e Yahoo! para melhorar a indexação de conteúdos contextualizados dentro de ficheiros SWF.
Esta nova tecnologia consiste num "Flash Player" modificado que permite aos bots dos motores de pesquisa interagirem com uma aplicação flash como se de um utilizador se tratasse activando os vários estados da aplicação e indexar o conteúdo carregado dinâmicamente do exterior do Flash Player. É uma signigicativa diferença do que acontecia até aqui em que apenas o texto estático presente na aplicação aquando da compilação era indexado.
Mas não se pense que basta compilar a aplicação/website colocar online e esperar que os resultados apareçam, ainda assim é necessário ajudar o conteúdo a ficar mais acessível fornecendo por exemplo pontos de entrada para determinados estados (deeplinking).
Exemplo: o google indexa os contactos e localização num certo estado do website. Se esse estado não tiver um url que permita aceder directamente, quando o utilizador carregar no resultado da pesquisa o website vai abrir no seu estado inicial e não onde está a informação que se queria.
Dúvidas
Qual a melhor forma de embeber um SWF no HTML?
Hoje em dia o SWFObject é o mais consensual e está previsto ser incluído no Dreamweaver/Flash CS4. Mas lendo o blog do Google sobre o assunto é esclarecido que o bot não executa alguns tipos de javascript o que pode fazer com que este nem se aperceba que existe um SWF para indexar.
E se o conteúdo dinâmico forem outros SWF's?
Esta parece ser quanto a mim a grande limitação desta tecnologia, novamente recorrendo ao anúncio do Google, todos os ficheiros carregados externamente pelo SWF que está a ser indexado não vão ser tratado como parte dele mas sim indexados separadamente (será do algoritmo utilizado pelo bot ou do próprio FP?).
Isto é um grande problema porque na maioria dos websites desenvolvidos no Flash utilizam como workflow vários ficheiros SWF para separar secções distintas sendo o principal apenas um contentor com a interface. Voltando ao exemplo anterior o resultado da pesquisa iria direccionar o utilizador para contacto.swf em vez de um link para o endereço principal com deeplinking.
Conclusão
Por enquanto as informações disponíveis ainda não indicam claramente aquilo que o programador pode fazer para obter o melhor partido destas novas alterações, as experiências da comunidade podem ser uma boa ajuda, no entanto as antigas técnicas continuam válidas (deeplinking, sitemaps, etc).
Fontes
Adobe - Press Release
Adobe - SWF searchability FAQ
Google - Webmaster Central Blog

Após 3 semanas offline, o fórum que começou como suporte aos tutoriais do Lee Brimelow em 2006 (já é uma comunidade por si só) voltou hoje ao activo.
Mudanças mais significativas:
- Upgrade para phpBB™ 3.0 “Olympus”
- Estrutura alterada, sendo a mais significativa uma secção de emprego/freelance.
Obrigado ao Lawrence Job, Ludvig Jernqvist e Erik Hallander pelo tempo dispendido a trazer de volta um dos melhores locais para discutir/ajudar descontraidamente sobre Flash Development.
Hoje a Adobe disponibilizou a versão 1.1 do AIR (Adobe Integrated Runtime) com suporte para localização (idioma Português-PT não está contemplado, apenas Português-BR).
Juntamente com esta release foram também lançadas algumas novidades relativas ao runtime.
- Update Framework (Beta) disponível no Labs permite um melhor suporte para incluir capacidades de actualização em aplicações AIR.
- SwitchBoard, permite enviar scripts de aplicações AIR para aplicações da Creative Suite CS3 (Photoshop, Illustrator, etc).
- Adobe AIR Cookbook, partilha de soluções para a tecnologia AIR à semelhança do já existente Flex Cookbook
.