Mar
31

Adobe onAIR Tour Madrid - Parte 2 (Tarde)

O Ricardo Castelhano ficou com os dedos cansados e pediu substituição na tarefa de blogger. Portanto, aqui vai o resumo do que se vai passando durante a tarde.

[13:45] Adobe AIR API Overview (Daniel Dura)

O Daniel Dura está a demonstrar as funcionalidades da API do Adobe Air. Acabou de mostrar o quão simples é criar uma janela normal do sistema operativo (NativeWindow), e definir as suas propriedades. Por exemplo, alterar o chrome.

Explicou que existem vários tipos de NativeWindowType:

  • Normal - janela normal do sistema operativo
  • Lightweight - ideal para usar por exemplo em popups.
  • Utility - ideal para usar por exemplo em paneis dockable, e janelas para complementar a janela “Normal”

Está neste momento a demonstrar a api de File I/O, que obviamente permite a leitura e escrita de dados no disco local. Podemos escrever as nossas próprias janelas de diálogo para interagir com o disco, ou usar as do sistema operativo.

Explicou que existem duas formas de interagir com ficheiros: sincrona e assincrona. Para quem não sabe, a síncrona irá interromper a aplicação enquanto um ficheiro carrega. A assíncrona permite que a aplicação continue a correr como normalmente, e quando o ficheiro termina de carregar é lançado um evento a avisar que o ficheiro está disponível.

Acabou agora de explicar que é possível chamar a janela de dialogo do sistema operativo para “browse” de ficheiros de três diferentes formas:

  • browseForDirectory
  • browseForSave
  • browseForOpen

Está neste momento a mostrar que ao abrir um ficheiro é possível ir buscar praticamente todo o tipo de informação do ficheiro, como por exemplo, a imagem do ícone.

Chegou o momento de demonstrar como fazer ligações SQL a partir do Adobe Air. É realmente muito simples - muito semelhante ao que se faz em PHP.

[Nota: presentes no evento a representar a Adobe, vi o Ryan Stewart, Lee Brimelow, Daniel Dura, Mike Chambers, Enrique Duvos, Serge Jespers, Chris Brichford, Andre Charland, a Sumi Lim e o nosso Paulo Coelho. Também me cruzei com o Carlos Rovira e outros nomes que não me recordo agora]

Estamos agora na API de Drag/Drop e de acesso ao Clipboard. Esta é de longe uma das funcionalidades mais interessantes, visto que não é particularmente fácil criar um sistema de drag&drop multi-plataforma. Está a mostrar uma aplicação que permite arrastar uma “imagem” da aplicação para fora da mesma para outras aplicações no sistema operativo. O Luís da Flag explicou-me que o suporte multi-plataforma é conseguido graças ao facto de que todos os sistemas operativos possuem um clipboard, e foi através disso que foi implementado o suporte de drag&drop.

Chegou a altura de ver o suporte de icones. As aplicações Air recebem ícones no formato PNG, e é possível definir ícones para quase tudo (tray icon, application icon, etc) e em runtime.

O Daniel Dura está neste momento a mostrar como se faz para monitorizar se a aplicação está ligada ou não à Internet. É realmente fácil: basta instanciar um URLMonitor, e adicionar os respectivos eventListeners para escutar as alterações ao estado da ligação.

Outras funcionalidades genéricas são por exemplo: gravar localmente dados encriptados; notificações de dock; e notificações de idle. No blog do Daniel Dura existem/existirão variados exemplos de como usar quase todas as funcionalidades da API do Adobe Air.

[14:30] Data Intensive Enterprise AIR Applications (Enrique Duvos)

Começa a sessão do Enrique Duvos. Em Espanõl… Vai ser um bocado complicado acompanhar esta, mas vamos ver o que se consegue fazer…

O Enrique começa por mostrar o Census feito pelo James Ward, uma aplicação para comparar em termos de performance e largura de banda as diferentes tecnologias/métodos de comunicação com o servidor. Dá obviamente destaque à performance do Flash Remoting, que é de longe a mais eficiente de todas.

Explica que o Flex pode ligar a praticamente qualquer backend, e começa a explicar as vantagens do LCDS - LiveCycle Data Services. Tais como poder “empurrar” dados para os clientes (sim, o servidor toma iniciativa), sincronizar dados entre todos os terminais, etc.

Explica que existe uma solução open-source suportada pela Adobe que possui parte das funcionalidades do LCDS, o BlazeDS. Está a demonstrar uma aplicação “fictícia” que permite que todos os clientes possam ver em real time os dados da bolsa. Sempre que é actualizado o valor de uma acção no servidor, todos os clientes recebem esses dados.

Mostra a versão Air da aplicação, de forma a demonstrar que é possível ter múltiplos clientes tanto web como desktop a consumir mensagens.

[Nota: O Ricardo Castelhano também está a bloggar sobre o evento em real time. ]

O Enrique está agora a demonstrar aplicações que se sincronizam assim que a ligação volta a ficar disponível. Isto é, se tivermos a trabalhar, e a ligação cair, quando a ligação é reposta o data management permite sincronizar os dados sem que se percam. Ou por exemplo, podemos construir uma aplicação que pode correr tanto offline como online usando os mesmos dados. Quando está offline, os dados são gravados localmente. Quando a ligação é reposta, são sincronizados com o servidor (com gestão de conflitos incluída). Chama-se a isto “Offline synchronization using LCDS Data Management”.

Termina a sessão do Enrique. Não consegui acompanhar tudo, mas ficou aqui o principal…

(Ricardo Castelhano here…o PC do João Saleiro está com stresses…falta-lhe o RedBull ! Vamos aguardar para o PC arrefecer um pouco, e o João já voltará ao “live posting”)

[João Saleiro: back to live blogging. Aparentemente o portátil estava excessivamente quente... Uff!!]

A sessão do Chris Brichford já vai quase no fim, e já não consigo perceber bem o que se está a fazer. Basicamente, o tema é:
[15:05] HTML / JavaScript desktop applications on Adobe AIR. (Chris Brichford)


Learn how add desktop functionality to an HTML application running on Adobe AIR on the desktop. Learn about using the drag and drop API, the file system API, and other Adobe AIR APIs from HTML.O Chris está neste momento a mostrar como é possível fazer ligações a um servidor SQL a partir de HTML/Javascript usando a API do Adobe Air.

Começa a sessão seguinte.

[15:35] Using JavaScript Frameworks in AIR Applications (Andre Charland)

O Andre apresenta-se, e apresenta a empresa dele: Nitobi. Explica que trabalham sobretudo com AJAX, e que é uma empresa relativamente pequena. Apesar disso trabalham com empresas com a BMW, Nintendo (e outras que não me lembro do nome, já passou o slide).

Porquê usar AJAX com Air?

  • Reutilização de código
  • Reutilização de skills
  • HTML é realmente bom em algumas coisas
  • Manter alguns padrões de UI
  • O Javascript continua a crescer

As frameworks AJAX compatíveis com AIR:

  • Spry
  • jQuery
  • mochikit
  • nitobi
  • mootools
  • extjs
  • yahoo ui library
  • dojo

São demonstrados alguns exemplos de aplicações AIR feitas com AJAX. Está agora a mostrar um exemplo de um “FishEye Menu” feito em AJAX a correr dentro do AIR. Concorrência ao meu (versão em Flash). A fluídez do menu pareceu-me um bocado “choppy”, mas talvez seja do computador do Andre.

Explica que os clientes muitas vezes exprimem preocupações relativamente à necessidade de se ter que descarregar e instalar um runtime para se instalar uma aplicação, mas que o install badge do Adobe Air vem resolver todos esses problemas, bastando ao utilizador fazer um clique, e o resto é gerido pelo Air.

O Andre falou de algumas experiências pessoais/profissionais com o AJAX e o Adobe Air.

Termina a sessão.
[16:30] AIR Conditioning (Lee Brimelow)


Nesta sessão vão mostradas as funcionalidades da API do Adobe Air usando Flash. É uma sessão direccionada sobretudo aos Flash Designers. A primeira API a apresentar será a Windowing API.

São mais uma vez apresentados os Window Types do Air, Normal, Utility e LightWeight. O Lee explica que a Lightweight window não cria janela nenhuma: somos nós que a temos que desenhar. Relativamente ao “chrome”, existem:

  • System chrome;
  • Custom (opaque);
  • Custom (transparent);

É mostrado o código para criar uma NativeWindow. É extremamente fácil e intuitivo. A classe NativeWindow possui métodos e propriedades como:

  • activate()
  • alwaysInFront=true;
  • close()
  • maximize()
  • minimize()
  • orderInBackOf(otherWin);
  • orderInFrontOf(otherWin);

O Lee explica agora como adicionar essa Window ao nosso Stage. Basta simplesmente definir as propriedades da janela (largura, altura, alinhamento, etc) fazer um addChild ao Stage. Simplicíssimo!

São agora apresentados os eventos:

  • activate
  • deactivate
  • closing
  • close
  • moving
  • move
  • resizing
  • resize
  • display_state_changing
  • display_state_change

O Lee explica que numa aplicação Flash tradicional que corra em Full Screen não é possível ler dados do teclado por motivos de segurança. Com Air é possível contornar isso, visto tratar-se de uma aplicação desktop que o utilizador tem que instalar explicitamente.

Está agora a apresentar uma mini-aplicação que permite criar janelas dinamicamente para mostrar as diferenças entre os tipos de janelas.

Começa a explicar os Native Menu Types que são possíveis de criar no Air:

  • Application menus
  • Window Menus
  • Context Menus
  • Dock and System tray menus
  • Popup menus

O Lee explica que há certos OSes podem não suportar menus. Para verificar isso, pode ser usado uma estrutura condicional if (NativeApplication.supportsMenu).

Entramos outra vez na API de File I/O. Como já se falou muito na File I/O API, o Lee está a passar por cima disso muito rapidamente. É novamente explicado que a API pode ser síncrona e assícrona (ver acima). A API possui ainda algo extremamente útil, um conjunto de métodos que devolve as directorias de sistema independentemente do sistema operativo.

O Lee está agora a falar em Encripted Storage, que permite gravar no local Filesystem dados encriptados, como passwords, e outra informação sensível.

O Lee explica agora como se cria uma base de dados local, como se faz uma ligação e como se acede aos dados.

Surge então a parte de “OS Interaction”. Existe uma propriedade no Air que permite activar o “Launch on Login”, que permite que uma aplicação corra automaticamente quando um utilizador faz login no Windows. É possível também gerir as associações dos ficheiros do sistema operativos.

Outra coisa interessante, é escutar eventos que indicam se o utilizador está ou não a usar a aplicação, nomeadamente detectando se um utilizador está idle ou não. É também possível detectar se o utilizador está a fechar a aplicação, para, por exemplo, gravarmos dados antes que esta feche.

Voltamos à parte da ligação à internet, que permite gerir ligações ocasionalmente ligadas, permitindo detectar tanto o HTTP Status como o estado de uma ligação por sockets.

O Air permite ainda colocar duas aplicações a comunicar entre elas, através do LocalConnection. Para identificar as aplicações é usado o appID.

O Lee diz que é já possível descompilar código Actionscript de aplicações para o Flash 9. Está a mostrar o AOL Music - Top 100 vídeos, uma aplicação AIR muito gira e que uso várias vezes. Pergunto-me o que irá ele fazer… descompilar a aplicação? Ok, e foi mesmo isso. Simplesmente abriu o SWF, e o Sothink SWF Decompiler mostra tudo: imagens, morphs, código, etc. O código não é 100% descompilado, mas sim 95%. Há algumas coisas que não são possíveis recuperar.

Chega a hora da imperial! :P




Mar
31

Adobe onAIR Tour Madrid - Parte 1 (Manhã)

Oraite, o RIAPT está no Adobe onAIR Tour, e a comitiva não se fez rogada…e somos logo 15 (!!)…ah pois é!

Bem, vamos ao que interessa.

As portas abriram as 9h15 e as 10h sem grandes demoras o Enrique Duvós começou a sua palestra sobre o que é o AIR, quais as potencialidades, novidades e o que podemos vir a esperar das novas edições…o João Fernandes já falou numa delas, o AIR para Linux :)

As aplicações AIR que o Enrique mostrou foram muito interessantes, desde o “Google Analytics Reporting” do belga Nicos à aplicação da Disney (esta última com uma “sensação” visual extremamente interessante, pois perdeu-se o “quadrado” das aplicações).

[10:30] Building your first Adobe AIR application with Adobe Flex (Mike Chambers)

Desenvolver AIR com o Flex Builder … começamos por definir as propriedades da nossa aplicação no ficheiro XML: versão, keynotes, aspecto da janela, se a aplicação se mantêm invisível até estar totalmente operacional (o Mike aconselhou esta opção para uma melhor “User Experience”.

E temos a nossa primeiro aplicação AIR do dia - “Hello World”.

Após horas em desenvolvimento, como se distribui a aplicação?

O Mike continua a apresentação a explicar como funciona o AIR Installer, o modo “View Source”, os certificados de segurança (atenção que se o certificado for criado pelo próprio developer, o runtime installer não conseguirá detectar quem é o author e aparecerá “Unkown“) - ou se conhece quem é o autor ou se confia nas “Leis de Murphy” !

Em suma, o Mike menciona “se já és um Flex Developer, então também és um AIR Developer” - do que esperam para começar?

[11:10] Building your first AIR application with HTML and JavaScript (Kevin Hoyt)

Para se fugir um bocado ao Mundo da Flash Platform, o Kevin vem apresentar como se desenvolve uma aplicação AIR com HTML e JavaScript.

Ao se desenvolver em HTML/JavaScript, utiliza-se o browser para se testar se o programa tem bugs ou não…aqui há um problema, não há browser para se testar!!

O Kevin diz que o processo de se criar o installer, instalar, testar, desinstalar, criar o installer, instalar, testar, desinstalar….até se ter o produto final, “it’s not funny at all“.

A extensão para o Dreamweaver permite se testar directamente no AIR sem se correr esse processo todo.

O “Code Hint” para as instruções AIR do JavaScript também é muito interessante:

A apresentação do Kevin continua pela extensão Aptana para o Eclipse. Também muito interessante, pois permite os “users” de Eclipse se manterem no mesmo ambiente de trabalho !

[11:40] Break

[11:55] Leveraging HTML and JavaScript within Adobe AIR (Kevin Hoyt)

Nesta segunda parte o Kevin lança um bom desafio … misturar HTML/JavaScript com Flash/Flex dentro da mesma aplicação AIR.

- através da classe ExternalInterface é possível através do ActionScript executar métodos de JavaScript;

- através do API do AIR para JavaScript, podemos aceder a todos os métodos que estejam dentro do Flash Player

O Kevin irá disponibilizar os slides e mais alguns exemplos no blog pessoal - aqui.

[12:35] Deploying and Updating AIR Applications (Serge Jespers)

“Step1: - Packaging”
“Step2: - Custom made installer’s badge”
“Step3: - Keep it updated”

O Serge está a demonstrar como se podem criar “badges” originais para os “installers” do AIR, e não é que abriu o Photoshop?

Para o “Keep it updated” é que é necessário um pouco de código, mas nada de especial!

Boa apresentação do Serge, com bom humor a terminar a parte da manhã.

[13:00] Lunch

 

 

 




Mar
31

Adobe AIR para Linux

A Adobe acabou de disponibilizar no Labs a primeira versão do AIR runtime para Linux.

Esta é a primeira versão alpha do produto e ainda não dispõe de todas as funcionalidades da versão 1.0.

Abaixo seguem a lista de funcionalidades ainda não disponiveis nesta primeira versão pública.

  • Notificações em runtime/ update em background
  • Intalação pelo Badge
  • Associação de tipos de ficheiros
  • Suporte de icon de System tray icon e menus
  • Aceleração por Hardware
  • Inicialização da aplicação pelo browser
  • Suporte para IPv6
  • Aceleradores de Keyboard
  • Screen API (Suporte para multi-monitores)
  • DRM, Armazenamento local encriptado e Certificados
  • A/V Hardware API
  • Impressão
  • Execução da aplicação no arranque
  • PDF e SWF dentro de HTML

Poderão também encontrar a última versão do Flex Builder para Linux aqui.




Mar
28

Componente LINQ do C# em PHP - PHPLinq

O C# 3.5 contem um componente que permite efectuar pesquisas dentro de várias estruturas de dados, o LINQ.

Um PHP/.NET Developer decidiu criar um package para PHP de modo a reproduzir a simplicidade que com o LINQ se efectuam queries - PHPLinq.

No site do Maarten Balliauw encontram alguns exemplos,

// Create data source
$names = array(”John”, “Peter”, “Joe”, “Patrick”, “Donald”, “Eric”);
// Query
$result = from(’$name’)->in($names)
->where(’$name => strlen($name) < 5′)
->select(’$name’);

 (source: Maarten Balliauw)
e aqui poderão descarregar o package e começar já a evitar os ciclos nos algoritmos de queries.




Mar
26

Menu ao estilo do MacOS

Ontem durante uma das minhas aulas surgiu a necessidade de se desenvolver um menu ao estilo do MacOS. Apesar de não ter perdido muito tempo a aperfeiçoá-lo, o resultado final ficou engraçado, pelo que partilho o código fonte convosco. Antes de mais, o resultado final:

Experimentem a clicar nos ícones. O menu pode ser usado tanto no Flash CS3 como no Flex.

Para usarem o menu nos vossos projectos, basta que:

  1. Coloquem na pasta do vosso projecto o ficheiro MacMenu.as;
  2. Coloquem no stage os ícones que pretendem que façam parte do menu. Tenham o cuidado de centrar as imagens no ponto 0,0 por causa do zoom;
  3. Façam o seguinte código:
var listaDeIcones:Array=[m1, m2, m3, m4, m5, m6];

var menu:MacMenu = new MacMenu(listaDeIcones);

addChild(menu); // Por causa do enterFrame. Preferia evitar esta solução, mas por agora…

Onde m1, m2, m3, etc, são o nome das instâncias dos vossos ícones.

O menu possui três parâmetros de configuração:

  • ratio: define a distância de reacção ao rato. Quanto menor o número, mais próximo precisa o rato de estar para que os ícones reajam. Exemplo: menu.ratio= 130;
  • escala_maxima: define o zoom máximo que os ícones terão. Exemplo: menu.escala_maxima=1.2;
  • escala_minima: define o zoom mínimo que os ícones terão. Exemplo: menu.escala_minima=0.5;

Decidi separar o código de reacção aos cliques retirando-o da classe MacMenu, isto porque podem querer criar as vossas próprias reacções aos cliques. Se no entanto quiserem usar as do exemplo acima (no clique, o ícone fica com um brilho e começa aos saltos), precisarão da classe GlowReactor e da pasta caurina:

  1. Copiar para o vosso projecto a pasta caurina;
  2. Copiar para o vosso projecto o ficheiro GlowReactor.as;
  3. Fazer o seguinte código:
new GlowReactor(listaDeIcones);

Algumas das práticas usadas no exemplo são discutíveis, mas recordem-se que foi feito em meia hora com fins educativos. Ainda assim, espero que vos agrade e seja útil.

O código fonte pode ser descarregado daqui.

top