C/C++
SCons – Entenda oque é

SCons é um projeto open source, criado para auxiliar na compilação e montagem de projetos.

Uma definição simples sobre SCons é que é um utilitário de montagem de software (Compilação), criado em python, pode ser utilizado para montar aplicações C/C++ de forma rápida e dinâmica.

Pré requisitos

Python 3.7.1 ou superior

Instalação do SCons

Para instalar o SCons basta rodar o script abaixo:

python -m pip install scons

A instalação tem resultado final como apresentado.

Exemplo de SCons

Documentação

A documentação oficial do SCons pode ser vista em:

https://www.scons.org/doc/production/HTML/scons-user.html#idm46358283013728

Criando um Hello World

Primeiro crie seu programa hello.c, conforme fonte abaixo:

int main()
{
    printf("Olá, mundo!\n");
}

Em seguida crie o arquivo SConstruct, conforme o fonte abaixo:

Program('hello.c')

Agora executa o construtor, conforme o comando abaixo:

scons

A execução fica conforme execução abaixo:

Compilando hello.c com scons

Compilando um programa com multiplos fontes

Para compilar um fonte com multiplos fontes pode-se realizar o procedimento abaixo no SConstruct:

Program('programa', ['prog.c', 'arquivo1.c', 'arquivo2.c'])

ou adicionar os objetos, depois uni-los.

Object('hello.c')

Criando bibliotecas

Para construção de uma biblioteca, segue-se o script no SConstruct:

Library('foo', ['f1.c', 'f2.c', 'f3.c'])

Para biblioteca estática, substitua o nome Library por StaticLibrary e para dinâmica use SharedLibrary.

MNote2
MNote2.14

Nossa primeira betha, onde os comandos básicos foram desenvolvidos.

Mudanças realizadas:

  • Correção no MessageHint – Com alteração da forma de execução e reajustes nas chamadas
  • Tela Folder foi corrigida em diversos bugs
  • frmMNote – função perguntar antes de sair foi corrigida, para não apresentar erro ao sair da tela
  • frmFolder – Criação de pasta implementado.
  • frmFolder – Posicionamento e salvamento da posição da tela após o fechamento.

Instalador

Liberada versão Windows no git

mercurial
Mercurial comandos básicos

Criação de um projeto

A criação de um repositório de projeto em mercurial, se dá através do comando:

hg init [nomedoprojeto]

Status do projeto

Mostra o status dos arquivos no projeto.

hg status

ou

hg st

São estados possíveis no projeto:

ÍconeCódigoEstado
??Não rastreado
+AAdicionado
(ok)CLimpo (Clean)
!MModificado
RRemovido
!Desaparecido
X|Ignorado
Estado possíveis dos arquivos

Símbolos

?
OK
!
X

Adicionar arquivos ao projeto

Para adicionar os arquivos ao projeto

hg add [nome do arquivo]

Verificando mudanças

Para comparar o fonte local com o posto no servidor, usamos

hg diff [nome do arquivo]

Este mostra no formato diff as diferenças.

Removendo um arquivo do projeto

Para retirar um arquivo do projeto, utilizamos o comando:

hg remove [nomedoarquivo]

Ou sua abreviação

hg rm [nomedoarquivo]

Para subir a remoção é necessário enviar por commit ao servidor.

Copia de um arquivo

A cópia nada mais é que a criação de um arquivo, já com sua adição, para realizar isso:

hg copy [nomedoarquivoorigem] [nomearquivodestino]

Ou sua forma abreviada

hg cp [nomedoarquivoorigem] [nomearquivodestino]

Renomeando arquivo

Para renomear arquivos, basta realizar a seguinte operação:

hg rename [nomedoarquivoorigem] [nomearquivodestino]

Ou sua versão abreviada:

hg rm [nomedoarquivoorigem] [nomearquivodestino]

Enviando arquivos para Servidor

Este fluxo enviaremos as modificações do projeto de volta para o servidor, enviando o ticket atrelado ao commit.

hg commit -m ‘resolve [ticket] | texto que descreve a ocorrencia’

Histórico de mudanças do projeto

Mostra o histórico das mudanças realizadas no projeto, apresentando data e quem a fez.

Para isso, digite o seguinte comando:

hg log

Caso queira ver um arquivo especifico

hg log [nomedoarquivo]

Parâmetros do log:

hg log -G -l [nrorevisoes]

Ignorar arquivos

Para criar uma lista de ignorados, basta criar um arquivo .hgignore

Exemplo de arquivo .hgignore

# criado por marcelo maurin

syntax: glob
*~
*.exe

# sintaxe
syntax: regexp
.?dist/

Revertendo operações

A reversão desfaz o que foi feito na maquina, trazendo o arquivo no estado do servidor.

Sintaxe:

hg revert [arquivos]

Removendo arquivos indesejados

O hg purge, remove os arquivos ignorados da maquina local, voltando o status da máquina igual ao que esta no repositório.

Sintaxe:

hg purge

Voltando versões

Voltar versões significa enviar 3 revisões para o servidor, e por qualquer motivo, pegar a 1 e a segunda. Mesmo essa já não sendo a versão final.

hg revert -r [nroversao] [arquivo]

Para saber o nro da versão de o comando

hg log [arquivo]

Lazarus MNote2 Mysql pacotes POSTGRES
Versão 2.13 Linux e Windows

Nesta Versão 2.13, foram corrigidos diversos bugs, incluindo tambem uma versão Linux 64bits.

Versão Linux 64bits – Rodando Ubuntu

Todas as compatibilidades da versão 2.13 do windows, agora estão no Linux Ubuntu.

Baixe agora mesmo o pacote:

https://github.com/marcelomaurin/MNote2/blob/master/bin/mnote2-2.13_amd64.deb

Consulte a documentação do projeto:

http://maurinsoft.com.br/index.php/projetos-open-source/projeto-mnote2/

Vídeos

Assista o vídeo do projeto no Linux Ubuntu 64 bits.

Vídeo em Ubuntu 64 bits
Versão em Windows 10

Delphi Lazarus MNote2
MNote2 – 2.11

Segue a lista de mudanças do projeto MNote2 release 11

Mudança da Tela de Pesquisa

Substituição dos comandos FIND por personalização de tela de pesquisa.

Personalização da Tela de Pesquisa e Troca de Palavras.

Correção do Estilo

Correção do formulário frmmnote principal de fixo para tamanho variavel

Codificação da função Replace

Codificação da Função “Trocar” permitindo a troca de uma palavra por outra diferente.

Tambem já foi codificado a troca de todas as palavras encontradas (Change All).

Função de troca

Undo

Implementação da função UNDO, que desfaz o que foi realizado anteriormente.

Versão disponível

Versão disponibilizada no github

https://github.com/marcelomaurin/MNote2

IA PHP pós graduação Python
Chatbot no wordpress – Parte 2b

Neste fragmento criamos uma série de mudanças no plugin do wordpress para centralizar as operações do chatbot.

Git do projeto

https://github.com/marcelomaurin/chatbot-wordpress

Fiz esta modificação para facilitar a gestão dos itens.

Mudanças envolvidas

No plugin foram feitas diversas mudanças, entre elas. Criação de um menu de itens.

Plugin do wordpress

Temos um menu onde temos opções de Teste de funcionalidade do chatbot

Exemplo do chatbot

E o histórico, que mostra as perguntas realizadas, com opção de exclusão de lixo.

Histórico de Pesquisa

O projeto agregou um web service, que permite comunicação com o banco de dados, conforme o projeto historico.php.


<?php
/*phpinfo();*/
/*Registra webservice para processamento de jobs*/
ini_set('display_errors', 'Off');
error_reporting(E_ALL);

include "connectdb.php";

$typereq = $_SERVER['REQUEST_METHOD'];
//echo $typereq;

if ($typereq==='POST')
{
	//echo "POST";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idhistorico = $dbhandle->real_escape_string($_POST['idhistorico']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idhistorico;
}

if ($typereq === 'GET') {
	//echo "GET";
    // The request is using the POST method
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
}

if ($typereq === 'DELETE')
{
	//echo $typereq;
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idhistorico = $dbhandle->real_escape_string($data->idhistorico);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idhistorico = $dbhandle->real_escape_string($_GET['idhistorico']);
	}
	//$localguid = $data->guid;
	//$idhistorico = $data->idhistorico;
	$query = "delete from historico where idhistorico = ".$idhistorico;
	$dbhandle->query($query);
	//echo ($query);
}

if($localguid!=GUID)
{
	//echo $localguid;
	//echo "  - - ";
	//echo GUID;
	$strJSON =  '{';
	$strJSON = $strJSON . '"mensagem":"Acesso negado"';
	$strJSON = $strJSON . '}';
	echo $strJSON;
	exit();
}


if (($typereq === 'GET')||($typereq === 'POST')){
	if(($idhistorico)&&($idhistorico!='0'))
	{
		$query = "select idhistorico, pergunta from historico where (idhistorico = ".$idhistorico.");";
	} else {
		$query = "select idhistorico, pergunta from historico ;";
	}
	$rs = $dbhandle->query($query);

	$cont = 0;
	//echo $query;
	$strJSON =  '{"rs":[';
	//while($row=$rs->fetch_assoc())
	while($row=$rs->fetch_assoc())
	{

		if($cont!=0)
		{
			$strJSON = $strJSON . ',';
		}
		$strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"idhistorico":'.$row['idhistorico'].',';
		$strJSON = $strJSON . '"pergunta":"'.$row['pergunta'].'"';
		$strJSON = $strJSON . '}';
		$cont ++;
	}
	$strJSON = $strJSON . ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}
}
?>

No código acima, vemos que os verbos do HTML estão contemplados, apesar do sistema apenas usar o POST e DELETE.

O uso destes verbos será modelo para outros web services mais complexos.

Outra melhoria foi o uso de um GUID, que irá aumentar a segurança, restringindo o acesso ao web service, apenas a requisições com a chave correta.

Muitas mudanças ainda serão necessárias, porem estas garantem que nosso chatbot seja mais prático.

Muitas pessoas sabem que um chatbot não precisa deste tipo de melhoria, mas de fato, quando a intensão é o aprendizado, faze-lo de forma que fique mais fácil gerenciar as diversas ações de gestão do chatbot, ajudarão em um futuro próximo.

Há muito o que fazer, espero que acompanhem essa jornada.

Abraço.

IA PHP Python wordpress
Chatbot no wordpress – Parte 2

Agora que criei a página do Chatbot, vou comecar a preparar o recheio.

Definindo objetivo do Chatbot

A primeira coisa que precisamos saber é sobre o que devemos realizar nosso chatbot.

Bom irei falar sobre os projetos da maurinsoft.

Então o primeiro trabalho que irei precisar é criar simulados de perguntas, para facilitar isso, irei criar um conjunto de aplicações.

Neste post irei falar sobre o primeiro.

A melhor forma de criar um conjunto de perguntas é perguntando.

Então vou adicionar ao meu projeto uma tabela historico.

historico.sql

use maurinsoftdb;

create table historico (
  idhistorico int AUTO_INCREMENT PRIMARY KEY,
  pergunta varchar(200) not null,
  ip varchar(40),
  dtquest TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Agora que criei o espaço de armazenamento no banco, irei incluir no web service que processa a pergunta.

Fonte: runpy.php

<?php
    /*phpinfo();*/
	/*Registra webservice para processamento de jobs*/
	ini_set('display_errors', 'ON');
	error_reporting(E_ALL);

	header('Content-Type: application/json');  // <-- header declaration

	include "/var/www/html/python/connectdb.php";

	//header('Cache-Control: no-cache, must-revalidate');

$data = json_decode(file_get_contents("php://input"));

if($data){
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
} else {
		$pergunta = $dbhandle->real_escape_string($_GET['pergunta']);
}

$ip = $_SERVER['REMOTE_ADDR']; /*Pega o ip do cliente*/

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/

$json =  '{"rs":[';
if($pergunta){
  $command = escapeshellcmd('/var/www/html/python/nlp.py "'.$pergunta.'" > /var/log/proclog.log');
  $resposta = shell_exec($command);
  $resposta = str_replace (array("\r\n", "\n", "\r"), ' ', $resposta);

  if($resposta){
     $json = $json  . '{';
     $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":'.$resposta;
     $json = $json  .  '}';
  } else {
	 $json = $json  . '{';
	 $json = $json  .  '"pergunta":"'.$pergunta.'",';
     $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	 $json = $json  .  '}';
  }
} else {
	$json = $json  . '{';
	$json = $json  .  '"pergunta":"'.$pergunta.'",';
    $json = $json  .  '"resposta":"'.'sem resposta'.'"';
	$json = $json  .  '}';
}
$json = $json  .  ']}';

echo $json
?>

Neste projeto que não irei falar muito, pois ja comentei sobre a maior parte em posts anteriores, fiz a inserção do código abaixo:

//echo "Inseriu";
$query= "INSERT into historico (pergunta, ip) values ( '". $pergunta. "', '".$ip."')";
$dbhandle->query($query); /*Executa*/	

Nela ao receber a pergunta armazenamos ela p pesquisa histórica.

Próximos passos

A seguir os próximos passos que iremos postar.

  • Iremos montar as questões que serão respondidas
  • Iremos cadastrar as respostas possíveis
  • Iremos associar as perguntas as respostas
  • Iremos gerar treinamento da nossa rede
  • Iremos codificar nosso código em python.
Blog C/C++
ISO8583

Este material esta sendo construído.

Objetivo

O objetivo deste artigo é apresentar uma visão geral sobre este protocolo.

Histórico

Criado em 1987 a ISO8583 descreve o intercâmbio entre requisições bancárias.

Funcionamento

Sem entrar muito no detalhe do funcionamento.

Basicamente a imagem abaixo, ilustra o funcionamento do protocolo em linhas gerais.

Visão geral do protocolo

De forma geral, o PDV ou POS solicita a operadora uma dada solicitação.

Por exemplo:

inicio de pagamento com cartão de crédito.

No corpo da solicitação, irão alguns dados identificadores da solicitação.

A operadora, pode conforme o tipo da solicitação, perguntar algumas coisas, como senha, tipo de cartão entre outras coisas.

Ou mesmo solicitar a visualização de outras.

A esta solicitação (chamamos de ação), que deve ser respondida pelo PDV ou POS.

A operadora pode realizar quantas perguntas forem necessárias para atendimento de suas necessidades.

Ao fim a operadora envia a resposta final, dando por encerrado a operação.

Em linhas bem gerais é assim que funciona o protocolo ISO 8583.

Estaremos entrando em detalhes, mais adiante.

Porem para entendimento geral, é um protocolo mestre/escravo, onde após a solicitação inicial, a operadora passa a solicitar informações, que devem ser respondidas.

Identificadores de tipo de mensagens

O identificador de tipo de mensagem é um campo numérico de 4 dígitos que especifica o tipo da mensagem que deve ser processado.

Formatação do cabeçalho da solicitação
  • V: número de versão da ISO 8583 (0 indica que é ISO 8583:1987; 1 indica ISO 8583:1992).
  • n: Classe da Mensagem conforme a tabela abaixo: | 0 Reserved for ISO use | 1 Authorization | 2 Financial | | 3 File action | 4 Reversal/Chargeback | 5 Reconciliation | | 6 Administration | 7 Fee collection | 8 Network management | | 9 Reserved for ISO use | | |
  • X: Função da Mensagem conforme tabela: | 0 Request | 1 Request response | 2 Advice | | 3 Advice response | 4 Notification | 5 – 9 Reserved for ISO use |
  • Y: Origem da Transação | 0 Acquirer | 1 Acquirer repeat | 2 Card issuer | | 3 Card issuer repeat | 4 Other | 5 Other repeat | | 6 –9 Reserved for ISO use | | |

Simulando PDV e Simulando Autorizadora

Eu vasculhando a internet achei o site da neapay, conforme referência.

Baixei um download simulator_ISSUER_ISO8583_host_auth_PRO.

A aplicação trabalha com JAVA, e é uma boa pedida quem deseja testar e aprender mais sobre o protocolo.

Simulação de ISO8583

Referências