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

JAVA Agent Development Framework

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

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

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

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

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

Atualizando Firmware ESP8266

Encontrei estes vídeos muito simples e gostaria de compartilhá-lo com vocês. Não tem voz com sotaque, nem baboseira que nos faz perder tempo.

ESP8266 ESP-01 WiFi IOT Module Flashing or Re-flashing Firmware Update Ai Thinker version Tutorial 1. How to update or re-flashing ESP8266 ESP-01 Ai Thinker version firmware using ESP Flash Download Tool.

Default Version (Jun 5 2015):
SDK 0.9.5 (Ai-Thinker)
AT 0.21.0.0 (Ai-Thinker)

Re-flashing firmware (512KB/4Mbits flash size board version):
– The latest firmware is SDK 1.3.0 but we will flash it the same version as it is the only version that support this ESP-01 with 4Mbit of flash size. You may use the latest version if you have larger flash size.
SDK 0.9.5 (Ai-Thinker)
AT 0.21.0.0 (Ai-Thinker)

Required Firmware file and address (no 4Mbits/512kByte version support version 1.0 and above):
ai-thinker-0.9.5.2.bin (0x00000)

Item Required:
1. ESP8266 ESP-01 4Mbit/512kB version (Hardware) – http://www.aliexpress.com/wholesale?S…
2. FTDI USB to Serial UART Adapter (Hardware) – http://www.aliexpress.com/wholesale?S…
3. Jumpers (Hardware) – http://www.aliexpress.com/wholesale?S…
4. Breadboard (Hardware) – http://www.aliexpress.com/wholesale?S…
5. PuTTY (Software) – http://www.chiark.greenend.org.uk/~sg…
6. ESP Flash Download Tool (Software) – http://bbs.espressif.com/viewtopic.ph…
7. Ai-Thinker Firmware (Firmware) – http://wiki.aprbrother.com/wiki/Firmw…

Extra (For external Power Supply):
1. 3.3V 1A Voltage Regulator (AZ1117T) – http://www.aliexpress.com/wholesale?S…
2. Mini/Micro USB Breakout Board – http://www.aliexpress.com/wholesale?S…
3. Power Bank

NOTE: External power supply is required if the PuTTY or Serial Monitor unable to give response or always show an error.

Steps:
1. Prepare all the hardware required.
2. Build up all connection between ESP8266 ESP-01 and FTDI.
3. Download PuTTY Terminal Program.
4. Download ESP Flash Download Tool.
5. Download the Ai Thinker firmware.
6. Connect and check the current version of firmware using PuTTY.
7. Upload the firmware using ESP Flash Download Tool.
8. Check the uploaded version of firmware using PuTTY.

IMPORTANT NOTE:
1. External power supply is required if the PuTTY or Serial Monitor unable to give response or always show an error.
2. Ai-Thinker firmware version 1.0 and above requires at least 1MB (8Mbit) of Flash. 512kB (4Mbit) of Flash has to use older version (v0.9.5.2 – refer to alternative link below)

Official Download Link for Latest Ai-Thinker firmware:
http://bbs.ai-thinker.com/forum.php?m…

Alternative Download Link for Latest Ai-Thinker firmware:
http://www.electrodragon.com/w/ESP826…

Alternative Download Link for older version Ai-Thinker firmware:
http://wiki.aprbrother.com/wiki/Firmw…

SUBCRIBE Youtube for Channel for more Tutorial Videos:
Youtube Channel: https://www.youtube.com/channel/UCcod…

Soundtrack credits:
Jahzzar – betterwithmusic.com – CC BY-SA
Rainy_Day_Games – YouTube Audio Library

Publicado em 29 de out de 2016

ESP8266 ESP-01 WiFi IOT Module Flashing Firmware Update Espressif Version Tutorial 2. How to update ESP8266 ESP01 Espressif version firmware using ESP Flash Download Tool.

————————————–
I N F O :
————————————–
Default Version (Jun 5 2015):
SDK 0.9.5 (Ai-Thinker)
AT 0.21.0.0 (Ai-Thinker)

Upgrade to latest supported (4Mbit Flash of ESP-01) Espressif version (Sep 18 2015) – Refer Important NOTES for details:
SDK 1.4.0 (Espressif Non-OS no-boot)
AT 0.50.0.0 (Espressif Non-OS no-boot – Sep 18 2015)

ESP-01 Board Flash size: 4Mbit/512KByte version

————————————–
F I R M W A R E :
————————————–
Required Firmware file and address (4Mbit/512KB version):
1. esp_init_data_default.bin (0x7c000)
2. at\noboot\eagle.flash.bin (0x00000)
3. at\noboot\eagle.irom0text.bin (0x10000)
4. blank.bin (0x3e000)
5. blank.bin (0x7e000)

————————————–
P R E P A R A T I O N :
————————————–
Item Required:
1. ESP8266 ESP-01 (Hardware) – http://www.aliexpress.com/wholesale?S…
2. FTDI USB to Serial UART Adapter (Hardware) – http://www.aliexpress.com/wholesale?S…
3. Jumpers (Hardware) – http://www.aliexpress.com/wholesale?S…
4. Breadboard (Hardware) – http://www.aliexpress.com/wholesale?S…
5. PuTTY (Software) – http://www.chiark.greenend.org.uk/~sg…
6. ESP Flash Download Tool (Software) – http://bbs.espressif.com/viewtopic.ph…
7. NON-OS ESP8266 SDK Firmware (Firmware) – http://bbs.espressif.com/viewtopic.ph…

Extra (For external Power Supply):
1. 3.3V 1A Voltage Regulator (AZ1117T) – http://www.aliexpress.com/wholesale?S…
2. Mini/Micro USB Breakout Board – http://www.aliexpress.com/wholesale?S…
3. Power Bank

————————————–
S T E P S :
————————————–
1. Prepare all the hardware required.
2. Build up all connection between ESP8266 ESP-01 and FTDI.
3. Download PuTTY Software.
4. Download ESP Flash Download Tool.
5. Download the latest Espressif Non-OS ESP8266 SDK firmware (use this SDK 1.4.0 version since this is the only version applicable for 4Mb of flash size – refer IMPORTANT NOTES below).
6. Connect and check the current version of firmware using PuTTY.
7. Upload the latest Espressif firmware using ESP Flash Download Tool.
8. Check the latest version of firmware using PuTTY.

————————————–
I M P O R T A N T N O T E S :
————————————–
1. External power supply is required if the PuTTY or Serial Monitor unable to give response or always show an error.
2. 4Mbit of Flash is not supported for SDK v1.5.0 (15_11_27) and above for both boot and non-boot mode due to large size of AT firmware (Starting ESP8266_AT_v0.51). Please use 8Mbit Flash or larger.
3. 4Mbit of Flash is only support non-boot mode for SDK v1.1.0 (15_05_22) until SDK v1.4.0 (15_09_18).
4. Please refer to README file in bin/at/ folder for another flash size.
5. If you have an upgraded version of ESP-01 with 8Mbit of flash size (Black Color), Please refer ESP-201 (8Mbit Flash size) tutorial video on how to download latest SDK firmware. Link here: https://www.youtube.com/watch?v=U8ubG…

————————————–
S U B S C R I B E :
————————————–
SUBCRIBE MakerStream YouTube Channel for more Tutorial Videos:
YouTube Channel: https://www.youtube.com/channel/UCcod…

Soundtrack credits:
Jahzzar – betterwithmusic.com – CC BY-SA – intro sound (cropped)
Rainy_Day_Games – YouTube Audio Library

Procedimento de gatilho PL/pgSQL para registrar inserção e atualização

O gatilho deste exemplo garante que quando é inserida ou atualizada uma linha na tabela, fica sempre registrado nesta linha o usuário que efetuou a inserção ou a atualização, e quando isto ocorreu. Porém, diferentemente do gatilho anterior, a criação e a atualização da linha são registradas em colunas diferentes. Além disso, o gatilho verifica se é fornecido o nome do empregado, e se o valor do salário é um número positivo. [1]

CREATE TABLE emp (
    nome_emp       text,
    salario        integer,
    usu_cria       text,        -- Usuário que criou a linha
    data_cria      timestamp,   -- Data da criação da linha
    usu_atu        text,        -- Usuário que fez a atualização
    data_atu       timestamp    -- Data da atualização
);

CREATE FUNCTION emp_gatilho() RETURNS trigger AS $emp_gatilho$
    BEGIN
        -- Verificar se foi fornecido o nome do empregado
        IF NEW.nome_emp IS NULL THEN
            RAISE EXCEPTION 'O nome do empregado não pode ser nulo';
        END IF;
        IF NEW.salario IS NULL THEN
            RAISE EXCEPTION '% não pode ter um salário nulo', NEW.nome_emp;
        END IF;

        -- Quem paga para trabalhar?
        IF NEW.salario < 0 THEN
            RAISE EXCEPTION '% não pode ter um salário negativo', NEW.nome_emp;
        END IF;

        -- Registrar quem criou a linha e quando
        IF (TG_OP = 'INSERT') THEN
            NEW.data_cria := current_timestamp;
            NEW.usu_cria  := current_user;
        -- Registrar quem alterou a linha e quando
        ELSIF (TG_OP = 'UPDATE') THEN
            NEW.data_atu := current_timestamp;
            NEW.usu_atu  := current_user;
        END IF;
        RETURN NEW;
    END;
$emp_gatilho$ LANGUAGE plpgsql;

CREATE TRIGGER emp_gatilho BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_gatilho();

INSERT INTO emp (nome_emp, salario) VALUES ('João',1000);
INSERT INTO emp (nome_emp, salario) VALUES ('José',1500);
INSERT INTO emp (nome_emp, salario) VALUES ('Maria',250);
UPDATE emp SET salario = 2500 WHERE nome_emp = 'Maria';

SELECT * FROM emp;

 nome_emp | salario | usu_cria |         data_cria          | usu_atu |          data_atu
----------+---------+----------+----------------------------+---------+----------------------------
 João     |    1000 | folha    | 2005-11-25 08:11:40.63868  |         |
 José     |    1500 | folha    | 2005-11-25 08:11:40.674356 |         |
 Maria    |    2500 | folha    | 2005-11-25 08:11:40.679592 | folha   | 2005-11-25 08:11:40.682394
(3 linhas)

Tipos de índice – PostgreSQL

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

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

<
<=
=
>=
>

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

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

A consulta abaixo mostra o idioma. [2]

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

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

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

CREATE INDEX nome ON tabela USING RTREE (coluna);

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

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

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

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

CREATE INDEX nome ON tabela USING HASH (coluna);

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

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

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

Notas

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

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

Apache – Proxy Reverso

Como montar um proxy reverse no servidor Apache

O que vem a ser um proxy reverse

O que vem a ser necessariamente um Proxy Reverse?

Imagine que você tenha uma máquina Linux rodando o Apache como servidor de aplicações web com páginas em HTML que pode ser facilmente acessado por qualquer pessoa de qualquer lugar.

Bom, suponhamos que você tem dois servidores Windows 2000 Server rodando na rede interna com IPs não roteáveis, um rodando aplicações ASP com o Serviço IIS (Internet Information Service) e outro rodando aplicações Java, por exemplo o JakartaTomCat. Ambos acessando um bando de dados robusto do tipo Oracle ou outro banco qualquer.

Só que essas máquinas só conseguem responder por http://192.168.0.1/aplicacao ou http://servidor_windows/aplicacao, ou seja, somente as máquinas da sua rede interna poderão navegar na aplicação e você não tem nenhum ip verdadeiro para estar delegando a essas máquinas para poder torná-las acessíveis para a internet.

Aí entra a jogada o Proxy Reverse! O Proxy Reverse pode ser entendido também como Cluster Web, ou seja, uma máquina principal recebe a solicitação e essa máquina tem por objetivo solicitar o serviço de outra máquina. Não entenda como redirecionamento e sim como troca de processamento, sendo que o processamento estará sendo dividido, ou seja, uma estará postando as informações e a outra estará fornecendo o serviço.

Configurando o Apache para o funcionamento do proxy

Passei um bom tempo estudando o funcionamento desse serviço de Proxy Reverse, pois eu não conhecia ninguém que já tivesse feito isso, porém tive o auxílio de um grande amigo e professor chamado Ulisses T.V. Guedes (responsável pela área de redes do Instituto Nacional de Pesquisa Espaciais) e aqui deixo meus votos de agradecimentos à ele.

No meu caso utilizei o Apache 1.3.27 instalado num Slackware 8.1. As aplicações envolvidas são:

  • Windows 2000 Server rodando o IIS com páginas ASP;
  • Windows 2000 Server rodando o Jakarta TomCat da Apache.

Suponhamos que esses 2 Servidores Windows já estão configurados para rodar, só que com IPs não roteáveis, ou seja, somente na rede interna.

No caso, somente o Apache que está rodando no Slackware tem o domínio válido e pode ser acessado. Chamaremos o domínio de http://www.empresa.com.brpara o exemplo.

Como sou do tipo que gosto de fazer tudo na unha, tive que baixar o pacote .tar.gz do Apache, descompactar e compilar. Vamos a receita do bolo!

Os seguintes pacotes foram utilizados:

  • apache_1.3.27.tar.gz
  • mod_ssl-2.8.14-1.3.27.tar.gz
  • php-4.3.4RC2.tar.gz
  • openssl-0.9.6i.tar.gz

Vou ser bonzinho e explicar todos os passos desde a instalação do Apache completo até…. 😉

NOTA: vou partir do princípio que você já fez o download dos pacotes, que podem ser facilmente encontrados a partir do site de buscahttp://freshmeat.net.

Primeiro passo, descompacte todos os pacotes num diretório qualquer. No meu caso, escolhi /usr/local/src e lá coloquei os arquivos:

# cd /usr/local/src
# tar -zxvf apache_1.3.27.tar.gz
# tar -zxvf mod_ssl-2.8.14-1.3.27.tar.gz
# tar -zxvf php-4.3.4RC2.tar.gz
# tar -zxvf openssl-0.9.6i.tar.gz

Comece a instalação pelo PHP:

# cd php-4.3.RC2
# ./configure –with-apache=../apache_1.3.27
# make
# make install

Agora vá para o diretório do OpenSSL:

# cd ../Openssl-0.9.6i
# ./config
# make
# make install

Agora o ModSSL:

# cd ../mod_ssl-2.8.14-1.3.27
# ./configure –with-apache=../apache_1.3.27 –with-ssl=../openssl-0.9.6i

Agora o Apache:

# ./configure –with-prefix=/usr/local/apache –with-bindir=/usr/local/bin –with-sbindir=/usr/local/sbin –enable-module=ssl –enable-module=proxy –enable-shared=proxy –enable-module-rewrite –enable-shared=rewrite –activate-module=src/modules/libphp4.a
# make
# make certificate
# make install

Falei que gosto de fazer as coisas na mão né? rs. Taí o resultado, porém funciona somente com os módulos que quero.

O importante são os parâmetros –enable-module=proxy e –enable-module=rewrite. No caso de instalações por RPM tipo RedHat, esses módulos vem ativados por padrão, bastando apenas desativar na configuração do httpd.conf o que você não deseja carregar.

Para finalizar a configuração do Apache, volte para o diretório do PHP e copie o arquivo php.ini-dist para /usr/local/lib/php.ini.

Configurando o proxy reverse para acessar outras máquinas

Após tudo estar funcionando, vá para o diretório do Apache e edite o arquivo de configurações:

# cd /usr/local/apache/conf
# vi httpd.conf

Nele, verifique se as seguintes configurações foram bem sucedidas na instalação:

LoadModule rewrite_module     libexec/mod_rewrite.so
LoadModule php4_module        libexec/libphp4.so  -> esse é apenas para o PHP
LoadModule proxy_module       libexec/libproxy.so

AddModule mod_proxy.c
AddModule mod_rewrite.c

Esses caras são os responsáveis pelo funcionamento do Proxy Reverse. Caso esses não estejam declarados, reveja a compilação do seu Apache.

Agora vamos para o que interessa realmente, procure a linha <IfModule mod_proxy.c>, iremos trabalhar com ela agora:

<IfModule mod_proxy.c>
ProxyRequests Off   -> deixe essa linha como Off, já tive problema com ela
ProxyPass /serv1/ http://192.168.0.22:80/serv1/
ProxyPassReverse /serv1/ http://192.168.0.22:80/serv1/
<Directory /usr/local/apache/htdocs/serv1>
Order Allow,deny
Allow from all
</Directory>
Redirect Permanent /serv1 https://www.empresa.com.br/serv1/
Nessa primeira passagem está acontecendo o seguinte:

O que se refere a ProxyPass /serv1, significa que quando alguém digitar http://www.empresa.com.br/serv1 ele irá solicitar o serviço emhttp://192.168.0.22:80/serv1/ ou seja, o serviço solicitado roda na porta 80 do primeiro servidor na rede interna.

Um detalhe importante é que a primeira solicitação que é o serv1 digitado no http://www.empresa.com.br tem que ser idêntica a entrada do servidor da rede interna, ou seja, no primeiro caso é um IIS que está rodando no 192.168.0.22, então no diretório de serviços dele a pasta onde se encontra as páginas ASP tem que se chamar serv1 (nesse exemplo é claro).

Uma vez encontrado, o ProxyPassReverse devolve a solicitação e quem vai postar a tela é o Apache, sendo que ele não precisa ter suporte a ASP, pois quem está processando páginas ASP é o Windows 2000. Isso forma um cluster, as duas máquinas estão processando as informações e deixando o serviço bem mais rápido.

A diretiva <Directory /usr/local/apache/htdocs/serv1> tem que existir, pois o Apache está fazendo de conta que é ele quem é dono do serviço. então você tem que ter criada uma pasta chamada serv1 no seu htdocs do Apache.

No Redirect Permanent estou forçando para que a navegação do servidor Windows 2000 Server utilize a criptografia de SSL criada no Apache, ou seja oWindows 2000 não tem criptografia, então o Apache fornece o serviço de criptografia.

Continuando dentro da tag <IfModule mod_proxy.c>, vamos ao exemplo de configuração para o segundo servidor:

    ProxyPass /clijava/ http://192.168.0.20/clijava/
ProxyPassReverse /clijava/ http://192.168.0.20/clijava/
AllowCONNECT 443
<Directory /usr/local/apache/htdocs/clijava>
Order Allow,deny
Allow from all
</Directory>
Redirect Permanent /clijava https://www.empresa.com.br/clijava/
</IfModule>
Essa outra diretiva está acionando o outro Windows 20000, o que roda o Jakarta TomCat. O procedimento é quase idêntico ao que expliquei acima, sendo que nesse caso o AllowCONNECT 443 é utilizado porque além da criptografia do Apache, o Jakarta também está criptografado, então nesse caso os dois servidores estão conversando em criptografia.

Em todo o caso o Jakarta não precisaria estar criptografado, mas fiz uns testes com ele e percebi que se os dois estiverem criptografado, tenho que usar essa diretiva.

E por fim:

ProxyVia On

<IfModule mod_disk_cache.c>
CacheRoot “/usr/local/apache/proxy”
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
</IfModule>

Isso serve para a troca de cache e é extremamente importante, dependendo de quantas requisições seu servidor interno tiver, você tem que alterar esse números ai. Caso queira saber mais a fundo consulte a documentação do Apache.

Finalmente, pronto!

Aqui termino minha publicação do artigo e espero que isso possa ajudar alguém como tem me ajudado até hoje. Caso alguém tenha alguma dúvida, estarei a disposição para poder exclarecê-las.

 

Fonte:  http://xoops.net.br/docs/apache/apache-proxy-reverso/index.php

Entendendo o processo de ETL

No contexto do Data Warehouse (DW) e Business Intelligence (BI) ouvimos muito falar sobre o processo de ETL. Essa sigla significa Extração, Transformação e Carga (em inglês Extract, Transform and Load) e trata da sistematização do tratamento e limpeza dos dados oriundos dos diversos sistemas organizacionais (OLTP) para a inserção, geralmente, em um DW ou Data Mart. Como podemos perceber, esse processo possui três etapas. A primeira é a extração (extract), a segunda a transformação (transform) e por fim, a carga (load). Cada uma delas possui grande importância para o sucesso da transição dos dados dos sistemas de origem para o DW. A etapa de extração pode ser entendida como a fase onde os dados são extraídos dos OLTPs e conduzidos para a staging area (área de transição ou área temporária), onde são convertidos para um único formato. A conversão se faz necessária devido a heterogeneidade existente nas informações oriundas desses sistemas, sendo essencial a conformação prévia para o tratamento adequado. Após a extração, teremos subsídios para iniciar a etapa de transformação e limpeza dos dados. Nessa fase são corrigidos, padronizados e tratados os desvios e inconsistências, transformando os dados de acordo com as regras do negócio. A etapa de carga ocorre em sequência com a de transformação. Assim que são efetuados os tratamentos necessários nos dados, a carga no DW é iniciada. Essa fase se resume na persistência dos dados na base consolidada. De forma geral, o ETL pode ser representado pela imagem abaixo:

etl

O processo de ETL, por exemplo, é essencial para a criação das estruturas de Dimensões e Fatos no ambiente do DW. É ele que faz a “ponte” de ligação entre o operacional e o DW. Devemos escolher bem as ferramentas que darão suporte ao processo, pois são essenciais para a correta execução das atividades do ETL. O ETL é fundamental para qualquer iniciativa de DW. Porém deve ser planejado com cuidado para não comprometer os sistemas transacionais (OLTP) das empresas. Um bom ETL deve ter escalabilidade e ser manutenível.  Além disso, devemos analisar a janela de operação do ETL. Não é em qualquer momento que ele poderá ser executado. Do mesmo modo, devemos analisar a periodicidade de execução, como também definir qual será o alcance de dados que o ETL irá abranger. Esses detalhes são críticos para o sucesso do processo. Portanto, devemos tratar o ETL como sendo o “cordão umbilical” que une e possibilita a condução dos dados ao DW. O processo deve ser bem planejado para evitar transtornos futuros e até mesmo para que não ocasione, em casos extremos, a interrupção dos sistemas operacionais da empresa. Dessa forma, o DW terá informações tratadas, com qualidade e grande valor para apoiar as decisões organizacionais.

Fonte:

https://corporate.canaltech.com.br/noticia/business-intelligence/entendendo-o-processo-de-etl-22850/

httpd.conf

O httpd.conf é o arquivo principal de configuração do Apache, que se encontra dentro da pasta Conf, no diretório de instalação do Apache.

O arquivo está dividido em três seções, que são:

1  Parâmetros globais
2 Diretivas de Funcionamento
3 Host Virtuais

No arquivo encontram-se todos os parâmetros de funcionamento do Apache. Alguns parâmetros são gerais para a instalação e funcionamento do Apache. Muitos dos outros parâmetros pode configurar independentes para um conjunto de diretórios e/ou arquivos. Nestes casos, os parâmetros se encontram localizados dentro de seções onde se indica o âmbito de aplicação do parâmetro.

As seções mais importantes são:

<Directory> : Os parâmetros que se encontram dentro desta seção, só se aplicarão ao diretório especificado e a seus subdiretórios.

<DirectoryMatch>: Igual ao Directory, porém aceita no nome do diretório expressões regulares.

<Files>: Os parâmetros de configuração proporcionam controle de acesso dos arquivos pelo seu nome.

<FilesMatch>: Igual ao Files, porém aceita expressões regulares no nome do arquivo.

<Location>: Proporciona um controle de acesso dos arquivos por meio da URL

<LocationMatch>: Igual ao Location, porém aceita expressões regulares no nomes do arquivo.

Algumas vezes as diretivas de funcionamento das seções anteriores se podem cruzar em cujo caso tenha a seguinte ordem de preferência:

1. <Directory> e .htaccess (.htaccess prevalece frente a <Directory>)
2. <DirectoryMatch> e <Directory>
3. <Files> e <FilesMatch>
4. <Location> e <LocationMatch>

Também há que destacar, que o arquivo contém vários comentários para sua correta utilização, as linhas comentadas aparecem com o símbolo #.