? Android: SQLite. O Android provê toda a estrutura necessária para criação e manutenção de bancos de dado SQLite. Todos os devices android possuem suporte para o SQLite e a única preocupação que o desenvolvedor deve ter é a de preparar as declarações para criação e manutenção do banco de dados. Implementadas estas declarações, a…
Databases em Android
Oportunidade para Desenvolvedor de Sistemas Mobile – Rio de Janeiro
A Cyberlynxx está com uma oportunidade para Desenvolvedor de Sistemas Mobile. Segue requisitos da oportunidade: – Programação: ASP.Net, C#, Javascript, PL/SQL; – Banco de dados : SQL Server e/ou Oracle; – Experiência em trabalhar com Framework 3.5 ou superior; – Experiência em desenvolvimento de sistema para Windows Mobile; – Conhecimento de gravação e leitura de [...]
Gravação da minha palestra na Android Conference 2011 – Gerenciamento de memória
Olá pessoal! Primeiramente quero desejar a todos um Feliz 2012! Espero que esse ano seja de muito sucesso para você desenvolvedor! O primeiro post de 2012 é sobre algo de 2011 (ironia do destino ). Foi publicado no Youtube a gravação da minha palestra na Android Conference 2011 sobre Gerenciamento de Memória em dispositivos Android. [...]
JQuery: Compatibilidade de CSS com utilização de cssHooks.
Introdução
Um desafio de todo desenvolvedor html é manter o seu site compatível com todos os browsers ( em especial o Internet Explorer ), devido as limitações e detalhes na implementação de cada um, isso é um fato inegável, e qualquer um que ja tentou um dia desenvolver alguma coisa em html sabe disso.
Em projetos pequenos podemos tomar conta disso sem a necessidade de nenhuma ferramenta extra, entretanto com o? crescimento? do projeto? a tendência ? é que estes trechos de códigos para manter a compatibilidade fiquem tão grande quanto o código do próprio site em si, tornando difícil de manter e etc.
jQuery
Nesta hora é importante conhecer as ferramentas que existem para ajudar o desenvolvimento, e utiliza-las de maneira correta. Uma ferramenta importante no desenvolvimento html é o jQuery.
Para quem não sabe o que é, o jQuery é uma biblioteca javascript que facilita a manipulação do DOM ( Document Object Model ) html, ou seja, facilita a manipulação da sua página html.
Para entender melhor do que este post se trata é necessário ter um conhecimento básico da biblioteca jQuery
Hooks
Muitos dos métodos get e set do jQuery podem ser extendidos para casos especiais, estas extensões são conhecidas como hooks. O namespace $.cssHooks permite extender o método .css(), permitindo criar novas propriedades de CSS.
Os hooks podem ser utilizados como uma solução elegante para a compatibilidade de CSS em diferentes browsers, por exemplo, a propriedade text-shadow do CSS3 não é suportada pelo Internet Explorer, portanto o código abaixo não funcionará no IE:
-
$(document).ready(function()
-
$(‘h3′).css(text-shadow: ‘#00ff00′);
-
});
Este código aplica um glow verde em todos os elementos H3 do documento HTML, porém não funciona no IE.
CSS Hooks
Mas nós podemos criar uma nova propriedade css, e internamente tratar o caso do IE. Vamos chamar a nova propriedade de glowColor:
-
(function($)
-
var div = document.createElement(‘div’);
-
$.support.textShadow = div.style.textShadow === ”;
-
$.support.filter = div.style.filter === ”;
-
div = null;
-
-
if ($.support.textShadow)
-
$.cssHooks.glowColor =
-
set: function(elem, value)
-
if (value == ‘none’)
-
elem.style.textShadow = ”;
-
-
else
-
elem.style.textShadow = ’0 0 2px ‘ + value;
-
-
}
-
};
-
}
-
else
-
$.cssHooks.glowColor =
-
set: function(elem, value)
-
if (value == ‘none’)
-
elem.style.filter = ”;
-
-
else
-
elem.style.zoom = 1;
-
elem.style.filter =
-
‘progid:DXImageTransform.Microsoft’ +
-
‘.Glow(Strength=2, Color=’ + value + ‘);’;
-
-
}
-
};
-
}
-
})(jQuery);
Este código cria uma propriedade dentro do namespace .cssHooks chamada glowColor, esta propriedade possui uma função set específica para o caso do IE e outra para o caso dos outros browsers. A lógica deste código é basicamente, verificar se possui suporte ao textShadow, caso sim,? define? uma função set que altera o atributo elem.style.textShadow com a cor do parâmetro, caso não, define uma função que altera a propriedade elem.style.filter com um filtro especifico utilizando a cor do? parâmetro.
Agora podemos aplicar o efeito através do código
-
$(document).ready(function()
-
$(‘h3′).css(glowColor: ‘#00ff00′);
-
});
Conclusão
O lado bom de criar um cssHook no jQuery para o problema de descrito é que o código que trata a compatibilidade fica oculto do desenvolvedor, ele não precisa se? preocupar? com isso, o foco é no código que? constrói? a pagina unicamente. Esta? estratégia pode ser aplicada para outros diversos efeitos e manipulações, criar uma serie de hooks para tratar este tipo de coisa e etc. O lado ruim no meu ponto de vista é que estamos criando propriedades novas, que são desconhecidas pelos outros desenvolvedores e etc, portanto um novo desenvolvedor iria demorar para aprender todas customizações e suas funções, uma dica é tentar manter os nomes semelhantes ao padrão.
Por @thiagoofelix
Referências
Play Framework – alta produtividade em Java
O Play ? um framework open source para aplica??es web, escrito em Java, que possibilita o desenvolvimento de aplica??es web que seguem o padr?o MVC. Tem por objetivo otimizar a produtividade do desenvolvedor atrav?s do uso de configura??o sobre conven??o (CoC). Com recompila??o feita durante a execu??o da aplica??o, e caso ocorra algum erro, o respectivo ? exibido no browser, indicando a linha do erro.
Aten??o: o objetivo desse post ? realizar uma vis?o geral do que se trat? o Play Framework que temos ouvidos os coment?rios na internet.
O Play Framework torna o desenvolvimento de aplica??es Java e Scala uma tarefa f?cil para o desenvolvedor.
Site: Play Framework
Descubra uma alternativa limpa e leve para as atuais aplica??es Java Enterprise. O Play ? focado na produtividade do desenvolvedor e tem por alvo a arquitetura RESTFul.
Apesar do Play ter sido escrito em Java, ele suporta a linguagem Scala desde a vers?o 1.1 (hoje[Dezembro/2011] est? na vers?o 1.2.4). Este ano a empresa Typesafe (respons?vel pela linguagem Scala), anunciou a aquisi??o do Play Framework e este ser? mantido pela empresa. Uma das novidades relacionado a este anuncio ? que a vers?o 2.0 o n?cleo do Play Framework est? sendo totalmente reescrito em Scala.
Um v?deo para uma breve apresenta??o do Play Framework: Desenvolcendo uma aplica??o web em 10 minutos
Motiva??o
O Play foi muito inspirado no Ruby on Rails e Django. Um desenvolvedor familiarizado com qualquer um desses 2, ir? se sentir em casa.
Algo que ? fato, Ruby on Rails e Django s?o produtivos, ent?o por que n?o ter o mesmo n?vel de produtividade com java?
O Play utiliza do poder das aplica??es Java, por?m sem o “sofrimento” necess?rio para o desenvolvimento de aplica??es centradas no modelo Java Enterprise. Libertando das metodologias e ideologias relacionadas ao desenvolvimento de aplica??es Java EE, o Play prove para os desenvolvedores uma maneira f?cil e elegante de trabalhar, visando o aumento da produtividade.
Caso voc? queria, basta um editor de c?digo e ser? mais que o suficiente para o desenvolvimento de aplica??es, chega a ser incr?vel pensar que conseguiremos desenvolver aplica??es Java Web sem a necessidade de um IDE (Eclipse, Netbeans, …), mas vale lembrar, que estas IDE's ainda possuem seus atrat?vos e auxiliam em nossa produtividade.
Apesar de que as aplica??es desenvolvidas com o Play, foram projetadas para executar dentro do JBoss Netty Web Server, as aplica??es podem ser empacotadas em arquivos WAR e distribu?das para outros servidores de aplica??es Java EE (ex.: Apache Tomcat).
Maiores diferen?as com os demais frameworks
Stateless: o Play ? totalmente RESTful – n?o existe conex?o por sess?o Java EE. Isto torna o Play muito mais escal?vel que os demais frameworks.
Sem configura??o: realizar o download, descompactar e desenvolver.
F?cil ida e volta: sem necessidade de deploy no servidor de aplica??o, apenas edite o c?digo e atualize o browser.
Teste unit?rio integrado: suportes nativos para JUnit e Selenium.
API elegante: raramente um desenvolvedor ter? a necessidade de importar alguma lib. O Play j? disponibiliza a maioria dos recursos necess?rios para o desenvolvimento de uma aplica??o.
M?todos est?ticos: todos os controles de entrada e m?todos de neg?cio s?o declarados como est?ticos. E isto ? de fato bem diferente o que vemos nos demais frameworks Java.
I/O Ass?ncrona: atrav?s do uso do servidor web JBoss Netty, o Play consegue disponibilizar e tratar uma enorme quantidade de requisi??es ass?ncronas.
Arquitetura Modular: assim como Rail e Django, o Play utiliza o conceito de m?dulos. O que possibilida um meio elegante e simples de expandir o core do Play.
M?dulo CRUD: f?cil constru??o de UI administrativas com pouco c?digo.
M?dulo Scala: disponibiliza um suporte completo para Scala.
Componentes
O Play utiliza massivamente algumas bibliotecas populares:
- JBoss Netty para o servidor web.
- Hibernate para a camada de dados.
- Groovy para a os templates.
- O compilador do Eclipse para atualiza??o da aplica??o sem necessidade de realizar um deploy da aplica??o para testar as altera??es (hot-reloading).
- Apache Ivy para gerencimanto de dependencias.
Funcionalidades presentes no n?cleo do Play:
- Um framework RESTful limpo e leve.
- CRUD: um m?dulo para simplicifar a edi??o de modelos de objetos.
- Secure: um m?dulo para habilitar um sistema de autentifica??o de usu?rios.
- Um framework de valida??o baseado em anota??es.
- Um Job Scheduler (agendamento de tarefas).
- Suporte para emails SMTP de maneira simples.
- Suporte para JSON e XML.
- Uma camada de persist?ncia baseada em JPA.
- Uma base de dados embutida para r?pido deploy e testes da aplica??o.
- Um framework completo para realiza??o de testes.
- Funcionalidade para upload de arquivos.
- Suporte para m?ltiplos ambientes de desenvolvimento.
- Uma poderosa engine de templates baseadas em Groovy com templates, hierarquias e tags.
- Arquitetura modular, que possibilita criar novas funcionalidades para o n?cleo facilmente.
- Suporte para OpenID e clientes de Web Service.
Links ?teis
Informa??es a mais da Wikipedia
Overview do Play Framework 1.2.4
Documenta??o Play Framework 1.2.4
A documenta??o foi algo que achei interessante, me parece bem completa com bastante exemplos e informa??es de como utilizar as funcionalidades presentes no Play Framework.
Suporte para a linguagem Scala
Utilize a IDE de sua prefer?ncia (Eclipse, Netbeans, …)
Se por um acaso voc? utilize o Sublime Text 2, veja esse suporte para este editor de c?digo [github]
Dentre eles temos: MongoDB, GAE, Gera??o de PDF, GWT, SASS e SCSS, entre outros.
E agora?
Bom agora que j? temos uma boa id?ia do que se trata o Play Framework ? baixar e come?ar a testar e ver se na pr?tica ele ? bom mesmo.
Hora de fazer o download, instalar e colocar a m?o no c?digo: Tutorial para seguir e ver uma aplica??o do in?cio at? o “fim”
Eu particularmente ainda possuo algumas quest?es em aberto para descobrir as respostas, dentre elas est? uma: - Como ? que eu utilizo o Play Framework em um projeto com uma equipe? At? o momento s? tenho visto casos onde s?o apresentados desenvolvimetno de aplica??es r?pidas, por?m com um ?nico desenvolvedor…
No meu caso eu vou atr?s dessa reposta.
Veja também:
NoSQL, mas o que é isso?
Caso voc? trabalha com desenvolvimento de software, ambiente web, provavelmente tem ouvido e lido sobre esse tal de NoSQL, mas o que ?, para que serve, quando usar, voc? sabe?
Aten??o a explica??o a seguir ? a minha com rela??o ao assunto:
Antes de mais nada, o NoSQL ? um novo modelo de base de dados, diferente do modelo relacional, que, creio eu ? muito conhecido de todos os desenvolvedores de software, o NoSQL surgiu para suprir a necessidade de lidar com um volume de informa??es que podem ir muito al?m da que voc? consiga imaginar. Este ? o cen?rio de redes sociais, exemplos cl?ssicos n?s temos o Twitter, Facebook e outras redes, onde a quantidade de informa??o gerada pelos usu?rios (essas redes que possuem milh?es de usu?rios ao redor do mundo) possui um crescimento que as bases de dados relacionais n?o conseguem comportar.
O NoSQL surgiu j? pensando em crescimento da informa??o armazenada e manipulada. As solu??es de NoSQL que temos dispon?veis hoje j? vem por padr?o com todo o conjunto de suporte para poder adicionar novos servidores (nodes) e comportar um crescimento dos dados a um custo muito menor do que a das bases relacionais. Esse crescimento ? chamado de crescimento horizontal, onde basta adicionar novas m?quinas e nessas bases NoSQL adicionadas como nodes da base e tudo pronto. Enquanto nas bases relacionais o crescimento ? vertical, ou seja, ? necess?rio aumentar o poder de hardware dos servidores (e este custo ? alto), al?m do fato que a implementa??o de servidores escravos e nodes n?o s?o simples de adicionar e gerenciar, pois essas bases n?o foram projetadas para atender a esse n?vel de demanda.
Sei que n?o sou o melhor para explicar o respectivo tema, ent?o vamos ao real objetivo do tema, segue alguns materiais interessantes para estudar quanto ao tema, segue estes excelentes postcats sobre o tema que apresenta uma boa vis?o e explica??o sobre o assunto, do pessoal do Grok Podcast:
Epis?dio 45 – Repensando os bancos de dados – NoSQL – Parte 1 de 3
Epis?dio 46 – Repensando os bancos de dados – NoSQL – Parte 2 de 3
Epis?dio 47 – Repensando os bancos de dados – NoSQL – Parte 3 de 3
Links para mais informa??es do assunto:
Comunidade Brasileira de NoSQL
Listagem das bases NoSQL existentes
Escalabilidade – Introdu??o ao NoSQL 1
Veja também:
Até logo, eBehavior – Inteligência para eCommerce

Por decis?es pessoais e por n?o mais compartilhar do mesmo sonho, estou me desligando com muito pesar da eBehavior.
Foi um ano de muito aprendizado, v?rias amizades feitas e principalmente de muito trabalho.
Sinto tremendo orgulho e honrado por ter passado por todas as ?reas da empresa, entrei como desenvolvedor onde pude conhecer por dentro a magia da recomenda??o acertiva de produtos e cross-intelligence que a eBehavior tem. Com o crescimento do time de dev assumi a Coordena??o da equipe e gerenciamentos dos projetos, onde melhorei o meu gerenciamento de pessoas, prazos, escopos e riscos que envolvem projetos de alta escalabilidade e disponibilidade como os da eBehavior. A empresa continuou a crescer ent?o assumi com orgulho a posi??o de Gerente de Produto com a grande responsabilidade de ditar o direcionamento dos produtos da eBehavior que cumpri com muita dedica??o e chatisse com os devs para o conseguirmos o melhor para o cliente, e ? uns dois meses atr?s com a sa?da do diretor comercial, assumi a responsabilidade de atuar frente aos clientes os ajudando no entendimento das ferramentas, na melhor configura??o e otimiza??o delas para suas lojas, estudando e entendendo cada empresa, cada loja, cada consumidor para essa otimiza??o. Foi um ano muito intenso para mim e para todos que estavam ao meu lado.
Agrade?o enormemente ao Andr? pela oportunidade de ter participado do projeto eBehavior durante esse um ano e principalmente por ter tido a possibilidade de passar de ponta a ponta na empresa.
Saio com a grata sensa??o de dever cumprido e desejando muito sucesso a esse time de guerreiros da eBehavior. Que um dia ir? mudar o rumo do ecommerce brasileiro e mundial.
Meus planos s?o de continuar atuando como desenvolvedor e consultor para eCommerce, uma ?rea que me aprofundei muito durante esse um ano de casa.
Deixo aqui o meu muito obrigado a todos com que eu conversei pessoalmente, por telefone, por email e at? para quem n?o conheci mas que de alguma forma participou do meu trabalho. Pois cada um de voc?s contribuiram de forma significativa para o meu crescimento pessoal e profissional.
Mais uma vez, obrigado e at? logo!
Igor Musardo
Flash Player para Mobile é descontinuado, e agora?
Olá pessoal, Que semana bombástica para os desenvolvedores que utilizam a plataforma Flash! Muitas notícias foram dadas e a maior parte desagradou a comunidade. Resultado, muita reclamação no twitter, blogs, gtalk, msn e skype. Mas eu acho isso muito normal, já que a comunidade Flash é uma das mais passionais que eu já conheci. São [...]
Conhecendo o LESS. The Dynamic Stylesheet.
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 // Isto significa que, se criarmos uma outra regra chamada &.mainTitle h2 |
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. |
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 |
É 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 div#header #topNav |
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; |
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 // Utilizo a cor base 25% mais clara |
É 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!
Windows Phone Mango – Local Database
Na versão Mango do Windows Phone, você pode manipular uma base de dados localmente, chamada de local database na documentação oficial, o recurso permite que o desenvolvedor crie aplicativos com registros de dados em tabelas, além de manipular seus registros utilizando o LINQ to SQL.
Uma base de dados local no WP7 fica localizada no Isolated Storage, um local acessível somente pela aplicação corrente, a arquitetura fica conforme a figura abaixo, onde temos a aplicação que contém um DataContext e através de LINQ to SQL, fazemos o acesso a base de dados local no Isolated Storage
Arquitetura Local Database
Para saber mais sobre Isolated Storage acessem os links:
http://msdn.microsoft.com/en-us/library/ff402541(v=vs.92).aspx
No WP7 as aplicações ficam eram áreas isoladas uma das outras, ou seja, uma aplicação não tem acesso ao Isolated Storage de outra aplicação, portanto até o momento não é possível compartilhar uma base de dados local com diversas aplicações. Diferente de uma base de dados SQL Server, um local database não pode rodar como um serviço continuo, visto que ele é executado somente durante o processo da aplicação.
Você pode criar um local database para manipular uma quantidade de dados razoável utilizando as facilidades de consultas do LINQ to SQL juntamente com o relacionamento de tabelas, similar a uma base de dados comum, o local database é uma implementação do SQL CE para o WP7, permitindo realizar facilmente tarefas com incluir, alterar , excluir e realizar consultas com LINQ.
Até o momento não existe uma ferramenta de designer visual e oficial para criar as tabelas, relacionamentos, etc, com a base de dados local, o que poderia facilitar muito, neste artigo faremos um exemplo simples, somente com uma tabela, porém, em um projeto mais complexo, essa tarefa poderia ser um pouco trabalhosa, uma forma não oficial de criar o modelo seria utilizar o SQL Metal, para mais informação, acessem o Centro de Treinamento Oficial do Windows Phone no MSDN ou através do link : http://windowsphonegeek.com/articles/Using-SqlMetal-to-generate-Windows-Phone-Mango-Local-Database-classes .
Com o SQL Metal podemos criar o Data Context através de um comando e com poucas modificações deixá-lo compatível com o Mango e poupar a codificação manual da criação de tabelas e relacionamentos.
Exemplo de comando do SQL Metal:
%ProgramFiles(x86)%Microsoft SDKsWindowsv7.0ABin>SqlMetal.exe
/code:”C:CaminhoClienteDC.cs” “C:CaminhoClienteDB.sdf”
Outras formas:
http://claudiufarcas.blogspot.com/2011/10/windows-phone-mango-sql-ce-tips-and.html
http://blogs.ugidotnet.org/corrado/archive/2011/06/05/using-local-database-in-wp7-mango.aspx
Nesta primeira parte do artigo vou criar uma base de dados muito simples, com uma tabela somente e um único campo, dessa forma podemos focar em como criar e entender os conceitos envolvidos Vou criar uma base de dados Cliente.sdf, com uma tabela chamada Cliente e um campo chamado Nome.
A primeira classe que vamos criar é a entidade Cliente e decorar com alguns atributos utilizados para a manipulação da base de dados, a classe servirá de apoio para a criação da tabela cliente. Para que você possa inserir os atributos nas propriedades da classe, é necessário adicionar o using System.Data.Linq.Mapping, em seguida adicione o atributo [Table] logo acima da criação da classe e adicione o atributo [Column()] em cada propriedade, na primary key da tabela, personalize com :
[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
Dessa forma a coluna será criada na tabela como sendo Primary Key, não permitindo registros duplicados e gerando automaticamente um número a cada inclusão. Com a adição do atributo Column() nas outras propriedades, cada coluna correspondente será criado na tabela.
Com os atributos de colunas você pode definir uma série de recursos, para saber quais são os atributos de colunas que você pode utilizar no LINQ to SQL para WP7 acesse o link http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.columnattribute(VS.95).aspx
Um atributo em especial que adiciona uma coluna de versão pode auxiliar no desempenho de grandes atualizações de dados, apresentando uma significativa melhoria na aplicação, é o IsVersion=true, essa otimização é exclusiva para o LINQ to SQL do WP7 e usado internamente para identificar a versão da coluna modificada:
[Column (IsVersion = true)]
_VERSION Binary privado;
Igualmente importantes são os atributos de associações, que permitem realizar o relacionamento entre as tabelas, para mais informações acesse:
http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.associationattribute(v=VS.95).aspx
Exemplo de Associação:
[Association(Storage = "_cliente", ThisKey = "_clienteId", OtherKey = "Id", IsForeignKey = true)]
Código da Classe Cliente:
? ? ? [Table]
? ? ? public class Cliente : INotifyPropertyChanged, INotifyPropertyChanging
? ? ?
?
? ? ? ? ? ? ? #region INotifyPropertyChanged Members
?
? ? ? ? ? ? ? public event PropertyChangedEventHandler PropertyChanged;
?
? ? ? ? ? ? ? private void NotifyPropertyChanged(string propertyName)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? if (PropertyChanged != null)
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? #endregion
?
? ? ? ? ? ? ? #region INotifyPropertyChanging Members
?
? ? ? ? ? ? ? public event PropertyChangingEventHandler PropertyChanging;
?
? ? ? ? ? ? ?
? ? ? ? ? ? ? private void NotifyPropertyChanging(string propertyName)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? if (PropertyChanging != null)
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? #endregion
?
?
? ? ? ? ? ? ? [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
? ? ? ? ? ? ? private string id;
? ? ? ? ? ? ? public string Id
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? get
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return id;
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? set
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (id != value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPropertyChanging("Id");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? id = value;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPropertyChanged("Id");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? }
? ? ? ? ? ? ?
? ? ? ? ? ? ? [Column()]
? ? ? ? ? ? ? private string nome;
? ? ? ? ? ? ? public string Nome
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? get
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return nome;
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? set
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (nome != value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPropertyChanging("Nome");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nome = value;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPropertyChanged("Nome");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? }
? ? ? ? ? ? ?
?
? ? ? }
Em aplicações Silverlight é comum implementar a interface INotifyPropertyChanged para monitorar mudanças nas propriedades da classe , e tirar um melhor proveito do recursos de databinding da tecnologia, para auxiliar o LINQ to SQL, também vamos implementar a interface INotifyPropertyChanging, com ela é possível monitorar quando uma propriedade será modificada e com isso o DataContext é informado e pode identificar as mudanças e melhorar a performance da aplicação.
O Data Context é o local onde definimos o contexto dos dados que servirão para criar a base de dados local, o LINQ to SQL depende do mapeamento entre o modelo de objetos e o esquema da base de dados. Dependendo da complexidade do modelo, esse arquivo pode ser trabalhoso de ser criado manualmente, mas existem formas de utilizar alguma ferramenta para cria-lo, o SQL Metal é uma delas conforme comentado acima no artigo.
Crie uma classe chamada ClienteDataContext , ela vai herdar de DataContext, o DataContext contém diversas propriedades e métodos que auxiliam na manipulação de base de dados, como por exemplo, verificar se uma base de dados existe, criar e excluir uma base de dados, entre outros, mais adiante vamos utilizar o método CreateDatabase() para criar fisicamente a base de dados local no Windows Phone.
A próxima etapa é criar a string de conexão com a base de dados, utilizaremos a palavra chave “isostore” para informar que o arquivo ficará no Isolated Storage, após isso informaremos o nome da base de dados como Cliente.sdf. É na string de conexão que você pode inserir um senha de acesso a base de dados, informar uma cultura específica ou até mesmo criar uma base de dados somente leitura, para mais informações sobre string de conexões para o WP7 acesse http://msdn.microsoft.com/en-us/library/hh202861(v=vs.92).aspx
Por último vamos definir uma tabela Cliente de acesso público e única no DataContext através de public Table
No App.xaml.cs da aplicação , localize o construtor da classe e no final adicione o código abaixo, neste momento vamos criar uma base de dados usando o DataContext criado anteriormente, o código verifica se existe uma base de dados e caso não exista ele já cria uma nova base de dados.
using (ClienteDataContext ctx = new ClienteDataContext(ClienteDataContext.DBConnectionString))
? ? ? if (ctx.DatabaseExists() == false)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ctx.CreateDatabase();
? ? ? ? ? ? ?
?
}
Para finalizar o artigo vou criar uma tela simples em Silverlight, sem se preocupar com o layout, a tela tem um botão chamado “add” que vai adicionar um registro na base de dados e logo abaixo um ListBox chamado “lst”, que está ligado através de databinding a propriedade ItemSource com uma ObservableCollection chamada Items, na propriedade Text vamos mostrar o nome do cliente também ligando através de databinding.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Grid.Row="1" Margin="12,0,12,0">? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?
No constructor do MainPage vamos criar uma instância do DataContext chamado clienteDB :
clienteDB = new ClienteDataContext(ClienteDataContext.DBConnectionString);
No evento ? Loaded da MainPage, realizamos um consulta LINQ to SQL e já adicionamos o resultado em uma ObservableCollections chamada Items, que está ligado ao ItemSource da ListBox, veja como é prático ligar as informações na tela, neste exemplo como o foco é o conceito de local database, o projeto foi criado todo no code-behind da MainPage, mas você poderia criar usando o ViewModel e ligando o ObservableCollection com a View.
var result = from Cliente r in clienteDB.Cliente
select r;
Items = new ObservableCollection(result);
Para mais informações sobre LINQ:
http://msdn.microsoft.com/en-us/library/bb397897.aspx
http://msdn.microsoft.com/en-us/library/bb386976.aspx
http://msdn.microsoft.com/en-us/library/bb386913.aspx
Vamos agora para o código do botão “add” que vai adicionar os registros na base de dados, através do InsertOnSubmit() adicionamos o objeto ao DataContext e através do SubmitChanges(), o objeto é registrado na base de dados, por último, inserimos o objeto na coleção para que seja apresentado na tela.
Cliente c = new Cliente();
c.Nome = txtNome.Text;
clienteDB.Cliente.InsertOnSubmit(c);
clienteDB.SubmitChanges();
Items.Add(c);
?
Código completo da MainPage:
? ? public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged
? ? ?
? ? ? ? ? ? ? ? ClienteDataContext clienteDB;
? ? ? ? ? ? ? ? #region INotifyPropertyChanged Members
? ? ? ? ? ? ? ? public event PropertyChangedEventHandler PropertyChanged;
? ? ? ? ? ? ? ? private void NotifyPropertyChanged(string propertyName)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? if (PropertyChanged != null)
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? #endregion
? ? ?
? ? ? ? ? ? ? private ObservableCollection_items;
? ? ? ? ? ? ? public ObservableCollectionItems
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? get
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return _items;
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? set
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_items != value)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _items = value;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPropertyChanged("Items");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? ? ?
? ? ? ? ? ? ? // Constructor
? ? ? ? ? ? ? public MainPage()
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? ? ? ? ? ? clienteDB = new ClienteDataContext(ClienteDataContext.DBConnectionString);
? ? ? ? ? ? ? ? ? ? ? this.DataContext = this;
? ? ? ? ? ? ? ? ? ? ? Loaded += new RoutedEventHandler(MainPage_Loaded);
? ? ? ? ? ? ?
? ? ? ? ? ? ? void MainPage_Loaded(object sender, RoutedEventArgs e)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? var result = from Cliente r in clienteDB.Cliente
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? select r;
? ? ? ? ? ? ? ? ? ? ? Items = new ObservableCollection(result);
? ? ? ? ? ? ?
? ? ? ? ? ? ? private void add_Click(object sender, RoutedEventArgs e)
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? Cliente c = new Cliente();
? ? ? ? ? ? ? ? ? ? ? c.Nome = txtNome.Text;
? ? ? ? ? ? ? ? ? ? ? clienteDB.Cliente.InsertOnSubmit(c);
? ? ? ? ? ? ? ? ? ? ? clienteDB.SubmitChanges();
? ? ? ? ? ? ? ? ? ? ? Items.Add(c);
? ? ? ? ? ? ?
? ? ? }
Links:
Boas Práticas:
http://msdn.microsoft.com/en-us/library/hh286406(v=vs.92).aspx
Mais informações sobre local database no Windows Phone :
http://msdn.microsoft.com/en-us/library/hh202860(v=vs.92).aspx
http://msdn.microsoft.com/en-us/library/hh202876(v=VS.92).aspx
Alterações do esquema da base de dados:
http://msdn.microsoft.com/en-us/library/hh394018(v=VS.92).aspx






