SENSOR ULTRASÔNICO JSN-SR04T

O JSN-SR04T é um sensor de distância ultra-sônico à prova d’água, fácil de usar, com uma faixa de 25 a 450 cm. Se você está planejando construir um sistema de medição do nível de água ou se você precisa fazer outras medições de distância fora, então este é o sensor que você precisa!

Eu incluí um diagrama de fiação e códigos de exemplo para que você possa começar a experimentar seu sensor.

 

O que este artigo cobre

Informações sobre o sensor

O sensor vem com um cabo de 2,5 m de comprimento que se conecta a uma placa de fuga que controla o sensor e faz todo o processamento do sinal. Note que apenas o sensor e o cabo em si são à prova d’água, se você colocar água na placa de fuga, coisas ruins acontecerão.

Um sensor de distância ultra-sônico funciona enviando ondas de ultra-som. Essas ondas de ultra-som são refletidas de volta por um objeto e o sensor ultrassônico as detecta. Ao cronometrar quanto tempo passou entre enviar e receber as ondas sonoras, você pode calcular a distância entre o sensor e um objeto.

Distância (cm) = Velocidade do som (cm / µs) × Tempo (µs) / 2

Onde Tempo  é o tempo entre enviar e receber as ondas sonoras em microssegundos.

Então, quais são as diferenças entre este sensor e o HC-SR04? A principal diferença, além de ser à prova d’água, é que este sensor usa apenas um transdutor ultrassônico. Este transdutor serve tanto como transmissor quanto receptor das ondas de ultra-som.

Para mais informações sobre como os sensores ultrassônicos funcionam, você pode conferir o artigo no HC-SR04 abaixo. Neste artigo, o princípio de funcionamento é explicado com muito mais detalhes.

JSN-SR04T Especificações

Tensão operacional 5V
Corrente de operação 30mA
Corrente quiescente 5mA
Freqüência 40 kHz
Faixa de medição 25 a 450 cm
Resolução 2 mm
Ângulo de medição 45 a 75 graus
Dimensões do sensor Cabo de 23,5 x 20 mm, 2,5 m de comprimento
Dimensões do PCB 41 x 28,5 mm
Orifício de montagem 18 mm

Para mais informações, você pode conferir a folha de dados aqui.

Componentes

* Nota: os links acima são afiliados, o que significa – sem nenhum custo adicional para você – se você comprar algo usando eles, você está ajudando a apoiar o meu trabalho neste site. Meus humildes agradecimentos (eu realmente agradeço)! 

Ao comprar o sensor, você pode encontrar a versão atualizada,  JSN-SR04T-2.0 . Essa versão mais recente funciona exatamente da mesma forma, mas alguns usuários encontraram problemas ao usar os sensores em uma voltagem mais baixa. Esta versão mais recente está classificada para 3 a 5 V.

Usar um pulso de gatilho mais longo de pelo menos 20 µs em vez de 10 µs parece ajudar se você estiver tendo leituras defeituosas.

Fiação – Conectando o JSN-SR04T ao Arduino UNO

O diagrama de fiação / esquema abaixo mostra como conectar o sensor JSN-SR04T ao Arduino. A placa de desagregação da JSN-SR04T possui a mesma pinagem que a HC-SR04, portanto, pode ser usada como substituta imediata. O cabo do sensor em si pode ser conectado ao conector na parte de trás da placa de fuga.

JSN-SR04T com diagrama de fiação do Arduino

Os exemplos de código abaixo usam os pinos digitais 2 e 3 para o gatilho e o pino de eco, mas é claro que você pode mudar isso para qualquer pino digital desejado.

Conexões JSN-SR04T

JSN-SR04T Arduino
5V 5V
Trig Pino 2
Eco Pino 3
GND GND

Exemplo de código para o JSN-SR04T com Arduino

Agora que você conectou o sensor, é hora de conectar o Arduino ao computador e fazer o upload de algum código. O sensor pode ser usado sem uma biblioteca do Arduino. Mais tarde, mostrarei um exemplo com a biblioteca NewPing, que torna o código muito mais curto.

Você pode fazer o upload do seguinte código de exemplo para o seu Arduino usando o  Arduino IDE . Em seguida, vou explicar como o código funciona. (Este código também funciona para o JSN-SR04T-2.0).

/* JSN-SR04T Ultrasonic Distance Sensor with Arduino Example Code. More info: https://www.makerguides.com */

//Define Trig and Echo pin
#define trigPin 2
#define echoPin 3

//Define variables
long duration;
int distance;

void setup()
{
//Define inputs and outputs
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

//Begin Serial communication
Serial.begin(9600); // Starts the serial communication at a baudrate of 9600
}

void loop()
{
//Clear the trigPin by setting it LOW
digitalWrite(trigPin, LOW);
delayMicroseconds(5);

//Trigger the sensor by setting the trigPin high for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

//Read the echoPin. pulseIn() returns the duration (length of the pulse) in microseconds.
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distance= duration*0.034/2;

//Print the distance on the Serial Monitor (Ctrl+Shift+M)
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
delay(100);
}

Se houver a necessidade de leitura de mais sensores, isso pode ser feito facilmente com a biblioteca NewPing. Basta criar duas ou mais instâncias da classe NewPing e adicionar um gatilho e um eco adicionais:

#define trigPin 2 
#define echoPin 3 
#define trigPin2 4 
#define echoPin2 5

Sonar NewPing (trigPin, echoPin, MAX_DISTANCE); 
Sonar 2 de NewPing (trigPin2, echoPin2, MAX_DISTANCE);

Agora, se você quiser ler o primeiro sensor, você pode usar o sonar.ping_cm () e o segundo sensor sonar2.ping_cm ().

 

DOWNLOAD DA BIBLIOTECA NEW PING

 

FONTE: https://www.makerguides.com/jsn-sr04t-arduino-tutorial/

 

Projeto em Python que acessa a webcam e move os olhos em direção aos olhos dos espectadores

Rastreamento de rostos com personagens de anime

Fonte:  https://github.com/Aditya-Khadilkar/Face-tracking-with-Anime-characters?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more

 

 

yuriRequisitos: Ter o python3 instalado. (Eu usei o Python3.6 no python IDLE) instale o OpenCV, os, math, ctypes, time, pygame (você provavelmente só precisará baixar o OpenCV eo PyGame)

Agora pegue o arquivo “YURI FULLSCREEN.py” deste repositório no seu computador. salve as imagens yuri2.bmp e eyes e dê o caminho para essas imagens no código (você também pode usar seu próprio waifus se quiser) baixe o haarcascade e dê a sua localização no código. Execute o código e divirta-se com o seu waifu … weeb

Faça o seu próprio:

Você precisará apenas de 2 imagens

  1. personagem sem olhos yuriwoeyes
  2. os olhosolhossó usam essas imagens e você está pronto para ir!

Versão 2: Yuri agora tem proximidade

Se você mover seu rosto para perto da webcam, ela cora!
Eu adicionei alguns novos arquivos: yuriblush.py (Porque nós não damos espaços em nomes de arquivos :)), Yuri blush.png, Yuri cute.png, Yuriceyes.png,

O processo é o mesmo acima, em vez de baixar YURI FULLSCREEN.py use yuriblush.py. Copie e cole os caminhos e você é bom!

yuri fofayuri blush

Um Modelo Bioinspirado para Localização e Mapeamento Simultâneos de Robôs Subaquáticos em Ambientes com a Influência da Correnteza

Resumo

Neste trabalho é apresentado um modelo bioinspirado para o problema de localização e mapeamento simultâneos para robôs utilizados em ambientes subaquáticos com a influência da correnteza. Devido as suas características específicas, os desafios encontrados e os sensores utilizados nas aplicações em ambientes subaquáticos são apresentados. A abordagem bioinspirada é apresentada, onde são utilizadas para o seu desenvolvimento o comportamento das células place cells, head direction cells e grid cells as quais são encontradas nos cérebros dos mamíferos. Para avaliar o desempenho do modelo utilizam-se simulações do ambiente subaquático com a influência da correnteza desenvolvidas através do simulador Gazebo em conjunto com plugins do UUV Simulator. Os mapas da trajetória realizado pelo robô são obtidos utilizando o modelo proposto e comparados com o ground thruth (valor de referência) e dead reckoning (navegação estimada) obtidos durante a simulação.

 

Palavras-chaves: Localização e mapeamento simultâneos, Algoritmo Bioinspirado, Ambiente Subaquático.

 

Fonte: https://sistemas.furg.br/sistemas/sab/arquivos/bdtd/0000011585.pdf

 

wiringpi.com

Sobre

WiringPi é uma biblioteca de acesso GPIO baseada em PIN escrita em C para os dispositivos SoC BCM2835, BCM2836 e BCM2837 usados ​​em todos os Raspberry Pi. versões. É lançado sob alicença LGPLv3 da  GNU e é utilizável em C, C ++ e RTB (BASIC), assim como em muitos outros idiomas com invólucros adequados (Veja abaixo). Ele foi projetado para ser familiar a pessoas que usaram osistema de “ fiação ” Arduino 1 e é destinado ao uso por programadores C / C ++ experientes. Não é uma ferramenta de aprendizado de novatos.

O WiringPi é desenvolvido diretamente em um Raspberry Pi executando Raspbian de 32 bits. Eu não suporto nenhuma outra plataforma, compilação cruzada ou sistemas operacionais. Ele foi portado para outras plataformas, outros sistemas operacionais e alguns são cross compiling, no entanto, este autor não mantém esses sistemas. Se você está tentando usar wiringPi em uma plataforma diferente do Raspberry Pi com Raspbian então você deve contatar a pessoa que fez o porto e não eu.

O original Raspberry Pi Modelo A e B versão B1 era um computador de placa única de US $ 35 com um conector GPIO (General Purpose Input / Output) de 26 pinos e isso transporta um conjunto de sinais e barramentos. Existem 8 pinos digitais de E / S para fins gerais – estes podem ser programados como saídas digitais ou entradas. Dois desses pinos (em Pi de 40 pinos, apenas um em Pi de 26 pinos) também podem ser designados para saída PWM de hardware. Além disso, há uma interface I2C de 2 fios e uma interface SPI de 4 fios (com uma segunda linha de seleção, totalizando 5 pinos) e a serial UART com mais 2 pinos.

Ao longo dos anos, houve algumas atualizações:

  • O modelo original B com o conector GPIO de 26 pinos.
  • O modelo B, Revision 1.1 Raspberry Pi tem um adicional de 4 linhas GPIO em um conector separado que você tem que soldar na placa.
  • O modelo A é essencialmente o mesmo que o modelo B v1.1, mas sem o hub USB e o conector ethernet.
  • O modelo A + e B + Raspberry Pi representa 2 anos de pesquisa, desenvolvimento e testes e agora possui um único conector GPIO de 40 pinos com 28 pinos GPIO utilizáveis ​​e 4 soquetes USB. (Sem USB ou Ethernet no A +)
  • O modelo B v2 possui um processador quad-core Arm A7 com 1GB de RAM. O mesmo GPIO.
  • O modelo Zero é um Pi A + reduzido (1GHz). Conector GPIO de 40 pinos e muito pouco mais. $ 5 de preço.
  • O modelo B v3 possui um processador quad-core Arm A8 (64 bits) com a mesma RAM e GPIO do modelo 2, mas também possui Wi-Fi e Bluetooth integrados. Ainda o mesmo preço de US $ 35.
  • O modelo Zero-W adiciona o Wi-Fi on-board, o Bluetooth e o conector da câmera Pi ao modelo existente da placa Zero.

As interfaces I2C, SPI e UART também podem ser usadas como pinos de E / S de finalidade geral quando não estão sendo usados ​​em seus modos de barramento, fornecendo um total de 8 + 2 + 5 + 2 = 17 pinos de E / S no conector P1 ( mais mais 4 no conector P5 em uma Revisão 2 Pi) e 28 pinos de E / S nas placas B + e versões 2 e 3 (embora 2 sejam reservados para a interface HAT I2C, mas podem ser usados ​​como GPIOs normais se não forem usados Placa HAT)

O WiringPi inclui um utilitário de linha de comando gpio que pode ser usado para programar e configurar os pinos do GPIO. Você pode usar isso para ler e escrever os pinos e até usá-lo para controlá-los a partir de scripts de shell.

WiringPi é extensível e módulos são fornecidos para ampliar o cabeamentoPi para usar dispositivos de interface analógica no Gertboard, e usar os populareschips de expansão GPIO MCP23x17 / MCP23x08 (I2C 7 SPI), bem como módulos que permitirão blocos de até 4 × 74 × 595 registros de deslocamento para serem encadeados juntos para um valor adicional de 32 bits de saída como uma única unidade. (Você pode ter vários blocos de 4 74x595s, se necessário) Um dos módulos de extensão permite que você use um ATmega (por exemplo, Arduino ou Gertboard) como mais expansão GPIO também – através da porta serial do Pi.

Além disso, você pode escrever facilmente seus próprios módulos de extensão para integrar seus próprios dispositivos periféricos à fiaçãoPi, conforme necessário.

O WiringPi suporta leitura e escrita analógicas, e embora não exista nenhum hardware analógico nativo em um Pi por padrão, os módulos são fornecidos para suportar os chips analógicos Gertboards e outros dispositivos A / D e D / A podem ser implementados com relativa facilidade.

NOTA:

Faça o download da fiação aqui

Existe uma versão do wiringPi hospedada no Github. Não use esta versão do wiringPi . Ele existe apenas para facilitar a construção dos wrappers Ruby e Python que foram escritos por Gadgetoid. Você também pode encontrar outras versões do wiringPi no github – todas elas foram bifurcadas e alteradas para suportar diferentes plataformas de hardware.

A fiação dev devLib

devLib é um conjunto de rotinas de bibliotecas implementadas usando o wiringPi para facilitar o acesso a alguns periféricos populares. Os dispositivos suportados incluem exibições de LCD de caracteres (com base nos chips Hitachi HD44780U) e gráficos – por exemplo, as exibições comuns de 128 × 64 pixels com o chip de driver genérico 12864H. O chip de clock do DS1302 RTC, sensores baseados nos chips Maxdetect (por exemplo, RHT003), as placas de interface Gertboard e PiFace e assim por diante.

Recursos de WiringPi

PiFace

O WiringPi também suporta totalmente a placa PiFace . Veja esta página para mais detalhes.

Gertboard

O WiringPi suporta totalmente o Gertboard. Veja esta página para mais detalhes.

Outros recursos de fiaçãoPi:

Informações adicionais podem ser encontradas nas páginas do Raspberry Pi Wiki .


1 Arduino é realmente duas coisas; uma é uma plataforma de hardware, o outro software e parte do software é um pacote chamado Fiação . A fiação é o núcleo da entrada e saída para o Arduino, então eu pensei que seria bom replicar essa funcionalidade (ou um bom subconjunto utilizável com as extensões do Raspberry Pi) no Raspberry Pi.

CELLO – Automação de design de circuitos genéticos.

Circuito de programação para biologia sintética

À medida que as técnicas de biologia sintética se tornam mais poderosas, os pesquisadores estão antecipando um futuro em que o projeto de circuitos biológicos será semelhante ao projeto de circuitos integrados em eletrônica. Nielsen et al. descreve o que é essencialmente uma linguagem de programação para projetar circuitos computacionais em células vivas. Os circuitos gerados nos plasmídeos expressos em Escherichia coli requeriam isolamento cuidadoso de seu contexto genético, mas funcionavam primariamente conforme especificado. Os circuitos poderiam, por exemplo, regular as funções celulares em resposta a múltiplos sinais ambientais. Tal estratégia pode facilitar o desenvolvimento de circuitos mais complexos por engenharia genética.

 

 

http://www.cellocad.org

Resumo estruturado

INTRODUÇÃO

As células respondem ao ambiente, tomam decisões, constroem estruturas e coordenam tarefas. Subjacentes a esses processos estão operações computacionais realizadas por redes de proteínas reguladoras que integram sinais e controlam o tempo de expressão gênica. Aproveitar essa capacidade é fundamental para projetos de biotecnologia que exigem tomada de decisões, controle, detecção ou organização espacial. Foi demonstrado que as células podem ser programadas usando circuitos genéticos sintéticos compostos de reguladores organizados para gerar uma operação desejada. No entanto, a construção de circuitos simples é demorada e pouco confiável.

JUSTIFICATIVA

A automação de projeto eletrônico (EDA) foi desenvolvida para auxiliar os engenheiros no projeto de eletrônicos baseados em semicondutores. Em um esforço para acelerar o projeto de circuitos genéticos, aplicamos princípios da EDA para permitir o aumento da complexidade do circuito e simplificar a incorporação da regulação gênica sintética em projetos de engenharia genética. Usamos a linguagem de descrição de hardware Verilog para permitir que um usuário descreva uma função de circuito. O usuário também especifica os sensores, os atuadores e o “arquivo de restrições do usuário” (UCF), que define o organismo, a tecnologia do gate e as condições operacionais válidas. Violoncelo ( www.cellocad.org) usa essa informação para projetar automaticamente uma seqüência de DNA que codifica o circuito desejado. Isso é feito por meio de um conjunto de algoritmos que analisam o texto Verilog, criam o diagrama de circuito, atribuem portas, equilibram restrições para construir o DNA e simulam o desempenho.

RESULTADOS

O violoncelo desenha circuitos desenhando uma biblioteca de portas lógicas booleanas. Aqui, a tecnologia de gate consiste de lógica NOT / NOR baseada em repressores. A conexão do gate é simplificada definindo os sinais de entrada e saída como fluxos de RNA polimerase (RNAP). Descobrimos que os portões precisam ser isolados de seu contexto genético para funcionar de forma confiável no contexto de diferentes circuitos. Cada porta é isolada usando terminadores fortes para bloquear o vazamento de RNAP, e a permutabilidade de entrada é melhorada usando ribozimas e espaçadores de promotores. Essas peças são variadas para cada porta para evitar quebras devido à recombinação. Medir a carga de cada porta e incorporar isso nos algoritmos de otimização reduz ainda mais a pressão evolutiva.

O violoncelo foi aplicado ao projeto de 60 circuitos para Escherichia coli , onde a função do circuito foi especificada usando o código Verilog e transformada em uma seqüência de DNA. As sequências de DNA foram construídas conforme especificado sem ajuste adicional, exigindo 880.000 pares de bases de montagem de DNA. Destes, 45 circuitos foram executados corretamente em cada estado de saída (até 10 reguladores e 55 partes). Em todos os circuitos, 92% dos 412 estados de saída funcionaram como previsto.

CONCLUSÃO

Nosso trabalho constitui uma linguagem de descrição de hardware para programação de células vivas. Isso exigiu o codesenvolvimento de algoritmos de design com portas que são suficientemente simples e robustas para serem conectadas por algoritmos automatizados. Demonstramos que os princípios de engenharia podem ser aplicados para identificar e suprimir erros que complicam as composições de sistemas maiores. Essa abordagem leva a uma genética altamente repetitiva e modular, em contraste com a codificação de redes regulatórias naturais. O uso de uma linguagem independente de hardware e a criação de UCFs adicionais permitirão que um único design seja transformado em DNA para diferentes organismos, terminais genéticos, condições de operação e tecnologias de gate.

 

 

Programação genética usando violoncelo.

Um usuário especifica a função de circuito desejada no código Verilog, e isso é transformado em uma sequência de DNA. Um circuito de exemplo é mostrado (0xF6); as curvas vermelha e azul são estados de saída preditos para populações de células, e as distribuições de preto sólido são dados de citometria de fluxo experimental. As saídas são mostradas para todas as combinações de estados do sensor; sinais de mais e menos indicam a presença ou ausência de sinal de entrada. RBS, local de ligao ao ribossoma; RPU, unidade promotora relativa; YFP, proteína fluorescente amarela

.Fig. 1 Visão geral do violoncelo.

A ) Usuários de violoncelo escrevem código Verilog e selecionam ou carregam sensores e um UCF. Com base no design do Verilog, uma tabela de verdade é construída a partir da qual um diagrama de circuito é sintetizado. Reguladores são atribuídos a partir de uma biblioteca para cada porta (cada cor é um repressor diferente). O desenho combinatório é então usado para concatenar partes em uma sequência de DNA linear. O SBOL Visual ( 101 ) é usado para os símbolos das peças. Flechas levantadas são promotores, círculos em hastes são isolantes de ribozimas, hemisférios são ERBs, setas grandes são seqüências codificadoras de proteínas e “T” s são terminadores. As cores das peças correspondem aos portões físicos. ( B) A especificação física para a UCF Eco1C1G1T1. O circuito e os sensores são inseridos em um plasmídeo; o outro plasmídeo contém o promotor de saída do circuito, que pode ser usado para dirigir a expressão de uma proteína fluorescente ou outro atuador. Ambos os plasmídeos devem estar presentes na cepa especificada para que o projeto seja válido.

 

Fig. 2 Atribuição de portões genéticos ao diagrama de circuito.

A ) Um conjunto de quatro portas baseadas em diferentes repressores (cores) conectados em várias permutações para construir diferentes funções de circuito. As entradas (A, B e C) são promotores de entrada do sensor; o promotor de saída do circuito (X) controla o gene de atuação. ( B ) As formas das funções de resposta da porta determinam se elas podem ser conectadas funcionalmente. O portão laranja (PhlF) tem um grande alcance dinâmico (linhas tracejadas) que atravessa o limiar do portão roxo (BetI). No entanto, na ordem inversa, os portões não se conectam funcionalmente. ( C) As relações combinatórias dos repressores da biblioteca de portas isoladas são mostradas nas posições a montante (porta A) e a jusante (porta B). A escala de cores à direita indica a mudança relativa (normalizada), calculada como a faixa máxima de saída que pode ser alcançada conectando a porta A ao gate B. Os números indicam diferentes RBSs. Os gráficos da esquerda e da direita mostram quando a porta A regula a posição 1 e a posição 2, respectivamente. Portões que são excluídos da posição 2 por causa do roadblock são mostrados em preto (fig. S9). ( D ) A probabilidade de encontrar um circuito funcional versus o número de portas lógicas. A probabilidade de um circuito funcional é definida como a probabilidade de uma atribuição aleatória passar na análise do limiar de entrada (fig. S31) e não possuir combinações de roadblocking. ( E) A convergência do algoritmo de atribuição de porta de recozimento simulado (fig. S28). Inserções de gráfico de barras: as barras pretas devem estar LIGADAS; as barras cinzas devem estar DESLIGADAS; o eixo y é a saída no RPU em uma escala de log e o eixo x é o estado de entrada (da esquerda para a direita: 000, 001, 010, 011, 110, 101, 110, 111). A pontuação do circuito ( S ) é definida como a razão entre o estado ON previsto mais baixo e o estado OFF previsto mais alto (fig. S26 e eq. S2). Um exemplo de pesquisa é mostrado para o diagrama de circuito nas inserções; as cores correspondem aos repressores atribuídos a cada porta ( Fig. 3B ).

Entradas correspondem à ausência ou presença de IPTG 1 mM (direita – / +) e aTc (2 ng / ml; esquerda – / +) ( 84 ). (B ) As arquiteturas dos portões isolados. Algumas portas têm várias versões com diferentes seqüências RBS. As seqüências de DNA do gate são fornecidas na tabela S8. ( C ) Um exemplo de uma função de resposta para uma porta NOT baseada no repressor PhlF. A mudança no limite para os três RBSs é mostrada. Os dados para todas as portas isoladas são mostrados na fig. S4 ( D ) O impacto de cada porta no crescimento celular como uma função da sua atividade de promotor de entrada. O crescimento celular foi medido como OD 600 e normalizada pelo crescimento do controlo não indutor de 6 horas após a indução ( 84 ). Os quatro portais que reduziram o crescimento em> 20% estão indicados. Barras de erro são um SD de crescimento celular normalizado [ eixo y em (D)] e a mediana [eixo y em (A) e (C); eixo x em (C) e (D)] para três experiências independentes realizadas no mesmo dia.

 

Continua em: http://science.sciencemag.org/content/352/6281/aac7341

Usando GUIDs (Delphi)

Este exemplo demonstra o uso de algumas rotinas relacionadas ao GUID junto com o próprio tipo.

Código

procedimento  TForm2 . FormCreate ( Sender :  TObject ) ; 
var 
  MyGuid0 ,  MyGuid1  :  TGUID ;

begin 
  {Crie um novo GUID a partir da representação de string. } 
  MyGuid0  : =  StringToGUID ( '{00020400-0000-0000-C000-000000000046}' ) ; 
  Memo1 . Linhas . Adicione ( 'O GUID é:'  +  GUIDToString ( MyGuid0 )) ;

  { 
  Acessando os campos internos do GUID 
  Usando a função Format para obter a mesma saída que GUIDToString 
  } 
  Memo1 . Linhas . Adicionar ( Formatar ( 'GUID usando a formatação é:'  + 
       '{% 0.8X-% 0.4X-% 0.4X-% 0.2X% 0.2X-% 0.2X% 0.2X% 0.2X% 0.2X% 0.2X% 0.2 X} ' , 
       [ MyGuid0 . D1 ,  MyGuid0 . D2 ,  MyGuid0 . D3 , 
       MyGuid0 . D4 [ 0 ] ,  MyGuid0 . D4 [ 1 ] , MyGuid0 . D4 [ 2 ] ,  MyGuid0 . D4 [ 3 ] , 
       MyGuid0 . D4 [ 4 ] ,  MyGuid0 . D4 [ 5 ] ,  MyGuid0 . D4 [ 6 ] ,  MyGuid0 . D4 [ 7 ]])) ;

  {Autogerar um GUID aleatório em tempo de execução. } 
  se  CreateGUID ( MyGuid1 )  <>  0, em  seguida, 
     Memo1 . Linhas . Adicionar ( 'Criando GUID falhou!' ) 
  Else 
     Memo1 . Linhas . Add ( 'O guid gerado é:'  +  GUIDToString ( MyGuid1 )) ;

  {Gerando o segundo GUID aleatório. } 
  CreateGUID ( MyGuid0 ) ;

  {Testando se dois guias são iguais. } 
  se  IsEqualGUID ( MyGuid0 ,  MyGuid1 ), em  seguida, 
     Memo1 . Linhas . Add ( 'Isso não pode acontecer! CreateGUID garante que'  + 
                     '2 GUIDs gerados aleatoriamente não podem ser iguais!' ) ; 
End ;


Fonte:  http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/UsingGUIDs_(Delphi)

Maven no Windows – Como configurar

 

Se a variável de ambiente estiver lotada, basta alterar via registro do windows:

 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment]

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Environment]

DLL emulador SAT, fechando aplicação ao ser consumida

Bom dia amigos,

estou usando o emulador do SAT encontrado no site da SEFAZ para testar minha aplicação em C# .NET. Estou com um problema que, quando tento consumir a SAT.dll, todos os métodos importados da DLL por qual minha aplicação passa, ela fecha inesperadamente sem dar catch em nenhum exceção.

 

Estou importando a DLL dessa forma:

[DllImport("dllsat.dll", CallingConvention = CallingConvention.Cdecl)] public static extern string EnviarDadosVenda(int iNumSessao, string pcCodAtivacao, string pcDadosVenda);

No meu método, esta assim:

        public static void enviarDadosCFeToSat()
        {
            try
            {
                var xml = readFileXML();
                int numSessao = gerarNumeroSessao();
                string codAtivacao = "123456789";

                var resposta = EnviarDadosVenda(numSessao, codAtivacao, xml);
            }
            catch 
            {
                throw;
            }
        }

Ao passar pelo método EnviarDadosVenda(x, y, z), a resposta no LOG é:

  Citar

[2019-01-16 11:02:41.619]:Erro: Falha na estrutura do XML de venda.
[2019-01-16 11:02:41.626]:ERRO NA EMISSAO: 1999: null

Entendo que o XML possa estar errado, mas a minha aplicação fecha inesperadamente e não importa qual tratamento que dou, ele não apresenta a exceção. Alguém sabe como implementar de forma que a aplicação não feche? Mesmo os métodos que passam com sucesso pela dll acabam por fechar após chamar a DLL.

 

Grato

 

SOLUÇÃO:

 

Já resolvi! Se puderem fechar o post, agradeço. Se alguém passar por isso no futuro, segue a solução abaixo.

Tive que fazer as seguintes modificações no código:

        [DllImport("dllsat.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr EnviarDadosVenda(int iNumSessao, string pcCodAtivacao, string pcDadosVenda);

e no meu método:

        public static void enviarDadosCFeToSat()
        {
            try
            {
                readFileXML();
                int numSessao = 2;
                string codAtivacao = "123456789";

                IntPtr ptr = EnviarDadosVenda(numSessao, codAtivacao, xml);
                string s = Marshal.PtrToStringAnsi(ptr);
            }
            catch 
            {
                throw;
            }
        }

Fonte: https://www.projetoacbr.com.br/forum/topic/48771-dll-emulador-sat-fechando-minha-aplica%C3%A7%C3%A3o-ao-ser-consumida/?_fromLogin=1#_=_

Google adquire a DORA, o aplicativo móvel RPA da Automation Anywhere e o novo laboratório de robótica da NVIDIA

DevOps Research and Assessment (DORA) foi adquirida pelo Google. A aquisição permitirá que a DORA crie melhores experiências de usuário no Google Cloud para desenvolvedores e operações por meio de insights orientados por dados.

“As melhores e mais inovadoras organizações desenvolvem e entregam seus softwares com mais rapidez, confiabilidade e segurança, e com maior qualidade, com alto desempenho em tecnologia”, disse a Dra. Nicole Forsgren, CEO e cientista chefe da DORA. “Estamos entusiasmados por nos unirmos a uma equipe comprometida com o fornecimento de práticas de DevOps apoiadas por pesquisas e esperamos continuar nosso trabalho para entender os principais recursos, medir resultados orientados a valor e otimizar processos para ajudar as equipes a entregar seus softwares à medida que avançam. nuvem.”

A Automation Anywhere lança um aplicativo móvel para a empresa RPA
Robotic Automation (RPA) A Automation Anywhere anunciou um aplicativo móvel para o gerenciamento seguro de bots RPA construídos usando sua plataforma RPA inteligente. Segundo a empresa, o aplicativo irá ampliar o alcance da RPA na empresa.

“Estima-se que os indivíduos gastam uma média de quatro horas por dia em seus dispositivos móveis”, disse Abhijit Kakhandiki, vice-presidente sênior de Produtos e Engenharia para Automação em Qualquer Lugar. “A capacidade de controlar bots e gerenciar toda a força de trabalho digital a partir de um dispositivo móvel, sempre de fácil acesso, é um gamechanger”.

NVIDIA abre laboratório de pesquisa em robótica em Seattle A
NVIDIA anunciou que está abrindo um novo laboratório de pesquisa em robótica perto da Universidade de Washington em Seattle. O objetivo do laboratório é conduzir pesquisas de robótica para permitir que uma próxima geração de robôs seja capaz de executar tarefas complexas de manipulação e trabalhar com segurança entre seres humanos.

De acordo com a NVIDIA, cerca de 50 pesquisadores, professores visitantes e estagiários estudarão no laboratório. “No passado, a pesquisa em robótica se concentrava em projetos pequenos e independentes, em vez de sistemas totalmente integrados. Estamos reunindo uma equipe interdisciplinar colaborativa de especialistas em controle e percepção de robô, visão computacional, interação homem-robô e aprendizado profundo ”, disse Dieter Fox, diretor sênior de pesquisa em robótica da NVIDIA e professor da UW Paul G. Allen School of Ciência da Computação e Engenharia.

CONECTAR COM MYSQL – PYTHON

import mysql.connector

mydb = mysql.connector.conect(
host=”localhost”,
user=”SeuUsuario”,
passwd=”SuaSenha”,
database=’SeuBanco’
)
mycursor = mydb.cursor()

mycursor.execute(“SELECT * FROM customers”)
# or
# mycursor.execute(“SELECT name, address FROM customers”)
myresult = mycursor.fetchall()
for x in myresult:
print(x)

SELECIONAR NÚMEROS EM ARRAY DE STRINGS – PYTHON

Primeiramente fazemos o carregamento da biblioteca “re” em seguida atribuímos à variável text, a cadeia de caracteres contida dentro das aspas duplas. Na linha abaixo, atribuímos à variável numbers, o retorno do comando re.findall 

 

import re

text = "Phi@#$%3.14kjlw0xd65adfa01ckv0jle-19&*ghn334"
numbers = re.findall(r'\d+', text)

print(numbers)

Protocolo Open Graph

Introdução

protocolo Open Graph permite que qualquer página da Web se torne um objeto rico em um gráfico social. Por exemplo, isso é usado no Facebook para permitir que qualquer página da Web tenha a mesma funcionalidade que qualquer outro objeto no Facebook.

Embora muitas tecnologias e esquemas diferentes existam e possam ser combinados, não existe uma única tecnologia que forneça informações suficientes para representar ricamente qualquer página da Web dentro do gráfico social. O protocolo Open Graph baseia-se nessas tecnologias existentes e oferece aos desenvolvedores uma coisa a implementar. A simplicidade do desenvolvedor é uma meta importante do protocolo Open Graph, que informou muitas das decisões técnicas de design .


Metadados Básicos

Para transformar suas páginas da Web em objetos gráficos, você precisa adicionar metadados básicos à sua página. Baseamos a versão inicial do protocolo em RDFa, o que significa que você colocará <meta>tags adicionais na <head>sua página da web. As quatro propriedades necessárias para cada página são:

  • og:title – O título do seu objeto como deveria aparecer no gráfico, por exemplo, “The Rock”.
  • og:type– O tipo do seu objeto, por exemplo, “video.movie”. Dependendo do tipo que você especificar, outras propriedades também podem ser necessárias.
  • og:image – Um URL de imagem que deve representar seu objeto no gráfico.
  • og:url – O URL canônico do seu objeto que será usado como ID permanente no gráfico, por exemplo, “http://www.imdb.com/title/tt0117500/&#8221;.

Como exemplo, o seguinte é a marcação do protocolo Open Graph para The Rock no IMDB :

<html prefix="og: http://ogp.me/ns#">
<head>
<title>The Rock (1996)</title>
<meta property="og:title" content="The Rock" />
<meta property="og:type" content="video.movie" />
<meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
<meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
...
</head>
...
</html>

Metadados Opcionais

As propriedades a seguir são opcionais para qualquer objeto e geralmente são recomendadas:

  • og:audio – Um URL para um arquivo de áudio para acompanhar este objeto.
  • og:description – Uma descrição de uma ou duas frases do seu objeto.
  • og:determiner– A palavra que aparece antes do título deste objeto em uma frase. Um enum de (a, an, the, “”, auto). Se autofor escolhido, o consumidor de seus dados deve escolher entre “a” ou “an”. O padrão é “” (em branco).
  • og:locale– A localidade em que essas tags estão marcadas. Do formato language_TERRITORY. O padrão é en_US.
  • og:locale:alternate– Uma matriz de outras localidades em que esta página está disponível.
  • og:site_name– Se o seu objeto fizer parte de um site maior, o nome que deve ser exibido para o site geral. por exemplo, “IMDb”.
  • og:video – Um URL para um arquivo de vídeo que complementa esse objeto.

Por exemplo (quebra de linha apenas para fins de exibição):

<meta property="og:audio" content="http://example.com/bond/theme.mp3" />
<meta property="og:description" 
  content="Sean Connery found fame and fortune as the
           suave, sophisticated British agent, James Bond." />
<meta property="og:determiner" content="the" />
<meta property="og:locale" content="en_GB" />
<meta property="og:locale:alternate" content="fr_FR" />
<meta property="og:locale:alternate" content="es_ES" />
<meta property="og:site_name" content="IMDb" />
<meta property="og:video" content="http://example.com/bond/trailer.swf" />

O esquema RDF (em Turtle ) pode ser encontrado em ogp.me/ns .


Propriedades Estruturadas

Algumas propriedades podem ter metadados extras anexados a elas. Estes são especificados da mesma forma que outros metadados com propertycontent, mas o que propertyserá extra :.

og:imagepropriedade tem algumas propriedades estruturadas opcionais:

  • og:image:url– Idêntico a og:image.
  • og:image:secure_url – Um URL alternativo para usar se a página da Web exigir HTTPS.
  • og:image:type– Um tipo MIME para esta imagem.
  • og:image:width – O número de pixels de largura.
  • og:image:height – O número de pixels de altura.
  • og:image:alt– Uma descrição do que está na imagem (não é uma legenda). Se a página especificar uma imagem og: deve especificar og:image:alt.

Um exemplo de imagem completa:

<meta property="og:image" content="http://example.com/ogp.jpg" />
<meta property="og:image:secure_url" content="https://secure.example.com/ogp.jpg" />
<meta property="og:image:type" content="image/jpeg" />
<meta property="og:image:width" content="400" />
<meta property="og:image:height" content="300" />
<meta property="og:image:alt" content="A shiny red apple with a bite taken out" />

og:videotag tem as tags idênticas og:image. Aqui está um exemplo:

<meta property="og:video" content="http://example.com/movie.swf" />
<meta property="og:video:secure_url" content="https://secure.example.com/movie.swf" />
<meta property="og:video:type" content="application/x-shockwave-flash" />
<meta property="og:video:width" content="400" />
<meta property="og:video:height" content="300" />

og:audiotag tem apenas as 3 primeiras propriedades disponíveis (já que o tamanho não faz sentido para o som):

<meta property="og:audio" content="http://example.com/sound.mp3" />
<meta property="og:audio:secure_url" content="https://secure.example.com/sound.mp3" />
<meta property="og:audio:type" content="audio/mpeg" />

Matrizes

Se uma tag puder ter vários valores, basta colocar várias versões da mesma <meta>tag na sua página. A primeira tag (de cima para baixo) recebe preferência durante os conflitos.

<meta property="og:image" content="http://example.com/rock.jpg" />
<meta property="og:image" content="http://example.com/rock2.jpg" />

Coloque as propriedades estruturadas depois de declarar sua tag raiz. Sempre que outro elemento raiz é analisado, essa propriedade estruturada é considerada concluída e outra é iniciada.

Por exemplo:

<meta property="og:image" content="http://example.com/rock.jpg" />
<meta property="og:image:width" content="300" />
<meta property="og:image:height" content="300" />
<meta property="og:image" content="http://example.com/rock2.jpg" />
<meta property="og:image" content="http://example.com/rock3.jpg" />
<meta property="og:image:height" content="1000" />

significa que há 3 imagens nesta página, a primeira imagem é 300x300, a do meio tem dimensões não especificadas e a última tem 1000px de altura.


Tipos de Objetos

Para que o seu objeto seja representado dentro do gráfico, você precisa especificar seu tipo. Isso é feito usando a og:typepropriedade:

<meta property="og:type" content="website" />

Quando a comunidade concorda com o esquema de um tipo, ele é adicionado à lista de tipos globais. Todos os outros objetos no sistema de tipos são CURIEs da forma

<head prefix="my_namespace: http://example.com/ns#">
<meta property="og:type" content="my_namespace:my_type" />

Os tipos globais são agrupados em verticais. Cada vertical tem seu próprio namespace. Os og:typevalores para um namespace são sempre prefixados com o namespace e, em seguida, com um período. Isso é para reduzir a confusão com tipos de namespaces definidos pelo usuário que sempre possuem dois pontos.

Música

og:type valores:

music.song

  • music:duration– integer > = 1 – O comprimento da música em segundos.
  • music:album– music.album array – O álbum desta música é de.
  • music:album:disc– integer > = 1 – Em qual disco do álbum esta música está.
  • music:album:track– integer > = 1 – Qual faixa é essa música.
  • music:musician– perfil array – O músico que fez essa música.

music.album

  • music:song– music.song – A música deste álbum.
  • music:song:disc– integer > = 1 – O mesmo que music:album:discno reverso.
  • music:song:track– integer > = 1 – O mesmo que music:album:trackno reverso.
  • music:musician– profile – O músico que fez essa música.
  • music:release_date– datetime – A data em que o álbum foi lançado.

music.playlist

  • music:song– Idêntico aos do music.album
  • music:song:disc
  • music:song:track
  • music:creator– perfil – O criador desta playlist.

music.radio_station

  • music:creator– profile – O criador desta estação.

Vídeo

og:type valores:

video.movie

  • video:actor– matriz de perfil – Atores no filme.
  • video:actor:role– string – O papel que eles desempenharam.
  • video:director– matriz de perfil – Diretores do filme.
  • video:writer– matriz de perfil – Escritores do filme.
  • video:duration– integer > = 1 – duração do filme em segundos.
  • video:release_date– datetime – A data em que o filme foi lançado.
  • video:tag– array de strings – Marque as palavras associadas a este filme.

video.episode

  • video:actor– Idêntico ao video.movie
  • video:actor:role
  • video:director
  • video:writer
  • video:duration
  • video:release_date
  • video:tag
  • video:series– video.tv_show – A qual série este episódio pertence.

video.tv_show

Um programa de TV de vários episódios. Os metadados são idênticos ao video.movie .

video.other

Um vídeo que não pertence a nenhuma outra categoria. Os metadados são idênticos ao video.movie .

Sem vertical

Estes são objetos definidos globalmente que simplesmente não se encaixam em uma vertical, mas ainda são amplamente utilizados e acordados.

og:type valores:

article – URI do namespace: http://ogp.me/ns/article#

  • article:published_time– datetime – Quando o artigo foi publicado pela primeira vez.
  • article:modified_time– datetime – Quando o artigo foi alterado pela última vez.
  • article:expiration_time– datetime – Quando o artigo está desatualizado depois.
  • article:author– matriz de perfil – Escritores do artigo.
  • article:section– string – um nome de seção de alto nível. Por exemplo, tecnologia
  • article:tag– array de strings – Marque as palavras associadas a este artigo.

book – URI do namespace: http://ogp.me/ns/book#

profile – URI do namespace: http://ogp.me/ns/profile#

  • profile:first_name– string – Um nome normalmente dado a um indivíduo por um dos pais ou por ele escolhido.
  • profile:last_name– string – Um nome herdado de uma família ou casamento e pelo qual o indivíduo é comumente conhecido.
  • profile:username– string – Uma string única curta para identificá-los.
  • profile:gender– enum (masculino, feminino) – seu gênero.

website – URI do namespace: http://ogp.me/ns/website#

Nenhuma propriedade adicional além das básicas. Qualquer página da Web não marcada deve ser tratada como og:typewebsite.


Tipos

Os seguintes tipos são usados ​​ao definir atributos no protocolo Open Graph.

Tipo Descrição Literais
boleano Um booleano representa um valor verdadeiro ou falso verdadeiro, falso, 1, 0
Data hora Um DateTime representa um valor temporal composto de uma data (ano, mês, dia) e um componente de tempo opcional (horas, minutos) ISO 8601
Enum Um tipo que consiste em um conjunto limitado de valores de cadeia constante (membros de enumeração). Um valor de string que é um membro da enumeração
Flutuador Um número de ponto flutuante assinado de 64 bits Todos os literais que estão em conformidade com os seguintes formatos:

1.234
-1.234
1.2e3
-1.2e3
7E-10

Inteiro Um inteiro assinado de 32 bits. Em muitas linguagens, números inteiros acima de 32 bits se tornam flutuantes, então limitamos o protocolo Open Graph para facilitar o uso em vários idiomas. Todos os literais que estão em conformidade com os seguintes formatos:

1234
-123

Corda Uma seqüência de caracteres Unicode Todos os literais compostos de caracteres Unicode sem caracteres de escape
URL Uma seqüência de caracteres Unicode que identificam um recurso da Internet. Todos os URLs válidos que utilizam os protocolos http: // ou https: //

Discussão e apoio

Você pode discutir o Open Graph Protocol no grupo do Facebook ou na lista de discussão do desenvolvedor . Atualmente está sendo consumido pelo Facebook ( consulte a documentação deles ), Google ( consulte a documentação ) e mixi . Ele está sendo publicado pela IMDb, Microsoft, NHL, Posterous, tomates podres, TIME, Yelp e muitos outros.


Implementações

A comunidade de código aberto desenvolveu vários analisadores e ferramentas de publicação. Deixe o grupo do Facebook saber se você também criou algo incrível!

Fonte: http://ogp.me/

API do Twilio

API do Twilio : O Twilio é uma estrutura de comunicações em nuvem que permite aos desenvolvedores de software fazer e receber chamadas telefônicas programaticamente e enviar e receber mensagens de texto usando suas APIs de serviço da Web usando HTTP. Usando o Twilio, você pode criar aplicativos de telefonia e ter um sistema de telefonia on-line completo na nuvem. Oferece recursos como números sob demanda em mais de 40 países, aceita ligações telefônicas para números de twilio, grava mensagens de áudio, reúne respostas de usuários, processa lógica de back-end capturando número de telefone e respostas de usuários, conferência, fala para texto e uma API muito poderosa.

 

Fontehttps://www.twilio.com/

OrangeUI – Suíte de Componentes de Mídia

O desenvolvedor DelphiTeacher (fora da China), lançou uma nova versão de seu conjunto de componentes OrangeUI para o Delphi XE8 Firemonkey. O OrangeUI é um conjunto enorme de componentes personalizados para o Firemonkey que são otimizados para as plataformas Android, IOS, OSX e Windows. Alguns dos componentes que estão disponíveis no conjunto de componentes são Button, CheckBox, DrawPael, Editar, Image, ImageListViewer, Label, ListBox, ListView, Memorando, NotifyNumberIcon, PageControl, Painel, ProgressBar, PullLoadPanel, RadioButton, ScrollBar, ScrollControl, TrackBar, e talvez até 100 controles totais. Muitas das informações sobre o componente suite estão em chinês, mas você pode facilmente traduzir isso. Parece que o principal objetivo do conjunto de componentes do OrangeUI é criar um conjunto de controles mais dinâmico e rico em mídia para o Firemonkey (e talvez até melhor suporte a caracteres chineses). Muitas das imagens mostram todos os tipos de gráficos integrados nos vários controles. Parte da documentação também fala sobre um TabControl de rolagem suave personalizado. Existe um grande imagem de mídia disponível com toneladas de screenshots mostrando os diferentes controles. Há também um grande número de demos disponíveis mostrando todos os vários controles (confira o diretório OrangeProjectCommon para algum código Firemonkey útil). Este é um conjunto de componentes comerciais (e é bastante caro para a versão do código-fonte), mas há uma versão de avaliação gratuita disponível. Parece que a única maneira de comprar o pacote é contatar diretamente o autor. Não tenho certeza se este teste do conjunto de componentes funcionará com o Appmethod (embora a versão do código-fonte provavelmente funcione).

Introdução ao OrangeUI

Em 2013, a EMB lançou o XE4 e iniciou o capítulo do Delphi que pode desenvolver diretamente o Apple APP.

Ao mesmo tempo, a OrangeUI iniciou uma série de pesquisas e desenvolvimento intensivos, até 2017, que levaram quatro anos.

Durante o período, a EMB também lançou o XE5, XE6, XE7, XE8, D10 Seattle, até agora a versão D10.1 de Berlim,

O Delphi possui um conjunto de códigos e, ao mesmo tempo, desenvolve um aplicativo muito estável para as plataformas IOS e Android.

O OrangeUI também evoluiu da versão 1.0 para a versão 1.73 hoje.

 

Eu pessoalmente desenvolvi uma variedade de aplicativos usando o Delphi + OrangeUI, incluindo gerenciamento corporativo, mensagens instantâneas e ferramentas de aplicativos.

Eu acumulei muita experiência com esses projetos, encontrando os pontos problemáticos na interface e os empacotando em controles simples.

Portanto, o OrangeUI contém quase todos os controles de interface do usuário usados ​​no desenvolvimento de aplicativos, facilitando isso.

 

Por exemplo, a OrangeUI criou originalmente o modo de painel de design do ListView, que pode arrastar e soltar os elementos (imagens, textos, botões, caixas de entrada, etc.) para serem exibidos diretamente no painel.

Satisfaça a necessidade de implementar rapidamente uma variedade de listas complexas em aplicativos para dispositivos móveis.

Além disso, cada controle no OrangeUI só precisa definir uma propriedade simples para obter o efeito desejado.

Em vez de o EMB vem com controles, alterar a cor de fundo de um botão requer a criação de um estilo complexo.

Crie e carregue rapidamente, porque o controle OrangeUI herda diretamente o TControl, não o TStyledControl,

Não precisa carregar elementos do StyleBook padrão ao trazer seus próprios controles

 

Muitos usuários desenvolveram uma variedade de aplicativos bonitos e elegantes usando o Delphi + OrangeUI. Existem também muitos aplicativos na Apple AppStore.

No período em que este desenvolvimento APP é predominante, a fim de tornar mais desenvolvedores Delphi mais convenientes para desenvolver APP, construa uma interface APP,

Ao concentrar-se mais em negócios e P & D funcional, a OrangeUI decidiu usá-lo gratuitamente para desenvolvedores do Delphi.

 

Com o OrangeUI, você pode implementar de forma rápida e constante os seguintes recursos, todos gratuitos:

1 Home page APP nove grade menu, muitas vezes visto em APP mainstream, OrangeUI só precisa de um controle, em vez de pilha Imagem e Label para alcançar.

2 A função de carrossel de imagens de anúncios e é possível seguir a troca de dedos, que atualmente não é possível com outros controles.

3 O ListView suporta a configuração direta da URL da imagem.Com a função de download multi-thread subjacente, é fácil carregar de forma assíncrona a imagem sem sentir o clique.

4 O ListView da caixa de listagem vem com uma função de atualização pull-down e de carregamento suspenso, que leva apenas 2 segundos para carregar dados 2w no telefone.

5 Os dados no aplicativo são baseados principalmente no ListView.O modo de painel de design suportado pelo ListView ListView pode adicionar qualquer número de controles no painel de design, organizar o layout e manipular facilmente vários estilos.

6 Consiga um efeito de troca de página estável, para que seu aplicativo seja como uma experiência de usuário nativa (o mais importante para o aplicativo é a experiência do usuário).

7 Várias interfaces comuns, como caixas de espera, caixas de diálogo, caixas de menu, caixas de menu de foto, caixas de seleção, etc.

8 Ele pode gerar rapidamente ícones de programas e imagens de interface de inicialização de vários tamanhos usados ​​nas plataformas IOS e Android.

9 Shopping online, bate-papo com amigos, navegação por notícias, inspeção de comércio exterior, pedidos fixos, etc., incluindo todo o código-fonte.

10 Os controles de paginação que podem ser alternados por gesto podem ser adicionados ao seu aplicativo para facilitar a operação dos usuários.

11 A solução estável e flexível de desenvolvimento de quadros (recomendada pelo professor Li Wei) é uma boa maneira de decompor o formulário principal complexo em quatro ou cinco pequenas páginas, acelerar a velocidade de inserção da página, reduzir o uso da memória e pressionar a tecla de retorno automaticamente. Volte para a página anterior e deixe que você crie um aplicativo eficiente.

12 Imagem simples e prática HTTP upload e download de código fonte amostra para cliente e servidor (IndyHttpServer).

13 Envie um círculo de amigos, visualize o círculo de clientes do círculo de amigos e experimente o código fonte do servidor de segundo plano (DataSnap).

14 Um botão passando com um dedo em uma ScrollBox não aciona um evento de clique.

15 A caixa de edição não aciona um evento de entrada ao passar com um dedo na ScrollBox, e o evento de exibição / ocultação do teclado virtual é processado automaticamente sem bloquear a caixa de edição.

16 O ListView suporta a capacidade de adicionar itens em tempo de design e instantaneamente visualizar os efeitos, que não estão disponíveis com os controles internos e outros.

17 Existem mais de 200 usuários do OrangeUI, e não há mais de 100 aplicativos desenvolvidos pelos usuários, muitos deles estão nas prateleiras da AppStore e Tencent App.

18 Cada controle vem com um tutorial DEMO e documentação dedicado que é mais fácil de usar.

19 Fornecer tecnologia especial OrangeUI para apoiar o grupo QQ (número do grupo: 10900297), ou adicionar o meu QQ452330643 para fornecer suporte profissional de desenvolvimento de APP.

20 Atualize uma vez por mês ou duas, constantemente adicionando novos controles para se adaptar às novas tendências, bem como novos exemplos práticos.

Vamos dar uma olhada mais de perto no que os controles OrangeUI fazem:

O controle mais importante

Exibição de lista ListView

   Os estilos de item de lista podem ser projetados por meio de painéis

   Inúmeros textos, imagens e botões podem ser colocados no painel de design

   Caixas de seleção, botões de opção, barras de progresso, números de lembretes, textos coloridos, etc. também podem ser colocados no painel de design.

   Uma rotação de anúncios pode ser colocada no painel de design e pode lidar com conflitos de gestos entre o deslizamento horizontal e vertical da imagem

   Caixas de edição podem ser colocadas no painel de design para editar itens da lista

   Cada controle no painel de design pode gravar um evento de clique

   É muito conveniente implementar o efeito de clique do item da lista e selecionar o efeito.

   Pode ter vários estilos de itens de lista diferentes

   Cada item da lista pode ser definido para uma altura e largura diferentes

   Modo de exibição de ícone de suporte, você pode definir o número de itens por linha, fácil de conseguir nove layout de grade e tabela

   Suporte ao modo de exibição de fluxo em cascata

   Suporte para o modo de seleção central para seleção de opções

   Suporte horizontal modo de arranjo

   Você pode adicionar e modificar itens de lista durante a fase de design para visualizar o efeito instantaneamente

   Carregar automaticamente imagens de itens de lista de forma assíncrona

   Implementação simples de atualização pull-down e pull-up de mais dados

   Você pode personalizar a linha separadora do item da lista, o divisor de linhas e colunas

   Você pode definir o intervalo de itens da lista.

   Botão do menu panorâmico personalizável

Fonte: http://orangeui.cn/download/OrangeUI/

Citação

Downloads

Última atualização em: 19 de setembro, 2018

Bem vindo a central de Downloads da Migrate.

Aqui você irá encontrar diversos exemplos de XML de integração, exemplos de SOAP de envio e retorno, bem como poderá ficar por dentro do lançamento de novas versões acompanhando a NEWS de nossas aplicações.

InvoiCy Downloads

Download de Exemplos de Integração de NF-e (Layout 4.00):

– Exemplo SOAP de Envio de NF-e: Download
– Exemplo SOAP de Retorno da NF-e: Download
– Exemplo SOAP de Consulta de NF-e: Download
– Layout XML de Eventos: Download
– Tabela de Campos XML (layout 4.00): Download
– Arquivo XSD validador de schema (NF-e e NFC-e): Download
– Arquivo XSD validador de schema (Eventos NF-e): Download
– Arquivo XSD validade de schema (Consulta documentos): Download
– Exemplo básico de XML de NF-e: Download
– Exemplo de XML com todos os campos do layout 4.0: Download
– Exemplo de Cancelamento de NF-e: Download
– Exemplo de Consulta de NF-e: Download
– Exemplo de retorno da consulta de NF-e: Download
– Exemplo de parâmetros de retorno da consulta de NF-e: Download
– Exemplo Inutilização NF-e: Download
– Exemplo Envio de Inutilização: Download
– Layout XML de Consulta: Download
– Layout XML de Inutilização: Download
– Exemplo de NF-e Conjugada (Produto + Serviço): Download
– Tabela de Códigos Municípios IBGE: Download
– Layout de Retorno Leitura X: Download
– Layout de Pedido de Prorrogação e Cancelamento de Pedido de Prorrogação: Download
– Exemplos de retorno do Fisco para a NT 2015/001: Download
– Exemplo de CC-e: Download

Download de Exemplos de XML de NF-e (Layout 4.00):

– Armamentos: Exemplo Armamentos
– CEAN: Exemplo CEAN
– Combustível: Exemplo Combustível
– Compras: Exemplo Compras
– Conjugada (produto + serviço):
1 – Exemplo Conjugada
2 – Exemplo somente serviço
– CSOSN:
1 – 101
2 – 102
3 – 103
4 – 201
5 – 202
6 – 203
7 – 300
8 – 400
9 – 500
10 – 900
– CST:
1 – 00
2 – 10
3 – 20
4 – 30
5 – 40
Desoneração veículos
Normal
6 – 41
Desoneração veículos
Normal
7 – 50
Desoneração veículos
Normal
8 – 51
9 – 60
10 – 70
11 – 90
12 – ICMSPART
10
90
13 – ICMSST – Repasse de ICMS ST Retido
– Devolução de Mercadoria: Exemplo Devolução
– Duplicatas: Exemplo Duplicatas
– Exportação:
1 – Exportação empresa simples
2 – Exportação empresa Normal
– Fatura: Exemplo fatura
– Importação: Exemplo importação
– Informações complementares:
1 – Grupo do campo de uso livre do contribuinte
2 – Grupo do processo referenciado
3 – Informações adicionais de interesse do Fisco
4 – Informações adicionais do produto
5 – Informações complementares de interesse do contribuinte
– Cana: Exemplo cana
– Informações de transporte:
1 – Balsa
2 – Lacres
3 – Reboque
4 – Vagão
5 – Veículo
6 – Volume
– IPI:
1 – Devolução de IPI
2 – Não tributados
1 – 01
2 – 02
3 – 03
4 – 04
5 – 51
6 – 52
7 – 53
8 – 54
9 – 55
– Local de entrega: Exemplo local de entrega
– Local de retirada: Exemplo local de retirada
– Medicamento: Exemplo de medicamento
– NF-e com ICMSUF Dest: Exemplo NF-e com ICMSUFDest


Download de Exemplos de XML de NFS-e:

– Exemplo de Envio Recepção: Download
– Layout Cadastro de Empresas: Download
– Layout Recepção RPS: Download
– Layout Consulta: Download
– Layout Cancelamento: Download
– Layout Consulta de Municípios Integrados: Download
– Layout Consulta Natureza da operação: Download

Obs: Os layouts acima são para integração com a Plataforma InvoiCy (emite para app.invoicy.com.br ou homolog.invoicy.com.br), e os layouts abaixo – onde consta o termo “Antigo”, se referem a integração antiga do InvoiCy NFS-e (emite para gnfse.gnfe.com.br).

– Layout Cadastro de Empresas – Antigo: Download
– Layout Recepção RPS – Antigo: Download
– Layout Consulta – Antigo: Download
– Layout Cancelamento – Antigo: Download
– Layout Download XML – Antigo: Download
– Layout Download Espelho RPS – Antigo: Download


Download de Exemplos de XML de MDF-e:

– Tabela de campos XML (Layout 3.0): Download
– Tabela de campos XML de Eventos (Layout 3.0): Download
– Arquivo XSD validador de schema do MDF-e: Download
– Arquivo XSD validador de schema (Eventos MDF-e): Download
– Exemplos modal Aéreo: Download
– Exemplos modal Aquaviário: Download
– Exemplos modal Ferroviário: Download
– Exemplos modal Rodoviário: Download
– Layout Consultas MDF-e: Download
– Exemplo encerramento de MDF-e: Download
– Exemplo inclusão de condutor no MDF-e: Download


Download de Exemplos de Integração:

– Exemplo de integração em Delphi: Download
– Exemplo Conversão Base64 em Delphi: Download
– Exemplo de integração em Genexus: Download
– Exemplo de integração em PHP: Download
– Exemplo de integração em Java: Download
– Exemplo de integração em C#: Download
– Exemplo de integração em VB.NET: Download
– Projeto SOAP-UIDownload


Download de Exemplos de XML de CT-e:

– Exemplo SOAP de Envio de CT-e: Download
– Exemplo SOAP de Consulta de CT-e: Download
– Exemplo SOAP de Retorno do CT-e-: Download
– Exemplo SOAP de Inutilização de CT-e: Download
– Exemplo XML de envio básico modal Rodoviário: Download
– Arquivo XSD validador de schema (CT-e): Download
– Arquivo XSD validador de schema (Eventos CT-e): Download
– Arquivo XSD validador de schema (Evento CC-e): Download
– Tabela de Campos XML (layout 3.00): Download
– Exemplo de Cancelamento de CT-e: Download
– Exemplo de Consulta de CT-e: Download
– Exemplo de Parâmetros de Retorno da Consulta de CTe: Download
– Exemplo de Retorno da Consulta de CT-e: Download
– Exemplo Inutilização de CT-e: Download
– Exemplo envio CC-e: Download
– Layout XML de Consulta: Download
– Layout XML de Eventos: Download
– Layout XML de Eventos CC-e: Download
– Layout XML de Inutilização: Download


Download de Exemplos de Integração com InvoiCy Conector:

– NF-e / NFC-e layout 3.10: Download
– NF-e exemplo XML: Download
– Eventos NF-e Layout: Download
– Evento Cancelamento de NF-e XML: Download
– Evento Inutilização de NF-e XML: Download
– NFS-e: Download
– NFS-e Cancelamento: Download
– NFS-e Consulta: Download
– MDF-e 1.0 exemplo XML: Download
– Eventos MDF-e 1.0 : Download
– Eventos MDF-e 1.0  XML: Download
– Consulta de Status de Documentos: Download
– Exemplo para cadastro de empresa: Download
– MDF-e layout 3.0: Download
– MDF-e 3.0 modal Aéreo: Download
– MDF-e 3.0 modal Aquaviário: Download
– MDF-e 3.0 modal Ferroviário: Download
– MDF-e 3.0 modal Rodoviário: Download
– Exemplo encerramento de MDF-e 3.0 : Download
– Exemplo inclusão de condutor no MDF-e 3.0: Download


Download de Exemplos Gerais do InvoiCy:

– Layout de cadastro de empresa via Web Service: Download

 

 

via Downloads

Exemplos de XML de Integração

Construindo uma aplicação Ionic CRUD com Firestore

O Firestore é o novo banco de dados do Firebase. É um banco de dados orientado a documentos NoSQL para desenvolvimento móvel e web.

Ele é projetado para armazenar e sincronizar dados de aplicativos em escala global com facilidade. Algumas de suas principais características incluem:

  • Documentos e Coleções com consultas poderosas.
  • Acesso off-line ao WEB SDK.
  • Sincronização de dados em tempo real.

Hoje vamos aprender a integrar o Firestore com o Ionic para criar um fluxo de trabalho CRUD. Este aplicativo de amostra mostrará a você como:

  • Mostrando uma lista de itens do seu banco de dados ( que no Firestore é chamado exibindo uma coleção de documentos ).
  • Criando um novo item e adicionando-o à lista.
  • Navegar para a página de detalhes desse item.
  • Excluindo um item da nossa lista.

captura de tela mostrando as diferentes visualizações para o firestore CRUD

Vamos dividir este processo em X passos:

  • Etapa 1: crie e inicialize nosso aplicativo Ionic.
  • Etapa 2: adicione itens à lista.
  • Passo # 3: Mostre a lista de itens.
  • Passo # 4: Navegue até a página de detalhes de um item.
  • Etapa 5: excluir um item da lista.

Agora que sabemos o que vamos fazer, vamos pular para o modo de codificação.

Etapa 1: criar e inicializar seu aplicativo

O objetivo desta etapa é criar seu novo aplicativo iônico, instalar os pacotes necessários ( somente Firebase e AngularFire2 ) e inicializar nosso aplicativo do Firebase.

Com isso em mente, vamos criar nosso aplicativo primeiro, abrir seu terminal e navegar até a pasta que você usa para codificação ( ou em qualquer lugar que você quiser, para mim, essa é a pasta Desenvolvimento ) e criar seu aplicativo:

cd Development/
ionic start firestore-example blank
cd firestore-example 

Depois que criarmos o aplicativo, precisaremos instalar o Firebase. Para isso, abra o terminal novamente e ( enquanto estiver na raiz do projeto ), digite:

npm install angularfire2 firebase

Esse comando instalará as versões estáveis ​​mais recentes do AngularFire2 e do Firebase Web SDK.

Agora que instalamos tudo, vamos conectar o Ionic ao nosso aplicativo do Firebase.

A primeira coisa que precisamos é obter as credenciais do nosso aplicativo, fazer login no Firebase Console e navegar até o aplicativo do Firebase ( ou criar um novo caso você ainda não tenha o aplicativo ).

Na guia Visão geral do projeto, você verá a tela “Primeiros passos”, com opções para adicionar o Firebase a diferentes tipos de aplicativos, e selecione “Adicionar o Firebase ao seu aplicativo da web”.

De todo o código que aparece nessa janela pop-up, concentre-se nesse bit:

var config = {
  apiKey: "Your credentials here",
  authDomain: "Your credentials here",
  databaseURL: "Your credentials here",
  projectId: "Your credentials here",
  storageBucket: "Your credentials here",
  messagingSenderId: "Your credentials here",
};

Esse é o seu objeto de configuração do Firebase, ele tem todas as informações necessárias para acessar as diferentes APIs do Firebase, e precisaremos disso para conectar nosso aplicativo iônico ao nosso aplicativo do Firebase.

Vá para a sua src/apppasta e crie um arquivo chamado credentials.tsa idéia deste arquivo é manter todas as nossas credenciais em um só lugar, este arquivo não deve estar no controle de origem para adicioná-lo ao seu .gitignorearquivo.

Copie seu objeto de configuração para essa página. Vou mudar o nome para algo que faça mais sentido para mim:

export var firebasConfig = {
  apiKey: "AIzaSyBJT6tfre8uh3LGBm5CTiO5DUZ4",
  authDomain: "javebratt-playground.firebaseapp.com",
  databaseURL: "https://javebratt-playground.firebaseio.com",
  projectId: "javebratt-playground",
  storageBucket: "javebratt-playground.appspot.com",
  messagingSenderId: "3676553551"
};

Estamos exportando para que possamos importá-lo para outros arquivos onde precisarmos.

Agora é hora da parte final desta etapa, precisamos inicializar o Firebase, para isso, vamos entrar app.module.tse, primeiro, vamos importar os pacotes AngularFire2 que precisaremos e nosso objeto de credencial:

import { AngularFireModule } from 'angularfire2';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { firebaseConfig } from './credentials';

Como vamos usar apenas o banco de dados Firestore, importamos o módulo de base AF2 ( vou me referir a AngularFire2 como AF2 de agora em diante ) e o módulo Firestore. Se você também precisasse de autenticação ou armazenamento, você precisaria adicionar esses módulos aqui.

Dentro de sua @NgModule()aparência para sua importsmatriz e adicione o módulo AF2 e o módulo Firestore:

imports: [
  BrowserModule,
  IonicModule.forRoot(MyApp),
  AngularFireModule.initializeApp(firebaseConfig),
  AngularFirestoreModule,
],

Estamos chamando o .initializeApp(firebaseConfig)método e passando nosso objeto de credencial para que nosso aplicativo saiba como se conectar ao Firebase.

E é isso, pode não parecer muito ainda , mas nossos aplicativos Firebase e Ionic agora podem conversar entre si.

Etapa 2: adicione itens à lista.

É hora de começar a trabalhar com nossos dados, vamos construir um aplicativo CRUD, usaremos uma lista de músicas como um exemplo, mas os mesmos princípios se aplicam a qualquer fluxo de trabalho Mestre / Detalhe que você queira construir.

A primeira coisa que precisamos é entender como nossos dados são armazenados, o Firestore é um banco de dados NoSQL orientado a documentos, que é um pouco diferente do RTDB ( banco de dados em tempo real ).

Isso significa que temos dois tipos de dados em nosso banco de dados, documentos, que são objetos com os quais podemos trabalhar, e coleções que são os contêineres que agrupam esses objetos.

Por exemplo, se estivermos criando um banco de dados de músicas, nossa coleção seria chamada songs, ou songList, que conteria todos os objetos de música individuais e cada objeto teria suas propriedades, como o nome da música, o artista etc.

Em nosso exemplo, o objeto song terá cinco propriedades, um id, o álbum, o artista, uma descrição e o nome da música. No espírito de aproveitar os recursos de verificação de tipos do TypeScript, vamos criar uma interface que funcione como modelo para todas as nossas músicas.

Vá até a srcpasta e crie uma pasta chamada models, adicione um arquivo chamado song.interface.tse preencha-o com os seguintes dados:

export interface Song {
  id: string;
  albumName: string;
  artistName: string;
  songDescription: string;
  sonName: string;
}

Essa é a interface da música e garante que, sempre que estivermos trabalhando com um objeto de música, ele tenha todos os dados necessários.

Para começar a criar novas músicas e adicioná-las à nossa lista, precisamos ter uma página que contenha um formulário para inserir os dados da música, criar essa página com o Ionic CLI, abrir o terminal e digitar:

ionic generate page Create

Na verdade, enquanto estamos nisso, vamos dedicar alguns minutos para criar a página de detalhes, uma visualização detalhada de uma música específica e o provedor de Firestore, ele cuidará de todas as interações do banco de dados para que possamos gerenciar tudo desse arquivo.

ionic generate page Detail
ionic generate provider Firestore

Agora precisamos de uma maneira de ir da home page para o CreatePage, para que abrir home.htmle alterar seu cabeçalho para ficar assim:

<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      Song List
    </ion-title>
    <ion-buttons end>
      <button ion-button icon-only (click)="goToCreatePage()">
        <ion-icon name="add"></ion-icon>
      </button>
    </ion-buttons>
  </ion-navbar>
</ion-header>

Estamos adicionando um botão ao cabeçalho que aciona a goToCreatePage()função, para que funcione, vamos abrir o home.tsarquivo e escrever essa função:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
})
export class HomePage {
  constructor(public navCtrl: NavController) {}

  goToCreatePage(): void {
    this.navCtrl.push('CreatePage');
  }
}

A única coisa que esta função está fazendo é levá-lo para o CreatePage, agora que podemos chegar a essa página, é hora de construir sua funcionalidade. A funcionalidade consistirá em 3 coisas:

  • A exibição de HTML que mostra o formulário.
  • A classe TypeScript que coleta os dados do formulário e os envia ao provedor.
  • A função no provedor que cria a música e a adiciona à lista de músicas.

Vamos começar com o HTML, abrir o create.htmlarquivo e dentro das <ion-content></ion-content>tags criar o formulário:

<ion-content>
  <form [formGroup]="createSongForm" (submit)="createSong()" novalidate>
    <ion-item>
      <ion-label stacked>Song Name</ion-label>
      <ion-input formControlName="songName" type="text" 
        placeholder="What's this song called?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Artist Name</ion-label>
      <ion-input formControlName="artistName" type="text" 
        placeholder="Who sings this song?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Album Name</ion-label>
      <ion-input formControlName="albumName" type="text" 
        placeholder="What's the album's name?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Song Description</ion-label>
      <ion-textarea formControlName="songDescription" type="text" 
        placeholder="What's this song about?">
      </ion-textarea>
    </ion-item>


    <button ion-button block type="submit" [disabled]="!createSongForm.valid">
      Add Song
    </button>
  </form>

</ion-content>

Se você é novo em formas angulares, então aqui está o que está acontecendo:

  • [formGroup]="createSongForm" => Este é o nome do formulário que estamos criando.
  • (submit)="createSong()"=> Isso indica o formulário que, ao enviar, deve chamar a createSong()função.
  • formControlName => Este é o nome do campo.
  • [disabled]="!createSongForm.valid" => Isso define o botão a ser desativado até que o formulário seja válido.

Agora vamos para o create.tsarquivo, aqui coletamos os dados do nosso formulário e passamos para o nosso provedor. Primeiro, vamos importar tudo o que precisaremos:

import { Component } from '@angular/core';
import {
  IonicPage,
  NavController,
  Loading,
  LoadingController,
  AlertController,
  Alert,
} from 'ionic-angular';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { FirestoreProvider } from '../../providers/firestore/firestore';

Estamos importando:

  • Formulário métodos auxiliares de @angular/forms.
  • Carregando controlador para mostrar um widget de carregamento para nossos usuários enquanto o formulário processa os dados.
  • Alertar o controlador para exibir um alerta para o nosso usuário, se houver algum erro.
  • E o provedor Firestore para chamar a função que adicionará a música ao banco de dados.

Agora precisamos injetar todos esses provedores no construtor e inicializar nosso formulário:

public createSongForm: FormGroup; // This is the form we're creating.

constructor(
  public navCtrl: NavController,
  public loadingCtrl: LoadingController,
  public alertCtrl: AlertController,
  public firestoreProvider: FirestoreProvider,
  formBuilder: FormBuilder
) {
  this.createSongForm = formBuilder.group({
    albumName: ['', Validators.required],
    artistName: ['', Validators.required],
    songDescription: ['', Validators.required],
    songName: ['', Validators.required],
  });
}

E agora tudo que precisamos é a função que coleta os dados e os envia para o provedor, se você se lembrar da parte HTML, nós a chamamos createSong()

createSong(): void { }

A primeira coisa que queremos fazer dentro dessa função é acionar um componente de carregamento que permitirá ao usuário saber que os dados estão sendo processados ​​e, depois disso, extrairemos todos os dados de campo do formulário.

createSong(): void {
  const loading: Loading = this.loadingCtrl.create();
  loading.present();

  const albumName = this.createSongForm.value.albumName;
  const artistName = this.createSongForm.value.artistName;
  const songDescription = this.createSongForm.value.songDescription;
  const songName = this.createSongForm.value.songName;
}

E, por último, enviaremos os dados para o provedor, assim que a música for criada com sucesso, o usuário deverá navegar de volta para a página anterior, e se houver algo errado ao criá-lo, exibiremos um alerta com a mensagem de erro.

createSong(): void {
  const loading: Loading = this.loadingCtrl.create();
  loading.present();

  const albumName = this.createSongForm.value.albumName;
  const artistName = this.createSongForm.value.artistName;
  const songDescription = this.createSongForm.value.songDescription;
  const songName = this.createSongForm.value.songName;

  this.firestoreProvider
    .createSong(albumName, artistName, songDescription, songName)
    .then(
      () => {
        loading.dismiss().then(() => {
          this.navCtrl.pop();
        });
      },
      error => {
        loading.dismiss().then(() => {
          const alert: Alert = this.alertCtrl.create({
            message: error.message,
            buttons: [{ text: 'Ok', role: 'cancel' }],
          });
          alert.present();
        });
      }
    );
}

OBSERVAÇÃO: Como uma boa prática, manipule esses erros você mesmo, em vez de mostrar a mensagem de erro padrão para os usuários, certifique-se de fazer algo mais fácil de usar e usar suas mensagens personalizadas, somos técnicos, sabemos o que o erro significa, do tempo que nossos usuários não vão.

Nós quase terminamos essa parte, tudo que precisamos agora é criar a função dentro do provedor que recebe todos os dados do formulário que estamos enviando e usa para criar uma música em nosso banco de dados.

Abra providers/firestore/firestore.tse vamos fazer algumas coisas, precisamos:

  • Importar Firestore.
  • Importe nossa interface de música.
  • Injetar firestore no construtor.
  • E escreva a createSong()função que leva todos os parâmetros que enviamos do nosso formulário.
import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> { }
}

A função está tomando todos os parâmetros que estamos enviando. Agora vamos fazer algo que possa parecer incomum . Nós vamos usar a createId()função firestore para gerar um id para a nossa nova música.

import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> {
    const id = this.firestore.createId();
  }
}

O Firestore gera automaticamente IDs para nós quando enviamos itens para uma lista, mas eu gosto de criar primeiro o ID e depois armazená-lo dentro do item. Dessa forma, se eu puxar um item, posso obter sua ID e não tem que fazer quaisquer outras operações para obtê-lo.

Agora que criamos o id, vamos criar uma referência para essa música e definir todas as propriedades que temos, incluindo o id.

import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> {
    const id = this.firestore.createId();

    return this.firestore.doc(`songList/${id}`).set({
      id,
      albumName,
      artistName,
      songDescription,
      songName,
    });
  }
}

Essa última parte do código está criando uma referência ao documento identificado com esse ID em nossa songListcoleção e, depois de criar a referência, ele adiciona todas as informações que enviamos como parâmetros.

E é isso. Agora você pode adicionar músicas à nossa lista. E uma vez que cada música é criada, o usuário irá navegar de volta para a página inicial, onde vamos mostrar a lista de músicas armazenadas no banco de dados.

Passo # 3: Mostre a lista de itens.

Para mostrar a lista de músicas, seguiremos a mesma abordagem que usamos para nossa última funcionalidade, criaremos a exibição HTML, a classe TypeScript e a função dentro do provedor que se comunica com o Firebase.

Já que temos o provedor aberto a partir da funcionalidade anterior vamos começar por aí, queremos criar uma função chamada de getSongList()função que deva retornar uma coleção de músicas:

getSongList(): AngularFirestoreCollection<Song> {
  return this.firestore.collection(`songList`);
}

Note que para isso funcionar você precisa importar AngularFirestoreCollectiondo angularfire2/firestorepacote ( ou remover a verificação de tipo se você não se importa com isso ).

Agora, vamos para a página inicial e importamos tudo o que precisaremos:

import { Song } from '../../models/song.interface';
import { FirestoreProvider } from '../../providers/firestore/firestore';
import { Observable } from 'rxjs/Observable';

Queremos a Songinterface para uma verificação de tipo restrita, FirestoreProviderpara se comunicar com o banco de dados e Observabletambém para verificação de tipo, nosso provedor retornará um AngularFirestoreCollection que transformaremos em um observável para exibir em nossa visualização.

Então, dentro de nossa classe, queremos criar a songListpropriedade, vamos usá-la para exibir as músicas no HTML e injetar o provedor firestore no construtor.

public songList: Observable<Song[]>;
constructor(
  public navCtrl: NavController,
  public firestoreProvider: FirestoreProvider
) {}

E, por último, queremos esperar até que a página carregue e buscar a lista do nosso provedor:

ionViewDidLoad() {
  this.songList = this.firestoreProvider.getSongList().valueChanges();
}

.valueChanges()método pega o AngularFirestoreCollection e o transforma em um tipo Observable of Songs.

Agora podemos ir para home.htmldentro e dentro da <ion-content>nossa lista de músicas para exibir todas as músicas no banco de dados.

<ion-content>
  <ion-card *ngFor="let song of songList | async" 
    (click)="goToDetailPage(song)">
    <ion-card-header>
      {{ song.songName }}
    </ion-card-header>
    <ion-card-content>
      Artist Name: {{ song.artistName }}
    </ion-card-content>
  </ion-card>
</ion-content>

Estamos apenas mostrando o nome da música e o nome do artista, e estamos adicionando um evento de clique ao nosso cartão, uma vez que o usuário clica no cartão, ele deve acionar a goToDetailPage()função e passar todo o objeto da música como um parâmetro.

Nós não criamos essa função, então vamos criar um momento para criá-la em nossa homepage:

goToDetailPage(song: Song): void {
  this.navCtrl.push('DetailPage', { song: song });
}

A função navega o usuário até a página Detail e passa todo o objeto da música como um parâmetro de navegação. Na próxima seção, usaremos esse parâmetro de navegação para exibir os dados da música inteira na página de detalhes.

Por enquanto, pegue um biscoito ou algo assim, você já leu muito, e seus níveis de açúcar podem precisar de um impulso. Vejo vocês em alguns minutos na próxima seção🙂

Passo # 4: Navegue até a página de detalhes de um item.

Na etapa anterior, criamos uma função que nos leva à página de detalhes com as informações da música e, agora, vamos usar essas informações e exibi-las para o usuário ver.

Em vez de falar com o provedor para obter o registro da música, estamos passando a música inteira como um parâmetro de navegação, portanto, não precisamos importar nosso provedor do firestore agora.

A primeira coisa que faremos é detail.htmlcriar uma visualização básica que exiba todos os dados que temos para nossa música:

<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      {{ song.songName }}
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <h3> Artist </h3>
  <p>
    The song {{ song.songName }} was released by {{ song.artistName }}.
  </p>

  <h3> Album </h3>
  <p>
    It was part of the {{ song.albumName }} album.
  </p>

  <h3> Description </h3>
  <p>
    {{ song.songDescription }}
  </p>
</ion-content>

Estamos mostrando o nome da música na barra de navegação e adicionamos o restante dos dados ao conteúdo da página.

Agora vamos pular detail.tspara que possamos fazer o songcontrário, isso irá cometer erros.

Tudo que você precisa fazer é criar uma propriedade songdo tipo Song, para isso precisamos importar a Songinterface.

Então, você deseja obter o parâmetro de navegação que enviamos para a página e atribuir seu valor à songpropriedade que você criou.

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Song } from '../../models/song.interface';

@IonicPage()
@Component({
  selector: 'page-detail',
  templateUrl: 'detail.html',
})
export class DetailPage {
  public song: Song;
  constructor(public navCtrl: NavController, public navParams: NavParams) {
    this.song = this.navParams.get('song');
  }
}

Você deve fazer um teste agora mesmo, pois ionic serveseu aplicativo deve estar funcionando, e você deve ser capaz de criar novas músicas, mostrar a lista de músicas e entrar na página de detalhes de uma música.

Etapa 5: excluir um item da lista.

Na última parte do tutorial vamos adicionar um botão dentro da DetailPage, esse botão dará ao usuário a capacidade de remover músicas da lista.

Primeiro, abra detail.htmle crie o botão, nada muito chique, um botão regular que chame a função remove fará, configure-o imediatamente antes da tag de conteúdo iônico de fechamento.

<button ion-button block (click)="deleteSong(song.id, song.songName)">
    DELETE SONG
  </button>
</ion-content>

Agora vá para o detail.tse crie a deleteSong()função, ele deve levar 2 parâmetros, o ID da música e o nome da música:

deleteSong(songId: string, songName: string): void {}

A função deve acionar um alerta que solicita ao usuário uma confirmação e, se o usuário aceitar a confirmação, deverá chamar a função de exclusão do provedor e retornar à página anterior ( Nossa home page ou página de listagem ).

deleteSong(songId: string, songName: string): void {
    const alert: Alert = this.alertCtrl.create({
      message: `Are you sure you want to delete ${songName} from your list?`,
      buttons: [
        {
          text: 'Cancel',
          handler: () => {
            console.log('Clicked Cancel');
          },
        },
        {
          text: 'OK',
          handler: () => {
            this.firestoreProvider.deleteSong(songId).then(() => {
              this.navCtrl.pop();
            });
          },
        },
      ],
    });
    alert.present();
  }

NOTA: Certifique-se de importar Alert, AlertController e nosso FirestoreProvider para que isso funcione.

Agora, tudo o que precisamos fazer é ir ao nosso provedor e criar a função de exclusão:

deleteSong(songId: string): Promise<void> {
  return this.firestore.doc(`songList/${songId}`).delete();
}

A função usa o ID da música como um parâmetro e, em seguida, usa-a para criar uma referência a esse documento específico no banco de dados. Por último, chama o .delete()método nesse documento.

E é isso. Você deve ter uma funcionalidade Mestre / Detalhe totalmente funcional na qual possa listar objetos, criar novos objetos e excluir objetos do banco de dados.🙂

Próximos passos

Parabéns, esse foi longo, mas estou certo de que você agora entende mais sobre o Firestore e como usá-lo com o Firebase.

Se você quiser saber mais sobre o Firestore e começar a criar aplicativos Ionic mais completos, criei um Crash Course que aborda a teoria por trás do que vimos aqui e também inclui os disparadores do Cloud Functions para as regras de segurança do Firestore e do Firestore.

VOCÊ PODE RECEBER GRATUITAMENTE AQUI .

FONTE: https://javebratt.com/crud-ionic-firestore/

Instalando o e-cidade a partir dos fontes no Linux CentOS 7

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.

1. Instalação do CentOS 7.x

O CentOS, abreviação de Community ENTerprise Operating System, é uma distribuição Linux de classe Enterprise derivada de códigos fonte gratuitamente distribuídos pela Red Hat Enterprise Linux e mantida pelo CentOS Project. Como o uso em servidores pode exigir uma maior compatibilidade com o hardware, a versão indicada para o uso com esta documentação é a CentOS 7.x.

1.1 Obtendo a mídia de instalação

A mídia de instalação pode ser obtida diretamente do site do projeto e gravada em CD, DVD ou pendrive. No site http://www.centos.org/download/ esta disponível a versão mais recente, mas utilizaremos a versão 7 x86_64 disponível em http://mirror.globo.com/centos/7/isos/x86_64/ (CentOS-7-x86_64-Minimal-1611.iso) por questões de compatibilidade com o produto.

1.2 Instalando o CentOS 7.x

O processo de instalação do sistema operacional não é coberto por esta documentação, mas recomendamos a utilização da imagem mínima, em “pt_BR” Português do Brasil.

Dica: Maiores informações sobre a instalação e personalização do sistema operacional podem ser obtidas em:
http://wiki.centos.org/Documentation

1.3 Editando os arquivos de configuração

Durante o processo de configuração descrito nesta documentação, é necessário editar e modificar diversos arquivos de texto. Para realizar estas modificações, sugerimos a utilização do editor “vim”, mas você pode usar qualquer outro editor de texto de sua preferência.

Para instalar o editor de arquivos execute o comando:

[linux]# yum -y install vim

Dica: Mais informações sobre o editor de textos “vim” podem ser obtidas em:
http://www.vim.org/.

1.4 Desabilitando o SELinux

Atenção: Se você tiver problemas com a execução do Apache, certifique-se que o contexto de seus arquivos de configuração do Apache estão corretamente configurados no SELinux, ou altere o modo de execução do SELinux para permissivo, ou desative-o.

Para desativar o SELinux, edite o arquivo de configuração através do comando:

[linux]# vim /etc/selinux/config

Altere a linha de:

SELINUX=enforcing

Para:

SELINUX=disabled

Dica: Note que o valor correto é disabled, muitos usuários digitam apenas disable.

1.5 Instalando o repositório EPEL

Para instalar o repositório de Pacotes Adicionais para Enterprise Linux (EPEL), execute o comando abaixo:

[linux]# yum -y install epel-release

1.6 Instalando o repositório REMI

Para instalar o repositório, execute o comando abaixo:

[linux]# yum -y localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

1.7 Atualizando o sistema operacional

Após a instalação, recomendamos a atualização dos pacotes do sistema operacional, para realizar esta tarefa, execute o comando abaixo:

[linux]# yum -y update

1.8 Reinicie o servidor

Para reiniciar o servidor, utilize o comando:

[linux]# shutdown -r now

2. Instalação do PostgreSQL 9.5.x

PostgreSQL é um sistema gerenciador de banco de dados objeto relacional (SGBDOR), desenvolvido como projeto de código aberto sem custo de licença. Este é o programa que vai gerenciar e armazenar o banco de dados relacional utilizado pelo e-cidade.

Dica: Mais informações sobre o PostgreSQL podem ser obtidas em:
http://www.postgresql.org/.

2.1 Configurando o repositório

Para instalar o PostgreSQL 9.5.x e suas dependências, utilizaremos o gerenciador de pacotes yum, que nos prove as últimas atualizações dos pacotes requeridos através de um canal seguro e confiável.

2.1.1 Instale o repositório através do comando:
[linux]# yum -y localinstall https://yum.postgresql.org/9.5/redhat/rhel-7.2-x86_64/pgdg-centos95-9.5-3.noarch.rpm

Dica: Mais informações sobre o gerenciador de pacotes “yum” podem ser obtidas em:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-yum.html

2.2 Ajustando o encoding

2.2.1 Configurando e regerando o ‘locale’

Para o servidor do banco de dados, é necessário alterar a ordenação do locale, para realizar esta tarefa, edite o arquivo de configuração com o comando abaixo:

[linux]# vim /usr/share/i18n/locales/pt_BR

Localize o bloco de configuração LC_COLLATE e END LC_COLLATE, e adicione dentro do bloco as seguintes linhas:

reorder-after <U00A0>
<U0020><CAP>;<CAP>;<CAP>;<U0020>
reorder-end
2.2.2 Regerando o ‘locale’

Para criação do cluster do e-cidade precisamos ter o locale pt_BR ISO-8859-1 disponível no sistema, para regerar utilize o comando abaixo.

[linux]# localedef -i pt_BR -c -f ISO-8859-1 -A /usr/share/locale/locale.alias pt_BR.ISO-8859-1

2.3 Instalando o PostgreSQL 9.5.x

Para realizar a instalação do PostgreSQL 9.5.x através do gerenciador de pacotes execute os comandos:

[linux]# yum -y install postgresql95 postgresql95-contrib postgresql95-server

2.4 Criando e configurando o cluster

O e-cidade utiliza encoding LATIN1 (ISO-8859-1) no cluster do PostgreSQL 9.5.x. Por isso vamos criar e iniciar o cluster quer será utilizado pela aplicação.

Dica: Mais informações sobre a configuração do cluster:
http://www.postgresql.org/docs/9.5/static/sql-cluster.html

2.4.1 Vamos criar o novo cluster do banco de dados como LATIN1 usando os comandos:
[linux]# export LC_ALL=pt_BR.ISO-8859-1
[linux]# su - postgres -c "/usr/pgsql-9.5/bin/initdb -A trust -D /var/lib/pgsql/9.5/data -E LATIN1 --locale=pt_BR.ISO-8859-1 -U postgres"
2.4.2 Para a correta integração com o e-cidade, é necessário alterar algumas configurações do cluster criado através do comando:
[linux]# vim /var/lib/pgsql/9.5/data/postgresql.conf

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere # do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

listen_addresses = '*'
max_connections = 20
bytea_output = 'escape'
max_locks_per_transaction = 256
default_with_oids = on
escape_string_warning = off
standard_conforming_strings = off
2.4.3 Inicie o servidor PostgreSQL através do comando:
[linux]# systemctl start postgresql-9.5
2.4.4 Verifique o resultado da configuração usando o comando:
[linux]# psql -U postgres -h localhost -l

A saída do comando deve ser parecida com os valores abaixo.

   Nome    |   Dono   | Codificação |     Collate      |      Ctype       | Privilégios de acesso
-----------+----------+-------------+------------------+------------------+-----------------------
 postgres  | postgres | LATIN1      | pt_BR.ISO-8859-1 | pt_BR.ISO-8859-1 |
 template0 | postgres | LATIN1      | pt_BR.ISO-8859-1 | pt_BR.ISO-8859-1 | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres
 template1 | postgres | LATIN1      | pt_BR.ISO-8859-1 | pt_BR.ISO-8859-1 | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres
2.4.5 Adicione o serviço do PostgresSQL a inicialização do sistema operacional usando o comando:
[linux]# systemctl enable postgresql-9.5

2.5 Criando a estrutura de banco de dados para o e-cidade

Vamos criar os usuários necessários para o funcionamento do e-cidade através dos comandos:

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em:
http://cartilha.cert.br/senhas/.

psql -U postgres -c "CREATE ROLE ecidade WITH SUPERUSER LOGIN PASSWORD 'ecidade';"
psql -U postgres -c "CREATE ROLE plugin WITH LOGIN PASSWORD 'plugin';"
psql -U postgres -c "CREATE ROLE dbseller WITH LOGIN PASSWORD 'dbseller';"

Em seguida, utilize o comando abaixo para criar o banco de dados:

psql -U postgres -c "CREATE DATABASE ecidade OWNER ecidade;"

3. Instalação do Apache

Apache é o servidor web mais usado em sistemas Linux. Servidores web são usados para servir páginas Web que, normalmente, são solicitadas pelos computadores clientes através de navegador, como o Firefox, Chromium, etc.

Dica: Mais informações sobre o Apache podem ser obtidas em:
http://www.apache.org/.

3.1 Instalando o Apache

Para realizar a instalação do servidor web Apache através do gerenciador de pacotes, execute o comando:

[linux]# yum -y install httpd

3.2 Configurando o Apache

3.2.1 Para a correta integração com o e-cidade, é necessário alterar algumas configurações do apache, edite o arquivo de configuração através do comando:
[linux]# vim /etc/httpd/conf/httpd.conf

Localize o bloco abaixo:

<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

E altere para:

<Directory "/var/www/html">
    Options -Indexes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
</Directory>

LimitRequestLine 16382
LimitRequestFieldSize 16382
Timeout 12000
AddDefaultCharset ISO-8859-1
SetEnv no-gzip 1

Localize o bloco abaixo:

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

E altere para:

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Dica: Mais informações sobre o VirtualHost podem ser obtidas em:
http://httpd.apache.org/docs/current/vhosts/examples.html.

3.3 Adicione o serviço do Apache a inicialização do sistema operacional usando o comando:

[linux]# systemctl enable httpd

4. Instalação do PHP 5.6 e PHP-FPM

PHP é uma linguagem interpretada livre, usada originalmente apenas para o desenvolvimento de aplicações presentes e atuantes no lado do servidor, capazes de gerar conteúdo dinâmico na World Wide Web.

O PHP-FPM é uma alternativa ao PHP FastCGI com muitas funcionalidades voltadas a sites com grande número de acessos e carga.

Dica: Mais informações sobre o PHP podem ser obtidas em:
http://www.php.net/ e http://php-fpm.org/

4.1 Instalando o PHP 5.6 e o PHP-FPM

Para realizar a instalação do PHP 5.6 através do gerenciador de pacotes, execute o comando:

[linux]# yum -y install php56 php56-php-cli php56-php-common php56-php-pear php56-php-pecl-jsonc php56-php-pecl-zip php56-php-process php56-php-xml php56-runtime php56-php-bcmath php56-php-gd php56-php-interbase php56-php-pecl-jsonc php56-php-mbstring php56-php-mcrypt php56-php-pgsql php56-php-soap php56-php-pecl-sqlite php56-php-xmlrpc php56-php-pecl-zip php56-php-fpm unzip zip xz xz-lzma-compat bzip2

4.2 Configurando o PHP 5.6 e o PHP-FPM

4.2.1 Habilitar as dependências de configuração através do comando:
[linux]# vim /etc/httpd/conf.d/php5.6-fpm.conf
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>
    <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
        SetHandler "proxy:fcgi://127.0.0.1:9000/"
    </FilesMatch>
    <Proxy "fcgi://127.0.0.1:9000/">
    </Proxy>
    <FilesMatch ".+\.phps$">
        Require all denied
    </FilesMatch>
    <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>
4.2.2 Configurar o arquivo de pool do PHP-FPM através dos comandos:
[linux]# vim /opt/remi/php56/root/etc/php-fpm.d/www.conf

Localize as linhas abaixo:

php_admin_value[error_log] = /opt/remi/php56/root/var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on

E altere para:

;php_admin_value[error_log] = /opt/remi/php56/root/var/log/php-fpm/www-error.log
;php_admin_flag[log_errors] = on
4.2.3 Configurar o arquivo de log do PHP-FPM através dos comandos:
[linux]# touch /var/log/php_errors.log
[linux]# chown apache.apache /var/log/php_errors.log
4.2.4 Para a correta integração com o e-Cidade, é necessário alterar algumas configurações do PHP através do comando:
[linux]# vim /opt/remi/php56/root/etc/php.ini

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere ; do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

short_open_tag = On
session.gc_maxlifetime = 7200
date.timezone = "America/Sao_Paulo"
[linux]# ln -s /opt/remi/php56/root/usr/bin/php /usr/bin/php
4.2.6 Reinicie o serviço do PHP-FPM e do Apache usando os comandos:
[linux]# systemctl restart php56-php-fpm
[linux]# systemctl restart httpd

4.3 Adicione o serviço do PHP-FPM a inicialização do sistema operacional usando o comando:

[linux]# systemctl enable php56-php-fpm

5. Instalação do LibreOffice

O LibreOffice é uma suite de escritório livre compatível com as principais suítes de escritório do mercado. Oferece todas as funções esperadas de uma suite profissional: editor de textos, planilha, apresentação, editor de desenhos e banco de dados.
No e-cidade, o LibreOffice é utilizado para exportar documentos baseados em modelos de formulários.

Dica: Mais informações sobre o LibreOffice podem ser obtidas em:
https://pt-br.libreoffice.org/.

5.1 Instalando dependências

Antes de instalarmos o pacote do LibreOffice, devemos instalar uma dependência através do comando:

[linux]# yum -y localinstall https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm

5.2 Instalando o LibreOffice

Para realizar a instalação do LibreOffice através do gerenciador de pacotes, execute o comando:

[linux]# yum -y install libreoffice-writer

6. Instalação do e-cidade

6.1 Obtendo o pacote de instalação

O pacote de instalação pode ser obtido diretamente do site do Portal do Software Público. No endereço da comunidade do e-cidade (https://softwarepublico.gov.br/social/e-cidade) estão disponíveis as últimas versões e suas atualizações. Como estamos realizando uma nova instalação, você deve baixar o pacote completo, um exemplo de nome do pacote seria: e-cidade-x.x.xx-linux.completo.tar.bz2.

6.2 Configurando o servidor

6.2.1 Vamos criar um usuário administrativo para o e-cidade, neste exemplo criaremos o usuário dbseller através do comando:
[linux]# useradd -d /home/dbseller -g apache -G wheel -k /etc/skel -m -s /bin/bash dbseller
6.2.2 Em seguida, vamos definir uma senha para este novo usuário usando o comando:
[linux]# passwd dbseller

Dica: Neste exemplo, defina a senha como o mesmo nome de usuário, como “dbseller”.

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em: http://cartilha.cert.br/senhas/.

6.2.3 Agora vamos habilitar a autenticação do grupo wheel editando o arquivo usando o comando:
[linux]# vim /etc/pam.d/su

Localize e descomente a linha como mostrado abaixo.

auth            required        pam_wheel.so use_uid
6.2.4 Para encaminhar os e-mails destinados ao usuário root para o usuário dbseller, edite o arquivo através do comando:
[linux]# vim /etc/aliases

Mova o cursor até o fim do arquivo e insira alinha como mostrado abaixo.

root:           dbseller

Em seguida, execute o comando:

[linux]# newaliases
6.2.5 Também devemos corrigir a máscara de criação de arquivos modificando os arquivos através dos comandos:
[linux]# vim /etc/login.defs

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere a linha do arquivo do arquivo de configuração, descomentando-a se necessário (remover o caractere # do início da linha), substituindo o valor correspondente conforme a indicação abaixo.

UMASK           002

Em seguida, execute o comando abaixo para ajustar os arquivos criados pelo apache:

[linux]# echo "umask 002" >> /etc/sysconfig/httpd

6.3 Instalando o e-cidade

6.3.1 Descompacte o pacote do e-cidade através do comando:
[linux]# tar xjf e-cidade-x.x.xx-linux.completo.tar.bz2
6.3.2 Copie o diretório do e-cidade para o diretório raiz do Apache usando o comando:
[linux]# cp -r e-cidade-x.x.xx-linux.completo/e-cidade /var/www/html/

6.4 Configurando o e-cidade

6.4.1 Crie o arquivo de configuração de acesso ao banco de dados através do comando:
[linux]# cp -a /var/www/html/e-cidade/libs/db_conn.php.dist /var/www/html/e-cidade/libs/db_conn.php

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]# vim /var/www/html/e-cidade/libs/db_conn.php

Em seguida, atualize as configurações conforme o exemplo abaixo.

$DB_USUARIO = "ecidade";
$DB_SENHA = "ecidade";
$DB_SERVIDOR = "localhost";
$DB_PORTA = "5432";
$DB_PORTA_ALT = "5432";
$DB_BASE = "ecidade";
6.4.2 Crie o arquivo de configuração de acesso dos plugins através do comando:
[linux]# cp -a /var/www/html/e-cidade/config/plugins.json.dist /var/www/html/e-cidade/config/plugins.json

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]# vim /var/www/html/e-cidade/config/plugins.json

Em seguida, atualize as configurações conforme o exemplo abaixo.

{
  "AcessoBase" : {
    "usuario" : "plugin",
    "senha" : "plugin"
  }
}
6.4.3 Configure o servidor de envio de e-mails do e-cidade através do comando:
[linux]# vim /var/www/html/e-cidade/libs/config.mail.php

Em seguida, atualize as configurações, com os dados do seu servidor de e-mail, conforme o exemplo abaixo.

$sClass = 3;
$sSslt  = ''; // qual o tipo de ssl q sera utilizados ( ex: tls), por padrao é vazio
$bAuth  = true; // autenticacao habilitada
$sUser  = 'exemplo@exemplo.com.br';
$sPass  = 'senhaexemplo';
$sHost  = 'smtp.exemplo.com.br';
$sPort  = '25';
6.4.4 Faça a carga do schema do e-cidade através do comando:
[linux]# psql -U ecidade -d ecidade -f e-cidade-x.x.xx-linux.completo/sql/e-cidade-x.x.xx.sql 2> /tmp/erros.txt

Após a carga, execute o comando abaixo para otimizar as consultas:

[linux]# psql -U ecidade -d ecidade -c "VACUUM ANALYZE VERBOSE;"
6.4.5 Ajuste as permissões dos diretórios através dos comandos:
[linux]# chown -R dbseller.apache /var/www/html/e-cidade
[linux]# chmod -R 775 /var/www/html/e-cidade
[linux]# chmod -R 777 /var/www/html/e-cidade/tmp

6.5 Agendando a migração da auditoria

6.5.1 Edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para migracao do acount para nova estrutura "db_auditoria"
*/30 * * * * cd /var/www/html/e-cidade/integracao_externa/auditoria; ./auditoria_migracao.sh 0 10 1 > log/auditoria_migracao.log 2>&1
*/10 * * * * cd /var/www/html/e-cidade/integracao_externa/auditoria; php -q auditoria_adiciona_fila.php > log/auditoria_adiciona_fila.log 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

6.6 Agendando a verificação do gerenciador de tarefas

6.6.1 Para criar o script de verificação execute os comandos:
[linux]# mkdir -p /opt/dbseller/scripts
[linux]# vim /opt/dbseller/scripts/ativadorGerenciadorTarefasEcidade.sh

Em seguida, adicione as linhas indicadas abaixo.

#!/bin/bash
sDiretorioEcidade="/var/www/html/e-cidade"
if [ ! -d $sDiretorioEcidade ]; then
  echo "Diretorio $sDiretorioEcidade nao existe"
  exit 1;
fi

sContador=$(ps aux | grep '<defunct>' | grep -v 'grep' | wc -l)
if [ "$sContador" -gt "5" ]; then
  sPid=$(ps aux | grep "con4_gerenciadortarefas002.php" | grep -v "grep" | awk '{print $2}');
  kill ${sPid}
fi

sTarefa=$(ps aux | grep "con4_gerenciadortarefas002.php" | grep -v "grep");
if [ "$sTarefa" == "" ]; then
  cd $sDiretorioEcidade;
  /usr/bin/php -q FrontIntegracaoExterna.php --executable con4_gerenciadortarefas002.php > tmp/log_gerenciador_tarefas.log 2> tmp/erros_gerenciador_tarefas.log &
fi

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

6.6.2 Antes de agendar o script de verificação, ajuste a permissão utilizando o seguinte comando:
[linux]# chmod +x /opt/dbseller/scripts/ativadorGerenciadorTarefasEcidade.sh

Em seguinda, edite o crontab do usuário root através do comando:

[linux]# crontab -e

E adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script de verificacao do gerenciador de tarefas
*/15 * * * * cd /opt/dbseller/scripts && su -s /bin/bash apache -c "bash ativadorGerenciadorTarefasEcidade.sh"

6.7 Acessando o e-cidade

Após finalizar os procedimentos de instalação e configuração, abra um navegador e acesse o e-cidade através do endereço IP ou nome do servidor. EX: http://ip_do_servidor/e-cidade, utilize como nome de usuário dbseller, e deixe o campo senha em branco.

Atenção: Certifique-se que o bloqueador de pop-up esteja permitindo o acesso ao endereço IP ou nome do servidor em que o e-cidade foi instalado.

7. Instalação do e-cidadeonline

7.1 Instalando o e-cidadeonline

7.1.1 Copie o diretório do e-cidadeonline para o diretório raiz do Apache usando o comando:
[linux]# cp -r e-cidade-x.x.xx-linux.completo/e-cidadeonline /var/www/html/

7.2 Configurando o e-cidadeonline

7.2.1 Crie o arquivo de configuração de acesso ao banco de dados através do comando:
[linux]# cp -a /var/www/html/e-cidadeonline/libs/db_conn.php.dist /var/www/html/e-cidadeonline/libs/db_conn.php

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]# vim /var/www/html/e-cidadeonline/libs/db_conn.php

Em seguida, atualize as configurações conforme o exemplo abaixo.

$DB_INSTITUICAO = 1;
$DB_SERVIDOR = "localhost";
$DB_BASEDADOS = "ecidade";
$DB_USUARIO = "ecidade";
$DB_PORTA = "5432";
7.2.2 Configure o servidor de envio de e-mails do e-cidadeonline através do comando:
[linux]# vim /var/www/html/e-cidadeonline/libs/config.mail.php

Em seguida, atualize as configurações, com os dados do seu servidor de e-mail, conforme o exemplo abaixo.

$sClass = 3;
$sSslt  = ''; // qual o tipo de ssl q sera utilizados ( ex: tls), por padrao é vazio
$bAuth  = true; // autenticacao habilitada
$sUser  = 'exemplo@exemplo.com.br';
$sPass  = 'senhaexemplo';
$sHost  = 'smtp.exemplo.com.br';
$sPort  = '25';
7.2.3 Ajuste as permissões dos diretórios através dos comandos:
[linux]# chown -R dbseller.apache /var/www/html/e-cidadeonline
[linux]# chmod -R 775 /var/www/html/e-cidadeonline
[linux]# chmod -R 777 /var/www/html/e-cidadeonline/tmp

7.3 Acessando o e-cidadeonline

Após finalizar os procedimentos de instalação e configuração, abra um navegador e acesse o e-cidadeonline através do endereço IP ou nome do servidor. EX: http://ip_do_servidor/e-cidadeonline, utilize como nome de usuário dbseller, e deixe o campo senha em branco.

8. Configurando a carga de integrações

Dica: Preste atenção aos horários de agendamento do crontab de múltiplas integrações. Procure verificar o tempo de duração da execução de cada integração, ajustando o horário de excução conforme a necessidade.

Dica: Sempre que possível, execute manualmente a linha agendada para certificar o correto funcionamento do agendamento.

8.1 Configurando a integração de carga do cubo do BI

8.1.1 Crie o arquivo de configuração de acesso FTP para a carga do cubo do BI através do comando:
[linux]# cp -a /var/www/html/e-cidade/libs/db_cubo_bi_config.php.dist /var/www/html/e-cidade/libs/db_cubo_bi_config.php

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]# vim /var/www/html/e-cidade/libs/db_cubo_bi_config.php

Em seguida, atualize as configurações conforme o exemplo abaixo.

$configCuboBi['ftp']['server']        = "endereco.ip.do.servidor";
$configCuboBi['ftp']['usuario']       = "nome-usuario-ftp";
$configCuboBi['ftp']['senha']         = "senha-do-usuario-ftp";
$configCuboBi['ftp']['diretorio']     = "diretorio-de-destino";
$configCuboBi['ftp']['passive_mode']  = true;

8.2 Configurando a integração de carga do Webservice HORUS BASICO

8.2.1 Crie o arquivo de configuração de através do comando:

Dica: Mais informações sobre o Werbservice HORUS BASICO podem ser obtidas em:
http://portalsaude.saude.gov.br/index.php/o-ministerio/principal/leia-mais-o-ministerio/218-sctie-raiz/daf-raiz/ceaf-sctie/qualifarsus-raiz/eixo-informacao/l1-eixo-informacao/8508-envio-de-dados-webservice

[linux]# cp -a /var/www/html/e-cidade/libs/db_config_horus.php.dist /var/www/html/e-cidade/libs/db_config_horus.php

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]# vim /var/www/html/e-cidade/libs/db_config_horus.php

Em seguida, atualize as configurações conforme o exemplo abaixo.

Atenção: Consulte a documentação das URLs no portalsaude.saude.gov.br antes de utilizar a integração.

// Homologação
$sUrlWebService = "http://189.28.128.37/horus-ws-basico/RecebeDadosWS?wsdl";
$sLogin         = "nome-usuario-horus";
$sSenha         = "senha-do-usuario-horus";

8.3 Configurando as integrações de limpeza de cadastros duplos CGM e CGS

8.3.1 Para agendar a limpeza de cadastros duplos CGM, edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para limpeza de cadastro duplos CGM
0 22 * * * cd /var/www/html/e-cidade/ ; /usr/bin/php FrontIntegracaoExterna.php --executable duplos.php > duplos.log 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.3.2 Para agendar a limpeza de cadastros duplos CGS, edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para limpeza de cadastro duplos CGS
0 22 * * * cd /var/www/html/e-cidade/ ; /usr/bin/php FrontIntegracaoExterna.php --executable duploscgs.php > duploscgs.log 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.4 Configurando a integração GISS

O script de execução da integração GISS possui dois parametros de configuração:

1) Se o programa for agendado sem nenhum parâmetro, ou com o parametro 1, a integração processará somente os registros alterados.

.../iss4_gissonline002.php 1 > /dev/null 2>&1

2) Se o programa for agendado com o parâmetro 2, a integração processará todos os registros.

.../iss4_gissonline002.php 2 > /dev/null 2>&1
8.4.1 Edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para execução da integração GISS
0 22 * * * cd /var/www/html/e-cidade/ ; /usr/bin/php FrontIntegracaoExterna.php --dir integracao_externa/gissonline --executable integracao_externa/gissonline/iss4_gissonline002.php > /dev/null 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.5 Configurando a integração SIGCORP

8.5.1 Edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para execução da integração SIGCORP
0 22 * * * cd /var/www/html/e-cidade/ ; /usr/bin/php FrontIntegracaoExterna.php --dir integracao_externa/sigcorp --executable integracao_externa/sigcorp/iss4_sigcorp001.php > /dev/null 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.6 Configurando a integração WEBISS

8.6.1 Edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para execução da integração WEBISS
0 22 * * * cd /var/www/html/e-cidade/ ; /usr/bin/php FrontIntegracaoExterna.php --executable integracao_externa/webiss/iss4_webiss001.php > /dev/null 2>&1

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.7 Configurando a integração de geração das tabelas débitos

8.7.1 Para agendar a geração das tabelas débitos, edite o crontab do usuário dbseller através do comando:
[linux]# crontab -u dbseller -e

Em seguida, adicione o seguinte bloco ao final do arquivo:

# DBSeller - Agendamento do script para geração das tabelas débitos
0 20 * * * cd /var/www/html/e-cidade/integracao_externa/debitos ; ./debitos.sh &> /dev/null

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

8.7.2 Configurando a integração débitos

O script de execução da integração débitos necessita de um arquivo de configuração para ser executado.
Para criar o script de configuração, execute os comandos abaixo:

[linux]# cd /var/www/html/e-cidade/integracao_externa/debitos/libs
[linux]# cp -a debitos.conf.dist debitos.conf

Em seguida edite o arquivo através do comando:

[linux]# vim debitos.conf

Informe o valor das variáveis conforme as descrições abaixo:

# Permite definir a periodicidade com que a manutencao da tabela debitos
# sera executada. O valores permitidos sao: -1=desativa, 0=todos ou dia da semana (1=segunda, 2=terca ... 7=domingo).
#
# Exemplo:
# DEBITOS_PERIODO="7"
#
DEBITOS_PERIODO=""

# Permite definir o numero de dias no passado para manter os registros na debitos.
#
# Exemplo:
# DEBITOS_DIAS_MANTER="14"
#
DEBITOS_DIAS_MANTER=""

# Permite definir o codigo da(s) instituicao(oes) que deve(em) ser gerada debitos. Se houver
# mais de uma instituicao, os seus codigos devem ser separados por espa�o.
#
# Exemplo:
# DEBITOS_INSTITUICOES="1"
# DEBITOS_INSTITUICOES="1 3"
#
DEBITOS_INSTITUICOES=""

Atenção: Lembre-se de ajustar o caminho para o diretório do e-cidade conforme o ambiente em que foi instalado.

Glossário

Termo Significado
encoding http://en.wikipedia.org/wiki/Character_encoding
cluster http://www.postgresql.org/docs/8.2/interactive/creating-cluster.html
apt-get http://www.debian.org/doc/manuals/apt-howto
apt-get http://pt.wikipedia.org/wiki/Advanced_Packaging_Tool
vim http://www.vim.org
Firefox http://www.mozilla.org/firefox
DBSeller Sistemas http://www.dbseller.com.br
proxy http://pt.wikipedia.org/wiki/Proxy
squid http://pt.wikipedia.org/wiki/Squid

Instalando o Nota Fiscal de Serviços Eletrônica (NFS-e) a partir dos fontes no Linux

 

A Nota Fiscal de Serviços Eletrônica possui integração com entes públicos que utilizam o sistema e-Cidade, gerando cobranças automáticas no momento da emissão de guias e facilitando o processo de fiscalização. Além disso, o produto permite a integração com outros sistemas de gestão pública, visando sempre atender às necessidades dos nossos clientes.

1. Instalação do Ubuntu Server 16.04.x LTS

O Ubuntu Server é a versão do sistema operacional da Canonical voltada para servidores. Como o uso em servidores exige um tempo maior de suporte, a versão indicada para o uso com esta documentação é a Ubuntu Server 16.04.x LTS.

1.1 Obtendo a mídia de instalação

A mídia de instalação pode ser obtida diretamente do site da Canonical e gravada em CD, DVD ou pendrive. No site http://www.ubuntu.com/download/server esta disponível a versão mais recente, mas utilizaremos a versão 16.04.x LTS disponível em http://releases.ubuntu.com/xenial/ (ubuntu-16.04.2-server-amd64.iso) por questões de compatibilidade com o produto.

1.2 Instalando o Ubuntu Server 16.04.x LTS

O processo de instalação do sistema operacional não é coberto por esta documentação, mas recomendamos a instalação mínima padrão, em “pt_BR” Português do Brasil, somente com os softwares “standard system utilities” e “OpenSSH server”.

Dica: Maiores informações sobre a instalação e personalização do sistema operacional podem ser obtidas em:
https://help.ubuntu.com/16.04/serverguide/

1.3 Editando os arquivos de configuração

Durante o processo de configuração descrito nesta documentação, é necessário editar e modificar diversos arquivos de texto. Para realizar estas modificações, sugerimos a utilização do editor “nano”, mas você pode usar qualquer outro editor de texto de sua preferência.

Dica: Mais informações sobre o editor de textos “nano” podem ser obtidas em:
http://www.nano-editor.org/.

2. Instalação do PostgreSQL 9.5.x

PostgreSQL é um sistema gerenciador de banco de dados objeto relacional (SGBDOR), desenvolvido como projeto de código aberto sem custo de licença. Este é o programa que vai gerenciar e armazenar o banco de dados relacional utilizado pelo NFS-e.

Dica: Mais informações sobre o PostgreSQL podem ser obtidas em:
http://www.postgresql.org/.

2.1 Configurando o repositório

Para instalar o PostgreSQL 9.5.x e suas dependências, utilizaremos o gerenciador de pacotes apt, que nos prove as últimas atualizações dos pacotes requeridos através de um canal seguro e confiável.

2.1.1 Crie o arquivo pgdg.list através dos comandos abaixo.
[linux]$ sudo touch /etc/apt/sources.list.d/pgdg.list
[linux]$ echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

Dica: Mais informações sobre a configuração do repositório podem ser obtidas em:
https://www.postgresql.org/download/linux/ubuntu/

2.1.2 Baixe e importe a chave de assinatura do repositório através do comando:
[linux]$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv ACCC4CF8

Dica: Mais informações sobre o gerenciador de pacotes “apt” podem ser obtidas em:
https://help.ubuntu.com/16.04/serverguide/package-management.html

2.2 Ajustando o idioma

Atenção: Este procedimento só é necessário se você não instalou o sistema operacional em “pt_BR” – Português do Brasil.

[linux]$ sudo apt -y install language-pack-gnome-pt language-pack-pt-base myspell-pt myspell-pt-br wbrazilian wportuguese

2.3 Instalando o PostgreSQL 9.5.x

Para realizar a instalação do PostgreSQL 9.5.x através do gerenciador de pacotes execute os comandos:

[linux]$ sudo apt update
[linux]$ sudo apt -y install postgresql-9.5 postgresql-client-9.5 postgresql-contrib-9.5

2.4 Criando e configurando o cluster

O NFS-e utiliza encoding UTF-8 no cluster do PostgreSQL 9.5.x. Por isso vamos parar, remover e recriar o cluster quer será utilizado pela aplicação.

Atenção: O NFS-e não pode ser instalado no mesmo cluster dos demais produtos como: e-cidade, e-cidadeonline, etc. A codificação utilizada pelo NFS-e é UTF-8, enquanto que nos outros produtos é LATIN1!

Dica: Mais informações sobre a configuração do cluster:
http://www.postgresql.org/docs/9.5/static/sql-cluster.html

2.4.1 Vamos parar o cluster criado pelo processo de instalação do PostgreSQL através do comando:
[linux]$ sudo pg_dropcluster --stop 9.5 main
2.4.2 Vamos criar o novo cluster do banco de dados como LATIN1 usando o comando:
[linux]$ sudo pg_createcluster -u postgres -g postgres -e UTF8 --locale="pt_BR.UTF-8" --lc-collate="pt_BR.UTF-8" 9.5 nfse
2.4.3 Para permitir o acesso de qualquer local ao banco de dados é necessário modificar o arquivo /etc/postgresql/9.5/nfse/pg_hba.conf usando o comando:
[linux]$ sudo nano /etc/postgresql/9.5/nfse/pg_hba.conf

Localize e altere as linhas do arquivo do arquivo de configuração que não estão comentadas (# na frente da linha), substituindo os valores correspondentes por trust, conforme a tabela abaixo.

local all postgres
local all all
host all all 127.0.0.1/32
host all all ::1/128
2.4.4 Para a correta integração com o NFS-e, é necessário alterar algumas configurações do cluster criado através do comando:
[linux]$ sudo nano /etc/postgresql/9.5/nfse/postgresql.conf

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere # do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

listen_addresses = '*'
max_connections = 20
2.4.5 Inicie o servidor PostgreSQL através do comando:
[linux]$ sudo systemctl start postgresql.service
2.4.6 Verifique o resultado da configuração usando o comando:
[linux]$ psql -U postgres -h localhost -l

A saída do comando deve ser parecida com os valores abaixo.

   Nome    |   Dono   | Codificação |     Collate      |      Ctype       | Privilégios de acesso
-----------+----------+-------------+------------------+------------------+-----------------------
 postgres  | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      |
 template0 | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres
 template1 | postgres | UTF8        | pt_BR.UTF-8      | pt_BR.UTF-8      | =c/postgres          +
           |          |             |                  |                  | postgres=CTc/postgres

2.5 Criando a estrutura de banco de dados para o NFS-e

Vamos criar os usuários necessários para o funcionamento do NFS-e através dos comandos:

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em:
http://cartilha.cert.br/senhas/.

psql -U postgres -c "CREATE ROLE nfse WITH SUPERUSER LOGIN PASSWORD 'nfse';"

Em seguida, utilize o comando abaixo para criar o banco de dados:

psql -U postgres -c "CREATE DATABASE nfse OWNER nfse;"

3. Instalação do Apache

Apache é o servidor web mais usado em sistemas Linux. Servidores web são usados para servir páginas Web que, normalmente, são solicitadas pelos computadores clientes através de navegador, como o Firefox, Chromium, etc.

Dica: Mais informações sobre o Apache podem ser obtidas em:
http://www.apache.org/.

3.1 Instalando o Apache

Para realizar a instalação do servidor web Apache através do gerenciador de pacotes, execute o comando:

[linux]$ sudo apt -y install apache2

3.2 Configurando a diretiva VirtualHost

3.2.1 Faça uma cópia de segurança do arquivo de configuração padrão, que é criado pelo Apache durante o processo de instalação através do comando:
[linux]$ sudo cp -a /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.dist
3.2.2 Para a correta integração com o NFS-e, é necessário adicionar alguns parâmetros ao arquivo de configuração do VirtualHost através do comando:
[linux]$ sudo nano /etc/apache2/sites-available/000-default.conf

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Adicione as linhas que não existirem e edite as existentes dentro do bloco VirtualHost, conforme é exibido abaixo.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/nfse/public

  SetEnv APPLICATION_ENV "production"
  SetEnv no-gzip 1

    <Directory /var/www/html/nfse/public>
        DirectoryIndex index.php
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error-nfse.log
    CustomLog ${APACHE_LOG_DIR}/access-nfse.log combined

</VirtualHost>

Dica: Mais informações sobre o VirtualHost podem ser obtidas em:
http://httpd.apache.org/docs/current/vhosts/examples.html.

4. Instalação do PHP 5.6 e PHP-FPM

PHP é uma linguagem interpretada livre, usada originalmente apenas para o desenvolvimento de aplicações presentes e atuantes no lado do servidor, capazes de gerar conteúdo dinâmico na World Wide Web.

O PHP-FPM é uma alternativa ao PHP FastCGI com muitas funcionalidades voltadas a sites com grande número de acessos e carga.

Dica: Mais informações sobre o PHP e PHP-FPM podem ser obtidas em:
http://www.php.net/ e http://php-fpm.org/

4.1 Configurando o repositório

Para instalar o PHP 5.6 e suas dependências, utilizaremos o gerenciador de pacotes apt, que nos prove as últimas atualizações dos pacotes requeridos através de um canal seguro e confiável.

4.1.1 Instale o repositório PPA através dos comandos abaixo.
[linux]$ sudo apt-add-repository -y ppa:ondrej/php
[linux]$ sudo apt update

4.2 Instalando o PHP 5.6 e o PHP-FPM

Para realizar a instalação do PHP 5.6 através do gerenciador de pacotes, execute o comando:

[linux]$ sudo apt -y install php5.6 php5.6-bcmath php5.6-bz2 php5.6-cli php5.6-common php5.6-curl php5.6-gd php5.6-interbase php5.6-json php5.6-mbstring php5.6-mcrypt php5.6-pgsql php5.6-soap php5.6-sqlite3 php5.6-xml php5.6-xmlrpc php5.6-zip php5.6-fpm

4.3 Configurando o PHP 5.6 e o PHP-FPM

4.3.1 Habilitar as dependências de módulos através do comando:
[linux]$ sudo a2enmod proxy_fcgi setenvif rewrite
4.3.2 Habilitar as dependências de configuração através do comando:
[linux]$ sudo a2enconf php5.6-fpm
4.3.3 Configurar o arquivo de log do PHP-FPM através dos comandos:
[linux]$ sudo touch /var/log/php_errors.log
[linux]$ sudo chown www-data.www-data /var/log/php_errors.log
4.3.4 Para a correta integração com o NFS-e, é necessário alterar algumas configurações do PHP através do comando:
[linux]$ sudo nano /etc/php/5.6/fpm/php.ini

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere ; do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

short_open_tag = On
session.gc_maxlifetime = 7200
date.timezone = "America/Sao_Paulo"

Também é necessário alterar o arquivo de configuração utilizado pelo php-cli através do comando:

[linux]$ sudo nano /etc/php/5.6/cli/php.ini

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere as linhas do arquivo do arquivo de configuração, descomentando-as se necessário (remover o caractere ; do início da linha), substituindo os valores correspondentes conforme a indicação abaixo.

short_open_tag = On
date.timezone = "America/Sao_Paulo"
4.3.5 Reinicie o serviço do PHP-FPM usando o comando:
[linux]$ sudo systemctl restart php5.6-fpm.service

5. Instalação do NFS-e

5.1 Obtendo o pacote de instalação

O pacote de instalação pode ser obtido diretamente do site do Portal do Software Público. No endereço da comunidade do e-cidade (https://softwarepublico.gov.br/social/e-cidade) estão disponíveis as últimas versões e suas atualizações. Como estamos realizando uma nova instalação, você deve baixar o pacote completo, um exemplo de nome do pacote seria: e-cidadeonline2.completo.Vxxxxxx.tar.bz2.

5.2 Configurando o servidor

5.2.1 Vamos criar um usuário administrativo para o NFS-e, neste exemplo criaremos o usuário dbseller através do comando:
[linux]$ sudo useradd -d /home/dbseller -g www-data -G sudo,adm,cdrom,dip,plugdev -k /etc/skel -m -s /bin/bash dbseller
5.2.2 Em seguida, vamos definir uma senha para este novo usuário usando o comando:
[linux]$ sudo passwd dbseller

Dica: Neste exemplo, defina a senha como o mesmo nome de usuário, como “dbseller”.

Atenção: Em ambientes de produção, nunca utilize senhas que tenham o mesmo nome da conta de usuário. Mais informações sobre segurança de senhas podem ser obtidas em:
http://cartilha.cert.br/senhas/.

5.2.3 Também devemos corrigir a máscara de criação de arquivos modificando os arquivos através dos comandos:
[linux]$ sudo nano /etc/login.defs

Atenção: Os demais parâmetros, não descritos aqui, não precisam ser alterados.

Localize e altere a linha do arquivo do arquivo de configuração, descomentando-a se necessário (remover o caractere # do início da linha), substituindo o valor correspondente conforme a indicação abaixo.

UMASK           002

Em seguida, edite o arquivo de configuração de variáveis do apache com o comando abaixo:

[linux]$ sudo nano /etc/apache2/envvars

Adicione a linha abaixo no final do arquivo.

umask 002

5.3 Configurando o acesso do webservice no e-cidade

O NFS-e se comunica com o e-cidade através de um webservice, para que essa comunicação seja possível, é necessário liberar o acesso no e-cidade.

5.3.1 Liberando o acesso ao webservice do e-cidade

Após realizar o login no e-cidade, acesse:

  1. Selecione a instituição da prefeitura;
  2. Selecione o módulo DB:Configuração;
  3. Selecione o módulo Configuração;
  4. Selecione o menu Cadastros;
  5. Selecione o menu Cadastro de Acessos ao Sistema;
  6. Selecione o menu Inclusão;

Em seguida, preencha os campos conforme as instruções abaixo:

  1. No campo Data Início, selecione a data de hoje;
  2. No campo Hora Início, informe o valor 08:00;
  3. No campo Data Final, selecione uma data no futuro, como o valor 31/12/2099;
  4. No campo Hora Final, informe o valor 08:00;
  5. No campo Observação, informe o valor Acesso ao webservice pelo NFS-e;
  6. Clique no botão Incluir.

Após incluir o acesso, clique na aba Usuário e selecione no campo Cod. Usuário o usuário que será utilizado para comunicação com o webservice, em seguida, clique no botão Alterar.

Após incluir o usuário, clique na aba IP/Máscara e informe o valor no campo Máscara do IP o endereço IP do servidor do NFS-e que será utilizado para comunicação com o webservice do e-cidade, em seguida, clique no botão Alterar.

5.4 Instalando o NFS-e

5.4.1 Descompacte o pacote do NFS-e através do comando:
[linux]$ tar xjf e-cidadeonline2.completo.Vxxxxxx.tar.bz2
5.4.2 Copie o diretório do NFS-e para o diretório raiz do Apache usando o comando:
[linux]$ sudo cp -r e-cidadeonline2.completo.Vxxxxxx /var/www/html/nfse

5.5 Configurando o NFS-e

5.5.1 Crie o arquivo de configuração da aplicação através do comando:
[linux]$ sudo cp /var/www/html/nfse/application/configs/application.ini.dist /var/www/html/nfse/application/configs/application.ini

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/application/configs/application.ini

Em seguida, atualize as configurações conforme o exemplo abaixo.

...
doctrine.connectionParameters.dbname                    = "nfse"
doctrine.connectionParameters.host                      = "localhost"
doctrine.connectionParameters.password                  = "nfse"
doctrine.connectionParameters.port                      = "5432"
doctrine.connectionParameters.user                      = "nfse"
// Verifique a versão do sistema em /var/www/html/nfse/versao.txt
ecidadeonline2.versao                                   = "V011114"
resources.mail.transport.host                           = "smtp.exemplo.com"
resources.mail.transport.password                       = "nfse@exemplo.com"
resources.mail.transport.port                           = "587"
resources.mail.transport.username                       = "nfse@exemplo.com"
resources.mail.defaultFrom.email                        = "nfse@exemplo.com"
resources.mail.defaultFrom.name                         = "NFS-e Nome da Prefeitura"
settings.application.cache                              = "011114"
webservice.client.uri                                   = "http://url_acesso_ecidade/e-cidade/"
webservice.client.url                                   = "http://url_acesso_ecidade/e-cidade/"
webservice.client.location                              = "http://url_acesso_ecidade/e-cidade/webservices/requisicao.webservice.php"
// md5 do ID do usuário selecionado na regra de acesso do e-cidade
webservice.cliente.user                                 = "c4ca4238a0b923820dcc509a6f75849b"
...
5.5.2 Crie os arquivos de configuração do webservice através dos comandos:
[linux]$ sudo cp /var/www/html/nfse/application/configs/webservice-ecidade.ini.dist /var/www/html/nfse/application/configs/webservice-ecidade.ini

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/application/configs/webservice-ecidade.ini

Em seguida, atualize as configurações conforme o exemplo abaixo.

...
DB_id_usuario          = 'Id do usuário que criou a regra de acesso';
DB_login               = 'Login o usuário que criou a regra de acesso';
DB_ip                  = 'IP de acesso ao servidor do E-cidade';
SERVER_ADDR            = 'IP local do servidor do E-cidade';
SERVER_PORT            = 'Porta local do servidor do E-cidade';
DOCUMENT_ROOT          = 'Diretório raiz do E-cidade ex: /var/wwww';
SERVER_ADMIN           = 'e-mail do administrador do servidor web';
PHP_SELF               = 'webservices/requisicao.webservice.php';
HTTP_HOST              = 'Nome do host do E-cidade ex localhost';
...
[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/producao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/producao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/producao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/homologacao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/homologacao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/homologacao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

[linux]$ sudo cp /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl.dist /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl

Utilize o seguinte comando para editar o arquivo de configuração:

[linux]$ sudo nano /var/www/html/nfse/public/webservice/wsdlValidations/integracao/modelo1.wsdl

Em seguida, altere todos os valores {URL}, pela URL do NFS-e conforme o exemplo abaixo.

...
xmlns:ii="http://{URL}/webservice/index/integracao"
...

Um exemplo de como ficaria a configuração, se fosse configurado um nome de domínio no VirtualHost:

...
xmlns:ii="http://nfse.prefeitura.gov.br/webservice/index/integracao"
...

Atenção: Existem diversas linhas que devem ser substituídas, você deve verificar todo o arquivo.

Atenção: Utilize a mesma URL configurada no VirtualHost do apache, ou o endereço IP do servidor.

5.5.3 Ajuste as permissões dos diretórios através dos comandos:
[linux]$ sudo chown -R dbseller.www-data /var/www/html/nfse
[linux]$ sudo chmod -R 775 /var/www/html/nfse

Em seguida, limpe qualquer cache existente através do comando:

[linux]$ sudo rm -rf /var/www/html/nfse/application/data/Proxy/*
5.5.4 Faça a carga do schema do NFS-e através do comando:
[linux]$ cd /var/www/html/nfse
[linux]$ php bin/ruckus.php db:migrate
5.5.5 Reinicie o serviço do Apache usando o comando:
[linux]$ sudo systemctl restart apache2.service

5.6 Acessando o NFS-e

Após finalizar os procedimentos de instalação e configuração, abra um navegador e acesse o NFS-e através do endereço IP ou nome do servidor. EX: http://nfse.prefeitura.gov.br/, utilize como nome de usuário admin, e e como senha 123456.

Atenção: Altere a senha ao realizar o primeiro acesso. Mais informações sobre segurança de senhas podem ser obtidas em: http://cartilha.cert.br/senhas/.

Glossário

Termo Significado
encoding http://en.wikipedia.org/wiki/Character_encoding
cluster http://www.postgresql.org/docs/8.2/interactive/creating-cluster.html
apt-get http://www.debian.org/doc/manuals/apt-howto
apt-get http://pt.wikipedia.org/wiki/Advanced_Packaging_Tool
nano http://www.nano-editor.org
Firefox http://www.mozilla.org/firefox
DBSeller Sistemas http://www.dbseller.com.br
proxy http://pt.wikipedia.org/wiki/Proxy
squid http://pt.wikipedia.org/wiki/Squid