Bitcoin e Blockchain para leigos

O ativo financeiro digital mais famoso da internet é o BitcoinQue funciona em cima de uma tecnologia chamada “Blockchain”, que registra todas as transações envolvendo bitcoins, eletronicamente numa espécie de livro-razão imutável e criptografado.

Uma das característica do Bitcoin é mecanismo é que o registro dos negócios não é centralizado ou administrado por uma única instituição. O histórico das transações é armazenado em blocos que somente se encaixam se for utilizada certo tipo de assinatura digital.

E para haver a efetiva liquidação das operações, a cadeia de transações deve ser validada pelos demais participantes do mercado(mineradores, que emprestam sua força computacional para validar transações e criar novos bitcoins na rede, com isso ganham frações de bitcoins), para isso precisam confirmar a veracidade da chave pública divulgada. O desenvolvimento dessa intrincada engrenagem é atribuído a uma pessoa – ou a um grupo – que usou o pseudônimo de SatoshiNakamoto. Tecnologia criada em 2008, que seu autor até hoje permanece no anonimato.

Na prática a tecnologia do “Blockchain” implica mudança significativa na forma como a internet pode ser utilizada. Como distribuir e compartilhar informações, passa ser possível a transferência eletrônica da propriedade de ativos.

Por essa razão, a expectativa é que, no futuro próximo, será construída uma internet dos valores. Nesse novo ambiente, ao enviar um arquivo contendo determinado código, a propriedade do bem será automaticamente transferida.

Com o Blockchain já é possível imaginar diversos usos para a tecnologia, tais como contratos inteligentes onde se encerram e automaticamente, operações no mercado financeiro onde você poderá custodiar suas ações e trocá-las, transações de comércio internacional e a compra e venda de imóveis, registros de casamentos, nascimento e falecimento.

Hoje já existem 16,5 milhões de bitcoins no mercado. Por definição, o estoque máximo de bitcoins emitidos será de 21 milhões de unidades.

Nota: “Um” bitcoin é dividido em oito casas decimais (1.00000000), fracionando o seu valor, sendo assim você pode comprar frações de bitcoins, que no momento que foi escrito esse texto, a cotação atual comprando R$ 50,00 reais daria por volta de 0,00600000 bitcoins.

Os verificadores das transações, chamados no jargão do mercado de mineradores, podem criar bitcoins conforme o volume de cálculos executados, a rede dificulta a quantidade de bitcoins criados, pela quantidade de mineradores trabalhando nela e com tempo pelo seu processo deflacionário, escassez. A rede de mineradores é que garante o processamento das transações e a segurança do mercado(mineradores, são quaisquer pessoas que emprestam sua força computacional para validar e registrar as transações).

Leia também  Novo regulamento de criptomoedas da Coréia do Sul proíbe completamente Marketing Multinível

À prova de balas e transparente

Ninguém foi capaz, pelo menos por enquanto, de invadir o sistema para criar bitcoins falsos. Isso tem garantido a confiança na segurança da estrutura e atraído novos participantes.

Nas operações bancárias tradicionais, o Banco é a instituição responsável pelo controle do livro caixa das transações. E cobra altas tarifas por esse serviço, e sem contar que a qualquer momento pode “confiscar a sua poupança”, como já vimos há tempos atrás.

Por exemplo, para enviar um TED ou DOC, o Banco exige o pagamento de determinada remuneração. O mesmo acontece para manter a conta corrente ativa e emitir extratos, já o Bitcoin, você não precisa pagar taxas de custódia, manutenção, extratos, apenas paga pela sua transferência, uma taxa irrisória.

As operadoras de cartão de crédito também cobram para processar as transações entre lojistas e consumidores e também taxas de anuidade. O mesmo acontece com as bolsas de valores e de mercadorias para administrar a posição de cada investidor cobrando taxa de custódia e corretagens.

Em algumas transações os custos podem ser tão altos a ponto de inviabilizar as operações de pequeno montante, como no caso das transferências internacionais de valores financeiros, onde são inseridas novas taxas e ainda pode demorar dias para se concretizar, se concretizar… Onde pode aumentar o prazo, dependendo de finais de semanas e feriados.

Aceitação do Bitcoin no mundo

Uma das ideias do Bitcoin, portanto, é baratear os custos das transações, com valores irrisórios comparados a Bancos. A consequência pode ser o aumento no volume de negócios.

Por exemplo, um desenvolvedor de softwares no Brasil pode contratar os serviços de um programador na Ucrânia e pagar pelo trabalho por meio da transferência de bitcoins. Nessa situação o Bitcoin é usado como um meio de troca.

Considerando que a atual estrutura da internet já viabiliza a troca de arquivos sem barreiras geográficas, o uso em larga escala do bitcoin teria o efeito de estimular o comércio global de bens e serviços, com transferência de bitcoin para qualquer parte do mundo, com tempo médio de 10 minutos..

Leia também  Coreia do Sul prepara-se para taxar o uso do Bitcoin

Dado que o bitcoin possui cotação tanto em dólares quanto nas demais moedas mundiais, o programador ucraniano do exemplo poderia optar por manter parte de sua remuneração recebida do desenvolvedor brasileiro em bitcoins, como uma poupança.

Por fim, a decisão do programador ucraniano poderia ser a de gastar parte dos bitcoins na compra de produtos e serviços para serem consumidos, ou comprar produtos para o aperfeiçoamento do seu trabalho, tal como computadores e eletrônicos. A empresa americana Dell Computer, que fabrica computadores e notebooks, é um das lojas que aceitam bitcoin, na compra de seus produtos. Existe também um site brasileiro, chamado “Classificados BTC“, onde é possível comprar e vender produtos e serviços, com bitcoin.

Mesmo o Bitcoin não sendo considerado uma “moeda” (meio de troca, unidade de conta e reserva de valor; baseado no conceito econômico), pelos economistas, ainda sim é um excelente meio de troca, universalmente aceito, ainda que galgando.

O Bitcoin possui um valor especulativo. A cotação de um bitcoin saltou de pouco menos de US$ 300 em julho de 2015 para mais de US$ 2 mil em julho de 2017.

Para negociar Bitcoin, vale o alerta: como em todo investimento especulativo, é fundamental conhecer os riscos envolvidos, mas ao mesmo tempo o Bitcoin não é definido pelo preço, e sim sua tecnologia disruptiva que vamos descrever abaixo:

Bitcoin

  • 24h – Bitcoin funciona 24 horas por dia, 365 dias no ano, nunca para e as transações podem acontecer a qualquer hora do dia ou da noite, independente de finais de semanas e feriados.
  • Rápido – simples como enviar um e-mail ou sms, de um telefone móvel.
  • Descentralizado – não tem um controlador central, podemos transacionar com qualquer pessoa sem depender de um intermediador, uma rede ponto-a-ponto ou peer-to-peer, parecida com a rede do BitTorrent. BTC, também conhecido como Bitcoin, é um sistema livre, que não pode ser confiscado, como já aconteceu com a poupança nos anos 90.
  • Deflacionário – ao contrário do dinheiro emitido a esmo pelos Bancos Centrais, que geram inflação, o bitcoin é deflacionário e poderá ser criado somente 21 milhões, onde são criados em uma ordem decrescente.
  • Sistema de pagamento – O bitcoin é um ativo ao portadorvocê pode ser seu próprio Banco, transacionando e custodiando seus BTCs (a sigla de bitcoin).
  • Meio de troca – uma das maiores construtoras  do Brasil, a Tecnisa, aceita bitcoin como meio de pagamento em seus imóveis e várias pessoas no Brasil já entenderam as vantagens de aceitar Bitcoin e estão vendendo desde eletrônicos, até carros e casas de luxo, no Classificados BTC.
  • Privacidade – você pode ter milhões em Bitcoins, sem ter sua vida exposta pela FORBES, pois o seu nome não será divulgado na rede, você será identificado na rede com uma chave pública(parecida com essa: 1hlY78hOwe46VCd90oNuRX2j80se43WZ).
  • Segurança – a rede conjuntamente faz com que as regras sejam cumpridas, e acompanhada de uma resposta rápida dos seus usuários se alguém tentar fraldar o sistema, e também o custo benefício não compensa
  • Barato – custo irrisório, seja para enviar bitcoin para seu vizinho ou para o Japão, o custo é o mesmo.
  • Transparência – Bitcoin é um sistema de código aberto e as transações estão totalmente disponíveis para auditoria de qualquer pessoa, em tempo real, elas ficão registradas no Blockchain, o livro razão imutável com todas as transações da história do software Bitcoin registradas.
  • Inclusão social – metade da população brasileira não tem acesso a contas bancárias, por “N” motivos, mas o Bitcoin veio para mudar essa situação, onde quem quiser transferir dinheiro para qualquer parte do mundo, seja para se incluir no sistema financeiro ou ajudar em uma catástrofe mundial, você só precisa de um telefone móvel, acesso a internet e baixar o software do Bitcoin para transferir recursos para qualquer parte do mundo ou mesmo se incluir nele.
Com o Blockchain, Bitcoin é apenas o começo!

 

Fonte: https://guiadobitcoin.com.br/bitcoin-e-blockchain-para-leigos/

Anúncios

A segurança do bitcoin pela força computacional

 

A segurança no bitcoin é alcançada pela descentralização e pela força computacional. Este não é um vídeo técnico, mas sim uma visão geral do funcionamento da tecnologia.

Para fontes mais técnicas e detalhas, ver artigos abaixo.

Para saber mais:

Artigo “A grande inovação tecnológica do bitcoin Parte 1/2” http://www.infomoney.com.br/blogs/cam… Mining Bitcoin Wiki: https://en.bitcoin.it/wiki/Mining

Beginners’ Guide to Mining: https://99bitcoins.com/beginners-guid…

Bitcoin Mining Explained: https://chrispacia.wordpress.com/2013…

Everything you need to know about BTC mining: https://www.bitcoinmining.com/

How the bitcoin protocol actually works: http://www.michaelnielsen.org/ddi/how…

“Bitcoin – a Moeda na Era Digital”, livro publicado pelo Instituto Mises Brasil em 2014. http://www.mises.org.br/Ebook.aspx?id=99

Blog “Moeda na Era Digital” no portal InfoMoney http://www.infomoney.com.br/blogs/cam…

Está pensando em usar ou comprar bitcoin? Leia aqui antes: http://www.infomoney.com.br/blogs/cam…

Apoie este canal! Bitcoin: 1C6qa2DctPUcyAasDkgdBTJjhgpXaVjcUE

Contatos: Email: ulrich@mises.org.br

Facebook: https://www.facebook.com/fernando.ulrich

Twitter: https://twitter.com/fernandoulrich

SQL em PL / SQL

Neste tutorial, vamos aprender como usar o SQL em PL / SQL. O SQL é o componente atual que cuida da busca e atualização de dados no banco de dados, ao passo que PL / SQL é o componente que processa esses dados. Além disso, neste artigo, também discutiremos como combinar o SQL no bloco PL / SQL.

 

Neste tutorial, você aprenderá –

Transações DML em PL / SQL

CURSOR Concept em PL / SQL

Atributos do cursor

FOR Loop Cursor statement

BULK COLLECT em PL / SQL

Declarações TCL em PL / SQL

Transação Autônoma

Transações DML em PL / SQL

DML significa Idioma de Manipulação de Dados . Essas declarações são usadas principalmente para realizar a atividade de manipulação. Trata-se basicamente das operações abaixo.

Inserção de dados

Atualização de dados

Eliminação de dados

Projeção de dados / busca

Em PL / SQL, podemos fazer a manipulação de dados somente usando os comandos SQL.

Inserção de dados

Em PL / SQL, podemos inserir os dados em qualquer tabela usando o comando SQL INSERT INTO. Este comando levará o nome da tabela, a coluna da tabela e os valores das colunas como a entrada e insira o valor na tabela base.

O comando INSERT também pode levar os valores diretamente de outra tabela usando a instrução ‘SELECT’ ao invés de dar os valores para cada coluna. Através da instrução “SELECT”, podemos inserir tantas linhas como a tabela base contém.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando INSERT INTO. O nome e os valores da tabela são campos obrigatórios, enquanto os nomes das colunas não são obrigatórios se as instruções do inserto tiverem valores para toda a coluna da tabela.

A palavra-chave ‘VALORES’ é obrigatória se os valores forem dados separadamente, como mostrado acima.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando INSERT INTO que leva os valores diretamente do <table_name2> usando o comando SELECT.

A palavra-chave “VALORES” não deve estar presente neste caso, pois os valores não são fornecidos separadamente.

Atualização de dados

Atualização de dados simplesmente significa uma atualização do valor de qualquer coluna na tabela. Isso pode ser feito usando a instrução ‘UPDATE’. Esta declaração leva o nome da tabela, o nome da coluna e o valor como entrada e atualiza os dados.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra a UPDATE. A palavra-chave ‘SET’ instrui esse mecanismo PL / SQL para atualizar o valor da coluna com o valor fornecido.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, o valor da coluna mencionada em toda a tabela será atualizado.

Eliminação de dados

A eliminação de dados significa excluir um registro completo da tabela do banco de dados. O comando ‘DELETE’ é usado para este propósito.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando DELETE. A palavra-chave ‘FROM’ é opcional e com ou sem a cláusula ‘FROM’ o comando se comporta da mesma forma.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, a tabela inteira será excluída.

Projeção de dados / busca

A projeção / busca de dados significa para recuperar os dados necessários da tabela do banco de dados. Isso pode ser alcançado usando o comando ‘SELECIONAR’ com a cláusula ‘INTO’. O comando ‘SELECT’ vai buscar os valores do banco de dados e cláusula de ‘INTO’ irá atribuir esses valores para a variável local do bloco PL / SQL.

Abaixo estão os pontos que precisam ser considerados na indicação “SELECIONAR”.

A instrução “SELECT” deve retornar apenas um registro enquanto usa a cláusula ‘INTO’, uma vez que uma variável pode conter apenas um valor. Se o ‘SELECT’ instrução retorna mais de um valor de exceção ‘TOO_MANY_ROWS’ será gerado.

A instrução “SELECT” atribuirá o valor à variável na cláusula ‘INTO’, por isso precisa obter pelo menos um registro da tabela para preencher o valor. Se não obteve nenhum registro, então a exceção ‘NO_DATA_FOUND’ é gerada.

O número de colunas e seu tipo de dados na cláusula ‘SELECIONAR’ devem corresponder com o número de variáveis ​​e seus tipos de dados na cláusula ‘INTO’.

Os valores são obtidos e preenchidos na mesma ordem mencionada na declaração.

A cláusula “WHERE” é opcional que permite ter mais restrição nos registros que serão obtidos.

A instrução “SELECT” pode ser usada na condição ‘WHERE’ de outras instruções DML para definir os valores das condições.

A instrução ‘SELECT’ ao usar as instruções ‘INSERT’, ‘UPDATE’, ‘DELETE’ não deve ter a cláusula ‘INTO’, uma vez que não irá preencher nenhuma variável nesses casos.

SQL em PL / SQL

Sintaxe Explicação:

A sintaxe acima mostra o comando SELECT-INTO. A palavra-chave ‘FROM’ é obrigatória que identifica o nome da tabela a partir do qual os dados precisam ser obtidos.

A cláusula “WHERE” é opcional. Se esta cláusula não for fornecida, os dados de toda a tabela serão obtidos.

Exemplo 1 : neste exemplo, vamos ver como executar operações DML em PL / SQL. Vamos inserir os seguintes 4 registros na tabela emp.

EMP_NAME EMP_NO SALÁRIO GERENTE
BBB 1000 25000 AAA
XXX 1001 10000 BBB
AAAA 1002 10000 BBB
ZZZ 1003 7500 BBB

Então, vamos atualizar o salário de ‘XXX’ para 15000, e vamos excluir o registro do funcionário ‘ZZZ’. Finalmente, vamos projetar os detalhes do “XXX” do empregado.

SQL em PL / SQL

SQL em PL / SQL

Explicação do código:

Código linha 2-5 : Declarando a variável.

Código linha 7-14 : Inserindo os registros na tabela emp.

Código linha 15 : Cometer as transações inserir.

Código linha 17-19 : atualizando o salário do empregado ‘XXX’ para 15000

Código linha 20 : Cometer a transação de atualização.

Código linha 22 : Excluindo o registro de ‘ZZZ’

Código linha 23 : Cometer a transação de exclusão.

  • Linha de código 25-27 : Selecionando a gravação de ‘XXX’ e preenchendo na variável l_emp_name, l_emp_no, l_salary, l_manager.

 

Linha de código 28-32 : exibindo o valor de registros obtidos.

CURSOR Concept em PL / SQL

O Oracle cria uma área de memória, conhecida como área de contexto, para processar uma instrução SQL, que contém todas as informações sobre a declaração, por exemplo, número de linhas processadas, etc. O cursor não é senão um ponteiro para essa área de contexto.

O PL / SQL permite ao programador controlar a área de contexto através do cursor. Um cursor contém as linhas retornadas pela instrução SQL. O conjunto de linhas que o cursor mantém é referido como conjunto ativo. Esses cursores também podem ser nomeados para que possam ser encaminhados a partir de outro local do código.

O cursor é de dois tipos.

Cursor implícito

Cursor explícito

Cursor implícito

Sempre que ocorrem operações DML no banco de dados, é criado um cursor implícito que contém as linhas afetadas, naquela operação específica. Esses cursores não podem ser nomeados e, portanto, não podem ser controlados ou encaminhados a partir de outro local do código. Podemos referir-se apenas ao cursor mais recente através dos atributos do cursor.

Cursor explícito

Os programadores podem criar área de contexto nomeada para executar suas operações DML para obter mais controle sobre isso. O cursor explícito deve ser definido na seção de declaração do bloco PL / SQL e é criado para a instrução ‘SELECT’ que precisa ser usada no código.

Abaixo estão as etapas que envolvem o trabalho com cursores explícitos.

Declarando o cursorDeclarar o cursor significa simplesmente criar uma área de contexto nomeada para a instrução ‘SELECIONAR’ que está definida na parte da declaração. O nome dessa área de contexto é o mesmo que o nome do cursor.

Cursor de aberturaAbrir o cursor instruirá o PL / SQL a alocar a memória para este cursor. Ele irá preparar o cursor para buscar os registros.

Obtendo Dados do CursorNeste processo, a instrução ‘SELECT’ é executada e as linhas obtidas são armazenadas na memória alocada. Estes são agora chamados de conjuntos ativos. Obter dados do cursor é uma atividade de nível recorde, o que significa que podemos acessar os dados de maneira recorde por gravação.Cada instrução fetch buscará um conjunto ativo e contém as informações desse registro específico. Esta declaração é a mesma que a instrução “SELECIONAR” que obtém a gravação e atribua à variável na cláusula ‘INTO’, mas não lançará nenhuma exceção.

Fechar o cursorUma vez que todos os registros são buscados, precisamos fechar o cursor para que a memória alocada para essa área de contexto seja lançada.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a parte de declaração contém a declaração do cursor e a variável de cursor na qual os dados obtidos serão atribuídos.
  • O cursor é criado para a instrução ‘SELECT’ que é dada na declaração do cursor.
  • Na parte de execução, o cursor declarado é aberto, recuperado e fechado.

Atributos do cursor

Tanto o cursor implícito como o cursor explícito possuem certos atributos que podem ser acessados. Esses atributos fornecem mais informações sobre as operações do cursor. Abaixo estão os diferentes atributos do cursor e seu uso.

Atributo do Cursor Descrição
%ENCONTRADO Retorna o resultado booleano ‘VERDADEIRO’ se a operação de busca mais recente forçou uma gravação com sucesso, caso contrário, ela retornará FALSA
%NÃO ENCONTRADO Isso funciona da maneira oposta ao% FOUND retornará ‘TRUE’ se a operação de busca mais recente não puder obter qualquer registro.
%ESTÁ ABERTO Retorna o resultado booleano ‘TRUE’ se o cursor já estiver aberto, caso contrário ele retorna ‘FALSE’
%CONTAGEM DE LINHAS Ele retorna o valor numérico. Ele fornece a contagem real de registros que foram afetados pela atividade DML.

Exemplo 1 : neste exemplo, vamos ver como declarar, abrir, buscar e fechar o cursor explícito.

Vamos projetar todos os funcionários nome da tabela emp usando um cursor. Nós também usaremos o atributo do cursor para definir o loop para buscar toda a gravação a partir do cursor.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Código linha 3 : Declaração variável lv_emp_name.
  • Código linha 5 : abrindo o cursor guru99_det.
  • Código linha 6: Configurando a instrução do loop básico para buscar todos os registros na tabela ‘emp’.
  • Código linha 7: Obtém os dados guru99_det e atribua o valor a lv_emp_name.
  • Código linha 9: Usando o atributo do cursor ‘% NOTFOUND’ para descobrir se toda a gravação no cursor é buscada. Se for obtido, ele retornará ‘VERDADEIRO’ e o controle sairá do loop, senão o controle continuará comprando os dados do cursor e imprimindo os dados.
  • Código linha 11: condição EXIT para a instrução loop.
  • Linha de código 12: Imprima o nome do funcionário buscado.
  • Linha de código 14: Usando o atributo de cursor ‘% ROWCOUNT’ para encontrar o número total de registros que foram afetados / recuperados no cursor.
  • Código linha 15: Depois de sair do loop, o cursor é fechado e a memória alocada está livre.

FOR Loop Cursor statement

A indicação “PARA LOOP” pode ser usada para trabalhar com cursores. Podemos dar o nome do cursor em vez do limite de intervalo na instrução FOR loop para que o loop funcione a partir da primeira gravação do cursor para a última gravação do cursor. A variável do cursor, a abertura do cursor, a busca e o fechamento do cursor serão realizadas de forma implícita pelo loop FOR.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a parte de declaração contém a declaração do cursor.
  • O cursor é criado para a instrução ‘SELECT’ que é dada na declaração do cursor.
  • Na parte de execução, o cursor declarado é configurado no loop FOR e a variável de loop ‘I’ se comportará como variável de cursor neste caso.

Exemplo 1 : neste exemplo, vamos projetar todo o nome do empregado da tabela emp usando um cursor-FOR loop.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Linha de código 4 : Construindo o loop ‘FOR’ para o cursor com a variável de loop lv_emp_name.
  • Código linha 5: Imprimir o nome do funcionário em cada iteração do loop.
  • Código linha 8: Sair do loop

Nota: No cursor Cursor-FOR, os atributos do cursor não podem ser usados, pois a abertura, a busca eo fechamento do cursor são feitos de forma implícita pelo loop FOR.

BULK COLLECT em PL / SQL

O Oracle PL / SQL fornece a funcionalidade de buscar os registros em massa em vez de buscar um a um. Este BULK COLLECT pode ser usado na instrução ‘SELECT’ para preencher os registros em massa ou em busca do cursor em massa. Uma vez que BULK COLLECT obtém o registro em BULK, a cláusula INTO deve sempre conter uma variável de tipo de coleção. A principal vantagem de usar BULK COLLECT é aumentar o desempenho, reduzindo a interação entre o banco de dados eo mecanismo PL / SQL.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, BULK COLLECT é usado para coletar os dados da indicação ‘SELECT’ e ‘FETCH’.

Cláusula FORALL

O FORALL permite executar as operações DML em dados a granel. É semelhante ao da declaração FOR loop, exceto no FOR loop coisas acontecem no nível recorde, enquanto que no FORALL não existe um conceito LOOP. Em vez disso, todos os dados presentes no intervalo especificado são processados ​​ao mesmo tempo.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a operação DML dada será executada para todos os dados que estão presentes entre um intervalo mais baixo e mais alto.

Cláusula de Limite

O conceito de coleta em massa carrega todos os dados na variável de coleta de destino como um volume, ou seja, todos os dados serão preenchidos na variável de coleta em uma única etapa. Mas isso não é aconselhável quando o registro total que precisa ser carregado é muito grande, porque quando o PL / SQL tenta carregar todos os dados, ele consome mais memória de sessão. Por isso, é sempre bom limitar o tamanho desta operação de coleta em massa.

No entanto, esse limite de tamanho pode ser facilmente alcançado através da introdução da condição ROWNUM na instrução ‘SELECT’, enquanto que no caso do cursor isso não é possível.

Para superar este Oracle forneceu uma cláusula ‘LIMIT’ que define o número de registros que precisam ser incluídos no volume.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, a instrução de busca do cursor usa a instrução BULK COLLECT juntamente com a cláusula LIMIT.

BULK COLLECT Atributos

Semelhante aos atributos do cursor BULK COLLECT tem% BULK_ROWCOUNT (n) que retorna o número de linhas afetadas na n ª declaração DML da instrução FORALL, ou seja, dará a contagem de registros afetados na declaração FORALL para cada valor da coleção variável. O termo ‘n’ indica a seqüência de valor na coleção, para a qual a contagem de linhas é necessária.

Exemplo 1 : neste exemplo, vamos projetar todo o nome do empregado da tabela emp usando BULK COLLECT e também aumentaremos o salário de todos os funcionários em 5000 usando o FORALL.

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : Declarando o cursor guru99_det para a instrução ‘SELECT emp_name FROM emp’.
  • Código linha 3 : Declarando lv_emp_name_tbl como tipo de tabela do VARCHAR2 (50)
  • Código linha 4 : Declarando lv_emp_name como lv_emp_name_tbl tipo.
  • Código linha 6: abrindo o cursor.
  • Código linha 7: Preenchendo o cursor usando BULK COLLECT com o tamanho LIMIT como 5000 intl lv_emp_name variável.
  • Código da linha 8-11: Configurando FOR loop para imprimir toda a gravação na coleção lv_emp_name.
  • Código linha 12: Usando FORALL atualizando o salário de todo o empregado em 5000.
  • Linha de código 14: Comprometer a transação.

Declarações TCL em PL / SQL

O TCL significa declarações de controle de transações. Ele irá salvar as transações pendentes ou reverter a transação pendente. Essas declarações desempenham o papel vital porque, a menos que a transação seja salva, as alterações por meio de instruções DML não serão salvas no banco de dados. Abaixo estão as diferentes declarações TCL.

COMMIT Salva toda a transação pendente
ROLLBACK Descarte toda a transação pendente
SAVEPOINT Cria um ponto na transação até que o retorno pode ser feito mais tarde
ROLLBACK TO Descarte toda a transação pendente até o especificado <save point>

A transação será completa nos seguintes cenários.

  • Quando qualquer uma das declarações acima é emitida (exceto SAVEPOINT)
  • Quando as declarações DDL são emitidas. (DML são declarações de confirmação automática)
  • QUANDO as declarações DCL são emitidas. (DCL são declarações de confirmação automática)

Transação Autônoma

Em PL / SQL, todas as modificações feitas em dados serão denominadas como uma transação. Uma transação é considerada completa quando o save / descarte é aplicado a ele. Se não for salvo / descartar, a transação não será considerada como completa e as modificações feitas nos dados não serão tornadas permanentes no servidor.

Independentemente de uma série de modificações feitas durante uma sessão, PL / SQL tratará toda a modificação como uma única transação e salvar / descartar essa transação afeta todas as mudanças pendentes naquela sessão. A Transação Autônoma fornece uma funcionalidade para o desenvolvedor em que permite fazer alterações em uma transação separada e salvar / descartar essa transação específica sem afetar a transação da sessão principal.

  • Essa transação autônoma pode ser especificada no nível do subprograma.
  • Para fazer qualquer subprograma para funcionar em uma transação diferente, a palavra-chave ‘PRAGMA AUTONOMOUS_TRANSATION’ deve ser fornecida na seção declarativa desse bloco.
  • Ele instruirá esse compilador a tratar isso como a transação separada e salvar / descartar dentro deste bloco não refletirá na transação principal.
  • Emitir COMMIT ou ROLLBACK é obrigatório antes de sair desta transação autônoma para a transação principal porque, em qualquer momento, apenas uma transação pode estar ativa.
  • Então, uma vez que fizemos uma transação autônoma, precisamos salvá-la e concluir a transação, então só podemos voltar para a transação principal.

SQL em PL / SQL

Sintaxe Explicação:

  • Na sintaxe acima, o bloco foi feito como uma transação autônoma.

Exemplo 1 : neste exemplo, vamos entender como a transação autônoma está funcionando.

SQL em PL / SQL

SQL em PL / SQL

Explicação do código:

  • Código linha 2 : declarando l_salary como NUMBER.
  • Código linha 3 : declarando procedimento de bloqueio aninhado
  • Código linha 4 : Fazendo o procedimento nested_block como ‘AUTONOMOUS_TRANSACTION’.
  • Código linha 7-9: aumentando o salário para o empregado número 1002 em 15000.
  • Código linha 10: Comprometer a transação.
  • Código linha 13-16: Imprimir os detalhes salariais dos funcionários 1001 e 1002 antes das alterações.
  • Código linha 17-19: aumentando o salário para o empregado número 1001 em 5000.
  • Código linha 20: Chamando o procedimento aninhado_block;
  • Código linha 21: descartar a transação principal.
  • Código linha 22-25: Imprimindo os detalhes do salário dos empregados 1001 e 1002 após as mudanças.
  • O aumento de salário para o empregado número 1001 não é refletido porque a principal transação foi descartada. O aumento de salário para o empregado número 1002 é refletido porque esse bloco foi feito como uma transação separada e salvo no final.
  • Portanto, independentemente da gravação / descarte na transação principal, as alterações na transação autônoma foram salvas sem afetar as principais alterações de transação.

Resumo

Neste tutorial, aprendemos a combinar o SQL em PL / SQL para manipulação de dados, Cursor Concepts, Cursor-FOR loop e Bulk collect usages. Nós também discutimos as declarações da TCL e como salvar / descartar transações separadamente.

Fonte

https://www.guru99.com/sql-pl-sql.html

Nós quase demos em construir cérebros artificiais

Hoje, as redes neurais artificiais estão fazendo arte, escrevendo discursos, identificando rostos e até mesmo dirigindo carros. Parece que estamos montando a onda de uma era tecnológica inovadora, mas o aumento atual das redes neurais é realmente uma espécie de renascimento.

Pode ser difícil de acreditar, mas os pesquisadores de inteligência artificial já começaram a ver a promessa nas redes neurais durante a Segunda Guerra Mundial em seus modelos matemáticos. Mas, na década de 1970, o campo estava pronto para desistir deles inteiramente.

“[T] aqui não houve resultados impressionantes até que os computadores crescessem, isto é, até os últimos 10 anos”, diz Patrick Henry Winston, professor do MIT especializado em inteligência artificial. “Continua a ser o facilitador mais importante do aprendizado profundo”.

Redes Neurais

As redes neurais de hoje são essencialmente árvores de decisão que dependem da lógica matemática que se assemelha, por falta de uma melhor analogia, ao disparo de sinapses no cérebro humano. Várias camadas de neurônios artificiais, ou nós, são utilizados para chegar à solução de um problema. À medida que os dados são alimentados através das camadas, uma computação simples ocorre em cada nó e a solução é passada para a próxima camada de neurônios para outra rodada de cálculos. O tempo todo, a matemática que ocorre em cada neurônio está sendo ligeiramente modificada pelo resultado anterior. Desta forma, uma rede neural pode se ensinar padrões em dados que combinam com uma solução desejada e otimizar o caminho para ele, como ajustar um violão. Quanto mais dados você alimenta uma rede neural, melhor fica ao ajustar seus neurônios e encontrar um padrão desejado.

Enquanto o campo emergiu nos últimos anos como um tour de force para especialistas em informática e até mesmo alguns hobbyists, a história da rede neural remonta até o início dos computadores. O primeiro mapa de uma rede neural veio em 1943 em um artigo de Warren Sturgis McCulloch e Walter Pitts. Mas o quadro de McCulloch tinha pouco a ver com a computação; Em vez disso, ele estava focado na estrutura e função do cérebro humano. O modelo de função de neurônio de McCulloch-Pitts, é claro, surgiu durante um tempo em que a tecnologia para monitorar essa atividade não existia.

McCulloch e Pitts acreditavam que cada neurônio no cérebro funcionaria como um interruptor on-off (como números binários 1 e 0), e que as combinações desses neurônios disparariam ou desativariam, produzindo decisões lógicas. Na época, havia muitas teorias concorrentes para descrever a forma como o cérebro operava, mas de acordo com um artigo de Gualtiero Piccinni da Universidade do Missouri, St. Louis, o modelo de McCulloch-Pitts fez algo que os outros não tinham: Funcionam para algo que se assemelhava a um computador simples, e isso despertou interesse em construir um cérebro artificial a partir do zero.

Sucesso inicial

O primeiro sucesso – e esse é um generoso termo – conceito de rede neural foi o algoritmo Perceptron do Frank Rosenblatt da Universidade Cornell. O Perceptron foi originalmente concebido para ser uma máquina, embora a sua primeira implementação fosse como uma classe de redes neurais que pudessem tomar decisões razoavelmente rudimentares. Eventualmente, o algoritmo foi incorporado em um computador com tamanho de geladeira chamado Mark 1, que era uma máquina de reconhecimento de imagem. Possui uma matriz de 400 fotocélulas ligadas à sua rede neural artificial, e poderia identificar uma forma quando era realizada antes do “olho”.

Poucos anos depois, em 1959, ADALINE chegou por meio de pesquisadores da Universidade de Stanford e, na época, era o maior cérebro artificial. Mas, também, só pode lidar com alguns processos por vez e foi concebido como uma demonstração de aprendizagem de máquinas em vez de ser configurado para uma tarefa específica.

Esses pequenos, mas tentadores avanços na computação alimentaram a histeria em torno da inteligência artificial na década de 1950, com a Sciencedirigindo a manchete “Human Brains Replaced?” Em uma questão de 1958 sobre redes neurais. Robôs inteligentes invadiram a ficção científica com um clipe mais rápido. Este mesmo ciclo, porém, repetiu-se com muitos processos automatizados ao longo da história. Como Adelheid Voskuhl apontou nos Andróides no Iluminismo , os autômatos executados no relógio foram construídos no século 18 como uma ameaça para a humanidade e a prova de que as máquinas governariam o mundo no devido tempo. Mas esses andróides do Iluminismo não passaram de marionetes glorificados.

Em meados do século 20, a pesquisa era lenta e não conseguia acompanhar a imaginação pública, como observa o professor de psicologia da Universidade de Toronto, Eyal Reingold. Relata que o cérebro artificial estava prestes a substituir a mente humana tão longe da realidade quanto possível.

“Infelizmente, esses sucessos anteriores causaram que as pessoas exagerassem o potencial das redes neurais, particularmente à luz da limitação na eletrônica, então disponível”, escreveu ele em uma história de inteligência artificial. “Este exagero excessivo, que decorreu do mundo acadêmico e técnico, infectou a literatura geral da época”.

O inverno está chegando

Não era o receio de uma aquisição de robôs que quase mataram a pesquisa da IA ​​no início dos anos 1970, porém; Era uma combinação de fatores. Enquanto o professor de informática do MIT, Marvin Minsky, é muitas vezes acreditado por fornecer um título de morte para Perceptrons, havia muito mais na história.

Havia o problema dos cortes no financiamento do governo. O governo estava canalizando mais dinheiro em programas de tradução que poderiam converter o russo para o inglês quase instantaneamente. As redes neurais iniciais mostraram essas habilidades com um vocabulário de 250 palavras , mas a pesquisa subseqüente foi lenta no melhor. Em meados da década de 1960, uma comissão governamental chamada Comitê Consultivo de Processamento de Linguagem Automática considerou a tradução automática “sem esperança”.

Conforme destacado por Gary Yang, um relatório de 1973 chamado Lightfoot Report também apontou que várias áreas onde a aprendizagem de máquinas poderiam ser aplicadas – como as funções de piloto automático – eram realmente melhor atendidas por métodos muito menos tecnologicamente avançados.

Nils Nilsson, professor aposentado de ciência da computação da Universidade de Stanford, trabalhou nessas primeiras gerações de inteligência artificial. Uma das maiores reivindicações da fama foi Shakey , um robô construído na década de 1960 que poderia realizar um reconhecimento de imagem rudimentar. Foi assim chamado, porque ele se perdeu quando se moveu, usando uma câmera de TV para capturar e entender o mundo ao seu redor. Poderia interpretar as entradas do computador sobre um objeto na sala e interagir com ele de determinadas formas. Também foi um sucesso inicial na rede neural, mas não foi suficiente.

Winston diz que um dos problemas era que as redes neurais não podiam ter uma abordagem abrangente. Ele diz que o documento Perceptron de Marvin Minsky mostrou que outras áreas de pesquisa de inteligência artificial eram necessárias – e que a tecnologia ainda não estava disponível.

“Os escritos de Minsky eram para uma categoria especial de Perceptrons”, diz Nilsson. “A principal razão pela qual a pesquisa sobre redes neurais se desviou na década de 60, que ninguém conseguiu descobrir uma maneira de treinar redes neurais de várias camadas”.

Para resumir: o artigo de Minsky demonstrou que, mesmo no seu mais complexo, a classe Perceptron de AI era muito binária em seus pensamentos, dificultando a habilidade da máquina de aprender a atacar tarefas mais complexas. Na opinião de Minsky, você precisava de diferentes tipos de inteligência artificial para conversar uns aos outros, o que pode ter ultrapassado as capacidades do hardware no momento.

“Minsky era tudo sobre pensar que você precisava de múltiplas representações, métodos e abordagens”, diz ele.

A rede neural começou assim a se retirar da imaginação pública, inaugurando o que foi chamado de “Inverno de Inverno”, onde o financiamento da pesquisa de inteligência artificial secou e muitas linhas de pesquisa pararam. Isso incluiu redes neurais e pesquisa de AI mudou para outras áreas de foco.

“As pessoas trabalharam em uma variedade de coisas: sistemas experientes, o uso da lógica para fazer raciocínio, reconhecimento de fala, visão computacional e robôs”, diz Nilsson. Sistemas experientes, destinados a ser vastos repositórios de conhecimento de especialistas computorizados em declarações de lógica, levaram a um segundo tipo de inverno AI quando suas habilidades também estavam superadas.

Fazendo um retorno

Mas em 1974, Paul Werbos, então estudante de doutorado de Harvard, introduziu uma maneira de melhorar as redes neurais. Ao espalhar várias redes neurais um ao outro, você poderia ter certos erros nos neurônios verificar os outros em um processo chamado backpropagation, uma maneira em que um cérebro artificial poderia “adivinhar” e procurar uma nova decisão.

Isso foi importante. As redes neurais anteriores poderiam ficar penduradas na mesma decisão. Se você colocou várias decisões em um resultado final, a máquina poderia essencialmente usar uma parte da rede neural para verificar novamente outra parte. Isso, de fato, deu uma complexidade em camadas à sua linha de pensamento. Em vez de pensar em preto e branco de entradas verdadeiras / falsas Perceptron, poderia interpretar um valor neutro para chegar a uma decisão pesando vários fatores.

Na verdade, ele iria além das declarações de lógica e na aprendizagem complexa de máquinas.

Era um documento arrojado e avançado – talvez um pouco mais ansioso. Nenhum hardware de computador no momento poderia lidar com operações tão complexas.

Nilsson também aponta para a publicação de 1986 do processamento distribuído paralelo: explorações na microestrutura da cognição de David E. Rumelhart da Universidade da Califórnia em San Diego e James L. McClelland da Universidade Carnegie Mellon. Melhorou o trabalho de Werbos mostrando um dos melhores mapas modernos da rede neural humana, criando o melhor mapa do cérebro.

Este mapa também ajudou a refinar as idéias de Werbo, mostrando como os neurônios funcionaram no cérebro e como você poderia aplicar isso às redes neurais artificiais. Você poderia resolver a incapacidade de entender as funções neutras ao ter outras redes neurais conectadas para obter uma resposta mais “refinada” neutra. Só precisava de um chute de algumas áreas: “grandes avanços no poder do computador e grandes bancos de dados que permitiram” aprendizado profundo “, como disse Nilsson. Esses avanços na computação chegaram. Hoje, os pesquisadores têm o poder de processamento e acesso a troves de dados armazenados em “a nuvem” para ensinar novas funções de algoritmos.

ADALINE e seus primos primitivos podem ter desaparecido da percepção pública, uma vez que a aprendizagem por máquinas passou a ser própria na última década. Mas essa revolução, décadas atrás, não foi dificultada por essas redes neurais. Em vez disso, eles eram de alguma forma muito primitivos e muito avançados para o seu tempo, mas seu tempo certamente chegou.

 

A partir de hoje, não existe mais rede wifi segura

Vulnerabilidades no principal padrão de segurança de wifi utilizado hoje, o WPA2, tornam sua criptografia e medidas de segurança praticamente inúteis.

Crédito: Sunil Soundarapandian

A internet como conhecemos hoje se baseia em confiança.Utilizamos serviços como redes sociais, bancos, e-mails, e outros porque confiamos que ninguém mais está vendo o nossos segredos. Acreditamos que todo o conteúdo enviado online está seguro, seja ele mensagens, senhas, ou nudes.

Na madrugada desta segunda-feira (16) a promessa de uma conexão segura com a internet deixou de ser tão certa. Os pesquisadores Mathy Vanhoef e Frank Piessens, do Departamento de Ciências da Computação da Universidade de Leuven (imec-DistriNet), na Bélgica, divulgaram a pesquisa em que foi descoberta uma vulnerabilidade no protocolo mais seguro para conexões wifi, o WPA2, conforme foi noticiado em primeira mão pelo Ars Technica. A falha ganhou o nome de Key Reinstallation Attacks (ou KRACK).

Na prática, a vulnerabilidade mostra que as conexões wifi não são tão seguras como se pensava. Um atacante pode interceptar a comunicação entre roteador e um dispositivo conectado e capturar todo o tráfego de informações entre os dois pontos de conexão.

Na demonstração do ataque, o especialista explica que primeiramente cria-se um clone da rede, e nesta nova sessão é possível manipular as autenticações com as máquinas que se conectam à rede. O segundo passo é garantir que as vítimas acessem a internet através da rede clonada; quando a pessoa tentar se conectar à rede verdadeira ela será redirecionada para a rede clonada, deixando o atacante em uma posição que permite que ele capture todo o tráfego.

Esta vulnerabilidade deixa sistemas Android e Linux particularmente vulneráveis, pois devido a um bug na implementação destes sistemas, o ataque torna possível resetar a chave de criptografia utilizada, revelando todo o tráfego ao atacante. Segundo o site The Verge, cerca de 41% de todos os sistemas Androidestão vulneráveis ao exploit. Apesar do facilidade nestes sistemas, os pesquisadores salientaram que em suas pesquisas iniciais que outros sistemas também estão vulneráveis, “Apple, Windows, OpenBSD, MediaTek, Linksys, e outros também são afetados por variantes do ataque”.

Neste caso, a única camada de proteção que o usuário teria para proteger suas senhas ao entrar em um site seria o HTTPs, que encriptaria as informações enviadas ao site. Porém, conforme apresentado no vídeo de demonstração feito por um dos pesquisadores, muitas vezes a configuração desta camada não é feita corretamente, o que acaba deixando as informações do usuário expostas.

Conforme os pesquisadores explicaram, a fraqueza é no próprio padrão de wifi e não em implementações individuais, ou seja, qualquer implementação correta do WPA2 provavelmente foi afetada. Para se proteger da vulnerabilidades, a recomendação dos pesquisadores não é muito otimista, “para prevenir os ataques, assim que forem lançadas atualizações desses aparelhos devem ser instaladas”.

A primeiras atualizações já estão sendo lançadas para os sistemas operacionais afetados pela vulnerabilidade. Segundo o The Verge, a Microsoft já lançou uma atualização de emergência que sanaria o problema. A Google, por outro lado informou que lançaria uma correção “nas próximas semanas”.

Leia mais matérias de ciência e tecnologia no canal MOTHERBOARD.
Siga o Motherboard Brasil no Facebook e no Twitter.
Siga a VICE Brasil no Facebook Twitter Instagram .

por Nilton Felipe Postado em TI Com a tag ,

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

Firewall para sua rede doméstica com Raspberry Pi

Embora o Raspberry Pi 3 tenha sido anunciado recentemente , o Raspberry Pi 2 ainda tem muita vida e é mais do que adequado para muitas tarefas interessantes e úteis.

Eu tenho algumas poucas framboesas sentadas ao redor que eu tenho explorado para outros projetos interessantes, um dos quais é a possibilidade de substituir um servidor de rack Intel de núcleo único de 64 bits muito antigo que eu uso para o firewall primário e o roteador no borda da minha rede. Mas antes de interromper o firewall principal e o gateway da minha rede, queria testar o Pi um pouco e ver exatamente o que seria necessário para que isso acontecesse.

 

Substituindo uma torre

 

 

Eu também tenho uma torre Intel de núcleo duplo que uso como firewall e porta lateral para minha rede. Este computador é um exagero extremo para essa tarefa, e eu definitivamente posso usá-lo em um papel mais apropriado. Como este computador fornece acesso não crítico à minha rede, decidi substituí-lo por um Raspberry Pi 2 Model B como teste.

 

Fonte de energia

Eu usei o Raspberry Pi 2 Model B, mas um Raspberry Pi 3 também deveria funcionar. Eu instalei o Pi a partir de um bloco de energia USB de 5V 1.8 A de reposição em um cabo de extensão doméstico padrão que liguei um no-break para fornecer energia consistente. Eu usei um cabo USB muito pequeno para micro-USB do bloco de energia para o conector de alimentação no Pi.

Interruptor KVM

Eu tenho vários dos meus hosts de infraestrutura conectados a um switch KVM de 16 portas com entradas VGA e PS / 2. Eu queria usar o KVM para o Pi também. Liguei a entrada do teclado e do mouse do KVM ao Pi com um cabo adaptador USB / PS / 2. A extremidade USB se conecta ao Pi e aos conectores do plugue do cabo do comutador KVM nos conectores PS / 2 do adaptador. Eu encontrei no passado que algumas marcas do adaptador USB para PS / 2 não funcionam bem.

Para a conexão de vídeo, inicialmente usei um adaptador HDMI para VGA que é uma unidade única e sólida. Este dispositivo produziu muito calor, grande parte do qual foi transmitida para o Pi através do conector HDMI. Posteriormente, substituí a unidade única por um adaptador que tenha um curto comprimento de cabo entre o conector HDMI e o conversor VGA, além de uma unidade de conector que produz e transmite significativamente menos calor.

Instalando o CentOS

Eu uso o CentOS em meus outros servidores de infra-estrutura, então eu queria usá-lo no Pi também. Usando minha principal estação de trabalho Linux, baixei a distribuição ARM de 32 bits do CentOS Userland 7 para o Pi 2 do site do Wiki CentOS , que também contém imagens para outros computadores de placa pequena. Se você estiver usando o Raspberry Pi 3, você deve usar essa imagem em vez disso.

Observe que o nome da imagem pode mudar à medida que as imagens mais recentes são disponibilizadas. Você sempre deve usar a imagem mais recente. Descompusei o arquivo de imagem xz baixado (usando unxz) e usei o comando dd para instalar a imagem em um cartão microSD de 8GB.

dd if=CentOS-Userland-7-armv7hl-Minimal-1511-RaspberryPi2.img of=/dev/sdx

Certifique-se de especificar a localização correta da unidade microSD na sua máquina.

Não são necessárias etapas adicionais para que o cartão microSD seja inicializável. Eu inseri o cartão no slot do cartão microSD na placa Pi. Em seguida, liguei o conector micro-USB da fonte de alimentação ao conector de alimentação no Pi para inicializar até um prompt de login da interface de linha de comando.

Configuração inicial

Entrei como root usando a senha padrão de “centos” (sem as aspas) e alterei imediatamente a senha de root. Eu mudei o nome do host no / etc / hostname e segui as instruções em / root / README para expandir a partição raiz para preencher todo o espaço disponível no cartão microSD. Isso incluiu uma reinicialização.

Neste ponto, eu liguei o adaptador de rede de bordo à minha rede interna, então eu poderia instalar mais software e testar a funcionalidade da rede. Eu instalei vários utilitários que eu acho úteis, incluindo quais, tela, vim, rwhois, mlocate, Midnight Commander (mc), mailx, bind-utils, chrony e wget.

Alguns outros favoritos meus, como no topo e no htop, ainda não estão disponíveis no repositório do CentOS. Eu não instalei estes todos de uma só vez porque não sabia quais estavam faltando. Em vez disso, tive que enfrentar o problema de que uma ferramenta necessária não estava instalada e, em seguida, instalá-la à medida que progredi através das outras etapas desse processo. Felizmente, esta lista tornará as coisas um pouco mais fáceis para você. Claro, você pode usar algumas ferramentas que eu não faço, e eles também podem estar perdendo.

Eu uso chaves SSH para logins da minha rede, então copiei a chave pública SSH da minha estação de trabalho interna primária para o Pi usando ssh-copy-id .

Uma segunda interface de rede

Como este Pi deve ser usado como um firewall, eu precisava de outro adaptador de rede. Depois de tomar o eth0 down, adicionei um dumper ASIX AX88178 USB Gigabit Ethernet. Desconectei minha rede interna do adaptador de rede on-board e liguei-a ao dongle. Eu configurei o dongle como eth1 com um endereço estático na minha rede interna e configurei a Ethernet a bordo com um endereço externo estático e o conectei ao roteador do meu ISP. Certifique-se de usar a linha HWADDR = nos arquivos de configuração da interface para definir o endereço MAC ao qual o arquivo de configuração pertence. Eu também adicionei o endereço IP do gateway e pelo menos dois servidores de nomes para o arquivo de configuração da interface para o adaptador interno.

Eu trouxe ambos os adaptadores de rede e usou ifconfig e alguns comandos de ping para verificar se os adaptadores de rede estavam vinculados aos endereços IP corretos e funcionavam corretamente. Agora eu poderia entrar no Pi de uma sessão de terminal na minha estação de trabalho principal e continuar trabalhando a partir daí.

Atualizações e mais configuração

Agora era hora de instalar todas as atualizações e reiniciar – o que eu fiz. Eu acho interessante que ambas as versões atuais do CentOS para ARM usem coisas como firewalld e systemd, mas ainda usam yum em vez de dnf para gerenciamento de pacotes de alto nível.

Eu tenho alguns alias e comandos de inicialização que eu sempre adiciono ao meu ambiente quando eu instalar um novo host. Esses comandos podem ser adicionados ao / etc / bashrc , ou melhor ainda, como um arquivo separado, /etc/profile.d/mybash.sh . Qualquer arquivo em /etc/profile.d com uma extensão de nome de arquivo .sh é obtido por / etc / bashrc durante o login.

Data e hora

Esta versão do CentOS não possui nenhum tipo de sincronização de tempo instalada por padrão, então eu instalei chrony e configurei chrony.conf com o meu servidor de tempo local NTP. Eu comecei a cronograma e configure systemctl para iniciar o chronyd no arranque. Eu também configurei o link simétrico / etc / localtime para apontar para o arquivo de dados do fuso horário desejado.

Firewall

O novo  firewalld  é realmente exagerado para o meu ambiente, então instalei iptables-services e iptables-utils. Eu configurei um  arquivo padrão  / etc / sysconfig / iptables , então, depois de desativar a conexão de rede externa, parei firewalld e configure systemd para não iniciá-lo no arranque. Comecei o iptables e configure o systemd para iniciá-lo no arranque. Em seguida, eu trouxe a conexão de rede externa de volta.

Viola!

Uma vez que você alcança este ponto, o Pi é totalmente funcional como um firewall e porta lateral.

Seria fácil dar mais duas etapas e torná-lo num roteador. Primeiro, defina o conteúdo do arquivo / proc / sys / net / ipv4 / ip_forward para “1” e, em seguida, adicione ou defina a seguinte linha em /etc/sysctl.conf para “net.ipv4.ip_forward = 1” , o que torna seu computador um roteador. Em seguida, adicione linhas apropriadas para NATing de origem e encaminhamento para o firewall iptables.

Acabei de receber três novos computadores Raspberry Pi 3 ontem. Eu já tenho uma configuração com a imagem CentOS-Userland-7-armv7hl-Minimal-1602-RaspberryPi3.img e terminarei configurando-a nos próximos dias para me tornar meu principal firewall e roteador.

 

Regras IPTables

Uma pessoa perguntou nos comentários para ver as regras IPTables que eu usei para este projeto, e eu suspeito que outros também estão interessados, então aqui estão eles. É um conjunto mínimo bastante padrão que só permite entrada SSH.

 

# Gerado por iptables-save v1.4.16.2 on Thu Feb 21 14:51:28 2013 *filtro : INPUT ACCEPT [0: 0] : AVANÇAR ACEITAR [0: 0] : OUTPUT ACCEPT [0: 0] -A INPUT -m conntrack --ctstate RELACIONADO, ESTABELECIDO -j ACEITAR -A INPUT -p icmp -j ACEITAR -A INPUT -i lo -j ACEITE -A INPUT -i eth0 -j ACEITAR -A INPUT -p tcp -m conntrack --ctstate NOVO -m tcp --portado 22 -j ACEITAR -A INPUT -j REJECT --reject-with icmp-host-proibido -A FORWARD -j REJECT - rejeitar-com icmp-host-proibido COMMIT # Completado em Thu Feb 21 14:51:28 2013

Fonte:  https://opensource.com/life/16/3/firewall-your-home-network-raspberry-pi?utm_medium=Email&utm_campaign=weekly&sc_cid=701f2000000h39XAAQ

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

 

 

 

 

 

Sistemas Operacionais de Tempo Real – Introdução

 

Introdução

Quando se fala em projetos para microcontroladores, especialmente os de 8 ou 16 bits, sempre surgem dúvidas com relação ao sistema operacional. É melhor comprar um sistema operacional ou desenvolver o seu próprio? Como tudo na nossa vida, a resposta a essa pergunta depende sempre da relação custo / benefício da solução. Muitos projetistas se sentem intimidados em projetar o seu próprio sistema, muitas vezes apenas por falta de experiência ou de conhecimento sobre esse assunto. Por outro lado, aprender a usar um sistema operacional de terceiros pode ser um tanto quanto trabalhoso e demorado. Se o sistema não for de uso gratuito, ainda será necessário pagar royalties para cada CPU que executar esse programa.

Neste artigo vou desenvolver alguns raciocínios que mostrarão o fato de que desenvolver um sistema operacional próprio para microcontroladores de 8 ou 16 bits é bem mais simples do que possa parecer. Será apresentada uma estrutura bastante intuitiva e simples de como organizar o seu software de forma que ele opere em tempo real com segurança. Antes disso, precisamos conceituar alguns tópicos. Observe que o assunto sobre Sistemas Operacionais é abordado neste artigo de uma forma muito superficial. Sistemas Operacionais e Sistemas de Tempo Real são temas bastante extensos e complexos e são ensinados em cursos de graduação e pós-graduação. Neste artigo vamos apresentar somente o necessário para compreender a filosofia e preparar o terreno para apresentar em artigos futuros algumas soluções padronizadas para se implementar sistemas de tempo real.

O que é um Sistema Operacional?

Segundo uma definição encontrada na Wikipedia, um Sistema Operacional  é um programa ou um conjunto de programas cuja função é gerenciar os recursos do sistema (definir qual programa recebe atenção do processador, gerenciar memória, criar um sistema de arquivos, etc.), fornecendo uma interface entre o computador e o usuário. Embora possa ser executado imediatamente após a máquina ser ligada, a maioria dos computadores pessoais de hoje o executa através de outro programa armazenado em uma memória não-volátil do tipo ROM (Read Only Memory) chamado BIOS (Basic Input Output System) num processo chamado bootstrapping, conceito em inglês usado para designar processos auto-sustentáveis, ou seja, capazes de prosseguirem sem ajuda externa. Após executar testes e iniciar os componentes da máquina (monitores, discos, etc), o BIOS procura pelo sistema operacional em alguma unidade de armazenamento, geralmente o Disco Rígido, e a partir daí, o sistema operacional toma o controle da máquina. O sistema operacional reveza sua execução com a de outros programas, como se estivesse vigiando, controlando e orquestrando todo o processo computacional.

Segundo alguns autores, existem dois modos distintos de conceituar um sistema operacional:

  • visão top-down pela perspectiva do usuário ou programador: é uma abstração do hardware, fazendo o papel de intermediário entre o software (programas) e os componentes físicos do computador, o (hardware); ou
  • numa visão bottom-up, de baixo para cima: é um gerenciador de recursos, i.e., que controla quais aplicações (processos) podem ser executadas, quando devem ser executadas e quais recursos (memória, disco, periféricos) podem ser utilizados.

 Alguns sistemas operacionais populares são: Windows, Linux, Mac OS, Android, etc.

O que é um Sistema Operacional de Tempo Real?

Sistemas operacionais de tempo real ou RTOS (Real Time Operating Systems) são uma categoria especial de sistemas operacionais. Eles são voltados para aplicações onde é essencial a confiabilidade e a execução de tarefas em prazos compatíveis com a ocorrência de eventos externos.

Por exemplo, se num paciente de UTI ocorrer uma variação importante nos batimentos cardíacos, o monitor cardíaco desse paciente deve ativar um alarme em poucos segundos.

 ID-100279454

Outro exemplo: se um avião em voo com o piloto automático desviar da rota, o controle do avião deve corrigir imediatamente essa rota retornando o avião à rota original.

ID-100177451

Tempo real é um termo que pode ter significados muito diferentes, dependendo da velocidade da ocorrência dos eventos de um sistema e dos tempos de resposta necessários para atender a esses eventos. Há sistemas que podem levar um tempo muito longo para modificar o seu estado. Em geral os processos térmicos de aquecimento são lentos. Pode levar dias ou até semanas para esses processos responderem a determinados estímulos. Nesse caso em particular, um sistema operacional comum serviria perfeitamente para realizar o controle do processo.

Particularidades de um Sistema Operacional de Tempo Real

Há muitos detalhes num Sistema Operacional de Tempo Real que merecem ser apresentados. O principal é que as rotinas de processamento em geral são bastante especializadas e curtas, pois devem executar a sua tarefa no menor tempo possível. Há um forte paralelismo na execução das atividades e um estabelecimento de prioridades, onde as atividades mais prioritárias interrompem as menos prioritárias e assumem o controle do processador. A divisão de tarefas em rotinas especializadas requer que haja alguma forma de sincronismo ou troca de informação entre elas, por exemplo, para que seja informado que tarefa já foi concluída ou não por outra rotina. Algumas estruturas comuns para a troca de informações:

  • Semáforos ou flags: são definidos bits ou palavras para a sinalização do tipo booleano ( binário 0 ou 1) para a troca de mensagens entre duas rotinas;
  • Áreas de troca de mensagens, filas  ou buffers: memórias temporárias que com auxílio dos semáforos permitem a transferência de estruturas de dados maiores entre as rotinas.

Exemplos

Para ilustrar as diversas arquiteturas de tempo real, serão apresentados dois exemplos bastante simplificados.

Exemplo 1

Suponhamos que um programa de computador deseje realizar a transmissão de uma mensagem pela USB. Num sistema comum, ilustrando de uma maneira simplificada, esse programa monta a mensagem e chama a rotina para a transmissão e só são retomadas as próximas atividades após o término da transmissão. Esse tipo de programação é conhecida como programação linear.

No caso de um sistema de tempo real (veja a Figura 1) a sequência de operações pode ser assim:

Transmissão-Serial_a

 Figura 1: Transmissão de caracteres em tempo real simplificada

     Para melhor entendimento ficará convencionado que:

  • flag buffer vazio” = 1,    significa que não há dados no buffer temporário;
  • flag buffer vazio” = 0,    significa que há dados novos no buffer temporário.

    Programa principal:

  • O programa principal inicialmente testa se o buffer temporário está disponível ou vazio (flag buffer vazio” = 1);
  • Se estiver vazio, monta a mensagem numa estrutura temporária (buffer);
  • Dispara a transmissão do conteúdo do buffer temporário alterando o flag “buffer vazio” para “não está vazio” (flag “buffer vazio” = 0);
  • Continua a execução das outras atividades enquanto é realizada a transmissão.

      Rotina de Transmissão:

  • Fica dormente ou então testa periodicamente o flag “buffer vazio”;
  • Se o flagbuffer vazio” indicar que há dados novos (flag “buffer vazio” = 0), transfere os dados do buffer temporário para o buffer de transmissão;
  • Altera o flag de “buffer vazio” sinalizando que o buffer está disponível para novos dados (flag “buffer vazio” = 1);
  • Transmite os caracteres, um de cada vez, até transmitir o último;
  • Sinaliza que “Terminou a transmissão” (flag).

Observe que em geral a rotina de transmissão é programada para ser ativada por interrupção, de forma que ela não gaste ciclos de máquina enquanto espera o término de transmissão de um caracter. Assim é aproveitado o hardware do microcontrolador para realizar tarefas em paralelo com o programa principal.

Exemplo 2

Esse exemplo é baseado num projeto real. Trata-se de uma placa mezanino cuja função é processar simultaneamente os dados referentes a 4 canais telefônicos em tempo real de forma a implementar as seguintes funções:

  • Cancelamento de resíduo de voz na linha de recepção resultante do eco da “fala” gerada pela placa mãe sem distorcer os sinais de origem externa;
  • Pré-processar os sinais de entrada identificando pulsos decádicos telefônicos através de filtragens e outros processamentos;
  • Implementação parcial de call-progress, focando na detecção do tom de “ocupado” e de “linha”.

O sistema operacional de tempo real para esse caso foi projetado em camadas, com prioridades atribuídas decrescentes nas camadas conforme vai crescendo o índice da camada. O fluxo de dados tem taxas decrescentes das camadas inferiores para as superiores. Veja na Figura 2. Observe que a comunicação entre as camadas é realizada através de filas ou buffers circulares, dimensionados de forma que num regime de atendimento simultâneo de quatro linhas telefônicas, o fluxo médio de dados nunca provoque o “estouro” dessas filas. A cada buffer estão associados ponteiros de início e final da fila (“primeira livre”) e uma variável indicando o número de dados que estão na fila. O mecanismo convencionado para a operação das filas circulares é o seguinte:

  • Quem transfere um dado para a fila, incrementa o número de elementos e o ponteiro para o final;
  • Quem retira da fila, decrementa o número de elementos e incrementa o ponteiro de início.

Mezanino_Original

Figura 2: Diagrama da arquitetura do programa em camadas

Uma descrição resumida do que ocorre em cada camada:

CAMADA 0

Trata basicamente dos eventos gerados externamente ao programa. Há eventos assíncronos gerados pela placa-mãe e outros síncronos gerados por temporizadores de hardware. Esses eventos são:

  • Chegada de mensagem enviada pela placa-mãe. Essa mensagem é inserida na fila de entrada de mensagens, que será tratada pela CAMADA 1;
  • Interrupção de hardware com frequência de 10 Hz para a atualização dos estados de cada linha telefônica;
  • Interrupção de hardware com frequência de 8 kHz onde são lidos os dados das 4 linhas telefônicas, e
    • é realizada a decodificação dos dados recebidos;
    • é aplicada uma rotina de cancelamento de eco com filtragem digital adaptativa;
    • o sinal filtrado segue por 3 caminhos:
      • é utilizado como sinal de erro para cálculo do ajuste dos coeficientes do filtro adaptativo;
      • é transferido para a fila que alimenta a CAMADA 1. (Taxa de 8.000 amostras/s);
      • é novamente codificado e retorna à placa-mãe.

CAMADA 1

Realiza o loop principal do programa com funções de pré-processamento dos sinais entregues pela CAMADA 0 na fila de dados e o tratamento das mensagens vindas e que são endereçadas à placa-mãe. A CAMADA 0 é composta pelo encadeamento das seguintes rotinas:

  •  Tratamento dos dados provenientes das linhas telefônicas:
    • Realiza o processamento e a análise de duas linhas por vez gerando uma saída para a CAMADA 2. A taxa máxima desses dados para a CAMADA 2 é de 170 amostras/s;
    • Realiza um pré-processamento de dados analisando simultaneamente as 4 linhas e gera para a CAMADA 2 um fluxo de dados de 400 amostras/s endereçada ao detetor de pulsos decádicos. Também repassa uma mensagem para a placa mãe quando a CAMADA 2 detectar um pulso;
    • Descarta dados das filas e atualiza os ponteiros.
  • Chamada das rotinas que compõem a CAMADA 2.

CAMADA 2

Realiza a análise dos dados gerados na CAMADA 1 e gera as saídas endereçadas à CAMADA 1 ou à placa-mãe. É composta pelas rotinas:

  • Realiza a análise dos dados para detecção de pulsos decádicos. Gera mensagens endereçadas à placa-mãe;
  • Realiza a identificação dos tons de “ocupado” e de linha e sinaliza por meio de mensagens à placa-mãe.

Nesse exemplo o software foi dividido em camadas com prioridades decrescentes para conseguir acomodar todas as funções previstas para o mezanino no curto tempo disponível para a sua execução. Esse projeto funcionou e ficou em operação por pelo menos 10 anos.

 O que é Firmware?

Para completar esse trabalho é interessante conceituar Firmware. Transcrevendo mais uma vez uma definição apresentada pela Wikipedia:

Em eletrônica e computação, firmware é o conjunto de instruções operacionais programadas diretamente no hardware de um equipamento eletrônico. É armazenado permanentemente num circuito integrado (chip) de memória de hardware, como uma ROM, PROM, EPROM ou ainda EEPROM e memória flash, no momento da fabricação do componente. Muitos aparelhos simples possuem firmware, entre eles: controles-remotos, calculadora de mão, algumas partes do computador, como disco rígido, teclado, cartão de memória, unidades USB’s muitos instrumentos científicos e robôs. Outros aparelhos mais complexos como celulares, câmeras digitais, sintetizadores, entre outros, também possuem um firmware para a execução de suas tarefas.

Não há fronteiras rígidas entre firmware e software, pois ambos são termos descritivos bastante livres. Contudo, o termo firmware foi originalmente inventado para contrastar com software de alto nível que poderia ser alterado sem a troca de um componente de hardware, e o firmware está normalmente envolvido com operações muito básicas de baixo nível das quais sem um dispositivo seria completamente não-funcional.

Nos próximos artigos serão apresentadas rotinas padronizadas para utilização em sistemas de tempo real. Nesses artigos serão utilizados diversos conceitos expostos aqui.

Resumo

Sistemas Operacionais de Tempo Real têm uma filosofia muito peculiar na sua arquitetura. Os programas são organizados de forma a poder responder a estímulos externos ou internos num tempo curto o suficiente e compatível com a importância ou urgência do evento que gerou esses estímulos. Frequentemente esses sistemas operacionais estão intimamente ligados ao hardware de um sistema.

Se você quiser se aprofundar um pouco mais sobre esse assunto:

Artigos relacionados

Sistemas Operacionais de Tempo Real

  • Sistemas Operacionais de Tempo Real – Introdução (este artigo) –  Apresentação introdutória do que é um sistema operacional e as características que o tornam um sistema de tempo real. Também são apresentadas algumas estruturas que facilitam o seu projeto.

Bibliotecas de funções e rotinas padronizadas em linguagem C para MCS-51

  • Timers  – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso dos Timers do MCS-51;
  • Displays de 7 segmentos – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso em displays de 7 segmentos;
  • Teclados Matriciais – É apresentada uma biblioteca desenvolvida em linguagem C para varredura, leitura, debounce, identificação da tecla acionada e desvio para a rotina de tratamento. A forma como as rotinas foram escritas, permitem sua fácil reutilização em outros projetos;
  • Periféricos – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso de alguns periféricos, tais como conversores A/D, sensor de temperatura e memórias seriais.
Fonte: https://www.embarcados.com.br/sistemas-operacionais-de-tempo-real-rtos/

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

Proposta de identificação de ataques ao serviço SSH usando padrões no consumo de corrente em plataformas embarcadas

Resumo: Este trabalho apresenta a obtenção de curvas de consumo de corrente elétrica, a partir das respostas geradas por um sistema embarcado de baixo custo Raspberry Pi 2 Model B executando o sistema operacional Linux Raspbian trabalhando como um servidor de acesso remoto SSH, que é avaliado através de diferentes tipos de acessos e ataques de força bruta com dicionários através das ferramentas especializadas Medusa e Hydra, como também a ferramenta não especializada Metasploit. O comportamento energético é interpretado por um sistema de medição de consumo de corrente desenvolvido pela plataforma embarcada de baixo custo Arduino Uno que administra um sensor de corrente baseado no chip ACS721ELC- 5A de efeito Hall, que possui a capacidade de coletar as variações geradas pela plataforma de teste em resposta aos eventos produzidos pelos cenários de provas propostos, os dados são processados pelo Framework Matlab que coleta, analisa e normaliza por meio do método de Welch o sinal de corrente que é interpretado pelo Arduino Uno, posteriormente apresentase uma curva padrão que caracteriza um determinado evento baseado nos cenários de provas. Os resultados apresentam as diferentes curvas padrões normalizadas, e contextualizadas nos tipos de cenários avaliados, seguidamente apresenta-se um modelo matemático teórico do consumo de corrente proposto, como também as regras ou assinaturas propostas para identificar um ataque através do método de detecção por padrões que utilizada o IDS Snort. Essas curvas de corrente facilitam o entendimento e obtenção de um padrão de consumo de corrente para cada acesso e ataque na plataforma embarcada.

https://bdtd.ufs.br/handle/tede/3365

PROPOSTA DE IDENTIFICAÇÃO DE ATAQUES AO SERVIÇO SSH USANDO PADRÕES NO CONSUMO DE CORRENTE EM PLATAFORMAS EMBARCADAS

Este trabalho apresenta a obtenção de curvas de consumo de corrente elétrica, a partir das respostas geradas por um sistema embarcado de baixo custo Raspberry Pi 2 Model B executando o sistema operacional Linux Raspbian trabalhando como um servidor de acesso remoto SSH, que é avaliado através de diferentes tipos de acessos e ataques de força bruta com dicionários através das ferramentas especializadas Medusa e Hydra, como também a ferramenta não especializada Metasploit. O comportamento energético é interpretado por um sistema de medição de consumo de corrente desenvolvido pela plataforma embarcada de baixo custo Arduino Uno que administra um sensor de corrente baseado no chip ACS721ELC- 5A de efeito Hall, que possui a capacidade de coletar as variações geradas pela plataforma de teste em resposta aos eventos produzidos pelos cenários de provas propostos, os dados são processados pelo Framework Matlab que coleta, analisa e normaliza por meio do método de Welch o sinal de corrente que é interpretado pelo Arduino Uno, posteriormente apresentase uma curva padrão que caracteriza um determinado evento baseado nos cenários de provas. Os resultados apresentam as diferentes curvas padrões normalizadas, e contextualizadas nos tipos de cenários avaliados, seguidamente apresenta-se um modelo matemático teórico do consumo de corrente proposto, como também as regras ou assinaturas propostas para identificar um ataque através do método de detecção por padrões que utilizada o IDS Snort. Essas curvas de corrente facilitam o entendimento e obtenção de um padrão de consumo de corrente para cada acesso e ataque na plataforma embarcada.

CAPÍTULO 1 INTRODUÇÃO De acordo com [COELHO et al. 2014], a segurança da informação tem a responsabilidade de proteger a informação sendo determinante para assegurar a competitividade, a lucratividade, e o atendimento aos requisitos legais, preservando a imagem da organização junto ao mercado. A segurança de informação, segundo [GIAVAROTO et al. 2013], não é um produto, é um processo, e por isso, há uma enorme dificuldade em determinar qual é o nível de segurança apropriado. É necessário investigar os riscos, realizar testes, validar as políticas de segurança e tecnologias utilizadas com o objetivo de atender os preceitos de segurança da informação. A segurança nas comunicações [STALLINGS 2007] é uma prática que contém como tarefa principal, prevenir o acesso não autorizado a certos recursos informáticos. Esta conotação é mais estrita no sentido de desenho das soluções entre duas entidades que tentam estabelecer um meio de comunicação comum e seguro. Neste contexto, os protocolos de comunicações são os responsáveis de administrar mecanismos necessários, a fim de estabelecer uma ligação entre uma origem e um destino de forma que os dados enviados sejam transmitidos em forma segura [AMATO 2001]. A confidencialidade, segundo os autores [KUROSE et al. 2010], é um conceito que garante a segurança na transmissão de mensagens e devem ser compreendidas somente pelo remetente e pelo destinatário. A forma de afiançar esta segurança é através de técnicas de cifragem de dados combinada com a autenticação do ponto final. Na atualidade existem soluções em software que cifram os canais de comunicação garantindo a confiabilidade dos dados transmitidos, um exemplo são as redes privadas virtuais VPN [MASON et al. 2002], arquitetura de comunicação que concede um nível aceitável de segurança. Esta arquitetura de segurança exposta a condições de ataques especializados pode chegar a comprometer sua segurança, desta forma um atacante externo está possibilitado a interceptar as mensagens enviadas e recebidas com o agravante de manipular as comunicações à sua vontade [ASHIDANI 2009]. O serviço de comunicação SSH [SILVERMAN et al. 2001] é o serviço de rede mais difundido e utilizado na administração remota de recursos informáticos. Uma das capacidades que possui SSH é estabelecer um canal de comunicação cifra entre uma origem e um destino, este serviço é muito utilizado com o fim de realizar a administração geral de um sistema informático remoto [LAUDON et al. 2013]. Desde o ponto de vista dos administradores de sistemas é a ferramenta por excelência na administração remota, também um ponto de ataque relevante para potenciais intrusões e tudo tipo de ameaças [TABISH et al. 2009]. Hoje em dia se conhecem Malwares [INCE 2008] muito sofisticados que automatizam tudo o processo de conexão a um sistema remoto baseado em ameaças conhecidas [MORTENSEN et al. 2013]. Os sistemas embarcados de acordo com os autores [MORENO et al. 2003] são definidos como uma unidade central de processo integrado a um sistema maior com o objetivo de auxiliar o controle e execução de tarefas, ademais os sistemas embarcados em termos gerais são considerados dispositivos eletrônicos de propósitos gerais. Um claro exemplo é o projeto Raspberry Pi Foundation1 , esta iniciativa nasceu com o objetivo de estimular o ensino da informática baseado na filosofia Open hardware e Open software. Seu desenvolvimento está direcionado em uma economia de escala, frente a um mercado competitivo de sistemas embarcados existentes, tais como: Oluxino2 , Cubieboard23 , Odroid4 , Beagleboard5 , Raspberry Pi possui a maior cota de mercado neste segmento, isso se deve à relação que existe entre o preço e as características disponíveis. Na Tabela 1.1 apresentam-se as características técnicas dos sistemas embarcados mencionados anteriormente…

 Link: https://bdtd.ufs.br/bitstream/tede/3365/2/VICTOR_GABRIEL_GALVAN.pdf

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

Balanceamento Web – Proxy Reverso

Um servidor de Proxy será um servidor que ficará a frente dos servidores WEB. As conexões chegaram a ele primeiro, e ele será responsável por distribuir as conexões para os outros servidores através de um Proxy.

O Proxy reverso será responsável por repassar, ou rotear o tráfego recebido para o, ou os servidores WEB. É muito utilizado para balancear carga em servidores WEB.

Podemos lidar com vários fatores, ou melhor, podemos ter várias características, entre elas:

  • Segurança
  • Criptografia
  • Balanceamento de Carga
  • Cache
  • Compressão

Nestes termos acima, podemos ter segurança a vários tipos de ataques, já que os mesmos passarão pelo Proxy primeiro, antes de, por exemplo, algum tipo de injeção (Injection), além de podermos tratar a criptografia ssl no próprio Proxy, têm outros fatores muito interessantes, como o Balanceamento de carga, que é o foco de nosso Post, mas temos ainda o Cache, para acelerar a resposta e compressão de Dados.

Existem muitos aplicativos que podem fazer isso, tal como Cisco, Iplanet Web Proxy, Isa, Squid, Nginx e Apache. Em nosso Post veremos o Squid Proxy e Apache Server.

Configurando Proxy Reverso no Apache

 

Para configuração do Apache, são necessários três módulos: proxy, proxy_balancer, proxy_http. Neste ambiente usei três Servidores Apaches que são:

  • 192.168.0.200                        Servidor Proxy Reverso
  • 192.168.0.201                        Servidor WEB 1
  • 192.168.0.202                        Servidor WEB 2

Em todos os servidores devemos instalar o apache2:

apt-get install apache2

 

Nos servidores WEB 1 e 2, alterei a pagina index.html em /var/www, colocando o endereço IP dos próprios para podermos identificar se o balanceamento está ocorrendo de fato, no servidor WEB 1, adicionei a linha “Servidor 192.168.0.201” e no Servidor WEB 2 adicionei a linha “Servidor 192.168.0.202” em seus respectivos index.html.

Obviamente, você fará a configuração do seu servidor conforme necessidade, como instalar PHP, Java, banco de dados se for o caso. Note que neste ultimo caso do Banco de dados é interessante termos outro servidor que centralizará essas informações.

Agora vamos à configuração do Servidor Proxy. O primeiro passo é habilitar os módulos:

a2enmod proxy proxy_balancer proxy_http

 

Devemos editar o arquivo /etc/apache/sites-available/default:

<Proxy balancer://mycluster>BalancerMember http://192.168.0.201:80BalancerMember http://192.168.0.202:80</Proxy&gt;

ProxyPass /test balancer://mycluster

 

Deve-se usar a diretiva <Proxy> para informar ao Apache, usar o módulo proxy, seguido do balancer, que será o identificador. Qualquer nome poderá ser usado sem nenhum problema.

O valor colocado em BalancerMember já fala por si só. Serão os servidores reais, do qual queremos balancear.

ProxyPass – ProxyPass permite mapear a árvore de documentos de um servidor Web no espaço de documentos de seu servidor proxy. Enfim, ele fará o redirecionamento de /test para balancer://mycluster. Se caso você deseje redirecionar a própria raiz do servidor basta trocar “/test” por “/”.

Após esse procedimento basta reiniciarmos o apache e fazermos o teste.

 

invoke-rc.d apache2 restart

 

Acesse o endereço do Proxy Server, ele deverá redirecionar a cada requisição para um servidor diferente.

Podemos também utilizar o próprio modulo do balancer para gerenciamento como será feito a carga, para isso precisamos criar uma nova configuração, chamando o módulo do balancer, veja abaixo:

 

<Location /balancer-manager>SetHandler balancer-managerOrder deny,allowAllow from all

</Location>

 

A deve-se adicionar uma nova entrada para a entrada balancer-manager, mas devemos prestar atenção, esta diretiva deve ser colocada antes da diretiva ProxyPass anterior, no caso de redirecionamento da raiz inteira, como citado anteriormente trocando “/test” por “/”. Pois como ele está redirecionado toda a raiz para os servidores membros, ele acabará tentando redirecionar também “servidor/balancer-manager”.

Mas caso tenha feito como o exemplo acima, você poderá colocar logo abaixo da diretiva “</Location>”. Veja a entrada abaixo:

 

ProxyPass /balancer-manager !

 

A diretiva irá redirecionar o /balance-manager para o mesmo diretório, que na realidade nem existe de fato.

Para acessar, basta ir ao endereço “http://192.168.0.200/balancer-manager”, e você verá uma tela como abaixo:

 

Como podemos ver acima, bastam selecionar um dos servidores, que será exibida os valores para “Load fator:”, por exemplo se quisermos alterar o balanceamento para 2/3 para um e 1/3 para o outro, basta alterar o valor para 2, como visto acima. Podemos também ver estatísticas de acesso, em “Elected To”.

 

Configurando Proxy Reverso no Squid

 

Outra forma de fazermos o proxy reverso, é utilizando o Squid, nosso proxy padrão no Linux.

Ele possui essa opção, para podermos fazer o balanceamento entre servidores, como visto anteriormente com Apache.

O primeiro passo a ser feito é a remoção do servidor WEB e a instalação do Squid no Servidor Proxy WEB, em nosso caso no 192.168.0.200.

 

invoke-rc.d apache2 stop

apt-get remove apache2

apt-get install squid

 

Com isso, já estamos prontos para configuração de nosso proxy reverso.

A feature que permite isso é a cache_peer. Esta diretiva é usada para especificar outros caches na hierarquia, como por exemplo usar proxy cascateados, em nosso caso iremos usar para redirecionar não para outro proxy e sim para outros servidores.

Ele possui cinco campo é o nome ou endereço Ip do servidor , já especificado a porta. O segundo campo indica o tipo de relacionamento, o terceiro campo define a porta Http do servidor de destino, enquanto o quarto define a port ICP (UDP) para consulta, e o quinto campo pode conter zero ou mais palavras chaves e opções.

Entre os tipos temos :

  • parent             Relacionamento que redirecionará pedidos para o cache pai.
  • sibling             Relacionamento entre irmãos, onde somente alguns objetos serão solicitados.
  • multicast        O pacote Multicast é de uma máquina para outra ou outras.

Quanto a opções temos várias interessantes:

  • proxy-only                  Especifica que os objetos que foram buscados para este cache , n
  • Weight=n                   Especificar um peso para o parent. O peso deve ser um número inteiro.
  • no-query                     Essa opção é definida entre pares, que não suportam consulta ICP.
  • round-robin                Define um conjunto de parent que devem ser utilizados de forma um round-robin (algoritmo).
  • originserver               Faz com que este servidor seja contatado como o servidor de origem. Feito para ser usado nas configurações de acelerador quando o par (peer) é um servidor WEB.

 

Existem muitas outras configurações, mas para o nosso caso, não vamos precisar fazer um curso de cache_peer.rsrs

Num primeiro momento, devemos então, alterar a porta http_proxy, para escutar a porta 80, e configuramos nossos cache_peer. Veja abaixo as linhas que deverão ser adicionadas e alteradas , no caso de já existirem, como no caso do http_proxy:

 

http_port 192.168.0.200:80 vhost defaultsite=www.site.com.brcache_peer 192.168.0.201 parent 80 0 no-query originserver round-robincache_peer 192.168.0.202 parent 80 0 no-query originserver round-robin

 

No primeiro item, alteramos a porta padrão 3128, para IP do servidor na porta 80, o valor de vhost, servirá somente colocar no header um host, caso este não venha especificado. Como não estamos usando domínio neste Post, coloquei um qualquer, mas funcionará normalmente.

Já as duas linhas seguintes, especificamos nossos servidores , como parent, trabalhando na porta 80, serem tratados como servidores originais, e usarem round-robin ( Uma conexão para cada distribuída igualmente).

Se caso quiséssemos fazer um balanceamento desigual, deveríamos usar o valor“weight=n”, para dar peso. Seguindo o exemplo anterior, 2/3 para o primeiro e 1/3 para o segundo, ficaria da seguinte forma:

 

cache_peer 192.168.0.201 parent 80 0 no-query originserver round-robin weight=2cache_peer 192.168.0.202 parent 80 0 no-query originserver round-robin weight=1

 

O segundo passo é em relação às próprias acl do Squid. Como sabemos ele vem negando tudo com a acl “http_access deny all”. Para resolver isso, precisamos criar um acl contendo nossos servidores e o próprio proxy, e permitir acesso a eles. Certifique-se que esteja antes da linha “http_access deny all”, para que funcione.

 

acl hosts dst 192.168.0.200 192.168.0.201 192.168.0.202http_access allow hosts

 

Com isso estamos prontos para testar, basta reiniciar o Squid, e fazer o teste , enviando solicitação WEB para o Proxy, e o mesmo redirecionará para os dois servidores WEB 192.168.0.201 e 192.168.0.202.

 

Conclusão

 

Como podemos ver acima, os dois processos são muito simples, não requer um grande estudo e preparo. Não foi necessário usar roteamento, ou alterar a tabela de roteamento, bem como regras de firewall.

Obviamente se você possui um firewall, este terá que ter regras que permitam tais acessos.

E mais uma vez, espero que aproveitem o Post.

 

 

Fonte: http://stato.blog.br/wordpress/balanceamento-web-com-proxy-reverso/

Padrão de Projeto Factory Method em Java

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

Introdução

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

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

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

Funcionamento

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

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

Diagrama de classe do Padrão Factory Method

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

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

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

Exemplo de Implementação

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

Listagem 1: Exemplo de implementação dos produtos

public abstract class Pessoa {

	public String nome;
	public String sexo;

}

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

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

}

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

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

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

class FactoryPessoa {

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

}

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

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

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

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

Vantagens do Padrão Factory Method

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

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

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

Conclusão

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

Bibliografia

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

 

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

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

 

sistemas-de-banco-de-dados-6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Depositfiles Download
Freakshare Download

Freakshare Bitshare

 

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