Atualização Temperatura
Foi atualizado o programa temperatura para versão 0.3, nele foi feito uma pequena correção na tela do registro.
Foi lançado a versão 0.3.
Fonte do projeto:
Foi atualizado o programa temperatura para versão 0.3, nele foi feito uma pequena correção na tela do registro.
Foi lançado a versão 0.3.
Fonte do projeto:
Monit é um projeto open source, destinado a monitorar sistemas Unix.
O monit permite visualizar serviços de forma fácil e intuitiva.
O site possui documentação bem elaborada, que pode ser visto através do link
https://mmonit.com/monit/documentation/monit.html
https://github.com/arnaudsj/monit
O procedimento de instalação a partir do repositório é bem simples:
sudo apt install monit
Ao finalizar o monit, estará instalado, porem sem configuração.
Para isso é necessário editar o arquivo /etc/monitrc/monitrc como administrador.
Incluindo o seguinte fragmento, que ja deve estar comentado no arquivo.
set httpd port 2812 and
use address localhost
allow localhost
allow admin:monit
Após salvar o arquivo é necessário reiniciar o serviço.
systemctrl restart monit
Pronto agora basta entrar no browser e adicionar o url: http://localhost:2812/
O usuário e senha será o que definiu no arquivo monitrc, aqui admin/monit.
Ficando algo como apresentado a seguir.
É possível gerenciar serviços através do monitor.
Para isso é necessário adicionar o script do serviço, conforme apresentado no fragmento, no arquivo monitrc.
check process httpd with pidfile /var/run/apache2/apache2.pid
start program = “/usr/bin/systemctl apache2 start”
stop program = “/usr/bin/systemctl apache2 stop”
Conforme apresentado a seguir:
Desta forma é possível configurar diversos serviços em seus equipamentos.
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’)){
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.
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.
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.
Python 3.7.1 ou superior
Para instalar o SCons basta rodar o script abaixo:
python -m pip install scons
A instalação tem resultado final como apresentado.
A documentação oficial do SCons pode ser vista em:
https://www.scons.org/doc/production/HTML/scons-user.html#idm46358283013728
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:
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')
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.
Nossa primeira betha, onde os comandos básicos foram desenvolvidos.
Liberada versão Windows no git
A criação de um repositório de projeto em mercurial, se dá através do comando:
hg init [nomedoprojeto]
Mostra o status dos arquivos no projeto.
hg status
ou
hg st
São estados possíveis no projeto:
Ícone | Código | Estado |
? | ? | Não rastreado |
+ | A | Adicionado |
(ok) | C | Limpo (Clean) |
! | M | Modificado |
R | Removido | |
! | Desaparecido | |
X | | | Ignorado |
Para adicionar os arquivos ao projeto
hg add [nome do arquivo]
Para comparar o fonte local com o posto no servidor, usamos
hg diff [nome do arquivo]
Este mostra no formato diff as diferenças.
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.
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]
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’
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]
hg log -G -l [nrorevisoes]
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/
A reversão desfaz o que foi feito na maquina, trazendo o arquivo no estado do servidor.
Sintaxe:
hg revert [arquivos]
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
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]
Neste pacote, criamos versão para Raspberry PI, corrigindo o Build de criação já para versão mais nova versão do raspberry pi 4.
O novo pacote foi criado e testado em raspian 5.10.17 rodando para armv7l.
O procedimento de configuração pode ser visto no link a seguir
Nesta Versão 2.13, foram corrigidos diversos bugs, incluindo tambem uma versão Linux 64bits.
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
http://maurinsoft.com.br/index.php/projetos-open-source/projeto-mnote2/
Assista o vídeo do projeto no Linux Ubuntu 64 bits.
Segue a lista de mudanças do projeto MNote2 release 11
Substituição dos comandos FIND por personalização de tela de pesquisa.
Correção do formulário frmmnote principal de fixo para tamanho variavel
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).
Implementação da função UNDO, que desfaz o que foi realizado anteriormente.
Versão disponibilizada no github