logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Dez 27

Flex com PHP usando ZendAMF – Zend_Db

Escrito por Leonardo França em .NET, 1, 2.0, 2009, 4, abas, action, Actionscript, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, amfphp, AR, Artigo, Banco de Dados, C#, catch, class, classe, classes, dados, email, exemplo, filter, Flex, framework, function, Google, handle, html, if, image, int, Java, lista, live, mg, mysql, O, on, Password, PHP, pt, Ria’s Geral, S+S, server, site, TAT, Tema, try, UI, uint, update, Ved, zend, Zend Amf, zendAMF, zendFramework @ 12 27th, 2011 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O artigo Adobe Flex com PHP usando ZendAMF – primeiros passos teve como objetivo exemplificar a integração do Flex com PHP para quem já tinha sistemas desenvolvidos usando o AMFPHP, por isso não usei as classes para acesso a banco de dados do ZendFramework. Neste artigo mostrarei o mesmo exemplo mas usando exclusivamente ZendFramework.

Pegarei o mesmo exemplo utilizado no artigo anterior, só modificando a classe PHP para usar as classes de abstração de banco de dados do ZendFramework. Começaremos com nosso gateway.php

PLAIN TEXT
PHP:

  1. require_once ‘Zend/Config.php’;
  2. require_once ‘Zend/Db.php’;
  3. require_once ‘Zend/Amf/Server.php’;
  4. require_once ‘Zend/Amf/Exception.php’;
  5. require_once ‘Zend/Amf/Server.php’;
  6. $server = new Zend_Amf_Server();
  7. $server->setProduction(false);
  8. $server->setClass(‘Contato’);
  9. echo($server->handle());
  10. ?>

Executando o link no seu navegador, deve aparecer a seguinte mensagem:

Zend Amf Endpoint

Em seguida, modificaremos em nossa classe principal, que efetuará as operações de listar, inserir, apagar e atualizar os dados do nosso banco:

PLAIN TEXT
PHP:

  1. /*
  2. * author Leonardo França
  3. * site http://www.leonardofranca.com.br
  4. */
  5. class Contatos
  6. private $db;
  7. private $config;
  8. private $select;
  9. private $stmt;
  10. function __construct()
  11. $params['host'] = ‘localhost’;
  12. $params['dbname'] = ‘java’;
  13. $params['username'] = ‘root’;
  14. $params['password'] = ”;
  15. $database['adapter'] = ‘Mysqli’;
  16. $database['params'] = $params;
  17. $data['database'] = $database;
  18. $this->config = new Zend_Config($data);
  19. $this->db = Zend_Db::factory($this->config->database);
  20. public function getData()
  21. try
  22. $this->select = $this->db->select();
  23. $this->select->from(‘tabela’,array(‘id’,‘nome’,‘email’));
  24. $this->stmt = $this->select->query();
  25. $result = $this->stmt->fetchAll();
  26. return $result;
  27. catch (Exception $e)
  28. throw new Exception($e->getMessage());
  29. }
  30. public function insertData($data=array())
  31. try
  32. $dados = array(
  33. ‘nome’ => $data['nome'],
  34. ‘email’ => $data['email']
  35. );
  36. $retorno = $this->db->insert(‘tabela’, $dados);
  37. return $retorno;
  38. catch (Exception $e)
  39. throw new Exception($e->getMessage());
  40. }
  41. public function deleteData($data=array())
  42. try
  43. $retorno = $this->db->delete(‘tabela’, ‘id = ‘.$data['id']);
  44. return $retorno;
  45. catch (Exception $e)
  46. throw new Exception($e->getMessage());
  47. }
  48. public function updateData($data=array())
  49. try
  50. $dados = array(
  51. ‘nome’ => $data['nome'],
  52. ‘email’ => $data['email']
  53. );
  54. $where['id = ?'] = $data['id '];
  55. return $this->db->update(‘tabela’, $dados, $where);
  56. catch (Exception $e)
  57. throw new Exception($e->getMessage());
  58. }
  59. }
  60. ?>

No ActionScript só precisaremos mudar o que será passado para o PHP, ao inves de VOs, mandaremos Arrays:

PLAIN TEXT
ACTIONSCRIPT3:

  1. public function insertData():void
  2. var contatosVO:Array = [];
  3. contatosVO['nome']= input_nome.text;
  4. contatosVO['email'] = input_email.text;
  5. ro.insertData(contatosVO);

Referências:
http://framework.zend.com/manual/en/zend.db.adapter.html

Dez 18

Recomendação de Produtos em eCommerce

Escrito por Igor Musardo em .NET, 1, 2.0, 4, 6, action, analytics, AR, arte, Behavior, BI, blog, C#, carregar, class, cliente, consultoria, Destaque, Dica, Dicas, DRE, e-commerce, filter, filtra, fonte, for, Google, ide, IE, if, image, int, internet, layout, lista, Livro, Livros, Mercado, mg, NaN, O, on, procura, produto, pt, RIA, Ria’s Geral, S+S, site, Software, tag, TAT, Tema, Teste, UI, Vídeo, Vídeos, web, XP, zend @ 12 18th, 2011 | via http://www.igormusardo.com.br | Sem comentários
Igor Musardo
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Sistemas de Recomenda??o procuram recomendar informa??o e produtos (como computadores, m?quinas fotogr?ficas, filmes, videos, m?sicas, livros, p?ginas de internet, etc.) que possam ser de interesse do usu?rio, esses sistemas procuram e identificam padr?es de interesse, perfil e consumo. A partir desses padr?es os sistemas de intelig?ncia artificial geram associa??es entre produtos e consumidores aplicando t?cnicas de filtragem colaborativa.

Com a ajuda dos sistemas de recomenda??o as vendas pela internet podem se aproximar do conceito criado por Jeff Bezos, presidente da Amazon, de “uma loja por cliente”. Pensar no usu?rio ? fundamental para manter-se num mercado t?o competitivo como a internet. N?o ? ? toa que a Amazon ? um dos e-commerce mais bem sucedidas da hist?ria.

Sistemas de Recomenda??o processam as informa??es que o usu?rio d? ao site durante a navega??o e entregam dicas de produtos relacionados aos gostos e interesses do consumidor, fazendo parte dos sistemas de Behavioral Targeting, ou Marketing Comportamental.

Por?m s? a utiliza??o de Intelig?ncia Artificial, Filtragem Colaborativa e outras t?cnicas computacionais n?o garantem o aumento de convers?o, pois o consumidor precisa impactado de maneira positiva pelas recomenda??es, a seguir voc? encontrar? dicas e melhores pr?ticas de como direcionar o usu?rio-consumidor para uma melhor compra.

Elementos de uma vitrine

T?tulo

  1. Utilize cores diferenciadas do layout do site;
  2. Utilize n?meros: “60% das pessoas” constroi um fator de confian?a na cabe?a do consumidor.

Cores

  1. Utilize cores contrastantes que d?em destaque para a se??o de recomenda??o. Cuidado para n?o sobrecarregar, a se??o deve parecer como um an?ncio.

Produtos

  1. Oferece sempre poucas op??es. Apenas 3 ou 4 recomenda??es s?o suficientes.

Chamada para a??o (Call-to-action)

  1. Se voc? utilizar mais de uma chamada pra a??o, tenha uma como principal com maior destaque dentro da se??o de recomenda??o.

Melhores pr?ticas

Confira as melhores pr?ticas para conseguir um maior ?ndice de convers?o de suas vitrines de recomenda??o.

Menos sempre ? mais

Mostrando poucas recomenda??es, torna a decis?o do consumidor mais f?cil. Um bom n?mero de produtos na lista ? 3 ou 4, n?o fa?a uma lista grande. Tornar? a escolha muito mais dif?cil pelo internauta.

Tente o UpSell, pelo menos o Cross Sell

O prop?sito de fazer recomenda??es ? para aumentar o valor do pedido e/ou fazer a venda mostrando melhores op??es por um pre?o pr?ximo do produto visualizado.

Exclua Recomenda??es

Voc? n?o deve recomendar produtos antigos quando algu?m est? tentando comprar a ?ltima vers?o do mesmo produto. Seja mais criativo e venda mais.

Descontos funcionam

Ofere?a pacotes de produtos com descontes. Seus consumidores prezam pelo dinheiro. Com um lucro menor em alguns produtos, mas o valor de pedido maior garante uma boa margem.

Senso de urg?ncia

Quando oferecer um desconto ou valor especial, tire vantagem disso criando urg?ncia, dando um prazo curto para o consumidor efetuar a compra. Isso ir? aumentar os cliques e as convers?es.

Continue testando

Como garantir que essas pr?ticas funcionar?o e continuar?o funcionando em seu neg?cio? Continue testando permanentemente. Teste Chamadas para a??o, T?tulos, Cores, etc. Utilize softwares de testes gratu?tos como o Google Website Optimizer.

Sua loja utiliza sistemas de recomenda??es de produtos?

Sim? Compartilhe nos coment?rios quais as experi?ncias e resultados obtidos com suas vitrines.
Caso seu eCommerce n?o utilize, entre em contato comigo.
Fontes
Webinsider
Wikipedia
LiftSuggest

Dez 13

[Android] Instalando a MIUI ROM no Motorola Milestone 2

Escrito por Erko Bridee em 1, 2.0, 2009, 3.5, 3g, 4, 6, action, Adobe, Adobe Air, Air, Android, api, Aplicativos, app, AR, back, bar, BI, blog, break, C#, cache, class, Curso, custom, dados, demo, Desenvolvimento, developer, Dica, Dicas, Download, err, fonte, for, game, Google, html, ide, IE, if, image, int, iphone, jandersonfc, Links, lista, lite, loop, Mac, menu, mg, NaN, O, on, oop, PHP, problema, processo, prova, pt, RIA, Ria’s Geral, RoR, S+S, site, TAT, Touch, Tutoriais, Tutorial, tv, Twitter, UI, update, window, windows, zend @ 12 13th, 2011 | via http://blog.erkobridee.com | Sem comentários
Erko Bridee
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Depois de ver o Motorola Milestone 1 do @jandersonfc e do @horochovec rodando a MIUI ROM (Android) e ver que os respectivos aparelhos estavam impressionantemente r?pido, resolvi enfim entrar na onda e atualizar meu Motorola Milestone 2 para a MIUI ROM. Instalei (12/12/2011) a vers?o MIUI-1.12.02 a qual utilizar a vers?o Android 2.3.7 como base.

Site Oficial (vers?o em Ingl?s)

Para atualizar meu Motorola Milestone 2 para a MIUI ROM, tentei seguir o tutorial indicado pelo @plcosta, neste [link], mas confesso que depois de 3 tentativas frustradas desanimei, ent?o pedi uma ajuda para o @horochovec, para usar voltar a ROM original do Milestone 2 e recome?ar o processo de atualiza??o do zero. Finalmente tivemos a id?ia de olhar um tutorial de instala??o do CyanogenMod para o Milestone 2 [link], em resumo bastou seguir os passos indicados necesse tutorial que consegui realizar a instala??o da MIUI ROM no meu Milestone 2.

Realizei uma mescla dos 2 tutoriais para realizar a instala??o…

O que posso dizer, agora que estou usando a MIUI ROM?

Recomendo, quem instalar vai gostar muito.

Quer instalar a MIUI ROM tamb?m?

Caso queira mesmo, a seguir segue algumas instru??es conforme realizei a instala??o.

Aten??o: ? necess?rio lembrar que esse procedimento ? por sua conta e risco.

Obs.: com um pouco de aten??o, voc? tamb?m vai conseguir instalar a MIUI ROM no seu Milestone sem fazer nenhuma besteira.

Voc? tem o Motorola Milestone 1?

Mesmo n?o sendo o meu objetivo aqui, o @horochovec j? vez um [post] no blog dele que descreve os passos para a instala??o. (Sinceramente a instala??o no Milestone 1 me parece bem mais f?cil e r?pida que no Milestone 2 hehe)

N?o est? afim de apanhar como eu na instala??o no seu Milestone 2?

A seguir irei listar o passo a passo que realizei.

Obs.: no meu caso eu utilizo um Mac, ent?o tenha acess?vel um computador com Windows para te facilitar a vida. Se algo der errado n?o se desespere, ? s? voltar a ROM original do aparelho e recome?ar o procedimento para instala??o da nova ROM, para voltar esta ROM original ? que ser? necess?rio o Windows.

O que voc? vai precisar para realizar a instala??o da MIUI ROM

- Gingerbreak – para rootear o celular

- UPDATE_1.12.02_0.zip – MIUI ROM que utilizei e instalei no meu Milestone 2

- Bootmenu v0.8.6-v2.zip – arquivo do menu do boot para voc? conseguir selecionar e instalar a MIUI ROM

- Bootstrap – Droid 2 Bootstrap (Android Market) – necess?rio para acessar o bootmenu

- Rsd Lite – Aplicativo da Motorola para instalar SBF, serve para atualizar o Bootloader do aparelho e caso precise voltar a ROM original do aparelho, voc? ir? utilizar este aplicativo para realizar a tarefa. Lembrando que este aplicativo ? exclusivo e s? possui vers?o para MS. Windows.

Aten??o: sempre que voc? for executar o Rsd Lite para instalar uma SBF, tenho o m?ximo de cuidado, o procedimento deve ser executado e conclu?do 100%, este ? o ?nico procedimento que pode causar a perda irrevers?vel do aparelho.

- SBFs : Bootloader 70.13 e Vers?o original da ROM do Milestone 2 ( vers?o 2.2 Brazil, a primeira linha )

Tenha esses arquivos listados acima no seu computador, para facilitar sua vida =]

Procedimento para instalar a MIUI ROM no Motorola Milestone 2

Caso voc? queira ser cautelos@ e realizar um backup do seu celular, veja este [ link 1 - ROM original | 2 - aplicativos e dados ]. Eu particularmente n?o vi utilidade pr?tica nisto, pois ? tudo ou nada, queria a nova ROM no meu aparelho hehe.

Lembrando que os passos descritos a seguir foram os que eu utilizei na instala??o…

Sempre que for executar esse procedimento, fa?a com a bateria carregada.

Passos:

1 - Copie os arquivos: Gingerbreak.apk, UPDATE_1.12.01_0.zip, Bootmenu v0.8.6-v2.zip para o SD Card do aparelho

1.1 - Caso voc? tenha feito o download do Bootstrap.apk, copie este arquivo tamb?m para o SD Card

2 - Renomeie o arquivo UPDATE_1.12.01_0.zip para update.zip, este procedimento ? para facilitar o processo de instala??o.

3 - Verifique no aparelho, nas configura??es do Android a op??o Aplica??es(Programas) submenu, Desenvolvimento se as op??es, Fontes desconhecidas e Depura??o USB est?o ativas.

4 - Atrav?s do Gerenciador de arquivos localize o arquivo Gingerbreak.apk clique sobre ele e instale. Fa?a o mesmo para o Bootstrap, caso voc? tenha este.

4.1 – Caso tenha optado em n?o baixar este, acesse o Market do Android e instale por l? (Droid 2 Bootstrapper).

4.2 - Execute o aplicativo Gingerbreak, pois ? necess?rio rootear o aparelho para continuar a instala??o. A execu??o desse aplicativo ir? reinicar o aparelho, n?o se preocupe.

5 - Execute o Droid 2 Bootstrapper, neste aplicativo clique:

5.1 - Bootstrap Recovery

5.2 - Reboot Recovery

6 - Seu aparelho ser? reiniciado e exibir? um menu (em verde) com algumas op??es, onde o bot?o (+) do volume sobre, o (-) desce e o bot?o de tirar foto representa (ok/enter)

6.1 - Selecione: “install zip from sdcrad”

6.2 - Localize e selecione o arquivo: Bootmenu v0.8.6-v2.zip e (ok)

6.3 - Ap?s a instala??o, selecione a op??o do menu: “GO Back” (ok)

6.4 - Selecione a op??o: “Reboot System now” (ok)

7 - Seu aparelho ser? reiniciado novamente e exibir? um menu (azul), onde neste os comando para (ok/enter) ? o bot?o onde voc? liga o aparelho (power)

7.1 - Selecione: “Boot” (power)

7.2 - Selecione: “Set default: [boot Menu]“ (power)

7.3 - Selecione: “nomal” (power)

7.4 - Selecione: “Go Back” (power) 2x

7.5 - Selecione: “Recovery” (power)

7.6 - Selecione: “Custom Recovery” (power)

8 - Voc? ver? novas op??es no menu e uma imagem Android BootMenu, neste menu o comando para (ok/enter) ? o bot?o onde voc? liga o aparelho (power)

8.1 - Selecione: “Wipe data/Factory Reset” (power) Nesta op??o todos as informa??es na mem?ria embarcada do aparelho ser?o limpas.

8.2 - Selecione: “advanced” (power)

8.2.1 - Selecione: “Wipe Dalvik Cache” (power)

8.2.2 - Selecione: “Wipe Baterry Stats” (power)

8.2.3 - Volte ao menu anterior

8.3 - Necess?rio repetir o passo 8.1 - Selecione: “Wipe data/Factory Reset” (power)

8.4 - Selecione: “Apply update from sdcard” (power)

8.5 - Ap?s finalizar a instala??o, selecione a op??o: “reboot system now”

9 - Seu aparelho ir? iniciar e exibir o s?mbolo da motorola em vermelho, diferente a ROM default do MotoBlur, nesta etapa ? aguardar e esperar a MIUI ROM ser carregada. (Demorou uns 3 minutos ou 5 minutos at? entrar pela primeira vez)

Estou esperando a um bom tempo e n?o entrou, o que eu fa?o?

Bom caso voc? esteja em desespero vendo seu celular em um loop infinto, dizendo que est? carregando o Android e at? agora nada. N?o se desespere, eu passei por isso 3 vezes at? conseguir instalar a MIUI ROM.

Mantenha a calma.

Nessa situa??o voc? vai precisar do Rsd Lite, um computaor MS. Windows.

Como j? havia indicado para fazer download dos arquivos .sbf, neste momento ? que se faz uso deles.

Passos:

1 - Desligue o aparelho

2 - Ligue o aparelho segurando o bot?o power e a ceta para cima do teclado do Milestone 2

3 - Quando observar que a tela ligou, por?m est? preta, solte os bot?es

Aten??o: m?ximo cuidado nesse momento, mantenha o cabo USB sempre conectado, nunca pare o procedimento, esta etapa ? cr?tica e pode danificar o seu aparelho caso n?o seja executada corretamente.

4 - Verifique e certifique-se de que a vers?o do Bootloader ? a 70.13 (caso voc? nunca instalou nenhuma ROM deve ser)

4.1 - Caso n?o for a vers?o indicada, plugue o cabo usb no celular e no computador e na aplica??o Rsd Lite, selecione o arquivo .sbf referente ao bootloader, depois desligue e ligue novamente para acessar o bootloader.

4.2 - Estando na vers?o correta e com o aparelho ligado via usb, utilizando o Rsd Lite, selecione o arquivo .sbf referente a ROM original do aparelho.

5 - Terminando a instala??o, mantenha o aparelho conectado no computador at? o Android ser carregado totalmente, somente depois disso voc? poder? desconectar o cabo usb.

6 - Voc? est? com seu aparelho de volta ao estado de quando voc? comprou e tirou ele da caixa.

7 - Provavelmente voc? ter? que logar no MotoBlur, execute o seu login at? que acesse totalmente ao Android.

8 - Voltei ao passo 1 do procedimento de instala??o da ROM.

Aeee, acessou a tela da MIUI, ufa… hora de fazer o ajuste fino

Voc? perceber? que estar? com a MIUI em Ingl?s, mas isto n?o ? um problema, basta alterar o idioma para portugu?s.

- Altera o idioma para Portugu?s (Brasileiro) [link]

- A ilumina??o do teclado n?o vem habilitada inicialmente, para arrumar isto, veja este [link]

- Calibrar a bateria do aparelho para um melhor rendimento [link]

- A MIUI n?o vem com um teclado Swype, ent?o instalei: TouchPal Keyboard e o dicion?rio para Portugu?s Brasileiro

Um grande vil?o do consumo de bateria ? o 3G no aparelho que fica ativo 100% do tempo desde que este esteja habilitado, para resolver isso instalei o aplicativo APN Brasil Pro (Android Market), que possui um recurso que melhora o gerenciamento do 3G e ajuda consideravelmente a aumentar o tempo de vida da bateria do aparelho.

Deixo registrado aqui meus agredimentos a galera que me ajudou com dicas e links e informo que esses passos que descrevi foi uma mescla dos posts:

- @ajudandroid – MIUI VERS?O 1.11.18 “ATUALIZADA PARA VERS?O 1.12.02 04/12/2011

- Clube do Android – CyanogenMod 7 Android 2.3.5 para Milestone 2


Veja também:

  • Google Nexus Two
  • [ Adobe AIR ] Package Assistant Pro
  • Adobe AIR – Empacotador para iPhone OS + demos
  • [Android Game] Angry Birds : acessando níveis travados
  • Segundo comercial DROID da Verizon : stealth ataca EUA
Dez 6

JodaTime – Java Date que funciona!

Escrito por DClick Team em .NET, 1, 2.0, 4, 6, api, AR, bar, BI, blog, C#, camp, class, classe, classes, código, control, Curso, Cursos, Design, Design Pattern, Diversos, Documentação, efeito, err, exemplo, Exemplos, falha, for, Google, Hibernate, html, ide, IE, if, image, int, interface, internet, Java, lógica, map, mg, O, on, online, Opinião, padrão, pattern, print, problema, RIA, Ria’s Geral, S+S, Sem categoria, singleton, string, Sun, TAT, Tema, Teste, try, Twitter, UI, uint, Vários, XP, zend @ 12 6th, 2011 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Twitter!


JodaTime



Não existe segredo quando se fala da implementação de datas no Java: é ruim de usar. Alguns chegam a dizer que é errado usar inclusive, mas não serei tão extremo.
A API de datas do Java é ruim por vários motivos, como por exemplo, é mal documentada, não é Thread Safe, é difícil de manipular datas, e o comportamento nem sempre é o esperado.
Vamos ver como susbtituir a API de datas que vem Out of the Box no Java, por uma mais efetiva, amigável e confiável: JodaTime.


Lembrando do Calendar



Todo programador Java conhece o Calendar, e sabe que para usá-lo, basta seguir o Design Pattern singleton, ou seja, basta chamar o método de classe em Calendar que devolve a instância única do sistema para o Calendar.


Problema: não funciona.


Não funciona porque se a instância é singleton, e não utiliza threadlocking no código, então não é uma instância ThreadSafe. Logo toda vez que chamamos o getInstance() do Calendar, obtemos uma nova instância. Para ilustrar, crie um teste em JUnit 4 com o seguinte código:

1
2
3
4
5
6
7
Calendar calendar = Calendar.getInstance();

System.out.println(calendar.getTime());

Calendar calendar2 = Calendar.getInstance();

Assert.assertTrue(calendar == calendar2);



Rode o teste e veja a barra do JUnit ficar vermelha. O comparador ‘==’ usado em objetos, compara pelo endereço de memória, o que deveria ser o mesmo se fosse seguido o padrão singleton de verdade.
Pra piorar, todos os métodos que alteram as intâncias do Date estão expostos (por mais que estejam depreciados) para mantêr compatibilidade com versões anteriores da VM. Portanto o Date também não é ThreadSafe, pois não existe controle de concorrência em sua implementação.
Agora vamos deixar o Date e o Calendar de lado, e vamos ao JodaTime.

DateTime



O JodaTime diferencia muito bem os conceitos de data, instante de tempo, período, etc. A classe mais básica (interface no caso) é a ReadableInstant. Não precisa dizer que todas as modelagens de data implementam essa interface, permitindo comparar todos os tipos de modelagem de tempo pontuais. Um período não descreve um único instante ou ponto no tempo, por exemplo.
DateTime é talvez o ReadableInstant mais conhecido, e funciona muito parecido com o Date do Java.
Fatores que tornam o DateTime mais amigável são: é ThreadSafe pois é imutável, é muito bem documentado, e é muto fácil realizar operações com data. Vamos escrever um pouco de código para entender o que se passa.
Comece criando um DateTime. Como no Java, este DateTime criado possui o instante atual do sistema. Em seguida para efeito de teste (o teste pode falhar dependendo de quando for executado), adicione um dia na data criada, e verifique que o novo date aponta para amanhã:

1
2
3
4
5
DateTime date = new DateTime();

date = date.plusDays(1);

Assert.assertEquals(new DateTime().getDayOfYear() + 1, date.getDayOfYear());



Repare que tive que reassociar o date para que ele pudesse ser alterado, afinal DateTime é imutável, o mesmo comportamento que o BinInteger possui. Repare também que pra adicionar um dia, basta chamar plusDays. Este método já se encarrega de fazer toda a lógica de adicionar um dia na data, como por exemplo mudar o mês ou ano se for preciso, por isso se esse teste for rodado no dia 31 de dezembro, ele irá falhar pois o DateTime irá adicionar mais um dia a data, e perceberá que se trata do ano seguinte, e portanto getDayOfYear irá devolver ’1′, e não ’366′ ou ’365′ como esperado.
O JodaTime também trata anos bissestos e horário de verão se for selecionado o fuzo correto.
Existe uma API bem completa em DateTime para manipular todos os campos possíveis da data, sendo assim fica muito mais fácil iterar ao longo dos dias, sem precisar delegar pro Calendar a tarefa, e depois recuperar o resultado.
Não vou abordar muito da API do JodaTime, pois está muito bem documentada e existem muitos exemplos nas internet. O objetivo desse post é tratar do assunto do próximo tópico.

JodaTime e Hibernate



Pior que manipular datas, é persistir datas. Cada banco persiste data do seu próprio jeito, e cada implementação de ORM trata o Date do seu próprio jeito. Mas se você está utilizando o Hibernate, o JodaTime tem uma solução de padronização pra você: JodaTime Hibernate.
Com o JodaTime Hibernate é possível mapear diversos tipos de representação de data em suas classes Java, com ou sem TimeZone, como String ou bigint, como período ou duração, etc.
Para se ter uma idéia do que é possível, basta verificar a documentação online.
E para utiliza é muito fácil. Imagine que você tenha uma entidade com um campo DateTime, que se chama entryDate, portanto temos o getter:

1
2
3
4
@Column(nullable = false)
public DateTime getEntryDate()
return entryDate;



Para tornar este DateTime uma data que é padrão do banco que será utilizado, por exemplo, basta adicionar a seguinte anotação:

1
2
3
4
5
@Column(nullable = false)
@Type(type = “org.joda.time.contrib.hibernate.PersistentDateTime”)
public DateTime getEntryDate()
return entryDate;



Estamos falando para o hibernate utilzar o tipo de coluna descrito pelo PersistentDateTime, e utilizar o mesmo para converter a data novamente para DateTime quando for recuperado.
Caso você esteja fazendo engenharia reversa de algum banco, recomendo ler a descrição de todos os tipo disponíveis pra fazer a melhor escolha.
Com isso conseguimos obter todos os benefícios do JodaTime em nossas entidades, facilitando controlar as datas no domínio de nossas aplicações.


Espero ter despertado sua curiosidade com o JodaTime. Na minha opinião é uma das melhores bibliotecas Java disponíveis, mas não quero falar muito sobre suas funcionalidades, pois um dos pontos mais fortes da biblioteca é a facilidade de se acostumar com ela, e principalmente utilizar todos seus recursos. Quero que vocês tenham um pouco desse gostinho :) .

Por @Gust4v0_H4xx0r

Dez 3

O que é Behavioral Targeting?

Escrito por Igor Musardo em .NET, 1, 2.0, 6, AR, Banco de Dados, Behavior, BI, busca, C#, camp, campanha, class, consultoria, dados, demo, err, Ferramenta, for, ide, IE, if, image, int, internet, Mercado, mg, novidade, O, on, online, player, portal, processo, procura, produto, pt, RIA, Ria’s Geral, S+S, Sun, tag, TAT, UI, web, XP, zend @ 12 3rd, 2011 | via http://www.igormusardo.com.br | Sem comentários
Igor Musardo
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O in?cio

O conceito de segmenta??o comportamental, conhecido como Behavioral Targeting (BT), surgiu nos Estados Unidos dentre os profissionais de marketing direto como uma estrat?gia dirigida a conquistar uma parcela maior de vendas dentro um subgrupo espec?fico, ao inv?s de buscar uma participa??o mais limitada de compras por usu?rios de todas as categorias.

Em seguida surgiram as primeiras estrat?gias de Behavioral Targeting na internet, mas a imaturidade do mercado fez com que o assunto ficasse esquecido.

Atualmente a necessidade crescente de otimizar esfor?os de m?dia, aumentar o ROI de campanhas e a lealdade do consumidor est?o estimulando o crescimento de a??es dentro do Behavioral Targeting, que hoje j? ? um grande diferencial para portais e anunciantes, mas pouco explorado pelas lojas virtuais.

Mas afinal, o que ? segmenta??o “comportamental”?

Segmenta??o comportalmental n?o diz respeito ? aquela segmenta??o por regi?o, por perfil preenchido em cadastros, ou por IP, etc. O diferencial est? no foco dado aos h?bitos de navega??o e consumo dos usu?rios. Essa ? a novidade!

N?o h? invas?o de privacidade nesse tipo de estrat?gia. Muito pelo contr?rio. Os usu?rios deixam “rastros” ao navegar na web. Essas informa??es captadas geram um banco de dados an?nimo contendo centenas de vari?veis. A intelig?ncia est? na interpreta??o dessas informa??es e no agrupamento dos perfis de acordo com suas similaridades.

Qual ? a vantagem em se utilizar BT em campanhas online?

Individualizar o p?blico-alvo. O simples fato de conhecer previamente as atitudes de um usu?rio permite que o anunciante crie pe?as com linguagem direcionada a ele, demonstrando conhecimento de seus interesses.

Imagine que voc?, como consumidor, est? no processo de escolher um notebook. Compara pre?os, funcionalidades e ainda indeciso. Em algum momento, ao clicar em um portal qualquer para ler uma not?cia, se depara com um banner dizendo “Vai continuar procurando um Notebook a vida inteira? O Ponto Bahia resolveu te dar uma forcinha: 25% de desconto, mas ? s? pra voc?. Compre agora!“.
Essa segmenta??o ? boa para o anunciante, que pode fazer render mais seus investimentos em m?dia online aumentando o ROI, j? que poder? direcionar suas verbas diretamente para o p?blico-alvo, sem dispers?o de dinheiro.
Os ve?culos tamb?m lucram com essa ferramenta, que amplia seu invent?rio publicit?rio e aumenta o interesse na veicula??o em ?reas ainda pouco exploradas.
Como consequ?ncia de exibir an?ncios direcionados para o p?blico alvo, as taxa de cliques de uma campanha aumentam consideravelmente, pois atinge um p?blico realmente interessado no produto.
Essa modalidade de marketing ? muito explorada nos Estados Unidos, mas no Brasil apenas os grandes players de ecommerce utilizam, havendo uma grande oportunidades para os lojistas virtuais de m?dio e pequeno porte.
Sua loja n?o colhe os benef?cios de sugerir produtos utilizando segmenta??o comportamental? Entre em contato comigo.

Nov 16

LCCS e PHP com ZendAMF

Escrito por Leonardo França em .NET, 1, 2.0, 4, Adobe, AMF, amfphp, AR, Artigo, Artigos, C#, catch, class, classe, classes, developer, Documentação, exemplo, Exemplos, flash, Flex, Flex 4, for, framework, function, handle, image, int, Java, Javascript, live, LiveCycle, Mercado, mg, O, on, Password, PHP, player, portal, programação, pt, rest, RIA, Ria’s Geral, S+S, SDK, server, swf, Teste, try, UI, web, zend, zendAMF, zendFramework @ 11 16th, 2011 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O Adobe LiveCycle Collaboration Service possui em seu SDK, exemplos de integração com as principais linguagens de programação web do mercado como PHP, Java, Python, etc.
Na documentação da Adobe, é recomendado o uso do AMFPHP ou o PHP puro mesmo, mas nada impede de usar tranquilamente em conjunto com o ZendFramework (usando ZendAMF)
Ryan Stewart escreveu dois artigos mostrando a implementação com PHP e REST.

  • http://ria.dzone.com/articles/integrating-php-flash
  • http://ria.dzone.com/articles/php-flash-rest

Uma observação sobre o artigo de Ryan, no Flex 4, Adobe passou a usar o swfobject, então o modo de pegar os parâmetros via URL e passar para o SWF fica desse modo:

PLAIN TEXT
JAVASCRIPT:

  1. var xiSwfUrlStr = “playerProductInstall.swf”;
  2. var flashvars = ;
  3. flashvars.roomURL = swfobject.getQueryParamValue(“roomURL”);
  4. flashvars.authToken = swfobject.getQueryParamValue(“authToken”);
  5. var params = ;

No SDK do LCCS, existe um arquivo chamado lccs.php, basta copiar para o mesmo diretório em que você já usa suas classes. Em seguida, adicionar o include no arquivo gateway.php

PLAIN TEXT
PHP:

  1. require_once ‘Zend/Amf/Server.php’;
  2. require_once ‘lccs.php’;
  3. require_once ‘Test.php’;
  4. /** Bootstrap */
  5. // Instantiate server
  6. $server = new Zend_Amf_Server();
  7. $server->setProduction(false);
  8. $server->setClass(‘Test’);
  9. // Handle request
  10. echo($server->handle());
  11. ?>

E está é uma simples classe para teste chamando o método que retorna o token para autenticação.

PLAIN TEXT
PHP:

  1. class Test
  2. private $account;
  3. private $room;
  4. private $devUsername;
  5. private $devPassword;
  6. private $secret;
  7. //$accountURL = “https://collaboration.adobelivecycle.com/$account”;
  8. private $accountURL;
  9. private $roomURL;
  10. function __construct()
  11. //for LCCS
  12. $this->account = “Your SDK account username from LCCS developer portal”;
  13. $this->room = “The room you want to connect to”;
  14. $this->devUsername = “Your LCCS developer account username”;
  15. $this->devPassword = “Your LCCS developer account password”;
  16. $this->secret = “The shared secret from the LCCS developer portal”;
  17. //$accountURL = “https://collaboration.adobelivecycle.com/$account”;
  18. $this->accountURL = “http://connectnow.acrobat.com/$this->account“;
  19. $this->roomURL = “$this->accountURL/$this->room“;
  20. public function getToken($data=array())
  21. try
  22. $this->account = new RTCAccount($this->accountURL);
  23. $this->account->login($this->devUsername,$this->devPassword);
  24. $session = $this->account->getSession($data['room']);
  25. $displayName = $data['displayName'];
  26. $username = $data['username'];
  27. $role = $data['role'];
  28. $token = $session->getAuthenticationToken($this->secret, $displayName, $username, $role);
  29. return $token;
  30. catch (Exception $e)
  31. throw new Exception($e->getMessage());
  32. }
  33. }
  34. ?>
Nov 15

Flex SDK – É chegada uma nova era?

Escrito por Stefan Horochovec em 1, Adobe, AR, C#, comunidade, Flex, Flex 4, html5, ide, if, O, on, Pessoal, Ria’s Geral, S+S, SDK, Tecnologia, UI, zend @ 11 15th, 2011 | via http://www.horochovec.com.br/blog | Sem comentários
Stefan Horochovec
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá pessoal Estou fazendo este post para comentar um pouco sobre esses anúncios sobre a continuação do Flex SDK pela comunidade, como a Adobe nos notificou na sexta-feira, dia 11, através deste post. A algumas décadas (isso mesmo, décadas), nós vemos o surgimento de novas tecnologias com a ideia de substituir as atuais, porque nossas [...]

Nov 11

Minha opinião atual sobre a “Morte do Flash”

Escrito por Erko Bridee em .NET, 1, 2.0, 2009, 3d, 4, 6, action, Adobe, Adobe Air, Air, Ajax, Android, api, AR, Arquitetura, back, BI, blog, Blogs, browser, C#, class, cliente, css, css3, demo, Desenvolvimento, entrevista, err, facebook, Ferramenta, flash, Flash Player, for, game, git, html, html5, ide, IE, image, int, internet, jandersonfc, jandersonfc.com, Java, Javascript, jogo, Jogos, Mercado, mg, mobile, O, on, player, Projetos, prova, pt, Redes Sociais, Revistas, Ria’s Geral, S+S, site, SmartPhone, Sun, Tecnologia, Tema, tendencia, Teste, Twitter, UI, vs, web, zend @ 11 11th, 2011 | via http://blog.erkobridee.com | Sem comentários
Erko Bridee
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Nesses ?ltimos dias a internet est? virada em um caos depois dos boatos e anuncio da “Morte do Flash” (descont?nuo do Flash Player para disposit?vos m?veis, leia-se smartphones e tables Android/RIM), todo um medo gerado pelo combo da not?cia com a demiss?o de 750 funcion?rios da Adobe (EUA e Europa)

Minha real opini?o ? a seguir:

No mais, os projetos continuam, novos desafios est?o surgindo, novas oportunidades de ganhar dinheiro continuam aparecendo constantemente, nada de mimimi, bora usar HTML5, e que tecnologia for…

Roubando a frase do @jandersonfc disse no final desse post: As tend?ncias s?o suas aliadas

“Tecnologia, Ferramentas e metodologia s?o o meio, dinheiro no bolso ? o fim”

Se voc? ainda est? preocupado sobre a tal morte do Flash no mobile, recomendo ler o post: Adobe desiste do Flash Player plug-in para dispositivos m?veis do @igorcosta e reflita no seu texto.

Agora se voc? j? estava jogando a toalha achando que o Flash j? era, se voc? estava fechando o “caix?o”, pode executar um rollback ai, pois ontem (10/11/2011) foi disponibilizado o novo Flash Player 11.1 e AIR 3.1. Tenha em mente que a plataforma Flash ainda ter? um bom tempo de vida. Motivo banal pelo qual n?o ir?o conseguir matar o Flash, digo que talvez esse mundo mobile tenha at? que readerir ao Flash : games, ainda mais agora com o novo suporte a acelera??o gr?fica e a 3D. Outro grande motivo, se “matarem” o Flash Player hoje haver? uma revolta mundial dos jogadores do jogos do Facebook e demais redes sociais, tamb?m sabemos que o HTML5 est? a anos luz de dist?ncia da maturidade e capacidade do Flash Player atual, ent?o o Flash Player n?o morrera.

Algo que eu tenho em mente, quando penso no assunto, eu lembro da mesma agita??o que foi na ?poca do Ajax, no final aqui estamos n?s usando o Flash ao invez do Ajax para desenvolver sistemas robustos. O HTML5 para sites e algumas outras coisas at? que j? tem como utilizar, mas creio que vamos chegar na mesma situa??o que nos deparamos a alguns anos atr?s e recorreremos a algo como o Flash que ? mais robusto para desenvolvimento de sistemas.

Algu?m me diz como ? que eu fa?o uma arquitetura organizada, com pacotes no JavaScript?

Algu?m sabe se existe alguma maneira de trabalhar com IoC no JavaScript?

Fora outras quest?es para as quais n?o tenho resposta de como fazer usando HTML5 + JS + CSS3

Lembrando que a compatibilidade crossbrowser do HTML5 ? um pesadelo [mobile] [web browsers teste] [demos teste]

N?o estou dizendo que sou contra o HTML5, mas hoje ele ainda ? muito imaturo para desenvolver, leia bem: sistemas

E como n?o devemos nos apegar a tecnologia alguma, muito menos rejeitar qualquer outra que o mercado est? aderindo, recomendo o HTML5 Rocks para quem quizer estudar o HTML5.

No mais, n?o se desespere com as not?cias que voc? l? na internet, mas mantenha-se sempre atualizado, pois quem escolhe que tecnologia voc? ir? utilizar no pr?ximo projeto, provavelmente ser? o seu cliente, pedindo se roda no iPad…

Tweet

Veja também:

  • Flash Mobile 10 – Para Outubro de 2009
  • [Canvas vs. Flash] Butterfly 3D (Canvas + JavaScript)
  • Flash Player 10.1 : entrevistas e demos
  • Adobe Flash suporte completo para dispositívos móveis a caminho : agora vai
  • HTC Hero: primeiro dispositivo com Android e Flash
Nov 9

Conhecendo o LESS. The Dynamic Stylesheet.

Escrito por DClick Team em 1, 2.0, 4, 6, Adobe, Air, app, apple, AR, back, BI, browser, C#, class, classe, classes, código, css, css3, Curso, Cursos, custom, dados, demo, Desenvolvedor, Desenvolvimento, Desenvolvimento Web, Design, Destaque, Dica, Diversos, Documentação, dynamic, empresas, err, erro, error, Estilo, exemplo, Exemplos, for, function, gc, Google, html, html5, ide, IE, if, int, Java, Javascript, kit, layout, menu, Microsoft, MIX, NaN, O, on, Opinião, Outros, padrão, problema, problemas, programação, prova, pt, referencia, RIA, Ria’s Geral, RoR, S+S, Sem categoria, site, tag, TAT, Twitter, UI, uint, Utilidades, Ved, web, zend @ 11 9th, 2011 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Twitter!

Como todos devem ter percebido, nos últimos meses o CSS3 e o HTML5 tem ganho um grande destaque no desenvolvimento web. Grandes empresas como o Google, Microsoft, Adobe e Apple estão apoiando fortemente o desenvolvimento web utilizando WebStandards. Caso você já conheça algo sobre CSS, provavelmente deve saber como é complicado a organização desses documentos em um projeto de médio ou grande porte. Dado esses problemas conhecidos, foram surgindo os chamados pré-processadores de CSS, que viabilizam a criação de documentos de estilo, adicionando novas funcionalidades.

Hoje vamos conhecer o LESS, The Dynamic Stylesheet Language. O objetivo dessa biblioteca em javascript é prover uma série de funcionalidades para as, usualmente criadas a mão, folhas de estilos. Recursos tais como, variáveis, mixins (Multiple Inheritance, Traits), mixins parametrizáveis, funções, namespaces, importação, etc. Vamos aprender como utilizar os principais recursos dessa biblioteca em um projeto e como aproveitar o melhor dessa biblioteca para organizar corretamente nossas folhas de estilo.

Variables

As variáveis ajudam-nos a definir valores que podem ser utilizados em diversas regras do nosso CSS. Elas possuem escopo assim como em uma linguagem de programação orientada a objetos, trocando em miúdos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Arquivo stylesheet.less
// Essa variável foi definida no escopo do arquivo, logo, todas as regras do arquivo podem acessar seu valor.
@siteBackgroundColor: #FF3300; // Laranja

h1
// A variável headingColor foi criada no escopo da regra h1, logo, apenas ela e outras regras criadas dentro
// do mesmo escopo tem acesso ao seu valor.
@headingColor: #333333; // Cinza

// Isto significa que, se criarmos uma outra regra chamada &.mainTitle
// Observe o uso do &.classe, isso copia a regra pai e associa uma classe, o output disso seria exatamente h1.mainTitle
&.mainTitle
// Como essa regra esta contida na regra h1, podemos acessar o valor da variável headingColor.
color: @headingColor;

}

h2
// Se tentarmos acessar o valor nessa regra, que não encontra-se contida na regra h1, receberemos um erro da biblioteca
// informando que a variável headingColor não encontra-se definida.
color: @headingColor; // Brrrrrr! Error.

O que é interessante no uso de variáveis é a reutilização e organização. Imagine uma design guideline onde existem RGBs específicos a serem seguidos, essas cores poderiam ser definidas em um documento chamado color_variables.less e adicionados ao nosso arquivo principal utilizando a clausula @import.

@Import – Importando outros arquivos

Quando um arquivo LESS é importado, todas as suas variáveis e mixins são adicionados ao arquivo principal. Os escopos serão mantidos e a extensão .less é opcional.

@import “lib.less”
@import “lib”

É possível utilizar pastas nas clausulas de @import:

@import “where/is/my/stylesheet.less”
@import “where/is/my/stylesheet”

Mixins

No LESS, mixis são como uma espécie de classe CSS que pode ser reutilizada em diversas outras regras. Quando utilizadas, todas as propriedades definidas no mixin são adicionadas a regra onde a mesma foi adicionada, caso um mixin mude, todas as regras que o referenciam serão também modificadas.

Imagine o conceito de mixin como classes CSS orientadas a objeto, o que é interessante do mixin é que temos aqui algo como uma herança múltipla, caso uma mesma instrução seja declarada em mixins diferentes, e esses mixins adicionados a uma regra, o mixin declarado por último terá vantagem na construção final do CSS da regra onde foi adicionado.

1
2
3
4
5
6
7
8
9
10
11
12
.bordered
border-top: dotted 1px black;
border-bottom: solid 2px black;

// Declaramos agora uma regra qualquer que fará uso do nosso mixin.
div.someDiv
.bordered; // Simples assim, adicionamos todas as propriedades contidas no mixin em nossa regra.

div.anotherDiv
.bordered; // A mesmas propriedades serão adicionadas nessa regra.

Quando modificarmos o mixin .bordered, todos os elementos que o estão utilizando serão modificados. Reutilização!
Vamos para um exemplo mais usável para exemplificar como é um mixin parametrizável.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Bordas arredondadas cross-browser.
// Observe que utilizamos algo parecido com uma função de javascript para declararmos nosso mixin.
// A notação de variável deve ser adicionada (@radius), com isso, criamos uma variável chamada “radius” no escopo
// do mixin que poderá ser utilizada apenas internamente pelo método.
// Observe também que declaramos um valor padrão para o parâmetro, de 5px.
.border-radius( @radius: 5px )

// Repare que utilizamos a mesma variável para todas as regras.
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;

// Para utilizarmos a regra, seguimos o mesmo padrão
div.someDiv
.border-radius; // Nesse caso estaremos utilizando o valor padrão de 5px.

div.anotherDiv
.border-radius(10px); // Nessa aplicação, modificamos o valor da propriedade para 10px.

É importante destacar que um mixin pode conter diversos parâmetros. Isso pode ser feito da seguinte forma:

1
2
3
4
5
6
// Declaramos um novo mixin
.border-radius-and-color( @radius: 5px, @borderColor: #000000 )

.border-radius( @radius ); // Observe que aqui reutilizei o mixin previamente definido. Composição de mixins.
border: 2px solid @borderColor; // Adicionamos agora a cor para a borda.

Nested Rules

Com o LESS você pode criar suas regras de CSS utilizando uma espécie de hierarquia. Vamos ver como isso funciona na prática.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Dado o CSS abaixo
div#header #menu
…
rules

div#header #menu li a
…
more rules

div#header #topNav
…
another rules

Com o LESS, o mesmo CSS acima poderia ser escrito da seguinte forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Como utilizar hierarquia com Less
div#header
#menu
ul
li


}
}

#topNav


}

Depois de processado, o CSS será exatamente igual. Você não precisa utilizar esse esquema de hierarquia caso não queira, é importante lembrar que o LESS é apenas uma extensão do CSS, se for de desejo do desenvolvedor, podemos escrever um código LESS sem usar nenhum recurso especial, como se fosse um CSS tradicional.

Operations

Com o LESS o seu CSS sabe fazer contas. Qualquer número, cor ou variável pode ser utilizada em uma operação aritmética.
Ele sabe identificar quando estamos utilizando uma cor ou um número, por exemplo:

1
2
3
4
5
6
7
@base: 5%;
@filler: @base * 2;
@other: @base + @filler;

color: #888 / 4;
background-color: @base-color + #111;
height: 100% / 2 + @filler;

Assim como no javascript, é possível também utilizar parênteses nas suas operações:

1
width: (@var + 5) * 2;

Color Functions

Na minha opinião um dos recursos mais úteis durante o desenvolvimento de uma aplicação. Podemos efetuar operações em cima de RGBs, por exemplo, imagine que o layout do seu website foi criado baseado-se em apenas uma cor, utilizando diversos tons dessa cor. Com o LESS é possível utilizar métodos pré-definidos como lighten, saturate, darken, fadein, fadeout e spin. Esses métodos retornam sempre um RGB que pode ser utilizado em seu LESS. Vejamos alguns exemplos:

1
2
3
4
5
6
7
8
9
@base: #f04615;

.class
// Saturo em 5% a cor base.
color: saturate(@base, 5%);

// Utilizo a cor base 25% mais clara
background-color: lighten(@base, 25%);

É possível também extrair informações de uma determinada cor para ser utilizada em outra.
Isso é feito a partir dos métodos hue, saturation e lightness.

1
2
3
hue(@color); // retorna o valor do canal ‘hue’ da cor @color
saturation(@color); // retorna o valor do canal ‘saturation’ da cor @color
lightness(@color); // retorna o valor do canal ‘lightness’ da cor @color

Namespaces

Em dado momento necessitamos organizar uma série de mixins e variáveis. Para isto podemos utilizar um conceito presente no LESS chamado Namespaces. Assim como em linguagens de programação orientadas a objetos, que possuem o conceito de pacotes, os namespaces fornecem encapsulação para nossas folhas de estilo. Isso pode ser implementado facilmente utilizando a mesma notação de ID do CSS tradicional. Vejamos.

1
2
3
4
5
6
7
8
9
10
11
12
#bundle

.button ()

display: block;
border: 1px solid black;
background-color: grey;
&:hover background-color: white
}
.tab …
.citation …
}

Verifique que acima, criamos um mixin chamado button dentro do namespace bundle. Para o utilizarmos devemos fazer da seguinte forma:

1
2
3
4
#header a
color: orange;
#bundle > .button; // Estamos acessando o namespace ‘bundle’ e fazendo uma chamada para o mixin ‘button’.

Uma utilização muito comum dos namespaces é na criação de pequenas bibliotecas de utilidades. Imagine que sua empresa pode possuir uma série de arquivos LESS, e em um determinado projeto você necessita de acesso a esses mixins, variáveis, etc. Organizar seus documentos com namespaces fácilita a visualização e localização de uma determinada instrução no seu documento LESS, como por exemplo, um mixin customizado que pode ser facilmente encontrado a partir da sua indicação de namespace.

1
2
3
someRule
#dclick > .border-radius(10px);

Conclusão

Como podemos ver, o LESS facilita uma série de tarefas que são praticamente impossíveis de serem efetuadas pelo CSS tradicional.
Aconselho a todos que tenham interesse em se aprofundar mais na biblioteca a conhecer o website (http://lesscss.org/). Lá você poderá encontrar a documentação com maior riqueza de informações também poderá ver alguns exemplos de código que não foram abordados nesse post.

Qualquer dúvida, sinta-se a vontade e envie-nos um comentário!
Abraço!

Nov 8

Spring 3.1 RC1 – Cache Abstraction

Escrito por DClick Team em 1, 2.0, 4, 6, action, app, AR, Arquitetura, Banco de Dados, BI, blog, C#, cache, class, classe, configuração, dados, Documentação, Download, err, erro, exemplo, for, framework, Google, html, ide, IE, if, int, interface, Java, lite, map, mapa, O, on, Outros, padrão, pt, reference, RIA, Ria’s Geral, S+S, Sem categoria, site, Spring, Spring Framework, SpringFramework, string, Sun, tag, TAT, Teste, Twitter, UI, uint, XML, zend @ 11 8th, 2011 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Twitter!


Spring Cache Abstraction



Abordamos um das novas funcionalidades do Spring 3.1 RC1, profiles e environments. Ainda existem outras funcionalidades, mas hoje iremos dar uma olhada em Cache Abstraction.

Cache Abstraction é literalmente uma abstração out of the box para adicionar uma camada de cache sobre seus beans, usando uma arquitetura AOP para gerenciar o que deve e o que não deve ser feito o cache.
Usar a nova camada de cache é muito fácil se você já está habituado com Spring, e veremos uma das diferentes maneiras de configurar seus beans.


Baixando a Denpendência



Para quem utiliza maven, basta adicionar a seguinte dependência no pom do seu projeto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>
>
>org.springframework.maven.milestone>
>Spring Maven Milestone Repository>
>http://maven.springframework.org/milestone>
>
>

>
>
>org.springframework>
>spring-core>
>3.1.0.RC1>
>
>
>org.springframework>
>spring-context>
>3.1.0.RC1>
>
>



Se você perferir, pode baixar os jar direto do site do spring.
Sem segredos aqui, basta adicionar as dependências ao projeto e está pronto para usar.

Entendendo o funcionamento



A maneira com que o cache funciona é bem simples. Você pode enxergar o cache como um mapa chave-valor, onde a chave é o conjunto de argumentos do seu método, e o valor é o valor devolvido pelo seu método. Pensando assim fica fácil entender o funcionamento que irei mostrar no exemplo.
Referente a configuração do Spring, é necessário instanciar um gerenciador de cache, ou na linguagem spring, cacheManager. Existe algumas implementações de cache manager disponível no spring, portanto iremos utilizar uma delas em nosso exemplo.
Vamos escrever um teste unitário com JUnit 4.8.1 para ilustrar o comportamento do cache.
Comece criando um arquivo padrão de beans do spring, mas com um namespace a mais:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>
Repare que estamos utilizando o namespace de cache além dos usuais.
A única configuração que iremos fazer aqui, é a do cache manager. Crie um bean da classe >SimpleCacheManager> e adicione o seguinte bean como cache gerenciado:
>
cc lang=”XML”
public interface CacheableTest

@CacheEvict(value = “property”, allEntries = true)
void evictCache();

@Cacheable(“property”)
String getForCache(String s);

String getProperty();

void setProperty(String property);



Repare no getter e setter que usaremos no teste, e na anotação @Cacheable(“property”). Esta anotação está dizendo que o valor que este método devolver será armazenado no cache que configuramos previamente como property. Fato importante é que este valor é referente ao argumento passado como parâmetro no método.
A outra anotação @CacheEvict(value = “property”, allEntries = true) descreve o método que chamaremos para esvaziar o cache. Note que passamos o nome do cache, e que ele deve limpar todos os valores.
É importante notar também que pode ser passado mais de um nome de cache em ambas as anotações.
Uma implementação básica para nosso bean pode ser:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component(“cacheBean”)
public class CacheableBean implements CacheableTest

private String property;

public String getForCache(String s)
return this.property;

public String getProperty()
return property;

public void setProperty(String property)
this.property = property;

public void evictCache()
// Não faz nada

}



Estou usando o package scan para instanciar o bean. Agora nosso teste:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class CacheTest

@Test
public void testCache()

ApplicationContext ctx = new ClassPathXmlApplicationContext(
“spring31-test-beans.xml”);

CacheableTest bean = ctx.getBean(“cacheBean”, CacheableTest.class);

bean.setProperty(“teste”);

Assert.assertEquals(“teste”, bean.getProperty());
Assert.assertEquals(“teste”, bean.getForCache(“a”));

bean.setProperty(“teste2″);
Assert.assertEquals(“teste2″, bean.getProperty());
Assert.assertEquals(“teste”, bean.getForCache(“a”));
Assert.assertEquals(“teste2″, bean.getForCache(“b”));

bean.setProperty(“teste3″);
Assert.assertEquals(“teste3″, bean.getProperty());
Assert.assertEquals(“teste”, bean.getForCache(“a”));
Assert.assertEquals(“teste2″, bean.getForCache(“b”));

bean.evictCache();
bean.setProperty(“teste4″);
Assert.assertEquals(“teste4″, bean.getProperty());
Assert.assertEquals(“teste4″, bean.getForCache(“a”));
Assert.assertEquals(“teste4″, bean.getForCache(“b”));

}



O arquivo de beans se chama spring31-test-beans.xml.
Repare que estamos invocando o método getForCache passando alguns valores diferentes, e o valor devolvido é sempre igual, mesmo que depois setamos um valor diferente ao bean. Para atualizar o valor e limpar o cache, basta invocar o método evictCache que havíamos anotado com @CacheEvict.
Vale a pena brincar um pouco com o funcionamento do cache, e até mesmo criar outros caches e ver o comportamento do evict em diferentes métodos.

Últimas Considerações



As mesmas configurações que fizemos com anotações, pode-se fazer direto no XML. Não entrarei no detalhe pois o funcionamento é exatamente o mesmo, mas se você preferir basta olhar a documentação que é bem straightforward.
Lembre-se que esta camada de cache não possui nenhuma relação com o banco de dados, e deve ser usada com muito cuidado em tais casos, pois alguns erros de concistência podem aparecer devido a um cache desatualizado.
Vale a pena brincar com o cache manager, pois o spring suporta o uso do EhCache, o que pode ser muito útil se você já possui alguma configuração pré-definida para sua aplicação.

Por enquanto é isso, qualquer dúvida mande nos comentários que responderei assim que possível.

Por @Gust4v0_H4xx0r

« Entradas anteriores |

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2755 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com