Introdução sobre HTML5 Web Workers e multi threads com javascript

Trabalhar de forma assíncrona e paralela nos demanda cada dia mais na construção de aplicativos web com maior facilidade e performance. A especificação de Web Workers (link em inglês) define uma API para geração de scripts de segundo plano no seu aplicativo da web. O Web Workers permite executar tarefas como disparar scripts de longa…

via Introdução sobre HTML5 Web Workers e multi threads com javascript — Código Simples .NET

Anúncios

Edição 255 – O TEF, a NFC-e e o SAT

Olá Partner Bematech e Desenvolvedor de Software,

Muitas dúvidas surgiram no mercado com as mudanças que o varejo sofreu em relação as obrigatoriedades fiscais no ponto-de-venda. Com o decorrer do tempo, muitas foram sanadas com o mercado conseguindo absorver e se adaptar a elas. No entanto, tenho percebido que algumas dúvidas ainda perduram entre os desenvolvedores – Como fica o TEF sem o ECF?

Com as obrigatoriedades da NFC-e na maioria dos Estados brasileiros e o equipamento SAT no Estado de São Paulo, muitas aplicações comerciais passaram por adaptações, algumas nem tanto e outras drasticamente. Regras de negócio foram modificadas em função da saída do ECF do ponto-de-venda, e outras novas foram implementadas com a entrada da NFC-e e o SAT.

Acompanhando estas adaptações temos o TEF, que também precisou de um novo controle e de novas rotinas de impressão das transações, sendo realizadas agora em uma impressora comum de recibos – conhecida entre nós como “impressora não fiscal“.

Aí você me pergunta: “Como fica todo aquele tratamento que o roteiro de integração do TEF exigia?

Os Estados que continuam obrigando o uso do ECF no ponto-de-venda mantêm o TEF da mesma maneira, ou seja, o mesmo roteiro de integração do TEF com o ECF já conhecido por todos nós.

Para a NFC-e e o SAT foi disponibilizada pelas TEF Houses um novo roteiro de integração, muito mais simples e rápido. 

E você sabia que o TEF nunca dependeu do ECF para funcionar?

Simplesmente, o TEF funciona sem relacionamento algum com qualquer tecnologia fiscal. O ECF foi apenas o complemento para a impressão das transações realizadas devido a sua obrigatoriedade, gerando assim um roteiro de integração vinculando a impressão do TEF.

Nesta edição de nosso BSP News, quero compartilhar com você nosso Partner e desenvolvedor de software, algumas dicas para integrar o TEF e a NFC-e/SAT com impressora de recibos.

Vamos lá!

As TEF Houses disponibilizam uma nova documentação que orienta o desenvolvedor na integração de sua aplicação comercial com o TEF, visando as operações com NFC-e e SAT.

Uma das operações que sofreu adaptação foi a impressão do comprovante do TEF.

Vamos relembrar um pouco como era no ECF:

A aplicação comercial, após concluir a venda do cupom fiscal, abria um comprovante de crédito e débito (o famoso “CCD”) e imprimia todo o conteúdo do TEF nele.

Se houvesse um erro de comunicação durante a impressão do TEF, era exibida uma mensagem ao(a) operador(a) do caixa perguntando se desejava reimprimir. Caso a resposta fosse “SIM”, a aplicação comercial encerrava o comprovante de crédito e débito e abria o relatório gerencial para realizar a reimpressão.

Se houvesse uma queda de energia durante a impressão do TEF, onde todo o PDV era desligado, ao retornar, a aplicação comercial era obrigada a não confirmar a transação pendente.

Lembra disso? 😉

As verificações de queda de energia e de erros de comunicação durante a impressão do TEF ainda se mantêm para o uso com NFC-e/SAT e a impressora de recibos.

É possível testar o erro de comunicação fazendo uma leitura de status da impressora (para os modelos MP-4200 TH e MP-100S TH, disponibilizamos via dll MP2032/MP2064 funções para isso).

Para estas verificações, o novo roteiro do TEF pede para que seja exibida uma mensagem ao(a) operador(a) do caixa: “O cupom TEF foi impresso corretamente?“.

Se a impressão ocorrer corretamente, ao responder “SIM”, a aplicação comercial deve confirmar a transação TEF, liberando o PDV para a próxima venda.

Se a impressão não ocorrer corretamente, o(a) operador(a) do caixa tem ainda mais duas opções a escolher, sendo “NÃO” para que a aplicação comercial não confirme a transação TEF exibindo a mensagem “Última transação foi cancelada. Favor reter o cupom.” ou “REIMPRIME” para que a aplicação comercial possa realizar novamente a impressão do TEF, voltando ao fluxo da primeira mensagem ao(a) operador(a) do caixa.

No caso da não confirmação do TEF, a dica é exibir uma nova mensagem ao(a) operador(a) do caixa, alertando que a transação TEF será cancelada, como por exemplo “Tem certeza que quer cancelar a transação TEF“, solicitando a senha do supervisor ou gerente do estabelecimento, caso a resposta seja SIM. 

Na queda de energia, onde todo o PDV desliga, ao retornar, a aplicação comercial deve verificar que há uma transação pendente de confirmação e realizar a confirmação da mesma, reimprimindo a transação TEF.

Perceba que já houveram mudanças em relação ao roteiro utilizado no ECF.

Uma outra mudança que ocorreu foi no encerramento do cupom fiscal, onde a transação do TEF era realizada antes do pagamento do cupom, pois era a maneira de garantir que o pagamento em Cartão fosse realmente efetivado, caso contrário, era possível escolher outro meio de pagamento. Lembrando que tudo isso era impresso concomitantemente no ECF, ou seja: se abria o cupom fiscal, imprimia os itens, totalizava o cupom, realiza a transação TEF, imprimia a forma de pagamento e fechava o cupom fiscal.

Com o novo roteiro de implementação do TEF e também com o uso da NFC-e e SAT, toda esta concomitância deixou de existir, pois agora as informações com as vendas são registradas em um arquivo .xml, assinado e enviado para a SEFAZ (no caso da NFC-e) ou enviado para o equipamento SAT. A transação do TEF ainda pode ser realizada antes do encerramento do cupom da venda, garantindo assim que a mesma tenha sucesso.

E, somente depois do retorno com a autorização da venda, o DANFE NFC-e ou CF-e do SAT pode ser impresso na impressora de recibos, juntamente com o comprovante da transação do TEF.

A Bematech disponibiliza ferramentas e soluções que auxiliam nossos Partners e desenvolvedores de software na melhor integração da NFC-e, SAT e TEF.

Fica aqui meu convite para que venha conhecer e ganhar mais com as nossas Soluções Fiscais e Soluções de TEF Bematech.

Aguardo o seu contato!

Um forte abraço e ótimos negócios,

André Munhoz
andre.munhoz@bematech.com.br
Programa Bematech Software Partners

ECF, NFC-e, SAT, Impressora de Recibos, MP-4200 TH, MP-100S TH

Fonte http://partners.bematech.com.br/bemacast/Paginas/post.aspx?title=edicao-255—o-tef,-a-nfc-e-e-o-sat&idPost=6257

Outros links:

Downloads

http://partners.bematech.com.br/suporte-e-recursos/downloads

 

 

 

 

 

Plone

Plone é um sistema de gerenciamento de conteúdo (CMS, de Content Management System) escrito na linguagem Python e que roda sobre um Servidor de Aplicações Zope e sobre o framework CMF (Content Management Framework).

O Plone pode ser usado para a construção de portais de informação em intranets, extranets e na Internet. Pode ser usado também para construir sistemas de publicação de documentos ou até como ferramenta para trabalho colaborativo. O Plone roda em praticamente qualquer plataforma.

Histórico

O projeto Plone surgiu em 1999, com Alan Runyan, Alexander Limi e Vidar Andersen. Em 2004 surgiu a Fundação Plone, para proteger e promover seu uso. É desenvolvido em código aberto, adotado por milhares de desenvolvedores no mundo todo, inclusive pelo website do FBI.

Versōes

Versões estáveis do Plone:[1]

Zope

Zope é um servidor de aplicações web de código aberto escrito na linguagem Python. Seu nome significa “Z Object Publishing Environment” (em português, “Ambiente de Publicação de Objetos Z”). Muitas tarefas de administração de um servidor Zope podem ser realizadas através de uma interface web. Os objetos que o Zope publica na Web são escritos em linguagem Python, e tipicamente armazenados num banco de dados orientado a objetos, o ZODB, que é integrado ao sistema. Objetos básicos tais como documentos, imagens e modelos de páginas podem ser criados ou modificados via web. Objetos especializados, tais como wikis, blogs, e galerias de fotos estão disponíveis como componentes adicionais (chamados products), e existe uma comunidade de desenvolvedores e de pequenas empresas criando aplicações web como produtos.

História

O que hoje se conhece como Zope surgiu em 1998, quando a empresa Digital Creations (atual Zope Corporation) abriu o fonte de seus principais produtos sob uma licença de código aberto. A decisão foi influenciada por Hadar Pedhazur, principal investidor da empresa. A combinação de Bobo e Principia foi renomeada para Zope naquela época. Esta decisão transformou a Digital Creations numa empresa de serviços, e proporcionou muito mais visibilidade e interesse em torno do Zope do que o Principia jamais teve.

Características técnicas

Um sítio em Zope é formado por objetos em um banco de dados em vez de arquivos, como é comum em muitos outros servidores de aplicação web. Esta abordagem permite alavancar as vantagens do paradigma de objetos, como encapsulamento. Zope associa URLs a objetos utilizando a hierarquia de partes (composição); os métodos são considerados como partes dos objetos. Por exemplo, http://www.zope.org/Products/visual é uma forma de acessar app.Products.visual.

O Zope inclui o Zope Object Database (ZODB), que persiste transparentemente objetos Python de forma transacional. A transparência está no fato de que os desenvolvedores raramente precisam escrever código para ler ou salvar os objetos no ZODB de forma explícita.

Uma característica particularmente inovadora do Zope é o uso em larga escala de aquisição. Aquisição é uma técnica paralela à herança de classes, através da qual objetos ‘herdam’ comportamentos de seu contexto na hierarquia de composição, além da hierarquia de classes. Isto possibilita novas formas de organizar a aplicação, muito adequadas ao paradigma da web onde os sites são organizados em pastas e sub-pastas, ou seções e sub-seções. Um uso frequente de aquisição é a organização dos componentes visuais das páginas de forma que elementos comuns possam ser adquiridos de um repositório central, sem se perder a possibilidade de substituir qualquer elemento por uma versão local mais adequada ao contexto. Por outro lado, o modo como a aquisição é implementada no Zope 2 também é visto como uma fonte de erros, produzindo comportamentos inesperados em alguns casos. O uso de aquisição foi bastante reduzido no Zope 3.

O Zope fornece dois mecanismos para a criação de modelos de páginas: Dynamic Template Markup Language (DTML: Linguagem Dinâmica de Marcação de Modelos), e Zope Page Templates (ZPT: Modelos de Páginas Zope). O DTML é uma linguagem de marcação que permite implementar lógica simples em modelos, através de laços, condicionais e inserção de variáveis. No entanto, o DTML apresenta alguns problemas comuns às linguagens deste tipo: os modelos não podem ser verificados por validadores HTML, e a inclusão indiscriminada de lógica nos modelos resulta em código pouco legível e difícil de manter.

ZPT é uma tecnologia que ataca estes problemas. Modelos ZPT são formadas por XML ou HTML válido, nas quais toda a codificação é feita através de atributos dentro das etiquetas já existentes nestas linguagens. Tais atributos utilizam um espaço de nomes especial, denominado tal: Template Attribute Language (Linguagem de Atributos para Modelos), e assim são compatíveis com as especificações do W3C e com as principais ferramentas de edição de HTML. ZPT proporciona apenas um conjunto limitado de recursos, estimulando os programadores a implementar a lógica em scripts Python à parte, que são apenas invocados (e não incluídos) nos modelos. ZPT também fornece suporte à internacionalização e localização de aplicativos web, propiciando a substituição de mensagens por versões previamente traduzidas em múltiplas línguas.

O Zope 2 fornece a infraestrutura para gerenciadores de conteúdo como Plone, Silva (CMS) e Nuxeo CPS, bem como grandes portais desenvolvidos pela Zope Corp.

Zope 3 / BlueBream

Uma nova versão do Zope, o Zope 3, vem sendo desenvolvida desde 2001. Embora o Zope 2 tenha comprovado seu valor como framework para o desenvolvimento de aplicações web, ele não está livre de problemas. Por exemplo, criar um novo produto para estender o Zope envolve o reuso de muito código “mágico” que simplesmente precisa estar lá, e a lógica do domínio da aplicação é inevitavelmente “contaminada” pela lógica da própria infraestrutura. O Zope 3 é uma recriação total do sistema, com ampla participação da comunidade de desenvolvedores que se especializou na plataforma. O objetivo é resolver estes problemas sem perder as vantagens que deram ao Zope sua atual popularidade. O Zope 3 é baseado numa arquitetura de componentes, que visa facilitar por um lado o uso de componentes externos dentro do Zope, e por outro lado o uso de componentes isolados do Zope em projetos que não necessitam de toda a infraestrutura do servidor de aplicações. A primeira versão de produção, chamada Zope X3, foi lançada em 6 de novembro de 2004.

Zope Page Templates

Os Modelos de Páginas Zope (Zope Page Templates) são documentos XHTML propriamente ditos, o que significa que podem ser visualizados e editados utilizando-se editores HTML ou ferramentas compatíveis com XHTML (uma grande vantagem comparada com outras linguagens de modelo usadas para aplicações web). Os modelos (templates) também podem ser verificados para a conformidade XHTML, para que possam ser razoavelmente seguros de que irão se expandir automaticamente em XHTML adequado.

No entanto, esses modelos de páginas não se destinam a serem processados como são. Em vez disso, são marcados com elementos e atributos adicionais nos espaços de nomes XML especiais (ver abaixo). Esta informação adicional é usada para descrever como o modelo de página deverá vir a ser processado.

A seguir estão alguns exemplos básicos. Para incluir condicionalmente um elemento específico, como um elemento div, basta adicionar o atributo tal:condition para o elemento da seguinte forma:

<div tal:condition="...">
  ...
</div>

Para controlar o que aparece dentro de um elemento, use o atributo tal:content como este:

<h1><span tal:content="..."/></h1>
...

Finalmente, para introduzir ou substituir valores de atributos use o atributo tal:attributes da seguinte forma: o poder do Python poderá também ser utilizado para alterar dinamicamente a href durante a execução.

<a href="" tal:attributes="href python:'http://algumaurl.com/%s'%algumobjeto">...</a>

 

Esta é uma explicação muito superficial de Modelos de Páginas Zope. Seu comportamento é quase completamente descrito por uma linguagem de modelos, determinados em espicificações TAL, TALES, e METAL:




Fonte: https://pt.wikipedia.org/wiki/Zope

Os melhores lançamentos da Disney podem ser suas ferramentas de código aberto

Quem já conferiu o repositório da empresa no GitHub sabe bem. Lá estão disponíveis diversas ferramentas e bibliotecas open source

É comum associarmos a Disney ao Mickey Mouse, às animações e aos parques de diversões. Mas você seria capaz de associar a empresa como grande produtora de software de fonte aberta, encorajando contribuições de seus desenvolvedores e lançando software próprio?

Pois bem, a empresa, que tanto já nos ensinou sobre Customer Experience, há anos vem construindo um caminho relevante em relação ao mundo open source. Basta lembrar de vários projetos que envolvam imagens, como o formato de arquivo OpenEXR, desenvolvido pela subsidiária Industrial Light and Magic. Mas há também bons resultados menos centrados no campo da imagem, incluindo o Munki, um conjunto de ferramentas para ajudar os administradores do MacOS X a gerenciar instalações e remoções de software.

O repositório no GitHub destaca o Programa de Código Aberto da Disney, através do qual a empresa encoraja os desenvolvedores a explorar vários projetos open source (14, no total), incluindo o Universal Scene Description (USD), que a Disney considera como o núcleo do pipeline de gráficos 3D da Pixar. A empresa usa USD em cada aplicação para criação e renderização em 3D, incluindo a Pixar Presto. Segundo a própria Disney, o USD é seu primeiro software disponível publicamente, através de uma única API. A intenção é que a Pixar evolua o USD para servir como uma linguagem comum para a definição e edição de dados 3D.

No GitHub estão disponíveis ferramentas, bibliotecas e softwares usados pelos animadores e programadores da Disney em diferentes animações e filmes da Pixar Animation Studios, Marvel Studios, LucasFilm, Walt Disney Animation Studios, Disney Interactive Studios e Walt Disney Animation Television.

Outro projeto de destaque é o Partio, uma biblioteca C ++ para trabalhar com formatos de partículas 3D, incluindo GEO, BGEO e PTC. Está disponível através de uma API Python e ferramentas de linha de comando. O Partio destina-se a fornecer uma interface unificada semelhante a bibliotecas de imagens para facilitar o tratamento de arquivos de partícula, uma parte importante do trabalho de efeitos especiais, porque eles permitem informações de forma livre no espaço 3D. Infelizmente, não há um formato padrão para partículas semelhantes ao Wavefront .obj. “A maioria dos sistemas de animação tem seus próprios formatos de partículas, proprietários “, diz a documentação para o projeto.

Há ainda o projeto Dragonchain, orientado a simplificar a integração de aplicativos em um Blockchain. Desenvolvido pela Disney em Seattle este ano, a Dragonchain tem como objetivo proteger negócios que envolvam uma forma independente da moeda, interoperável. Especula-se que venha a ser usada para possibilitar programas de pontos/recompensas baseados em criptomoedas como o Bitcoin. Não há uma aplicação clara e definitiva para as possibilidades de DRAGONchain ainda. A Disney lançou o protocolo blockchain com uma licença de código aberto em Apache 2 modificado.

A linguagem Ruby também recebe um aceno da Disney, com ruby-jss, anteriormente conhecido como jss-api-gem. Este projeto, também da Pixar, oferece um módulo JAMF Server Software (JSS) para trabalhar com Casper Suite do JAMF Software para gerenciar Macs. O conjunto será renomeado como JAMF Pro. “O módulo abstrai os objetos da API como classes Ruby, que interagem para permitir uma automação mais simples das tarefas relacionadas à Casper”, de acordo com a documentação do projeto.

Também em relação à animação, o projeto OpenSubdiv oferece uma API para integração em ferramentas de desenvolvimento de conteúdo digital de terceiros. A tecnologia GPU em OpenSubdiv foi desenvolvido pela Pixar e Microsoft.

Além disso, faz já algum tempo que a Disney abriu o código da SeExpr, uma linguagem de expressão simples usada para controle artístico e personalização de software. “Nós o usamos para síntese de geometria procedural, síntese de imagem, controle de simulação, e muito mais”, afirma a documentação. Desenvolvedores têm usado a linguagem para prototipagem rápida, por exemplo.

Fonte: http://cio.com.br/tecnologia/2016/11/27/os-melhores-lancamentos-da-disney-podem-ser-suas-ferramentas-de-codigo-aberto/

Guia completo dos Seletores CSS3

Introdução

O Módulo das CSS3 denominado “Selectors Level 3” atingiu, em 29 de setembro de 2011, o status de Recomendação do W3C. Essa Recomendação descreve os seletores já existentes nas CSS1 e CSS2 e cria novos seletores para as CSS3.

Seletores são “padrões” ou “modelos” que casam com os elementos de uma árvore do documento e portanto podem ser usados para selecionar os nós de um documento XML. Seletores foram otimizados para serem usados com as linguagens de marcação HTML e XML.

CSS (Cascading Style Sheets) é uma linguagem para descrever a renderização de documentos HTML e XML em uma tela, em papel, em sintetizadores de voz, etc.

As CSS usam seletores para atrelar propriedades de estilização aos elementos de um documento.

Tabela de seletores

Padrão Casa com Tipo CSS
* qualquer elemento Seletor universal 2
E elementos do tipo E Seletor tipo 1
E[foo] elementos com o atributo “foo” Seletor atributo 2
E[foo=”bar”] elementos E cujo valor do atributo “foo” é exatamente igual a “bar” Seletor atributo 2
E[foo~=”bar”] elementos E cujo valor do atributo “foo” é uma lista de valores separados por espaço, um dos quais é exatamente igual a “bar” Seletor atributo 2
E[foo^=”bar”] elementos E cujo valor do atributo “foo” começa exatamente com a string “bar” Seletor atributo 3
E[foo$=”bar”] elementos E cujo valor do atributo “foo” termina exatamente com a string”bar” Seletor atributo 3
E[foo*=”bar”] elementos E cujo valor do atributo “foo” contém a substring “bar” Seletor atributo 3
E[foo|=”en”] elementos E cujo atributo “foo” tem uma lista de valores começando com “en” e seguida por um hífen Seletor atributo 2
E:root elemento E raiz do documento Pseudo-classe estrutural 3
E:nth-child(n) elemento E que é o enésimo filho do seu elemento pai Pseudo-classe estrutural 3
E:nth-last-child(n) elemento E que é o enésimo filho (contado de trás para frente) do seu elemento pai Pseudo-classe estrutural 3
E:nth-of-type(n) elemento E que é o enésimo irmão do seu tipo Pseudo-classe estrutural 3
E:nth-last-of-type(n) elemento E que é o enésimo irmão (contado de trás para frente) do seu tipo Pseudo-classe estrutural 3
E:first-child elemento E que é o primeiro filho de seu elemento pai Pseudo-classe estrutural 2
E:last-child elemento E que é o último filho de seu elemento pai Pseudo-classe estrutural 3
E:first-of-type elemento E que é o primeiro irmão de seu tipo Pseudo-classe estrutural 3
E:last-of-type elemento E que é o último irmão de seu tipo Pseudo-classe estrutural 3
E:only-child elemento E que é o único filho de seu elemento pai Pseudo-classe estrutural 3
E:only-of-type elemento E que é irmão único do seu tipo Pseudo-classe estrutural 3
E:empty elemento E que não tem elementos filhos (inclusive nós de texto) Pseudo-classe estrutural 3
E:link
E:visited
elemento E que sendo destino de um link ainda não foi visitado (:link) ou que já tenha sido visitado (:visited) Pseudo-classe link 1
E:active
E:hover
E:focus
elemento E durante determinadas ações do usuário Pseudo-classe ação do usuário 1 e 2
E:target elemento E que é o destino de um fragmento identificador de um URI Pseudo-classe :target 3
E:lang(pt-br) elemento E em um determinado idioma – “exemplo: pt-br” Pseudo-classe :lang() 2
E:enabled
E:disabled
elemento E de uma interface de usuário que está habilitado (:enabled) ou desabilitado (:disabled) Pseudo-classe estado do elemento UI 3
E:checked elemento E de uma interface de usuário que está marcado (:checked) (por exemplo: radio-button ou checkbox) Pseudo-classe estado do elemento UI 3
E::first-line primeira linha formatada do elemento E Pseudo-elemento ::first-line 1
E::first-letter primeira letra formatada do elemento E Pseudo-elemento ::first-letter 1
E::before conteúdo gerado antes do elemento E Pseudo-elemento ::before 2
E::after conteúdo gerado depois do elemento E Pseudo-elemento ::after 2
E.foo elemento E cujo valor da classe é “foo” Seletor classe 1
E#foo elemento E cujo valor do atributo ID é “foo”. Selector ID 1
E:not(seletor) elemento E que não casa com o seletor simples seletor Pseudo-classe negação 3
E F elemento F descendente do elemento E Elemento descendente 1
E > F elemento F filho do elemento E Elemento filho 2
E + F elemento F imediatamente precedido pelo elemento E Elemento irmão adjacente 2
E ~ F elemento F precedido pelo elemento E Elemento irmão geral 3

Criei versões HTML, PNG e SVG desta tabela otimizadas para impressão. Que tal imprimir a tabela e tê-la na sua mesa de trabalho para uma referência e consulta rápida?
versão HTML para impressão desta tabela (link abre em nova janela)
versão PNG para impressão desta tabela (link abre em nova janela)
versão SVG com personalização de cores para impressão desta tabela (link abre em nova janela).

Vamos estudar a seguir cada um dos seletores constantes da tabela.

Incorporamos nesta página, para cada um dos seletores estudados, com uso de IFRAME para o JSFiddle, exemplos que demonstram o efeito de estilização. Você poderá complementar seus estudos clicando o link existente no canto superior direito do IFRAME e editando os códigos dos exemplos de modo interativo.

Seletor universal

♦ Casa com qualquer elementoOs conteúdos de cada um dos elementos da marcação, ao serem renderizados em um navegador, são estilizados com regras CSS mínimas (por exemplo: cor e tipo de fonte, margens, paddings, etc.) que fazem parte de uma folha de estilos nativa do navegador e que na ordem de cascata tem a prioridade mais baixa, ou seja, qualquer declaração de estilo do autor ou usuário sobrescreve a folha de estilos nativa.

Não existe uma padronização para essa folha de estilos e cada navegador implementa sua própria folha de estilos nativa. Como consequência ocorrem inconsistências de renderização, em relação a estilização básica, entre navegadores.

Destas inconsistências a que produz maiores transtornos é a não padronização dos valores para as propriedades margin e padding.

A principal utilização do seletor universal é “zerar” essas propriedades para todos os elementos da marcação. Como consequência o autor terá que definir explicitamente para cada elemento, na sua folha de estilos, aqueles valores.

* {
  margin: 0;
  padding: 0;
  }

O seletor universal quando declarado de forma contextual pode produzir resultados interessantes. Observe os exemplos a seguir:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor tipo

♦ Casa com elementos de um determinado tipoSintaxe: E

Usado para estilizar os elementos da marcação que são de um mesmo tipo; por exemplo: elemento do tipo p(parágrafo), do tipo div, do tipo ol, do tipo strong, e assim por diante.

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletores de atributo

♦ Casam com elementos cujo atributo satisfaçam determinadas condições

presença de um atributo

♦ Casa com elementos que contenham um determinado atributoSintaxe: E["foo"]

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

valor de um atributo

♦ Casa com elementos com determinado valor de atributoSintaxe: E[foo="bar"]

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

valor de um atributo pertence a uma lista de valores separados por espaço

♦ Casa com elementos cujo valor de atributo pertença a uma lista de valores separados por espaçoSintaxe: E[foo~="bar"]

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

valor de um atributo começa com string

♦ Casa com elementos cujo valor de atributo começa com uma determinada stringSintaxe: E[foo^="bar"]

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

valor de um atributo termina com string

♦ Casa com elementos cujo valor de atributo termina com uma determinada stringSintaxe: E[foo$="bar"]

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletores do tipo pseudo-classe

elemento raiz

♦ Casa com o elemento raiz do documentoSintaxe: :root

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Nesse exemplo a cor dos elementos é herdada do elemento raiz.

enésimo filho

♦ Casa com o elemento que é o enésimo filho do seu elemento paiSintaxe: E:nth-child(n)

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

enésimo filho de trás para frente

♦ Casa com o elemento que é o enésimo filho do seu elemento pai, contado de trás para frente na marcaçãoSintaxe: E:nth-last-child(n)

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

enésimo irmão do seu tipo

♦ Casa com o elemento que é o enésimo irmão (filhos do mesmo elemento pai) do seu tipoSintaxe: E:nth-of-type(n)

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

enésimo irmão do seu tipo de trás para frente

♦ Casa com o elemento que é o enésimo irmão (filhos do mesmo elemento pai) do seu tipo, contado de trás para frente na marcaçãoSintaxe: E:nth-last-of-type(n)

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

primeiro filho

♦ Casa com o elemento que é o primeiro filho do seu elemento paiSintaxe: E:first-child

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

último filho

♦ Casa com o elemento que é o último filho do seu elemento paiSintaxe: E:last-child

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

primeiro do mesmo tipo

♦ Casa com o elemento que é o primeiro irmão (filhos do mesmo elemento pai) do mesmo tipoSintaxe: E:first-of-type

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

último do mesmo tipo

♦ Casa com o elemento que é o último irmão (filhos do mesmo elemento pai) do mesmo tipoSintaxe: E:last-of-type

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

único filho

♦ Casa com o elemento que é o único filho do seu elemento paiSintaxe: E:only-child

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

único irmão

♦ Casa com o elemento que é o único irmão (filhos do mesmo elemento pai) do mesmo tipoSintaxe: E:only-of-type

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

elemento vazio

♦ Casa com o elemento que não tem filhos (inclusive filhos do tipo nós de texto)Sintaxe: E:empty

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

link

♦ Casa com o elemento que é um link não visitadoSintaxe: a:link

Exemplo:

<a href="http://maujor.com">Site do Maujor<</a>
a:link {
  color: red; 
  text-decoration: none;  
}

link visitado

♦ Casa com o elemento que é um link que já foi visitadoSintaxe: a:visited

Exemplo:

<a href="http://maujor.com">Site do Maujor<</a>
a:visited {
  color: orange; 
  text-decoration: underline;  
}

ativo

♦ Casa com o elemento que por ação do usuário foi tornado ativoSintaxe: a:active

Exemplo:

<a href="http://maujor.com">Site do Maujor<</a>
:active {
  outline: 1px solid pink;  
}

sobre

♦ Casa com o elemento que, por ação do usuário, teve um dispositivo apontador colocado sobre eleSintaxe: a:hover

Exemplo:

<a href="http://maujor.com">Site do Maujor<</a>
a:hover {
  color: green;
  background: black;  
}

foco

♦ Casa com o elemento que por ação do usuário a ele foi dado o focoSintaxe: E:focus

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Não existe uma padronização relacionando os elementos HTML que podem receber foco. Mas, em geral são eles:

  • Elemento a
  • Elemento area com atributo href
  • Elemento input
  • Elemento select
  • Elemento textarea
  • Elemento button (não desabilitado)
  • Elemento iframe
  • Elemento a
  • Qualquer elemento com o atributo tabindex

alvo

♦ Casa com o elemento que é o alvo do fragmento identificador de um linkSintaxe: E:target

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

idioma

♦ Casa com o elemento que foi marcado em determinado idiomaSintaxe: E:lang

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

habilitado ou desabilitado

♦ Casa com o elemento da interface de usuário que seja habilitado ou desabilitadoSintaxe: E:enabled e E:disabled

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

marcado

♦ Casa com o elemento da interface de usuário que tenha sido marcadoSintaxe: E:checked

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

primeira linha

♦ Casa com a primeira linha do texto formatado de um elementoSintaxe:
E:first-line — até as CSS2.1
E::first-line — modificada peals CSS3

As CSS3 modificaram a sintaxe para esse seletor. Os navegadores antigos não suportam a nova sintaxe e o modernos suportam as duas sintaxes.

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Notas:

1 – Esse seletor aplica-se somente a elementos nível de bloco

2 – Somente às propriedades listadas a seguir podem ser estilizadas por esse seletor

  • propriedades para fontes
  • propriedades para cores
  • propriedades para background
  • word-spacing
  • letter-spacing
  • text-decoration
  • vertical-align
  • text-transform
  • text-shadow
  • line-height
  • clear

primeira letra

♦ Casa com a primeira letra do texto formatado de um elementoSintaxe:
E:first-letter — até as CSS2.1
E::first-letter — modificada pelas CSS3

As CSS3 modificaram a sintaxe para esse seletor. Os navegadores antigos não suportam a nova sintaxe e o modernos suportam as duas sintaxes.

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Notas:

1 – Esse seletor aplica-se somente a elementos nível de bloco

2 – Somente às propriedades listadas a seguir podem ser estilizadas por esse seletor

  • propriedades para fontes
  • propriedades para cores
  • propriedades para background
  • propriedades para margens
  • propriedades para padding
  • propriedades para bordas
  • text-decoration
  • vertical-align (para elementos não flutuados)
  • text-transform
  • text-shadow
  • line-height
  • float
  • clear

conteúdo antes

♦ Casa com o conteúdo gerado antes de um elementoSintaxe: E::before

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

conteúdo depois

♦ Casa com o conteúdo gerado depois de um elementoSintaxe: E:after

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

negação

♦ Casa com o elemento que não casa com determinado seletor simples seletorSintaxe: E:not(seletor)

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor classe

♦ Casa com o elemento que tem determinado valor para o atributo classeSintaxe: E.foo

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor ID

♦ Casa com o elemento que tem determinado valor para o atributo idSintaxe: E#foo

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor descendente

♦ Casa com o elemento que descende de determinado elementoSintaxe: E F

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor filho

♦ Casa com o elemento filho de determinado elementoSintaxe: E>F

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor que imediatamente sucede

♦ Casa com o elemento irmão que imediatamente segue-se a determinado elementoSintaxe: E+F

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

Seletor que sucede

♦ Casa com o elemento irmão que segue-se a determinado elementoSintaxe: E~F

Exemplo:

Ver no jsFiddle um exemplo interativo (abre em nova janela)

O IE outra vez! 😦

Os seletores CSS3 são suportados pelos navegadores modernos. Para servir os seletores das CSS3 aos navegadores Internet Explorer 6 até 8 use uma pequena biblioteca JavaScript (4K) chamada Selectivizr.

Basta adicionar o seguinte código na seção head do documento:

<script type="text/javascript" src="[JS library]"></script>
<!--[if (gte IE 6)&(lte IE 8)]>
  http://selectivizr.js
  <noscript><link rel="stylesheet" href="[fallback css]" /></noscript>
<![endif]-->

Boa sorte com os poderosos seletores das CSS!

DNALinux Uma solução Linux para Bioinformática

Uma solução Linux para Bioinformática

DNALinux é uma máquina virtual com software bioinformático pré-instalado.
NOVO: Python de Bioinformática (Py4Bio) edição. Ir para página de download .

DNALinux VD: Py4Bio edição

DNALinux Virtual Desktop Py4Bio está pronto !. Esta edição é chamado Py4Bio porque é a distribuição Linux incluído no livro Python para Bioinformática .

Tela1Programas comuns de desktop usados em Bioinformática estão incluídos no DNALinux.Usando VMWare você pode executar programas Linux e Windows lado a lado.

Screen2DNALinux também é um servidor web. Você não tem que configurar um servidor web Apache e instalar programas CGI desde DNALinux tem-los pré-instalado e pronto para ser executado. Com um servidor, você pode fazer um BLAST a partir do seu computador host.

O que é DNALinux Virtual Desktop (VD)?

DNALinux VD é uma máquina virtual pré-configurada (VM) com aplicações direcionadas à bioinformática (análise de DNA e proteína). Esta máquina virtual é executado no topo da livre VMWare Player . Esse player pode ser executado em máquinas Windows e, como a máquina virtual funciona dentro do player, tudo o que você faz com DNALinux VD não toca no computador host para que você possa ter dois ambiente de trabalho separado (DNALinux e Windows juntos no mesmo computador).

Que software está disponível no DNALinux?

Além dos programas habituais do Linux, o software Bioinformatics está incluído, como: ApE-A Plasmid Editor, Biopython, Blast, Emboss, FinchTV, NCBI Toolkit, Polyxmass, primer3 (e uma interface web, primer3plus), Rasmol, Readseq e muitos mais . Veja aqui a lista completa .

Requisitos

Hardware

  • CPU Pentium IV ou melhor
  • 1 Gb de RAM
  • 20 GB de espaço em disco

Programas

Citando DNALinux

Use esta referência:

Bassi, Sebastian e Gonzalez, Virgínia. DNALinux Virtual Desktop Edition. Disponível em Nature Precedings <http://dx.doi.org/10.1038/npre.2007.670.1&gt; (2007)

Para citar um pacote em particular (como grave, BLAST, biopython), vê no software instalado página.

Install instructions

  1. Download the torrent file.
  2. Download DNALinux using the torrent with a bittorrent compatible program like “Bittorrent”, Bittorrnado, Vuze (see here for a complete list)
  3. Download VMWare Free Player
  4. Download 7zip uncompressor
  5. Uncompress DNALinux.7z using 7zip and play the vmk file with VMWare Player.

Direct download in RapidShare (12 parts):

Instruction for files downloaded from Rapidshare:

To join the parts in Windows:

copy /b dbasea* dnalinux.7z

To join the parts in Linux:

cat dbasea* > dnalinux.7z

MD5 checksum: f75e88f48e08161be62b70a8ef465e17

Padrão de Projeto Factory Method em Java

Veja neste artigo os principais conceitos, funcionamento e implementação prática, na linguagem Java, do Padrão de Projeto Factory Method.

Introdução

Os Design Patterns (Padrões de Projetos) têm sua origem no trabalho de um arquiteto chamado Christopher Alexander em meados da década de 70. Ele escreveu dois livros de bastante sucesso que exemplificava o uso e descrevia seu raciocínio para documentar os padrões para a arquitetura. Em 1995, um grupo de quatro profissionais (que ficou conhecido como Group Of Four ou Grupo dos Quatro) escreveu e lançou o livro “Design Patterns: Elements of Reusable Object-Oriented Software” [Gamma95] que continha um catálogo com 23 padrões de projetos (Design Patterns) orientados a software. A ideia de documentar problemas recorrentes que acontecia nos softwares surgiu através da ideia de Christopher Alexander que também percebeu essa necessidade na sua área.

Os Design Patterns são uma coleção de padrões de projeto de software que contém soluções para problemas conhecidos e recorrentes no desenvolvimento de software descrevendo uma solução comprovada para um problema de projeto recorrente. A Documentação desses padrões permite o reuso e o compartilhamento dessas informações sobre a melhor maneira de se resolver um problema de projeto de software.

Neste artigo descreveremos um dos Padrões de projetos mais utilizados pelos desenvolvedores de software, sendo bastante recorrente ,que é o Factory Method que será detalhado nas seções subsequentes do artigo.

Funcionamento

De forma geral todos os padrões Factory (Simple Factory, Factory Method, Abstract Factory) encapsulam a criação de objetos. O padrão Factory Method por sua vez encapsula a criação de objetos, no entanto, a diferença é que neste padrão encapsula-se a criação de objetos deixando as subclasses decidirem quais objetos criar.

O Diagrama de classe abaixo mostra mais detalhes sobre o funcionamento do padrão Factory Method.

Diagrama de classe do Padrão Factory Method

Figura 1: Diagrama de classe do Padrão Factory Method

No diagrama de classe acima temos a classe de criador abstrata que é a Creator que define um método fábrica abstrata que as subclasses implementam para criar um produto (factoryMethod) e pode possuir um ou mais métodos com seus devidos comportamentos que chamarão o factoryMethod. Normalmente o método factoryMethod do Creator também possui um Product abstrato que é produzido por uma subclasse (ConcreteCreator). Nota-se que cada ConcreteCreator produzirá seu próprio método de criação.

Segundo o GOF (Group Of Four) o padrão Factory Method é: “Um padrão que define uma interface para criar um objeto, mas permite às classes decidirem qual classe instanciar. O Factory Method permite a uma classe deferir a instanciação para subclasses”.

Exemplo de Implementação

Segue abaixo um exemplo de implementação em Java utilizando o Padrão Factory Method. Inicialmente define-se abaixo os produtos abstratos e concretos que serão usados pela factory.

Listagem 1: Exemplo de implementação dos produtos

public abstract class Pessoa {

	public String nome;
	public String sexo;

}

class Homem extends Pessoa {
	
	public Homem(String nome) {
		this.nome = nome;
		System.out.println(“Olá Senhor ” + this.nome);
	}
}

class Mulher extends Pessoa {
	
	public Mulher(String nome) {
		this.nome = nome;
		System.out.println(“Olá Senhora ” + this.nome);
	}

}

Acima temos a implementação da primeira parte do padrão Factory Method. Nesse exemplo criou-se os Produtos (abstratos e concretos) que executam a decisão tomada na factory.

Em tempo de execução não sabemos quem será chamado, ao invés de termos if’s e else’s no cliente, temos toda a lógica de decisão na factory que é mostrada abaixo.

Listagem 2: Exemplo de implementação do Method Factory

class FactoryPessoa {

	public Pessoa getPessoa(String nome, String sexo) {
		if (sexo.equals(“M”))
			return new Homem(nome);
		if (sexo.equals(“F”))
			return new Mulher(nome);
	}

}

Abaixo segue um exemplo de execução desse padrão descrito acima:

Listagem 3: Exemplo de implementação do Factory Method em Java

public class TesteApp {
	
	public static void main(String args[]) {
		FactoryPessoa factory = new FactoryPessoa();
		String nome = “Carlos”;
		String sexo = “M”;
		factory.getPessoa(nome, sexo);
	}
}

Acima criou-se uma factory com os dados acima. Baseado na condição “sexo” temos a criação do objeto Homem que faz a saudação correta. Veja que toda a parte de decisão, ou a sujeira, fica tudo na fábrica para que ela possa decidir o que fazer.

Vantagens do Padrão Factory Method

O Factory Method é bastante utilizado em diversos projetos, até mesmo nos casos em que temos apenas um Creator (diagrama acima), pois mesmo nessas condições o padrão nos oferece um meio de desligar a implementação de um Product. Adicionando ou alterando Products isso não irá afetar o Creator, pois eles não estão fortemente ligados.

Com o padrão Factory Method podemos encapsular o código que cria objetos. É muito comum termos classes que instanciam classes concretas e essa parte do código normalmente sofre diversas modificações, portanto nesses casos usamos um Factory Method que encapsula esse comportamento de instanciação.

Usando o Factory Method temos o nosso código de criação em um objeto ou método, evitando assim a duplicação e além disso temos um local único para fazer manutenção. O padrão também nos dá um código flexível e extensível para o futuro.

Conclusão

Como foi possível estudar neste artigo, o padrão Factory Method oferece um modo de encapsular as instanciações de tipos concretos. O Creator nos oferece um método para criação de objetos, os demais métodos operam em cima das subclasses de Creator, ou seja, os ConcreteCreator, fabricados pelo factoryMethod. Além disso apenas os ConcreteCreator implementam o método de fábrica e criam Products como pode-se observar no diagrama de classe do padrão.

Bibliografia

  • Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra. Head First Design Patterns. O’Reilly Media, 2004.
  • Gamma, E., Helm, R., Johnson, R., Vlissides, J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley, 2010.

 

Fonte: http://www.devmedia.com.br/padrao-de-projeto-factory-method-em-java/26348

Sistemas de Banco de Dados 6ª Edição – Elmasri

 

sistemas-de-banco-de-dados-6

Download Sistemas de Banco de Dados 6ª Edição Elmasris

Referência acadêmica tanto teórica como prática, Sistemas de banco de dados apresenta os aspectos mais importantes não apenas dos sistemas, mas também das aplicações de banco de dados, além de diversas tecnologias relacionadas ao assunto.

Atualizada, a obra aborda:
– Conceitos fundamentais para projetar e usar os sistemas de banco de dados.
– Fundamentos de modelagem e de projeto de banco de dados.
– Linguagens e modelos fornecidos pelos sistemas de gerenciamento de banco de dados.
– Técnicas de implementação do sistema de banco de dados, com exemplos práticos.
Indicado para os cursos de ciências da computação, desenvolvimento de sistemas, sistemas de informação e engenharia da computação, este livro é também bibliografia básica para cursos de análise de redes, análise de sistemas e processamento de dados.

Sumário
Parte 1. Introdução aos bancos de dados.
1. Bancos de dados e usuários de banco de dados.
2. Conceitos e arquitetura do sistema de banco de dados.

Parte 2. Modelo de dados relacional e SQL.
3. O modelo de dados relacional e as restrições em bancos de dados relacionais.
4. SQL básica.
5. Mais SQL: Consultas complexas, triggers, views e modificação de esquema.
6. Álgebra e cálculo relacional.

Parte 3. Modelagem conceitual e projeto de banco de dados.
7. Modelagem de dados usando o modelo de Entidade-Relacionamento (ER).
8. O modelo de entidade-relacionamento estendido (EER).
9. Projeto de banco de dados relacional por mapeamento de ER e EER para relacional.
10. Metodologia prática de projeto de banco de dados e uso de diagramas UML.

Parte 4. Objeto, objeto-relacional e XML: conceitos, modelos, linguagens e padrões.
11. Bancos de dados de objeto e objeto-relacional.
12. XML: Extensible Markup Language.

Parte 5. Técnicas de programação de banco de dados.
13. Introdução às técnicas de programação SQL.
14. Programação de banco de dados Web usando PHP.

Parte 6. Teoria e normalização de projeto de banco de dados.
15. Fundamentos de dependências funcionais e normalização para bancos de dados relacionais.
16. Algoritmos de projeto de banco de dados relacional e demais dependências.

Parte 7. Estruturas de arquivo, indexação e hashing.
17. Armazenamento de disco, estruturas de arquivo básicas e hashing.
18. Estruturas de indexação para arquivos.

Parte 8. Processamento de consulta, otimização e ajuste de banco de dados; 19. Algoritmos para processamento e otimização de consulta.
20. Projeto físico e ajuste de banco de dados.

Parte 9. Processamento de transações, controle de concorrência e recuperação; 21. Introdução aos conceitos e teoria de processamento de transações.
22. Técnicas de controle de concorrência.
23. Técnicas de recuperação de banco de dados.

Parte 10. Tópicos adicionais de banco de dados: segurança e distribuição
24.Segurança de banco de dados
25. Bancos de dados distribuídos.

Parte 11. Modelos, sistemas e aplicações de bancos de dados avançados.
26. Modelos de dados avançados para aplicações avançadas.
27. Introdução à recuperação de informações e busca na Web.
28. Conceitos de data mining.
29. Visão geral de data warehousing e OLAP; Apêndices; Bibliografia; Índice remissivo.

Estilo: Curso
Tamanho: 131 mb
Ano de Lançamento: 2011
Idioma: Português – BR
Formato: Rar / Pdf
Hospedagem: Depositfiles / Freakshare / Bitshare

Depositfiles Download
Freakshare Download

Freakshare Bitshare

 

Fonte: http://www.sempredownloadfull.net/sistemas-de-banco-de-dados-6-edico-elmasri.html

JAVA Agent Development Framework

JADE (Java Agent DEvelopment Framework) é um software Framework totalmente implementado na linguagem Java. Ele simplifica a implementação de sistemas multi-agente através de um meio-ware que está em conformidade com as especificações do FIPA e através de um conjunto de ferramentas gráficas que suportam as fases de depuração e implantação. Um sistema baseado em JADE podem ser distribuídos em máquinas (que nem sequer precisam compartilhar o mesmo sistema operacional) ea configuração pode ser controlada através de uma GUI remoto . A configuração pode ser alterada mesmo em tempo de execução movendo agentes de uma máquina para outra, como e quando necessário. JADE é completamente implementado em linguagem Java eo requisito de sistema mínimo é a versão 5 do JAVA (o ambiente de tempo de execução ou o JDK).

Além da abstração agente, JADE fornece uma simples, mas poderosa execução de tarefas e modelo de composição, peer to peer comunicação do agente com base na mensagem assíncrona passando paradigma, um serviço de páginas amarelas de apoio publicar inscrever mecanismo de descoberta e muitas outras características avançadas que facilita o desenvolvimento de uma Sistema distribuído.

Graças à contribuição do projecto LEAP, versões ad hoc de JADE existem projetado para implantar agentes JADE transparente em diferentes ambientes orientados para Java, como dispositivos Android e J2ME-CLDC MIDP 1.0 dispositivos.
Além disso, podem ser especificadas configurações adequadas para executar agentes JADE em redes caracterizadas por conectividade parcial incluindo NAT e firewalls, bem como cobertura intermitente e alterações de endereço IP.

JADE é um software livre e é distribuído pela Telecom Italia , titular dos direitos de autor, em código aberto sob os termos e condições da licença LGPL (Lesser General Public License versão 2). Além da equipe JADE, no entanto, uma comunidade bastante grande de desenvolvedores se reuniram em torno da JADE Framework nestes anos. Qualquer pessoa que esteja disposta a contribuir para esta comunidade, relatando bugs, fornecendo correções e contribuições ou simplesmente comentários e sugestões, é mais que bem-vinda.

Telecom Italia reconhece que este projecto é parcialmente suportado pelo MIUR italiana através do Te.SCHe.T. Projeto.

Tipos de índice – PostgreSQL

O PostgreSQL disponibiliza vários tipos de índice: B-tree (árvore B), R-tree (árvore R), hash [1] e GiST. Cada tipo de índice utiliza um algoritmo diferente, mais apropriado para tipos diferentes de consulta. Por padrão, o comando CREATE INDEX cria um índice B-tree, adequado para a maioria das situações comuns.

Os índices B-tree podem tratar consultas de igualdade e de faixa, em dados que podem ser classificados em alguma ordem. Em particular, o planejador de comandos do PostgreSQL leva em consideração utilizar um índice B-tree sempre que uma coluna indexada está envolvida em uma comparação utilizando um dos seguintes operadores:

<
<=
=
>=
>

As construções equivalentes a combinações destes operadores, tais como BETWEEN e IN, também podem ser implementadas com procura de índice B-tree (Mas deve ser observado que IS NULL não é equivalente a = e não é indexável).

O otimizador também pode utilizar um índice B-tree nos comandos envolvendo os operadores de correspondência com padrão LIKE, ILIKE, ~ e ~*, se o padrão estiver ancorado ao início da cadeia de caracteres como, por exemplo, em col LIKE ‘foo%’ ou col ~ ‘^foo’, mas não em col LIKE ‘%bar’. Entretanto, se o servidor não utilizar o idioma C, será necessário criar um índice com uma classe de operadores especial, para dar suporte a indexação de consultas com correspondência com padrão. Consulte a Seção 11.6 adiante.

A consulta abaixo mostra o idioma. [2]

=> \pset title Idioma
=> SELECT name, setting FROM pg_settings WHERE name LIKE 'lc%';

            Idioma
    name     |    setting
-------------+----------------
 lc_collate  | pt_BR.iso88591
 lc_ctype    | pt_BR.iso88591
 lc_messages | pt_BR.iso88591
 lc_monetary | pt_BR.iso88591
 lc_numeric  | pt_BR.iso88591
 lc_time     | pt_BR.iso88591
(6 linhas)

Os índices R-tree são adequados para consultas a dados espaciais. Para criar um índice R-tree deve ser utilizado um comando da forma:

CREATE INDEX nome ON tabela USING RTREE (coluna);

O planejador de comandos do PostgreSQL considera utilizar um índice R-tree sempre que a coluna indexada está envolvida em uma comparação utilizando um dos seguintes operadores:

<<
&<
&>
>>
@
~=
&&

(Consulte a Seção 9.10 para conhecer o significado destes operadores).

Os índices hash podem tratar apenas comparações de igualdade simples. O planejador de comandos do PostgreSQL considera utilizar um índice hash sempre que a coluna indexada está envolvida em uma comparação utilizando o operador =. O seguinte comando é utilizado para criar um índice hash:

CREATE INDEX nome ON tabela USING HASH (coluna);

Nota: Os testes mostraram que os índices hash do PostgreSQL não têm desempenho melhor do que os índices B-tree, e que o tamanho e o tempo de construção dos índices hash são muito piores. Por estas razões, desencoraja-se a utilização dos índices hash.

Os índices GiST não são um único tipo de índice, mas em vez disto uma infraestrutura dentro da qual podem sem implementadas muitas estratégias de indexação diferentes. Assim sendo, os operadores em particular com os quais o índice GiST pode ser utilizado variam dependendo da estratégia de indexação (a classe de operadores). Para obter mais informações consulte a Capítulo 49.

O método de índice B-tree é uma implementação das árvores B de alta-simultaneidade de Lehman-Yao. O método de índice R-tree implementa árvores R padrão utilizando o algoritmo de partição quadrática de Guttman. O método de índice hash é uma uma implementação do hashing linear de Litwin. São mencionados os algoritmos utilizados somente para indicar que todos estes métodos de índice são inteiramente dinâmicos, não necessitando de otimização periódica (como é o caso, por exemplo, dos métodos de acesso hash estáticos).

Notas

[1] hashing — valor de identificação produzido através da execução de uma operação numérica, denominada função de hashing, em um item de dado. O valor identifica de forma exclusiva o item de dado, mas exige um espaço de armazenamento bem menor. Por isso, o computador pode localizar mais rapidamente os valores de hashing que os itens de dado, que são mais extensos. Uma tabela de hashing associa cada valor a um item de dado exclusivo. Webster’s New World Dicionário de Informática, Brian Pfaffenberger, Editora Campus, 1999. (N. do T.)
[2] Exemplo escrito pelo tradutor, não fazendo parte do manual original.

Fonte: http://pgdocptbr.sourceforge.net/pg80/indexes-types.html

Framework Open MCT – NASA

Open MCT é um sistema de controle de missão, de última geração, sendo desenvolvido no Centro de Pesquisa Ames da NASA no Vale do Silício, em colaboração com o Jet Propulsion Laboratory.

Web-based, para desktop e móvel.

Open-MCT.Browse.Layout-3

O QUE É OPEN MCT?

Open MCT é um sistema de controle de missão, de última geração, para visualização de dados em computadores e dispositivos móveis. É desenvolvido na NASA Ames Research Centerem colaboração com o Jet Propulsion Laboratory, e está sendo usado pela NASA para análise de dados de missões espaciais, bem como o planejamento e operação de sistemas rover experimentais. Como um framework de código generalizado e aberto, Open MCT poderia ser usado como base para a criação de aplicativos para o planejamento, operação e análise de quaisquer sistemas de produção de dados de telemetria.

Open MCT é projetado para atender as necessidades em rápida evolução de sistemas de controle de missão. Na NASA, os requisitos para Open MCT estão sendo impulsionado por uma necessidade de apoiar operações distribuídas, o acesso a dados em qualquer lugar, visualização de dados para análise nave espacial que abrange várias fontes de dados e reconfiguração flexível para suportar múltiplas missões e casos de uso do operador. Open MCT reúne muitas das funções de operações de missão, aliviando a necessidade de operadores para alternar entre diferentes aplicativos para ver todos os dados necessários.

Para saber como começar a usar e estender Open MCT, consulte a nossa página de Introdução , e nossa documentação .

Fonte da pesquisa:  https://nasa.github.io/openmct/

Desenvolvendo APIs para Back-Ends Com o IBM API Connect

 

strong-framework

IBM API Connect é uma solução completa que aborda todos os aspectos do ciclo de vida da API. Oferece recursos abrangentes para criar, executar, gerenciar, proteger e monetizar APIs e microservices. Proporcionando uma experiência de utilizador incomparável, integrada, permite uma rápida implantação e administração simplificada de APIs.

Usando ferramentas baseadas em modelos automatizados, a IBM API Connect Deleoper pode facilmente descobrir APIs existentes e back-end fontes de dados e criar novas APIs e microservices baseado no popular open-source quadros Node.js Express e LoopBack® -tudo gerido a partir de um único console unificado.

Com o IBM API Connect, você pode ter uma API ao vivo instalado e funcionando em apenas alguns minutos.

Basta seguir estes passos!

Antes de começar, certifique-se de ter o seguinte:

Instale API Ligação

Para chegar API Connect a partir NPM, execute o seguinte na linha de comando:

$ npm install -g apiconnect

 

Crie seu projeto Conectar API

Para começar a criar seu projeto API de conexão, execute o seguinte e siga as instruções. Isto irá criar um diretório que contém um projeto Conectar API básico chamado ‘apic-getting-started’:

 

$ apic loopback

 

Agora siga os passos:

 

   _-----_
    |       |    .--------------------------.
    |--(o)--|    |  Let's create a LoopBack |
   `---------´   |       application!       |
    ( _´U`_ )    '--------------------------'
    /___A___
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `


[?] What's the name of your application? apic-getting-started
[?] Enter name of the directory to contain the project: apic-getting-started


[?] What kind of application do you have in mind?
empty-server (An empty LoopBack API, without any configured models or datasources)
hello-world

 

Execute o Designer API

Em seguida, navegue até o diretório do projeto e abra o Designer API para começar a trabalhar com o nosso projeto:

$ cd apic-getting-started
$ apic edit

Express server listening on http://127.0.0.1:9000

 

O Designer API vai começar localmente, em seguida, abra a interface do usuário no navegador padrão. Se você não estiver conectado ao IBM Bluemix, você será solicitado a efetuar login com uma conta existente, ou para se inscrever para uma nova conta.

Uma vez que você está logado, o Designer API irá apresentar o separador ‘APIs’. Você verá uma API já foi criado para você.

 

strong2

Criar um novo modelo de dados

modelos de dados representam recursos que podem ser consumidos e expostos por suas APIs. Estes modelos estão ligados a fontes de dados, tais como bancos de dados, serviços externos, como e-mail, e até mesmo outras APIs.

Vamos definir um novo modelo de dados.

  1. Clique ‘modelos’ no top navbar
  2. Clique no botão “+ Adicionar”.
  3. Quando solicitado, digite o nome do ‘cliente’ para o novo modelo de dados.

 

strong3

 

  1. Clique no botão “Novo”. As configurações do modelo de dados será exibida.

Personalize o seu modelo de dados

Observe o padrão Modelo de Base é ‘PersistedModel’.Isso significa que esse modelo de dados representa um registro de banco de dados. Ele também tem uma fonte de dados chamada ‘db’. Este é o banco de dados padrão na memória.

Neste exemplo, estamos criando registros de clientes, portanto, quaisquer operações realizadas no modelo de dados “cliente” vai agir sobre registros armazenados no ‘db’ Fonte de Dados.

Vamos fazer algumas modificações no seu modelo de dados:

 

stron4

  1. Se ele não estiver selecionado, escolha a opção ‘Público’.
    Isso cria automaticamente um ponto final API de acesso público chamado “/ clientes ‘com CRUD padrão (criar, ler, atualizar, excluir) operações. Por exemplo, uma solicitação GET para ‘/ clientes’ irá retornar um conjunto de registros de clientes de ‘db’.
  2. Em “Propriedades”, clique no botão ‘+’ para adicionar uma nova propriedade para o modelo de dados.
    • Defina o campo “Nome da propriedade ‘para’ nome ‘.
    • Selecione «necessária». Isso vai exigir todas as instâncias para ter esse conjunto de propriedades.
    • Escolha ‘Tipo’ de ‘string’.
  3. Clique no ícone Salvar. Este é um ícone de disquete no canto superior direito da tela.

Comece o seu API

API Ligue o torna fácil de executar e testar as alterações à sua API localmente. Basta fazer o seguinte:

  1. Clique em “Todos os modelos ‘para retornar para a página de’ modelos ‘.
  2. Clique no botão “Executar”.
  3. Clique no botão “Iniciar”. Uma vez que a API foi iniciado, o endereço local onde ele está sendo executado será exibido.

strong5

Explore a sua API

Agora você pode enviar pedidos diretamente a esta API, ou usar a API Ligação Explorer. O Explorador de oferecer uma interface de usuário para uso fácil que permite visualizar todas as operações e endpoints de sua API.

Para abrir o Explorer, clique no botão “Explorar”.

 

strong6

 

Características do Explorador incluem:

  • lista navegável de todos os terminais de API e operações.
  • A documentação completa
  • solicitações de amostras, incluindo cURL e API Ligação SDKs.
  • Possíveis respostas

Para testar os terminais REST diretamente no seu navegador web, role para baixo no painel direito e em Parâmetros clique em Gerar para gerar dados fictícios.Você pode editar os valores na seção de dados instância do modelo. Em seguida, clique em chamada de Operação. A primeira vez que você fizer isso, você pode ver um erro devido a um certificado não confiável.Quando isso ocorre, clique no link fornecido na mensagem de erro na API Explorer para aceitar o certificado; em seguida, você pode continuar a chamar as operações no seu navegador web.

 

Experimente!

Uma vez que sua API está funcionando, você pode testá-lo usando as amostras de código fornecidas, ou testá-lo direito dentro do Explorer. Para testar um ponto final com o Explorer, basta navegar até o ponto final que você quer tentar, defina os parâmetros do pedido, e clique no botão ‘operação de call’.

 

strong7

Publique sua API

Agora que você já tentou executar o seu API localmente, é hora de publicá-lo. API Connect suporta a publicação de seu API para serviços que suporta um tempo de execução Node.js, e em breve irá incluir IBM Bluemix também.

Para obter instruções completas sobre como publicar seu API, consulte a documentação IBM:

A publicação do CLI

Publishing e estadiamento do GUI API Designer

 

Gerando Hash do Facebok

Em determinado  momento do processo, você precisará gerar um hash, para criar uma relação de confiança entre a sua aplicação e o login do facebook. Então segue o melhor e mais simples tutorial que encontrei na internet:

Para saber mais: Clique aqui

 

Mais de 600GB de material para estudo em TI: Cursos, vídeo aulas, livros, apostilas de todas as variantes da Tecnologia da informação:

 60 GB em vídeos aulas de Java 16 DVDS – Senha = pr0mp7.torrent

Tamanho:153 KB
https://mega.co.nz/#!JRgjRLBT!nNg8JO31WWskPXH96xn1efu9mZqfgM%20jVZo24v6CAiLg

Livro Python para Pentester e Hackers

https://mega.nz/#!atQHACib!jff1wMGqCDMq1s8CjGWcbLDAcgol53DXvWYrwehV6tE

Curso de PHP

https://mega.nz/#F!WJVmQI4K!oosRA55mOWFMGR5qu9ssJg

Curso DreamWeaver

https://mega.nz/#F!AUhkiSpK!HlSxR0lexLecXjCowGG3AQ

Curso de Redes

https://mega.co.nz/#F!hZxDHLIZ!Pw8xfRmJirbL9Jvvip_iKw

Segurança em Redes

https://mega.co.nz/#F!cdQWjA5S!cX1sn4-sDpl1iWTH2b8-8w

Banco de Dados

https://mega.co.nz/#F!4R4ywJYb!-QLSTcDQ7GyhLeauC9HOlA

Curso de Eletrônica

https://mega.co.nz/#F!EYplFZRJ!Hd3g53t4SWuZ_ocF1fGLaw

Curso de JOOMLA completo

https://mega.co.nz/#F!kAohEChQ!C0XDspJDpw7tVxAgZizcaw

Curso de Linux

https://mega.co.nz/#F!YNI3kS5R!VsbYhu0sYIidqlKwwnH14Q

Curso Hardware

https://mega.co.nz/#F!EBAUCBDC!M2L3z07ypj05HtAQSeXkGA

Mega pacote de cursos Alura

https://mega.nz/#!FhxXwK7K!-Kzt-IDBs-rhVWC1_DgaULd7vSkZG7dWULCi_99kiOY

Curso Wireless Hacking

https://mega.co.nz/#F!AFJm2TLK!I6f4pZSX2ltoGBs0b1ztsQ

Curso WordPress

https://mega.co.nz/#F!cBIUBDTZ!Qtx1ahx-YeXUPdzIghwatA

Engenharia de software

https://mega.co.nz/#F!gUAmjbpD!BW7cylJHD_rcO1rryJ1sVQ

Hacking

https://mega.co.nz/#F!ER53kboI!H2RKhe5oMegv0APK2cQoFQ

https://mega.co.nz/#F!9QhWHbTI!oarMp7t3tzyY_yu08KHoEQ

Hardware

https://mega.co.nz/#F!oIZW3AzQ!LqcZV5fNLLmsxKfXAl6EtA

Introdução aos Sistemas Operacionais

https://mega.co.nz/#F!oZpVgbTR!MnX35yBQTexHPm4J8nIP2A

Linux

https://mega.co.nz/#F!YNg3xYhY!KQxsOV5rOF4ZhZm5LaiTwQ

Linux Essentials

https://mega.co.nz/#F!sBZhXDAI!NCWJslFznUXBaymdg_kmuA

Lógica de Programação Usando Python

https://mega.co.nz/#F!QAZ31aYY!JtCs0a5who41VK3jNsBa4Q

OYS pentest – Curso Teste de Invasão em Redes e Sistemas

https://mega.co.nz/#F!dVQkDTIQ!MLNKb5ZELHuIarpqHA0HxQ

Programação WEB

https://mega.co.nz/#F!AQQU3LYI!MIYAsxFZtfFTxpIqfHfIBg

Redes

https://mega.co.nz/#F!NMh1SZQC!5CKtEXGJy2JrIafPhvUuew

Segurança

https://mega.co.nz/#F!MN402QIb!_S4Jg-opFAFQVtl3lR4yJQ

Sistemas Operacionais

https://mega.co.nz/#F!JJAVwQAC!FB-jqhynRl_3CUuNzt7oMw

Software Livre

https://mega.co.nz/#F!EMgUkKxI!Wmv2SRC5bQNiLaZdbNBa9w

Teste de Invasão em Redes Sem Fio

https://mega.co.nz/#F!AUQwgIpa!NFW83TBeph3-7A7-LZqy4Q

Apostila HTML CSS

https://mega.co.nz/#!8FpXjbKB!11EMXK2wdfH3OC5BseR0PMbT9MYSGO%20tMtJrfiv5umEE

Artigo – wireshark

https://mega.co.nz/#!pc43VIpR!qy50wLU0yM7TsaeJtNu7RdaFw88BId%20VmDxCqd_E7ouQ

Curso Android Básico

https://mega.co.nz/#!pRAglZqB!hxJ9kG6dvUVukuT5tKQFMzf7_2jKdx%20V4SjM-IFzl2ns

Curso Banco de dados SQL e Modelagem

https://mega.co.nz/#!QYZSlCLB!FudRrApaiBV1oshkcHo2Rm38KeKSk1%20i_WN_0G84Q41M

Curso completo de Python

https://mega.co.nz/#!pEwA1IBL!REq1z_rnrc-ttqhEI-aGnxHcxc__0x%20gix5F98CwCkKI

Curso Linux

https://mega.co.nz/#!JIxVgYTZ!2aVR4SMtttlGoaEbTl7NGXa8n_VuhE%20K9XzjrlchSqss

Curso ipv6

https://mega.co.nz/#!xd50wAjA!sXt5m6tdZkZ_0ppNw7RKAw9gWgNYsM%20qVR12tr9FoTvM

Hackeando Mentes

https://mega.co.nz/#!kIBzmYAQ!VEYe_yI1Q6xBBsq_m5yvv_eIG3DH3n%20Xbp2AKkqLly88

Hacker inside

https://mega.co.nz/#!9ZgSyCCY!sBTV9Mva-fCYw5QKF0TkJfolcDsuox%20KqadjDqrjQTIM

Kevinmitnick a arte de enganar

https://mega.co.nz/#!INJglDRQ!H1KGBLTP9pEWtfZrp5VAbspu0Uo_Me%20_hkvtNh4B3Dm0

Banco de dados

https://mega.nz/#F!edRGmCIC!RS7TIjy7Krd4blcpLk2_hw

Computação Forense

https://mega.nz/#F!LVZgyKxT!0UEl9uphWKK5XN2iHo2ZTg

Curso inglês

https://mega.nz/#F!rMQW2CiD!nUNJvZ1nIeRHBMx33Vw8oQ

DeepWeb

https://mega.nz/#F!SdACSJSL!ck9c2S2FvjdI-L1ji-8JkQ

Edição de imagens

https://mega.nz/#F!vFIGFBpI!eRnEOpNziIS_mZx4IAIUsg

Engenharia de software

https://mega.nz/#F!ScwiGDhY!mFZz6mdkPMGVs5_6ZPOQeQ

Hacking

https://mega.nz/#F!vVoUhSrY!CCRwM3BC7U31BaAFZHl5SQ

Introdução a sistemas operacionais

https://mega.nz/#F!3doigIaC!pbDI81QC_3K2sD-Y08i1_g

Microsoft office

https://mega.nz/#F!KE4h2KQJ!ARugbDhPAqm9WWet6R606g

Normas para a apresentação de trabalhos acadêmicos

https://mega.nz/#F!2YpWWYrQ!njzFN2wdEjcL-n48ouCwvA

Programação WEB

https://mega.nz/#F!Lc4jwILR!YjIOrB8spSKjbwHmNvP8hQ

Redes

https://mega.nz/#F!vdIXgCRB!LpBx2GGbuthGu7FLHL5CsA

Segurança

https://mega.nz/#F!bFgHiBZB!XHC6bDoVYO3JEMJzf3pPmg

Sistemas operacionais

https://mega.nz/#F!fBxDULYK!g6jOZV3cjXwLYzuWhqCUnA

Software Livre

https://mega.nz/#F!HFABDDgQ!eH-cL2wdBu5y_fbY8yV78A

Teoria da computação

https://mega.nz/#F!rRwjTSiC!QOCkako5vL8sIarKYrZHPA

Vídeo aulas

https://mega.nz/#F!iJgkhDRI!LcvTfLA5rRUe1fwdqa1BUA

São tantos cursos que não dá nem pra mencionar aqui do que eles tratam, mas tem coisa muito boa lá, e grande parte deles são bem atuais, tratando sobre Web, Deepweb, Programação, Pentest, Hacker, Linux. Office, Idiomas, e muitos mais.

+BONUS DE MAIS 380GB em cursos ainda não catalogados:

https://mega.co.nz/#F!98cg2TSR!1q1OctEo3sOq25J11JAbOg

https://mega.nz/#F!V55BFDbD!3cBs3zMuk168LXfhfRmm-g
https://mega.nz/#F!wVsCjS7A!K7jrAMW6b7RX_AC6TT3msA!tZcAXCrK
https://mega.nz/#F!mIcTSRgJ!or6uaG2MJdh4jEKuHPYo_g!SAEDHBbB
https://mega.nz/#F!wVsCjS7A!K7jrAMW6b7RX_AC6TT3msA!ARcBlRhZ
https://mega.nz/#F!WJVmQI4K!oosRA55mOWFMGR5qu9ssJg
https://mega.nz/#F!wVsCjS7A!K7jrAMW6b7RX_AC6TT3msA
https://mega.nz/#F!WcBzgZhK!pJ1WsYkq8Evo1EhJi5oiJA
https://mega.nz/#F!mBB1BSrJ!RPojuKs757rJAIk-hVo4vw

https://mega.nz/#F!khhRAbwa!W5xZdG5Yat_y10Em_rmCng

https://mega.nz/#F!AE9GlDRT!mQQ1laUDxLw52-q1DljDsg

https://mega.nz/#F!CV9WFJYK!cjNuwXYg5wm6rc0YZTqaIg

https://mega.nz/#F!YF12iJ6B!933zM4O_EAxQWR16jC7I3Q

https://mega.nz/#F!ml8xGDYT!8LXsPyDMvQj8jWaM1k4rYQ

https://mega.nz/#F!tsNijbTR!Qj–39YrI4RsIwu6NTrfTQ

http://suporteninja.com/mais-de-300gb-de-cursos-em-ti-para-download-no-mega/

( Na verdade tem mais de 600GB de conteúdo)

5 Erros de Padrão ao Desenvolver com Angular.js

Quando realmente comecei a trabalhar com Angular.js, achava incrível a capacidade de escrever qualquer coisa, resolver qualquer problema, sem muitos erros durante a fase de prototipação. O Angular simplesmente não dá erro, é impressionante como você pode escrever um verdadeiro spaguetti.js que tudo funciona, em termos.

O problema do macarrão.js está na fase em que você precisa crescer seu code, imagina um sistema com várias rotas, módulos, diretivas, services, etc.. Vou mostrar abaixo um exemplo da organização por features, recomendada por um dos maiores evangelistas sobre angular do mundo, John Papa.

  • Login
    • app.login.js
    • login.factory.js
    • login.service.js
    • …etc…
  • Dashboard
    • app.dashboard.js
    • dashboard.factory.js
    • dashboard.service.js
    • …etc…
  • Clientes
    • app.cliente.js
    • cliente.factory.js
    • cliente.service.js
    • …etc…

Além de organizar nossas pastas por features, você terá que evoluir, testar e dar manutenção. Se não seguir alguns padrões de desenvolvimento, com certeza terá alguns probleminhas [=

Baseando-me no style guide para Angular.js escrito por @johnpapa, resolvi apontar 5 erros de padrão, que na minha opnião, são os mais críticos para quem está começando com Angular.

#1 – Princípio da responsabilidade única

Primeira regra

  • Defina um componente por arquivo

O exemplo abaixo define um módulo app e sua dependência (ngRoute), controlador, factory tudo no mesmo arquivo.

/* evitar */
angular
      .module('app', ['ngRoute'])
      .controller('SomeController', SomeController)
      .factory('someFactory', someFactory);

function SomeController() { }

function someFactory() { }

Agora o mesmo só que separando em seus próprios arquivos.

/* recomendado */

// app.module.js
angular
      .module('app', ['ngRoute']);
/* recomendado */

// someController.js
angular
      .module('app')
      .controller('SomeController', SomeController);

function SomeController() { }
/* recomendado */

// someFactory.js
angular
      .module('app')
      .factory('someFactory', someFactory);

function someFactory() { }

#2 – IIFE ###Javascript Closures

  • Envolva seus componentes AngularJS em uma “Immediately Invoked Function Expression” – IIFE.

Por que?: Uma expressão invocada imediatamente, ajuda a prevenir colisões fazendo com que variáveis deixem de existir além do esperado no escopo global.

Por que? Quando seu código é minificado e distribuído em um único arquivo, você poderá ter colisões entre nomes de varáveis. O IIFE irá proteger, promovendo um escopo de variáveis para cada arquivo.

/* evitar */
// logger.js
angular
    .module('app')
    .factory('logger', logger);

// a função logger é adicionada como uma variável global
function logger() { }

// storage.js
angular
    .module('app')
    .factory('storage', storage);

// a função storage é adicionada como uma variável global 
function storage() { }
/**
* recomendado 
*
* com 'use strict' as variáveis trabalham de forma isolada
*/

// logger.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('logger', logger);

    function logger() { }
})();

// storage.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('storage', storage);

    function storage() { }
})();

#3 – Diretivas – Crie uma diretiva por arquivo, com o mesmo nome.

Por que?: É muito mais fácil juntar tudo em um arquivo só, porém difícil de dar manutenção e reutilizar em diferentes módulos.

/* evitar */
/* directives.js */

angular
    .module('app.widgets')

    /* uma diretiva específica */
    .directive('orderCalendarRange', orderCalendarRange)

    /* uma diretiva que pode ser bastante reutilizada */
    .directive('salesCustomerInfo', salesCustomerInfo)

    /* uma diretiva que pode ser bastante reutilizada */
    .directive('sharedSpinner', sharedSpinner);


function orderCalendarRange() {
    /* implementação */
}

function salesCustomerInfo() {
    /* implementação */
}

function sharedSpinner() {
    /* implementação */
}
/* recomendado */
/* calendarRange.directive.js */

/**
* @doc
* @example 
*/
angular .module('sales.order') .directive('acmeOrderCalendarRange', orderCalendarRange); function orderCalendarRange() { /* implementação */ }
/* recomendado */
/* customerInfo.directive.js */

/**
* @doc
* @example 
*/
angular .module('sales.widgets') .directive('acmeSalesCustomerInfo', salesCustomerInfo); function salesCustomerInfo() { /* implementação */ }
/* recomendado */
/* spinner.directive.js */

/**
* @doc
* @example 
*/
angular .module('shared.widgets') .directive('acmeSharedSpinner', sharedSpinner); function sharedSpinner() { /* implementação */ }

Nota: Existem muitas opções para nomear diretivas, escolha uma que a torne limpa e distinta.

###Prefixo único para a diretiva

  • Forneça um prefixo curto, único e descritivo, como acmeSalesCustomerInfo que é declarado no HTML como acme-sales-customer-info.

Por que?: Um prefixo identifica a origem e contexto da diretiva. Por exemplo um prefixo cc pode indicar que a diretiva foi originalmente criada como parte de “CodeCamper”, tal como acme- pode indicar a diretiva como da empresa “Acme”.

Nota: Evite utilizar ng- pois este prefixo é reservado as diretivas do AngularJS, assim como ion-para o framework Ionic.

#4 – Controllers

###controllerAs View Syntax

  • Ao invés do clássico $scope pra tudo quanto é lado, utilize o controllerAs syntax.

Por que?: Controller são construídos, renovados e provêem de uma instância única. Sendo assim ocontrollerAs é mais próximo de um construtor JavaScript do que $scope.

Por que?: Ele promove o uso de binding com objetos na view através de pontos, ex. customer.nameao invés de name, isto facilita leitura, contexto e evita problemas de referência que ocorrem frequentemente sem uso de “pontos”.

Por que?: Ajuda evitar a necessidade de ficar chamando $parent toda hora em nested controllers.

###controllerAs Controller Syntax

  • Utilize controllerAs ao invés do modo clássico com $scope.

Por que?: controllerAs é sintático e mais contextual que o $scope. Nada muda em relação ao acesso dos métodos do $scope.

Por que?: Ajuda contra a tentação de usar métodos do $scope no controller, quando na verdade poderia estar em uma factory, ou simplesmente não existir. Considere sempre utilizar $scope em um factory, no controlador apenas quando for extremamente necessário. Ex: Quando precisar publicar ou acessar eventos usando $emit, $broadcast ou $on, pense em mover a lógica para uma factory e invocar pelo controller.

/* evitar */
function Customer($scope) {
    $scope.name = {};
    $scope.sendMessage = function() { };
}
/* recomendado - mas tem como melhorar */
function Customer() {
    this.name = {};
    this.sendMessage = function() { };
}

#controllerAs, com “vm”

  • Utilize uma variável de captura quando estiver usando controllerAs syntax. Defina um nome de variável consistente como “vm”, que representa o padrão ViewModel.

Por que?: A keyword this é contextual e quando usado em uma função dentro de um controlador, o mesmo poderá alterar o seu contexto. Capturando o valor de this e atribuindo em outra variável, você continuará tendo acesso ao contexto principal.

/* evitar */
function Customer() {
    this.name = {};
    this.sendMessage = function() { };
}
/* recomendado */
function Customer() {
    var vm = this;
    vm.name = {};
    vm.sendMessage = function() { };
}

Nota: Você pode anular qualquer jshint warning colocando o comentário abaixo.

/* jshint validthis: true */
var vm = this;

Nota: Quando criar watches em um controlador que utiliza controllerAs syntax, você pode observar qualquer membro da variável vm, usando a syntax do exemplo abaixo. (Cuidado ao criar watches pois eles adicionam mais carga ao diggest cycle)

<input ng-model="vm.title"/>
function SomeController($scope, $log) {
    var vm = this;
    vm.title = 'Some Title';

    $scope.$watch('vm.title', function(current, original) {
        $log.info('vm.title was %s', original);
        $log.info('vm.title is now %s', current);
    });
}

#5 – Estrutura das pastas por feature

  • Crie pastas com o nome da feature que ela representa.

Por que?: A estrutura é legível, não existem nomes redundantes e repetitivos. O desenvolvedor consegue localizar rapidamente o código e identificar o que cada arquivo representa.

/**
 * recomendado
 */

app/
    app.module.js
    app.config.js
    app.routes.js
    components/       
        calendar.directive.js  
        calendar.directive.html  
        user-profile.directive.js  
        user-profile.directive.html  
    layout/
        shell.html      
        shell.controller.js
        topnav.html      
        topnav.controller.js       
    people/
        attendees.html
        attendees.controller.js  
        speakers.html
        speakers.controller.js
        speaker-detail.html
        speaker-detail.controller.js
    services/       
        data.service.js  
        localstorage.service.js
        logger.service.js   
        spinner.service.js
    sessions/
        sessions.html      
        sessions.controller.js
        session-detail.html
        session-detail.controller.js

Nota: Utilizar o modelo folder-by-type representado acima, requer um trabalho muito maior para localizar e trabalhar em vários recursos ao mesmo tempo

#Conclusão Para quem está iniciando com Angular.js, seguir estes 5 pontos vai evitar muita dor de cabeça. Porém recomendo intensamente que leia e siga o Style Guide completo de @jhonpapa.

Fonte: http://stpa.co/angularjs/2014/12/23/cinco-erros-de-padrao-ao-desenvolver-com-angular-js.html

Pacote AnomalyDetection – Linguagem R

AnomalyDetection é um pacote de R open-source para detectar anomalias a partir de um ponto de vista estatístico, na presença de sazonalidade e uma tendência subjacente. O pacote AnomalyDetection pode ser usado em grande variedade de contextos. Por exemplo, a detecção de anomalias em métricas do sistema após uma nova versão de software, o envolvimento do usuário postar um teste A / B, ou por problemas na econometria, engenharia financeira, política e ciências sociais.

How the package works

The underlying algorithm – referred to as Seasonal Hybrid ESD (S-H-ESD) builds upon the Generalized ESD test for detecting anomalies. Note that S-H-ESD can be used to detect both global as well as local anomalies. This is achieved by employing time series decomposition and using robust statistical metrics, viz., median together with ESD. In addition, for long time series (say, 6 months of minutely data), the algorithm employs piecewise approximation – this is rooted to the fact that trend extraction in the presence of anomalies in non-trivial – for anomaly detection.

Besides time series, the package can also be used to detect anomalies in a vector of numerical values. We have found this very useful as many times the corresponding timestamps are not available. The package provides rich visualization support. The user can specify the direction of anomalies, the window of interest (such as last day, last hour), enable/disable piecewise approximation; additionally, the x- and y-axis are annotated in a way to assist visual data analysis.

How to get started

Install the R package using the following commands on the R console:

install.packages("devtools")
devtools::install_github("twitter/AnomalyDetection")
library(AnomalyDetection)

The function AnomalyDetectionTs is called to detect one or more statistically significant anomalies in the input time series. The documentation of the function AnomalyDetectionTs, which can be seen by using the following command, details the input arguments and the output of the function AnomalyDetectionTs.

help(AnomalyDetectionTs)

The function AnomalyDetectionVec is called to detect one or more statistically significant anomalies in a vector of observations. The documentation of the function AnomalyDetectionVec, which can be seen by using the following command, details the input arguments and the output of the function AnomalyDetectionVec.

help(AnomalyDetectionVec)

A simple example

To get started, the user is recommended to use the example dataset which comes with the packages. Execute the following commands:

data(raw_data)
res = AnomalyDetectionTs(raw_data, max_anoms=0.02, direction='both', plot=TRUE)
res$plot

Fig 1

From the plot, we observe that the input time series experiences both positive and negative anomalies. Furthermore, many of the anomalies in the time series are local anomalies within the bounds of the time series’ seasonality (hence, cannot be detected using the traditional approaches). The anomalies detected using the proposed technique are annotated on the plot. In case the timestamps for the plot above were not available, anomaly detection could then carried out using the AnomalyDetectionVec function; specifically, one can use the following command:

AnomalyDetectionVec(raw_data[,2], max_anoms=0.02, period=1440, direction='both', only_last=FALSE, plot=TRUE)

Often, anomaly detection is carried out on a periodic basis. For instance, at times, one may be interested in determining whether there was any anomaly yesterday. To this end, we support a flag only_last whereby one can subset the anomalies that occurred during the last day or last hour. Execute the following command:

res = AnomalyDetectionTs(raw_data, max_anoms=0.02, direction='both', only_last=”day”, plot=TRUE)
res$plot

Fig 2

From the plot, we observe that only the anomalies that occurred during the last day have been annotated. Further, the prior six days are included to expose the seasonal nature of the time series but are put in the background as the window of prime interest is the last day.

Anomaly detection for long duration time series can be carried out by setting the longterm argument to T.

Copyright and License

Copyright 2015 Twitter, Inc and other contributors

Licensed under the GPLv3

Link:  https://github.com/twitter/AnomalyDetection

O Maior Hub Brasileiro de APIs

O 99APIs é um hub público com informações sobre APIs abertas do Brasil e do mundo, com o objetivo de proporcionar à comunidade um espaço gratuito e livre para a troca de informações sobre APIs.

É claro, queremos ajudar devs a construírem apps cada vez mais incríveis e empresas a exporem e promoverem suas APIs. A divulgação de APIs no 99APIs é gratuita. Promova suas APIs aqui!

As informações são abertas e a curadoria será realizada continuamente pela equipe Sensedia. O 99APIs conta com as APIs brasileiras mais relevantes e as ”popstars” internacionais e é construído usando a plataforma Smart Canvas da CI&T (http://ciandt.com).

 

http://99apis.com/card/99apis


apis2

DELPHI ANDROID ACESSO DIRETO A BANCO DE DADOS HOSPEDADO COM UNIDAC

Sempre me perguntei como minhas aplicações Android desenvolvidas comDelphi XE7 poderiam acessar diretamente um banco de dados hospedado.

Pois bem, esta semana recebi uma DM no Twitter da DevArt. Eles me convidavam para estudar e comentar a sua suite de componentes de acesso a dados, o UniDAC (Universal Data Access Components). Obviamente pelo que os componentes propõem,  aceitei de primeira, afinal pode ser a solução para a questão que citei acima.

O que é o UniDAC?

O UniDAC é uma solução multi-plataforma para o desenvolvimento de aplicações usando vários IDEs: do RAD Studio, Delphi, C ++ Builder, Lazarus (e FPC) no Windows, Mac OS X, iOS, Android além deLinux e FreeBSD.

IDEs e Plataformas suportadas pelo UniDAC

Trata-se de  uma suíte de componentes que prover banco de dados, suportando alguns dos principais SGBDs (Sistemas de Gerenciamento de Banco de Dados) conhecidos no mercado atual como: MySQL, MS SQL SERVER, Oracle, InterBase, Firebird, PostgreSQL, SQLite, DB2, Microsoft Access, além de outros banco que podem ser acessados através de ODBC.

Como o UniDAC lida com o acesso a dados?

Alguns banco de dados são acessados diretamente, sem a necessidade da biblioteca cliente. De maneira simplificada seria você não precisar distribuir a DLL do banco junto com sua aplicação para que a mesma consiga fazer acesso à base de dados.

Esquema de acesso a dados do UniDAC

Atualmente o UniDAC permite que sua aplicação Mobile ou Desktop possa trabalhar com Oracle, SQL Server, MySQL, PostgreSQL, SQLite, e NexusDB diretamente sem necessidade de biblioteca cliente do BD.

Um banco de dados MySQL  para teste

Para iniciarmos os testes, eu resolvi disponibilizar um banco de dados MySQL de exemplo hospedado em um provedor de internet e as credenciais de acesso serão passadas em nossa conexão mais adiante.

UniDac Acesso MySQL

Conhecendo a Suite UniDAC

Para conhecer um pouco mais sobre os componentes que compõem a suíte do UniDAC clique aqui.

Basicamente,  no nosso exemplo vamos fazer uma aplicação multi dispositivo que irá acessar nosso banco de dados MySQL hospedado num dado provedor de hospedagem. Por ser algo bem simples e apenas para fins de teste vamos abordar apenas 3 componentes:

Componente TUniConnection

TUniConnection  permite configurar e gerenciar a conexão com os diversos SGBDs suportados.

Componente TUniQueryTUniQuery permite a utilização de instruções SQL para recuperação, atualização e inserção dados nas tabelas.

Componente TUniProviderTUniProvider componente base para as ligações entre a aplicação e o SGBD. No nosso caso TMySQLUniProvider.

Hora de colocarmos a mão na massa

Bem vamos iniciar o Delphi XE7, e criar um nova aplicação Multi Device em branco. Nela vamos inserir os componentes da suíte UniDAC retratados acima,  e mais 1 Image, 1 ListView e 1Button, e configurá-los como segue:

  • Image1
    • Align -> Top
    • WrapMode -> Stretch
    • MultiResBitmap -> adicione um imagem a seu gosto.
  • Button1
    • Align -> Botton
    • Text -> ‘Conectar MySQL’
  • ListView1
    • Align -> Client

Ao final do deste processo sua tela terá uma aparência semelhante à imagem abaixo:

Design da Interface de Usuário -  Acesso direto a Banco de dados com UniDAC

E como configurar a suíte UniDAC

Até agora apenas colocamos na aplicação os componentes e como seria a configuração dos mesmos? Será complexo??? Bem já adianto que tudo é muito intuitivo, mas nada melhor do que conferir. Vamos lá!

No nosso componente UniConnection1 vamos alterar as propriedades como segue:

  • ProviderName -> MySQL
  • Porta -> 3306
  • LoginPrompt -> False
  • Server -> vivaitaocara.com.br
  • UserName -> vivai026_exemplo
  • Password -> exemplo

Com essas informações já estamos credenciados a acessar o servidor do MySQL hospedado no provedor, vamos então definir qual banco de dados acessar através da propriedade Database. Ao clicar no seletor a conexão será ativada e o banco de dados vivai026_bdexemplo estará disponível selecione-o.

Este processo também pode ser efetuado através do Connection Editor que pode ser acionado clicando com o botão direto no mouse sobre o componente UniConnection e selecionando esta opção. Veja  na imagem que um Wizard é aberto para alterações por telas mais amigáveis.

TUniConnection - ConnectionEditor

Nota: Desconecte a aplicação alterando a propriedade Connected do UniConnection1 para False. Pois ao selecionar o banco de dados a aplicação se conecta ao servidor e retorna as opções disponíveis, entretanto a conexão permanece ativa impossibilitando que o componente UniQuery1 possa ser testado.

Para nosso componente UniQuery1 vamos configurar as seguintes propriedades:

  • Connection -> UniConnection1
  • SQL –> ‘select * from medicamentos’

Porém ao clicar sobre o botão elipse (reticências) da propriedade SQL do UniQuery1, a janela abaixo será carregada.

UniQuery - SQL Editor

Não vamos entrar em todas as abas disponíveis na janela, vamos nos ater apenas ao comando SQL para efetuar a busca na base de dados para alimentar nossa aplicação. Finalize a janela clicando no botão OK.

Vamos agora configurar agora o clique do nosso Button1, que será responsável por conectar a aplicação e resgatar os dados do servidor preenchendo com eles o ListView1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.ConecClick(Sender: TObject);
var
  lvItem : TListViewItem;
  I: Integer;
begin
  UniConnection1.Close;
  UniQuery1.Open;
  ListView1.Items.Clear;
  ListView1.BeginUpdate;
  for I := 0 to UniQuery1.RecordCount -1 do
    begin
      lvItem := ListView1.Items.AddItem();
      lvItem.Text :=
          UniQuery1.Fields[1].AsString + ' ' +
          UniQuery1.Fields[2].AsString;
      UniQuery1.Next;
    end;
  ListView1.EndUpdate;
  UniConnection1.Close;
end;

Feito isso já podemos executar nossa aplicação. Veja que em Win32a mesma já funciona perfeitamente:

Sem alterar nenhuma linha vamos alterá-la para distribuição na plataforma Android e confira o resultado no vídeo Abaixo:

Video Player

Nota: Por ser uma versão Trial temos uma limitação de 6 campos por dataset (tabelas ou consultas)como exibido em mensagem no vídeo. Lembrando que a versão trial tem validade de 60 dias.
Mensagem de Limitação da versão Trial

TUniProvider sem configuração, mas não sem importância

Concluímos a codificação de nosso exemplo e com isso você pode ter percebido que embora tenhamos incluído em nossa aplicação o MySQLUniProvider1 (TMySQLUniProvider) ele não necessitou nenhuma configuração.

O componente cada provider usa a conectividade nativa específica do SGBD, sendo capazes de realizar as operações CRUD (Create, Read, Update, Delete) considerando automaticamente as particularidades do SGBD selecionado.

 Quer saber a importância do provider nesse caso??? Retire-o do projeto e execute-o novamente! Sem ele toda essa "mágica" não é possível, a menos que você tenha a biblioteca cliente instalada em sua máquina.

Conclusão

Com esse dia de testes cheguei a conclusão que vale muito a investir primeiro seu tempo em conhecer mais os componentes e em se adaptando perfeitamente no seu modelo de projeto por que não investir também financeiramente na aquisição da versão completa do UniDAC, afinal a mesma está sendo vendida no site da DevArtpor aproximadamente US$ 200,00.

Fico por aqui, abaixo links e até a próxima!

UniDAC Versão Trial

UniDAC para compra

Fonte:  http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/delphi-android-acesso-direto-a-banco-de-dados-hospedado-com-unidac

DESENVOLVENDO EM PYTHON- NINJA IDE

NINJA-IDE

É um ambiente de desenvolvimento integrado multi-plataforma (IDE).NINJA-IDE é executado no Linux / X11, Mac OS X e sistemas operacionais de desktop Windows, e permite aos desenvolvedores criar aplicações para diversas finalidades, utilizando todas as ferramentas e utilitários de NINJA-IDE, tornando a tarefa de escrever software mais fácil e agradável.

Editor de código poderosa

editor de código

NINJA-IDE fornece um editor de código completo, com realce para várias línguas, conclusão de código, assistente de código para: importações, navegação, etc. Também é possível estender a funcionalidade editor utilizando plugins.

Locator Código incrível

código Locator

Este recurso permite o acesso rápido e direto para qualquer arquivo, função ou classe dentro de um dos nossos projetos, simplesmente pressionando algumas teclas.Pressionando “Ctrl + K” vamos ver um pop-up ao longo de um campo de texto, onde você pode digitar o nome do que você quer e feito!

Erros e PEP8 Localizador

erros

Realce erros estáticos e PEP8 no documento, você também pode ver que os arquivos que contêm erros PEP8 são mostrados com um ícone na guia onde o arquivo é aberto, e os arquivos que contêm erros estáticos código são mostrados com um ícone de bug nesse guia.

projeto Managment

Projectos de recursos

NINJA-IDE permite gerir Python projeto automaticamente, economizando informações descritivas sobre eles e permitir que o usuário para executar arquivo managment tarefa relacionada no próprio IDE.

Executar projeto e arquivos

Corre

Com NINJA-IDE é possível executar o Project Python ou qualquer arquivo aberto no Editor com apenas um clique. Também é possível tornar um arquivo HTML carregado no Editor do IDE para ver como as mudanças ficaria em um navegador.

Altamente extensível

Integrar

Você pode criar um plug-in para diversas finalidades e pode ser integrado completamente com o IDE, aumentando a funcionalidade disponível para melhorar a assistência para o desenvolvimento de projetos.

Saiba mais: http://ninja-ide.org/