CUDA IA Sem categoria
Criando CUDA Hello World

O objetivo deste artigo, é iniciar o programador, no desenvolvimento de aplicações usando GPU da NVIDIA.

No artigo anterior, eu ensinei a instalar o pacote cuda.

http://maurinsoft.com.br/index.php/2021/08/27/install-cuda-toolkit-em-xubuntu-18-04/

Agora iremos desenvolver o nosso famoso hello world.

Primeiramente, precisamos instalar um outro pacote adicional:

apt install nvidia-cuda-toolkit

Este pacote instala o compilador do cuda “nvcc”, que gera o binário para o GPU.

Criando o Hello World

Neste exemplo não faremos muita coisa, a não ser chamar nossa primeira rotina que irá processar no GPU.

GIT

O projeto esta no GIT e pode ser baixado aqui:

https://github.com/marcelomaurin/CUDA_HELLO

Baixando o Projeto

Para baixar o projeto digite:

git clone https://github.com/marcelomaurin/CUDA_HELLO.git

Compilando o projeto

Para compilar o projeto digite o seguinte comando:

make

Segue o print screen da tela

Compilação do projeto

Agora iremos rodar o projeto.

Rodando o projeto

Analisando o código

Agora vamos dar uma olhada no fonte:

#include <stdio.h>
#include "cuda_runtime.h"

//Kernel
__global__
void hello_world(void){
	printf("hello\n");
}


int main(){
	printf("Chamando hello!\n");
	hello_world << <3, 10>> >();
	cudaDeviceSynchronize();
	return 0;
}

Este pequeno código, chama o hello_world, iniciando 30 threads, onde chama 3 blocos (SMs), com 10 threads cada.

O comando cudaDeviceSynchronize, realiza a sincronização entre o kernel do linux e as threads do cuda.

Lembrando que o valor máximo dado por thread é 1024 por bloco SM.

Referências

https://cuda-tutorial.readthedocs.io/en/latest/tutorials/tutorial01/

Documentação NVIDIA da API runtime

https://docs.nvidia.com/cuda/cuda-runtime-api/modules.html#modules

POSTGRES
Instalar PostgreSQL no Linux

O Procedimento de instalação do postgresql é muito simples:

apt install postgresql

apt install postgresql-contrib

Vídeo apresentando a instalação do PostgreSQL no linux

Acessando o banco de dados

Voce instalou o banco, agora iremos acessa-lo.

O processo de instalação criou o usuário padrão postgres, iremos utiliza-lo.

su -i -u postgres

Agora iremos chamar o psql.

psql

Para sair \q do postgres.

Criando contas de usuário e Banco de dados

Para criar um usuário no banco, deve-se primeiramente entrar com o usuário postgres.

su -i -u postgres

Em seguida devemos criar um novo usuário.

createuser –interactive

Voce será questionado, ao nome do usuário.

Criando um banco de dados

Ainda com usuário postgres, faça:

createdb <nome do banco>

Conectando com outro usuário

psql -d postgres

Instalando pacote de desenvolvimento

Entre com o super usuário, e instale o seguinte pacote:

apt install libpq-dev

O include ficará em /usr/include/postgresql/libpq

Referências:

https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart-pt

https://qastack.com.br/programming/3116015/how-to-install-postgresqls-pg-gem-on-ubuntu

Veja tambem

    cmusphinx IA Programação srvOuve
    Sphinx reconhecimento de audio gravado

    Para este experimento iremos utilizar o seguinte texto:

    https://www.nasa.gov/mp3/586447main_JFKwechoosemoonspeech.mp3

    Trata-se do famoso discurso de J.F. Kenedy, sobre a necessidade de ir a lua.

    A transcrição do audio, pode ser vista neste link.

    JFK RICE MOON SPEECH (nasa.gov)

    Preparação do Arquivo

    Primeiramente precisamos converter o texto em wav.

    ffmpeg -i 586447main_JFKwechoosemoonspeech.mp3 -ar 16000 -ac -1 jfk.wav

    o ffmpeg, faz a conversão do texto no formato desejado para analise. O arquivo é preparado para uma taxa de amostragem de 16k.

    Lendo o arquivo

    pocketsphinx_continuous -infile jfk.wav > jfk.txt

    Segue o que ele ouviu

    i got an r n n n
    not because they are easy one because they are hot
    the car and gold
    wilson to organize then it then asked
    our energy density else
    we got it at our ideas and won that we’re willing to exactly
    while we are unwilling to postpone
    and one nintendo wii in and then look

    Podemos perceber que neste primeiro processo ele ouviu muita coisa errada, porem algumas palavras de cara deram certo. “not because they are easy”. Porem a qualidade do audio comprometeu em muito a leitura.

    O parametro -infile, permite ler o arquivo origem, porem o mesmo precisa ser previamente preparado para leitura deste.

    Pudemos verificar que a qualidade do audio foi importante para refletir a acuracia do audio, iremos pegar algo mais simples agora.

    Segundo exemplo

    Neste segundo exemplo extraímos o audio do seguinte link:

    https://freesound.org/people/tim.kahn/sounds/82986/

    Neste link temos uma contagem regressiva, bem pronunciada de uma voz feminina.

    Iremos baixar o wav e passar um filtro conforme a sintaxe abaixo:

    ffmpeg -i 82986__tim-kahn__countdown.wav -ar 16000 -ac 1 countdown.wav

    Agora iremos processar o arquivo, jogando o resultado no arquivo countdown.txt

    pocketsphinx_continuous -infile 82986__tim-kahn__countdown.wav > countdown.txt

    Temos como conteudo, o seguinte texto:

    ten
    nine
    eight seven
    six five four three two
    wind
    zero

    Podemos perceber que de 10 itens falados, apenas o one, não foi ouvido corretamente.

    Referencias:

    https://freesound.org/browse/tags/english/

    Blog cmusphinx IA Reconhecimento de Voz srvOuve
    CMU Sphinx

    Temos visto uma crescente de IoT desenvolvidos especificamente para reconhecer comandos de seu dono, tais dispositivos, como Alexa ou o Google Home, tem se tornado, bem popular.

    Iremos neste artigo, aprender a criar nosso próprio google home.

    O que é o CMU Sphinx

    CMU Sphinx é uma api de reconhecimento de voz. Ela é bastante consagrada, possuindo muitos projetos atrelados a ela.

    Trato a biblioteca com bastante foco para desenvolvimento IoT, no meu livro que pode ser baixado livremente.

    A grande vantagem desta api, é que ela não necessita de conexão externa ou acesso a internet.

    Uso do CMU Sphinx

    Utilizaremos o CMU Sphinx como base do nosso projeto.

    GIT do Projeto

    cmusphinx · GitHub

    Site do Projeto

    CMUSphinx Documentation – CMUSphinx Open Source Speech Recognition

    Divisão por Projetos

    O CMU Sphinx, possui diversos softwares ou pacotes separados.

    Irei abordar alguns deles, que serão algo deste artigo.

    • sphixbase – Biblioteca base
    • pocketsphinx – Conjunto de fontes e dicionário para reconhecimento de vóz usado no sphinxbase.
    • sphinxtrain – Ferramenta de Traino de modelos acústicos
    • Modelo em portguês

    Instalação do Sphinx

    Pré requisitos de instalação

    Para atender a instalação será necessário as seguintes bibliotecas:

    apt install bison

    apt install libasound2-dev

    apt install swig

    apt install python

    Pré requisitos de instalação

    Instalação do Sphinx pelo gerenciador de pacotes

    A instalação do sphinx pelo gerenciador de pacote, fica bem mais fácil, porem pode ser necessário, atualizar manualmente a versão, pois ninguem garante que o repositório estará atualizado com a ultima versão.

    apt install shinxbase*

    apt install pocketsphinx*

    instalação através do gerenciador de pacotes

    Baixa manual

    Nesta modalidade iremos baixar e instalar o sphinx manualmente em nosso linux.

    Primeiramente iremos baixar o projeto no git

    git clone https://github.com/cmusphinx/sphinxbase.git

    Baixando o projeto do repositório

    digite agora o autogen para gerar os arquivos de configuração.

    ./autogen.sh

    execução do autogen.sh

    Agora, rode o /configure, conforme a linha a seguir:

    ./configure –enable-fixed

    Em seguida compile o projeto:

    make clean all

    make

    make install

    Ao fim do processo, voce terá instalado a base.

    Instalando o Pocket Sphinx

    Bom fizemos a instalação do Sphinxbase, mas iremos agora, adicionar o pacote, necessário para desenvolvimento desktop.

    A instalação tradicional já foi passada na instalação do sphinxbase, por isso iremos omitir.

    Iremos agora orientar na compilação dos fontes.

    Baixe os fontes do repositório:

    git clone https://github.com/cmusphinx/pocketsphinx.git

    Em seguida entre na pasta e realize os seguintes comandos:

    ./autogen.sh

    ./configure

    make check

    make install

    make installcheck

    ldconfig

    Ao fim do projeto, se der certo, irá aparecer o seguinte binário.

    > pocketsphinx_continuous

    Ao tentar rodar, ele irá pedir parametros, vamos testar agora com parametros adicionais.

    pocketsphinx_continuous -adcdev plughw:1,0 -kws_threshold 1e-20 -inmic yes

    Neste modo ele irá ouvir comandos em inglês, fale um simples hello, que voce irá verificar que o mesmo funciona.

    Teste de hello

    Bom, finalizamos este primeiro artigo, no próximo, iremos criar uma aplicação que ouve as pessoas. Sendo nosso hello world em C.

    Espero que tenham gostado.

    Reconhecimento de voz com sphinx

    Blog
    Fé na justiça de Deus

    Quem me conhece, sabe da minha luta pelas minhas filhas.

    A 12 anos atraz, vi que a minha ex mulher não tinha condições de cuidar das minhas filhas.

    Para tentar resolver isso entrei na justiça. Após quase 5 anos de luta na justiça, recebi da Justiça a negativa.

    Mesmo apresentando todos os argumentos e provas inequivocas.

    Após mais 2 anos de vencido o processo, uma das minhas filhas, comecou a apresentar comportamento que condizia com o abandono, e negligência que reclamava. Ela se cortava.

    E eu ficava desesperado, sem conseguir ajuda-la. Mais uma vez eu entrei na justiça, para tentar na justiça dos homens que minha ex desse o tratamento necessário. Que interviessem sobre o assunto, e exigissem o tratamento.

    Infelizmente, não fui ouvido, e muitas vezes era injuriado ou chacoteado pela minha insistência.

    Mesmo fazendo tudo o que pude, já que não mais detinha o poder pátrio. Pois me foi roubado, na decisão de guarda.

    Lutei, mas nada conseguia. Parecia que as portas se fechavam para mim.

    Fiz tudo o que pude, para proteger as meninas na epoca. Sempre mostrando para elas (minhas filhas) que o pai amava elas.

    Pedia a Deus, que me mostrasse o caminho. Mas só encontrava desespero e abandono.

    Sem poder fazer nada por elas. Via mãos e pernas cortados, e meu coração sangrava junto dela. A cada corte meu desespero, e minhas lágrimas corriam em silencio.

    Rezava pela outra, pelo abandono e falta de carinho, que a Mae demonstrava. Onde era imposto a mais velha o papel de mãe da mais nova. Mesmo ela não podendo realizar tal comportamento, desde os 7 anos de idade.

    Nos poucos momentos que tinha com elas, fazia de tudo, para que naqueles momentos com elas (minhas filhas) fossem momentos inesqueciveis

    Mesmo que para isso eu passa-se meses em situação de penúria (comendo miojo e salsicha), nos meses subsequentes.

    Anos se passaram, muitas lagrimas cairam, do meu rosto e das minhas filhas.

    Mas Deus, sabe seu tempo.

    Minhas filhas hoje moram perto de mim.

    A mais velha, que sempre foi minha amiga, saiu escondido, ao completar 18 anos da casa da mãe.

    E veio morar comigo Hoje ela casou, esta bem, lutando pelo pão, mas sempre nos fins de semana estamos juntos.

    A outra, ao completar 18 anos, tambem viu a injustiça. Viu ela mesma as injustiças que sofria e resolveu tomar para si. Veio para minha casa. Hoje vivo com elas (minhas filhas) com minha parceira, que tambem foi algo trazido por Deus. Gosta das minhas filhas, e todos nós estamos juntos como uma famíla.

    Sempre sonhei com uma família, lutei muito, construindo um lar.

    Montei uma casa, que como eu era destruída.

    Aos poucos fui reformando. Sonhando com uma casa para minha família. Onde os filhos estivessem aqui, junto com uma mulher que tornasse aqui um lar.

    Teve momentos que jamais acreditaria que o desfecho fosse bom, pois com um relacionamento com uma pessoa extremente egoísta, que não aceitava minha família. Via pouca ou nenhuma a chance de ser feliz por completo.

    No entanto, Deus não deixou eu me casar com ela. Separei, sofri, me perdi.

    Mas Deus tira as pedras, para liberar a estrada.

    Conheci a mulher certa. em 4 meses casei, ela adotou minhas filhas como sua.

    Abraçou a família porque ela mesma não tinha a sua.

    Hoje Deus me deu tudo isso.

    Conclusão

    Deus sabe o que faz,

    Não peça por vingança.

    Peça por dissernimento, peça pelo melhor caminho.

    Lute, mas lute com todas as suas forças, contra a injustiça. E pelo que acredita. Não desista.

    Porque Deus no final te dá o resultado.

    Ele sabe o que faz. Ele abre caminhos, resolve problemas insoluveis.

    Infelizmente a gente é imediatista, mas Deus tem seu tempo.

    Ele sabe o caminho. E de vagar irá resolver o irresolvivel, te abraçar e confortar.

    Seja justo, seja honesto, seja forte, seja sincero. Porque Deus gosta de quem é honesto e sincero.

    Confie NELE, o resto vem. Fique tranquilo, sou prova viva disso.

    Blog Mysql PHP Programação
    Mysql com C/Lazarus/Python/PHP/R – Parte 3

    Seguindo com nossos artigos, irei incluir agora uma aplicação em PHP, consumindo Mysql.

    Este artigo é o terceiro, sobre esse tema, onde irei abordar o uso do mysql em diversas linguagens.

    Neste artigo especifíco abordarei o uso no PHP.

    GITHUB

    Iremos criar em nosso projeto:

    https://github.com/marcelomaurin/mysql-vs-todos

    Será criado uma pasta chamada PHP, esta pasta, conterá o material necessário para rodar a aplicação.

    Pré requisitos

    Instale os seguintes pacotes em sua máquina Ubuntu

    apt install apache2

    Instale os pacotes

    apt install php libapache2-mod-php php7.4-mysql php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip php7.4-intl -y

    apt install python3-certbot-apache

    Pronto instalação realizada com sucesso, conforme a contraprova.

    PHP recem instalado

    Criação dos códigos

    Criação da Página Principal

    Usaremos como interface o boot strap, para gerar uma interface bonita e simples de usar.

    Usaremos o modelo MVC (Model , View , Control), que divide a página em 3 partes.

    Abordarei o projeto em detalhes parte a parte.

    Sempre lembrando que os fontes encontram-se no git.

    Para visualização de como ficará no PHP, podemos acessar o link:

    http://maurinsoft.com.br/exemplos/phpmysql/

    Atribuíndo a conexão

    A conexão de todos os scripts são definidos pelo código connectdb.php, conforme fragmento abaixo:

    <?php
    	define("HOSTNAME","localhost");
    	define("USERNAME","php");
     	define("PASSWORD","123456");
    	define("DATABASE","testedb");
    ?>
    
    $dbhandle = new mysqli(HOSTNAME, USERNAME, PASSWORD, DATABASE) or die("Erro ao conectar no banco de dados");

    Nele definimos as definições de conexão que podemos chamar nos demais programas.

    Web Service do PHP

    Acesso a base de Pessoas, eu criei um web service bem simples.

    Meu web service possui 4 serviços:

    • dPessoa.php – Apaga um registro
    • iPessoa.php – Inclui um registro de pessoa
    • sPessoa.php – Pesquisa um conjunto de pessoas
    • uPessoa.php – Atualiza o cadastro de uma pessoa.

    O Serviço pode ser visto no caminho:

    http://maurinsoft.com.br/exemplos/phpmysql/ws/

    Todos os web services são baseados em GET para obter os parametros, segue o código do sPessoa.php:

    <?php<?php
        /*phpinfo();*/
    	/*Registra webservice para processamento de jobs*/
    	ini_set('display_errors', 'Off');
    	error_reporting(E_ALL);
    
    	include "connectdb.php";
    
    	//header('Cache-Control: no-cache, must-revalidate');
    	//$data = var_dump(json_decode(file_get_contents("php://input")));
    	$data = json_decode(file_get_contents("php://input"));
    	if($data){
    		$idpessoa = $dbhandle->real_escape_string($data->idpessoa);
    		$nome = $dbhandle->real_escape_string($data->nome);
    		$profissao = $dbhandle->real_escape_string($data->profissao);
    		$sexo = $dbhandle->real_escape_string($data->sexo);
    		$dtnasc = $dbhandle->real_escape_string($data->dtnasc);
    	} else {
    		$idpessoa = $dbhandle->real_escape_string($_GET['idpessoa']);
    		$nome = $dbhandle->real_escape_string($_GET['nome']);
    		$profissao = $dbhandle->real_escape_string($data->profissao);
    		$sexo = $dbhandle->real_escape_string($data->sexo);
    		$dtnasc = $dbhandle->real_escape_string($data->dtnasc);
    	}
    
    
    	$query = "select * from pessoas";
    	$sqlwhere = "";
    	if(!empty($idpessoa)){
    		$sqlwhere = " where (idpessoa = ".$idpessoa.");";
    	}
    	if(!empty($nome)){
    		if($sqlwhere){
    			$sqlwhere = $sqlwhere." and (nome like '%".$nome."%');";
    		} else {
    			$sqlwhere = " where (nome like '%".$nome."%');";
    		}
    	}
    	if(!empty($profissao)){
    		if($sqlwhere){
    			$sqlwhere = $sqlwhere." and (profissao like '%".$profissao."%');";
    		} else {
    			$sqlwhere = " where (profissao like '%".$profissao."%');";
    		}
    	}
    	if(!empty($sexo)){
    		if($sqlwhere){
    			$sqlwhere = $sqlwhere." and (sexo = '".$sexo."');";
    		} else {
    			$sqlwhere = " where (sexo = '".$sexo."');";
    		}
    	}
    	if(!empty($dtnasc)){
    		if($sqlwhere){
    			$sqlwhere = $sqlwhere." and (dtnasc = '".$dtnasc."');";
    		} else {
    			$sqlwhere = " where (dtnasc = '".$dtnasc."');";
    		}
    	}
    	$query = $query . $sqlwhere;
    
    	//echo $query."<br/>";
    
    	$rs = $dbhandle->query($query);
    
    	//print json_encode($rs);
    
    	$cont = 0;
    
    	echo '{"rs":[';
    	$row=$rs->fetch_assoc();
    	if($row){
    		do
    		{
    			if($cont!=0)
    			{
    				echo ',';
    			}
    			echo '{';
    			echo '"idpessoa":"'.$row['idPessoa'].'",';
    			echo '"nome":"'.$row['nome'].'",';
    			echo '"profissao":"'.$row['profissao'].'",';
    			echo '"dtnasc":"'.$row['dtnasc'].'",';
    			echo '"sexo":"'.$row['sexo'].'"';
    			echo '}';
    			$cont ++;
    		} while($row=$rs->fetch_assoc());
    	}
    	echo ']}';
    	if ($cont>0)
    	{
    		echo($strJSON);
    	}
    
    
    ?>
    

    Neste fragmento, temos um web service muito simplificado.

    Onde criamos uma conexão com o banco de dados,

    No proximo passo, capturamos os parametros, que podem ser 4:

    • idpessoa – codigo do registro que será pesquisado
    • nome – nome da pessoa que será pesquisada
    • profissão – profissao da pessoa que será pesquisada
    • sexo – Sexo da pessoa que será pesquisada

    Os parametros passados, podem ou não retornar um unico registro.

    Por fim o json é montado, convertendo o conjunto de itens encontrados em uma expressão json.

    Para testar o web service, é necessário rodar conforme o link.

    Exemplo de JSON criado

    Visualização

    Select

    http://maurinsoft.com.br/exemplos/phpmysql/ws/sPessoa.php?idpessoa=1

    Insert

    http://maurinsoft.com.br/exemplos/phpmysql/ws/iPessoa.php?nome=Marcelo&dtnasc=2021-01-01&profissao=Analista&sexo=M

    Delete

    http://maurinsoft.com.br/exemplos/phpmysql/ws/dPessoa.php?nome=Marcelo

    Update

    http://maurinsoft.com.br/exemplos/phpmysql/ws/uPessoa.php?pesnome=Marcelo&nome=Marcella&profissao=Tecnica Informatica&sexo=F&dtnasc=2002-01-16

    Front End

    O index.php – e o front end, ele é responsável pela troca de informações entre o browser e os demais componentes.

    Link do front end:

    http://maurinsoft.com.br/exemplos/phpmysql/index.php

    Segue o formulario:

    No Front End, desenvolvido no modelo MVC, criamos 3 elementos.

    O index.php, que mostrará as informações encontradas.

    
    <?php
      //Controla o Debug no projeto
      ini_set('display_errors', 'On');
    
      include "sessao.php";
      include "config.php";
      include "funcs.php";
    ?>
    
    <html>
    	<header>
    		<title>Cadastro de Pessoas</title>
    		<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    		<!-- Latest compiled and minified CSS -->
    		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    
    		<!-- jQuery library -->
    		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    
    		<!-- Latest compiled JavaScript -->
    		<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
    	</header>
    	<body>
    
    
    		<div ng-app="Pessoas" ng-controller="cntrl" >
    			<div class="container-fluid bg-1 text-rigth">
    				<form action="">
    					<?  Pesquisar Itens ?>
    					<div class="jumbotron">
    							<h1>Cadastro de Pessoas</h1>
    							<p>Modelo de aplicação MVC, conforme <a href="http://maurinsoft.com.br/index.php/2022/02/04/mysql-com-c-lazarus-python-php-r-parte-3/">Artigo publicado.</a></p>
    							<p>Para maiores informações <a href="mailto:marcelomaurinmartins@gmail.com">marcelomaurinmartins@gmail.com</a></p>
    					</div>
    					<div class="row">
    						<div class="col-sm-1">idPessoa:</div>
    						<div class="col-sm-2"><input class="form-control" placeholder="idPessoa (opcional)" type="text" ng-model="pidpessoa" name="pidpessoa"></div>
    					</div>
    					<div class="separador">
    					</div>
    					<div class="row">
    						<div class="col-sm-1">Nome:</div>
    						<div class="col-sm-4"><input class="form-control" placeholder="nome (opcional)" type="text" ng-model="pnome" name="pnome"></div>
    					</div>
    					<div class="separador">
    					</div>
    
    					<div class="row">
    						<div class="col-sm-1">Profissão:</div>
    						<div class="col-sm-4"><input class="form-control" placeholder="profissao (opcional)" type="text" ng-model="pprofissao" name="pprofissao"></div>
    					</div>
    					<div class="separador">
    					</div>
    					<div class="row">
    					    <div class="col-sm-1">Dt. Nascimento:</div>
    						<div class="col-sm-4"><input class="form-control" placeholder="dt Nascimento (yyyy-mm-dd) (opcional)" type="text" ng-model="pdtnasc" name="pdtnasc"></div>
    					</div>
    					<div class="separador">
    					<div class="row">
    					    <div class="col-sm-1">Sexo:</div>
    						<div class="col-sm-4"><input class="form-control" placeholder="Genero sexual (M/F) (opcional)" type="text" ng-model="psexo" name="psexo"></div>
    					</div>
    					<div class="separador">
    					</div>
    					<div class="row">
    						<div class="col-sm-1"></div>
    						<div class="col-sm-4"></div>
    						<div class="col-sm-1"> <input type="button" class="btn btn-primary"  value="Pesquisar" ng-click="displayPessoa(pidpessoa,pnome,pprofissao,psexo,pdtnasc)" > </div>
    						<div class="col-sm-1">  </div>
    						<div class="col-sm-1"> <input type="button" class="btn btn-primary"  value="Novo Item" ng-click="newPessoa(pidpessoa)" > </div>
    
    					</div>
    
    
    					<? Retorno de mensagem de erro ?>
    					<div class="info">
    						<div class="control-label">Alerta:</div>
    						<div class="info">{{msg}}</div>
    					</div>
    				<input type="hidden" name="trp-form-language" value="en"/></form>
    			</div>
    			<? layout da tabela de resposta ?>
    			<div class="container-fluid bg-1 text-rigth">
    
    				<? **Cadastrar itens** ?>
    				<div id="cadastro" ng-style="disableInsert" >
    					<div class="row">
    						<div class="col-sm-12"> <h3>Operação Insert registro </h3></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Nome: </div>
    						<div class="col-sm-4"> <input  class="form-control" placeholder=" Nome da pessoa" type="text" ng-model="nome" name="nome"> </div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Profissão</div>
    						<div class="col-sm-4"> <input class="form-control"  placeholder=" Profissão da pessoa" type="text" ng-model="profissao" name="profissao"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Dt. Nascimento</div>
    						<div class="col-sm-4"> <input class="form-control"  placeholder=" Dt nascimento (YYYY-mm-dd)" type="text" ng-model="dtnasc" name="dtnasc"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label">Sexo</div>
    						<div class="col-sm-4"> <input class="form-control"  placeholder=" Sexo de Nascimento (M/F)" type="text" ng-model="sexo" name="sexo"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-4"></div>
    						<div class="col-sm-1 control-label">  </div>
    						<div> <input type="button" class="btn btn-primary" value="submit" ng-click="insertPessoa()" > </div>
    					</div>
    				</div>
    			</div>
    
    			<div class="container-fluid bg-1 text-rigth">
    
    				<? *** Update *** ?>
    				<div id="edicao" ng-style="disableUpdate" class="container-fluid bg-1 text-rigth">
    					<div class="row">
    						<div class="col-sm-12"> <h3>Operacao de Edicao</h3></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> idPessoa:</div><div> {{edidpessoa}}</div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Nome</div>
    						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="ednome" name="ednome"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Profissão</div>
    						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="edprofissao" name="edprofissao"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label"> Dt. Nascimento</div>
    						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="eddtnasc" name="eddtnasc"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-1 control-label">Sexo</div>
    						<div class="col-sm-4"> <input class="form-control"  type="text" ng-model="edsexo" name="edsexo"></div>
    					</div>
    					<div class="row">
    						<div class="col-sm-4"></div>
    						<div class="col-sm-1"> <button class="btn btn-primary" ng-click="updatePessoa(edidpessoa,ednome, edprofissao, eddtnasc, edsexo)">Atualizar</button></div>
    					</div>
    				</div>
    			</div>
    
    			<div class="container-fluid bg-1 text-rigth">
    				<div class="row">
    				<hr>
    				</div>
    			</div>
    
    			<? ** Tela de Resultado **?>
    			<div class="container-fluid bg-1 text-rigth">
    				<table class="table table-striped">
    					<thead>
    						<tr>
    							<th>IdPessoa</th>
    							<th>Nome</th>
    							<th>Profissão</th>
    							<th>Dt. Nascimento</th>
    							<th>Sexo</th>
    
    						<tr>
    					</thead>
    					<tbody>
    						<tr ng-repeat="dados in data.rs">
    							<td>{{dados.idpessoa}}</td>
    							<td>{{dados.nome}}</td>
    							<td>{{dados.profissao}}</td>
    							<td>{{dados.dtnasc}}</td>
    							<td>{{dados.sexo}}</td>
    							<td><button class="btn btn-primary" ng-click="deletePessoa(dados.idpessoa);">Delete</button></td>
    							<td><button class="btn btn-primary" ng-click="HabilitaEdicao(dados);">Edit</button></td>
    						</tr>
    					</tbody>
    				</table>
    
    
    			</div>
    
    
    
    			<? *** Controler *** ?>
    			<script>
    				var app = angular.module('Pessoas',[]);
    				app.controller('cntrl', function($scope,$http)
    				{
    				    $scope.disableUpdate = {'display': 'none'}; //Atribui Edicao invisivel
    					$scope.disableInsert = {'display': 'none'}; //Atribui Edicao invisivel
    
    					//Mostra  os Jobs
    					$scope.insertPessoa=function()
    					{
    						$http.post("/exemplos/phpmysql/ws/iPessoa.php",{'nome':$scope.nome,'profissao':$scope.profissao,'dtnasc':$scope.dtnasc,'sexo':$scope.sexo})
    						.success(function()
    						{
    							$scope.msg = "nome foi cadastrado com sucesso";
    							$scope.displayPessoa();
    						})
    					}
    
    					$scope.displayPessoa=function(pidpessoa,pnome,pprofissao,psexo,pdtnasc)
    					{
    					    $scope.disableUpdate = {'display': 'none'}; //Atribui Edicao invisivel
    						$scope.disableInsert = {'display': 'none'}; //Atribui Edicao invisivel
    
    						if (typeof pidpessoa == "undefined")
    						{
    							pidpessoa = "";
    						}
    						if (typeof pnome == "undefined")
    						{
    							pnome = "";
    						}
    						if (typeof psexo == "undefined")
    						{
    							psexo = "";
    						}
    						if (typeof pprofissao == "undefined")
    						{
    							pprofissao = "";
    						}
    						if (typeof pdtnasc == "undefined")
    						{
    							pdtnasc = "";
    						}
    
    						var params = {"idpessoa": pidpessoa, "nome": pnome, "profissao": pprofissao, "sexo": psexo, "dtnasc": pdtnasc };
    						var config = {params: params};
    
    
    						$http.get("/exemplos/phpmysql/ws/sPessoa.php",config)
    						.success(function(data)
    						{
    							$scope.data = data;
    							$scope.msg = "Tela Atualizada!";
    						})
    						.error(function()
    						{
    							$scope.msg = "Pesquisa retornou vazia";
    							$scope.data = null;
    						})
    					}
    
    					$scope.deletePessoa=function(idpessoa)
    					{
    						$http.post("/exemplos/phpmysql/ws/dPessoa.php",{'idpessoa':idpessoa})
    						.success(function()
    						{
    							$scope.displayPessoa();
    							$scope.msg = "Registro excluido!";
    						})
    					}
    
    					//Mostra  os Jobs
    					$scope.newPessoa=function()
    					{
    						$scope.disableInsert = {'display': 'block'};
    						$scope.disableUpdate = {'display': 'none'};
    						$scope.edidpessoa = "";
    						$scope.ednome = "";
    
    					}
    
    					$scope.HabilitaEdicao=function(dado)
    					{
    						$scope.disableUpdate = {'display': 'block'};
    						$scope.edidpessoa = dado.idpessoa;
    						$scope.ednome = dado.nome;
    					}
    
    
    					$scope.updatePessoa=function(edidpessoa, ednome, edprofissao, eddtnasc, edsexo)
    					{
    						$http.post("/exemplos/phpmysql/ws/uPessoa.php",{'pesidpessoa':edidpessoa,'nome':ednome,'profissao':edprofissao,'dtnasc':eddtnasc,'sexo':edsexo})
    						.success(function()
    						{
    							$scope.displayPessoa();
    							$scope.msg = "Registro excluido!";
    
    							$scope.disableUpdate = {'display': 'none'};
    							$scope.displayPessoa();
    						})
    					}
    
    				});
    			</script>
    
    
    		</div>
    	</body>
    </html>

    Podemos notar que todo o serviço pesado é realizado pelo web service, ficando a responsábilidade apenas do controler de consumir as informações passadas.

    Não entrarei no detalhe técnico do PHP, nem em detalhes sobre o modelo MVC.

    Deixarei tal atividade para um post em momento oportuno.

    Conclusão

    O PHP é uma linguagem robusta e intuitiva, permitindo escrita elegante de um código limpo e eficiente.

    Eu no entanto, não me considero um programador excepcional em PHP, apenas quebro o galho, criando algumas páginas e cumprindo um papel menor.

    O PHP é muito mais que apresentado aqui, porem sei que isso será suficiente para dar um norte para muitos.

    Espero ter ajudado, e caso tenham gostado do artigo, mandem um email para mim.

    ,

    Referências

    https://www.cloudbooklet.com/how-to-install-lamp-apache-mysql-php-in-ubuntu-20-04/

    https://getbootstrap.com/docs/5.1/examples/navbar-static/

    Artigos Relacionados

      Blog Lazarus Programação
      Implementando uma Interface no Lazarus

      Vou apresentar aqui muito sutilmente um caso de construção de uma interface em Lazarus.

      Qual a diferença entre uma interface e uma classe.

      A Interface é como um contrato, onde se estabelece as conexões de saída (Métodos e propriedades) que serão utilizadas. Nela voce não precisa criar código, pois só estabelece quais serão as conexões.

      Ao criar uma classe, vc estabele as conexões porem tem que realizar uma série de codificações (implementation) que de fato não seriam necessárias. Pois a codificação fica a cargo da classe filha.

      Exemplo de projeto

      Desenvolvi uma interface no projeto da API da impressora.

      GIT do Projeto

      https://github.com/marcelomaurin/LIBESCPOS

      Exemplo de uso

      Na unit imp_generico.pas, estabelecemos a interface, que será herdada das demais classes.

        { TIMP_GENERICO }
        TIMP_GENERICO = interface
          ['{045F6EED-2C11-447D-A7DC-09DB995367C2}']
      
           function getserial : string;
           procedure setserial(value : string);
      
           function InitPrint(): string;
           function NewLine(): string;
           function LineText(Info : string): string;
           function Negrito(): string;
           function Normal(): string;
           function Sublinhado(): string;
           function DoubleTexto(): string;
           function beep(): string;
           function Guilhotina(): string;
           function AcionaGaveta(): string;
           function Barra1D(Info : string): string;
           function Barra2D(info : String): string;
           function loadImagem(X,Y : integer; Info : String): string;
           function imprimeImagem(X,Y : integer): string;
           property Serial : String read getserial  write setserial;
      end;                     

      No fonte imp_ELGINI9.pas, chamamos a interface, criando os métodos, realmente propostos na interface.

      type
      
       { TIMP_ELGINI9 }
      
       TIMP_ELGINI9 = class(TInterfacedObject,TIMP_GENERICO)
           FCOLUNA : integer;
           FSERIAL : String;
      
       private
           function getserial : string;
           procedure setserial(value : string);
      
      
       public
           constructor create();
           destructor destroy();
      
           function NewLine(): string;
           function InitPrint(): string;
           function LineText(Info : string): string;
           function beep(): string;
           function Negrito(): string;
           function Normal(): string;
           function Sublinhado(): string;
           function DoubleTexto(): string;
           function Guilhotina(): string;
           function AcionaGaveta(): string;
           function Barra2D(Info : string): string;
           function Barra1D(Info : string): string;
           function loadImagem(X,Y : integer;Info : String): string;
           function imprimeImagem(X,Y : integer): string;
           function Centralizado(): string;
           function PaginaM616(): string;
           function CorPg618(): string;
           function HabilitaArmazenaDados(): string;
           function Armazenadados( Info : string): string;
           function ImprimeQRCODEArmazenado(): string;
       published
           property Serial : String read getserial  write setserial;
      end;
      
      var
        IMPELGINI9: TIMP_ELGINI9;
      
      implementation          

      Omiti a implementation, para que o artigo não fique demasiado longo.

      Blog Delphi Lazarus
      Criando um GUID no Lazarus

      O GUID é um identificador unico Universal (Globally Unique Identifier), com ele é possível apontar de forma inequivoca uma aplicação ou serviço.

      No lazarus para criar um GUID no Lazarus ou Delphi, basta pressionar:

      <CTRL>+<SHIFT>+g

      Desta forma ele criará um numero como se segue.

      [‘{045F6EED-2C11-447D-A7DC-09DB995367C2}’]

      Exemplo de GUID

      Referências

      http://www.macoratti.net/d130402.htm

      Blog C/C++
      Instalando NCURSES

      NCURSES, conforme o wikipédia, fornece uma biblioteca que provê uma API para o desenvolvimento de interfaces em modo texto. Garante também uma otimização quanto as mudanças de telas, reduzindo a latência quando se utiliza acesso remoto via shells.

      Instalando o NCURSES

      Para instalar o ncurses é muito simples, basta digitar o comando abaixo:

      sudo apt-get install libncurses5-dev libncursesw5-dev

      Exemplo de instalação:

      Instalação do ncurses.

      Local das Libs

      Includes

      O include ou header da lib fica localizado em /us/include/ sendo o ncurses.h

      Exemplos

      Em /usr/lib/ncurses/exemples, fica um conjunto de exemplos, podem ser vistos e testados.

      São binários muito bons para testar.

      Principais funções

      São as principais funções:

      • initscr – Inicializa a tela
      • raw – Desativa buffer embutido
      • printw – imprime na tela
      • wprintw – imprime em posicao correta xy
      • clear – Limpa janela
      • getmaxyx – limites da janela
      • getyx – obtem posição do cursor
      • refresh – atualiza a tela
      • endwin – finaliza tela

      Referências

      https://www.garron.me/en/linux/install-ncurses-library-ubuntu-debian.html

      https://terminalroot.com.br/ncurses/

      Blog C/C++ Mysql Programação Shell Script
      Mysql com C/Lazarus/Python/PHP/R – Parte 2

      Neste segundo artigo iremos abordar como realizar um crud simples em C usando banco de dados Mysql como referência.

      No artigo anterior, tratamos de criar o banco de dados.

      http://maurinsoft.com.br/index.php/2022/01/31/mysql-com-c-lazarus-python-php-r-parte-1

      Agora iremos tratar de algumas definições do nosso projeto:

      Para facilitar o CRUD, iremos dividir em pequenos aplicativos, alias, essa divisão deixa muito didática e fácil de entender.

      • insPessoa.c – Inclui uma pessoa na tabela de pessoas
      • SelPessoa.c – Lista a relação de pessoas
      • UpdPessoa.c – Atualiza os dados de uma pessoa da tabela de pessoa
      • remPessoa.c – Remove uma pessoa da tabela de pessoas

      Com isso, finalizamos o crud e teremos alcançado nosso objetivo neste artigo.

      Dependências

      Iremos incluir aqui as dependências necessárias para seguir com este programa.

      Primeiro pedimos para seguir o primeiro tutorial, pois sem a instalação do mysql fica dificil implementar.

      Em seguida a instalação do ncurses, conforme o link abaixo:

      http://maurinsoft.com.br/index.php/2022/01/31/instalando-ncurses/

      GIT do Projeto

      Estaremos modificando o git incluindo a pasta gcc, nela incluiremos todos os fontes do projeto.

      https://github.com/marcelomaurin/mysql-vs-todos

      Inclusão dos fontes dos projetos em C

      Começa o Jogo!

      Primeiro iremos criar o Makefile

      
      CC=gcc
      SOURCE_INS=insPessoa.c
      SOURCE_SEL=selPessoa.c
      SOURCE_DEL=delPessoa.c
      SOURCE_UPD=updPessoa.c
      
      LIBS= -lmysql -lncurses
      
      TARGET_INS=insPessoas
      TARGET_SEL=selPessoas
      TARGET_DEL=delPessoas
      TARGET_UPD=updPessoas
      
      
      all: clean compile install
      
      clean:
      	rm *.o
      
      compile:
      	$(CC) $(SOURCE_INS) -o $(TARGET_INS)
      	$(CC) $(SOURCE_SEL) -o $(TARGET_SEL)
      	$(CC) $(SOURCE_DEL) -o $(TARGET_DEL)
      	$(CC) $(SOURCE_UPD) -o $(TARGET_UPD)
      
      
      install:
      	cp $(TARGET_INS) /usr/local/bin/
      	cp $(TARGET_SEL) /usr/local/bin/
      	cp $(TARGET_DEL) /usr/local/bin/
      	cp $(TARGET_UPD) /usr/local/bin/

      Ao chamar o make, iremos compilar todos os fontes incluindo eles na pasta /usr/local/bin, que permite executar em qualquer local que quisermos.

      Explicação do programa

      Este programa irei apresentar na integra, comentando os pontos principais.

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <mysql.h>
      
      #define USER "gcc"
      #define HOST "localhost"
      #define DATABASE "testedb"
      #define PASS "123456"
      
      
      #define SUCCESS 0
      #define ERROR 1
      
      MYSQL *mycon;
      //char PASS[20];
      int res;
      
      int conecta(void){
      	mycon = mysql_init(NULL);
      	/*
      	mysql_real_connect(MYSQL *mysql,
                         const char *host,
                         const char *user,
                         const char *passwd,
                         const char *db,
                         unsigned int port,
                         const char *unix_socket,
                         unsigned long client_flag)
      				  */
          //mysql_options(mycon, MYSQL_READ_DEFAULT_FILE, (void *)"./my.cnf");
      	res = mysql_real_connect(
      				  mycon,
      				  HOST,
      				  USER,
      				  PASS,
      				  DATABASE,
      				  3306,
      				  NULL,
      				  0);
      	if(res!=NULL)
      	{
      		printf("Sucesso na conexão com servidor\n");
      		return SUCCESS;
      	}
      	else {
      		printf("Falha na conexao! Erro:%s\n",mysql_error(mycon));
      		return ERROR;
      	}
      }
      
      //Estrutura de cadastro de pessoas
      typedef struct PESSOAS {
        int idpessoa;
        char nome[30];
        char dtnasc[20];
        char profissao[20];
        char sexo;
      } PESSOAS;
      
      
      
      void desconecta(void){
         mysql_close(mycon);
         mysql_library_end();
         printf("Desconectado\n");
      }
      
      int Select( PESSOAS *pes){
        char sql[500];
        memset(sql,'\0',sizeof(sql));
        sprintf(sql,"select * from pessoas where nome like '%%%s%%'",
             pes->nome
      	 );
        printf("SQL:%s\n\n",sql);
        //mysql_prepare(
        res = mysql_query(mycon,sql);
        if(!res) {
      	  printf("Pesquisa com sucesso!\n");
      	  MYSQL_RES *result = mysql_store_result(mycon);
      
            if (!result) {
              printf("Couldn't get results set: %s\n", mysql_error(mycon));
            } else {
              MYSQL_ROW row;
              int i;
              unsigned int num_fields = mysql_num_fields(result);
      
              while ((row = mysql_fetch_row(result))) {
                for (i = 0; i < num_fields; i++) {
                  printf("%s, ", row[i]);
                }
                putchar('\n');
              }
      
              mysql_free_result(result);
      	  }
      
        }  else {
      	  printf("Falha na pesquisa Error:%s\n",mysql_error(mycon));
        }
      }
      
      void captura_dados(PESSOAS *pes){
      	printf("Digite as informações que deseja pesquisar\n");
      	printf("==========================================\n");
      	printf("\nNome:");
      	scanf("%s",pes->nome);
      	printf("\n\n");
      }
      
      void Wellcome(void){
         printf("Software selPessoa\n");
         printf("Criado por Marcelo Maurin Martins\n");
         printf("Maurinsoft.com.br\n");
         //printf("Senha do banco:");
         //scanf("%s",PASS);
      }
      
      //funcao principal
      void main(int argc, char *argv[]){
         Wellcome();
         PESSOAS pessoa;
         /*Testa conexao*/
         if (conecta()==SUCCESS) {
            captura_dados(&pessoa);
            Select(&pessoa);
            desconecta();
         }
      }
      

      A primeira parte importante é a inclusão da lib, que permite compilar os comandos do mysql

      #include <mysql.h>

      Include da lib do mysql

      O outro ponto importante é a declaração mycon.

      MYSQL *mycon;

      variavel de conexão do mysq

      A mycon, é um handle do mysql. Que permite identificar a comunicação do banco aberta no comando mysql_init.

      mycon = mysql_init(NULL);

      inicia a comunicação com o mysql

      Atribuindo acesso ao banco.

      O comando mysql_real_connect atribui usuário e senha a conexão. Bem como estabelecendo um caminho entre o servidor correto.

      res = mysql_real_connect(
                    mycon,
                    HOST,
                    USER,
                    PASS,
                    DATABASE,
                    3306,
                    NULL,
                    0);

      São os principais parametros, HOST (o ip do servidor), user (usuário do banco), PASS(senha do banco), DATABASE (banco de dados), PORTA (default 3306).

      mysql_query

      O mysql_query permite rodar os comandos, tanto select, como update, delete e insert, ele é o mais importante comando.

      Para não falar em vídeozinho

      Segue a apresentação dos programas rodando.

      Referências

      https://dev.mysql.com/doc/c-api/8.0/en/

      https://zetcode.com/db/mysqlc/

      Artigos Relacionados

        en_USEnglish