Sistemas Operacionais de Tempo Real – Timers

Introdução

Estava desenvolvendo algumas idéias para um novo artigo técnico, quando encontrei perdida, no fundo de uma gaveta virtual, uma biblioteca de rotinas em C que desenvolvi há algum tempo. É uma preciosidade!!! Eu mesmo já utilizei essas funções em vários projetos. Estou aqui disponibilizando esse material para você.

Vou contar um pouco a história dessa biblioteca. Houve uma época em que o meu trabalho era focado em projetos de desenvolvimento de sistemas dedicados baseados em processadores da família 8051. Desenvolvemos uma célula de carga digital, um sistema de monitoramento ambiental, um mini CLP, um sistema de monitoramento e controle de um processo químico, sistema de controle de elevadores etc. Daí surgiu a ideia de elaborar funções e rotinas padronizadas, pois quase todos esses sistemas tinham alguma coisa em comum, como por exemplo teclas, displays etc. e deveriam operar em tempo real. O objetivo foi diminuir o tempo gasto para o desenvolvimento de um novo projeto. Antes de prosseguir, recomendo a leitura do artigo Sistemas Operacionais de Tempo Real – Introdução, onde são abordados alguns conceitos que serão aplicados neste artigo.

É necessário apresentar aqui alguns esclarecimentos a respeito da filosofia usada na elaboração dessas rotinas. Eu parti do princípio de que os nossos sistemas são de tempo real e que realizam periodicamente algumas funções rotineiras, tais como verificar um teclado, atualizar displays, administrar LEDs de sinalização, realizar medidas, etc. Outras ações são tomadas por demanda, ou seja, apenas quando ocorrem. Essas demandas podem ser periódicas ou assíncronas (aleatórias). Daí já reconhecemos o primeiro elemento a ser implementado no nosso Sistema Operacional: um temporizador (Timer). Para quem não sabe, os processadores tradicionais da família 8051 têm apenas 2 temporizadores, enquanto outras versões oferecem pelo menos mais um. Antes de continuar, acho interessante recordarmos a arquitetura dos microcontroladores da família MCS-51 e os modos de operação dos seus temporizadores. Na parte final desse artigo será desenvolvido um pequeno exemplo prático, cujo código poderá ser compilado e simulado.

TIMERS da família MCS-51

Para ilustrar o que será abordado aqui, vamos nos referenciar aos microcontroladores de fabricação da ATMEL, com a arquitetura baseada no 8051, cujo documento completo você pode consultar aqui: ATMEL 8051 Microcontrollers Hardware Manual. Na Figura 1 podemos observar a arquitetura interna de um microcontrolador AT89S8253, que continua sendo produzido, mostrando em destaque o bloco dos temporizadores.

Timers - Diagrama em blocos da arquitetura interna de um microcontrolador
Figura 1: Diagrama em blocos da arquitetura interna de um microcontrolador AT89S8253

 

Sem entrar nos detalhes referentes aos contadores / temporizadores Timer 0 e Timer 1 dessa família de microcontroladores, basta dizer que eles podem ser programados para funcionarem em 4 modos distintos de operação:

  • Modo 0: O temporizador é configurado como um contador de 13 bits, que pode receber um valor inicial e conta para cima. Na transição do valor limite superior 0x1FFF para  0x0000, é acionado um flag de sinalização;
  • Modo 1: Similar ao modo 0, porém é configurado o contador para 16 bits;
  • Modo 2: O temporizador é configurado como um contador de 8 bits, com um registro de 8 bits associado para recarregar o valor inicial automaticamente. Na transição, é acionado um flag;
  • Modo 3: Nesse modo de operação, o Timer 0 opera como 2 contadores distintos de 8 bits, enquanto o Timer 1 nesse modo de operação permite que se congele a contagem.

Convenções para o uso dos Timers

Para o objetivo de projetar uma biblioteca com rotinas padronizadas, foi definido que o Timer 0 seria o temporizador padrão do sistema e o Timer 1 também poderia ser usado para isso, se acaso não fosse necessário usá-lo para gerar baud-rate da comunicação serial.

O período de interrupção do temporizador deve ser o maior possível e baixo o suficiente para atender às necessidades prioritárias do sistema. Para que se entenda o motivo disso, observe o seguinte exemplo:

Suponhamos que:

  • Um microcontrolador que, por restrições de sua arquitetura e do oscilador (clock) utilizado, possa executar no máximo 10.000 instruções por segundo;
  • Uma rotina de interrupção provocada pelo temporizador execute 20 instruções na média a cada interrupção.

Se numa hipótese absurda o temporizador for dimensionado para gerar 500 interrupções por segundo, a rotina de interrupção vai consumir todo o tempo disponível para executar as instruções do microcontrolador (500 x 20 = 10.000)! Se por exemplo esse número puder cair para 50 interrupções por segundo, sem prejudicar a operação do sistema, a rotina de interrupção vai consumir apenas 10% do total disponível (1.000), deixando os outros 90% para as demais atividades do microprocessador.

A compreensão do que foi ilustrado nesse exemplo é fundamental. As rotinas que são executadas com maior frequência devem ser otimizadas para serem executadas no menor tempo possível e na menor frequência possível também. Voltando ao exemplo das 500 interrupções, se acaso a rotina de interrupção executasse apenas 18 instruções ao invés das 20, já sobrariam 1.000 instruções por segundo que poderiam ser executadas por outras atividades. Em muitos casos isso é suficiente. Note que para esse exemplo em particular, só analisamos uma das soluções possíveis para viabilizar a operação do sistema. Poderia-se também lançar mão de outros recursos, como por exemplo aumentar a frequência do oscilador do microcontrolador.

Assim a frequência da interrupção do nosso timer deve ser dimensionada de modo que:

  • A função que deverá ser executada com maior frequência possa ser atendida pelas interrupções do timer no menor tempo necessário para isso (e maior possível), definindo assim as especificações do timer de referência do sistema;
  • Outras temporizações mais lentas sejam realizadas como múltiplos da interrupção do timer e implementadas por meio de temporizadores virtuais de software.

Um temporizador virtual de software é uma estrutura no programa em que a cada temporizador é associado um valor inicial, que se traduz num número inteiro de interrupções do Timer 0, e um flag de sinalização. A cada interrupção do Timer 0, o temporizador de software é decrementado e testado se zero. Se for zero, é ligado o flag para avisar que a contagem de software foi terminada e o temporizador é reinicializado para o seu valor inicial. O tratamento do final de contagem é realizado no programa principal, testando-se o flag e reinicializando-o depois.

O timer de referência deverá funcionar no modo 2 de operação. Observe que a programação do Timer 0 depende da frequência de clock do microcontrolador, do fator de divisão do clock, que nas CPUs tradicionais do MCS-51 é de 12 vezes, e da frequência requerida de interrupção. Um último limitante é que o valor inicial do Timer nessa configuração é de no máximo 255 (8 bits). Na biblioteca também foi desenvolvido um padrão para a programação do Timer 1, especialmente se não for usado para gerar baud-rate.

Detalhes da Biblioteca em C

O código em C a seguir foi desenvolvido para o compilador KEIL C51 μVision, na versão de avaliação. Se você quiser testar o programa exemplo que desenvolveremos no final deste artigo, recomendo que você baixe e instale esse programa.  O arquivo de biblioteca com os trechos de código em C para a utilização dos timers de forma padronizada está dividido em segmentos. O primeiro segmento define uma série de constantes, que podem ser ajustadas conforme as especificações do projeto. Veja o trecho do código a seguir.

Nesse código há alguns parâmetros que precisam ser alterados, conforme o projeto:

  • #define   FREQUENCIA_DO_CLOCK_DA_CPU 12.0e+6 // Hz —->  12 MHz, por exemplo.

Inicializar essa constante com o valor do clock do seu microcontrolador.

  • #define   FATOR_DE_ESCALA_CLOCK_TIMER    12.0f     // Divide o clock por 12

Valor do pre-scaler.

  • #define   FREQUENCIA_DE_INTERRUPCAO_TIMER_0 5e+3  // Hz —- > 5 kHz, por exemplo.

Define a frequência da interrupção do timer.

São apenas esses três parâmetros que devem ser inicializados. Não é necessário alterar outras partes do código!

O segundo segmento da biblioteca refere-se às inicializações dos timers, conforme o modo de operação, e os comandos para iniciar a operação do temporizador. Observe que nesse segmento é mostrada a rotina principal (void main(void)) e indicado onde devem ser inseridos os trechos do código.

O terceiro segmento mostra como são definidas as rotinas de interrupção.

EXEMPLO

A seguir vamos desenvolver o nosso programa de exemplo. Nesse programa, será programado o Timer 0 no modo 2 de operação, com o microcontrolador operando com um clock de 4 MHz e uma frequência de interrupção de 1,5 kHz. Confira o código no quadro abaixo.

Se você quiser simular o programa exemplo acima e explorá-lo um pouco mais, siga os seguintes passos:

  • Instale o KEIL C51 μVision;
  • Baixe o arquivo Testa_Timer.zip;
  • Instale os arquivos de Testa_Timer.zip num diretório para testes;
  • Navegue até o diretório de testes e acione o arquivo Testa_Timer.uvproj (2 “clickes”)  (Figura 2).

Timers - Arquivos no diretório de teste
Figura 2: Arquivos no diretório de teste

Nesse instante deverá abrir o programa Keil e a tela deverá ser a retratada na Figura 3. Esse painel permite navegar no código em C, editá-lo e compilá-lo. Não é necessário fazer isso para realizar a simulação, mas você poderá posteriormente alterar alguns parâmetros do código e testar o programa com as novas alterações.

Timers - Programa Keil pronto com o programa exemplo carregado
Figura 3: Programa Keil pronto com o programa exemplo carregado

A seguir coloque o programa no modo de Debug (Figura 4, Figura 5 e Figura 6) para que se possa iniciar a simulação.

timers - Selecionando o modo Debug do programa
Figura 4: Selecionando o modo Debug do programa

Antes de entrar no modo de depuração, aparece na tela a mensagem da Figura 4. “Clicke” no  “OK” para continuar.

Timers - Aviso de que no modo de avaliação, o código fica limitado a 2K
Figura 5: Aviso de que no modo de avaliação, o código fica limitado a 2K

timers - Modo Debug de operação
Figura 6: Modo Debug de operação

 

Observe que já estão destacados os painéis de monitoramento do Timer 0 e do Port 3, cujo bit 1 deverá ser alternado a cada término de contagem do temporizador de software. As duas variáveis principais (bFlagTimerDeSoftware e nTimerDeSoftware) poderão ser monitoradas na janela Watch 1 durante a simulação.

É possível utilizar as teclas de função F11 para executar o programa passo a passo ou F5 entrar em execução. Recomendo que você inicie a simulação utilizando o passo  a passo para poder observar detalhadamente como que funciona o mecanismo de operação desse programa.

Resumo

Neste artigo técnico foram apresentados alguns conceitos relativos à utilização de temporizadores de hardware de um microcontrolador associados a temporizadores de software para a implementação de arquiteturas de software típicas de  sistemas operacionais de tempo real. Também foi apresentada e explicada uma biblioteca padronizada para a utilização dos timers de microcontroladores da família MCS-51, codificada em C, para ser compilada no programa da Keil. Depois foi desenvolvido um programa exemplo para que você possa simular o que foi apresentado e observar os detalhes dessa implementação.

Este artigo é o segundo da série de artigos que abordam algumas funções comuns em projetos de sistemas embarcados de tempo real. Confira os demais artigos (em breve).

Sistemas Operacionais de Tempo Real

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

  • Timers (este artigo) – É 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/rtos-timers/

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!

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)

Programação, Robótica e Música Para Baixinhos

Exemplo de ensino da programação e robótica em sala de aula. Evidentemente que o primeiro protótipo lhe dará um trabalhão para fazer, porém depois de pronto, você possui matéria para meio ano letivo, nesse pequeno e encantador brinquedinho Cover. A didática fica por sua conta. Quem tiver o interesse em desenvolver esse projeto com Raspberry PI + Arduino Mega + Arduino Nano, estamos aí…

Não esqueça, o Youtube é uma rede Social.

CONTROLANDO ARDUINO COM APLICAÇÕES EM DELPHI

Uma dica para quem quiser obter comunicação entre arduino e o delphi, para desenvolver interfaces que possibilita controlar o arduino através dodelphi, desenvolver aplicações para projetos de automação e outros projetos. Para conseguir esta comunicação com o delphi será necessário ainstalação do componente TComPort, pois é este componente que lhe dará todo suporte para que você consiga obter a comunicação quanto ao envioe o recebimento de dados com arduino.Para instalar o componente TComPort, é preciso fazer o download do componente no LINK: http://www.cuin.com.br/wp-content/uploads/2013/05/COMPONENTE.rar 
Instalando o componente utilizarei a versão Delphi 7:1º Passo:
Depois de baixar o componente, salve ele em uma pasta de preferencia a pasta que você utiliza pra salvar outros componentes.
2º Passo:
 Abra o delphi é necessário encerrar as aplicações abertas para isto clique em FILE e clique em CLOSE ALL

IBM libera seu processador quântico para testes pela nuvem

A IBM anunciou hoje que permitirá que pessoas e instituições testem o seu processador quântico por meio de seus serviços de nuvem, sem nenhum tipo de cobrança. A iniciativa, chamada de IBM Quantum Experience, tem o objetivo de ajudar a divulgar as possibilidades da computação quântica.

De acordo com a empresa, instituições de ensino, pesquisa e outras empresas poderão acessar um processador quântico da IBM. O processador, mostrado acima, poderá ser acionado por meio de qualquer computador ou dispositivo móvel. Os dispositivos enviarão os dados e cálculos desejados para o processador quântico da IBM pela internet, e o computador então devolverá os resultados.

Além de realizar cálculos e executar algoritmos, a plataforma de computação quântica na nuvem da IBM também oferecerá tutoriais e simulações que mostram o que seria possível de se realizar com essa tecnologia. A página do projeto pode ser acessada por meio deste link.

O processador

O processador da IBM utiliza cinco qubits – unidades básicas de processamento de informação no nível quântico – para realizar os cálculos. Por utilizar materiais supercondutores e por ser muito frágil, o processador precisa ser refrigerado a -272,778ºC para funcionar.

Nos computadores tradicionais, cada bit pode ter o valor de 1 ou 0. Os qubits, por sua vez, podem assumir os valores 1, 0 ou os dois ao mesmo tempo, numa condição chamada de “superposição” – um dos pilares fundamentais da mecânica quântica. Por esse motivo, eles conseguem realizar cálculos de maneira muito mais rápida do que os processadores tradicionais.

processador-quantico

Ele utiliza uma tecnologia desenvolvida pela própria IBM para detectar erros de cálculo realizados pelo processador quântico. Segundo a empresa, a arquitetura utilizada nele pode ser eventualmente aumentada para chegar a 50 a 100 qubits. Um processador quântico de 50 qubits seria mais potente que o maior supercomputador disponível atualmente.

A IBM acredita que a computação quântica pode ser a próxima revolução no mundo da tecnologia, por conta da falência cada vez mais aparente da Lei de Moore. Gigantes da tecnologia e da ciência, como o Google e a NASA, também têm investido nesse ramo, e mesmo organizações supranacionais, como a União Europeia, investem em pesquisa nessa área. Outras empresas também apostam no uso de neurônios para criar computadores exponencialmente mais potentes.

Fonte: http://olhardigital.uol.com.br/pro/noticia/ibm-libera-seu-processador-quantico-para-testes-pela-nuvem/57974

The CIPRES Science Gateway V. 3.3

arvore-da-vida

The CIPRES Science Gateway V. 3.3 é um recurso público para a inferência de grandes árvores filogenéticas. Ele é projetado para fornecer à todos os pesquisadores com acesso a NSF XSEDE, grandes recursos computacionais através de uma interface simples navegador. Agora também é possível acessar esses mesmos recursos programaticamente com a CIPRES REST API .

Códigos paralelos de desempenho elevados para o Grande Árvore Inferência e alinhamento de sequências em XSEDE:
RAxML ; MrBayes ; BEAST ; BEAST2 ; Garli ; mafftDPPDIV ; FastTree, jModelTest2 e Migrate-N . Se você precisa de acesso a PhyloBayes , por favor consulte.

Códigos seriais para Tree Inference:
PAUP * (Inferência por Parcimônia); Poy  (alinhamento e inferência);

Códigos de série para Sequence Alignment:
ClustalW ; Contralign ; MUSCULARES ; PROBCONS ; PROBALIGN

Códigos paralelos atualmente suportados pela CIPRES Cience Gateway

Código Versão Língua Compilador Computador Cores
cobrado
biblioteca MPI enfiando outro Software
FERA 1.8.3 Java Cometa 2-48 Java BEAGLE 2.1
BEAST2 2.3.2 Java Cometa 1-3 Java BEAGLE 2.1
DPPDiv 1.0 C ++ GNU Gordon 16 pthreads
FastTree 2.1.8 C Intel Cometa 2 OpenMP
Garli 2.0.1 C ++ Intel Cometa 1 a 24 OpenMPI NCL 2.1.18
jModelTest2 2.1.6 Java Gordon 8 Java PhyML 20120412
mafft 7.187 C Intel Gordon 8 pthreads
MrBayes 3.2.6 C Intel Gordon 8 ou 16 mvapich2 BEAGLE 2.1
Migre-N 3.6.11 C Intel Cometa 1-72 mvapich2
PhyloBayes 1.5a C ++ Intel Gordon 64 mvapich2
RAxML 8.2.8 C Intel Cometa 12, 24, ou 48 OpenMPI pthreads

 

CLIQUE AQUI E DESCUBRA

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

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

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

Livro Python para Pentester e Hackers

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

Curso de PHP

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

Curso DreamWeaver

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

Curso de Redes

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

Segurança em Redes

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

Banco de Dados

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

Curso de Eletrônica

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

Curso de JOOMLA completo

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

Curso de Linux

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

Curso Hardware

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

Mega pacote de cursos Alura

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

Curso Wireless Hacking

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

Curso WordPress

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

Engenharia de software

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

Hacking

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

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

Hardware

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

Introdução aos Sistemas Operacionais

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

Linux

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

Linux Essentials

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

Lógica de Programação Usando Python

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

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

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

Programação WEB

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

Redes

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

Segurança

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

Sistemas Operacionais

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

Software Livre

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

Teste de Invasão em Redes Sem Fio

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

Apostila HTML CSS

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

Artigo – wireshark

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

Curso Android Básico

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

Curso Banco de dados SQL e Modelagem

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

Curso completo de Python

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

Curso Linux

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

Curso ipv6

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

Hackeando Mentes

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

Hacker inside

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

Kevinmitnick a arte de enganar

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

Banco de dados

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

Computação Forense

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

Curso inglês

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

DeepWeb

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

Edição de imagens

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

Engenharia de software

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

Hacking

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

Introdução a sistemas operacionais

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

Microsoft office

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

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

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

Programação WEB

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

Redes

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

Segurança

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

Sistemas operacionais

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

Software Livre

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

Teoria da computação

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

Vídeo aulas

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

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

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

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

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

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

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

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

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

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

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

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

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

Projeto Valkyrie

Você pode usá-lo para automação residencial, bem como controlar dispositivos como braço robo, robôs etc. Valkyrie está ligado à IOT usando Wi-Fi, BLE, Bluetooth clássico, UHF RF Transceiver e XBee, usando o protocolo universal chamado V-API. Este é Valkyrie o caminho futuro do gesto e voz controle.

Características do projeto Valkyrie:

  • processamento de movimento em tempo real inovadora
  • serviço de controle de voz
  • detecção de controle por gestos inteligentes
  • aplicações para smartphones
  • funcionalidade de Bem-Estar
  • API aberta para desenvolvedores
  • Várias interfaces de comunicação

Luva: Projeto Valkyrie é destinado a completar o desafio “SpaceGlove”. Para os 2 dias que trabalharam nesse projeto nós fizemos uma luva de couro e material elástico que é confortável para o uso diário e trabalha cerca de 70 horas em modo de transmissão de energia integral.

Com essa luva, fizemos experiências para controlar muitos dos dispositivos domésticos padrão (lâmpadas, luzes, aquecedor de fã, tiras de luz LED, TV, caixa de configuração) com gestos baseados tais como slide, de cima para baixo, para baixo-up etc Depois que fizemos um serviço que está transmitindo dados a partir da luva a um iPhone, e nós temos modificado a base de dados gesto, e acrescentou gestos personalizados. Com precisão de 10% que têm distinguido com sucesso 16 gestos diferentes e adicionou suporte para mais de 60.

Centro de controle: . Para controlar muitas interfaces precisamos de um centro de controle que está repetindo sinais recebidos a partir de qualquer das interfaces de comunicação e enviá-lo para as outras interfaces
As seguintes interfaces são suportados:

  • Wi-fi
  • Bluetooth Low Energy
  • Classi Bluetooth
  • XBee (ZigBee)
  • 433 MHz transceptor de rádio, e
  • comunicação USB

 Nós integramos muitas bibliotecas e de comunicação único e universal e implementou-lo em um V-API (Valkyrie API). A ideia na V-API é que é pode ser usado com qualquer tipo de dispositivos e usando o protocolo universal você pode facilmente escrever os códigos para a comunicação. O V-API é explicado em detalhes no slide 17 da documentação de hardware e firmware incluídos nos recursos.

Luva das posições dos sensores e descrições:

AccGyro

force-sensor graphic

heart-rate-sensor

As aplicações móveis: Nós desenvolvemos 2 aplicações de interface com o centro de comando (e a luva) – uma para Android e um para iOS. O aplicativo Android usa apenas o serviço de detecção de voz usando o google agora pesquisar e se o comando é reconhecido que envia a solicitação HTTP POST para o nosso serviço on-line (imp elétrica). O serviço Android está trabalhando no telefone, bem como no relógio Android. O aplicativo iOS suporta serviço feito sob encomenda Reconhecimento de voz, controle de automação residencial usando a voz ou entrada directa na aplicação, e informações da estação meteorológica. O nosso serviço de bem-estar está verificando a sua frequência cardíaca automaticamente a cada 30 minutos ou continuamente enquanto você está treinando. Ele também pode contar seus passos e detectar sua qualidade de sono. O aplicativo também pode ser usado para upload de novo firmware para a luva e para criar mais gestos de ser reconhecidos pela luva e ligá-los para executar uma variedade de ações.

iPhoneScreens

No momento, temos uma luva totalmente funcional, a aplicação iOS com todas as propriedades que precisamos, controles remotos para computadores (luva agindo como dispositivo HID), controle de telefone embora o serviço HID BLE, controle de casa inteligente com os hábitos e gestos já implementadas, controle robo braço, controle de jogo de computador, controle rover / carro gesto, controle remoto da TV inteligente e muitos mais por causa do protocolo V-API universal que pode ser usado em muitos lugares.

Q & A:

  • Não há gravidade no espaço aberto – podemos usar um transmissor magnético para determinar o ponto “zero” no espaço e usá-lo para calibrar e sentir a gravidade pseudo e velocidade angular.

  • É difícil usar a maioria dos dispositivos de comunicação GHz no espaço – É por isso que nós temos transceptores de 433 MHz  no Centro de Controle. As bandas de VHF e UHF são capazes de penetrar na atmosfera terrestre e transmitir a comunicação de baixo ruído da terra para o espaço. Isto é usado pelos radioamadores para fazer QSOs utilizando as estações espaciais internacionais como repetidor.

  • velocidade de dados de baixo se o dispositivo controlado é muito longe da terra – não há muito que possamos fazer sobre isso, então decidimos fazer macros personalizadas (por exemplo, se você está controlando braço robótico), você faz o movimento uma vez com a mão então este é enviado para o braço robótico, que memoriza o movimento e fazê-lo pelo comando. Por exemplo no vídeo temos usado este sistema para agarrar a caixa e movê-lo algumas polegadas atrás.
  • Conexão cai enquanto controla algo – Se não há nenhuma conexão para 300 ms, a operação pára até que a ligação não for retomada.
  • Carregar – estamos considerando o carregamento sem fio, porque com as novas tecnologias no carregamento sem fio é possível cobrar 800 mAh por menos de 40 min.
  • Consumo de energia – é 13 – 15 mA no modo de transmissão.
  • você pode usar dispositivos externos (como celulares com Android, Bluetooth Joystic) para controlar dispositivos periféricos Control Center – Sim, pode-V API é um protocolo universal para comunicação, todos os relatórios recebidos são repetidos para as outras interfaces de comunicação.

Imagens da luva feita durante os 2 dias do desafio Apps Space: sistema de sensor de pressão real.

IMG_2025_photoshop

 

Desenvolvimento futuro

  • Para tornar totalmente funcional Aplicativo para Android
  • Para adicionar mais sensores para a estação de controle
  • Para melhorar e tornar as bibliotecas V-API claramente legíveis para C, C ++, C #, Java, Java Script, Objective C
  • A cooperar com muitas universidades e outras instituições de ciência em todo o worlд
  • Para tornar a placa de circuito impresso flexível para a luva
  • Para desenvolver personalizados Bluetooth Serviços de Energia baixa para ser fácil de usar por desenvolvedores Android / iOS
  • Para adicionar mais documentação e estabelecer centro de suporte para suportar os desenvolvedores usando o nosso V-API
  • Para fazer algumas variações a luva por exemplo, negócios, esporte, casual e fazer o hardware para ser fácil mutável
  • Testes oficiais
  • Lançamento do projeto (Se começarmos em 2015/06/01 até o final de setembro ’15 teremos um produto)

 

https://open.nasa.gov/innovation-space/valkyrie/

Como criar UIPageViewController Usando Storyboard

We’ve covered UIPageViewController before. The original tutorial demonstrates how to create UIPageViewController using Interface Builder. To make it compatible with iOS 7 and Xcode 5, we completely rewrite the whole tutorial. In addition, we’ll use Storyboard to create UIPageViewController.

For the very first time you launch an app, you’ll probably find a series of walkthrough (or tutorial) screens to give you a brief introduction of the features. It’s a common practice to explain how the app works. In this tutorial, we’ll show you how to build a similar type of walk through screens by using UIPageViewController.

The UIPageViewController class was first introduced in iOS 5 SDK that lets developers build pages of content, where each page is managed by its own view controller. The class was further improved in iOS 6 to support the scrolling transition. With page view, users can easily navigate between multiple pages through simple gesture. The page view controller is not limited to create walkthrough screens. You can find examples of page view implementation in games like Angry Birds to show the available levels or book apps to display pages of content.

page-view-controller-nilton-felipe

The UIPageViewController is a highly configurable class. You’re allowed to define:

  • the orientation of the page views – vertical or horizontal
  • the transition style – page curl transition style or scrolling transition style
  • the location of the spine – only applicable to page curl transition style
  • the space between pages – only applicable to scrolling transition style to define the inter-page spacing

We’ll create a simple app together in order to demonstrate how UIPageViewController works. However, we’ll not demonstrate every option of UIPageViewController. We’ll just use the scrolling transition style to display a series of walkthrough screens. Don’t worry. With the basic understanding of the UIPageViewController, I believe you should be able to explore other features in the page view controller.

Let’s get started.

A Glance at the Demo App

The demo app we are going to create is very simple. It displays 4 pages of screens to give users a brief introduction to the user interface. User can navigate between pages by swiping through the screen. Whenever user taps the “Start again” button to go back to the first page of tutorial. This type of walkthrough/tutorial screens shouldn’t be new to you as they are commonly found in apps such as Snapguide and Airbnb.

page-view-controller-1-2-nilton

Creating the Project

Launch Xcode and create a new Project by using the Single View Application template. It might seem a little bit strange to select the Single View Application template as Xcode already comes with a Page-Based Application template, which contains a fully functional app based on the UIPageViewController. However, this template is a little bit complex and it will take us more time to clean-up the code of the template than to start from scratch. Needless to say, we can better grasp the concept behind the UIPageViewController when we start from scratch.

page-view-controller-1-3-nilton

Okay, let’s move on. In the next screen enter PageViewDemo as the product name and set com.appcoda in the company identifier field. Select iPhone for the Devices option. Press next and create the project.

page-view-controller-1-4-nilton

Creating Page View Controller in Storyboard

Next, select the Main.storyboard. As usual, you should find a default view controller generated by Xcode. Leave it as it is. Drag a Page View Controller from the Object Library into the storyboard. Then add another View Controller and put it in the same storyboard.

page-view-controller-1-5-nilton

For this project, the original view controller is used as the root view controller for holding the page view controller. The view controller you’ve just added will be used for displaying the page content. Throughout the article, we refer the original view controller as the root view controller and the other view controller as page content controller.

You may wonder why we just add a single view controller for 4 pages of content. Shouldn’t we use four view controllers instead of one? As you can see from the final deliverable, the walkthrough screens are very similar. It’s better to share the same view controller for different screens.

Next, assign a Storyboard ID for the page view controller and the page content controller. You can simply select the controller and set the ID under Identity Inspector. Set the Storyboard ID of the page view controller as “PageViewController” and name the ID of the page content controller as “PageContentController”. Later we’ll refer to these IDs in our code.

page-view-controller-1-6-nilton

By default, the transition style of the page view controller is set as Page Curl. The page curl style is perfect for book apps. For walkthrough screens, we prefer to use scrolling style. So change the transition style to Scroll under Attribute Inspector.

page-view-controller-1-7-nilton

We’ll design the user interface of page content view controller. Drag an image view and a label into the controller. You’re free to change the font type and size. But your view controller should be similar to the below screenshot.

page-view-controller-1-7-nilton

For the default view controller, add a “Start again” button and put it at the below of the screen.

page-view-controller-1-8-nilton

Creating View Controller Class

The next step is to create view controller class and associate it with the corresponding view controller. From the menu, select File -> New -> File … and choose the “Objective-C class” template. Name the class as PageContentViewController and make it a subclass of UIViewController.

page-view-controller-1-9

Go back to Storyboard. Select the page content view controller and set the custom class to PageContentViewController under Identify Inspector.

page-view-controller-1-10

Next, we’ll create outlets for the image view and label. Switch to the Assistant Editor and make sure the PageContentViewController.h is opened. Control and drag from the image view to the PageContentViewController.h and create an IBOutlet. Set the name as backgroundImageView for the image view. For the label, set the name of the outlet as titleLabel.

page-view-controller-1-11-nilton

After the change, the PageContentViewController.h should look like this:

Next, select the root view controller and make sure the ViewController.h is opened. Create an action for the “Start again” button and name the action as “startWalkthrough”.

page-view-controller-1-12

Okay, we’ve completed the design of user interface and created all the outlets. Let’s move onto the implementation of the view controller classes.

Implementing the Page Content View Controller

It’s very straightforward to implement the page content view controller. First, add the following properties in PageContentViewController.h:

The pageIndex stores the current page index (or page number). The view controller is designed to display an image and a title. So we create two parameters for passing the title text and image file. Next, open PageContentViewController.m and change the viewDidLoad: method:

Implementing the Page View Controller

The UIPageViewController class is classified as a container controller. The container controller is used to contain and manage multiple view controllers shown in the app, as well as, controlling the way one view controller switches to another. Here the UIPageViewController is the container controller that lets the user navigate from page to page, where each page is managed by its own view controller object. The following illustration depicts the relationship between the page view controller and the page content view controller.

page-view-controller-1-13

In order to make UIPageViewController work, we must adopt the UIPageViewControllerDataSource protocol. The data source for a page view controller is responsible for providing the content view controllers on demand. By implementing the data source protocol, we tell the page view controller what to display for each page.

In this case, we use the ViewController class as the data source for the UIPageViewController instance. Therefore it is necessary to declare the ViewController class as implementing the UIPageViewControllerDataSource protocol.

The ViewController class is also responsible to provide the data of the page content (i.e. images and titles). Open the ViewController.h. Modify the @interface declaration, add a new property to hold the UIPageViewController, as well as, properties for both images and titles:

In the ViewController.m, initialize the pageTitles and pageImages in the viewDidLoad method:

Note: You can download image files from here and add them into the Xcode project.

We have created the data model for the page content. Next, we have to implement at least two methods of the UIPageViewControllerDataSource protocol:

  • viewControllerAfterViewController – provides the view controller after the current view controller. In other words, we tell the app what to display for the next screen.
  • viewControllerBeforeViewController – provides the view controller before the current view controller. In other words, we tell the app what to display when user switches back to the previous screen.

Add the following lines of code before the end of the ViewController.m file:

The above methods are very straightforward. First, we get the current page index. Depending the method, we simply increase/decrease the index number and return the view controller to display. Of course, we have to verify if we have reached the boundaries of the pages and return nil in that case.

As you may notice, we haven’t created the viewControllerAtIndex: method. It is a helper method that is designed to create the page content view controller on demand. It takes in the index parameter and creates the corresponding page content controller.
In the ViewController.m, add the helper method:

Recalled that we have set a storyboard ID for the view controllers when designing the user interface. The ID is used as reference for creating the view controller instance. To instantiate a view controller in storyboard, you can use the instantiateViewControllerWithIdentifier: method with a specific storyboard ID.

To display a page indicator, you have to tell iOS the number of pages (i.e. dots) to display in the page view controller and which page must be selected at the beginning. Add the following two methods at the end of the ViewController.m file:

Again the above code is very straightforward. We simply tell iOS that we have the total number of pages to display in the page view controller and the first page should be selected by default.

Note: You must implement both methods in order to display the page indicator. Also the page indicator only works in scroll transition mode.

Initializing the UIPageViewController

The final step is to create and initialize the UIPageViewController. The best place to do that is in the viewDidLoad method. Open the ViewController.m file and change the method to:

Let’s see what the method does. We first create the PageViewController instance. Next we specify the data source, in this case it is the class itself. We then create the first page content controller, add it to an array of controllers and assign it to the page view controller for display.

Lastly, we change the size of the page view controller and add the page controller view to the current view.

Customize the Page Indicator

If you compile and run the app now, your app should run properly but you may find the page indicator missing. Actually the page indicator is there but the color of the dots is the same as the color of the view. So let’s change its color.

In the AppDelegate.m, add the following lines of code in the didFinishLaunchingWithOptions: method:

Compile and Run the App

And there we go, start the application and see how the UIPageViewController works. You should be able to load the page view controller by using the iPhone Simulator. Try to swipe through the screen to navigate between pages.

page-view-controller-1-14-nilton

Back to the First Page

There is still one thing left. The “Start again” is not yet implemented. When tapped, we expect the page view controller will scroll back to the first page. You can use the setViewControllers: method of the UIPageViewController to switch page. To go back to the first page of the page view controller, change the startWalkthrough: method of ViewController.m:

Run the app again. The app will bring you back to the first page when tapping the “Start again” button.

Summary

In this tutorial, we cover the basics of UIPageViewController and demonstrate how to implement the controller by using Storyboard. The UIPageViewController is a very handy class for implementing walkthrough screens in your app. That said, the usage of UIPageViewController is unlimited. You can use it to display whatever information as you like such as pages of web view. The UIPageViewController is highly configurable. This tutorial only covers the scroll transition style. But don’t you know that you can easily use the class to build a simple book app? Simply change the transition style from scroll to page curl and see what you’ll get. So don’t stop here. Try to change the available options and learn about UIPageViewController.

For your complete reference, you can download the Xcode project from here. As always, please leave us comment and share your thought.

Fonte: http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/

Chartist.js – criando gráficos responsivos com o chartist.js

Outro dia, pesquisando outras bibliotecas para criar gráficos responsivos com HTML5 e javascript, acabei encontrando esta chamada Chartist.js. Inicialmente eu confundi essa biblioteca com a Chart.JS, achava que era uma espécie de major update, mas depois percebi que era uma solução a parte, mas que também fica nem um pouco para trás em termos de funcionalidades modernas e simplicidade. Acabei criando esse post com base nos testes que fiz na ferramenta então sintam-se livres para encaminhar duvidas e testar o demo que está disponibilizado no artigo.

Bom, esse é o primeiro post de 2015 no blog, então um ótimo ano para todos.

Como de costume nos posts do blog, eu sempre crio um demo para tentarexplicar como eu entendi e aprendi a utilizar tal ferramenta. Com essa não vai ser diferente, então segue o link para baixar o demo e o repositório do GitHub.

Introdução ao Chartist.js

O Chartist.js é mais uma solução disponível para facilitar a forma com que trabalhamos com gráficos para web, utilizando HTML5 e JavaScript.

O diferencial do Chartist.js e o motivo que me fez testar a solução foi a questão estética que chama muito a atenção, com um design flat muito bem elaborado, e a simplicidade na utilização da solução, seguindo a documentação (que é tão simples e direta que chega a ser bem curta).

Além disso, os gráficos são renderizados com SVG inline, o que significa que você tem maior controle do gráfico pois as tags SVG que compõem o gráfico estão no DOM. Você pode testar essa funcionalidade visualizando a página do Chartist.js através da ferramenta para desenvolvedores do seu navegador.

Para maiores informações a respeito do Chartist.js, acesse a documentação oficial.

Como utilizar

Bom, como já citei antes, a utilização é muito simples. Primeiro precisamos adicionas os links para os arquivos que presentes nos repositórios, dentro da tag head. No demo ficou algo como:

1
2
<link rel=“stylesheet” href=“//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css”>
<script src=“//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js”></script>

Note que no demo eu utilizei links CDN para os arquivos da biblioteca. Se você quiser testar localmente baixe o repositório do GitHub e substitua os caminhos de apontamento para os arquivos locais, os repositórios CDN precisam de acesso a internet para carregar as funcionalidades da solução.

Após isso podemos declarar as funções para chamar o primeiro gráfico. Antes de criar um gráfico, temos que entender a metodologia de design utilizada pelo Chartist.js para abordar a reponsividade dos gráficos.

Ao invés de utilizar tamanhos fixos para a box (320×320, por exemplo), são utilizadas medidas de proporção, como 4:3, 3:2, 16:9 (famoso widescreen). Com essa técnica fica mais fácil garantir a reponsividade do gráfico em qualquer tamanho de tela.

Com isso em mente, criamos uma box onde o gráfico deve ser renderizado, conforme o exemplo abaixo:

1
<div class=“ct-chart ct-square”></div>

Utilizei a proporção ct-square, que medindo em proporção da um quadrado. Existem diversas medidas na documentação, além dessa do exemplo eu também testei a .ct-perfect-fourth que seria 4:3, e a .ct-golden-ratio.

Se você utilizar uma box com medidas fixas você não precisa declarar uma classe para proporção, basta declarar a função que de fato vai criar o gráfico na box que criamos acima. Utilizamos o seguinte código para criar o gráfico:

1
2
3
4
5
6
7
8
9
window.onload = function() {
var data = {
labels: [‘segunda’, ‘terça’, ‘quarta’, ‘quinta’, ‘sexta’],
series: [
[10, 24, 51, 3, 12]
]
};
new Chartist.Line(‘.ct-chart’, data);
};

Feito isso, e se estiver seguindo o demo, ao carregar a página deve ser apresentado um gráfico similar ao da imagem abaixo.

chartist_js_Nilton_Felipe

Se você criou o gráfico sem uma proporção, você pode utilizar as opções da API para declarar as medidas fixas. Primeiro adicionamos uma variável com as informações de medidas:

1
2
3
4
var options = {
width: 300,
height: 200
};

E depois criamos o objeto com referência a variável:

1
new Chartist.Line(‘.ct-chart’, data, options);

Na documentação oficial, na parte de informações sobre a API você tem todas as informações sobre as opções disponíveis para customização do gráfico. Com o Chartist.js você consegue customizar praticamente qualquer gráfico que você criar, ainda mais utilizando SVG inline para renderizar os gráficos.

Além deste exemplo, no demo que eu criei tem mais três testes, apresentando quatro gráficos em uma mesma página, com diferentes valores e estilos.

As opções de customização do Chartist.js vão ainda muito além, você pode animar a visualização do gráfico, criar sinalizadores para pontos cruciais, tudo isso com recursos disponíveis na própria biblioteca da solução que é toda baseada em JavaScript, mais alguns plugins disponíveis para funções especificas.

Não vou muito a fundo na ferramenta porque a intenção era apenas uma introdução, mas se você conseguiu entender como funciona a biblioteca até aqui, acredite, não vai ter problemas para criar exemplos mais avançados como estes exemplos da documentação, e este exemplo abaixo (visualize no Chrome para um resultado satisfatório).

Fonte: http://websocialdev.com/chartist-js-criando-graficos-responsivos-com-o-chartist-js/

Introdução ao Google Chart Tools

“Veja neste artigo como criar gráficos usando a biblioteca Google Chart Tools, uma biblioteca simples porém muito poderosa com a qual podemos desenhar e interagir com diversos tipos de gráficos.”

 

Sem dúvida alguma, gráficos são uma fonte importante de informação, sendo assim são imprescindíveis a boa partes dos sistemas. No decorrer do artigo vamos aprender a construir gráficos utilizando Javascript.

Gráficos oferecem certa dificuldade para sua construção em qualquer linguagem, mas para que reinventar a roda se alguém já fez isso (e muito bem feito) para nós?

Com uma rápida procura na internet encontraremos algumas bibliotecas para este propósito, mas para esse artigo vamos usar a biblioteca do Google, a Google Chart Tools, pois é tida por muitos como a melhor disponível hoje em dia por ser de uma clareza muito grande, ter uma curva de aprendizagem pequena e uma documentação muito boa.

Com ela podemos desenhar os principais tipos de gráficos, torta (pizza), barras, linhas, tabelas entre outros. Veja alguns exemplos na Figura 1.

Figura 1: Exemplos de gráficos criados com a Google Chart Tools

Figura 1: Exemplos de gráficos criados com a Google Chart Tools

 

Desenhando os Gráficos.

Vamos colocar a mão na massa, ou melhor, no código. Vamos começar com o gráfico torta (pizza), em inglês Pie.

Mas antes de mais nada precisamos incorporar a biblioteca e importar o core do Google Chart Tools. Acompanhe a Listagem 1.

Listagem 1: Incorporando biblioteca

<html>
  <head>
    https://www.google.com/jsapi
    
      google.load("visualization", "1", {packages:["corechart"]});
    
  </head>
</html>

A listagem é bastante autoexplicativa, mas por desencargo de consciência vejamos alguns comentários: na linha 3 importamos a API do Google e na linha 5 carregamos o modulo visualization do pacote corechart.

Pronto, agora sim podemos começar a brincadeira de verdade. Vamos implementar um gráfico do formato Pie com as porcentagens de qual linguagem de programação gostamos mais.

Listagem 2: Desenhando o gráfico de torta

<html>
  <head>
    https://www.google.com/jsapi
    
		//carregando modulo visualization
      google.load("visualization", "1", {packages:["corechart"]});
      
	  //função de monta e desenha o gráfico
      function drawChart() {
	//variavel com armazenamos os dados, um array de array's 
	//no qual a primeira posição são os nomes das colunas
	var data = google.visualization.arrayToDataTable([
          ['Linguagem', 'Quando gosto dela'],
          ['Java',     40],
          ['PHP',      30],
          ['Javascript',  25],
          ['C#', 5],
          
        ]);
		//opções para exibição do gráfico
        var options = {
          		title: 'Linguagens',//titulo do gráfico
		is3D: true // false para 2d e true para 3d o padrão é false
        };
		//cria novo objeto PeiChart que recebe 
		//como parâmetro uma div onde o gráfico será desenhado
        var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
		//desenha passando os dados e as opções
        chart.draw(data, options);
      }
	//metodo chamado após o carregamento
	 google.setOnLoadCallback(drawChart);
    
  </head>
  <body>
    
</body> </html>

Foram colocados comentários no meio do código para que fique mais claro de acompanhar cada passo, porém muitas outras opções podem ser usadas. Podem ser tantas que não iremos colocá-las aqui, mas haverá um link no final desse artigo onde podemos encontrar todos os detalhes sobre as mesmas.

Continuando, vamos desenhar mais três tipos de gráficos, Linhas, Barras e Tabelas.

Basicamente o que muda de um tipo de gráfico para outro no que diz respeito ao código é o formato do array de dados que passamos para ele e o objeto que é instanciado. Vejamos, por exemplo, os dos formatos Linhas e Barras que tem o formato de dados idênticos.

Listagem 3: desenhando gráficos Barras e Linhas

<html>
  <head>
    https://www.google.com/jsapi
    
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
	  //montando o array com os dados
        var data = google.visualization.arrayToDataTable([
          ['Ano', 'Vendas', 'Despesas'],
          ['2004',  1000,      400],
          ['2005',  1170,      460],
          ['2006',  660,       1120],
          ['2007',  1030,      540]
        ]);
		//opçoes para o gráfico barras
        var options = {
          title: 'Performance',
          vAxis: {title: 'Anos',  titleTextStyle: {color: 'red'}}//legenda vertical
        };
		//instanciando e desenhando o gráfico barras
        var barras = new google.visualization.BarChart(document.getElementById('barras'));
        barras.draw(data, options);
		//opções para o gráfico linhas
		var options1 = {
          title: 'Performance',
		  hAxis: {title: 'Anos',  titleTextStyle: {color: 'red'}}//legenda na horizontal
        };
		//instanciando e desenhando o gráfico linhas
        var linhas = new google.visualization.LineChart(document.getElementById('linhas'));
        linhas.draw(data, options1);
		
      }
    
  </head>
  <body>
    
</body> </html>

O formato do array mudou em relação ao gráfico torta, porém foi comum aos dois da Listagem 3. Agora vejamos o formato tabela que tem um modo um pouco diferente dos outros três na montagem do array.

 

Listagem 4: Desenhando a Tabela

<html>
  <head>
    https://www.google.com/jsapi
    
	  //importando o pacote table
      google.load('visualization', '1', {packages:['table']});
	  //metodo que será chamado após 
      google.setOnLoadCallback(drawTable);
      function drawTable() {
		//instanciando array do formado de tabela
        var data = new google.visualization.DataTable();
		//adicionando colunas, tipo e nome
        data.addColumn('string', 'Aluno');
        data.addColumn('number', 'Nota');
        data.addColumn('boolean', 'Aprovado');
		//adicionando linhas
        data.addRows([
          ['Allan',  {v: 10, f: '10'}, true],
          ['Douglas',   {v:8,   f: '8'},  true],
          ['Larissa', {v: 5.5, f: '5,5'}, false],
          ['Eliane',   {v: 7,  f: '7'},  true]
        ]);
		//instanciando e desenhando tabela
        var table = new google.visualization.Table(document.getElementById('table_div'));
        table.draw(data, {showRowNumber: true});
      }
    
  </head>

  <body>
    
</body> </html>

Embora diferente dos outros exemplos no que diz respeito à importação do pacote table e no tipo de objeto array para armazenar os dados, ainda fica muito fácil de entender o desenrolar do código. Uma coisa interessante é no caso da segunda coluna (‘number’, ‘Nota’) que, como vocês podem ver, é um array que tem duas posições: uma para o valor “v:10” e outra para o texto formatado.

Manipulando eventos

O que fizemos até agora foi muito bom e já nos ajuda muito, mas por que não fazermos mais? Vamos criar uma interação com os gráficos através de eventos que são disparados quando, por exemplo, clicamos sobre a linha de uma tabela.

Para realizarmos essa tarefa vamos modificar o código da Listagem 4. Iremos adicionar um listener para ficar escutando o objeto table e criar uma função para manipular o evento. Na Listagem 5 podemos ver um exemplo de manipulação do evento select.

Listagem 5: Manipulando evento select.

<html>
  <head>
    https://www.google.com/jsapi
    
	  //importando o pacote table
      google.load('visualization', '1', {packages:['table']});
	  //metodo que será chamado apos 
      google.setOnLoadCallback(drawTable);
	  
      function drawTable() {
		//instanciando array do formado de tabela
        var data = new google.visualization.DataTable();
		//adicionando colunas, tipo e nome
        data.addColumn('string', 'Aluno');
        data.addColumn('number', 'Nota');
        data.addColumn('boolean', 'Aprovado');
		//adicionando linhas
        data.addRows([
          ['Allan',  {v: 10, f: '10'}, true],
          ['Douglas',   {v:8,   f: '8'},  true],
          ['Larissa', {v: 5.5, f: '5,5'}, false],
          ['Eliane',   {v: 7,  f: '7'},  true]
        ]);
		//instanciando e desenhando tabela
        var table = new google.visualization.Table(document.getElementById('table_div'));
		//adicionando um listner que ouvirá o evento select para o objeto table 
		google.visualization.events.addListener(table,"select",function(e){
			//pega oa array de itens selecionados
			var selection = table.getSelection();
			
			//varre o array de para montar a string que será exibida
			var tam = selection.length;
			var str = "";
			for(var i = 0; i 
  </head>

  <body>
    
</body> </html>

Sobre o método getSelection, ele retorna um array dos itens selecionados (podemos selecionar mais de uma linha usando shift e control), por isso precisamos varrê-lo com o for. Porém, não podemos acessar o valor diretamente, para isso usamos o método getFormattedValue que recebe o número da linha e coluna e retorna o valor da célula.

Aqui está o link para a API oficial para mais detalhes: https://developers.google.com/chart/

Bem pessoal, vou ficando com aqui. Comentem, compartilhem, fiquem à vontade e até a próxima.

 

Fonte: http://www.devmedia.com.br/introducao-a-google-chart-tools/26453

Compilação de tutoriais sobre C#

Compilação de tutoriais em C#:

Desenvolvendo Class ou Classes com C#, ASP.NET e Visual Studio 2010 – Parte 1
http://thecodebr.blogspot.com/2010/07/desenvolvendo-class-ou-classes-com-c.html

Video Aula Tutorial – Criando MasterPage com Visual Studio ASP.NET
http://thecodebr.blogspot.com/2010/07/video-aula-mostrando-como-construir-uma.html

Criando e utlizando Code Snippets no Visual Studio
http://thecodebr.blogspot.com/2010/07/criando-e-utlizando-code-snippets-no.html

Função – Function JavaScript com C# e ClientScriptManager
http://thecodebr.blogspot.com/2010/06/funcao-function-javascript-com-c-e.html

Como converter String para numero com C#.NET
http://thecodebr.blogspot.com/2010/05/como-converter-string-para-numero-com.html

ArrayList com C#, criando e retornando valores
http://thecodebr.blogspot.com/2010/05/arraylist-com-c-criando-e-retornando.html

Saber IP do usuário com C#
http://thecodebr.blogspot.com/2010/05/saber-ip-do-usuario-com-c.html

Como enviar e-mail com Asp.Net e C#
http://thecodebr.blogspot.com/2010/05/como-enviar-e-mail-com-aspnet-e-c.html

Introdução ao LINQ to XML Parte 1 – Lendo dados
http://thecodebr.blogspot.com/2010/05/introducao-ao-linq-to-xml-parte-1-lendo.html

LINQ to XML Parte 2 – Criando XML

http://thecodebr.blogspot.com/2010/05/linq-to-xml-parte-2-criando-xml.html

C# – Concatenando strings com StringBuilder
http://thecodebr.blogspot.com/2010/05/c-concatenando-strings-com.html

C#.NET – Convertendo para MAÍUSCULAS ou minúscula uma string
http://thecodebr.blogspot.com/2010/05/cnet-convertendo-para-maiusculas-ou.html

C#.NET – Substituir Caracteres com Replace()

http://thecodebr.blogspot.com/2010/05/cnet-substituir-caracteres-com-replace.html

C#.NET – Cortar String com Substring()

http://thecodebr.blogspot.com/2010/05/cnet-cortar-string-com-substring.html

C# – Numero Randômico (Random Number)

http://thecodebr.blogspot.com/2010/04/c-numero-randomico-random-number.html

Vários exemplos rápidos de soluções de problemas em C#
http://www.ti4fun.com/

Exportando DataTable para Excel utilizando Interop
http://msmvps.com/blogs/deborahk/archive/2009/07/23/writing-data-from-a-datatable-to-excel.aspx

Exportando DataTable para Excel utilizando OleDb
http://www.codeproject.com/KB/office/excel_using_oledb.aspx

Conceitos e Exemplos Práticos de Acesso a Dados usando ADO.NET, C# com SQL Server e ASP.NET (7 partes):
http://programandodotnet.wordpress.com/tag/acesso-a-dados/

Curso Básico de SQL Server (em andamento):
http://programandodotnet.wordpress.com/category/net/sql-server/basico/

Cadastro Básico de Clientes em C# usando os conceitos de ADO.NET (3 partes):
http://programandodotnet.wordpress.com/tag/cadastro-de-clientes/

Ótimos Links de Blogs/Comunidades/Sites:
http://programandodotnet.wordpress.com/tag/links-uteis/

Cadastro de Consultório em Windows Forms, com C# e SQL Server (12 partes até o momento):
http://programandodotnet.wordpress.com/tag/consultorio

Enviando Emails com ASP.NET:
http://programandodotnet.wordpress.com/2010/05/01/enviando-emails-com-asp-net-usando-system-net-mail/

Leitor de RSS em ASP.NET:
http://programandodotnet.wordpress.com/2010/05/06/criando-um-leitor-de-rss-em-asp-net/

Leitor de Arquivos em ASP.NET:
http://programandodotnet.wordpress.com/2010/05/23/criando-um-leitor-de-arquivos-em-asp-net/

Monitorando Arquivos e Diretórios com FileSystemWatcher – Windows Form:
http://programandodotnet.wordpress.com/2010/06/04/monitorando-arquivos-e-diretorios-com-filesystemwatcher/

Usando DataSet Tipado em ASP.NET:
http://programandodotnet.wordpress.com/2010/06/13/usando-dataset-tipado-com-asp-net/

Prevenindo SQL Injection em ASP.NET:
http://programandodotnet.wordpress.com/2010/06/18/prevenindo-sql-injection-em-asp-net/

Trabalhando com Arquivos em C# (3 partes):
http://programandodotnet.wordpress.com/tag/arquivos/

Manipulando Dados no Web.Config:
http://programandodotnet.wordpress.com/2010/07/11/manipulando-o-web-config-%e2%80%93-armazenando-e-recuperando-dados/

Trabalhando com Cache:
http://programandodotnet.wordpress.com/2010/07/16/trabalhando-com-cache/

Criando um Windows Service:
http://programandodotnet.wordpress.com/2010/07/18/criando-um-windows-service/

Aplicação ASP.NET com Imagens no GridView no lugar de valores:
http://programandodotnet.wordpress.com/2010/07/22/aplicacao-asp-net-com-imagens-no-gridview-no-lugar-de-valores/

Agrupamento no GridView usando TemplateField em ASP.NET:
http://programandodotnet.wordpress.com/2010/07/27/agrupamento-no-gridview-com-templatefield/

Customizando o DataList:
http://programandodotnet.wordpress.com/2010/07/29/customizando-o-datalist/

Filtrando Dados com DataView:
http://programandodotnet.wordpress.com/2010/07/30/filtrando-dados-com-dataview/

Gerando um Executável a partir de uma aplicação em Windows Form:
http://programandodotnet.wordpress.com/2010/08/02/gerando-um-executavel-a-partir-de-um-windows-forms/

Controles ASP.NET – Menu Standard – Parte 1 (em andamento):
http://programandodotnet.wordpress.com/2010/08/09/controles-asp-net-%e2%80%93-menu-standard-%e2%80%93-parte-1/

Controles ASP.NET – Menu Standard – Parte 2 (em andamento):
http://programandodotnet.wordpress.com/2010/08/14/controles-asp-net-%e2%80%93-menu-standard-%e2%80%93-parte-2/

Controle de Login para Windows Forms:
http://www.codeproject.com/KB/miscctrl/logincontrol.aspx

Como criar uma tela de login numa aplicação Windows Forms?
http://www.marcosdellantonio.net/2007/05/30/net-como-criar-uma-tela-de-login-numa-aplicacao-windows-forms/

Troca de dados entre formulários:
http://www.codeproject.com/KB/cs/pass_data_between_forms.aspx

Trabalhando com o controle TreeView em C#:
http://www.c-sharpcorner.com/uploadfile/scottlysle/treeviewbasics04152007195731pm/treeviewbasics.aspx

Brincando com List<T> – como evitar adição de conteúdo duplicado
http://www.50minutos.com.br/blog/post/Brincando-com-List-generico-como-evitar-adicao-de-conteudo-duplicado.aspx

Brincando com List<T> – como fazer uma ordenação customizada
http://www.50minutos.com.br/blog/post/Brincando-com-List-como-fazer-uma-ordenacao-customizada.aspx

Outlook 2007: Como salvar anexos dos e-mails usando C#
http://www.50minutos.com.br/blog/post/Outlook-2007-Como-salvar-anexos-dos-e-mails-usando-C.aspx

Visual Studio 2010: o que há de novo
http://www.50minutos.com.br/blog/post/Visual-Studio-2010-o-que-ha-de-novo.aspx

Salvar anexos do Outlook 2007 usando C#
http://www.50minutos.com.br/blog/post/Salvar-anexos-do-Outlook-2007-usando-C.aspx

Enviar e-mails pelo Outlook 2007 usando C# e WPF
http://www.50minutos.com.br/blog/post/Enviar-e-mails-pelo-Outlook-2007-usando-C-e-WPF.aspx

Como listar as instâncias de SQL Server da rede
http://www.50minutos.com.br/blog/post/Como-listar-as-instancias-de-SQL-Server-da-rede.aspx

C# 3.0, C# 4.0 e VB.Net 10 – Especificação das linguagens para download
http://www.50minutos.com.br/blog/post/Csharp-3-Csharp-4-e-VBNet-10-Especificacao-das-linguagens-para-download.aspx

O que há de novo no C# 4 e no Visual Basic 10 – Slide da apresentação e demos
http://www.50minutos.com.br/blog/post/O-que-ha-de-novo-no-C-4-e-no-Visual-Basic-10-Slide-da-apresentacao-e-demos.aspx

Dica rápida de c#: como obter o nome da pasta onde o aplicativo executa
http://www.50minutos.com.br/blog/post/Dica-rapida-de-c-como-obter-o-nome-da-pasta-onde-o-aplicativo-executa.aspx

Como gravar as imagens de uma página HTML usando C#
http://www.50minutos.com.br/blog/post/Como-gravar-as-imagens-de-uma-pagina-HTML-usando-C.aspx

Como escrever um texto numa imagem usando C#
http://www.50minutos.com.br/blog/post/Como-escrever-um-texto-numa-imagem-usando-C.aspx

Exemplos de C# 4 – 001 – Literais
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-001-Literais.aspx

Exemplos de C# 4 – 002 – Built-In Types CLS Compliant
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-002-Built-In-Types-CLS-Compliant.aspx

Exemplos de C# 4 – 003 – Built-In Types Not CLS Compliant
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-003-Built-In-Types-Not-CLS-Compliant.aspx

Exemplos de C# 4 – 004 – Variáveis e Constantes
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-004-Variaveis-e-Constantes.aspx

Exemplos de C# 4 – 005 – Operadores
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-005-Operadores.aspx

Exemplos de C# 4 – 006 – Enum
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-006-Enum.aspx

Exemplos de C# 4 – 007 – Var
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-007-Var.aspx

Exemplos de C# 4 – 008 – if
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-008-if.aspx

Exemplos de C# 4 – 009 – switch
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-009-switch.aspx

Exemplos de C# 4 – 010 – foreach
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-010-foreach.aspx

Exemplos de C# 4 – 011 – break
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-011-break.aspx

Exemplos de C# 4 – 012 – continue
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-012-continue.aspx

Exemplos de C# 4 – 013 – goto
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-013-goto.aspx

Exemplos de C# 4 – 014 – Field modifiers (modificadores de campo)
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-014-Field-modifiers-(modificadores-de-campo).aspx

Exemplos de C# 4 – 015 – Constructor (construtor)
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-015-Constructor-(construtor).aspx

Exemplos de C# 4 – 016 – Métodos
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-016-Metodos.aspx

Exemplos de C# 4 – 017 – Property (propriedade)
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-017-Property-(propriedade).aspx

Exemplos de C# 4 – 018 – Encapsulamento
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-018-Encapsulamento.aspx

O que está escrito aqui? (brinquedinho em C# 4)
http://www.50minutos.com.br/blog/post/O-que-esta-escrito-aqui-brinquedinho-em-Csharp.aspx

Exemplos de C# 4 – 019 – Interfaces
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-019-Interfaces.aspx

Exemplos de C# 4 – 020 – Polimorfismo
http://www.50minutos.com.br/blog/post/Exemplos-de-Csharp-4-020-Polimorfismo.aspx

O que está escrito aqui? (solução oficial em C# 4)
http://www.50minutos.com.br/blog/post/O-que-esta-escrito-aqui-(solucao-oficial-em-Csharp-4).aspx

Calcular números primos usando C# 4
http://www.50minutos.com.br/blog/post/Calcular-numeros-primos-usando-Csharp-4.aspx

Como associar itens de um Enum a um ComboBox usando C#
http://www.50minutos.com.br/blog/post/Como-associar-itens-de-um-Enum-a-um-ComboBox-usando-C.aspx

Como associar itens de um Hashtable a um ComboBox usando C#
http://www.50minutos.com.br/blog/post/Como-associar-itens-de-um-Hashtable-a-um-ComboBox-usando-C.aspx

O que está escrito aqui? (outro brinquedinho em C# 4.0)
http://www.50minutos.com.br/blog/post/O-que-esta-escrito-aqui-(outro-brinquedinho-em-Csharp).aspx

O que é isso?
http://www.50minutos.com.br/blog/post/O-que-e-isso.aspx

Um pattern em C# por dia: Decorator – pattern estrutural
http://www.50minutos.com.br/blog/post/Um-pattern-em-C-por-dia-Decorator-pattern-estrutural.aspx

Um pattern em C# por dia: Bridge – pattern estrutural
http://www.50minutos.com.br/blog/post/Um-pattern-em-C-por-dia-Bridge-pattern-estrutural.aspx

Livro online: Parallel Programming with .NET (C#, VB.Net e F#)
http://www.50minutos.com.br/blog/post/Livro-online-Parallel-Programming-with-NET-(C-VBNet-e-F).aspx

Um pattern em C# por dia: Composite – pattern estrutural
http://www.50minutos.com.br/blog/post/Um-pattern-em-C-por-dia-Composite-pattern-estrutural.aspx

Criptografia através de Hash.
http://www.edgaresteves.com.br/DetalharArtigos.aspx?id=8

QueryString com Criptografia e Descriptografia
http://www.edgaresteves.com.br/DetalharArtigos.aspx?id=5

Grafico Pizza 360º com C#
http://www.edgaresteves.com.br/DetalharArtigos.aspx?id=12

Tipos de Dados de Sistema (Variaveis)
http://www.edgaresteves.com.br/DetalharArtigos.aspx?id=22

HTML Acentuações
http://www.edgaresteves.com.br/DetalharArtigos.aspx?id=3

Desabilitar o Botão Fechar (Windows Form)
http://edgaresteves.com.br/DetalharArtigos.aspx?id=26

Replace com C#
http://edgaresteves.com.br/DetalharArtigos.aspx?id=27

Compreendendo o Tipo System.String
http://edgaresteves.com.br/DetalharArtigos.aspx?id=29

Caracteres de Escape (String)
http://edgaresteves.com.br/DetalharArtigos.aspx?id=30

O Tipo System.Text.StringBuilder
http://edgaresteves.com.br/DetalharArtigos.aspx?id=31

Scheduled – Agenda de Tarefas V 1.0
http://edgaresteves.com.br/DetalharArtigos.aspx?id=32

Minimizar Programa junto ao Relogio (colocar icon e minimizar)
http://edgaresteves.com.br/DetalharArtigos.aspx?id=33

3 Camadas efetuando conexão com o Banco de Dados
http://edgaresteves.com.br/DetalharArtigos.aspx?id=34

Controle DropDownList (Banco de Dados e Manual)
http://edgaresteves.com.br/DetalharArtigos.aspx?id=35

Criando controles dinamicos com C#
http://edgaresteves.com.br/DetalharArtigos.aspx?id=36

Conectando ao banco de dados MySQL
http://edgaresteves.com.br/DetalharArtigos.aspx?id=37

Populando um GridView em C#
http://edgaresteves.com.br/DetalharArtigos.aspx?id=38

Laços e Repetições com C#
http://edgaresteves.com.br/DetalharArtigos.aspx?id=39

Monitorar o Desempenho do Servidor
http://edgaresteves.com.br/DetalharArtigos.aspx?id=40

Consultar DNS(IP) com C#
http://edgaresteves.com.br/DetalharArtigos.aspx?id=41

Utilizando IF em sua programação
http://edgaresteves.com.br/DetalharArtigos.aspx?id=47

Utilizando SWITCH em sua programação
http://edgaresteves.com.br/DetalharArtigos.aspx?id=48

Validando com Expressão Regular (E-mail e URL)
http://edgaresteves.com.br/DetalharArtigos.aspx?id=49

Sistema Simples de uma Biblioteca (3 partes):
http://programandodotnet.wordpress.com/tag/biblioteca/

Controles ASP.NET – Menu Standard – Parte 3:
http://programandodotnet.wordpress.com/2010/09/24/controles-asp-net-%E2%80%93-menu-standard-%E2%80%93-parte-3/

Conceitos e Exemplo Prático: QueryString:
http://programandodotnet.wordpress.com/2010/09/27/conceitos-e-exemplo-pratico-querystring/

Conceitos e Exemplo Prático: Breakpoint :
http://programandodotnet.wordpress.com/2010/09/27/conceitos-e-exemplo-pratico-breakpoint/

Conceitos e Sintaxe: ViewState – Parte 1
http://programandodotnet.wordpress.com/2010/09/27/conceitos-e-sintaxe-viewstate-%e2%80%93-parte-1/

Exemplo Prático: Usando ViewState – Parte 2
http://programandodotnet.wordpress.com/2010/09/27/exemplo-pratico-usando-viewstate-%e2%80%93-parte-2/

Conceitos e Dicas: Usando Session – Parte 1
http://programandodotnet.wordpress.com/2010/10/02/conceitos-e-dicas-usando-session-%e2%80%93-parte-1/

Exemplo Prático: Usando Session – Parte 2
http://programandodotnet.wordpress.com/2010/10/02/exemplo-pratico-usando-session-%e2%80%93-parte-2/

Conceitos e Criação do Projeto: Trabalhando com Cookies – Parte 1
http://programandodotnet.wordpress.com/2010/10/05/conceitos-e-criacao-do-projeto-trabalhando-com-cookies-%e2%80%93-parte-1/

Codificação Final: Trabalhando com Cookies – Parte 2
http://programandodotnet.wordpress.com/2010/10/05/codificacao-final-trabalhando-com-cookies-%e2%80%93-parte-2/

Conceitos e Sintaxe: Controles de Login do ASP.NET – Parte 1
http://programandodotnet.wordpress.com/2010/10/09/conceitos-e-sintaxe-controles-de-login-do-asp-net-%e2%80%93-parte-1/

Exemplo Prático: Controles de Login do ASP.NET – Parte 2
http://programandodotnet.wordpress.com/2010/10/09/exemplo-pratico-controles-de-login-do-asp-net-%e2%80%93-parte-2/

Alterando Senhas e Criando Usuários: Controles de Login do ASP.NET – Parte 3
http://programandodotnet.wordpress.com/2010/10/09/alterando-senhas-e-criando-usuarios-controles-de-login-do-asp-net-%e2%80%93-parte-3/

SQL Server 2008 – Parte 9 – Conceitos de MER e DER, Regras e Tipos de Relacionamentos
http://programandodotnet.wordpress.com/2010/11/06/sql-server-2008-%e2%80%93-parte-9-%e2%80%93-conceitos-de-mer-e-der-regras-e-tipos-de-relacionamentos/

Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 13
http://programandodotnet.wordpress.com/2010/11/10/cadastro-de-um-consultorio-em-windows-forms-com-c-e-sql-server-%e2%80%93-parte-13/

Adiconando Conector MySQL no Visual Studio 2010
http://dotnettime.wordpress.com/2010/05/08/adiconando-conector-mysql-no-visual-studio-2010/

ASP.NET MVC Resolvendo problema de Refencia Circular
http://dotnettime.wordpress.com/2010/05/09/resolvendo-problema-de-refencia-circular/

ASP.NET MVC Model Binding List
http://dotnettime.wordpress.com/2010/12/11/asp-net-mvc-model-binding-list/

Sistema de Gestão Pública Municipal E-cidade

O e-cidade destina-se a informatizar a gestão dos Municípios Brasileiros de forma integrada. Esta informatização contempla a integração entre os entes municipais: Prefeitura Municipal, Câmara Municipal, Autarquias, Fundações e outros.

A economia de recursos é somente uma das vantagens na adoção do e-cidade, além da liberdade de escolha dos fornecedores e garantia de continuidade do sistema, uma vez apoiado pelo Ministério do Planejamento.

 

NOVA VERSÃO COMPLETA DO E-CIDADE:

Pacote(Atualização) e-cidade ( Versão 2.3.29 para 2.3.30 ):

Portal da Transparência (Versão v010208):Portal do Aluno (v010103) – Completo
E-CIDADEONLINE2 (NFS-e)NOVA VERSÃO V010301 – COMPLETA

NOVA VERSÃO V010301 – ATUALIZAÇÃO

VERSÕES ANTERIORES
Versões Anteriores:

Pacote(Atualização) e-cidade ( Versão 2.3.28 para 2.3.29 ):

Pacote(Atualização) e-cidade ( Versão 2.3.27 para 2.3.28 ):

Pacote (Completo) e-cidade (Versão 2.3.28):  

Pacote (Completo) e-cidade (Versão 2.3.27):

Pacote(Atualização) e-cidade ( Versão 2.3.26 para 2.3.27 ):

Pacote (Completo) e-cidade (Versão 2.3.26):

Pacote(Atualização) e-cidade ( Versão 2.3.25 para 2.3.26 ):

Pacote (Completo) e-cidade (Versão 2.3.25):

Pacote (Completo) e-cidade (Versão 2.3.24):

Pacote(Atualização) e-cidade ( Versão 2.3.24 para 2.3.25 ):Pacote(Atualização) e-cidade ( Versão 2.3.23 para 2.3.24 ):

Pacote (Completo) e-cidade (Versão 2.3.23):

Pacote(Atualização) e-cidade ( Versão 2.3.19 para 2.3.23 ):

Portal da Transparência (Versão v010206):

Ecidadeonline2 – NFS-e – Sistema de nota fiscal de serviço eletrônica (Versão v010101):

Pacote (Completo) e-cidade (Versão 2.3.19):Pacote(Atualização) e-cidade ( Versão 2.3.17 para 2.3.19 ):

Pacote de Migração da estrutura de senhas do e-cidade  ( Versão 2.3.17 para 2.3.19 ):

Manual para Migração da estrutura de senhas do e-cidade  ( Versão 2.3.17 para 2.3.19 ):

Pacote (Completo) e-cidade (Versão 2.3.17):

Pacote(Atualização) e-cidade ( Versão 2.3.14 para 2.3.17 ):Pacote (Atualização) e-cidade ( Versão 2.3.12 para 2.3.14 ):

Pacote (Atualização) e-cidade ( Versão 2.3.3 para 2.3.12 ):

Pacote (Atualização) e-cidade ( Versão 2.2.60 para 2.3.3 ):

Publiq-BI

Portal Da Transparência

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) – Parte 1:

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) – Parte 2:

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) – Parte 3:

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) – Parte 4:

Usuário da VM: root

Senha: dbseller

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) + Integrações – Parte 1

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) + Integrações – Parte 2

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) + Integrações – Parte 3

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) + Integrações – Parte 4

Máquina Virtual VirtualBox Pacote (Completo) e-cidade (Versão 2.3.3) + Integrações – Parte 5

Usuário da VM: root

Senha: dbsellerApresentação e descrição resumida do e-cidade:  clique aqui

Abrangência do e-cidade:

Financeira, Tributária, Patrimonial, Recursos Humanos, Saúde, Educação, PubliQ-BI, Cidadão

Informações Técnicas

 

ambiente

Perguntas Freqüentes (FAQs)

Nome Grupo
Conversão dos dados e-cidade
Instalação e-cidade

 

Fóruns de Discussão

 

Casos de Sucesso

Fórum para relatar caso de sucesso no uso da solução

Estatística dos Casos de Sucesso

Versão 1 – Apenas dados confirmados com o município

Versão 2 – Todos os dados apurados na comunidade porém não confirmados com o município

 

Weblogger

e-cidade Adicionar entrada Visualização Completa

 

 

API de Compras Governamentais

Dados Abertos – Compras Governamentais

Dados Abertos do Sistema Integrado de Administração e Serviços Gerais – SIASG.

O SIASG é o sistema onde se operacionaliza as compras do Governo Federal. Essa operacionalização se dá em diversos módulos, contemplando o catálogo de materiais e serviços (CATMAT / CATSER), o cadastramento e divulgação da licitação (SIDEC, Divulgação), as intenções de registros de preços (IRP), o cadastramento dos fornecedores (SICAF), a realização das licitações (Compras governamentais, Sessão Pública, RDC), o resultado das licitações (SISPP, SISRP), os empenhos de pagamentos (SISME) e o registro e gestão dos contratos (SICON).

Por que Dados Abertos de Compras Governamentais?

A prestação de dados como um serviço governamental traz vantagens para toda a sociedade, incluindo o próprio governo. O Ministério do Planejamento, Orçamento e Gestão está economizando recursos através da publicação dessas informações na Internet.

A disponibilização dos dados das Compras Governamentais é um compromisso firmado pelo governo brasileiro na Parceria para Governo Aberto (Open Government Partnership – OGP do inglês). O governo está comprometido em promover a transparência dos gastos públicos, fornecer informações de valor agregado à sociedade e promover a pesquisa e inovação tecnológica através da implementação da política brasileira de dados abertos. Essa API está sendo desenvolvida como parte da Infraestrutura Nacional de Dados Abertos – INDA.

Quais dados estão disponíveis?

O SIASG – Sistema Integrado de Administração e Serviços Gerais mantém registro das compras e contratações firmadas pelo poder executivo da Administração Pública Federal. Abaixo uma lista dos dados disponíveis por essa API:

  1. Dados dos fornecedores
  2. Dados do catálogo de materiais
  3. Dados do catálogo de serviços
  4. Dados de licitações
  5. Dados dos contratos
  6. Dados de Compras sem Licitação

Modelo de dados

modelo_dados

Breve Explicação sobre a operacionalização das Compras Governamentais do Governo Federal

O SIASG – Sistema Integrado de Administração de Serviços Gerais é o sistema onde se operacionaliza as compras do Governo Federal. Essa operacionalização se dá em diversos módulos, contemplando o catálogo de materiais e serviços (CATMAT / CATSER), o cadastramento e divulgação da licitação (SIDEC, Divulgação), as intenções de registros de preços (IRP), o cadastramento dos fornecedores (SICAF), a realização das licitações (Comprasnet, Sessão Pública, RDC), o resultado das licitações (SISPP, SISRP), os empenhos de pagamentos (SISME) e o registro e gestão dos contratos (SICON).

Como utilizar a API

O acesso aos dados é feito através de URLs, recursos web nos formatos XML, JSON e CSV. Além desses formatos, também é disponibilizada uma representação em HTML, que possibilita uma visualização através do navegador e melhora a classificação desses conteúdos nas ferramentas de busca. Em cada consulta é possível especificar uma série de parâmetros de filtro, que devem compor a URL. Esta API segue os princípios REST e implementa a característica HATEOAS desta arquitetura. Você (ser humano ou máquina) pode navegar através de todos os recursos (fornecedores, serviços, materiais, licitações, contratos, etc.) apenas utilizando os links disponíveis. Para acessar os dados da API é necessário conhecer o endereço ou URL:

http://compras.dados.gov.br/{modulo}/v1/{metodo}.{formato}?{parametro1=valor1}&{parametro2=valor2}&{parametroN=valorN}

O método indica qual informação do módulo selecionado você quer e o “formato” define o formato da resposta, em HTML, XML, JSON ou CSV. Consulte nossa documentação para saber quais são os métodos disponíveis. Na documentação, os campos estão listados em ordem alfabética para facilitar a consulta. Os parâmetros campo e valor são utilizados para filtrar os registros retornados pelos métodos. Alguns exemplos de consultas:

  1. Esta consulta busca todos os órgãos que contém no nome o texto “turismo”:http://compras.dados.gov.br/licitacoes/v1/orgaos.html?nome=turismo
  2. Esta consulta exibe os dados específicos do Ministério do Turismo:http://compras.dados.gov.br/licitacoes/doc/orgao/54000
  3. Esta consulta exibe todos os serviços registrados no Catálogo de Serviços que contenha “construção” na da descrição do serviço:http://compras.dados.gov.br/servicos/v1/servicos.html?descricao=construcao
  4. Esta consulta exibe todos os dados da licitação 180/2012 que envolve o Senado Federal:http://compras.dados.gov.br/licitacoes/doc/licitacao/02000105001802012.html
  5. Esta consulta busca todos os fornecedores do Distrito Federal:http://compras.dados.gov.br/fornecedores/v1/fornecedores.xml?uf=DF

Todas as consultas acima podem retornar dados nos formatos JSON, XML e CSV. Basta trocar o trecho “html” pelo respectivo formato.

Licença de Uso dos Dados

Esses dados são disponibilizados sob a licença ODBL (Open DataBase License). Todos os direitos dos conteúdos individuais estão licenciados sob DBCL (Database Contents License).

Atualidade

Os dados atualmente disponibilizados são referentes a janeiro/2015. O Ministério do Planejamento está desenvolvendo um módulo de integração que tornará automática a atualização periódica dos dados.

Atenção!

Essa é uma versão beta, a api está em estado de desenvolvimento e os métodos poderão sofrer alterações sem aviso. Tire dúvidas sobre o SIASG através do endereço http://www.comprasgovernamentais.gov.br/.

Fonte: http://compras.dados.gov.br/docs/home.html

O que é o Polymer?

image

Polymer é uma biblioteca que facilita a criação de Web Components, que são elementos HTML customizados, independentes e reutilizáveis.

Polímero torna simples a criação de componentes da Web, de forma declarativa.

Elementos personalizados podem alavancar recursos especiais de polímero para reduzir código clichê e torná-lo ainda mais fácil de construir elementos complexos e interativos:

Elementos cadastrar
Retornos de chamada de ciclo de vida
Observação propriedade
Modelo DOM local
Ligação de dados
Nesta seção, você pode fazer um tour rápido da biblioteca Polymer, sem instalar nada. Clique no Editar no Plunker botão para abrir qualquer uma das amostras em um sandbox interativo.

Consulte o guia do desenvolvedor para obter informações detalhadas sobre cada um desses recursos.

Registar um elemento
Para registrar um novo elemento, ligue para o Polymer função, que registra um novo elemento com o browser. Registrando um elemento associa um nome de tag com um protótipo, assim você pode adicionar propriedades e métodos para o seu elemento personalizado. O nome do elemento personalizado deve conter um traço (-) .

A função Polymer leva como argumento um objeto que define protótipo do seu elemento.

Fonte: https://www.polymer-project.org/1.0/docs/start/quick-tour.html

Publicado do WordPress para Android

Emissão e Controle de Boletos – Componente AcBr no Delphi

Neste pequeno tutorial, o programador  irá mostrar de forma bem simplificada, como utilizar-se do componente AcBrBoleto para realizar o controle de emissão de boletos bancários com base em uma tabela de contas a receber.

 

Tabela usada para armazenar as contas dos clientes (contas a receber)

 

CREATE SEQUENCE CONTAS_ID;

CREATE TABLE CONTAS (
    ID               INTEGER NOT NULL,
    NUMCONTA         VARCHAR(10),
    SERIE            CHAR(3),
    DATA_CONTA       DATE,
    DATA_VENC        DATE,
    VALOR_CONTA      DOUBLE PRECISION,
    VALOR_DESCONTO   DOUBLE PRECISION,
    VALOR_ACRESCIMO  DOUBLE PRECISION,
    JUROS            DOUBLE PRECISION,
    MULTA            DOUBLE PRECISION,
    DATA_QUIT        DATE,
    VALOR_QUITATO    DOUBLE PRECISION,
    CLIENTE          VARCHAR(50),
    ENDERECO         VARCHAR(50),
    NUMERO           VARCHAR(10),
    COMPLEMENTO      VARCHAR(10),
    BAIRRO           VARCHAR(20),
    CIDADE           VARCHAR(20),
    CEP              VARCHAR(10),
    UF               CHAR(2),
    CNPJ_CPF         VARCHAR(14),
    INSCRICAO_RG     VARCHAR(14),
    NOSSO_NUMERO     VARCHAR(30),
    BOLETO_IMPRESSO  CHAR(3)
);
 
ALTER TABLE CONTAS ADD CONSTRAINT PK_CONTAS PRIMARY KEY (ID);

Tabela usada para armazenar os dados bancários da empresa

CREATE SEQUENCE BANCO_ID;

CREATE TABLE BANCO (
    ID              INTEGER NOT NULL,
    NUMERO_BANCO    VARCHAR(5),
    DIGITO_NUMERO_BANCO  CHAR(1),
    NOME_BANCO      VARCHAR(50),
    NOME_AGENCIA    VARCHAR(50),
    NUMERO_AGENCIA  VARCHAR(10),
    DIGITO_AGENCIA  CHAR(1),
    NUMERO_CONTA    VARCHAR(20),
    DIGITO_CONTA    CHAR(1),
    CIADE_AGENCIA   VARCHAR(20),
    UF_AGENCIA      CHAR(2),
    NOSSO_NUMERO    INTEGER,
    CEDENTE              VARCHAR(50),
    COD_CEDENTE          VARCHAR(20)
);
 
ALTER TABLE BANCO ADD CONSTRAINT PK_BANCO PRIMARY KEY (ID);

Tabela usada para armazenar as configurações referentes a boletas

CREATE SEQUENCE CONFIG_ID;

CREATE TABLE CONFIG (
    ID             INTEGER NOT NULL,
    PATH_REMESSA   VARCHAR(100),
    PATH_RETORNO   VARCHAR(100),
    PATH_LOGOTIPO  VARCHAR(100),
    PATH_GERARPDF  VARCHAR(100),
    MENSAGEM       VARCHAR(250),
    DIAS_PROTESTO  INTEGER,
    ESPECIE        VARCHAR(3),
    MOEDA          VARCHAR(3),
    ACEITE         CHAR(3),
    CARTEIRA       CHAR(3),
    LOCAL_PAGTO    VARCHAR(100),
    INSTRUCAO_1    VARCHAR(100),
    INSTRUCAO_2    VARCHAR(100),
    CONT_REMESSA   INTEGER
);

ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);

Com estas tabelas criadas no banco de dados, vamos ao projeto.

Partindo do ponto de vista que esteja com o componente AcBrBoleto devidamente instalado, abra um novo projeto no Delphi e adicione os componentes de conexão com o banco de dados e respectivos componentes para acessar as tabelas criadas anteriormente. No meu caso aqui prefiro trabalhar com os componentes da paleta dbExpress e Data Acess, mas use o que lhe parecer melhor.

Adicione também um componente “ACBrBoleto1” e um “ACBrBoletoFCQuick1”. Observe que o AcBr disponibiliza algumas opções para imprimir o boleto. Dentre elas estão os componentes para Rave Report, Fortes Report e Quick Report. No caso estou usando o Quick Report, mas para usar qualquer um dos outros, basta ter o componente do tipo instalado e efetivar a ligação com o componente ACBrBoleto1.

Veja como ficou a tela que montei aqui:

boleto
Figura 1.

No botão direcionado para “Localizar” as contas adicione os seguintes códigos:

  // fecha os componentes de acesso a tabela
  CdsContas.Close;
  CdsContas.Params.Clear;
  SQLContas.Close;
  SQLContas.SQL.Clear;

  // passa a SQL para captura das contas em aberto e sem emissão do boleto
  SQLContas.SQL.Add('select * from contas');
  SQLContas.SQL.Add('where contas.data_conta >= :pDatai');
  SQLContas.SQL.Add('and contas.data_conta <= :pDataf');
  SQLContas.SQL.Add('and contas.boleto_impresso = '+QuotedStr('NAO'));
  SQLContas.SQL.Add('and contas.data_quit is null');

  // passa os paramentos de consulta para os componentes
  CdsContas.FetchParams;
  CdsContas.Params.ParamByName('pDatai').AsDate := DataInicio.Date;
  CdsContas.Params.ParamByName('pDataf').AsDate := DataFim.Date;
  CdsContas.Open;

  // se não foram encontrado dados na consulta informa ao usuário
  if CdsContas.IsEmpty then
  begin
    MessageDlg('Não foram encontradas contas no periodo informado!!!', mtInformation, [mbOK], 0);
    DataInicio.SetFocus;
  end
  else
    DBGrid1.SetFocus;

O botão indicado para adicionar conta, será usado para incluir os dados da conta selecionada numa lista do componente para posteriormente ser gerado o arquivo de remessa para o banco e a impressão dos boletos.

Segue os códigos do mesmo:

var Titulo : TACBrTitulo;
begin
  if CdsContasNOSSO_NUMERO.IsNull then
  begin
    Inc(xNossoNumero);
    Titulo := ACBrBoleto1.CriarTituloNaLista;
    with Titulo do
    begin
      Vencimento        := CdsContasDATA_VENC.AsDateTime;
      DataDocumento     := CdsContasDATA_CONTA.AsDateTime;
      NumeroDocumento   := CdsContasNUMCONTA.AsString;
      EspecieDoc        := CdsConfigESPECIE.AsString;
      if CdsConfigACEITE.AsString = 'SIM' then
         Aceite := atSim
      else
         Aceite := atNao;
      DataProcessamento := Now;
      NossoNumero       := IntToStrZero(xNossoNumero,10);
      Carteira          := CdsConfigCARTEIRA.AsString;
      ValorDocumento    := CdsContasVALOR_CONTA.AsFloat;
      Sacado.NomeSacado := CdsContasCLIENTE.AsString;
      Sacado.CNPJCPF    := CdsContasCNPJ_CPF.AsString;
      Sacado.Logradouro := CdsContasENDERECO.AsString;
      Sacado.Numero     := CdsContasNUMERO.AsString;
      Sacado.Bairro     := CdsContasBAIRRO.AsString;
      Sacado.Cidade     := CdsContasCIDADE.AsString;
      Sacado.UF         := CdsContasUF.AsString;
      Sacado.CEP        := CdsContasCEP.AsString;
      ValorAbatimento   := 0;
      LocalPagamento    := CdsConfigLOCAL_PAGTO.AsString;
      ValorMoraJuros    := 0;
      ValorDesconto     := 0;
      ValorAbatimento   := 0;
      DataMoraJuros     := 0;
      DataDesconto      := 0;
      DataAbatimento    := 0;
      DataProtesto      := CdsContasDATA_VENC.AsDateTime + CdsConfigDIAS_PROTESTO.AsInteger;
      PercentualMulta   := 0;
      Mensagem.Text     := CdsConfigMENSAGEM.AsString;
      OcorrenciaOriginal.Tipo := toRemessaBaixar;
      Instrucao1        := padL(trim(CdsConfigINSTRUCAO_1.AsString),2,'0');
      Instrucao2        := padL(trim(CdsConfigINSTRUCAO_2.AsString),2,'0');
      Parcela           := 1;
    end;
    // grava o nosso numero na conta
    SQLAux.Close;
    SQLAux.SQL.Clear;
    SQLAux.SQL.Add('update contas set contas.nosso_numero = :pNossoNum');
    SQLAux.SQL.Add('where contas.id = :pIDConta');
    SQLAux.Params.ParamByName('pNossoNum').AsInteger := xNossoNumero;
    SQLAux.Params.ParamByName('pIDCOnta').AsInteger := CdsContasID.AsInteger;
    SQLAux.ExecSQL(False);
    // Atualiza a consulta
    BtnLocalizarClick(Sender);
  end;

Outra rotina importante é a de configuração do componente com os dados necessários. Para isso vamos adicionar no evento OnClick do Combo usado para selecionar o banco em uso para o qual serão emitidos os boletos e adicionar os seguintes códigos:

  xNossoNumero := CdsBancosNOSSO_NUMERO.AsInteger;
  ConfiguraComponenteAcBr;

Segue os códigos da procedure ConfiguraComponenteAcBr:

procedure TForm1.ConfiguraComponenteAcBr;
begin
  if not CdsConfig.IsEmpty then
  begin
    ACBrBoleto1.ACBrBoletoFC.DirLogo  := CdsConfigPATH_LOGOTIPO.AsString;
    ACBrBoleto1.ACBrBoletoFC.Filtro   := fiNenhum;
    ACBrBoleto1.ACBrBoletoFC.LayOut   := lPadrao;
    ACBrBoleto1.Banco.Digito          := CdsBancosDIGITO_NUMERO_BANCO.AsInteger;
    ACBrBoleto1.Banco.Numero          := CdsBancosNUMERO_BANCO.AsInteger;
    ACBrBoleto1.Cedente.Nome          := CdsBancosCEDENTE.AsString;
    ACBrBoleto1.Cedente.CodigoCedente := CdsBancosCOD_CEDENTE.AsString;
    ACBrBoleto1.Cedente.Agencia       := CdsBancosNUMERO_AGENCIA.AsString;
    ACBrBoleto1.Cedente.AgenciaDigito := CdsBancosDIGITO_AGENCIA.AsString;
    ACBrBoleto1.Cedente.Conta         := CdsBancosNUMERO_CONTA.AsString;
    ACBrBoleto1.Cedente.ContaDigito   := CdsBancosDIGITO_CONTA.AsString;
    ACBrBoleto1.Cedente.UF            := CdsBancosUF_AGENCIA.AsString;
    ACBrBoleto1.NomeArqRemessa        := CdsConfigPATH_REMESSA.AsString+FormatDateTime('DDMMYYYYHHMMSS',Now)+'.TXT';;
  end;
end;

Agora finalizando o nosso projeto para emissão de boletos vamos apenas inserir os códigos referentes aos botões indicados para imprimir os boletos e gerar o arquivo de remessa e processar arquivo de retorno. Segue os códigos:

Imprimir Boletos

  try
    ACBrBoleto1.Imprimir;
  except
    MessageDlg('Erro ao imprimir os boletos. Verifique!',mtWarning,[mbOK],0);
  end;

Gerar Remessa

var ContadorRemessa : Integer;
begin
  try
    // captura o contador de remessa e gera a mesma
    ContadorRemessa := CdsConfigCONT_REMESSA.AsInteger;
    Inc(ContadorRemessa);
    ACBrBoleto1.GerarRemessa(ContadorRemessa);
    // Atualiza a nosso numero no cadastro do banco
    SQLAux.Close;
    SQLAux.SQL.Clear;
    SQLAux.SQL.Add('update banco set banco.nosso_numero = :pNossoNum');
    SQLAux.SQL.Add('where banco.id = :pID');
    SQLAux.Params.ParamByName('pNossoNum').AsInteger := xNossoNumero;
    SQLAux.Params.ParamByName('pID').AsInteger := CdsBancosID.AsInteger;
    SQLAux.ExecSQL(False);
    // Atualiza o contador de remesa na tabela de configuração
    SQLAux.Close;
    SQLAux.SQL.Clear;
    SQLAux.SQL.Add('update config set config.cont_remessa = :pContador');
    SQLAux.SQL.Add('where config.id = :pID');
    SQLAux.Params.ParamByName('pContador').AsInteger := ContadorRemessa;
    SQLAux.Params.ParamByName('pID').AsInteger := CdsConfigID.AsInteger;
    SQLAux.ExecSQL(False);
  except
    MessageDlg('Erro ao gerar arquivo de remessa. Verifique!',mtWarning,[mbOK],0);
  end;

Processar Retorno

var i : Integer;
begin
  if OpenDialog1.Execute then
  begin
    //Configurar banco
    ConfiguraComponenteAcBr;
    //
    ACBrBoleto1.NomeArqRetorno := OpenDialog1.FileName;
    ACBrBoleto1.LerRetorno;
    for i := 0 to ACBrBoleto1.ListadeBoletos.Count-1 do
    begin
      if ACBrBoleto1.ListadeBoletos.Objects[i].ValorRecebido > 0 then
      begin
        // Grava a Quitação da conta
        SQLAux.Close;
        SQLAux.SQL.Clear;
        SQLAux.SQL.Add('update contas set');
        SQLAux.SQL.Add('contas.data_quit = :pData,');
        SQLAux.SQL.Add('contas.valor_quitato = :pValor');
        SQLAux.SQL.Add('where contas.nosso_numero = :pNossoNum');
        SQLAux.Params.ParamByName('pData').AsDate        := ACBrBoleto1.ListadeBoletos.Objects[i].DataBaixa;
        SQLAux.Params.ParamByName('pValor').AsFloat      := ACBrBoleto1.ListadeBoletos.Objects[i].ValorRecebido;
        SQLAux.Params.ParamByName('pNossoNum').AsInteger := StrToInt(ACBrBoleto1.ListadeBoletos.Objects[i].NossoNumero);
        SQLAux.ExecSQL(False);
      end;
    end;
  end;

Espero que tenham gostado. Até a próxima!

Programador formado em 1995, pela ETEIT – Escola técnica da UNIVALE. Atualmente trabalhando com a plataforma Delphi. Tem se dedicado nos últimos anos, ao desenvolvimento de aplicações PAF-ECF, SPED fiscal e NFe.

Links:

http://www.projetoacbr.com.br/forum/index.php?/files/file/7-acbrinstall-for/

http://www.projetoacbr.com.br/forum/index.php?/topic/675-problema-ao-tentar-instalar-o-acbrboletofcquickfr/

http://www.projetoacbr.com.br/forum/index.php?/topic/17495-d%C3%BAvidas-referentes-a-migra%C3%A7%C3%A3o-para-o-delphi-xe7/page-2

http://www.projetoacbr.com.br/forum/index.php?/files/file/7-acbrinstall-for/?st=10#commentsStart

http://acbr.sourceforge.net/drupal/

Comentários que podem ser úteis:

 

Jose Luiz De Medeiros
Boa tarde,

Goldinho como sempre seus artigos são 100%, me dá uma dica o meu acbr não contem o componente de impressão para o Rave, como uso o delphi xe é não tenho instalado o quick report, pensei em usar o Rave. Nem na pasta que baixei possui o pacote para rave.

Poderia me ajudar?

Grato:
Jose Luiz

[há +1 ano] – Responder
[autor] Luis Carlos Godinho
Olá!Tente usar com o fortes report. Este tem suporte ao delphi xe e tem o componente acbr.
http://fortesreport.com.br/?page_id=25Abs.!

[há +1 ano] – Responder
Alberto Damazio Dos Reis

Realmente, muito bom! Obrigado.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Fico feliz que tenha gostado.Abs.!
[há +1 ano] – Responder
Sidnei M. De Azevedo

Assim ficou mais fácil compreender a emissão do ACBR Boletos,
Valeu!!!!!
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Eu cheguei a pensar 2 vezes pensando que o artigo não tinha ficado bom, rzrzrzr, acho que me enganei.Abs.!

[há +1 ano] – Responder
Luis Carlos Carnaroli

posta os fontes ai.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Os códigos estão todos embutidos no artigo, o restante que não esta neste é gerado pelo proprio delphi. Mas vou ver esta possibilidade.Abs.!

[há +1 ano] – Responder
Sidnei M. De Azevedo

Godinho, existe uma vareavel xNossoNumero que recebe o nosso numero da conta, de que tipo é ela?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Ola!E do tipo Integer.Abs.!

[há +1 ano] – Responder
Genilson S Soares

Já havia tentado implementar em meu sistema a emissão de boletos, mas tive muitos problemas. Agora com este tutorial a coisa está muito mais clara. Agora vou implementar. Parabéns e que Deus continue te abençoando e lhe concedendo sabedoria para assim ajudar ao próximo.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Fico feliz que tenha gostado. Que Deus lhe abençoe também.Abs.!

[há +1 ano] – Responder
Marcos Roberto Da Cruz

ola vc teria o codigo feito no delphi poderia me enviar? se precisa me fala o valor falecom@dreamsoftware.info
[há +1 ano] – Responder
Wesley Yamazack

Olá Marcos , entramos em contato com o autor para que o mesmo possa te ajudar, peço que aguarde para que o mesmo possa lhe auxiliar.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Os códigos do artigo já são em delphi 7, e todos os códigos do aplicativo estão aí. Basta montar a tela e copiar e colar os códigos.Abs.!

[há +1 ano] – Responder
Elço N Alves

Boa noite,Muito bom esse seu artigo, me dá uma dica, o meu acbr eu instalei componente boleto quick report, mas não aparece na paleta.Poderia me ajudar?

Desde já um grande abraço e sucesso,
Elço N Alves – RJ

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Qual versão do delphi esta usando? Tente remover e instalar novamente. Pode ter sido algum problema na instalação. É complicado ter uma razão para o ocorrido.Abs.!

[há +1 ano] – Responder
Elço N Alves

– Estou usando o Delphi 7, já instalei, desinstalei…
mas não aparece na paleta…eu sei que as vezes é
complicado, mas como na área, sempre alguem que já
passou por algo parecido..
– Como tentei umas duas ou tres vezes e nada, li
o seu artigo, resolvi perguntar, caso alguem
tenha alguma dica, eu agradeço.Desde já,
Agradeço a atenção,
Abraços,
Elço N ALves – RJ
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Seu QuickReport esta instalado corretamente? Todas as vezes que instalei o AcBr nunca tive este problema, então estou sem base do do que possa ser o problema ai. Peço que publique a questão no forum. Lá terá maior visibilidade e derrepente alguem tenha passado por este problema para te auxiliar.Abs.!
[há +1 ano] – Responder
Aldy Salvino De Oliveira

Algumas linhas estão dando erros, são elas:Inc(xNossoNumero); // Seria global?
IntToStrZero(xNossoNumero,10); // Não localizei no código
padL(trim(CdsConfigINSTRUCAO_1.AsString),2,’0′); // padL tbm não localizei.Como faço para resolver este problema?

[há +1 ano] – Responder
Aldy Salvino De Oliveira

Esqueci de mencionar estou com o Delphi 2010.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá! o xNossoNumero é uma Global, basta criar ai. o IntToStrZero e padL são do AcBr e tem que adicionar a unit ACBrUtil para funcionar.Abs.!
[há +1 ano] – Responder
Aldy Salvino De Oliveira

O erros de compilação foram resolvidos com suas dicas, obrigado, porém agora ele fala que não têm nenhum ACBrBoletoFCQuick associado.Também não consegui estender a configuração do DBLookupCombo.Qual valor precisa aparecer nele?

Obrigado mais uma vez.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Tem que instalar o componente ACBrBoletoFCQuick e para isso precisada do QuickReport instalado no D2010. Quando ao combo, o mesmo é para listar os bancos cadastrados na tabela referente do banco de dados.Abs.!
[há +1 ano] – Responder
Aldy Salvino De Oliveira

Agora só informa que não há banco definido, já tentei de tudo… não sei mais o que fazer… Obrigado
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Neste caso ai eu também não tenho dica. Terá que rever os dados de conexões para descobrir o que esta errado.Abs.!
[há +1 ano] – Responder
Aldy Salvino De Oliveira

posso te mandar os fontes, com o bd, ou vc me enviar o seu?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Os codigos referentes estão todos embutidos no artigo, e infelismente eu não posso ficar analizando codigos aqui. Espero que entenda.Abs.!
[há +1 ano] – Responder
Aldy Salvino De Oliveira

me manda o banco de dados, ou posta o dados, acredito que são os valores de cada tabela que está errado. Obrigado.
[há +1 ano] – Responder
Aldy Salvino De Oliveira

consegui gerar o boleto, um dos problemas era que ele nunca passa desta linha no incluir contas.IF CdsContasNOSSO_NUMERO.IsNull THENtirei esta validação e passou.

O CdsContasNOSSO_NUMERO é para chegar sempre em branco neste ponto?

Obrigado.

[há +1 ano] – Responder
Wesley Yamazack

Olá Aldy, o objetivo do código é este mesmo, validar se o código que você esta tentando passar não esta em branco.IF CdsContasNOSSO_NUMERO.IsNull THEN = TRUE
Executa o que esta aqui em baixo;IF CdsContasNOSSO_NUMERO.IsNull THEN = FALSE
Não executa o que esta aqui em baixo;

Um abraço e bons códigos.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!O objetivo desta verificação é garantir que não será gerado novo boleto para uma conta que já foi gerada, ou seja, duplicar boleto para uma conta. Por isso verifica se o campo nosso_numero esta vazio ou nulo, pois quando é grado o boleto este campo é preenchido. Se remover esta verificação certamente terá duas boletas para a mesmo conta a receber, o que ira gerar um transtorno.Abs.!

[há +1 ano] – Responder
Aldy Salvino De Oliveira

obrigado, eu não estava entendendo muito bem a lógica da geração, mas já consegui resolver e adequar a minha necessidade, Muito obrigado.
[há +1 ano] – Responder
Aldy Salvino De Oliveira

sei que não faz parte do exemplo, mas o apenas o relatório gerado com o fortes report exporta HTML? o quick não faz isto? têm algum exemplo sobre esta geração?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Infelismente não tenho. Abs.!
[há +1 ano] – Responder
Fabio Matte

Cara que maravilha, tava aqui com alguns problemas para emissão de boletos em meu sistema, esse tutorial caiu com uma mão empurrando a roda. Serviu direitinho.Parabens, nenhuma dúvida.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

E o bom é que o coomponente é codigo aberto. No caso de precisar de novos modelos de boletos, pode criar a partir dos disponíveis.Abs.!
[há +1 ano] – Responder
Marcos Roberto Da Cruz

OLA NO SEU SISTEMA DEU CERTO USAR O RETORNO? COM ESSES COMPONENTES?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Eu não tenho um sistema em funcionamento. Para testar este retorno teria que ser em produção quando for homologar um boleto junto a um banco.Abs.!

[há +1 ano] – Responder
Valdemi Ramos

Luis Carlos,To precisando tratar retorno com esse componente. Você tem algum exemplo funcionando? Ou esse ultimo código ja me serve?Obrigado.

[há +1 ano] – Responder
Jeferson Araujo

olá… faz algum tempo que eu implementei o boleto no meu sistema e tinha dado certo, mas tive que retirar e agora que estou de férias quero terminar nessa parte, mas mudei para o delphi xe2 também nesse tempo e agora da erro de ACBrBase, ACBrBoleto, ACBrUtil, ACBrBoletoFCFR, já reinstalei o svn mas não resolveu, parece ser algo bobo que esqueci, poderia me ajudar?
[há +1 ano] – Responder
Wesley Yamazack

Olá Jeferson, entramos em contato com o autor para que ele possa te auxiliar, tudo bem ? Peço que aguarde um pouco até que o mesmo possa retornar o contato.Um abraço.
[há +1 ano] – Responder
Jeferson Araujo

ok Wesley obrigado!eu até abri o projeto no xe e ele tem o componente do ACBr (TACBrBoleto, etc), mas no xe2 não, parece que não está instalado, se for isso mesmo aguardo a resposta para saber oq bem ao certo devo instalar para que tenha o componente no xe2.Aguardo a resposta.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Se estiver com o as duas versões do delphi no mesmo windows não dá certo. O acbr funciona apenas em um dos 2. Pelo menos foi o que eu constatei a um tempo atras ao tentar instalar em 2 versões.Abs.!

[há +1 ano] – Responder
Jeferson Araujo

ok vou desinstalar o xe daqui então.. vou ver se der certo coloco o resultado.muito obrigado!
[há +1 ano] – Responder
Jeferson Araujo

soh uma dúvida… eu tenho que ir no delphi e ir em Component e depois Install Component.. e quais componentes que eu tenho q instalar?
[há +1 ano] – Responder
Jeferson Araujo

deu certo =) mas não sei se era porque tinha o XE no pc… pq eu desinstalei e continuou o erro, então eu removi a pasta acbr baixei td de novo e fiz passo 5 do leia-me, aí deu certo.mas agora ele da um erro ao gerar o pdf ou html do boleto:
Access violation at address 00408868 in module ‘Sistema_XE2.exe’. Read of address 00000048.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Este erro de access violation normalmente se dá por uso de algum recurso que não foi instanciado ou algo parecido. Mas é complicado saber ao certo o porque. Nos testes aqui não aconteceu o mesmo.Abs.!

[há +1 ano] – Responder
Jeferson Araujo

alguma dica para mim aqui conseguir resolver? que se não vou tentar fazer web daí…
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!A dica que tenho esta na resposta anterior. Se eu tivesse conseguido simular aqui tinha como dizer ao certo. Mas este erro pode ser “N’s” detalhes. O ideal é debugar o sistema e ver em qual comando exatamente esta dando o problema.Abs.!

[há +1 ano] – Responder
Jeferson Araujo

é nessa linha que está o erro:ACBrBoleto1.ACBrBoletoFC.NomeArquivo := ExtractFilePath(Application.ExeName)+’teste.pdf’;tanto no pdf quanto html.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Você adicionou o componente AcBrBoletoFC no projeto? Se sim, certifique-se do componente Fortes Report esta devidamente instalado.Abs.!
[há +1 ano] – Responder
Jeferson Araujo

eu tenho instalado aqui o fast report, e não tem o ACBrBoletoFC na minha paleta,
quando vou compilar para depois instalar instalar ele da erro em {$IMPLICITBUILD OFF}
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Neste artigo eu não coloquei opção para gerar o PDF, porém testanto num outro projeto aqui esta funcionando. A única coisa que faço em relação é passar a configuração conforme abaixo:ACBrBoleto1.ACBrBoletoFC.Filtro := fiPDF;Caso não dê certo eu não tenho identificar o que esta errado ai, pois como disse no meu teste aqui esta funcionando.

Abs.!

[há +1 ano] – Responder
Marcos Roberto Da Cruz

quando vou instalar da esse erro Libeay32.dll? pq
[há +1 ano] – Responder
Marcos Roberto Da Cruz

eu tenho como editar o boleto pra fazer sair 3 por folha?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

O AcBr tem codigo aberto, porde alterar o form de boleto.Abs.!
[há +1 ano] – Responder
Marcos Roberto Da Cruz

quando vou instalar da esse erro Libeay32.dll? pq e tb RLibWinD7vcl quando roda diz que ta faltando
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Na pasta DLLs->OpenSSL tem este arquivo. basta colocar no windows/system32.Abs.!
[há +1 ano] – Responder
Marcos Roberto Da Cruz

ja resolvi a questao da dll so que ta dando outro erro agora faltando o arquivo RLibWinD7vcl.. como que resolve isso?
[há +1 ano] – Responder
Marcos Roberto Da Cruz

oi vc sumiu pra fazermos a consultoria aparece la no msn. pra conversamos
[há +1 ano] – Responder
Marcos Roberto Da Cruz

agora ta dando outro erro quando vou instalar o fortesreport da DBRTL70.bpl que ta falando alguem conseguio instalar tudo cem problema?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Seguindo os passos do arquivo leiame.txt que vem junto com o compontente da certo.Abs.!

[há +1 ano] – Responder
Marcos Roberto Da Cruz

da esse erro quando copilo do boleto [DCC Error] ACBr_BoletoFC_Fortes.dpk(35): F2141 Bad file format: ‘c:\componentes\fortes\RLibWinD7vcl.dcp’
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Desculpe pela demora. Estava sem net. Pelo visto já descobriu o que era.Abs.!
[há +1 ano] – Responder
Antonio Paulo Da Silva.

Excelente artigo, parabéns. Meu grande, quando eu seleciono o arquivo, aparece a seguinte mensagem:
Arquivo não encontrado: \C:\RETORNO\RETORNO-104.RETJá tentei identificar de onde ele tira esse \C:Desde já agradeço…

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Esta informação é passada na rotina “ConfiguraComponenteAcBr”.Abs.!

[há +1 ano] – Responder
Marcos Roberto Da Cruz

ola, ta dando erro [DCC Error] RLMetaFile.pas(975): F2063 Could not compile used unit ‘RLMetaVCL’ quando vou instalar o fortesreport
[há +1 ano] – Responder
Wesley Yamazack

Olá Marcos, estamos tentando contato com o Luis para que ele possa te ajudar, peço que aguarde um pouco para que ele possa retornar os comentários.Obrigado pela compreensão e um abraço.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Não consigo simular este erro aqui pra te ajudar. Sugiro que post a questão no forum que certamente encontrará alguem que passou por este problema.Abs.!
[há +1 ano] – Responder
Marcos A S Morais

Moço de mais o artigo. parabens. MAS PERGUNTO:
qual valor eu coloco na propriedade DATAFIELD do DBLookupComboBox1?????
[há +1 ano] – Responder
Marcos A S Morais

Moço de mais o artigo. parabens. MAS PERGUNTO:
qual valor eu coloco na propriedade DATAFIELD do DBLookupComboBox1?????
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Este campo irá exibir o que estiver cadastrado na tabela de bancos cadastrados.Abs.!

[há +1 ano] – Responder
Victor Bianchi

Olá, bom artigo.
Estou com uma duvida, para que serve a propriedade DirLogo do AcBrBoletoFC é o caminho do boleto do Banco ou do Emissor (seria quem usaria o sistema).
Vlw.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Nos Arquivos do AcBr tem uma pasta com as imagens dos bancos que serão usadas na composição das boletas. Nesta propriedade indique o caminho destas imagens.Abs.!

[há +1 ano] – Responder
Victor Bianchi

Obrigado pela rápida resposta, você são d+.
Tenho uma outra duvida, sem querer abusar de sua paciencia, o AcBrTitulo tem uma propriedade OcorrenciaOriginal.Tipo com varias possibilidades como por exemplo toRemessaBaixar, para que serve esta propriedade e tem difireça se um tipo ou outro?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Eu nunca usei esta opção e não sei ao certo para que serve. mas use o Forum do site ou do AcBr que certamente terá a resposta apropriada lá.Abs.!

[há +1 ano] – Responder
Aldo Leonardo Silva

Olá Godinho, parabens pelo artigo, me tire uma duvida
Pelo o que entendi na rotina, o arquivo de remessa esta sendo gerado obrigatoriamente no momento em que se monta os boletos… Suponhando que meu cliente queira imprimir os boletos durante o dia, e depois gerar o arquivo de remessa no fim do dia, vc pode me como eu faria isso e se existe algum risco qualquer em fazer dessa forma?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Basta ir marcando as contas como boleto impresso e sem ser enviado. Crie os campos de controle na tabela. E ao fim do dia o usuário ira gerar a remessa apenas do que não foi enviado.Abs.!

[há +1 ano] – Responder
Fernando Ferreira Gomes Nascimento

Muito bom artigo, mas ele nao tem opcao de download do fonte ??
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Todos os codigos estão inseridos no artigo. Basta montar as telas conforme preferir e inserir os codigos nos botões indicados.Abs.!

[há +1 ano] – Responder
Daniel Simões De Almeida

Oi Luis Carlos Godinho,Parabéns pelos seus excelentes artigos sobre o Projeto ACBr…São de grande ajuda para a comunidade, e na divulgação de nosso projeto….

Muito obrigado…

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Obrigado! Fico feliz em ajudar.
[há +1 ano] – Responder
Wanderson

Ola tenho uma duvida gerei o campo nosso número de acordo com instruções do Banco, alterei a propriedade TamanhoMaximoNossoNum := 17, quando gero o boleto, passa sem erro, mas quando mando imprimir o boleto o campo nosso número sai com somente 12 números.
Não sei se preciso mudar alguma propriedade, ou alterar algum codigo para geração do Nosso número.Utilizo o relatório BoletoFR.fr3Existe alguma outra propriedade para mudar, sou novo na geração do boleto utilizando o componente
desculpe pelas perguntas leigas.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Verifique o formulário de impressão do AcBr para ver se tem alguma limitação.Abs.!

[há +1 ano] – Responder
Thiago Ruvieri Delalibera

Bom dia Godinho, estou com uma dúvida quanto ao campo nosso_numero da tabela de contas, este número deve ser gerado pelo aplicativo correto? ou seja para cada conta de cada cliente este número sera diferente correto? Só para confirmar pois fiquei confuso já que a tabela de configuração do boleto também tem um campo nosso_numero fornecido pelo banco e também ao processar o retorno para dar baixa nas contas pagas se o nosso_numero das contas fossem todos iguais o update não atualizaria a conta correspondente e sim todas, se puder me dar uma esclarecida nisso, agradeço muito. Obrigado!
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá! Sim o sistema deverá gerar este campo que se trata de uma sequência numérica conforme padrão adotado pelo banco.Abs.!
[há +1 ano] – Responder
Cesar Augusto

Bom dia Luis Carlos. Parabens pelo seu poste, foi de grande ajuda.
Notei que em sua descrição diz que está desenvolvendo NFE, tenho um sistema e tenho que desenvolver a PAF-ECF, SPED fiscal e NFe e precisso de ajuda. Peço que se possível me passe seu e-mail para que possamos negociar. Desde já obrigado.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!O e-mail está no site já. luis.c.godinho@hotmail.com.Abs.!

[há +1 ano] – Responder
Marcos A S Morais

não consigo visualizar o boleto, retorna este erro Barcode must be numeric, o que pode esta errado?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Revise a configuração do banco e certifique-se de estar fazendo a mesma antes de adicionar os títulos.Abs.!

[há +1 ano] – Responder
Charles Henrique

Luis Carlos Godinho, boa noite.Analisando sua aplicação, tem uma variável que não tenho conhecimento.
De que tipo são ?seria

padL – seria variável de texto.

Parabens pelo post,muito exclarecedo

Att

Charles Henrique

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!PadL é uma função e não uma variável. No Google encontra uma biblioteca com esta função. Mas segue abaixo o script:function Padl(s:string;n:integer):string; // Alinhamento pela esquerda
{alinha uma string à esquerda}
begin
Result:=Format(‘%-‘+IntToStr(n)+’.’+IntToStr(n)+’s’,[s]);
end;

Abs.!

[há +1 ano] – Responder
André Luis Rodrigues De Oliveira

Olá. Obrigado pela iniciativa. Tem sido muito útil. Mas estou com um problema. Não consigo gerar corretamente a remessa para o banco do Brasil. Gero o arquivo. O banco aceita o envio, porém quando pago o boleto não aparece os dados do título. CPF, Nome, nada. E então não consigo ler o retorno, pois fica sem dados. Tem alguma idéia do que pode estar acontecendo? Sabe se para este tipo de ação a carteira deve ser diferente?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Não sei se entendi, mas no meu caso no retorno do banco eu uso a informação de nosso numero juntamente com a parcela para identificar o titulo e fazer a quitação, e não os dados de CPF, etc…Abs.!

[há +1 ano] – Responder
Antonio Paulo Da Silva.

Após alguns ajustes no componente, ficou show de bola o tratamento de retorno dos bancos. Parabéns pelo ótimo artigo. Me deu um grande empurrão aqui no meu projeto. Abraço!
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Obrigado! Fico feliz e ter sido útil.
[há +1 ano] – Responder
Claudio Santos

Nota dez esse tutorial parabéns!
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Obrigado! Fico feliz e ter sido útil.
[há +1 ano] – Responder
Claudio Santos

Prezado eu tive problemas ao gerar o pdf com o quickreport, esta gerando um arquivo defeituoso com 542kb então mudei para o fortes a seguinte mensagem aparece sempre que mando gerar a boleta ou o pdf:Sistema não está de acordo com a versão do FortesReport
Versão atual 3.71BUtilizo o Delphi2010 e a ultima versão do ACBr baixada pelo svn.

Pode me ajudar?

Obrigado!

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá,
Aparentemente a versão do AcBr não esta atualizada ainda para a versão do Fortes que esta usando. tente ver com o suporte do acbr algo sobre o assunto.Abs.!
[há +1 ano] – Responder
Was Reitz

Olá Luis Carlos,Inicialmente agradeço a publicação que muito me orientou para a implementação de Boletos na minha aplicação.Me surgiu um problema e não consegui ir adiante, gero o boleto e quando vou gerar a remessa (c400) para o Banco do Brasil surgem dois problemas:
1- é colocado uma virgula (automaticamente) no separador entre logradouro e numero de logradouro.
2- é criada uma linha após as informações do cliente conforme abaixo:

01REMESSA01COBRANCA 02845000794899000000 ………………………….000001
70205481336000137028450007948992489256 ………………………….000002
5999000000000000000000 (esta linha supostamente a mais) 000003

Desde já agradeço a vossa ajuda.
Washington Luiz Reitz

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Esta montagem é feita pelo proprio componente AcBr. Eu não passei por este problema, mas neste caso sugiro fazer uma atualização do componente e caso não resolva, postar a dúvida no forum do AcBr para ver se alguem já passou por este problema.Abs.!

[há +1 ano] – Responder
Kássius Ribas Miranda

Olá Luis Carlos Godinho, estou precisando de uma grande dica sua, estou usando o componente acbrnfe1, e acompanhei todas as suas videos aulas sobre a emissão da nfe, mas ai tem uma tela para configurar host, port e senha, onde eu consigo estas informaçoes, ou q tenho q ter, pq eu ja tenho um certificado valido ja, eu estou desenvolvendo um sistema para cooperativa de Leite, desde ja agradeço sua atenção
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Basta configurar o certificado e a pasta de schemas que funciona.Abs.!

[há +1 ano] – Responder
Kássius Ribas Miranda

Luiz Carlos boa noite, onde eu acho um certificado para tar fazendo os testes no meu sistema, vc disponibilizou um mas não tem a senha e a serie, obrigado c puder me ajudar
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Pelo que sei não existe um certificado pra testes. Você tem que adquirir um e usar em ambiente de homologação.Abs.!
[há +1 ano] – Responder
Kássius Ribas Miranda

Luis so mais uma coisa que preciso saber, para meu sistema emitir a NFe, tenho que registrar meu sistema nos SEFAZ ou algum outro lugar, caso sim, o que vou precisar para fazer isso, te agradeço se puder me ajudar, sou programador em Delphi a uns 8 anos, mas nun tenho sistemas comerciais agora que estou entrando no ramo comercial por isso tantas duvidas, te agradeço pela atenção.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Eu estou muito focado apenas no PAF, mas até onde sei não tem que registrar sistema de emissão de NFe. Basta realizar os testes em ambiente de homologação mesmo, para certificar de estar tudo certo com calculos de imposto e classificações fiscais.Abs.!

[há +1 ano] – Responder
Adão Lucas

Boa Noite Luis Carlos Godinho, tudo bom, espero que sim, cara gostei muito deste teu artigo, tirou muitas dúvidas, mas não conseguir imprimir o boleto, quando clico no botão imprimir ele da um erro informando “Erro ao imprimir boleto! Verifique” e também da mesma forma quando clico em gerar remessa, cara sera que vc poderia mi ajudar. Obg.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá! Erro ao imprimir boleto é mensagem do sistema. Tem que debugar para ver o erro interno que esta ocorrendo. No mais já atualizou o AcBr??Abs.!
[há +1 ano] – Responder
Fernando Kipper

Excelente Postagem.
Uma dúvida: Quanto a impressão de boletos, da forma trabalhada nesse post, apenas é possível imprimir 1 boleto por vez. E no caso de ter uma venda à prazo em “x” vezes, visualizar todos os boletos e imprimir de uma vez só. Alguma sugestão ?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Pode ser impresso mais de um boleto por vez. Basta adicionar quantos boletos tiver e depois de adicionado mandar imprimir, que vai sair todos numa única impressão separados por página.Abs.!

[há +1 ano] – Responder
Fernando Kipper

Então cada vez que adicionar uma conta ele não limpa as informações anteriores. E ao imprimir visualiza todos os boletos adicionados ?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Isso mesmo!
[há +1 ano] – Responder
Fernando Kipper

Entendi.
Não é exatamente o que eu estava precisando, mas gostei muito desse modelo.
Eu já utilizo praticamente todos os componentes Acbr em outros projetos, mas para um projeto específico não tenho esse “mamão com açúcar” hehehee.
Muito obrigado pela atenção. Ótimo post.
[há +1 ano] – Responder
Leonardo Maciel

Boa tarde.
Com esse seu exemplo nao conseguiu realizar oque pretendia.
Preciso somente ler o arquivo de retorno e mostrar os seus dados em um grid, somente para visualização mesmo e quem sabe colocar uns filtros e tals.
Pelo que percebi esta é uma ferramenta ainda nova, com poucas explicações, nao consegui localizar nenhum manual ou tutorial com todas as funções explicadas nem que seja as muquirana…
Se puder me dar umas explicadas de como tratar as informações do arquivo lido lhe agradeço.Tenha uma boa semana!!
Abraço.
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Esta ferramenta já existe a algum tempo. Para maiores informações acesse o forum do projeto acbr. No mais, ao instalar o componente, tem os exemplos onde pode encontrar a rotina de remessa e retorno em detalhes. Após usar a rotina para leitura do arquivo de retorno poderá exibir num grid.Abs.!

[há +1 ano] – Responder
Leonardo Maciel

pois eh ja fiz isso, nao entendi muita coisa.
Quando ele le o arquivo ele da a seguinte mensagem ‘arquivo nao encontrado ‘+diretorio do arquivo+”
linha que ocorre o problema na função leRetorno.
if not FilesExists( NomeArq ) then
raise Exception.Create(ACBrStr(‘Arquivo não encontrado:’+sLineBreak+NomeArq));
[há +1 ano] – Responder
Leonardo Maciel

pois eh ja fiz isso, nao entendi muita coisa.
Quando ele le o arquivo ele da a seguinte mensagem ‘arquivo nao encontrado ‘+diretorio do arquivo+”
linha que ocorre o problema na função leRetorno.
if not FilesExists( NomeArq ) then
raise Exception.Create(ACBrStr(‘Arquivo não encontrado:’+sLineBreak+NomeArq));
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Você se certificou de esta configurando o componente acbrboleto com o caminho do arquivo de retorno?
[há +1 ano] – Responder
Leonardo Maciel

sim depois que analisei o codigo corretamente percebi que tenho que informar o diretorio (ACBrBoleto1.DirArqRetorno) e depois SOMENTE o nome, no seu exemplo voce diz para passar somente o nome.
E o erro na verdade esta nessa linha NomeArq := fDirArqRetorno + PathDelim + NomeArqRetorno; e nao na que tinha te passado anteriormente.
E cara to com mais algumas duvidas mas vou tentar resolver sozinho, pelo que percebi acima voce ja ta indignado com as nossas duvidas e não esta com humildade o suficiente para repassar o seu conhecimento. Entao vamo na fé que vai da certo.
Aquele abraço, fique com deus…
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Não entendi em que ponto escrevi algo que pudesse te levar a crer que estou respondendo de forma atravessada, pois se realmente estivesse desta forma eu não responderia tão rapidamente as questões. Mas confesso que não tenho muito conhecimento nesta parte do componente, pois fiz este artigo atendendo a pedidos e estudei a forma de trabalho para dar uma ideia de como usar o mesmo. Por isso orientei algum leitor acima a buscar maiores informações no fórum do acbr.
Não tenho receio algum em repassar meu conhecimento, tanto que criei diversos artigos e vídeos repassando o que sei, apenas não posso ficar buscando informações que não tenho para atender as dúvidas, pois desta forma não consigo realizar meu trabalho pessoal.
Espero que compreenda e fique a vontade para enviar novas dúvidas que mesmo que não saiba responder, te passarei algum dica de onde encontrar respostas.
Abs.!
[há +1 ano] – Responder
Rafael Souto

BOM DIA,
COMO FAÇO PARA REIMPRIMIR UM BOLETO QUE JÁ FOI EMITIDO?
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Eu nunca usei esta situação, mas acredito que teria que carregar os dados do titulo novamente e mandar imprimir novamente. Observe se no componente tem alguma opção que indica como 2º via.Abs.!

[há +1 ano] – Responder
Cesar Cardoso

Bom dia Godinho.
Parabéns pela iniciativa de nos ajudar.
Minha dúvida é a seguinte, para gerar boletos da caixa econômica quando vou passar o número da carteira pede que seja passa “RG” de registrada ou “SR” de sem registro. Isso esta certo?
Obrigado
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!O boleto deve ser homologado junto ao banco que deseja usar. Tem que entrar em contato para saber as exigências do mesmo quanto ao boleto. Estas regras que esta questionando acredito ser do próprio componente acbrboleto, e acredito que estas estão de acordo com as exigências do banco.Abs.!

[há +1 ano] – Responder
Jaade Lemos Sousa

Muito bom Ótimo artigo !
[há +1 ano] – Responder
Jetson Lopes

Sou te fão meu véio!!! Seja abençoado sempre!!!
[há +1 ano] – Responder
Wanderson Ferreira Dos Santos

Ola bom dia, como faria para criar uma rotina e selecionar vários documentos e imprimir os boletos por exemplo…Atenciosamente
[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Você deve inserir no acbrboleto todos os documentos que precisar e depois irá realizar os procedimento de impressão e geração de remessa para o banco.Abs.!

[há +1 ano] – Responder
Tales Joseph Jr

Opa Luis, parabéns pelo post!!Estou com a seguinte dúvida. o banco q estou tentando implementar é o santander, mas sinceramente não sei o que é o ‘Banco.Digito’, será que você poderia ajudar?
rocedure TForm1.ConfiguraComponenteAcBr;
begin
if not CdsConfig.IsEmpty then
begin
ACBrBoleto1.ACBrBoletoFC.DirLogo := CdsConfigPATH_LOGOTIPO.AsString;
ACBrBoleto1.ACBrBoletoFC.Filtro := fiNenhum;
ACBrBoleto1.ACBrBoletoFC.LayOut := lPadrao;
ACBrBoleto1.Banco.Digito := ????????;
ACBrBoleto1.Banco.Numero := 033;
ACBrBoleto1.Cedente.Nome := CdsBancosCEDENTE.AsString;
ACBrBoleto1.Cedente.CodigoCedente := CdsBancosCOD_CEDENTE.AsString;
ACBrBoleto1.Cedente.Agencia := CdsBancosNUMERO_AGENCIA.AsString;
ACBrBoleto1.Cedente.AgenciaDigito := CdsBancosDIGITO_AGENCIA.AsString;
ACBrBoleto1.Cedente.Conta := CdsBancosNUMERO_CONTA.AsString;
ACBrBoleto1.Cedente.ContaDigito := CdsBancosDIGITO_CONTA.AsString;
ACBrBoleto1.Cedente.UF := CdsBancosUF_AGENCIA.AsString;
ACBrBoleto1.NomeArqRemessa := CdsConfigPATH_REMESSA.AsString+FormatDateTime(‘DDMMYYYYHHMMSS’,Now)+’.TXT’;;
end;
end;obrigado pela ajuda.

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá!Tem um tempo que não mecho com o componente mais acredito que teve mudança na seleção do banco. Terá que selecionar o banco da opção da propriedade e os outros dados serão preenchidos automaticamente.Abs.!

[há +1 ano] – Responder
Charbel Sales

Ola preciso muito da ajuda de vcs, estava usando o FREEBOLETO, mais to com problema na impressao para caixa e BB, carteira 18 , então instalei o ACBR boleto mais ta dando erro ao adicionar a questao dos relatorios ..BoletoFC, qualquer um tanto o quick quanto o Fortes.me ajudem..

[há +1 ano] – Responder
[autor] Luis Carlos Godinho

Olá! Se o problema esta na instalação, sugiro que uso o instalador do acbr e instale todo o componten.Abs.!
[há +1 ano] – Responder
Pablo Augusto Lunardi

Olá, preciso de ajuda, na hora de ler o arquivo remessa está dando erro.Arquivo não encontrado:
\C:\sistema8595_090.ret.Não sei por que está saindo essa \ antes do C:

Acontece isso tanto com o openDialog e mesmo se eu colocar o endereço em uma String.

:/

[há +1 ano] – Responder
Pablo Augusto Lunardi

Desculpa, na hora de ler o arquivo retorno.
[há +1 ano] – Responder
Pablo Augusto Lunardi

Já descobri, diretório e arquivo são setados separados. Infelizmente a função de ler o arquivo retorno 400 não está implementada para o banco Banrisul. :\
[há +1 ano] – Responder
Marcos Roberto MVP

Olá!
primeiramente parabéns pela tutorial…No meu esta dando alguns erro.
hora que clico no botão gerar remessa ele me retorna o seguinte erro: “Informações do Cedente incompletas”,
e no botão Adicionar contas ele da o erro: “Access violation at address 006DF979…”Agradeço desde já!

[há +1 mês] – Responder
Douglas Claudio

Olá Marcos, obrigado pelo seu comentário.Enviamos sua solicitação ao Luis e estamos no aguardo de um feedback do mesmo.Um abraço.

[há +1 mês] – Responder
Marcos Roberto MVP

Opa Douglas, obrigado por dar atenção para o meu problema!Eu consegui corrigir o segundo erro, o erro de violação.
A solução é que na verdade faltava setar na propriedade “ACBrBoleto” do componente “ACBrBoletoFCQuick1” o ACBrBoleto1.Mas o erro de “Informações do Cedente incompletas” continua.

Mais uma vez agradeço por enviar o meu problema para o Luis.

[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Quanto a primeira mensagem, acredito que seja retorno do acbrboleto e esta bem específica. Reveja as informações passadas ao componente.
Quanto ao outro erro é muito vago para saber do que se trata.Att.

[há +1 mês] – Responder
Marcos Roberto MVP

Olá Luis!Olha por via das duvidas coloquei caso as informações estejam retornando erradas, decidi colocar as informações do cedente na mão… Veja como ficou a Procedure.procedure TFormMain.ConfiguraComponenteAcBr;
begin
if not Database.TableConfig.IsEmpty then
begin
ACBrBoleto1.ACBrBoletoFC.DirLogo := Database.TableConfigPATH_LOGOTIPO.AsString;
ACBrBoleto1.ACBrBoletoFC.Filtro := fiNenhum;
ACBrBoleto1.ACBrBoletoFC.LayOut := lPadrao;
ACBrBoleto1.Banco.Digito := Database.TableBancoDIGITO_NUMERO_BANCO.AsInteger;
ACBrBoleto1.Banco.Numero := Database.TableBancoNUMERO_BANCO.AsInteger;

{
ACBrBoleto1.Cedente.Nome := Database.TableBancoCEDENTE.AsString;
ACBrBoleto1.Cedente.CodigoCedente := Database.TableBancoCOD_CEDENTE.AsString;
ACBrBoleto1.Cedente.Agencia := Database.TableBancoNUMERO_AGENCIA.AsString;
ACBrBoleto1.Cedente.AgenciaDigito := Database.TableBancoDIGITO_AGENCIA.AsString;
ACBrBoleto1.Cedente.Conta := Database.TableBancoNUMERO_CONTA.AsString;
ACBrBoleto1.Cedente.ContaDigito := Database.TableBancoDIGITO_CONTA.AsString;
ACBrBoleto1.Cedente.UF := Database.TableBancoUF_AGENCIA.AsString;
}

ACBrBoleto1.Cedente.Nome := ‘Marcos’;
ACBrBoleto1.Cedente.CodigoCedente := ‘215’;
ACBrBoleto1.Cedente.Agencia := ‘1479’;
ACBrBoleto1.Cedente.AgenciaDigito := ‘6’;
ACBrBoleto1.Cedente.Conta := ‘1002’;
ACBrBoleto1.Cedente.ContaDigito := ‘6’;
ACBrBoleto1.Cedente.UF := ‘SP’;

ACBrBoleto1.NomeArqRemessa := Database.TableConfigPATH_REMESSA.AsString+FormatDateTime(‘DDMMYYYYHHMMSS’,Now)+’.TXT’;;
end;
end;

Agradeço pela atencão.

[há +1 mês] – Responder
Douglas Claudio

Olá Marcos, obrigado pelo seu comentário.Enviamos sua solicitação ao Luis e estamos no aguardo de um feedback do mesmo.Um abraço.

[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Já atualizou o seu componente acbr? Aparentemente esta tudo certo no código.Att.

[há +1 mês] – Responder
Marcos Roberto MVP

na verdade eu instalei pelo SVN Terça feira desta semana.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

No componente novo tem algumas informações que devem ser passadas de forma diferente da forma que esta ai no artigo. Este artigo e muito antigo e acredito que ficará melhor se dar uma olhada no exemplo que a equipe do acbr disponibiliza junto com o componente.Att.
[há +1 mês] – Responder
Joabe Anderson Da Silva

Você tem que passar para o componente o banco . essa mudança foi feita a poucos dias .
desse jeito .ACBrBoleto1.Banco.TipoCobranca := cobCaixaEconomica;
[há +1 mês] – Responder
Rodrigo Adriano

copiaram o seu post e nem te deram créditos, infelizmente.http://anaprogramadorajunior.blogspot.com.br/2013/12/emissao-e-controle-de-boletos.html
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Sem problemas. Desde que seja útil esta bom. heheheheGrato,

Luís Godinho.

[há +1 mês] – Responder
Cleomar Pacheco

Estou com uma duvida na formatação do tamanho do nosso numero, pois a empresa usa COM Registro e carteira 11, e o convernio é com 7 digitos, isto teria que me retornar o nosso número com 17 digitos, só que onde verifico o tamanho máximo e a formatação do nosso número, retorna sempre 10 o tamanho….. Ah, é banco do Brasil.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Até onde eu sei, formatação do nosso número é definida pelo banco. Certifique com o banco que deseja homologar o boleto para maiores informações.Att.

[há +1 mês] – Responder
Cleomar Pacheco

Isso sim, a minha dúvida é se tem algum parametro no acbr, pq na função tamanho máximo teria que retornar com 17 digitos, pois é carteira 11 e tem o convênio com 7 digitos, isto é, tenho que ter 17 digitos no nosso número, só que a função do tamanho máximo do acbr do banco do brasil me traz 10.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Que eu saiba não tem. Tem que ver diretamente e não estou utilizando este recurso. Posta a dúvida no fórum da devmedia ou do acbr que certamente alguém deve ter informações mais seguras do assunto.att.
[há +1 mês] – Responder
Felipe Salzano MVP

Bom dia.
Parabéns pelo post e pelas dicas.
porém, tenho algumas dúvidas a respeito de AcbrBoleto. Utilizo Delphi Xe2 com ACBrBoletoFCFR, para FastReports.
Não queria ficar alterando o componente original pra passar novos campos nos datasets. Os campos que existem no componente são satisfatórios, mas preciso adicionar mais campos ao Dataset titulo, afim de chamar no Boleto.
Outra coisa é quanto adicionar logomarcas no boleto, só existe este jeito de passar as imagens? através do diretório dos logos?
Você sabe alguma outra forma de passar outras imagens para o boleto, como logo da empresa, etc.
Muito obrigado.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Quanto aos ajuste de campo, o ideal seria sugerir no forum do acbr para ver se eles adicionam ao projeto. Assim não precisaria ficar alterando. E quanto a logo eu não conheço outra forma.Att.

[há +1 mês] – Responder
Felipe Salzano MVP

ok Godinho.
muito obrigado.
[há +1 mês] – Responder
Emilio Córdova

Bom dia,
Existe algum manual de quais variáveis tenho que enviar para o componente emitir os boletos da caixa econômica?
Gostei muito do componente pois ele faz tudo o que preciso e muito mais, mas estou com problemas para validar o boleto junto à Caixa.
Se puder me ajudar, desde já agradeço.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!
Pelo que sei, não existe nenhum manual deste tipo. O ideal seria ver no fórum com alguém que tenha tido esta experiência.Att.
[há +1 mês] – Responder
Emilio Córdova

Ok Luis, já me cadastrei no fórum e acabei de tanto mexer que encontrei o problema do nosso numero e carteira.
Mesmo assim, obrigado pela pronta resposta.
T+.
[há +1 mês] – Responder
Leandro Rodrigues Sindorf MVP

Prezado Luis CarlosEm primeiro lugar, parabens pela Aulas, sua didática e conteudo.
Estou começando agora a me inteirar com este assunto de NFe.
Acompanhando os seus videos surgiram algumas duvidas.Na aula 5, não consigo implementar o código que você demonstra, no DataModule DmNFe, Procedure AtualizaConfigAcbr

procedure TDmNFe.AtualizaConfigAcbr;
var OK : Boolean;
begin
// Realiza a Leitura dos Dados do Arquivo de Configuração
LeArqIni;
// Repassa Dados para o componentes AcBrNfe
{$IFDEF AcBrNfeOpenSSL}
ACBrNFe1.Configuracoes.Certificados.Certificado := sCertificado;
ACBrNFe1.Configuracoes.Certificados.Senha := sSenha;
{$ELSE}
ACBrNFe1.Configuracoes.Certificados.NumeroSerie := sSerial;
{$ENDIF}

Qdo tento acessar o NumeroSerie, em Certificados, ele não esta aparecendo. Houve alguma mudança em relação ao Numero de Série?

Desde Já agradeço a atenção.

[há +1 mês] – Responder
Douglas Claudio

Olá Leandro, obrigado pelo seu comentário.Enviamos sua solicitação ao Luis e estamos no aguardo de um feedback do mesmo.Um abraço.

[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Pelo que sei não teve mudança.
Atualize o componente acbr e use conforme o exemplo disponibilizado pelo mesmo.Att.

[há +1 mês] – Responder
Edmilson Cândido

Bom dia!quando coloco seu código pra rodar aparece os seguintes erros e como resolvelos sou novo em delphi comparado aos seu preciosos conhecimento, poderia me ajudar por favor a resolver isso? grato.[Error] frm_boletos.pas(56): Unknown directive: ‘CdsContas’
[Error] frm_boletos.pas(78): Undeclared identifier: ‘DataInicio’
[Error] frm_boletos.pas(78): Missing operator or semicolon
[Error] frm_boletos.pas(79): Statement expected but ‘PROCEDURE’ found
[Error] frm_boletos.pas(81): Undeclared identifier: ‘xNossoNumero’
[Error] frm_boletos.pas(81): Undeclared identifier: ‘CdsBancosNOSSO_NUMERO’
[Error] frm_boletos.pas(81): Missing operator or semicolon
[Error] frm_boletos.pas(82): Undeclared identifier: ‘ConfiguraComponenteAcBr’
[Error] frm_boletos.pas(86): ‘.’ expected but ‘ELSE’ found
[Error] frm_boletos.pas(92): Undeclared identifier: ‘CdsContasNOSSO_NUMERO’
[Error] frm_boletos.pas(92): ‘THEN’ expected but identifier ‘IsNull’ found
[Error] frm_boletos.pas(94): Undeclared identifier: ‘xNossoNumero’
[Error] frm_boletos.pas(98): Undeclared identifier: ‘CdsContasDATA_VENC’
[Error] frm_boletos.pas(98): Missing operator or semicolon
[Error] frm_boletos.pas(99): Undeclared identifier: ‘CdsContasDATA_CONTA’
[Error] frm_boletos.pas(99): Missing operator or semicolon
[Error] frm_boletos.pas(100): Undeclared identifier: ‘CdsContasNUMCONTA’
[Error] frm_boletos.pas(100): Missing operator or semicolon
[Error] frm_boletos.pas(101): Undeclared identifier: ‘CdsConfigESPECIE’
[Error] frm_boletos.pas(101): Missing operator or semicolon
[Error] frm_boletos.pas(102): Undeclared identifier: ‘CdsConfigACEITE’
[Error] frm_boletos.pas(102): ‘THEN’ expected but identifier ‘AsString’ found
[Error] frm_boletos.pas(148): Undeclared identifier: ‘CdsConfig’
[Error] frm_boletos.pas(150): Undeclared identifier: ‘CdsConfigPATH_LOGOTIPO’
[Error] frm_boletos.pas(150): Missing operator or semicolon
[Error] frm_boletos.pas(153): Undeclared identifier: ‘CdsBancosDIGITO_NUMERO_BANCO’
[Error] frm_boletos.pas(153): Missing operator or semicolon
[Error] frm_boletos.pas(154): Undeclared identifier: ‘CdsBancosNUMERO_BANCO’
[Error] frm_boletos.pas(154): Missing operator or semicolon
[Error] frm_boletos.pas(155): Undeclared identifier: ‘CdsBancosCEDENTE’
[Error] frm_boletos.pas(155): Missing operator or semicolon
[Error] frm_boletos.pas(156): Undeclared identifier: ‘CdsBancosCOD_CEDENTE’
[Error] frm_boletos.pas(156): Missing operator or semicolon
[Error] frm_boletos.pas(157): Undeclared identifier: ‘CdsBancosNUMERO_AGENCIA’
[Error] frm_boletos.pas(157): Missing operator or semicolon
[Error] frm_boletos.pas(158): Undeclared identifier: ‘CdsBancosDIGITO_AGENCIA’
[Error] frm_boletos.pas(158): Missing operator or semicolon
[Error] frm_boletos.pas(159): Undeclared identifier: ‘CdsBancosNUMERO_CONTA’
[Error] frm_boletos.pas(159): Missing operator or semicolon
[Error] frm_boletos.pas(160): Undeclared identifier: ‘CdsBancosDIGITO_CONTA’
[Error] frm_boletos.pas(160): Missing operator or semicolon
[Error] frm_boletos.pas(161): Undeclared identifier: ‘CdsBancosUF_AGENCIA’
[Error] frm_boletos.pas(161): Missing operator or semicolon
[Error] frm_boletos.pas(162): Undeclared identifier: ‘CdsConfigPATH_REMESSA’
[Error] frm_boletos.pas(162): Missing operator or semicolon
[Error] frm_boletos.pas(164): Statement expected but ‘PROCEDURE’ found
[Error] frm_boletos.pas(170): Undeclared identifier: ‘ConfiguraComponenteAcBr’
[Error] frm_boletos.pas(176): Illegal character in input file: ‘&’ ($26)
[Error] frm_boletos.pas(188): Too many actual parameters
[Error] frm_boletos.pas(208): Undeclared identifier: ‘CdsConfigCONT_REMESSA’
[Error] frm_boletos.pas(208): Missing operator or semicolon
[Error] frm_boletos.pas(216): Undeclared identifier: ‘xNossoNumero’
[Error] frm_boletos.pas(217): Undeclared identifier: ‘CdsBancosID’
[Error] frm_boletos.pas(217): Missing operator or semicolon
[Error] frm_boletos.pas(218): Too many actual parameters
[Error] frm_boletos.pas(225): Undeclared identifier: ‘CdsConfigID’
[Error] frm_boletos.pas(225): Missing operator or semicolon
[Error] frm_boletos.pas(226): Too many actual parameters
[Error] frm_boletos.pas(231): ‘;’ expected but ‘.’ found
[Error] frm_boletos.pas(233): Declaration expected but end of file found
[Fatal Error] boleto.dpr(6): Could not compile used unit ‘frm_boletos.pas’

[há +1 mês] – Responder
Douglas Claudio

Olá Edmilson, obrigado pelo seu comentário.Enviamos sua solicitação ao Luis e estamos no aguardo de um feedback do mesmo.Um abraço.

[há +1 mês] – Responder
Edmilson Cândido

Grato, Estarei no aguardo. Abraços.
[há +1 mês] – Responder
[autor] Luis Carlos Godinho

Olá!Seu código esta incompleto. Sugiro que baixe alguns vídeos para entender a forma de trabalho com os componentes usados no artigo, isso facilitará seu entendimento.Att.

[há +1 mês] – Responder
Edmilson Cândido

onde baixo esses videos e qual o caminho?
[há +1 mês] – Responder
Douglas Claudio

Olá Edmilson, obrigado pelo seu comentário.Você pode está consultando os links abaixo:http://www.devmedia.com.br/instalacao-dos-componentes-acbr-delphi/24199
http://www.devmedia.com.br/emissao-de-boletos-bancarios-com-acbr-revista-clubedelphi-magazine-151/28231

Com certeza, vai te ajudar a entender melhor.

Um abraço.

[há +1 mês] – Responder
Marcos Roberto Da Cruz

ola bom dia gostei do post.. tenho duvida por exemplo o banco sicob tem dois campos chamado configuracao 01 que seria a Modalidade e outro configuracao 02 que seria Carteira Bancoob isso da colocar aonde no acbr?
[há +1 mês] – Responder
Hélio Carlos Cardoso

Olá Marcos, não sou autor do Post mas sou autor na Devmedia e gostaria de ajudar
Para colocar o Campo de Carteira e modalidade é simples.A Classe ACBRTitulo que aparece no exemplo, é uma classe que faz parte do ACBRBoleto e é criada (pode-se criar mais de uma) quando você chama o método “CriarTituloNaLista”Em ACBRTitulo você tem diversas propriedades e entre elas a propriedade Carteira e a propriedade EspecieModalidade, alí você deve colocar a carteira e a modalidade que o banco solicita, lembrando que elas são do tipo string.

[há +1 mês] – Responder
Marcos Roberto Da Cruz

no banco sicredi tem Prefixo do nosso número se emitido pelo Cedente (2 a 9) e Tipo de Cobrança em quais campos que preenche isso no ACBR?
[há +1 mês] – Responder
Douglas Claudio

Olá Marcos, obrigado pelo seu comentário.Enviamos sua solicitação ao Luis e estamos no aguardo de um feedback do mesmo.Um abraço.

[há +1 mês] – Responder
Hélio Carlos Cardoso

Sobre a questão do nosso numero, eu não conheço bem o banco mas alguns bancos, quando colocam o profixo do nosso numero, estes só aparecem para gerar cobrança (arquivo eletrônico enviado para o banco via txt para realizar o registro dos boletos) mas na hora de gerar o boleto e o código de barra esse prefixo não deve ser enviado.O sicob mesmo é um que inicia o nosso numero em 1 no boleto porém na hora de gerar o nosso numero ele pede que coloque “nossonumero(10)”+”parcela(2)”+”modalidade(2)”+”TipoFormulario(1)”Em relação ao tipo de Cobrança, gostaria de ajudar mas peço que seja mais específico. Será que você estaria perguntando sobre a Espécie do título (duplicata mercantil (DM), duplicata de Serviço (DS), Recibo(RC), Fatura(FAT), etc…)?

[há +1 mês] – Responder

Leia mais em: Emissão e Controle de Boletos – Componente AcBr no Delphi http://www.devmedia.com.br/emissao-e-controle-de-boletos-componente-acbr-no-delphi/23631#ixzz3ba7aHxEm

Leia mais em: Emissão e Controle de Boletos – Componente AcBr no Delphi http://www.devmedia.com.br/emissao-e-controle-de-boletos-componente-acbr-no-delphi/23631#ixzz3ba3EvLS5

Usando Telegram API

O IPA é 100% aberto para todos os desenvolvedores que desejam criar aplicativos Telegrama na  plataforma. Sinta-se livre para estudar a aberto o código-fonte de aplicações Telegrama existentes para exemplos de como as coisas funcionam aqui. Não se esqueça de registrar sua candidatura no nosso sistema.

mtproto

Começando

Criação de um aplicativo

Como obter o seu identificador de aplicação e criar um novo aplicativo Telegram

Autorização do usuário

Como registrar o telefone de um usuário para começar a utilizar a API.

Manipulação de erro

Como lidar com erros de retorno API corretamente.

Lidar com diferentes centros de dados

Como o centro de dados mais próxima é selecionada para a interação mais rápido com a API e as coisas para tomar cuidado com no desenvolvimento de um cliente.

Manipulação de atualizações

Como se inscrever para atualizações e lidar com as mensagens recebidas.

Manipulação de notificações push-

Como se inscrever para e lidar com notificações.

Chamando métodos

Opções adicionais para chamar métodos.

Upload e download de arquivos

Como a transferência de grandes quantidades de dados corretamente.

Segurança

Chats secretos, end-to-end encryption

Novo recurso para mensagens end-to-end-criptografada.

Diretrizes de segurança

Importante verificar exigido em seu aplicativo cliente.

Perfect Forward Secrecy

Encadernação chave de autorização temporária para os permanentes.

Otimização

Otimização de cliente

Maneiras de aumentar a interação da API.

Métodos de API

Disponível lista método

Lista completa dos métodos de alto nível disponíveis.

API TL-esquema , como JSON

Texto e JSON-apresentação de tipos e métodos utilizados na API.

Lista de camadas disponíveis

Lista completa das versões de esquema disponíveis.

Log Atualizações

29 de outubro de 2014 Reorganizada documentação secretos Bate-papo: mudou-se Handling números de seqüência para um documento separado, secção adicionado em actualização camadas de chat secretos .
09 de outubro de 2014 Adicionado Camada 18 .
26 de setembro de 2014 Adicionado Camada 17 .
29 de agosto de 2014 Novo artigo sobre Perfect Forward Secrecy . Adicionado camada 15 e da camada 16 .
04 de abril de 2014 Adicionado camada 13 e da camada 14 .
15 de março de 2014 Adicionado Camada 12 .
21 de dezembro de 2013 Adicionado a camada 11 .
30 de novembro de 2013 Adicionado camada 10 .
30 de outubro de 2013 Adicionado Camada 9 .
08 de outubro de 2013 Novo artigo em chats secretos . Adicionado Camada 8 .
06 de setembro de 2013 Novo artigo em camadas TL-esquema , geochats , novos pedidos . Adicionado camadas 2-4 .
27 de agosto de 2013 Novo artigo sobre otimizações do cliente .
03 de agosto de 2013 Atualizações para documentos sobre polimorfismo e vetores em TL. Agora vectors undersal ae utilizados em todos os casos, a linguagem obsoleto em teemplates foi removido.
02 de agosto de 2013 Adicionado construtor atualização updateMessageID .
01 de agosto de 2013 Descrição para atualizações conjuntas , construtor adicionado updatesCombined
31 de julho de 2013 Descrição para upload de arquivos / lógica de download
29 de julho de 2013 Descrição gzip-compressão utilização lógica para os clientes
28 de julho de 2013 Novo artigo no mecanismo de teste para o encaminhamento entre os centros de dados

Repositório: https://github.com/niltonfelipe/Telegram

Protocolo MTProto

Descrição Geral

O protocolo é projetado para acesso a um servidor de API de aplicativos executados em dispositivos móveis. Deve ser enfatizado que um navegador da web não é um tal pedido.

O protocolo é subdividido em três componentes praticamente independentes:

  • Componente de alto nível (linguagem de consulta API): define o método pelo qual as consultas de API e as respostas são convertidas em mensagens binárias.
  • Camada Criptográfica (autorização): define o método pelo qual as mensagens são criptografados antes de serem transmitidos através do protocolo de transporte.
  • Componente de transporte: define o método para o cliente e o servidor para transmitir mensagens sobre algum outro protocolo de rede existente (como, http, https, TCP, UDP).

mtproto_encryptacao

Nota 1

Cada mensagem de texto sem formatação para ser criptografados em MTProto sempre contém os seguintes dados a ser verificado quando decifrando a fim de tornar o sistema robusto contra problemas conhecidos com os componentes:

  • sal servidor (64-Bit)
  • identificação de sessão
  • número de seqüência de mensagem
  • comprimento da mensagem
  • tempo

Resumo breve dos componentes

Componentes de Alto Nível (RPC Query Language / API)

Do ponto de vista do componente de alto nível, o cliente e o servidor trocam mensagens dentro de uma sessão. A sessão está ligada ao dispositivo cliente (a aplicação, para ser mais exato) em vez de uma ligação de HTTP / HTTPS / TCP específico. Além disso, cada sessão está ligada a uma chave de identificação de utilizador, através da qual a autorização é efetivamente realizada.

Várias ligações a um servidor podem ser abertas; mensagens podem ser enviadas em qualquer direção através de qualquer uma das conexões (a resposta a uma consulta não é necessariamente devolvida pela mesma conexão que realizou a consulta original, embora na maioria das vezes, esse é o caso, no entanto, em nenhum caso pode ser uma mensagem devolvida através de uma ligação pertencente a uma sessão diferente). Quando o protocolo UDP é utilizado, uma resposta pode ser retornada por um endereço de IP diferente do que aquele a que a consulta tinha sido enviada.

Existem vários tipos de mensagens:

  • Chamadas RPC (cliente para servidor): chamadas para métodos de API
  • Respostas RPC (servidor para cliente): resultados de chamadas RPC
  • Confirmação de mensagem recebida(ou melhor, notificação de status de um conjunto de mensagens)
  • Consulta de status Mensagem
  • Mensagem concatenada ou recipiente (um recipiente que contém várias mensagens, necessário para enviar várias chamadas RPC de uma só vez através de uma conexão HTTP, por exemplo, também, um recipiente pode apoiar gzip).

Do ponto de vista dos protocolos de nível mais baixo, uma mensagem é um fluxo de dados binários alinhados ao longo de um limite de 4 ou 16 bytes. Os primeiros vários campos da mensagem são fixos e são utilizados pelo sistema de criptografia / autorização.

Cada mensagem, quer individualmente ou dentro de um recipiente, composto por um identificador de mensagem (64 bits, ver abaixo), um número de sequência de mensagem dentro de uma sessão (32 bits), o comprimento (do corpo da mensagem em bytes, 32 bits), e um corpo (qualquer tamanho que é um múltiplo de 4 bytes). Além disso, quando um recipiente ou uma única mensagem é enviada, um cabeçalho interno é adicionado no topo (ver abaixo), então a totalidade da mensagem é criptografada, e um cabeçalho exterior é colocada na parte superior da mensagem (um de 64 bits identificador de chave e uma chave de mensagem de 128 bits).

corpo da mensagem consiste normalmente em um tipo de mensagem 32-bit seguido por parâmetros dependentes do tipo. Em particular, cada função de RPC tem um tipo de mensagem correspondente. Para mais detalhes, ver dados binários serialização , Protocolo Celular: Mensagens de Serviço .

Todos os números são escritos no formato little endian. No entanto, um número muito grande (2048 bits) usados ​​na RSA e DH estão escritos no formato big endian porque é isso que a biblioteca OpenSSL faz.

Autorização e criptografia

Antes que uma mensagem (ou uma mensagem de várias vias) inicie a transmissão através de uma rede que utiliza um protocolo de transporte, que é criptografada de uma certa forma, um cabeçalho exterior é adicionado no topo da mensagem que é um identificador de chave de 64-bits ( que identifica de forma única uma chave de autorização para o servidor, bem como o utilizador) e uma chave de mensagem de 128 bits. Uma chave de usuário junto com a chave da mensagem define uma chave de 256 bits real que é o que criptografa a mensagem usando a criptografia AES-256. Note-se que a parte inicial da mensagem a ser encriptada contém dados variáveis ​​(sessão de mensagem, ID, número de sequência, salt server) que, obviamente, influencia a chave de mensagem (e, portanto, a chave AES e iv). A chave de mensagem é definido como os 128 bits de ordem inferior do SHA1 do corpo da mensagem (incluindo sessão, mensagem de identificação, etc). Mensagens de várias partes são criptografadas como uma única mensagem.

Para uma especificação técnica, ver Protocolo Celular: Descrição Detalhada
A primeira coisa que um aplicativo cliente deve fazer é criar uma chave de autorização que normalmente é gerado quando é executado pela primeira vez e quase nunca muda.

O inconveniente principal do protocolo é que se um intruso interceptar passivamente as mensagens e, em seguida, de alguma forma, apropriando-se da chave de autorização (por exemplo, por roubar um dispositivo) será capaz de decifrar todas as mensagens interceptadas a posteriori. Isso provavelmente não é um grande problema (por roubar um dispositivo, também se poderia ter acesso a todas as informações armazenadas em cache no dispositivo sem descriptografar qualquer coisa); no entanto, podem ser tomadas as seguintes medidas para superar este problema:

  • As chaves de sessão gerada utilizando o protocolo de Diffie-Hellman, e usado em conjunto com a autorização das chaves de mensagem e para seleccionar parâmetros de AES. Para criar estes, a primeira coisa que um cliente deve fazer depois de criar uma nova sessão é enviar uma consulta RPC especial ao servidor (“gerar chave de sessão”) ao qual o servidor irá responder, após o que todas as mensagens subsequentes dentro da sessão são criptografados usando o chave de sessão também.

 

  • Protegendo a chave armazenada no dispositivo cliente com um (texto) de senha; esta senha nunca é armazenado na memória e é inserido por um usuário ao iniciar a aplicação ou com maior frequência (dependendo das configurações de aplicativos).

 

  • Os dados armazenados (em cache) no dispositivo do usuário também pode ser protegido por criptografia usando uma chave de autorização que, por sua vez, é para ser protegido por senha. Em seguida, uma senha será necessária para obter acesso ainda a esses dados.

Sincronização de Tempo

Se o tempo do cliente diverge amplamente do horário do servidor, um servidor pode começar a ignorar mensagens de clientes, ou vice-versa, por causa de um identificador de mensagem inválido (que está intimamente relacionado com o tempo de criação). Sob estas circunstâncias, o servidor envia ao cliente uma mensagem especial contendo a hora correta e um determinado sal de 128 bits (quer explicitamente fornecido pelo cliente num pedido de sincronização RPC especial ou igual a chave da última mensagem recebida do cliente durante a sessão atual). Esta mensagem pode ser o primeiro em um recipiente que inclui outras mensagens (se a diferença de tempo é significativa mas ainda não resultar em mensagens do cliente a ser ignorado).

Tendo recebido tal uma mensagem ou um recipiente contendo-lo, o cliente efetua primeiro uma sincronização de tempo (na verdade, simplesmente armazenar a diferença entre a hora do servidor e as suas próprias para ser capaz de calcular o tempo “correta” no futuro) e, em seguida, verifica que os identificadores de mensagem para correção.

Onde tem sido negligenciada uma correção, o cliente terá que gerar uma nova sessão para assegurar a monotonia de identificadores de mensagem.

Transporte

Permite a entrega de contêineres criptografados juntamente com o cabeçalho externo (a seguir, Payload) do cliente para o servidor e para trás. Existem três tipos de transporte:

  • HTTP
  • TCP
  • UDP

Examinaremos os dois primeiros tipos.

Transporte HTTP

Implementado através de HTTP / 1.1 (com keepalive) que funciona sobre o tradicional porta TCP 80. HTTPS não é utilizado; o método de criptografia acima é usado em vez disso.

Uma conexão HTTP está ligado a uma sessão (ou melhor, a sessão + identificador de chave) especificado na consulta mais recente do usuário recebido; normalmente, a sessão é o mesmo em todas as consultas, mas proxies HTTP astutos que pode corromper. Um servidor não pode retornar uma mensagem em uma conexão HTTP, a menos que ele pertence à mesma sessão, ea menos que seja a vez do servidor (uma solicitação de HTTP foi recebido do cliente para que uma resposta não foi enviada até o momento).

A disposição geral é como se segue. O cliente abre uma ou mais conexões HTTP keepalive para o servidor. Se uma ou mais mensagens necessitam de ser enviados, eles são feitos numa carga que é seguido por um pedido POST para o URL / API para que a carga é transmitida como dados. Além disso, Content-Length , Keepalive e Host são cabeçalhos HTTP válidos.

Tendo recebido a consulta, o servidor pode ou esperar um pouco (se a consulta exige uma resposta após um curto tempo de espera) ou imediatamente devolver uma resposta fictício (apenas reconhecendo o recebimento do container). Em qualquer caso, a resposta pode conter qualquer número de mensagens. O servidor pode, ao mesmo tempo enviar outras mensagens que poderia estar segurando para a sessão.

Além disso, existe uma consulta RPC longo sondagem especial (válido somente para conexões HTTP) que transmite a máxima T. tempo limite Se o servidor tiver mensagens para a sessão, eles são devolvidos imediatamente; caso contrário, um estado de espera é inserido até que o servidor tem uma mensagem para o cliente ou T segundos se passaram. Se há eventos ocorrem no período de t segundos, uma resposta manequim é devolvido (mensagem especial).

Se um servidor deve enviar uma mensagem para um cliente, ele verifica para uma conexão HTTP que pertence à sessão e é necessária na “responder a um pedido de HTTP” estado (incluindo a longo sondagem) após o que a mensagem é adicionada ao recipiente de resposta a conexão e enviados para o usuário. Em um caso típico, há algum tempo de espera adicional (50 milissegundos) contra a eventualidade de que o servidor terá em breve mais mensagens para a sessão.

Se nenhuma conexão HTTP adequado estiver disponível, as mensagens são colocadas em fila de envio da sessão atual. No entanto, eles encontram seu caminho lá de qualquer maneira até que o recebimento é explícita ou indiretamente confirmada pelo cliente. Para o protocolo HTTP, enviar a consulta seguinte na mesma conexão HTTP é considerado como um reconhecimento implícito (não mais, do protocolo HTTP também requer que as confirmações explícitas ser enviados); em outros casos, o cliente deve retornar um reconhecimento expresso dentro de um tempo razoável (que pode ser adicionado a um recipiente para o pedido seguinte).

Importante: se a confirmação não chegar a tempo, a mensagem pode ser reenviado (possivelmente, em um recipiente diferente). As partes devem autonomamente estar pronto para isso e deve armazenar os identificadores das mensagens mais recentes recebidos (e ignorar tais duplicatas, em vez de ações de repetição). Para não ter os identificadores armazenados para sempre, existem mensagens especiais de coleta de lixo que se aproveitam de identificador de mensagem monotonicity.

Se a fila de envio transborda ou se as mensagens permanecem na fila por mais de 10 minutos, o servidor esquece-los (ou envia-los para trocar, nenhum gênio necessário). Isso pode acontecer ainda mais rápido, se o servidor está funcionando fora do espaço de buffer (por exemplo, por causa de problemas de rede graves, resultando em um grande número de conexões de tornar-se cortadas).

Transporte TCP

É muito semelhante ao transporte HTTP. Também pode ser implementada através da porta 80 (para penetrar todos os firewalls) e até mesmo usar os mesmos endereços IP do servidor. Nesta situação, o servidor de HTTP ou se entende protocolo TCP deve ser usado para a ligação, a partir dos primeiros quatro bytes de entrada (para HTTP, é POST).

Quando uma conexão TCP é criada, ela é atribuída à sessão (e a chave de autorização) transmitida na primeira mensagem do usuário e, posteriormente, utilizada exclusivamente para esta sessão (arranjos de multiplexação não são permitidos).

Se uma carga (maço) tem de ser transmitida a partir do servidor para o cliente ou do cliente ao servidor, ele é encapsulado como se segue: 4 bytes de comprimento são adicionados na parte da frente (para incluir o comprimento, o número de sequência, e CRC32; sempre divisível por 4) e 4 bytes com o número de sequência de pacote dentro desta ligação TCP (o primeiro pacote enviado é numerado 0, a próxima 1, etc.), e 4 CRC32 bytes no fim (comprimento, número de sequência, e carga útil em conjunto).

Há uma versão resumida do mesmo protocolo: se o cliente envia 0xef como o primeiro byte (** importante: ** Apenas antes de o primeiro pacote de dados), em seguida, tamanho do pacote é codificada por um único byte (0x01..0x7e = comprimento de dados dividido por 4, ou 0x7f seguido de 3 bytes de comprimento (pouco endian) dividido por 4), seguido pelos dados de si mesmos (número de seqüência e CRC32 não adicionado). Neste caso, as respostas do servidor de olhar o mesmo (o servidor não envia 0xef como o primeiro byte).

No caso de ser necessário o alinhamento de 4 bytes de dados, pode ser utilizada uma versão intermediária do protocolo original: se o cliente envia 0xeeeeeeee como o primeiro int (quatro bytes), em seguida, o comprimento do pacote é sempre codificada por quatro bytes como na versão original, mas o número de sequência e CRC32 são omitidos, diminuindo assim a dimensão total do pacote por 8 bytes.

O cheia, o intermediário e os versões abreviadas do protocolo tem suporte para reconhecimento rápido. Neste caso, o cliente coloca o bit de ordem mais alta comprimento no pacote de consulta, e o servidor responde com um especial de 4 bytes como um pacote separado. Eles são os 32 bits SHA1 de ordem superior da parte cifrada do pacote com o bit mais significativo definido para tornar claro que isto não é o comprimento de um pacote de resposta regular do servidor; se a versão resumida é usado, bswap é aplicada a esses quatro bytes.

Não há reconhecimentos implícitos para o transporte TCP: todas as mensagens devem ser reconhecidos de forma explícita. Na maioria das vezes, as confirmações são colocados num recipiente com a seguinte resposta de consulta ou se for transmitido em pouco tempo. Por exemplo, este é quase sempre o caso de mensagens de cliente que contêm consultas RPC: o reconhecimento chega normalmente com a resposta RPC.

No caso de um erro, o servidor pode enviar um pacote cuja carga consiste de quatro bytes como o código de erro.Por exemplo, o código de erro 403 corresponde às situações em que o erro HTTP correspondente teria sido devolvidos pelo protocolo HTTP.