Learn CI: Teste Automatizado e Publicação em 10 min

Aqui está um modelo para iniciar e executar testes automatizados e publicação de código JS cliente ou servidor

Há muitas dependências por aí. Claramente, o mundo precisa de mais testes automatizados. Mas, precisamos nos instalar rapidamente.

Objetivos:
deve ser livre, como em dinheiro.
Deve ter pequena curva de aprendizado, poucas palavras mágicas para aprender!
Deve ser UI grátis. Teste o código do cliente usando o uso de Chrome sem cabeça
Travis CI para testes automatizados, com emblema de aprovação / falha no github
Execute testes em cada commit
Fácil publicação no NPM e URL memorável para incluir scripts em páginas da web

Então, em cada compromisso com o repositório Github :

  1. A Travis CI iniciará sua instância de teste
  2. Instale a última versão do nó e o navegador Chrome
  3. Inicie o Chrome para testes sem cabeça
    (apenas necessários para projetos que sejam clientes JS)
  4. Execute dois exemplos de scripts de teste. Um para testar aplicativos de servidor e outro para navegador JS
    (Um deles pode ser eliminado dependendo se o seu é um aplicativo de nó ou script de cliente)
  5. Mostrar resultado do teste
  6. Publicar no NPM se for bem-sucedido
  7. Mostre os cartões de aprovação / aprovação para o projeto no NPM e no github.

Você pode adicionar / remover para isso conforme necessário, dependendo das necessidades do seu projeto.

Aqui estão todos os arquivos :

Para Travis CI, que hospedará o teste, apenas um  arquivo .travis.yml é necessário.

Se o projeto for um aplicativo de nó e não o cliente JS, você não precisa das peças do Chrome.

Também publicará para npm. Para scripts de clientes, podemos usar um link curto e fácil de lembrar usando unpkg.com

Não há estruturas de teste extravagantes para aprender aqui. Nós simplesmente escrevemos nossos scripts de teste, que lançam erros de falha.

A estrutura de teste é a seguinte , qualquer erro nativo constitui um teste falhado.

Para aplicativos de nó, test-server.js

main.js é o arquivo principal no aplicativo. O que está sendo testado.
Se tivéssemos chamado test_fail, o teste falharia e Travis nos diria assim.

test-browser.js para scripts de clientes.
Como realmente queremos automatizar as coisas, não podemos ter UI. Ninguém estará prestes a clicar nas coisas. Então, o cromo sem cabeça é usado para executar testes.

testchrome , é apenas um invólucro simples na interface remota cromada usada para testes sem cabeça.

Testchrome passa a usar uma API simplificada, apenas
.evaluar (JS no navegador)
.get (JSON de um URL)

Alternativamente, você pode usar os outros módulos de teste de Headless Chrome que estão disponíveis, como o marionetismo.

Conseguir esta configuração localmente em uma máquina pode ser desagradável. Travis CI realmente brilha aqui!

Indo para travisci.org (para reposos públicos) e siga as instruções para configurar seu repo. Conecte seu Travis CI acct ao github e especifique seu repo para teste.

Existe uma configuração necessária no Travis, seu token NPM que permitirá que o Travis publique o aplicativo, em Configurações:

Em seguida, apenas comprometa-se com o repo, ou use o console, para iniciar um teste.

Monitorize seu teste no console do Travis:

e ver resultados

Uma última coisa, o distintivo. Na README.md do repo:

que sempre mostra nosso emblema de aprovação / falha no NPM e no Github.

Finalmente, precisamos de um URL facilmente lembrado (para scripts de clientes). Usando o unpkg.com sem necessidade de configuração adicional, porque ele irá puxar o mais recente do NPM.

<script src = // unpkg.com/reponame> </ script>

Claro, para aplicativos de servidor, simplesmente

npm instalar o reponame

É isso mesmo, para a nossa estrutura que fornece testes e publicação automatizados. Por favor comente com quaisquer pensamentos ou sugestões. O exemplo de repo está em https://github.com/digplan/learn-ci

Testes felizes!

 

Fonte: https://hackernoon.com/learn-ci-automated-test-and-publish-in-10-min-3096717dc81e

Anúncios

Equipes de software de segurança psicológica, tolerância ao risco e alto desempenho

Alguns anos atrás, o Google decidiu pesquisar o que foi o ingrediente chave que fez algumas equipes de software na empresa mais bem sucedidas do que outras . Para sua surpresa, o traço-chave mais correlacionado com as equipes de sucesso não foi a proeza técnica, as personalidades ou os antecedentes educacionais dos membros da equipe. Em vez disso, foi a noção de segurança psicológica – ” uma crença compartilhada dos membros de uma equipe de que a equipe está segura para a tomada de riscos interpessoais “.

Segurança psicológica e cultura tecnológica às probabilidades

A pesquisa do Google mostrou que os membros de uma equipe de software de alto funcionamento compartilham um senso de confiança de que a equipe não vai embaraçar, rejeitar ou punir alguém por compartilhar suas idéias ou falar sua mente. Essa capacidade de assumir riscos e experimentar as idéias da caixa sem medo ou constrangimento leva a idéias e abordagens mais inovadoras que podem parecer estranhas ou até mesmo idiotas no início (alguém se lembra do livro de quadrinhos do Chrome ?).

No entanto, a cultura tecnológica, especialmente como definida pelas lendas de software que surgiram na década de 1980 e 1990, é inversa. Envergonhar as pessoas por idéias que alguém acredita serem precárias como forma de inspirá-las é uma abordagem familiar. Nós temos exemplos como Steve Jobschamando equipes de engenharia “f ** ing dickless a ** holes”, Bill Gates como com sua linha infame favorita “essa é a coisa mais estúpida que já ouvi” e claro, Linus Torvalds, cujos lendários inclui informar os mantenedores do kernel do Linux para “fechar o f ** k” para enviar um patch ruim.

Um ambiente de trabalho em que seu chefe o despreza em público é literalmente o oposto da segurança psicológica. Infelizmente, dado o sucesso da Apple, Microsoft e Linux, nossa indústria tem provas de existência que você pode criar produtos e empresas extremamente bem sucedidas em um ambiente de trabalho tóxico.

O alto custo da falta de segurança psicológica

Há agora um grande conjunto de pesquisas que mostram o impacto de organizações onde um ambiente de trabalho tóxico e estressante regra. Abaixo estão alguns excertos do artigo Harvard Business Review. Prova de que as culturas positivas são mais produtivas

Primeiro, os gastos com cuidados de saúde em empresas de alta pressão são quase 50% maiores do que em outras organizações. A American Psychological Association estima que mais de US $ 500 bilhões são retirados da economia dos EUA devido ao estresse no local de trabalho, e 550 milhões de dias úteis são perdidos a cada ano devido ao estresse no trabalho. Sessenta por cento a 80% dos acidentes de trabalho são atribuídos ao estresse, e estima-se que mais de 80% das visitas ao médico são devidas ao estresse. O estresse no local de trabalho tem sido associado a problemas de saúde que variam de síndrome metabólica a doença cardiovascular e mortalidade.

O estresse de pertencer às hierarquias em si está ligado à doença e à morte. Um estudo mostrou que, quanto menor a classificação de alguém em uma hierarquia, maior as chances de doenças cardiovasculares e morte por ataques cardíacos. Em um estudo em larga escala de mais de 3.000 funcionários conduzido por Anna Nyberg no Instituto Karolinska , os resultados mostraram uma forte ligação entre o comportamento de liderança e a doença cardíaca nos funcionários. Os chefes de estresse são literalmente ruins para o coração.

Há uma série de outras deficiências de não criar um ambiente de segurança psicológica no local de trabalho no artigo, mas eu pensei que a última frase acima realmente leva o ponto para casa. Um chefe que prospera na criação de um ambiente de trabalho de alta pressão está literalmente enviando seus funcionários para uma sepultura precoce.

Estruturas de desmontagem que trabalham contra a segurança psicológica

Entre as equipes, existem estruturas formais e informais que impedem as pessoas de se sentir completamente seguras de confiar e compartilhar todas as suas idéias com a equipe, independentemente de quão inane eles possam parecer ao primeiro. Em muitas empresas, a maior estrutura formal que funciona contra esse senso de confiança é um sistema de revisão de desempenho que usa alguma forma de classificação forçada .

O ranking forçado é quando os gerentes exigiam que os funcionários fossem distribuídos em uma cota fixa de trabalhadores de alto desempenho que sejam bem recompensados, artistas de médio porte que recebem menos recompensas e artistas de baixa qualidade que recebem pouca ou nenhuma recompensa ou despedido. Uma vez que existe um conjunto fixo de 10% de desempenho inferior ou 20% de melhores desempenhos, os funcionários estão basicamente competindo uns contra os outros por seus aumentos em vez de trabalhar em conjunto para o sucesso conjunto. Ninguém quer dar o seu gerente de forragem para colocá-los no final de 10%, compartilhando uma idéia aparentemente idiota , embora isso possa acabar por ser puro gênio se for perseguido .

As estruturas informais que reduzem a confiança entre os membros de uma equipe são mais difíceis de notar, mas limitam a colaboração irrestrita. É fácil dizer que se deve reduzir o snark, o gerenciamento de imagens ou garantir que pessoas particulares não dominem os outros nas discussões, mas são mais difíceis de se retirar. Aqui estão algumas técnicas que podem ajudar as equipes a se aprimorar ao serem inclusivas

  1. Amplificação: reconheça e amplie a fonte de contribuições nas discussões. Isso serve para o duplo propósito de aumentar a visibilidade da idéia de um colega de trabalho e garantir que sua idéia não seja seqüestrada por uma personalidade mais dominante na discussão. Esta técnica é discutida com mais detalhes no artigo. O truque simples que a mulher na Casa Branca usa para parar de ser interrompido .
  2. Desenhando vozes: trabalhe para garantir que todos na equipe tenham a chance de compartilhar suas perspectivas sobre decisões-chave. Em empresas de tecnologia, nós tentamos contratar pessoas inteligentes e capazes, nunca deixemos que elas falem, enquanto o mesmo grupo de pessoas domina as conversas. Muitas vezes, as pessoas que não falaram têm um ponto de vista sobre o problema que é digno de discussão e podem trazer uma nova visão. Esta prática precisa ser equilibrada, de modo que as pessoas não acabem sendo colocadas no local. Em pessoa, você pode ler a sua linguagem corporal para saber se eles estão envolvidos e quer tocar no telefone, enquanto digitalmente (por exemplo, em um canal Slack) você pode perguntar se as pessoas que não compartilharam uma opinião têm uma.
  3. Check-in antes de finalizar as decisões: Muitas vezes, as decisões-chave acabam sendo feitas por um subconjunto da equipe que é mais apaixonado pelo tema. Muitas vezes é uma boa idéia fazer o check-in com o resto da equipe antes de fechar o tópico porque algumas pessoas podem ter algo importante para adicionar, mas não a energia, para participar de um debate completo. Obtendo a tomada de decisão quando as principais partes interessadas chegaram ao consenso, permite que outros membros da equipe se sintam responsáveis ​​pela decisão enquanto estão conscientes de não reabrir discussões sem justa causa.

Segurança psicológica e o paradoxo da tolerância

Um dos temas que eu vi repetidos em linha é como o conceito de segurança psicológica enquanto trabalha em uma equipe escova contra o Paradox da Tolerância . Se você não está familiarizado com esse paradoxo, aqui está um breve trecho da entrada da Wikipédia

Menos conhecido é o paradoxo da tolerância : tolerância ilimitada deve levar ao desaparecimento da tolerância. Se ampliarmos a tolerância ilimitada mesmo para aqueles que são intolerantes, se não estamos preparados para defender uma sociedade tolerante contra o ataque do intolerante, então o tolerante será destruído e a tolerância com eles.

Há pessoas como James Damore em seu Manifesto Anti-Diversidade e Sam Altman em seu post E Pur Si Muove que argumentam que alguns funcionários talentosos não podem sentir segurança psicológica se forem capazes de expressar formas de fanatismo como o sexismo ou a homofobia. Esses argumentos ignoram a segurança psicológica de mulheres talentosas e membros LGBTQ de tais equipes.

A recomendação é direta; seja intolerante à intolerância. Não há espaço para empurrões brilhantes em equipes de alto funcionamento. Nas palavras de Reed Hastings, CEO da Netflix, o custo para o trabalho em equipe efetivo é muito alto .

 

Fonte: https://hackernoon.com/psychological-safety-risk-tolerance-and-high-functioning-software-teams-75701ed23f68

Web Speech API – Reconhecimento de voz com JavaScript

Imagine websites onde os usuários podem navegar pelas páginas ou preencher campos de formulário usando a sua voz e até mesmo interagir com a página enquanto dirige, sem tirar os olhos da estrada.

O reconhecimento de voz tem várias aplicações no mundo real. Muitas pessoas tornaram-se familiarizadas com este conceito graças a softwares como o Siri e S-Voice. Esta aplicação pode melhorar drasticamente a usabilidade dos websites, principalmente para deficientes visuais. Imagine websites onde os usuários podem navegar pelas páginas ou preencher campos de formulário usando a sua voz e até mesmo interagir com a página enquanto dirige, sem tirar os olhos da estrada.

 

 

O que é Web Speech API?

A Web Speech API foi lançada no final de 2012 e permite que os desenvolvedores forneçam a entrada de voz e recursos de saída de texto-para-voz em um navegador web. Esta API cuida da privacidade dos usuários, pois antes de deixar o site para acessar a voz através do microfone, o usuário deve explicitamente conceder a permissão. Curiosamente, o pedido de autorização é o mesmo que a API getUserMedia, apesar de não precisar da webcam. Se a página que executa esta API usa o protocolo HTTPS, o navegador solicita a permissão apenas uma vez.

 

 

Então veremos logo abaixo, um exemplo básico de como podemos implementar esta nova API aos nossos projetos:

Criando a primeira página com reconhecimento de voz:

Passo 1 – Estrutura HTML:

A estrutura HTML é bem simples, vejamos a marcação abaixo:

<p id="ola">Olá tableless, você falou:</p>

<button id=”rect”>Gravar</button> <span id=”unsupported” class=”hidden”>API not supported</span>

Onde:

  • Transcription – Onde se encontrará o texto informando oque o usuário falou
  • Rect – Botão para reconhecer a voz do usuário
  • unsupported – Caso a API não seja suportada pelo browser

Passo 2 – Testando

Como qualquer API, temos que verificar primeiramente se o browser suporta SpeechRecognition:

// Test browser support
window.SpeechRecognition = window.SpeechRecognition ||
window.webkitSpeechRecognition ||
null;

//caso não suporte esta API DE VOZ            
if (window.SpeechRecognition === null) {
    document.getElementById('unsupported').classList.remove('hidden');
}else {
    //......
}

Passo 3 – Métodos e propriedades

Depois de testar a compatibilidade da API, iremos instanciar o reconhecedor de  voz, usando o speechRecognition(). Como o código listado abaixo:

var recognizer = new window.SpeechRecognition();

Este objeto expõe os seguintes métodos:

  • onstart: Define um callback que é disparado quando o serviço de reconhecimento começou a ouvir o áudio com a intenção de reconhecer.
  • onResult: Define um callback que é disparado quando o reconhecedor de voz retorna um resultado.
  • onerror: Define um callback que é acionado quando ocorre um erro de reconhecimento de voz.
  • onend: Define um callback que é disparado quando o serviço foi desligado. O evento deve sempre ser gerado quando a sessão termina, não importa o que a razão.

Iremos criar uma varável que será responsável por exibir o texto que o usuário falou e também iremos definir a propriedade continuous = true, que faz com que o reconhecedor de voz não pare de ouvir, mesmo que tenha pausas do usuário.

var transcription = document.getElementById("transcription");

            //Para o reconhecedor de voz, não parar de ouvir, mesmo que tenha pausas no usuario
            recognizer.continuous = true;

Agora iremos definir a função “onresult” que define um callback que é disparado quando o reconhecedor de voz retorna um resultado.

recognizer.onresult = function(event){
                transcription.textContent = "";
                for (var i = event.resultIndex; i < event.results.length; i++) {
                    if(event.results[i].isFinal){
                        transcription.textContent = event.results[i][0].transcript+' (Taxa de acerto [0/1] : ' + event.results[i][0].confidence + ')';
                    }else{
                        transcription.textContent += event.results[i][0].transcript;
                    }
                }
            }

Vamos analisar este código um pouco mais detalhadamente:

transcription.textContent = “”;    Faz com que limpe o texto que se encontra dentro da “

for (var i = event.resultIndex; i < event.results.length; i++) {  Loop que pecorre o evento que contém o texto que o usuário falou.

Note que dentro deste loop, há uma condição, que verifica se o evento se encontra na última posição (event.results[i].isFinal), caso seja verdadeira, ele irá imprimir todo o texto, junto com a taxa de acerto, que vai de “0” até “1”. Caso seja falsa, ele vai adicionar mais texto na nossa div

Passo 4 – Anexando o evento de click

Agora iremos anexar um evento de click, ao nosso botão, segue 0 código abaixo :

document.querySelector("#rect").addEventListener("click",function(){
                try {
                    recognizer.start();
                  } catch(ex) {
                    alert("error: "+ex.message);
                  }
            });

Onde:

recognizer.start(); – Inicia o record ( a gravação );

catch(ex) {

alert(“error: “+ex.message);

} –  tratamento de log, caso exista, algum erro de gravação

É importante observarmos que o reconhecedor demora um pouco para poder interpretar a sua voz, mais ou menos uns 3 à 4 segundos, esta API ainda está em teste e que infelizmente até agora, só é  suportada no chrome,

Finalizando

Bem pessoal, essa foi uma breve introdução sobre Web Speech API. Futuramente irei trazer mais artigo

Disponibilizei o código no github e também disponibilizei uma demo.

Clique aqui para ver a demo online

Clique aqui, para ir ao código completo.

 

Fonte:https://tableless.com.br/web-speech-api-reconhecimento-de-voz-com-javascript/

 

 

 

 

 

Software para Windows de Eugene Muzychenko

Software comercial

Cabo de áudio virtual (VAC)

Driver de multimídia do Windows que cria um ” cabo virtual ” representado por dois dispositivos de forma de onda, entrada e saída, com ligação interna entre eles. Permite transferência de som direta e intocada entre diferentes aplicativos. Útil para gravar a saída de áudio do aplicativo em tempo real e salvar um fluxo de som de saída de aplicativos que não permitem gravá-lo diretamente no arquivo WAV. VAC é uma “versão de onda” do “cabo de loopback MIDI”, como os drivers Loopback do MultiMid ou do Hubi . Ao contrário do Total Recorder, você pode simplesmente salvar o fluxo de áudio, o VAC permite rotear em tempo real.,Foobar2000 , AIMP , Audacity , Audition , Skype , Flex-Radio etc.).

Cabo de áudio virtual 4 páginas (XP / 2k3 / Vista / Win 7/8 / 8.1 / 10)

Cabo de áudio virtual 3 páginas (9x / ME / NT4 / 2k / XP / 2k3)

Software grátis

Wave Clone

Ferramenta multimídia do Windows para compartilhar as portas Wave (MME) entre várias aplicações. Traz um recurso multi-cliente para qualquer dispositivo Wave. O Wave Clone é uma “versão de onda” dos “complementos de múltiplos clientes MIDI”, como os drivers de Loopback do MultiMid ou do Hubi .

Página Wave Clone (9x / ME / NT4 / 2k / XP / 2k3)

 

Manuais MIDI

Permite dividir seu teclado MIDI em dois manuais independentes (zonas), atribuir-lhes diferentes instrumentos MIDI e tocar as duas mãos ao mesmo tempo, produzindo peças de duas partes. Você não pode fazer isso usando um software de sequenciador popular.

Página de Manuales MIDI  (todos os sistemas)

 

FlushVol

Utilitário para liberar, uma vez ou periodicamente, buffers de arquivos de volume. Funciona como sync.exe de Mark Russinovich, mas enumera todos
os volumes fixos, incluindo montado em NTFS Mount Points . Pode ser instalado como um serviço para iniciar automaticamente e liberar buffers de volume com uma interfal dada.

Baixe FlushVol 1.4.2 (2k / XP / 2k3 / Vista / Win7 / 8/10 )

 

mscetool

O mscetool opera com o arquivo de cabeçalho MSCE dos arquivos WinCE CAB (um arquivo com extensão .000 que descreve o processo de instalação). O principal objetivo desse utilitário é mudar a arquitetura e / ou os campos do número de versão do WinCE no cabeçalho. Existem muitos programas que podem funcionar sob versões específicas do WinCE, mas são distribuídos em arquivos CAB com uma arquitetura forte e os números de versão mínima / máxima especificados.

Faça o download do mscetool 1.0 (2k / XP / 2k3 / Vista / Win7)

 

b000fftool

O b000fftool opera com arquivos de imagem gravados MS B000FF (MSBIN) contendo imagens do Windows CE / ROM móvel. Pode ser útil para corrigir valores de endereço de carga incorretos em imagens CE6 BIN produzidas por BOOOFF, XipPort, Remaker e ferramentas similares.

Baixe o b000fftool 1.0 (2k / XP / 2k3 / Vista / Win7)

 

tcctoolce

O tcctoolce executa algumas operações específicas para os dispositivos baseados em CPU ARCH da Telechips sob o WinCE (apenas a implementação de imagens instantâneas está implementada).

Baixe tcctoolce 1.0.1 (WinCE 4.2 ou superior)

 

TaskbarControlCE

TaskbarControlCE destina-se a controlar a aparência da barra de tarefas do Explorer em caso de alternar entre janelas normais e em tela cheia. Inicialmente desenvolvido para a estação multimídia do carro Createc / Joy-J-2619.

Baixar TaskbarControlCE 1.0.1 (WinCE 4.2 ou superior)

 

Driver SiLabs CP210x VCP para WinCE 4.2

Um driver VCP (Virtual Communication Port) para CP210x (CP2101, CP2102, CP2103, CP2104), chips USB para Serial Bridge fabricados pela Silicon Laboratories (anteriormente Cygnal). O driver cria COMn: porta serial virtual disponível para qualquer aplicativo de comunicação serial (emuladores de terminal, software de navegação GPS, etc.).

O driver funciona apenas em CPUs ARMV4 no Windows CE 4.2 (por exemplo, Windows Mobile 2003 SE ou Pocket PC 2003). Os drivers do CE 5.0 e 6.0 estão disponíveis no site do SiLabs .

Baixe cp210xvcp_ce42_2_0_1_0 (CE 4.2)

 

shrinkvd

shrinkvd é um utilitário de linha de comando para encadear arquivos de disco virtual VMware pré-alocados de acordo com um espaço realmente ocupado por partições. Útil para otimizar os hóspedes do Vista / Win7 / Win8.

Baixar shrinkvd 1.2 (todos os sistemas PC Windows)

 

pegue a senha

getpassword é um utilitário de linha de comando para solicitar uma senha do teclado, escondendo a entrada e retornando via saída padrão (por exemplo, para um arquivo de comando / lote).

Baixe o getpassword 1.0 (todos os sistemas PC Windows)

 

getfileinfo

getfileinfo é um utilitário de linha de comando para extrair e imprimir várias informações de arquivo (data, hora, versão, especificação). Os resultados da versão do arquivo podem ser úteis para criar nomes de arquivos versionados. Os qualificadores de especificação de arquivo podem ser úteis para extrair substituição de argumento de unidade, caminho, nome e extensão, como o processador de lote (cmd.exe), mas sem expandir caracteres curiosos para nomes de arquivos existentes. As peças de especificação extraídas contendo curingas podem ser usadas para processamento posterior de arquivos.

Baixe o getfileinfo 1.9 (todos os sistemas PC Windows)

 

MixerInfo

MixerInfo mostra todas as informações sobre um mixer de áudio fornecido.

Baixar MixerInfo (com código fonte)

 

ArrangeChildren

ArrangeChildren destina-se a organizar várias janelas filho na área de cliente da janela MDI do aplicativo. Ele pode ser usado para arrumar janelas de projeto em IDEs (ambientes de desenvolvedores integrados), como Visual Studio , Sound Forge , Photoshop e outros.

Download ArrangeChildren 1.00

Baixe ArrangeChildren 1.04

 

CopyFileFragm

CopyFileFragm é um utilitário de console destinado a manipular fragmentos de arquivos binários e expandir / encolher arquivos. Pode extrair um fragmento de arquivo para outro arquivo ou stdout, escrever um fragmento em outro arquivo no lugar, substituir / expandir arquivos etc.

Baixar CopyFileFragm 1.11

 

copywobuf

copywobuf é um utilitário de linha de comando do console que copia um arquivo (sem curingas), abrindo arquivos de origem e de destino com
FILE_FLAG_NO_BUFFERING para impedir o armazenamento em cache de arquivos. É útil copiar arquivos de / para pastas compartilhadas em convidados da VMware para evitar o bloqueio do arquivo host pelo processo vmware-vmx.exe.

Baixe copywobuf 1.3

 

waveinfo

waveinfo é um utilitário de linha de comando do console que mostra informações sobre arquivos RIFF / WAVE (.wav).

Baixe o waveinfo 1.3

VMWRefresh

O VMWRefresh permite que você use o SoftICE 3.x ou 4.x no Windows 2000 / XP executado no VMWare 4.5.1 forçando a janela de convidado do VMWare a atualizar periodicamente.

Faça o download do VMWRefresh 1.04

 

picoc para Win32

Picoc é um intérprete de linguagem C muito pequeno, projetado para sistemas baseados em UNIX. Existe uma porta para Win32 (x86 / x64).

Baixar picoc para Win32 2,2 m

 

RASPPPoE 0.98b patch de tempo limite

Um patch para os drivers do protocolo RASPPPeE escrito por Robert Schlabbach . Aumenta RASPPPoE tempo limite para 120..150 segundos para permitir sessão PPP a persistir durante a reconexão modem DSL.

Baixe o patch de tempo limite RASPPPo 0.98b

 

Fonte: http://software.muzychenko.net/eng/

Tutorial: instalando e usando o Sass no Windows

Uma coisa que eu achava antes de mexer com Sass é que eu precisava usar Linux ou Mac, ou que daria muito trabalho instalar tudo no meu PC. Mas dá pra trabalhar com Sass no Windows sim!

E a galera pediu no post “CSS menos sofrido com Sass” um guia de como trabalhar com Sass no nosso sistema operacional do coração.
Primeiramente mostro como preparar o ambiente e depois um teste rápido.
Então segue um guia de como instalar o Sass no Windows:

1 – Instale o Ruby

Baixe aqui o RubyInstaller de acordo com a sua versão* do Windows e instale se preocupando com a observação da imagem abaixo:

Cuidado: Marque a opção “Add Ruby executable to your PATH”!


* Se não souber  se o seu Windows é 32 ou 64 bits, basta dar o atalho Win+PauseBreak. Será mostrada uma tela com informações do seu sistema, e em “Tipo de sistema”, a versão que você tem instalada.

2 – Confira se está tudo bem

Dê uma conferida se está tudo bem até agora, indo no prompt / terminal (Win+R > cmd) e dando o comando:

ruby -v

Deve aparecer a versão do Ruby como na imagem abaixo:

Não esquente se a versão estiver um pouco diferente.

3 – Ruby instalado, instale o Sass

No prompt mesmo, dê o comando:

gem install sass

Se deu algum erro, confere se o Ruby está instalado mesmo e/ou tenta instalar manualmente a gem.

4 – Verifique o Sass

Aquela conferida básica para ver se o Sass foi instalado mesmo:

sass -v

Deve aparecer a versão do Sass instalada:

5 – Ambiente todo ok, agora um teste!

Crie uma pasta para teste.
Dentro dela crie um arquivo chamado “teste.scss”.
E nesse arquivo, coloque um código como esse:

$cor-legal: #BADA55;
.course {
  color: $cor-legal;
}

6 – Compile o Sass

Agora na pasta de teste, abra o prompt digitando “cmd .” (sem aspas) na barra de endereços.
O prompt vai abrir direto na pasta.
Agora compile o arquivo scss em um arquivo CSS com o comando:

sass teste.scss:teste.css

O ideal é não ter que compilar na mão, mas como estamos testando não tem problema.

7 – Dê uma conferida no CSS

Se foi tudo ok até aqui, foi gerado um teste.css na sua pasta.
Dé uma conferida se ele está parecido com esse:

.course {
  color: #BADA55; }

8 – Agora é só alegria! Tranquilo, né? 🙂

Outros sistemas operacionais?

Se você usa Mac, o Ruby já vem instalado, só instalar o Sass do mesmo jeito que mostrei.
Se você usa Linux, o comando “\curl -sSL https://get.rvm.io | bash -s stable” (sem aspas) instala o Ruby para você.

O Sass não é só variáveis

Eu explico as principais features do Sass no curso da Alura, dá uma olhada no conteúdo do curso de Sass. Escrevi também um livro de Sass em que mostro essa fantástica ferramenta.
Conseguiu instalar e testar 100%? Teve algum problema?

 

 

 

 

Fonte: http://blog.caelum.com.br/tutorial-instalando-usando-sass-no-windows/

Forçando o faker a falar nossa língua

Sem sombra de dúvidas Model Factory é uma das minhas funcionalidades favoritas do Laravel. Lançada a partir da versão do Laravel 5.1, veio para agilizar e facilitar em muito a vida dos desenvolvedores, quanto a necessidade de popular o banco de dados de um projeto com dados falsos.

Mas como nem tudo são flores, existe um inconveniente nesta funcionalidade. Por padrão os dados são gerados na língua inglesa (en_US). Mas o que alguns desenvolvedores não sabem, é que a biblioteca Faker, que é utilizada para criação dos dados falsos, possui suporte a vários idiomas incluindo o nosso (pt_BR).

Sabendo disto, fui atrás de soluções para este inconveniente e em minhas pesquisas encontrei diversas formas de resolver este pequeno problema, abaixo irei listar as formas possíveis que encontrei para solucioná-los.

UTILIZANDO O SERVICE PROVIDER (AppServiceProvider.php)

Supondo que você está trabalhando com uma versão do Laravel igual ou superior à 5.1, basta dizermos ao Laravel que o objeto Faker que será utilizado é o customizado por você. E nesta customização iremos informar que o Locale utilizado será o do nosso idioma (pt_BR).

 

 

<?php
  namespace App\Providers;
  use Illuminate\Support\ServiceProvider;
  use Faker\Generator as FakerGenerator;
  use Faker\Factory as FakerFactory;
  class AppServiceProvider extends ServiceProvider
{
           /**
            * Bootstrap any application services.
            *
            * @return void
           */
            public function boot()
           {
          //
          }
         /**
         * Register any application services.
         *
         * @return void
         */
          public function register()
          {
             $this->app->singleton(FakerGenerator::class, function () {
                 return FakerFactory::create(‘pt_BR’);
                });
         }
}

 

 

Da forma apresentada, toda e qualquer modelfactory criada, automaticamente irá utilizar o nosso objeto faker customizado.

CRIANDO SEU PRÓPRIO OBJETO FAKER (ModelFactory.php)

Outra forma que encontrei, foi a de criarmos uma instância do objeto fakerpara cada modelfactory criada, sempre customizando o objeto, setando olocale para o nosso idioma (pt_BR).

 

<?php
$faker = \Faker\Factory::create(pt_BR);
$factory->define(App\User::class, function () use ($faker) {
return [
name => $faker->name,
email => $faker->freeEmail,
street => $faker->streetAddress,
city => $faker->city,
state => $faker->stateAbbr,
postal => $faker->postcode,
birth_date => $faker->date($format = Y-m-d, $max = now),
password => bcrypt(str_random(10)),
remember_token => str_random(10),
];
});

 

Da forma que acabamos de ver, sempre teremos que instanciar e customizar um objeto faker antes de definirmos uma factory.

ADICIONANDO PROVIDERS AO OBJETO FAKER ORIGINAL (ModelFactory.php)

Outra forma que a biblioteca nos fornece para solucionar este incomodo, é adicionarmos providers no idioma desejado. No nosso caso usaremos os providers em português do Brasil (pt_BR).

 

 

<?php
$factory->define(App\User::class, function (Faker\Generator $faker) {
$faker->addProvider(new Faker\Provider\pt_BR\Address($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Company($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Internet($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Payment($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Person($faker));
$faker->addProvider(new Faker\Provider\pt_BR\PhoneNumber($faker));
return [
name => $faker->name,
email => $faker->freeEmail,
street => $faker->streetAddress,
city => $faker->city,
state => $faker->stateAbbr,
postal => $faker->postcode,
birth_date => $faker->date($format = Y-m-d, $max = now),
password => bcrypt(str_random(10)),
remember_token => str_random(10),
];
});

 

Esta forma nos oferece uma flexibilidade muito grande, pois poderemos customizar/definir o objeto faker apenas com os providers que necessitarmos.

FORMATTERS e PROVIDERS

Cada uma das propriedades do gerador (nameaddressstateloremphoneNumber entre outros) são chamados “formatters”. Um gerador de faker tem diversos formatters, empacotados em “providers”. Aqui está uma lista dos formatadores empacotados no locale padrão.

A classe Faker\Generator por si só não pode fazer muito. Ela precisa de objetos Faker\Provider para delegar a geração de dados. O Faker\Factory::create() na verdade cria um Faker\Generator c0m os providers padrão já embutidos. Logo abaixo podemos ver o que acontece nos bastidores:

<?php
$faker = new Faker\Generator();
$faker->addProvider(new Faker\Provider\en_US\Person($faker));
$faker->addProvider(new Faker\Provider\en_US\Address($faker));
$faker->addProvider(new Faker\Provider\en_US\PhoneNumber($faker));
$faker->addProvider(new Faker\Provider\en_US\Company($faker));
$faker->addProvider(new Faker\Provider\Lorem($faker));
$faker->addProvider(new Faker\Provider\Internet($faker));

 

POPULANDO O BANCO DE DADOS

Depois de solucionado o inconveniente da geração dos dados em nosso idioma ou qualquer outro que desejarmos, chegamos ao ponto crucial, como vamos agora popular o nosso banco de dados?

Simples, iremos utilizar outra funcionalidade do Laravel fantástica, que são os seeders. E para criar um seeder, vamos fazer uso do nosso grande amigo artisan, nosso companheiro de console que está sempre disponível para nos auxilar com rotinas do dia a dia, como criação de (modelsmigrationscontrollersseeders e etc).

Para criarmos nosso seeder, vamos precisar executar o seguinte comando:

$ php artisan make:seeder UsersTableSeeder

E dentro do arquivo que será criado no caminho (Database/Seeds/UsersTableSeeder.php) iremos chamar nossa factory já definida em ModelFactory, especificando que desejamos criar “50” usuários, conforme demostrado abaixo:

 

<?php
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create();
}
}

Mas isto já é suficiente para conseguirmos popular o nosso banco de dados?

Precisamos ir em (Database/Seeds/DatabaseSeeder.php) e dizermos para o método run(), método este responsável para executar nossos seeders, quais seeders ele deverá executar. Por padrão o UsersTableSeeder, já vem incluso no DatabaseSeeder, porém encontra-se comentado. Então basta retirarmos o comentário da linha $this->call(UsersTableSeeder::class).

Ficaríamos com o seguinte DatabaseSeeder

 

<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
}
}

 

 

Agora sim podemos popular nosso banco de dados. Partindo de um princípio de que não tenhamos executado nenhuma migration, e nosso banco de dados já encontra-se devidamente configurado no arquivo .env. Basta agora executarmos o seguinte comando:

$ php artisan migrate –seed

Se tudo ocorreu bem, já teremos em nosso banco de dados os dados gerados pelo Faker neste momento.

O Artisan provê diversas funcionalidades para nós. Para termos uma visão mais ampla do que o artisan pode fazer por nós, basta digitarmos no nosso console o seguinte comando:

$ php artisan

Espero poder contribuir mais a cada dia, e gostaria de deixar claro que o exemplo utilizado neste artigo é apenas ilustrativo, não levei em consideração (boas práticas, normalização entre outras questões) que devem ser levadas em consideração no desenvolvimento de um projeto.

AGRADECIMENTOS

Como esta é minha primeira postagem no Medium, gostaria de agradecer a todos que distribuem conhecimento para a comunidade Laravel Brasil, seja ela de forma gratuita e/ou paga, pois são essas pessoas que ajudam a comunidade a crescer. Peço antecipadamente desculpas caso esqueça de mencionar o nome de algum de vocês, a memória é curta e falha as vezes. Mas quero agradecer aos colegas desenvolvedores: Diego HernandesVinicius ReisFábio VedovelliDaniel LemesLeandro Henrique entre tantos outros nomes.

FONTES DE PESQUISA

 

Fonte: https://medium.com/@vs0uz4/for%C3%A7ando-o-faker-a-falar-nossa-l%C3%ADngua-72d9ee73244c

 

 

 

 

O que é MongoDB e porque usá-lo?

MongoDB é um dos mais populares de banco de dados. E disparado o mais famoso NoSQL no mercado. O mesmo é open-source e escrito em C ++.
Desde fevereiro de 2015, MongoDB ocupa a quarta posição no ranking mundial. Ele foi desenvolvido pela empresa 10gen inicialmente, que é hoje conhecida como MongoDB Inc.
MongoDB é um banco de dados orientado a documentos que armazena dados em documentos JSON com esquema dinâmicoIsso significa que você pode armazenar seus registros sem se preocupar com a estrutura de dados, como o número de campos ou tipos de campos para armazenar valoresOs documentos do MongoDB são semelhantes aos objetos JSON.
MongoDB é um banco de dados multi-plataforma NoSQL, que pode ser executado em Windows, Linux e Mac etc. Ele suporta linguagens de programação mais populares, como C #, Java, PHP, Javascript, NodeJs, Python e muito mais! 

Porque MongoDB?

Como você sabe, RDMS guarda dados em tabelas formatadas e utiliza linguagem de consulta estruturada (SQL)para consulta de banco de dadosRDBMS também tem esquema pré-definido com base nos requisitos e um conjunto de regras para definir as relações entre os campos em tabelas.

Fontehttps://codigosimples.net/2016/03/01/o-que-e-mongodb-e-porque-usa-lo/

Banco de dados NoSQL: Um novo paradigma – Revista SQL Magazine 102

Este artigo tem o objetivo de explicar as principais características dos bancos de dados NoSQL.

De que se trata o artigoEste artigo tem o objetivo de explicar as principais características dos bancos de dados NoSQL. Bancos noSQL se referem a uma classe definida de banco de dados não-relacionais que rompem com uma longa história de banco de dados focados nas propriedades ACID. Para tornar ainda mais clara a diferença trazida por este novo paradigma, este artigo também realiza algumas análises comparativas entre bancos noSQL e relacionais.

Em que situação o tema útil

Conhecer o novo paradigma que vem surgindo na área de banco de dados, noSQL, pode ser considerado muito importante para aqueles que trabalham com banco de dados ou tomadores de decisão da área de tecnologia das organizações. É sempre importante estar atento a novas tecnologias e como elas resolvem problemas provenientes das limitações das tecnologias existentes.

Resumo DevMan

Através deste artigo temos a pretensão de apresentar de forma concisa os fundamentos, características e diferenciais dos bancos de dados NoSQL. Além disso, a autora deste artigo acredita ser de suma importância apresentar os fundamentos relacionados ao Banco de Dados Relacional, assim como realizar diversas comparações entre os dois modelos, para que haja uma melhor compreensão e abstração deste novo paradigma chamado Banco de Dados NoSQL.

A forma como nos comunicamos, trocamos informações e criamos conteúdo mudou muito ao longo dos anos. Estamos vivenciando uma época onde as aplicações Web têm revolucionado o mundo em diversos sentidos e a tendência é que este crescimento habilite a criação de uma série de novas aplicações. O grande volume de dados gerados por estas aplicações Web, aliado com a nova forma de interação com o usuário (dinâmica, eficiente e intuitiva), a escalabilidade sob demanda e a necessidade de um alto grau de disponibilidade, tem fomentado o aparecimento de novos paradigmas e tecnologias.

Todos nós sabemos que o banco de dados relacional tem sido usado há muito tempo em larga escala pelo mundo afora, e desde sua criação, por volta do início dos anos 1970, esse tem sido o tipo de banco de dados mais utilizado em empresas que possuem um intenso volume de dados para serem armazenados [1]. Pensando justamente neste imenso volume de dados que tende a crescer a cada momento, começa a se observar que os bancos de dados relacionais possuem certos fatores limitantes, principalmente quando nos referimos a escalabilidade de um sistema [3]. Este ambiente envolto de limitações que os bancos de dados relacionais têm propiciado instigou o surgimento de outros tipos de modelos alternativos de banco de dados que possam suprir essa necessidade.

Diante de tantas dificuldades que são encontradas à medida que as necessidades surgem, está crescendo uma nova geração de banco de dados que vem ganhando bastante força e espaço, estes são conhecidos como NoSQL (“Not Only SQL”) [4], este é o termo genérico que define um banco de dados não-relacional. Este modelo veio com a proposta de atender e gerenciar os grandes volumes de dados, buscando um alto desempenho e disponibilidade. Neste contexto, neste artigo serão apresentadas características desses bancos de dados e se discute ainda como essas novas soluções podem abordar questões que estão sendo atualmente enfrentadas.

História e característica do banco de dados relacional

O banco de dados relacional surgiu como um sucessor dos modelos hierárquicos de rede. Estas estruturas, por sua vez, foram muito utilizadas nos primeiros sistemas de mainframe. No entanto, devido ao grande número de restrições de relacionar estruturas no mundo real, este modelo foi perdendo força para dar lugar aos bancos de dados relacionais [5]. Este, por último, se tornou o grande padrão para a maioria dos Sistemas Gerenciadores de Banco de Dados (SGBDs). Outro ponto importante a salientar sobre o modelo relacional é a utilização de restrições de integridade que garantem a consistência dos dados em um banco de dados. Estas restrições, em sua grande maioria, são conhecidas como chaves primárias (PRIMARY KEY) e chaves estrangeiras (FOREIGN KEY).

Outra característica que devemos ressaltar no Modelo Relacional é o que chamamos de processo de Normalização. Seu objetivo é a aplicação de uma série de passos com determinadas regras sobre a tabela do banco de dados de forma a garantir o projeto adequado dessas tabelas. Um conceito básico da normalização consiste na separação de dados referentes a elementos distintos em tabelas distintas, associadas através da utilização das chaves. Essas regras permitem um armazenamento consistente e, além disso, um eficiente acesso aos dados, reduzindo redundâncias e diminuindo as chances dos dados se tornarem inconsistentes [7].

Além disso, o modelo relacional começou a adotar uma linguagem para a manipulação e consulta destes dados. Estamos nos referindo ao SQL (Structured Query Language). Criada originalmente pela IBM e inspirada na álgebra relacional, ganhou grande destaque pela facilidade do seu uso, diferenciando-a assim de todas as outras linguagens procedurais da época. Devido a sua grande utilização em 1982, o American National Standard Institute (ANSI) tornou o SQL o padrão oficial de linguagem em ambiente relacional, consolidando assim a sua posição de dominância no modelo relacional [1].

Não é possível falar de SQL sem falar também do SGBD, que se caracteriza como um conjunto de programas que permitem armazenar, modificar e extrair em um banco de dado. Falando mais atentamente sobre o assunto, podemos afirmar que o SGBD oferece aos seus usuários processos de validação, recuperação de falhas, segurança, otimização de consultas, garantia de integridade dos dados, entre outros [8].

Além disso, os SGBDs Relacionais oferecem a possibilidade de vários usuários acessarem e manipularem um mesmo banco de dados simultaneamente e principalmente de forma eficiente, algo que é fundamental em sistemas de grande porte.

Os SGBDs relacionais ainda possuem a possibilidade do sistema se recuperar adequadamente de possíveis falhas, ou seja, ele tem a capacidade de voltar ao ponto anterior em que ocorreu a falha, permitindo assim um banco de dados mais consistente.

Vale ressaltar ainda que os bancos de dados relacionais seguem o modelo ACID para preservar a integridade de uma transação. Este conjunto de procedimentos é dividido em quatro propriedades, e são elas:

• Atomicidade: As ações que compõe a ação da transação devem ser concluídas com sucesso para ser efetivada. Se esta transação falhar, será feito o rollback.

• Consistência: Todas as regras/restrições descritas no banco de dados devem ser obedecidas garantindo que o banco de dados passe de uma forma consistente para outra forma consistente.

• Isolamento: Neste caso, a propriedade de isolamento garante que a transição não será interferida por nenhuma outra transação concorrente.

• Durabilidade: Os resultados de uma transação são permanentes, ou seja, o que foi salvo não será mais perdido.

Todos esses diferentes recursos auxiliaram a manter os SGBDs Relacionais sempre em uma posição de predominância entre os mais diversos tipos de ambientes computacionais, mas ao mesmo tempo, não impediu o aparecimento de determinados problemas, isso devido ao grande crescimento do volume de dados presente nos bancos de dados de algumas organizações.

Limitações dos bancos de dados relacionais

Nos dias de hoje, o volume de dados de certas organizações, como podemos citar o caso do Facebook, que atingiu o nível de petabytes (em 2011 este volume de dados ultrapassou 30 petabytes (30 mil terabytes), sendo que menos de um ano antes o volume era de 20 petabytes). Este é um exemplo real de como esse crescimento de dados tem expandido rapidamente [11]. No caso destes tipos de organizações, a utilização dos SGBDs relacionais tem se mostrado muito problemática e não tão eficiente.

Os principais problemas encontrados com a utilização do Modelo Relacional estão principalmente na dificuldade de conciliar o tipo de modelo com a demanda da escalabilidade que está cada vez mais frequente.

Podemos tomar como exemplo o próprio Facebook. Digamos que se o sistema está rodando sobre um SGBD relacional e houver um crescimento do número de usuários, consequentemente haverá uma queda de performance. E para superar este problema seria necessário fazer um upgrade no servidor ou aumentar o número de servidores.

Se o número de usuários continuasse a crescer intensamente, tais soluções apresentadas não se mostrariam suficientes, pois o problema passa a se concentrar no acesso à base de dados. Neste caso, o que poderia ser feito para resolver este problema de escalabilidade seria aumentar o poder do servidor, aumentando sua memória, processador e armazenamento. Este tipo de solução é chamado de Escalabilidade Vertical. Por outro lado, poderíamos aumentar o número de máquinas no servidor web, chamamos esta alternativa de Escalabilidade Horizontal [13].

Vamos citar novamente o Facebook, onde suas aplicações continuam sempre a crescer, chega um momento em que o banco de dados não consegue atender todas as requisições em um tempo hábil. Neste momento poderíamos apelar para a Escalabilidade Vertical e fazer o upgrade na máquina em que está rodando o banco de dados. No entanto, chega um momento em que a capacidade da máquina chega ao limite do orçamento para conseguir uma máquina realmente eficiente. Dessa forma, o próximo passo seria utilizar a Escalabilidade Horizontal, ou seja, colocar mais máquinas rodando o banco de dados. Tal tarefa pode parecer simples, porém, no momento em que escalonamos o banco em diversas máquinas é necessário realizar na grande maioria das vezes uma série de configurações e alterações nas aplicações para que tudo funcione como esperado na nova arquitetura distribuída.

Ainda no campo dos exemplos, vamos imaginar um sistema fictício, e que não se sabe ao certo os campos de determinada entidade, agora imagine este mesmo sistema do dia para a noite sendo acessado por milhares e milhares de pessoas. No outro dia, ao observar sua caixa de email você percebe que diversos usuários possuem ideias realmente inovadoras, porém, para implementar essas ideias no seu sistema é necessário que o banco de dados praticamente por inteiro seja refatorado, afinal, será necessário realizar diversas mudanças estruturais na base de dados . Com este problema em mãos podemos perceber que o Modelo Relacional está focado nos relacionamentos entre as entidades e que isso, por muitas vezes, torna mais “burocrática” a implementação de novas funcionalidades, além dos problemas voltados para a escalabilidade que já havíamos falado, quando há um acesso muito grande de usuários ao sistema.

Como esse intenso volume de dados vem aumentando e pela sua natureza estrutural, os desenvolvedores perceberam a dificuldade ao se organizar dados no Modelo Relacional. É neste ponto que o foco das soluções não-relacionadas está direcionado.

Um novo paradigma: Banco de Dados NoSQL

Pensando em solucionar diversos problemas relacionados à escalabilidade, performance e disponibilidade, projetistas do NoSQL promoveram uma alternativa de alto armazenamento com velocidade e grande disponibilidade, procurando se livrar de certas regras e estruturas que norteiam o Modelo Relacional. Se por um lado havia um rompimento das regras do Modelo Relacional, por outro lado havia ganho de performance, flexibilizando os sistemas de banco de dados para as diversas características que são peculiares de cada empresa. Esta flexibilidade passou a se tornar fundamental para suprir os requisitos de alta escalabilidade necessários para gerenciar grandes quantidades de dados, assim como para garantir uma alta disponibilidade destes, característica fundamental para as aplicações Web 2.0. Algumas grandes organizações passaram a investir em seus próprios SGBDs baseando-se na ideia do NoSQL.

O termo NoSQL foi inicialmente utilizado em 1998 a partir de uma solução que não oferecia uma interface SQL, mas este sistema tinha como base o Modelo Relacional. Futuramente, o modelo passou a representar determinadas soluções que se tornavam melhores que a utilização do Modelo Relacional, desde então passou a utilizar a abreviação Not Only SQL (Não apenas SQL) [13]. A proposta dos bancos NoSQL na realidade não é extinguir o Modelo Relacional, mas utilizá-lo em casos onde é necessária uma maior flexibilidade na estruturação do banco.

Este movimento está bastante enraizado no open source. E apesar de existirem muitos bancos de dados nesta categoria, o movimento passou a ganhar mais força quando determinadas empresas consideradas gigantes da tecnologia passaram a utilizar suas próprias implementações proprietárias [14]. Neste caso, podemos citar o Google, que desde 2004 investe no BigTable que foi desenvolvido para suprir as necessidades de armazenamento da empresa, baseado na filosofia do alto desempenho, escalabilidade e disponibilidade [15]. Além disso, temos também o famoso Cassandra, desenvolvido pelo Facebook para lidar com o grande fluxo de informações [16]. Em 2010 o Cassandra mostrou ser um banco de dados consolidado e passou a ser utilizado pelo Twitter, que utilizava o MySQL anteriormente [17].

Temos ainda o Apache CouchDB, que é um banco de dados open source orientado a documentos que projetado especialmente para suportar computação distribuída em larga escala [18].

Apesar da nomenclatura de todos esses bancos de dados serem NoSQL, eles não são completamente iguais, possuem na verdade muitas características semelhantes e muitas particularidades que os diferenciam.

Principais características dos Bancos de Dados NoSQL

Os bancos de dados NoSQL apresentam determinadas características que considero importantes de serem consideradas neste artigo, além disso, são essas características que os tornam tão diferentes dos bancos de dados relacionais. Algumas dessas características são:

• Escalabilidade Horizontal: na medida em que o volume de dados cresce, aumenta-se a necessidade de escalabilidade e melhoria do desempenho. Dentre todas as possibilidades para esta solução, a escalabilidade horizontal se torna a mais viável, porém requer diversas threads ou que processos de um tarefa sejam criadas e distribuídas. Dessa forma, o uso de um banco de dados relacional poderia ser muito complexo. Não queremos dizer que os bancos de dados relacionais não escalam, a verdade é que eles não escalam facilmente. Isto por que no momento em que diversos processos se conectam simultaneamente em um mesmo conjunto de dados há uma geração de uma alta concorrência aumentando assim o tempo de acesso às tabelas. Neste contexto, uma grande vantagem dos bancos NoSQL é justamente a ausência de bloqueios, o que permite a escalabilidade horizontal com uma maior facilidade e eficiência (ele não é afetado pelo aumento da concorrência). Uma alternativa muito utilizada para alcançar a escalabilidade horizontal é o Sharding, que divide os dados em múltiplas tabelas a serem armazenadas ao longo de diversos nós na rede. O que esta técnica faz, na realidade, é romper a cadeia de relacionamentos, que é uma forte característica nos bancos relacionais. É possível realizar o Sharding em banco de dados relacionais de forma manual. Entretanto, esta não é uma tarefa simples e demonstra complexidade de implementação para a equipe que está desenvolvendo [12].

• Ausência de esquema (Schema-free) ou esquema flexível: Outra característica notável em bancos de dados NoSQL é a ausência parcial ou total de esquema que define a estrutura de dados. É justamente essa ausência de esquema que facilita uma alta escalabilidade e alta disponibilidade, mas em contrapartida não há a garantia de integridade dos dados, fato este que não ocorre no Modelo Relacional [20].

• Suporte nativo a replicaçãoEsta é outra forma de prover a escalabilidade, pois, no momento em que permitimos a replicação de forma nativa o tempo gasto para recuperar informações é reduzido [21].

• API simples para acessar o banco de dados: Em banco de dados NoSQL, o foco não está no armazenamento dos dados e sim como recuperar estes dados de forma eficiente. Pensando nisso, é fundamental APIs desenvolvidas para facilitar o acesso às devidas informações para que se possa usar o banco de dados de forma rápida e eficiente.

• Consistência eventual: Outra característica particular de bancos NoSQL é que nem sempre a consistência dos dados é mantida. Esta característica tem embasamento no teorema CAP (Consistency, Availability e Partition tolerance) que afirma que em um dado momento só é possível garantir duas destas três propriedades, que seriam Consistência, Disponibilidade e tolerância à partição [32]. No mundo real, normalmente estas duas últimas são privilegiadas. Como consequência disto, as propriedades do ACID não são respeitadas simultaneamente, ao contrário disto, temos outro conjunto de projetos denominado BASE (Basicamente disponível, Estado leve e consistente em momento indeterminado) [21]. Ou seja, é necessário haver um planejamento para que o sistema possa tolerar inconsistências temporárias com o objetivo de priorizar a disponibilidade.

Agora que falamos brevemente sobre as principais características nos bancos de dados NoSQL, é importante ressaltar algumas técnicas utilizadas para a implementação de suas funcionalidades. Entre elas estão:

• Map/reduce: permite a manipulação de enormes volumes de dados ao longo de nós em uma rede [23]. Funciona da seguinte forma: na fase map, os problemas são particionados em pequenos problemas que são distribuídos em outros nós na rede. Quando chegam à fase reduce, esses pequenos problemas são resolvidos em cada nó filho e o resultado é passado para o pai, que sendo ele consequentemente filho, repassaria para o seu, até chegar à raiz do problema.

• Consistent hashing: suporta mecanismos de armazenamento e recuperação, onde a quantidade de sites está em constante mudança [24]. É interessante usar essa técnica, pois ela evita que haja uma grande migração de dados entre estes sites, que podem ser alocados ou desalocados para a distribuição dos dados.

• MVCC (Multiversion concurrency control): Oferece suporte a transações paralelas em banco de dados. Por não fazer uso de locks para controle de concorrência, faz com que transações de escrita e leitura sejam feitas simultaneamente [25].

• Vector clocks: Ordenam eventos que ocorreram em um sistema. Como existe a possibilidade de várias operações estarem acontecendo simultaneamente, o uso de um log de operações informando suas datas se faz importante para informar qual versão de um dado é a mais atual [21].

Modelos de banco de dados NoSQL

Neste caso, temos quatro categorias do NoSQL que as diferenciam entre si:

• Chave-valor (key-value): Este modelo é considerado simples e permite a sua visualização através de uma tabela de hash, no qual há uma chave única e um indicador de determinado dado, podendo ser uma String ou um binário [27]. A Figura 1 apresenta um exemplo que armazena informações com estas características. A chave representa um campo como nome e idade e o valor representam os campos preenchidos com Mara Rúbia e 43, ou seja, a instância para o campo correspondente. Este modelo é caracterizado pela sua facilidade ao ser implementado, permitindo que os dados sejam acessados rapidamente através da chave, aumentando também a disponibilidade do acesso aos dados. Para manipulá-los, utilizamos comandos simples como get() e set(), que retornam e capturam valores. Um problema enfrentado por este tipo de banco de dados é que o mesmo não permite a recuperação de objetos através de consultas mais complexas. Como exemplo, podemos citar o Dynamo que foi desenvolvido pela Amazon como solução de alta disponibilidade para suas necessidades [28].

Figura 1. Campos e informações

• Banco de Dados Orientado a Documento: Como o próprio nome sugere, este modelo armazena coleções e documentos. Explicando melhor, um documento, no geral, é um objeto identificador único e um conjunto de campos que podem ser strings, listas ou documentos aninhados [27]. Diferente do banco de dados chave-valor onde se cria uma única tabela hash, neste modelo temos um agrupamento de documentos sendo que em cada um destes documentos temos um conjunto de campos e o valor deste campo. Neste modelo temos ausência de esquema pré-definido (schema free). Isto significa que é possível que haja atualizações no documento, com a adição de novos campos, por exemplo, sem afetar adversamente outros documentos. Outra característica interessante é que não é necessário armazenar valores de dados vazios para campos que não possuem um valor. Na Figura 2 temos o exemplo de um determinado documento que foi definido por: Assunto, Autor, Data, Tags e Mensagens. Caso eu deseje implementar outro campo chamado “Minha opinião sobre o site:”, não haverá nenhum tipo de restrição ou complexidade de inserir tal dado no banco de dados, esta flexibilidade é um ponto forte neste tipo de modelo. Como exemplo de sistema de banco de dados que utiliza este tipo de solução destacamos o CouchDB e o MongoDB. O CouchDB utiliza o formato JSON e é implementado em Java. Já o mongo é implementado em C++ e permite tanto concorrência quanto replicação.

Figura 2. Documento com informações

• Orientado a Coluna (column family): Demonstra maior complexidade que o de chave-valor. Este tipo de banco de dados foi criado para armazenar e processar uma grande quantidade de dados distribuídos em diversas máquinas. Aqui existem as chaves, mas neste caso, elas apontam para atributos ou colunas múltiplas. Neste caso, os dados são indexados por uma tripla (coluna, linha e timestamp), a coluna e linha são identificadas por chaves e o timestamp permite diferenciar múltiplas versões de um mesmo dado [14]. Como o próprio nome sugere, as colunas são organizadas por família da coluna. Vale destacar que as operações de escrita e leitura são atômicas, ou seja, os valores associados a uma linha são considerados em sua execução, independente das colunas que estão sendo lidas/escritas. O conceito associado a este modelo é o de família de colunas, com o objetivo de reunir colunas que armazenam o mesmo tipo de informação. Como exemplo, a Figura 3 modela o conceito de amigos, onde o primeiroNome e sobrenome são colunas pertencentes à família de colunas denominada “nome”. Da mesma forma, as colunas endereço, cidade e estado pertencem à família local. É interessante observar que na linha 001 a pessoa Mara tem diversos endereços. Como a busca neste tipo de banco de dados é atômica, mesmo que o interesse seja buscar o primeiroNome da linha 001, todas as colunas serão retornadas quando esta mesma linha for consultada. Este modelo permite ainda o particionamento de dados, oferecendo forte consistência, no entanto, a alta disponibilidade é o seu ponto fraco. Este modelo de dados surgiu com o BigTable criado pelo Google [15]. Além do BigTable temos também o Cassandra que foi desenvolvido pelo Facebook [16].

Figura 3. Representação de amigos

• Orientado a Grafos: este modelo possui três componentes básicos: nós (vértices dos grafos), os relacionamentos (arestas) e as propriedades (conhecidos também como atributos). Este modelo é visto como multigrafo rotulado e direcionado, onde cada par de nós pode ser conectado por mais de uma aresta. A utilização deste modelo é muito útil quando é necessário fazer consultas demasiadamente complexas. O modelo orientado a grafos possui uma alta performance, permitindo um bom desempenho nas aplicações [27]. Para exemplificar o que foi dito, podemos analisar a Figura 4 que representa uma aplicação que mantêm informações relativas à viagem. Uma consulta pertinente seria: “Quais cidades foram visitadas anteriormente por pessoas que foram para Nova Iorque?”. No modelo de banco de dados relacional tal consulta poderia se mostrar complexa, pois não permitem que os dados sejam representados de uma forma natural.

Como exemplo, podemos citar o Neo4j que é um banco de dados open source. O Neo4J trata-se de um banco de dados baseado em grafos desenvolvido em Java. Além de possuir suporte completo para transactions, ele também trabalha com nós e relacionamentos. Ainda no exemplo da Figura 4, temos diversas pessoas: João, Ricardo, Carolina, Maria, Fernando e Fábio que representam nós do grafo e estão conectadas a cidades que visitaram ou residiram. Por exemplo: Ricardo viajou para Roma e Bruxelas e já residiu em Toronto e Paris. A partir de cada cidade, precisamos dos relacionamentos de entrada que também sejam do tipo “viajou” e com isso encontramos pessoas que viajaram para o mesmo lugar que Ricardo, neste caso, Carolina e Fernando.

Figura 4.Nós do grafo

Levando em consideração tudo o que foi dito, é fundamental ressaltar que nenhum modelo é superior a outro. Na realidade, o que ocorre é que um modelo pode ser mais adequado para ser utilizado em certas situações. Por exemplo, para a utilização de um banco de dados de manipulação de dados que frequentemente serão escritos, mas não lidos (um contador de hits na Web, por exemplo), pode ser usado um banco de dados orientado a documento como o MongoDB. Já aplicativos que demandam alta disponibilidade, onde a minimização da atividade é essencial, podemos utilizar um modelo orientado a colunas como o Cassandra. Aplicações que exigem um alto desempenho em consultas com muitos agrupamentos podem utilizar um modelo orientado a grafos.

O importante é que no momento da criação do aplicativo os desenvolvedores utilizem a melhor solução que se encaixa no perfil desejado. Utilizar a solução adequada ao criar o banco de dados significa uma diminuição dos custos para a sua criação, assim como um banco eficiente no processamento de dados do ponto de vista das suas necessidades.

Principais diferenças entre SGBDs Relacionais e NoSQL

A partir do momento em que se pensa na possibilidade de utilizar um banco de dados NoSQL ao invés de um modelo relacional, é preciso levar algumas questões em consideração, como critérios de escalonamento, consistência e disponibilidade de dados. Vamos apresentar algumas discussões comparativas mais marcantes no que se diz respeito a estes três conceitos.

Falar sobre escalabilidade é essencial porque é neste aspecto que os bancos de dados NoSQL possuem uma grande vantagem em relação aos SGBDs tradicionais, basicamente por terem sido criados para essa finalidade. Os bancos de dados relacionais possuem uma estruturação que não a permite tanta flexibilidade, além disso, é menos adaptada para situações em que o escalonamento se faz necessário.

Para alcançar uma melhor escalabilidade, os bancos de dados relacionais utilizam o recurso da escalabilidade vertical (scale up) que tem como característica a simplicidade de sua implementação e esta tem sido a forma mais indicada para se realizar o escalonamento do banco de dados. A partir do momento em que uma aplicação está sendo demasiadamente acessada por um número muito grande de usuários, este tipo de escalonamento passa a não ser mais suficiente. O próximo passo consiste em escalonar o próprio banco de dados, que consiste basicamente em distribuir o banco em várias máquinas, particionando os dados. Conhecido também como sharding ou escalonamento horizontal. Esse tipo de escalonamento se mostra muito complexo ao ser implementado em um SGBD relacional devido à dificuldade em se adaptar a toda estrutura lógica do Modelo Relacional, primeiro porque os SGBDs relacionais obedecem aos critérios de normalização e o processo de sharding vai contra a tudo isso, pois se caracteriza pela desnomarlização dos dados. Segundo ponto, há uma mudança de paradigma em relação ao processo de escalonamento. Enquando SGBDs tradicionais trabalham para reforçar o servidor, o sharding tem como objetivo trabalhar com o escalonamento horizontal, distribuindo seus dados em diversos setores. Terceiro ponto, o volume de dados por máquina é minimizado devido a esta distribuição, afinal, conjunto de dados menores são mais simples de serem gerenciados, acessados e atualizados. Por último, a disponibilidade do sistema é otimizada em relação ao modelo relacional, pelo fato de que se houver a queda do sistema em uma máquina não irá causar a interrupção do mesmo.

Esta questão da disponibilidade demonstra muita preocupação em determinadas organizações. Podemos citar um evento que ocorreu em 2008, em que a rede social Twitter ficou fora do ar durante 84 horas, neste evento o Twitter ainda utilizava o PostgreSQL, sendo considerada a rede social mais instável daquele ano [30]. A partir de 2009, quando começou a utilizar o Cassandra, outro evento similar ocorreu, porém o site ficou fora dor ar durante 23 horas e 45 minutos [17].

Neste quesito, o banco de dados NoSQL se destaca pela maior disponibilidade, maior rapidez nas consultas, paralelismo de atualização de dados e maior grau de concorrência.

Os bancos de dados NoSQL foram projetados para este fim, e da forma mais simples e natural possível. Como exemplo podemos citar o MongoDB que inclui um módulo de sharding automático que permite a construção de um cluster de banco de dados escalado horizontalmente para, dessa forma, incorporar novas máquinas de forma dinâmica [19].

Outra coisa que devemos notar ao fazer a comparação de uma banco de dados relacional e NoSQL é no que se refere ao controle de concorrência. Se por um lado, no Modelo Relacional utilizamos locks para garantir que dois usuários não acessem o mesmo item simultaneamente, no banco de dados NoSQL utilizam-se outras estratégias que acabam por permitir um maior grau de concorrência. Para citar uma dessas estratégias podemos citar como exemplo o banco de dados CouchDB que utiliza o MMVC. A ideia principal é criar diversas versões dos documentos e permitir a atualização sobre uma dessas versões mantendo ainda a versão desatualizada. Agindo dessa forma não há a necessidade de bloquear os itens dos dados.

Ao se pensar em substituir um banco de dados relacional por um NoSQL, a arquitetura fica vulnerável à perda de consistência, porém, pode-se ganhar em flexibilidade, disponibilidade e performance. Outra coisa interessante para ser destacada são as diferenças de paradigmas utilizadas no Modelo Relacional e nos bancos NoSQL. No que diz respeito a este primeiro, temos o ACID que força a consistência ao final de cada operação, já o paradigma BASE, que é utilizado comumente pelo segundo, permite que o banco de dados eventualmente seja consistente, ou seja, o sistema só torna-se consistente no seu devido momento.

Para compreendermos melhor todas essas diferenças, observe a Tabela 1 que exemplifica de forma concisa alguns dos conceitos descritos neste artigo.

Banco de Dados Relacional Banco de Dados NoSQL
Escalonamento É importante lembrar que é possível ser feito o escalonamento em um Modelo Relacional, no entanto, é muito complexo. Possui uma natureza estruturada, portanto, a inserção dinâmica e transparente de novos nós a tabela não é realizada naturalmente. Não possui um esquema pré-definido fazendo com que este tipo de modelo seja flexível o que favorece a inserção transparente de outros elementos.
Consistência Neste quesito, o Modelo Relacional se mostra forte. As suas regras de consistência são bastante rigorosas no que diz respeito à consistência das informações. É realizada eventualmente no modelo: tem apenas a garantia que se não houver nenhuma atualização nos dados, todos os acessos aos itens devolverão o último valor que foi atualizado.
Disponibilidade Por não conseguir trabalhar de forma eficiente com a distribuição de dados, o Modelo Relacional acaba não suportando uma demanda muito grande de informações. Outro ponto forte neste modelo é o que diz respeito à disponibilidade, pois possui um alto nível de distribuição de dados, permitindo assim que seja possível fazer com que um enorme fluxo de solicitações aos dados seja atendido com a vantagem do sistema ficar indisponível o menor tempo possível.

Tabela 1. Análise comparativa entre Banco de Dados Relacional e NoSQL

Conclusão

Com o grande crescimento do volume de dados em determinadas organizações, os bancos de dados NoSQL tem se tornado uma grande alternativa quando nos referimos a escalabilidade e disponibilidade, fatores estes que se tornam imprescindíveis em algumas aplicações Web.

Para realizar a migração de um SGBD Relacional para um banco de dados NoSQL é preciso levar diversos fatores em consideração. A empresa em questão deve mensurar as diversas vantagens e desvantagens propostas por ambos os modelos, e estes critérios de comparação são dos mais diversos tipos, indo desde a escalabilidade do sistema, passando por avaliação sobre consistência de dados e quão importante é a disponibilidade do banco de dados para o sistema.

Em relação a bancos de dados relacionais, sabemos da sua “experiência” no mercado, no qual é utilizado em larga escala. Além disso, sabemos da solidez de suas soluções que são mais maduras e experimentadas. Enquanto isso, os bancos de dados NoSQL ainda estão conquistando seu espaço no mercado e definindo os seus próprios padrões. Além disso, sabemos que para diversas organizações a consistência de dados se torna um fator determinante e as transações através dos SGBDs Relacionais são a melhor alternativa para lidar com esse problema.

Por outro lado, temos o problema do grande volume de dados enfrentado por diversas empresas, assim como a necessidade que estes sistemas estejam disponíveis para os seus usuários. Nestas situações, os bancos de dados NoSQL acrescentam diversos pontos positivos, primeiro pela sua possibilidade de escalonamento e pela simplicidade do seu modelo, onde não há esquemas pré-definidos, e segundo pela existência de uma grande distribuição de dados, oferecendo assim um maior suporte de solicitações a estes dados para serem atingidos. Adicionalmente, é importante ressaltar que uma escalabilidade em alto grau se faz necessária a empresas que utilizam um banco de dados de grande porte e onde a disponibilidade é um fator decisivo. Acredito que a utilização de um banco de dados NoSQL onde a escalabilidade e a disponibilidade não se demonstre determinante, ainda é algo que é necessário discutir.

Neste sentido, este artigo teve a finalidade de explicar as principais características dos bancos de dados NoSQL e de forma mais concisa o banco de dados Relacional, assim como realizar algumas análises comparativas entre estes dois modelos que atualmente disputam e complementam o mercado. Ressaltando que não existe um banco de dados superior ao outro, a decisão do uso de cada um se refere à necessidade que a empresa está enfrentando.

Referências1. http://www.jornaltemporeal.com/2010/06/10/o-crescimento-da-internet-o-avanco-da-tecnologia-pelo-mundo/

2. http://nosql-database.org/

3. http://uniredes.org/kb/?View=entry&EntryID=224

4. http://www.ime.usp.br/~andrers/aulas/bd2005-1/aula11.html

5. http://www.dicasparacomputador.com/pesquisa-revela-que-empresas-tem-dificuldade-administrar-grandes-volumes-dados.

6. http://www.infoq.com/br/news/2011/08/facebook-maior-migracao.

7. http://escalabilidade.com/2010/03/08/introducao-ao-nosql-parte-i/.

8. http://blog.caelum.com.br/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/

9. F. Chang , J. Dean , S. Ghemawat , W. C. Hsieh , D. A. Wallach , M. Burrows , T. Chandra , A. Fikes , R. E. Gruber, “Bigtable: A distributed storage system for structured data”, In Proceedings of the 7th Conference on Usenix Symposium on Operating Systems Design And Implementation, Volume 7, 2006.

10. Lakshman, P. Malik, “Cassandra – A Decentralized Structured Storage System”, LADIS 2009.

11. http://computerworld.uol.com.br/tecnologia/2010/02/23/crescimento-faz-twitter-trocar-o mysql-pelo-cassandra/.

12. J. C. Anderson, N. Slater, J. Lehnardt,, “CouchDB: The Definitive Guide”, 1ª edição, O’Reilly Media, 2009.

13. http://www.mongodb.org/.

14. http://www.igvita.com/2010/03/01/schema-free-mysql-vs-nosql/.

15. http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases.

16. http://ccsl.ime.usp.br/wiki/images/2/20/NoSQL_Vantagens_Desvantagens_e_Compromissos.pdf.

17. http://www.nosqldatabases.com/main/tag/consistent-hashing.

18. http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases.

19. https://www.ibm.com/developerworks/mydeveloperworks/blogs/fd26864d-cb41-49cf-b719-d89c6b072893/entry/escolhendo_a_ferramenta_certa_para_o_banco_de_dados_nosql1?lang=en.

20. http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html.

21. http://nosqlba.com.br/.

22. http://idgnow.uol.com.br/internet/2009/02/19/twitter-e-o-servico-social-mais-instavel durante-2008-aponta-estudo/.

23. http://www.ffb.edu.br/sites/default/files/tcc-20102-gleidson-sobreira-leite.pdf .

24. W. Vogels, “Eventually Consistent”, Scalable Web Services, Volume 6 No. 6, Outubro de 2008.

Fonte: https://www.devmedia.com.br/banco-de-dados-nosql-um-novo-paradigma-revista-sql-magazine-102/25918

Leitor de cédulas para deficientes visuais

Trabalho de conclusão de curso
apresentado à Faculdade de Americana,
como requisito parcial para a obtenção
do título de Bacharel em Engenharia
Elétrica.
Orientador: Professor MSc. Alysson
Fernandes Mazoni

 

 

RESUMO
O objetivo deste trabalho é o desenvolvimento de um leitor de cédulas
de dinheiro para deficientes visuais que fosse prático e utilizasse componentes
de baixo custo. O projeto utiliza o Arduino como microcontrolador e um sensor
de cores para a distinção dos valores das cédulas. No estudo foi possível
identificar que diversos aspectos podem influenciar na identificação das notas,
como por exemplo, a distância que as medições são realizadas e a
luminosidade do ambiente. Assim foi desenvolvida uma padronização para as
medidas e uma calibração para toná-las confiáveis. Através dos resultados
obtidos foi possível comprovar que o leitor de cédulas identifica corretamente
os valores das notas.
Palavras-chave: Deficientes visuais, Leitor de cédulas, Sensor de cores, Arduino.

 

 

Fonte: http://aplicacao.vestibularfam.com.br:881/pergamumweb/vinculos/000002/00000228.pdf

Fonte: http://www.faculdadedeamericana.com.br/revista/index.php/TCC/article/view/167/158

Como criar um projeto no Firebase

Use serviços como autenticação, banco de dados em tempo real e notificações push de forma simples e integrada.

Acesse o site do Firebase — firebase.google.com — e clique no botão “Comece a usar gratuitamente”. Você vai precisar de um e-mail e senha para criar um novo perfil (caso ainda não tenha).

Assim que se cadastrar, você será redirecionado para o seu painel (console)e poderá criar projetos. Clique no botão “Criar novo projeto”.

Depois escolha um nome para o seu projeto e um país. Para esse projeto modelo, eu escolhi o nome “tutorial”. Depois clique em “Criar projeto”.
No painel de visão geral do seu novo projeto, na lateral esquerda há um menu com os serviços oferecidos pelo Firebase. Falaremos em outros posts, especificamente sobre autenticação, banco de dados de tempo real e armazenamento.

Em projetos web ou híbridos, incluindo Ionic 2 ou Angular 2, vamos precisar de um objeto javascript contendo as credenciais de integração com o Firebase. Você pode copiá-lo clicando no ícone “Adicionar o Firebase ao seu aplicativo da Web”, ilustrado na figura acima. O objeto irá se parecer com:

  var config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    storageBucket: "...",
    messagingSenderId: "..."
  };

É isso! Guarde esse objeto (ou lembre-se de como acessá-lo novamente) para usarmos na integração com nossos próximos projetos.

Se gostou do tutorial, curta e compartilhe!

 

 

 

Como criar um projeto Ionic 2.x

Nesse tutorial vamos aprender de forma simples como instalar e configurar nosso primeiro aplicativo usando o Ionic 2.

Projetos com Ionic 2 são criados via linha de comando, usando uma ferramenta chamada Ionic CLI (command line utility). Além dela, para ter acesso às funcionalidades nativas do seu smartphone ou tablet, precisa-se de uma outra ferramenta: o Cordova.

Para instalar o Ionic CLI e o Cordova, abra uma janela de comandos (Prompt de Comandos) no Windows e digite:

npm install -g ionic cordova

Assim que ele terminar o processo, você já pode criar o seu primeiro projeto, usando o comando:

ionic start tutorial --v2

Você pode escolher o nome que quiser para o projeto. Aqui, usamos tutorial. Uma pasta com os arquivos-base de um projeto Ionic 2 é então criada no seu sistema de arquivos.

Para acessar essa pasta via janela de comandos do Windows, use o comando:

cd tutorial

Agora que você se encontra dentro da pasta do projeto, basta executar o comando:

ionic serve --lab

Ao final, seus comandos se parecerão com essa tela:

Pronto! Isso é tudo por agora. Você vai visualizar no seu navegador uma aba com 3 simulações de telas, uma para cada tipo de dispositivo que o Ionic 2 suporta (Android, iOS e Windows Phone).

No próximo tutorial, falaremos dos componentes de um projeto Ionic 2.

 

Se gostou, compartilhe!

 

Fonte: https://medium.com/@adsonrocha/como-criar-um-projeto-ionic-2-d7db3b5728e7

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

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