segunda-feira, 12 de novembro de 2007

Granite DS + Adobe Flex Builder

eis a grande questão... comecei semana passada a estudar o uso do Granite DS que me possibilita o uso do protocolo AMF3 para comunicação entre Client & Server...

* a problemática: legal, peguei os exemplos do Granite DS, os .war neles contidos, coloquei no Tomcat e funcionou... dai me veio a questão... como faço para usar isso em um projeto usando o Flex Builder?

* o que usei? segue o que usei nesse meu teste:
- Java 1.5
- Eclipse 3.2 + WTP 2.0 + Adobe Flex Builder Plugin
- Tomcat 5.5.20
- OC4J 10.1.3.20 (servidor de app da Oracle usado como servidor de teste de deploy do projeto)
- graniteds-pojo-0.4.0 (como base para o projeto server side)

* criando projeto para o server side da aplicação
- criar um projeto no Eclipse Dynamic Web Project
- criei um diretório para o projeto com o nome GranitePojoFlex
- após criado o projeto no diretório de nome definido
- copiar os arquivos do graniteds-pojo-0.4.0 para o projeto
> web.xml, códigos, diretórios do WEB-INF
- criei um diretório no /WebContent para o projeto Client Side - Adobe Flex, com nome de flex
- defini nas propriedades do projeto, no item: Web Project Settings, o Context Root para: granitepojoflex

* criando o projeto client side
- criei o projeto no diretório flex citado anteriormente
- o mxml do graniteds-pojo-0.4.0, copiei o conteúdo desse para o arquivo main.xml
- copiei o arquivo /WEB-INF/flex/services-config.xml, para o raíz do projeto
- editei esse arquivo services-config.xml

de:

    <channels>
        <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">
            <endpoint
                uri="http://{server.name}:{server.port}/{context.root}/graniteamf/amf"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>


para:

    <channels>
        <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">
            <endpoint
                uri="http://{server.name}:{server.port}/granitepojoflex/graniteamf/amf"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>


- feito isso é hora de adicionar esse arquivo nos parametros de compilação do projeto, indo nas propriedades, em Flex Compiler, onde adicionei o seguinte: -services "services-config.xml", com isto ira dizer onde está nossos dados...
- ainda é necessário configurar um outro detalhe nas propriedades do projeto, no item Flex Build Path, o item: Output folder URL, para dizer onde executar a aplicação em Flex... e como nesse caso estamos utilizando o tomcat o valor para esse item será: http://localhost:8080/granitepojoflex/flex/bin, o como esse projeto do Flex está dentro do /WebConten/Flex do projeto Server Side, justifica o porque dessa URL

* hora de executar
- primeiro colocar o projeto server side para executar, como não tem nenhum JSP, não irá aparecer nada quando o servidor e a aplicação estiver rodando
- agora hora de executar o projeto Flex, só mandar executar nosso main.mxml...
- lembrando que foi configurado a URL, você irá observar que estará executando em um endereço URL no seu browser

e eis um projeto em Flex Builder + Granite

* fazendo um deploy em um servidor para testar
no caso usei o OC4J, mas antes...
- no projeto Server Side, clique com o botão direito e vá em exportar WAR...
- para facilitar exporte para o Desktop por exemplo
- no OC4J, na parte de administração eu selecionei esse .war gerado e realizei o deploy...
- após iniciado a aplicação eu usei a seguinte URL para acessar e testar: http://localhost:8888/granitepojoflex/flex/bin/main.html, a porta é 8888, pois essa é a padrão do OC4J

segue o projeto Zipado: [link]

Obs.: esse projeto usa a versão modificada do Granite DS, falado nesse [post]

Granite DS, mapeamento flexível

hoje estudando o Granite Data Services, que é uma alternativa OpenSource e gratuita ao LiveCycles da Adobe, acabei encontrando uma informação que julgo eu ser muito útil...

estava vendo o funcionamento do AMFPHP, onde verifiquei que o mapeamento das classes são flexíveis, onde posso ter múltiplas classes mapeadas, enquanto no granite, eu tinha que mapear apenas uma única classe de cada vez... mas segundo a sugestão repassada, tem como deixar o Granite funcionando de forma similar ao AMFPHP, que em tese é mais fácil de reutilizar o mapeamento...

a dica está nesse [link flex-brasil]

onde é sugerido a alteração da classe: org.granite.messaging.service.SimpleServiceFactory.java

para que o Granite possa ser utilizado de forma flexível:

classe original:
package org.granite.messaging.service;

import flex.messaging.messages.RemotingMessage;

import org.granite.config.flex.Destination;
import org.granite.context.GraniteContext;

import java.util.Collections;
import java.util.Map;

/**
 @author Franck WOLFF
 */
public class SimpleServiceFactory extends ServiceFactory {

    @Override
    public ServiceInvoker<?> getServiceInstance(RemotingMessage requestthrows ServiceException {
        String messageType = request.getClass().getName();
        String destinationId = request.getDestination();
        
        GraniteContext context = GraniteContext.getCurrentInstance();
        Destination destination = context.getServicesConfig().findDestinationById(messageType, destinationId);
        if (destination == null)
            throw new ServiceException("No matching destination: " + destinationId);
        String scope = (String)destination.getProperties().get("scope");
        
        Map<String, Object> cache = null;
        if (scope == null || "request".equals(scope))
            cache = context.getRequestMap();
        else if ("session".equals(scope))
            cache = context.getSessionMap();
        else if ("application".equals(scope))
            cache = Collections.synchronizedMap(context.getApplicationMap());
        else
            throw new ServiceException("Illegal scope in destination: " + destination);
        
        String key = SimpleServiceInvoker.class.getName() '.' + destination.getId();
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        if (service == null) {
            service = new SimpleServiceInvoker(destination, this);
            cache.put(key, service);
        }
        return service;
    }
}

classe alterada:
package org.granite.messaging.service;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.granite.config.flex.Destination;
import org.granite.context.GraniteContext;

import flex.messaging.messages.RemotingMessage;

/**
 @author Franck WOLFF
 @author Erko Bridee de Almeida Cabrera
 
 * Alterações da classe para possibilitar um mapeamento
 * flexivel para qualquer classe do projeto
 
 * * dica do link:
 * http://br.groups.yahoo.com/group/flex-brasil/message/7933
 * - Graniteds com unico mapeamento de Classe
 
 */
public class SimpleServiceFactory extends ServiceFactory {

    @Override
    public ServiceInvoker<?> getServiceInstance(RemotingMessage requestthrows ServiceException {
        String messageType = request.getClass().getName();
        String destinationId = request.getDestination();
        
        GraniteContext context = GraniteContext.getCurrentInstance();
        Destination destination = context.getServicesConfig().findDestinationById(messageType, destinationId);
        if (destination == null)
            throw new ServiceException("No matching destination: " + destinationId);
        String scope = (String)destination.getProperties().get("scope");
        
        Map<String, Object> cache = null;
        if (scope == null || "request".equals(scope))
            cache = context.getRequestMap();
        else if ("session".equals(scope))
            cache = context.getSessionMap();
        else if ("application".equals(scope))
            cache = Collections.synchronizedMap(context.getApplicationMap());
        else
            throw new ServiceException("Illegal scope in destination: " + destination);
        
        /*************/
        Destination d = destination;
        ifdestination.getProperties().get("source").equals("*") ){
          Map<String, Object> propertiesMap = new HashMap<String, Object>();
          propertiesMap.put("source", request.getSource());
          d = new Destination(destination.getId(),
          destination.getChannelRefs
          (), propertiesMap, destination.getRoles());
        }
        /**************/
        
        /* String key = SimpleServiceInvoker.class.getName() + '.' + destination.getId();
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        if (service == null) {
            service = new SimpleServiceInvoker(destination, this);
            cache.put(key, service);
        } ALTERADO */
        
        String key = SimpleServiceInvoker.class.getName() '.' +
        d.getProperties().get("source")//<--Muda Aqui
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        ifservice == null ) {
          service = new SimpleServiceInvokerd, this )//<--Muda Aqui
          cache.put(key, service);
        }
        
        return service;
    }
}

com isto no projeto do código fonte do GraniteDS, basta usar o build.xml para regerar o .jar do Granite e utilizar este novo jar gerado...

com isto no exemplo do Granite-Pojo, o services-config.xml fica de outra forma:

    <services>
        <service
            id="granite-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="pojo">
                <channels>
                    <channel ref="my-graniteamf"/>
                </channels>
                <properties>
                    <scope>session</scope>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>



e no código mxml, no mx:RemoteObject, você deverá indicar o atributo source, como mostrado abaixo:

    <mx:RemoteObject
        id="srv"
        showBusyCursor="true"
        destination="pojo"
        source="test.pojo.PojoService"/>



feito isto, com um único mapeamento, você poderá acessar n-classes do seu projeto...
melhor, o que achou?

Traduzindo componentes do Adobe Flex

algo muito útil para o pessoal que anda utilizando o Adobe Flex, naturalmente que os componentes do SDK do Flex estão em inglês, mas não tem como traduzir eles não?

bom tem sim e foi isso que o Fábio Vedovelli mostrou em um screencast muito interessante, onde pode ser visto no respectivo [link]

Fonte : Fábio Vedovelli

domingo, 11 de novembro de 2007

Isso sim que é dominó...


Fonte : TechEBlog

Liberado o trailer de lançamendo : Assassin Creed


Fonte : TechEBlog

Capacete do F35


alem de tudo mais diferente nesse projeto, o capacete para o piloto também será diferente dos demais, projetado para auxiliar ao piloto dando uma visão mais detalhada dos dados de voo do caça, além das informações dos alvos...

sem dizer no formato extranho do capacete... me faz lembrar os capacetes em geral da série Gundam....

Fonte : TechEBlog

sexta-feira, 9 de novembro de 2007

30+ razões, de porque os programadores são esquizofrênicos

um artigo excelente e ao mesmo tempo ilário demais =]

A esquizofrenia é uma doença mental grave que se carateriza classicamente por uma colecção de sintomas, entre os quais avultam alterações do pensamento, alucinações (sobretudo auditivas), delírios e embotamento emocional com perda de contacto com a realidade, podendo causar um disfuncionamento social crónico. Wikipedia


alguns itens:

- Deteriorização da higiêne pessoal
Checado

- Depressão
Não eu não tenho isso, mas se encontrar um conjunto de itens da lista que comprovem que tenho esquizofrênia, vou começar a ter depressão.

- Comportamento bizarro
Ficar sentado na frente do computador por mais de 15 horas em um dia, conta como um comportamento bizarro? SIM!

- Declarações irracionais
"Controle ActiveX do IE 'XMLHTTP' e XMLHTTPRequest do padrão da W3C podem ser utilizados para programar AJAX".
Eu não acho que isto seja irracional, mas esquizofrênicos raramente pensam que suas declarações são irracionais...

- Sono excessivo ou inabilidade para dormir
Checado

- Isolamento social, reclusão
Traços básicos de um programador

- Hostilidade inesperada
Tente ficar entre um programador e o computador dele - você irá aprender o verdadeiro significado da palavra hostilidade.

- Deteriorização dos relacionamentos sociais
Qual parte de "programador" você não entendeu?

- Hiperatividade, inatividade, ou alternação entre ambos
Codificar como doido / esperar a compilação. Preciso dizer mais alguma coisa?

- Preocupação extrema com religião ou ocultismo
Antes de pensar nesse tema, lembre-se... Emacs "é" uma religião... vai discutir com um Apple Fanboy para você ver o que lhe acontece...

- Escrever excessivamente coisas sem sentido
O que você pensa que programação é?

- Indiferença
Uma vez que estou no computador, eu realmente não me preocupo, nem ligo para qualquer outra coisa...

- Esquecer as coisas
Uma das principais razões que eu amo meu computador é que posso utiliza-lo para armazenar informações, então eu não preciso guardar na minha cabeça...

- Reações extremas a críticas
Por um acaso você já viu uma revisão de código feito por outra pessoa, principalmente quando esta vai falar o resultado para o programador?
"Como você pode chamar meu código de deselegante?! Morra idiota!"

- Inabilidade de expressar alegria
Inabilidade para expressar alegria é quando os testes falham... ou quando você está trabalhando com o IE (Internet Explorer)...

- Inabilidade de chorar ou excesso de choro
Excesso de choro é um outro sintoma, quando se trabalha com o IE...

- Abuso de drogas ou alcool
Café conta?

- Ficar sem piscar, ou piscar incessantemente
Sério? isso é tão facil...

- Olhar como de um réptil
Isto também... Tente começar a ficar no monitor por mais de 15 horas/dia...

- Rígida teimosia
"VI é o melhor editor e nada do que você falar vai mudar minha opinião"

- Peculiaridade no uso das palavras, ou da estrutura da linguagem
Por um acaso você já viu a conversa de 2 programadores? Esta é a razão por trás do ditado: "Isto é tudo geek para mim". Você já deve ter ouvido "Isto é grego para mim", mas agora este ditado foi atualizado...

Leia o artigo completo : [link] (inglês)

Fonte : DZone

Comédia : Jack Bauer em 1994, era discada...

pensa na situação do Jack Bauer sem toda a tecnologia do seriado, perdido na era das trevas 1994... só vendo hauhauhauhauhau


Fonte : TechEBlog

Game : Trailer : Burnout Paradise

Pense em um jogo que tem tudo para ser animal, caso você goste muito de carros, sem limitações de traçado, uma cidade inteira para você andar, correr, queimar muito pneu... bom essa é a proposta desse game. O jogo será lançado para PS3 e XBox 360, a princípio em 22 de Janeiro de 2008.

segue o trailer :


Fonte : TechEBlog

quinta-feira, 8 de novembro de 2007

Caminhão mais rápido do mundo...


Chamado de "Onda de impacto", este caminhão colorido, dizem que é o mais rápido do mundo, atingindo uma velocidade de 600 km/h, durante um show aéreo. Este caminhão possui 3 turbinas de jato, que lhe proporciona 36 mil HP de potência.


Fonte : TechEBlog

Como fazer : fazer uma pistola laser com Blu-ray

um único comentário, eu que não ia fazer isso, pegar o laser do Blu-ray do PS3 para construir isso ae... eu não fazia não... ahuahuahuah


Fonte : TechEBlog

JAXA : Primeiro vídeo em alta definição da Lua


JAXA (Agência de Exploração Aeroespacial do Japão) libevou o primeiro vídeo em alta definição da superfície da Lua.


Fonte : TechEBlog

Anime : novidade : Gundam 00

aos que curtem anime assim como eu e também gostaram das séries Gundam Seed e Gundam Seed Destiny, agora em outubro (2007), começou uma nova série no Japão do genero, o Gundam 00, pelo que estava observando e me informei sobre essa nova série, digamos que a história deste, basea-se em algo um tanto atual...

tema principal: as fontes de combustíveis fósseis acabando, quando foi descoberto uma nova fonte de energia... [continue lendo sobre] (inglês)

segue:

Trailer


Abertura

bom uma boa notícia, os 5 primeiros episódios da série já podem ser encontrados no veoh.com, a ruim é que não tem legenda é japonês... se você é um(a) anime maniaco(a) vai entender um pouco de japonês ;)

Episódios: #1 #2 #3 #4 #5 #6

e pelo que já conferi, recomendo, muito boa essa nova série =D

Site oficial : inglês | japonês

quarta-feira, 7 de novembro de 2007

Theo Jansen : A arte de criar criaturas

realmente tem pessoas que são verdadeiros gênios da atualidade, como é o caso do Theo Jansen, que criou criaturas muito interessantes, algumas que se movem por si só, usando como fonte de energia o vento, por exemplo, alem de terem alguns sensores, como para detectar a agua, para não entrarem no mar...

Flex2/ActionScript 3 - Transformando objetos em XML

agora pouco, um amigo me notificou sobre um post muito interessante e útil no blog do Urubatan, onde ele publicou um código muito útil, que transforma um objeto do AS3, para um XML, de forma muito simples

Urubatan - Flex2/ActionScript 3 - Transformando objetos em XML

iPhone : lista de coisas que os usuários gostariam, mas provavelmente não terão


Fonte : Gizmodo

Automaziando um petshop...

esse pensamento de automatização, falar o que não? como lavar mais cachorros em menos tempo? bom acho que tem um pessoal com uma proposta para exatamente isso...


Fonte : TechEBlog

terça-feira, 6 de novembro de 2007

O drama do leite










Fonte : recebido por email, de uns amigos

Curiosidade : Bobina de Testa : música Mario Bros

criatividade ou falta do que fazer? responda você... mas que o resultado foi interessante isso foi =D


Fonte : Gizmodo

Adobe Flex : Geoprocessamento

olhando os posts do Igor Costa, vi sobre uma aplicação implementada em Flex, muito interessante, que informa as aeronaves/aviões em voo ao redor do mundo, mostrando sua respectiva posição e quando colocado o ponteiro do mouse em cima do símbolo que representa o avião, é exibido a rota do mesmo


Cayri

Fonte : Igor Costa