PHP
Web Service utilizando Verbos no PHP

Nesta longa jornada de aprendizado, mMais uma lição aprendida.

No exemplo a seguir, crio um web service, onde utilizo uma unica chamada para acionar todos os verbos do ws.


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

include "connectdb.php";


function iif($cond, $arg_2, $arg_3)
{
    if($cond){
		return $arg_2;
	} else {
		return $arg_3;
	}
}

function filtro($cond){
	//$cond = str_replace('"',"'");
	return $cond;

}

$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);
		$idbperguntas = $dbhandle->real_escape_string($data->idbperguntas);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idbperguntas = $dbhandle->real_escape_string($_POST['idbperguntas']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idbperguntas;
}

if ($typereq==='PUT')
{
	//echo "PUT";
    // 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);
		$pergunta = $dbhandle->real_escape_string($data->pergunta);
		//echo var_dump(json_decode($foo, true));
	} else {
		$localguid = $dbhandle->real_escape_string($_POST['guid']);
		$idhistorico = $dbhandle->real_escape_string($_POST['idhistorico']);
		$pergunta = $dbhandle->real_escape_string($_POST['pergunta']);
		//echo "3";
	}
	//echo $localguid;
	//echo $idhistorico;
	//echo $pergunta;
	if(($pergunta)&&($pergunta!=''))
	{
		$query = "insert into bperguntas (pergunta) values ('".$pergunta."');";
	}
	//echo $query;
	$rs = $dbhandle->query($query);
}

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);
		$idbpergunta = $dbhandle->real_escape_string($data->idbpergunta);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idbpergunta = $dbhandle->real_escape_string($_GET['idbpergunta']);
	}
}

if ($typereq === 'DELETE')
{
	//echo $typereq;
	$data = json_decode(file_get_contents("php://input"));
	if($data){
		$localguid = $dbhandle->real_escape_string($data->guid);
		$idbperguntas = $dbhandle->real_escape_string($data->idbperguntas);
	} else {
		$localguid = $dbhandle->real_escape_string($_GET['guid']);
		$idbperguntas = $dbhandle->real_escape_string($_GET['idbperguntas']);
	}
	if ($idbperguntas)
	{
		//$localguid = $data->guid;
		//$idbpergunta = $data->idbpergunta;
		$query = "delete from bperguntas where idbperguntas = ".$idbperguntas.';';
		if($dbhandle->query($query)==TRUE)
		{
			echo ($query);
			$strJSON =  '{"rs":[';
			$strJSON = $strJSON . '{';
			$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
			$strJSON = $strJSON . '"resposta":"Registro excluido com sucesso!"';
			$strJSON = $strJSON . '}';
			$strJSON = $strJSON . ']}';
			echo($strJSON);
		}
		else
		{
			$strJSON =  '{"rs":[';
			$strJSON = $strJSON . '{';
			$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
			$strJSON = $strJSON . '"resposta":"'.$dbhandle->error.'"';
			$strJSON = $strJSON . '}';
			$strJSON = $strJSON . ']}';
			echo($strJSON);

		}
	}
	else
	{
		$strJSON =  '{"rs":[';
	    $strJSON = $strJSON . '{';
		$strJSON = $strJSON . '"IDPergutas":'.$idbperguntas.',';
		$strJSON = $strJSON . '"resposta":"Registro não encontrado!"';
		$strJSON = $strJSON . '}';
		$strJSON = $strJSON . ']}';
		echo($strJSON);
	}
}

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


if (($typereq === 'GET')){
	if(($idbperguntas)&&($idbperguntas!='0'))
	{
		$query = "select idbperguntas, pergunta from bperguntas where (idbpergunta = ".$idbperguntas.");";
	} else {
		$query = "select idbperguntas, pergunta from bperguntas ;";
	}
	$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 . '"idbperguntas":'.filtro(iif(($row['idbperguntas']!=''),$row['idbperguntas'],'[vazio]')).',';
		$strJSON = $strJSON . '"pergunta":"'.filtro(iif($row['pergunta']!='',$row['pergunta'],'[vazio]')).'"';
		$strJSON = $strJSON . '}';
		$cont ++;
	}
	$strJSON = $strJSON . ']}';
	if ($cont>0)
	{
		echo($strJSON);
	}
}
?>



Na chamada REQUEST_METHOD, captura qual o verbo do html associado a aquela requisição.

$typereq = $_SERVER[‘REQUEST_METHOD’];

Desta forma podemos criar ações especificas para determinados verbos.

if (($typereq === ‘GET’)||($typereq === ‘POST’)){

MNote2 Mysql Postgres
MNote 2.15

Na versão 2.15, realizamos uma série de ajustes no MQuery.pas, onde refinamos o código das tabelas, e incluímos o nome do database, abaixo das demais informações.

Alinhamento das tabelas

Houve poucas mudanças visuais no código, porem muitas mudanças internas.

Implementação do código de registro.

Foram criados as versões para Plataformas windows, linux e ARM Linux nesta release.

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.

pt_BRPortuguese